diff --git a/flake.lock b/flake.lock index ee40eb4..8816bb7 100644 --- a/flake.lock +++ b/flake.lock @@ -5,11 +5,11 @@ "systems": "systems" }, "locked": { - "lastModified": 1681202837, - "narHash": "sha256-H+Rh19JDwRtpVPAWp64F+rlEtxUWBAQW28eAi3SRSzg=", + "lastModified": 1694529238, + "narHash": "sha256-zsNZZGTGnMOf9YpHKJqMSsa0dXbfmxeoJ7xHlrt+xmY=", "owner": "numtide", "repo": "flake-utils", - "rev": "cfacdce06f30d2b68473a46042957675eebb3401", + "rev": "ff7b65b44d01cf9ba6a71320833626af21126384", "type": "github" }, "original": { diff --git a/flake.nix b/flake.nix index 5d41853..4e5499e 100644 --- a/flake.nix +++ b/flake.nix @@ -7,19 +7,42 @@ }; outputs = { self, nixpkgs, flake-utils }: - flake-utils.lib.eachDefaultSystem (system: + let + supportedSystems = with flake-utils.lib.system; [ x86_64-linux i686-linux aarch64-linux ]; + in + { + overlays.default = final: prev: { + picture-frame = { + inherit (final.callPackage ./server { }) server smartcrop; + firmware = final.callPackage ./firmware { }; + }; + }; + } + // + flake-utils.lib.eachSystem supportedSystems (system: let - pkgs = nixpkgs.legacyPackages.${system}; - server = pkgs.callPackage ./server { }; - firmware = pkgs.callPackage ./firmware { }; + pkgs = import nixpkgs { + inherit system; + overlays = [ self.overlays.default ]; + }; in { - packages = { - inherit (server) server smartcrop; - inherit firmware; + packages = with pkgs.picture-frame; { + inherit server firmware smartcrop; + default = server; }; - packages.default = server.server; devShell = pkgs.callPackage ./shell.nix { }; + + checks.build = pkgs.picture-frame.server; + checks.service = import ./server/service-test.nix { + inherit nixpkgs system; + service = self.nixosModules.service; + }; } - ); + ) + // + { + nixosModules.default = self.nixosModules.service; + nixosModules.service = import ./server/service.nix { overlay = self.overlays.default; }; + }; } diff --git a/overlay.nix b/overlay.nix new file mode 100644 index 0000000..6c9cdba --- /dev/null +++ b/overlay.nix @@ -0,0 +1,6 @@ +final: prev: { + dynamic-frame = { + inherit (final.callPackage ./server { }) server smartcrop; + firmware = final.callPackage ./firmware { }; + }; +} diff --git a/server/main.go b/server/main.go index 7307d48..8f100d9 100644 --- a/server/main.go +++ b/server/main.go @@ -21,6 +21,7 @@ import ( ) var imageDir = "./img" +var port = "8080" func getRandomFile(dir string) (string, error) { files, err := ioutil.ReadDir(dir) @@ -109,7 +110,12 @@ func basicAuth(next http.Handler) http.Handler { func main() { if len(os.Args) > 1 { - imageDir = os.Args[1] + port = os.Args[1] + } + fmt.Println("Starting on port: ", port) + + if len(os.Args) > 2 { + imageDir = os.Args[2] } fmt.Println("Choosing images from: ", imageDir) @@ -128,6 +134,6 @@ func main() { fmt.Println("Started server") - // Start the HTTP server on port 8080 and log any errors - log.Fatal(http.ListenAndServe("0.0.0.0:8080", router)) + // Start the HTTP server + log.Fatal(http.ListenAndServe("0.0.0.0:"+port, router)) } diff --git a/server/service-test.nix b/server/service-test.nix new file mode 100644 index 0000000..932d52c --- /dev/null +++ b/server/service-test.nix @@ -0,0 +1,23 @@ +{ nixpkgs, system, service }: + +with import (nixpkgs + "/nixos/lib/testing-python.nix") { inherit system; }; +simpleTest { + name = "dynamic-frame-server"; + nodes.machine = { config, pkgs, ... }: { + imports = [ service ]; + + virtualisation.memorySize = 256; + + services.picture-frame-server = { + enable = true; + imgDir = "/tmp"; + }; + }; + + testScript = + '' + machine.start() + machine.wait_for_unit("multi-user.target") + machine.wait_for_unit("picture-frame-server") + ''; +} diff --git a/server/service.nix b/server/service.nix new file mode 100644 index 0000000..d51065f --- /dev/null +++ b/server/service.nix @@ -0,0 +1,55 @@ +{ overlay }: + +{ config, pkgs, lib, ... }: +let + cfg = config.services.picture-frame-server; +in +{ + options.services.picture-frame-server = { + enable = lib.mkEnableOption "enable picture-frame-server"; + user = lib.mkOption { + type = lib.types.str; + default = "picture-frame-server"; + description = '' + The user the server should run as + ''; + }; + group = lib.mkOption { + type = lib.types.str; + default = "picture-frame-server"; + description = '' + The group the server should run as + ''; + }; + imgDir = lib.mkOption { + type = lib.types.str; + description = '' + Directory of images that the server will serve + ''; + }; + port = lib.mkOption { + type = lib.types.int; + default = 18450; + description = '' + The port the server runs on + ''; + }; + }; + + config = lib.mkIf cfg.enable { + nixpkgs.overlays = [ overlay ]; + users.users.${cfg.user} = { + isSystemUser = true; + group = cfg.group; + }; + users.groups.${cfg.group} = { }; + systemd.services.picture-frame-server = { + enable = true; + after = [ "network.target" ]; + wantedBy = [ "multi-user.target" ]; + serviceConfig.ExecStart = "${pkgs.picture-frame.server}/bin/server ${toString cfg.port} ${cfg.imgDir}"; + serviceConfig.User = cfg.user; + serviceConfig.Group = cfg.group; + }; + }; +}