summaryrefslogtreecommitdiff
path: root/flake.nix
diff options
context:
space:
mode:
Diffstat (limited to 'flake.nix')
-rw-r--r--flake.nix109
1 files changed, 90 insertions, 19 deletions
diff --git a/flake.nix b/flake.nix
index 471c3a6..dbffac2 100644
--- a/flake.nix
+++ b/flake.nix
@@ -197,7 +197,89 @@
197 install -m 0555 -t $out/bin ubnt-mkfwimage ubnt-fwsplit 197 install -m 0555 -t $out/bin ubnt-mkfwimage ubnt-fwsplit
198 ''; 198 '';
199 }; 199 };
200 in { 200
201 unpackWrt = pkgs.writeShellScript "unpack" ''
202 ${pkgs.rsync}/bin/rsync --chmod=u+wX -rlptD --exclude /tmp --exclude /build_dir --exclude /bin --exclude /staging_dir ${openwrtWithPackages}/. ${./files}/. ./.
203
204 patchDir=$(mktemp -d -t patches.XXXXXXXXXX)
205 ${pkgs.rsync}/bin/rsync --chmod=u+wX -rlptD ${./patches}/. "''${patchDir}/."
206
207 while IFS= read -r -d $'\0' sopsFile; do
208 ${pkgs.sops}/bin/sops --output="''${sopsFile%.sops}" --decrypt "''${sopsFile}"
209 rm "''${sopsFile}"
210 done < <(find . "$patchDir" -not \( \( -path ./tmp -o -path ./build_dir -o -path ./bin -o -path ./staging_dir \) -a -prune \) -a \( -type f -a -name '*.sops' -a -print0 \))
211
212 while IFS= read -r -d $'\0' patchFile; do
213 if [[ "''${patchFile##*.}" = "patch" ]]; then
214 patch -p1 --batch <$patchFile
215 else
216 . $patchFile
217 fi
218 done < <(find "$patchDir" -type f -print0)
219 '';
220 buildWrt = pkgs.writeShellScript "build" "make -j V=sc";
221
222 buildWrtApp = {
223 type = "app";
224 program = toString (pkgs.writeShellScript "build-wrapper" (let
225 buildPy = pkgs.writers.writePython3 "build" {} ''
226 from tempfile import TemporaryDirectory
227 import os
228 import subprocess
229 import argparse
230 from pathlib import Path
231
232 parser = argparse.ArgumentParser(prog="build",
233 formatter_class=argparse.ArgumentDefaultsHelpFormatter # noqa: E501
234 )
235 parser.add_argument('-C', '--directory',
236 dest='dir',
237 metavar='DIRECTORY',
238 type=Path,
239 default=Path('./result'),
240 help='Change to this directory before doing anything'
241 )
242 parser.add_argument('--copy-to',
243 dest='copyTo',
244 metavar='FILE',
245 type=Path,
246 default='/srv/tftp/' + Path.cwd().name + '.bin',
247 help='Copy result image here'
248 )
249 parser.add_argument('--copy-to-no-sudo',
250 dest='copyToSudo',
251 action='store_false',
252 help='Use sudo to copy result image'
253 )
254 parser.add_argument('--copy-image',
255 dest='image',
256 default='bin/targets/ath79/generic/openwrt-ath79-generic-ubnt_unifiac-pro-initramfs-kernel.bin', # noqa: E501
257 help='Which file to copy'
258 )
259 args = parser.parse_args()
260
261 if not args.dir:
262 args.dir = Path()
263 if not args.copyTo:
264 args.copyTo = None
265
266 args.dir.mkdir(parents=True, exist_ok=True)
267 os.chdir(args.dir)
268
269 with TemporaryDirectory() as tmpdir:
270 os.environ["TMPDIR"] = f"{tmpdir}"
271 subprocess.check_call('${unpackWrt}')
272 subprocess.check_call('${buildWrt}')
273
274 if args.copyTo:
275 command = ['cp', args.image, args.copyTo]
276 if args.copyToSudo:
277 command = ['sudo', '--', *command]
278 subprocess.check_call(command)
279 '';
280 in "exec -- ${fhs { runScript = toString buildPy; }}/bin/openwrt-env $@"));
281 };
282 in rec {
201 devShell = pkgs.mkShell { 283 devShell = pkgs.mkShell {
202 name = "openwrt"; 284 name = "openwrt";
203 shellHook = let 285 shellHook = let
@@ -205,27 +287,11 @@
205 set -ex 287 set -ex
206 288
207 function unpackPhase() { 289 function unpackPhase() {
208 ${pkgs.rsync}/bin/rsync --chmod=u+wX -rlptD --exclude /tmp --exclude /build_dir --exclude /bin --exclude /staging_dir ${openwrtWithPackages}/. ${./files}/. ./. 290 ${unpackWrt}
209
210 patchDir=$(mktemp -d -t patches.XXXXXXXXXX)
211 ${pkgs.rsync}/bin/rsync --chmod=u+wX -rlptD ${./patches}/. "''${patchDir}/."
212
213 while IFS= read -r -d $'\0' sopsFile; do
214 ${pkgs.sops}/bin/sops --output="''${sopsFile%.sops}" --decrypt "''${sopsFile}"
215 rm "''${sopsFile}"
216 done < <(find . "$patchDir" -not \( \( -path ./tmp -o -path ./build_dir -o -path ./bin -o -path ./staging_dir \) -a -prune \) -a \( -type f -a -name '*.sops' -a -print0 \))
217
218 while IFS= read -r -d $'\0' patchFile; do
219 if [[ "''${patchFile##*.}" = "patch" ]]; then
220 patch -p1 --batch <$patchFile
221 else
222 . $patchFile
223 fi
224 done < <(find "$patchDir" -type f -print0)
225 } 291 }
226 292
227 function buildPhase() { 293 function buildPhase() {
228 make -j V=sc 294 ${buildWrt}
229 } 295 }
230 296
231 set +ex 297 set +ex
@@ -236,5 +302,10 @@
236 packages = { 302 packages = {
237 inherit openwrtWithPackages ubnt-mkfwimage; 303 inherit openwrtWithPackages ubnt-mkfwimage;
238 }; 304 };
305
306 apps = {
307 inherit buildWrtApp;
308 };
309 defaultApp = apps.buildWrtApp;
239 }); 310 });
240} 311}