1
0
mirror of https://github.com/kmein/niveum synced 2026-03-16 10:11:08 +01:00

tarot: replace htgen by flask

This commit is contained in:
2025-12-19 15:05:29 +01:00
parent f7a7e80d97
commit 1bba38be77
4 changed files with 42 additions and 169 deletions

View File

@@ -130,7 +130,6 @@
# TODO remove flake-utils dependency from my own repos # TODO remove flake-utils dependency from my own repos
nixosModules = { nixosModules = {
htgen = import modules/htgen.nix;
moodle-dl = import modules/moodle-dl.nix; moodle-dl = import modules/moodle-dl.nix;
networkmanager-declarative = import modules/networkmanager-declarative.nix; networkmanager-declarative = import modules/networkmanager-declarative.nix;
passport = import modules/passport.nix; passport = import modules/passport.nix;
@@ -170,7 +169,6 @@
inputs.self.nixosModules.passport inputs.self.nixosModules.passport
inputs.self.nixosModules.panoptikon inputs.self.nixosModules.panoptikon
inputs.self.nixosModules.go-webring inputs.self.nixosModules.go-webring
inputs.self.nixosModules.htgen
inputs.stockholm.nixosModules.reaktor2 inputs.stockholm.nixosModules.reaktor2
retiolum.nixosModules.retiolum retiolum.nixosModules.retiolum
nur.modules.nixos.default nur.modules.nixos.default
@@ -212,7 +210,6 @@
modules = [ modules = [
systems/makanek/configuration.nix systems/makanek/configuration.nix
inputs.self.nixosModules.telegram-bot inputs.self.nixosModules.telegram-bot
inputs.self.nixosModules.htgen
inputs.self.nixosModules.passport inputs.self.nixosModules.passport
agenix.nixosModules.default agenix.nixosModules.default
retiolum.nixosModules.retiolum retiolum.nixosModules.retiolum
@@ -319,7 +316,6 @@
# krebs # krebs
brainmelter = pkgs.callPackage packages/brainmelter.nix {}; brainmelter = pkgs.callPackage packages/brainmelter.nix {};
cyberlocker-tools = pkgs.callPackage packages/cyberlocker-tools.nix {}; cyberlocker-tools = pkgs.callPackage packages/cyberlocker-tools.nix {};
htgen = pkgs.callPackage packages/htgen.nix {};
hc = pkgs.callPackage packages/hc.nix {}; hc = pkgs.callPackage packages/hc.nix {};
kpaste = pkgs.callPackage packages/kpaste.nix {}; kpaste = pkgs.callPackage packages/kpaste.nix {};
pls = pkgs.callPackage packages/pls.nix {}; pls = pkgs.callPackage packages/pls.nix {};

View File

@@ -1,110 +0,0 @@
{
config,
lib,
pkgs,
...
}:
let
optionalAttr = name: value: if name != null then { ${name} = value; } else { };
cfg = config.services.htgen;
out = {
options.services.htgen = api;
config = imp;
};
htgen = pkgs.callPackage ../packages/htgen.nix { };
api =
with lib;
mkOption {
default = { };
type = types.attrsOf (
types.submodule (
{ config, ... }:
{
options = {
enable = mkEnableOption "services.htgen-${config._module.args.name}";
name = mkOption {
type = types.str;
default = config._module.args.name;
};
package = mkOption {
default = htgen;
type = types.package;
};
port = mkOption {
type = types.port;
};
script = mkOption {
type = types.nullOr types.str;
default = null;
};
scriptFile = mkOption {
type = types.nullOr (types.either types.package types.pathname);
default = null;
};
user = mkOption {
default = {
name = "htgen-${config.name}";
home = "/var/lib/htgen-${config.name}";
};
defaultText = {
name = "htgen-name";
home = "/var/lib/htgen-name";
};
};
};
}
)
);
};
imp = {
systemd.services = lib.mapAttrs' (
name: htgen:
lib.nameValuePair "htgen-${name}" {
wantedBy = [ "multi-user.target" ];
after = [ "network.target" ];
environment = {
HTGEN_PORT = toString htgen.port;
}
// optionalAttr "HTGEN_SCRIPT" htgen.script
// optionalAttr "HTGEN_SCRIPT_FILE" htgen.scriptFile;
serviceConfig = {
SyslogIdentifier = "htgen";
User = htgen.user.name;
PrivateTmp = true;
Restart = "always";
ExecStart = "${htgen.package}/bin/htgen --serve";
};
}
) cfg;
users.users = lib.mapAttrs' (
name: htgen:
lib.nameValuePair htgen.user.name {
inherit (htgen.user) home name;
group = htgen.user.name;
createHome = true;
isSystemUser = true;
}
) cfg;
users.groups = lib.mapAttrs' (
name: htgen:
lib.nameValuePair htgen.user.name {
name = htgen.user.name;
}
) cfg;
};
in
out

View File

@@ -1,26 +0,0 @@
{ fetchgit, lib, pkgs, stdenv }:
stdenv.mkDerivation rec {
pname = "htgen";
version = "1.4.0";
src = fetchgit {
url = "https://cgit.krebsco.de/htgen";
rev = "refs/tags/${version}";
sha256 = "1k6xdr4g1p2wjiyizwh33ihw3azbar7kmhyxywcq0whpip9inpmj";
};
installPhase = ''
mkdir -p $out/bin
{
echo '#! ${pkgs.dash}/bin/dash'
echo 'export PATH=${lib.makeBinPath [
pkgs.coreutils
pkgs.jq
pkgs.ucspi-tcp
]}''${PATH+":$PATH"}'
sed 's:^Server=htgen$:&/${version}:' htgen
} > $out/bin/htgen
chmod +x $out/bin/htgen
cp -r examples $out
'';
}

View File

@@ -3,7 +3,8 @@
pkgs, pkgs,
lib, lib,
... ...
}: let }:
let
tarotPort = 7407; tarotPort = 7407;
tarotFiles = pkgs.fetchzip { tarotFiles = pkgs.fetchzip {
url = "https://c.krebsco.de/tarot.zip"; url = "https://c.krebsco.de/tarot.zip";
@@ -14,33 +15,45 @@
url = "http://c.krebsco.de/tarot.pdf"; url = "http://c.krebsco.de/tarot.pdf";
sha256 = "1n2m53kjg2vj9dbr70b9jrsbqwdfrcb48l4wswn21549fi24g6dx"; sha256 = "1n2m53kjg2vj9dbr70b9jrsbqwdfrcb48l4wswn21549fi24g6dx";
}; };
in { in
services.htgen.tarot = { {
port = tarotPort; systemd.services.tarot = {
script = pkgs.writers.writeDash "tarot" '' enable = true;
case "$Method $Request_URI" in serviceConfig.Type = "simple";
"GET /") wantedBy = [ "multi-user.target" ];
if item=$(${pkgs.findutils}/bin/find ${toString tarotFiles} -type f | ${pkgs.coreutils}/bin/shuf -n1); then serviceConfig.ExecStart = pkgs.writers.writePython3 "tarot-server" {
card=$(mktemp --tmpdir tarot.XXX) libraries = py: [ py.pillow py.flask ];
trap 'rm $card' EXIT } ''
reverse=$(${pkgs.coreutils}/bin/shuf -i0-1 -n1) from flask import Flask, send_file
if [ "$reverse" -eq 1 ]; then from pathlib import Path
${pkgs.imagemagick}/bin/convert -rotate 180 "$item" "$card" from random import choice, randint
else from io import BytesIO
${pkgs.coreutils}/bin/cp "$item" "$card" from PIL import Image
fi
printf 'HTTP/1.1 200 OK\r\n' app = Flask(__name__)
printf 'Content-Type: %s\r\n' "$(${pkgs.file}/bin/file -ib "$card")" TAROT_DIR = Path("${tarotFiles}")
printf 'Server: %s\r\n' "$Server"
printf 'Connection: close\r\n'
printf 'Content-Length: %d\r\n' $(${pkgs.coreutils}/bin/wc -c < "$card") @app.route("/")
printf '\r\n' def tarot():
cat "$card" card_path = choice(list(TAROT_DIR.glob("*")))
exit
fi with Image.open(card_path) as img:
;; if randint(0, 1):
esac img = img.rotate(180)
''; buf = BytesIO()
img.save(buf, format="JPEG")
buf.seek(0)
return send_file(
buf,
mimetype='image/jpeg',
as_attachment=False
)
if __name__ == "__main__":
app.run(port=${toString tarotPort})
'';
}; };
niveum.passport.services = [ niveum.passport.services = [
@@ -55,7 +68,7 @@ in {
enableACME = true; enableACME = true;
forceSSL = true; forceSSL = true;
locations = { locations = {
"/".proxyPass = "http://127.0.0.1:${toString tarotPort}"; "/".proxyPass = "http://127.0.0.1:${toString tarotPort}/";
"/files/" = { "/files/" = {
root = pkgs.linkFarm "tarot" [ root = pkgs.linkFarm "tarot" [
{ {