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:
@@ -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 {};
|
||||||
|
|||||||
@@ -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
|
|
||||||
@@ -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
|
|
||||||
'';
|
|
||||||
}
|
|
||||||
@@ -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" [
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user