aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--flake.nix6
-rw-r--r--overlays/default.nix1
-rw-r--r--pkgs/firmware/default.nix24
-rw-r--r--pkgs/manager/main.hs72
-rw-r--r--pkgs/misc/firmware-check.nix8
-rw-r--r--pkgs/misc/merge.nix48
6 files changed, 155 insertions, 4 deletions
diff --git a/flake.nix b/flake.nix
index 8827dab..8978740 100644
--- a/flake.nix
+++ b/flake.nix
@@ -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}
+''