created module
This commit is contained in:
commit
8a8fe8cfc6
4
.gitignore
vendored
Normal file
4
.gitignore
vendored
Normal file
|
@ -0,0 +1,4 @@
|
|||
result
|
||||
.direnv
|
||||
.vscode/*
|
||||
!.vscode/settings.json
|
3
base-module.nix
Normal file
3
base-module.nix
Normal file
|
@ -0,0 +1,3 @@
|
|||
config: {
|
||||
options = (import ./configuration-type.nix) config;
|
||||
}
|
120
configuration-type.nix
Normal file
120
configuration-type.nix
Normal file
|
@ -0,0 +1,120 @@
|
|||
{lib, ...}: let
|
||||
folderType = lib.types.submodule ({name, ...}: {
|
||||
options = {
|
||||
id = lib.mkOption {
|
||||
type = lib.types.string;
|
||||
};
|
||||
label = lib.mkOption {
|
||||
type = lib.types.string;
|
||||
default = name;
|
||||
};
|
||||
};
|
||||
});
|
||||
in {
|
||||
folders = lib.mkOption {
|
||||
type = lib.types.attrsOf folderType;
|
||||
default = {};
|
||||
};
|
||||
devices = lib.mkOption {
|
||||
type = lib.types.attrsOf (lib.types.submodule ({name, ...}: {
|
||||
options = {
|
||||
name = lib.mkOption {
|
||||
type = lib.types.string;
|
||||
default = name;
|
||||
};
|
||||
id = lib.mkOption {
|
||||
type = lib.types.string;
|
||||
};
|
||||
folders = lib.mkOption {
|
||||
type = lib.types.attrsOf (lib.types.submodule (
|
||||
{config, ...}: {
|
||||
options = {
|
||||
folder = lib.mkOption {
|
||||
type = folderType;
|
||||
};
|
||||
path = lib.mkOption {
|
||||
type = lib.types.string;
|
||||
};
|
||||
type = lib.mkOption {
|
||||
type = lib.types.enum ["sendreceive" "sendonly" "receiveonly" "receiveencrypted"];
|
||||
default = "sendreceive";
|
||||
};
|
||||
versioning = {
|
||||
simple = {
|
||||
enable = lib.mkEnableOption "should this folder use simple versioning";
|
||||
keep = lib.mkOption {
|
||||
type = lib.types.string;
|
||||
default = "10";
|
||||
};
|
||||
};
|
||||
trashcan = {
|
||||
enable = lib.mkEnableOption "should this folder use trashcan versioning";
|
||||
cleanoutDays = lib.mkOption {
|
||||
type = lib.types.string;
|
||||
default = "1000";
|
||||
};
|
||||
};
|
||||
staggered = {
|
||||
enable = lib.mkEnableOption "should this folder use staggard versioning";
|
||||
cleanInterval = lib.mkOption {
|
||||
type = lib.types.string;
|
||||
default = "3600";
|
||||
};
|
||||
maxAge = lib.mkOption {
|
||||
type = lib.types.string;
|
||||
default = "31536000";
|
||||
};
|
||||
};
|
||||
external = {
|
||||
enable = lib.mkEnableOption "should this folder use external versioning";
|
||||
};
|
||||
};
|
||||
};
|
||||
# TODO: figure out how to make assertions for submodules
|
||||
# config = {
|
||||
# assertions =
|
||||
# (lib.lists.optionals config.versioning.simple.enable [
|
||||
# {
|
||||
# assertion = !config.versioning.trashcan.enable;
|
||||
# message = "Can not use both simple and trashcan versioning at the same time.";
|
||||
# }
|
||||
# {
|
||||
# assertion = !config.versioning.staggered.enable;
|
||||
# message = "Can not use both simple and staggered versioning at the same time.";
|
||||
# }
|
||||
# {
|
||||
# assertion = !config.versioning.external.enable;
|
||||
# message = "Can not use both simple and external versioning at the same time.";
|
||||
# }
|
||||
# ])
|
||||
# ++ (lib.lists.optionals config.versioning.trashcan.enable [
|
||||
# {
|
||||
# assertion = !config.versioning.staggered.enable;
|
||||
# message = "Can not use both trashcan and staggered versioning at the same time.";
|
||||
# }
|
||||
# {
|
||||
# assertion = !config.versioning.external.enable;
|
||||
# message = "Can not use both trashcan and external versioning at the same time.";
|
||||
# }
|
||||
# ])
|
||||
# ++ (lib.lists.optionals config.versioning.staggered.enable [
|
||||
# {
|
||||
# assertion = !config.versioning.external.enable;
|
||||
# message = "Can not use both staggered and external versioning at the same time.";
|
||||
# }
|
||||
# ])
|
||||
# ++ [
|
||||
# {
|
||||
# assertion = !config.versioning.external.enable;
|
||||
# message = "External versioning currently not implemented.";
|
||||
# }
|
||||
# ];
|
||||
# };
|
||||
}
|
||||
));
|
||||
};
|
||||
};
|
||||
}));
|
||||
default = {};
|
||||
};
|
||||
}
|
9
eval-config.nix
Normal file
9
eval-config.nix
Normal file
|
@ -0,0 +1,9 @@
|
|||
{
|
||||
lib,
|
||||
modules,
|
||||
}: let
|
||||
result = lib.evalModules {
|
||||
inherit modules;
|
||||
};
|
||||
in
|
||||
result.config
|
47
example-module.nix
Normal file
47
example-module.nix
Normal file
|
@ -0,0 +1,47 @@
|
|||
{config, ...}: {
|
||||
folders = {
|
||||
documents = {
|
||||
id = "aaaaa-aaaaa";
|
||||
};
|
||||
photos = {
|
||||
id = "bbbbb-bbbbb";
|
||||
};
|
||||
};
|
||||
devices = {
|
||||
desktop = {
|
||||
id = "AAAAAAA-AAAAAAA-AAAAAAA-AAAAAAA-AAAAAAA-AAAAAAA-AAAAAAA-AAAAAAA";
|
||||
folders = {
|
||||
documents = {
|
||||
folder = config.folders.documents;
|
||||
path = "/sync/user/documents";
|
||||
};
|
||||
photos = {
|
||||
folder = config.folders.photos;
|
||||
path = "/sync/user/photos";
|
||||
};
|
||||
};
|
||||
};
|
||||
laptop = {
|
||||
id = "BBBBBBB-BBBBBBB-BBBBBBB-BBBBBBB-BBBBBBB-BBBBBBB-BBBBBBB-BBBBBBB";
|
||||
folders = {
|
||||
documents = {
|
||||
folder = config.folders.documents;
|
||||
path = "/sync/documents";
|
||||
};
|
||||
photos = {
|
||||
folder = config.folders.photos;
|
||||
path = "/sync/photos";
|
||||
};
|
||||
};
|
||||
};
|
||||
phone = {
|
||||
id = "CCCCCCC-CCCCCCC-CCCCCCC-CCCCCCC-CCCCCCC-CCCCCCC-CCCCCCC-CCCCCCC";
|
||||
folders = {
|
||||
photos = {
|
||||
folder = config.folders.photos;
|
||||
path = "/sync/photos";
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
11
example-nixos-module.nix
Normal file
11
example-nixos-module.nix
Normal file
|
@ -0,0 +1,11 @@
|
|||
{
|
||||
lib,
|
||||
self,
|
||||
...
|
||||
}: {
|
||||
services.syncthing = {
|
||||
configuration = self.outputs.syncthingConfiguration;
|
||||
deviceName = "laptop";
|
||||
};
|
||||
nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux";
|
||||
}
|
27
flake.lock
Normal file
27
flake.lock
Normal file
|
@ -0,0 +1,27 @@
|
|||
{
|
||||
"nodes": {
|
||||
"nixpkgs": {
|
||||
"locked": {
|
||||
"lastModified": 1741037377,
|
||||
"narHash": "sha256-SvtvVKHaUX4Owb+PasySwZsoc5VUeTf1px34BByiOxw=",
|
||||
"owner": "NixOS",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "02032da4af073d0f6110540c8677f16d4be0117f",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "NixOS",
|
||||
"ref": "nixpkgs-unstable",
|
||||
"repo": "nixpkgs",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"root": {
|
||||
"inputs": {
|
||||
"nixpkgs": "nixpkgs"
|
||||
}
|
||||
}
|
||||
},
|
||||
"root": "root",
|
||||
"version": 7
|
||||
}
|
72
flake.nix
Normal file
72
flake.nix
Normal file
|
@ -0,0 +1,72 @@
|
|||
{
|
||||
inputs = {
|
||||
nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
|
||||
};
|
||||
|
||||
outputs = {
|
||||
self,
|
||||
nixpkgs,
|
||||
...
|
||||
}: let
|
||||
systems = [
|
||||
"aarch64-darwin"
|
||||
"aarch64-linux"
|
||||
"x86_64-darwin"
|
||||
"x86_64-linux"
|
||||
];
|
||||
pkgsFor = system: nixpkgs.legacyPackages.${system};
|
||||
forEachSystem = nixpkgs.lib.genAttrs systems;
|
||||
forEachPkgs = lambda: forEachSystem (system: lambda (pkgsFor system));
|
||||
in {
|
||||
devShells = forEachPkgs (pkgs: {
|
||||
default = pkgs.mkShell {
|
||||
packages = with pkgs; [
|
||||
# for version controlling this repo
|
||||
git
|
||||
# for formatting code in this repo
|
||||
alejandra
|
||||
# for viewing configuration options defined in this repo
|
||||
nix-inspect
|
||||
];
|
||||
};
|
||||
});
|
||||
|
||||
nixosModules.default = self.nixosModules.syncthing;
|
||||
nixosModules.syncthing = import ./nixos.nix;
|
||||
|
||||
# TODO: figure out if I need modules for these projects
|
||||
# homeManagerModules.syncthing = null;
|
||||
# darwinModules.syncthing = null;
|
||||
|
||||
lib = {
|
||||
evalConfig = import ./eval-config.nix;
|
||||
syncthingConfiguration = {modules, ...}:
|
||||
self.lib.evalConfig (
|
||||
{inherit (nixpkgs) lib;}
|
||||
// {
|
||||
modules =
|
||||
modules
|
||||
++ [
|
||||
(import ./base-module.nix)
|
||||
];
|
||||
}
|
||||
);
|
||||
};
|
||||
|
||||
nixosConfigurations = {
|
||||
default = nixpkgs.lib.nixosSystem {
|
||||
specialArgs = {inherit self;};
|
||||
modules = [
|
||||
self.nixosModules.syncthing
|
||||
./example-nixos-module.nix
|
||||
];
|
||||
};
|
||||
};
|
||||
|
||||
syncthingConfiguration = self.lib.syncthingConfiguration {
|
||||
modules = [
|
||||
(import ./example-module.nix)
|
||||
];
|
||||
};
|
||||
};
|
||||
}
|
43
nixos.nix
Normal file
43
nixos.nix
Normal file
|
@ -0,0 +1,43 @@
|
|||
{
|
||||
lib,
|
||||
config,
|
||||
...
|
||||
} @ input: {
|
||||
options = {
|
||||
services.syncthing = {
|
||||
configuration = (import ./configuration-type.nix) input;
|
||||
deviceName = lib.mkOption {
|
||||
type = lib.types.string;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
config = {
|
||||
services.syncthing.settings = {
|
||||
devices =
|
||||
lib.attrsets.mapAttrs (name: deviceConfig: {
|
||||
id = deviceConfig.id;
|
||||
})
|
||||
config.services.syncthing.configuration.devices;
|
||||
folders =
|
||||
lib.attrsets.mapAttrs (folderName: folder: {
|
||||
id = folder.folder.id;
|
||||
label = folder.folder.label;
|
||||
path = folder.path;
|
||||
devices = lib.attrsets.mapAttrsToList (_: device: device.name) (
|
||||
lib.attrsets.filterAttrs (
|
||||
deviceName: device:
|
||||
lib.lists.any
|
||||
(
|
||||
deviceFolder: deviceFolder.folder.id == folder.folder.id
|
||||
) (
|
||||
lib.attrsets.mapAttrsToList (_: deviceFolder: deviceFolder) device.folders
|
||||
)
|
||||
)
|
||||
config.services.syncthing.configuration.devices
|
||||
);
|
||||
})
|
||||
config.services.syncthing.configuration.devices.${config.services.syncthing.deviceName}.folders;
|
||||
};
|
||||
};
|
||||
}
|
14
shell.nix
Normal file
14
shell.nix
Normal file
|
@ -0,0 +1,14 @@
|
|||
(
|
||||
import
|
||||
(
|
||||
let
|
||||
lock = builtins.fromJSON (builtins.readFile ./flake.lock);
|
||||
in
|
||||
fetchTarball {
|
||||
url = lock.nodes.flake-compat.locked.url or "https://github.com/edolstra/flake-compat/archive/${lock.nodes.flake-compat.locked.rev}.tar.gz";
|
||||
sha256 = lock.nodes.flake-compat.locked.narHash;
|
||||
}
|
||||
)
|
||||
{src = ./.;}
|
||||
)
|
||||
.shellNix
|
Loading…
Reference in a new issue