diff options
| -rw-r--r-- | flake.nix | 6 | ||||
| -rw-r--r-- | overlays/default.nix | 1 | ||||
| -rw-r--r-- | pkgs/firmware/default.nix | 24 | ||||
| -rw-r--r-- | pkgs/manager/main.hs | 72 | ||||
| -rw-r--r-- | pkgs/misc/firmware-check.nix | 8 | ||||
| -rw-r--r-- | pkgs/misc/merge.nix | 48 |
6 files changed, 155 insertions, 4 deletions
@@ -34,6 +34,12 @@ plato ; default = myKobo.config.build.src; + firmware-test = pkgs.kobo-firmware { + hardware = "kobo7"; + date = "Jun2024"; + version = "4.38.23038"; + hash = "sha256-ma9Hf0Hc4hDqf1KQwM6TdX3lZo9HPWMrQqU45eFBScs="; + }; # installer = myKobo.config.installer.package; }; diff --git a/overlays/default.nix b/overlays/default.nix index 18b3f40..1dc4349 100644 --- a/overlays/default.nix +++ b/overlays/default.nix @@ -18,6 +18,7 @@ final: prev: { kobo-utils = prev.callPackage ../pkgs/kobo-utils {}; + mergePaths = prev.callPackage ../pkgs/misc/merge.nix {}; nickel-menu = prev.callPackage ../pkgs/nickel-menu {}; diff --git a/pkgs/firmware/default.nix b/pkgs/firmware/default.nix index 932ecf1..9c70eb1 100644 --- a/pkgs/firmware/default.nix +++ b/pkgs/firmware/default.nix @@ -1,4 +1,4 @@ -{ stdenvNoCC, fetchzip, lib, ... }: +{ stdenvNoCC, fetchzip, lib, kobo-utils, gawk, ... }: { hardware, date, version, hash ? "", ... }: stdenvNoCC.mkDerivation (finalAttrs: { pname = "kobo-firmware"; @@ -6,15 +6,35 @@ stdenvNoCC.mkDerivation (finalAttrs: { src = fetchzip { url = "https://ereaderfiles.kobo.com/firmwares/${finalAttrs.hardware}/${finalAttrs.date}/kobo-update-${finalAttrs.version}.zip"; + stripRoot = false; inherit hash; }; + nativeBuildInputs = [ + kobo-utils + gawk + ]; + outputs = [ "out" "KoboRoot" ]; - phases = "installPhase"; + phases = [ + "checkPhase" + "installPhase" + ]; + + doCheck = true; + + checkPhase = '' + KOBOVERSION="$(kobo-versionextract "$src/KoboRoot.tgz" | awk '{if ($1 == "Version:") print $2}')" + + if [[ ! "$KOBOVERSION" == "${finalAttrs.version}" ]]; then + >&2 echo "Expected version ${finalAttrs.version}, but actual firmware is version $KOBOVERSION" + exit 1 + fi + ''; installPhase = '' runHook preInstall diff --git a/pkgs/manager/main.hs b/pkgs/manager/main.hs new file mode 100644 index 0000000..6eac0a7 --- /dev/null +++ b/pkgs/manager/main.hs @@ -0,0 +1,72 @@ +module Main where + +import Control.Applicative +import Control.Monad +import Data.Bifunctor +import Data.Function +import Data.Functor +import Options.Applicative +import System.FilePath (FilePath) +import System.Process.Typed qualified as P +-- import Turtle + + + +main :: IO () +main = undefined + + + +flakeArg :: Parser Flake +flakeArg = argument (maybeReader parseFlake) $ fold + [ metavar "FLAKE" + , help "Flake location" + ] + +sysOption :: Parser String +sysOption = strOption $ fold + [ long "system" + , metavar "SYSTEM" + , help "Like x86_64-linux" + ] + +koboConfigFlake :: Flake -> String -> Flake +koboConfigFlake (Flake u a) sys = Flake u $ "koboConfigurations" : sys : a + +data Flake = Flake + { uri :: !FilePath + , attrs :: ![String] + } deriving stock (Eq, Show) + +parseFlake :: String -> Maybe Flake +parseFlake str = + let (u, a) = second (drop 1) $ break (== '#') str + in case u of + [] -> Nothing + _ -> Flake u $ splitter a + where + splitter xs = + let (y, ys) = second (drop 1) $ break (== '.') xs + in case ys of + [] -> [y] + _ -> y : splitter ys + + +data Action + = Build + | BuildFirmware + | Deploy + | DeployFirmware + | Check + deriving stock (Eq, Show) + + +data CLIArgs = CLIArgs + { _action :: !Action + , _flake :: !Flake + , _system :: !String + } deriving stock (Eq, Show) + + +runNix :: [String] -> IO () +runNix = P.runProcess_ . P.proc "nix" diff --git a/pkgs/misc/firmware-check.nix b/pkgs/misc/firmware-check.nix index 53cd2c2..373ea36 100644 --- a/pkgs/misc/firmware-check.nix +++ b/pkgs/misc/firmware-check.nix @@ -1,5 +1,9 @@ { writeShellApplication, jq, curl, ... }: -{ deviceID, affiliate ? "kobo" }: +{ deviceID +, affiliate ? "kobo" +, currentVersion ? "0.0" +, serialNumber ? "N0" +}: writeShellApplication { name = "kobo-check-firmware"; runtimeInputs = [ @@ -7,6 +11,6 @@ writeShellApplication { jq ]; text = '' - curl --silent "https://api.kobobooks.com/1.0/UpgradeCheck/Device/${deviceID}/${affiliate}/0.0/N0" | jq '.UpgradeURL' + curl --silent "https://api.kobobooks.com/1.0/UpgradeCheck/Device/${deviceID}/${affiliate}/${currentVersion}/${serialNumber}" | jq '.UpgradeURL' ''; } diff --git a/pkgs/misc/merge.nix b/pkgs/misc/merge.nix new file mode 100644 index 0000000..9d6eabb --- /dev/null +++ b/pkgs/misc/merge.nix @@ -0,0 +1,48 @@ +{ runCommand, writeShellApplication, rsync, lib, ... }: +args@{ name, paths, preferLocalBuild ? true, allowSubstitutes ? false, postBuild ? "" }: +let + env = builtins.removeAttrs args [ "name" "postBuild" ]] // { + inherit preferLocalBuild allowSubstitutes; + nativeBuildInputs = (args.nativeBuildInputs or []) ++ [ + rsync + replaceBadSymlink + ]; + passAsFile = [ "paths" ]; + }; + + # copyDirs = p: '' + # ${lib.getExe rsync} -rv --copy-dirlinks --links --executability "${p}/" "$out" + # ''; + + replaceBadSymlink = writeShellApplication { + name = "replaceBadSymlink"; + # runtimeInputs = [ coreutils ]; + text = '' + FILE="''${1-}" + + if [[ -z "$FILE" ]]; then + >&2 echo "Need a file input" + fi + + REALPATH="$(readlink -f "$FILE")" + + case "$REALPATH" in + "/nix/store/"* ) + echo "Replacing $FILE by $REALPATH" + cp -v --remove-destination "$REALPATH" "$FILE" + ;; + esac + ''; + }; + +in runCommand name env '' + mkdir -p $out + + for i in $(cat $pathsPath); do + rsync -rv --copy-dirlinks --links --executability "$i/" "$out" + done + + find $out -type l -exec "replaceBadSymlink {}" \; + + ${postBuild} +'' |
