flake: format it

This commit is contained in:
silver 2024-05-12 16:24:48 +01:00
parent 982b9defd4
commit ed4c46e81d

360
flake.nix
View file

@ -3,8 +3,8 @@
inputs = { inputs = {
nixpkgs.url = "nixpkgs/nixos-23.05"; nixpkgs.url = "nixpkgs/nixos-23.05";
naersk.url = "github:nix-community/naersk"; naersk.url = "github:nix-community/naersk";
utils.url = "github:numtide/flake-utils"; utils.url = "github:numtide/flake-utils";
}; };
/* /*
@ -17,179 +17,75 @@
extra-trusted-public-keys = "skynet-cache:OdfA4Or0JcHiHf05fsiIR4nZT2z2yDEtkoLqhntGAz4="; extra-trusted-public-keys = "skynet-cache:OdfA4Or0JcHiHf05fsiIR4nZT2z2yDEtkoLqhntGAz4=";
}; };
outputs = { self, nixpkgs, utils, naersk }: utils.lib.eachDefaultSystem (system: outputs = {
let self,
pkgs = nixpkgs.legacyPackages."${system}"; nixpkgs,
naersk-lib = naersk.lib."${system}"; utils,
package_name = "skynet_discord_bot"; naersk,
desc = "Skynet Discord Bot"; }:
in rec { utils.lib.eachDefaultSystem (
system: let
pkgs = nixpkgs.legacyPackages."${system}";
naersk-lib = naersk.lib."${system}";
package_name = "skynet_discord_bot";
desc = "Skynet Discord Bot";
in rec {
# `nix build`
packages."${package_name}" = naersk-lib.buildPackage {
pname = "${package_name}";
root = ./.;
# `nix build` buildInputs = with pkgs; [
packages."${package_name}" = naersk-lib.buildPackage { openssl
pname = "${package_name}"; pkg-config
root = ./.; ];
};
buildInputs = [ defaultPackage = packages."${package_name}";
pkgs.openssl
pkgs.pkg-config
];
};
defaultPackage = packages."${package_name}"; # `nix run`
apps."${package_name}" = utils.lib.mkApp {
drv = packages."${package_name}";
};
# `nix run` defaultApp = apps."${package_name}";
apps."${package_name}" = utils.lib.mkApp {
drv = packages."${package_name}";
};
defaultApp = apps."${package_name}"; # `nix develop`
devShell = pkgs.mkShell {
nativeBuildInputs = with pkgs; [rustc cargo pkg-config openssl];
};
# `nix develop` nixosModule = {
devShell = pkgs.mkShell { lib,
nativeBuildInputs = with pkgs; [ rustc cargo pkg-config openssl]; pkgs,
}; config,
...
nixosModule = { lib, pkgs, config, ... }: }:
with lib; with lib; let
let cfg = config.services."${package_name}";
cfg = config.services."${package_name}"; # secret options are in the env file(s) loaded separately
# secret options are in the env file(s) loaded separately environment_config = {
environment_config = { LDAP_API = cfg.ldap;
LDAP_API = cfg.ldap; SKYNET_SERVER = cfg.discord.server;
SKYNET_SERVER = cfg.discord.server; HOME = cfg.home;
HOME = cfg.home; DATABASE = "database.db";
DATABASE = "database.db";
};
service_name = script: lib.strings.sanitizeDerivationName("${cfg.user}@${script}");
# oneshot scripts to run
serviceGenerator = mapAttrs' (script: time: nameValuePair (service_name script) {
description = "Service for ${desc} ${script}";
wantedBy = [ ];
after = [ "network-online.target" ];
environment = environment_config;
serviceConfig = {
Type = "oneshot";
User = "${cfg.user}";
Group = "${cfg.user}";
ExecStart = "${self.defaultPackage."${system}"}/bin/${script}";
EnvironmentFile = [
"${cfg.env.ldap}"
"${cfg.env.discord}"
"${cfg.env.mail}"
"${cfg.env.wolves}"
];
};
});
# each timer will run the above service
timerGenerator = mapAttrs' (script: time: nameValuePair (service_name script) {
description = "Timer for ${desc} ${script}";
wantedBy = [ "timers.target" ];
partOf = [ "${service_name script}.service" ];
timerConfig = {
OnCalendar = time;
Unit = "${service_name script}.service";
Persistent = true;
};
});
# modify these
scripts = {
# every 20 min
"update_data" = "*:0,20,40";
# groups are updated every hour, offset from teh ldap
"update_users" = "*:05:00";
# minecraft stuff is updated at 5am
"update_minecraft" = "5:10:00";
};
in {
options.services."${package_name}" = {
enable = mkEnableOption "enable ${package_name}";
env = {
ldap = mkOption rec {
type = types.str;
description = "ENV file with LDAP_DISCORD_AUTH";
};
discord = mkOption rec {
type = types.str;
description = "ENV file with DISCORD_TOKEN, DISCORD_MINECRAFT";
};
mail = mkOption rec {
type = types.str;
description = "ENV file with EMAIL_SMTP, EMAIL_USER, EMAIL_PASS";
};
wolves = mkOption rec {
type = types.str;
description = "Mail details, has WOLVES_URL, WOLVES_KEY";
};
}; };
discord = { service_name = script: lib.strings.sanitizeDerivationName "${cfg.user}@${script}";
server = mkOption rec {
type = types.str;
description = "ID of the server the bot runs on";
};
};
ldap = mkOption rec { # oneshot scripts to run
type = types.str; serviceGenerator = mapAttrs' (script: time:
default = "https://api.account.skynet.ie"; nameValuePair (service_name script) {
description = "Location of the ldap api"; description = "Service for ${desc} ${script}";
}; wantedBy = [];
after = ["network-online.target"];
user = mkOption rec {
type = types.str;
default = "${package_name}";
description = "The user to run the service";
};
home = mkOption rec {
type = types.str;
default = "/etc/${cfg.prefix}${package_name}";
description = "The home for the user";
};
prefix = mkOption rec {
type = types.str;
default = "skynet_";
example = default;
description = "The prefix used to name service/folders";
};
};
config = mkIf cfg.enable {
users.groups."${cfg.user}" = { };
users.users."${cfg.user}" = {
createHome = true;
isSystemUser = true;
home = "${cfg.home}";
group = "${cfg.user}";
};
systemd.services = {
# main service
"${package_name}" = {
description = desc;
wantedBy = [ "multi-user.target" ];
after = [ "network-online.target" ];
wants = [ ];
environment = environment_config; environment = environment_config;
serviceConfig = { serviceConfig = {
User = "${cfg.user}"; Type = "oneshot";
Group = "${cfg.user}"; User = "${cfg.user}";
Restart = "always"; Group = "${cfg.user}";
ExecStart = "${self.defaultPackage."${system}"}/bin/${package_name}"; ExecStart = "${self.defaultPackage."${system}"}/bin/${script}";
# can have multiple env files
EnvironmentFile = [ EnvironmentFile = [
"${cfg.env.ldap}" "${cfg.env.ldap}"
"${cfg.env.discord}" "${cfg.env.discord}"
@ -197,20 +93,134 @@
"${cfg.env.wolves}" "${cfg.env.wolves}"
]; ];
}; };
restartTriggers = [ });
"${cfg.env.ldap}"
"${cfg.env.discord}" # each timer will run the above service
"${cfg.env.mail}" timerGenerator = mapAttrs' (script: time:
"${cfg.env.wolves}" nameValuePair (service_name script) {
]; description = "Timer for ${desc} ${script}";
wantedBy = ["timers.target"];
partOf = ["${service_name script}.service"];
timerConfig = {
OnCalendar = time;
Unit = "${service_name script}.service";
Persistent = true;
};
});
# modify these
scripts = {
# every 20 min
"update_data" = "*:0,20,40";
# groups are updated every hour, offset from teh ldap
"update_users" = "*:05:00";
# minecraft stuff is updated at 5am
"update_minecraft" = "5:10:00";
};
in {
options.services."${package_name}" = {
enable = mkEnableOption "enable ${package_name}";
env = {
ldap = mkOption rec {
type = types.str;
description = "ENV file with LDAP_DISCORD_AUTH";
};
discord = mkOption rec {
type = types.str;
description = "ENV file with DISCORD_TOKEN, DISCORD_MINECRAFT";
};
mail = mkOption rec {
type = types.str;
description = "ENV file with EMAIL_SMTP, EMAIL_USER, EMAIL_PASS";
};
wolves = mkOption rec {
type = types.str;
description = "Mail details, has WOLVES_URL, WOLVES_KEY";
};
}; };
} // serviceGenerator scripts;
# timers to run the above services discord = {
systemd.timers = timerGenerator scripts; server = mkOption rec {
type = types.str;
description = "ID of the server the bot runs on";
};
};
ldap = mkOption rec {
type = types.str;
default = "https://api.account.skynet.ie";
description = "Location of the ldap api";
};
user = mkOption rec {
type = types.str;
default = "${package_name}";
description = "The user to run the service";
};
home = mkOption rec {
type = types.str;
default = "/etc/${cfg.prefix}${package_name}";
description = "The home for the user";
};
prefix = mkOption rec {
type = types.str;
default = "skynet_";
example = default;
description = "The prefix used to name service/folders";
};
};
config = mkIf cfg.enable {
users.groups."${cfg.user}" = {};
users.users."${cfg.user}" = {
createHome = true;
isSystemUser = true;
home = "${cfg.home}";
group = "${cfg.user}";
};
systemd.services =
{
# main service
"${package_name}" = {
description = desc;
wantedBy = ["multi-user.target"];
after = ["network-online.target"];
wants = [];
environment = environment_config;
serviceConfig = {
User = "${cfg.user}";
Group = "${cfg.user}";
Restart = "always";
ExecStart = "${self.defaultPackage."${system}"}/bin/${package_name}";
# can have multiple env files
EnvironmentFile = [
"${cfg.env.ldap}"
"${cfg.env.discord}"
"${cfg.env.mail}"
"${cfg.env.wolves}"
];
};
restartTriggers = [
"${cfg.env.ldap}"
"${cfg.env.discord}"
"${cfg.env.mail}"
"${cfg.env.wolves}"
];
};
}
// serviceGenerator scripts;
# timers to run the above services
systemd.timers = timerGenerator scripts;
};
}; };
}; }
} );
);
} }