summary refs log tree commit diff
path: root/nixos/lib/make-squashfs.nix
blob: 9d47a3222cc27ac689120c483a1cfa47462d7084 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
{ stdenv, squashfsTools, perl, pathsFromGraph

, # The root directory of the squashfs filesystem is filled with the
  # closures of the Nix store paths listed here.
  storeContents ? []
}:

stdenv.mkDerivation {
  name = "squashfs.img";

  nativeBuildInputs = [perl squashfsTools];

  # For obtaining the closure of `storeContents'.
  exportReferencesGraph =
    map (x: [("closure-" + baseNameOf x) x]) storeContents;

  buildCommand =
    ''
      # Add the closures of the top-level store objects.
      storePaths=$(perl ${pathsFromGraph} closure-*)

      # If a Hydra slave happens to have store paths with bad permissions/mtime,
      # abort now so that they don't end up in ISO images in the channel.
      # https://github.com/NixOS/nixpkgs/issues/32242
      hasBadPaths=""
      for path in $storePaths; do
        if [ -h "$path" ]; then
          continue
        fi

        mtime=$(stat -c %Y "$path")
        mode=$(stat -c %a "$path")

        if [ "$mtime" != 1 ]; then
          echo "Store path '$path' has an invalid mtime."
          hasBadPaths=1
        fi
        if [ "$mode" != 444 ] && [ "$mode" != 555 ]; then
          echo "Store path '$path' has invalid permissions ($mode)."
          hasBadPaths=1
        fi
      done

      if [ -n "$hasBadPaths" ]; then
        echo "You have bad paths in your store, please fix them."
        exit 1
      fi

      # Also include a manifest of the closures in a format suitable
      # for nix-store --load-db.
      printRegistration=1 perl ${pathsFromGraph} closure-* > nix-path-registration

      # Generate the squashfs image.
      mksquashfs nix-path-registration $storePaths $out \
        -keep-as-directory -all-root -b 1048576 -comp xz -Xdict-size 100%
    '';
}