This repository has no description
0

Configure Feed

Select the types of activity you want to include in your feed.

configs.services.radio: replace htgen with nginx and fcgiwrap

The port 8000 redirect is an nginx return, /skip, /good and radio-news.r
run as CGI through fcgiwrap. Port 8001 and the dash 0.5.12 pin go away.

+77 -96
+21 -53
configs/services/radio/default.nix
··· 1 1 { 2 2 self, 3 + config, 3 4 pkgs, 4 5 lib, 5 6 ... ··· 8 9 let 9 10 name = "radio"; 10 11 11 - stockholmPkgs = self.inputs.stockholm.packages.${pkgs.stdenv.hostPlatform.system}; 12 - 13 12 music_dir = "/var/music"; 14 - 15 - # dash 0.5.13 has a regression where `read` builtin discards input when stdin is a socket 16 - # This breaks htgen which uses tcpserver. Pin htgen's dash to 0.5.12 until upstream fixes it. 17 - # See: https://git.kernel.org/pub/scm/utils/dash/dash.git/commit/?id=1d072e9c3292281a7eee54c41fec117ff22723e5 18 - dash-0_5_12 = pkgs.dash.overrideAttrs (_old: rec { 19 - version = "0.5.12"; 20 - src = pkgs.fetchurl { 21 - url = "http://gondor.apana.org.au/~herbert/dash/files/dash-${version}.tar.gz"; 22 - hash = "sha256-akdKxG6LCzKRbExg32lMggWNMpfYs4W3RQgDDKSo8oo="; 23 - }; 24 - }); 25 - 26 - htgen-fixed = stockholmPkgs.htgen.override { 27 - pkgs = pkgs // { 28 - dash = dash-0_5_12; 29 - }; 30 - }; 31 13 32 14 skip_track = pkgs.writers.writeBashBin "skip_track" '' 33 15 set -eu ··· 75 57 echo "$file": "$link" 76 58 ''; 77 59 60 + # nginx location running a track script through fcgiwrap 61 + trackAction = script: '' 62 + limit_except POST { deny all; } 63 + include ${config.services.nginx.package}/conf/fastcgi_params; 64 + fastcgi_param SCRIPT_FILENAME ${pkgs.writers.writeDash "${script.name}-cgi" '' 65 + printf 'Content-Type: text/plain; charset=UTF-8\r\n\r\n' 66 + ${script}/bin/${script.name} 67 + ''}; 68 + fastcgi_pass unix:${config.services.fcgiwrap.instances.radio.socket.address}; 69 + ''; 70 + 78 71 in 79 72 { 80 73 imports = [ ··· 85 78 users.users = { 86 79 "${name}" = rec { 87 80 inherit name; 81 + isSystemUser = true; 88 82 createHome = true; 89 83 group = name; 90 84 description = "radio manager"; ··· 194 188 }; 195 189 196 190 networking.firewall.interfaces.retiolum.allowedTCPPorts = [ 197 - 8001 198 191 8002 199 192 ]; 200 193 201 - krebs.htgen.radio = { 202 - package = htgen-fixed; 203 - port = 8001; 204 - user = { 205 - name = "radio"; 206 - }; 207 - scriptFile = pkgs.writers.writeDash "radio" '' 208 - set -x 209 - case "''${Method:-} ''${Request_URI:-}" in 210 - "POST /skip") 211 - printf 'HTTP/1.1 200 OK\r\n' 212 - printf 'Connection: close\r\n' 213 - printf '\r\n' 214 - msg=$(${skip_track}/bin/skip_track) 215 - echo "$msg" 216 - exit 217 - ;; 218 - "POST /good") 219 - printf 'HTTP/1.1 200 OK\r\n' 220 - printf 'Connection: close\r\n' 221 - printf '\r\n' 222 - msg=$(${good_track}/bin/good_track) 223 - echo "$msg" 224 - exit 225 - ;; 226 - esac 227 - ''; 194 + # POST /skip and /good, run as radio by fcgiwrap 195 + services.fcgiwrap.instances.radio = { 196 + process.user = name; 197 + process.group = name; 198 + socket.user = config.services.nginx.user; 199 + socket.group = config.services.nginx.group; 228 200 }; 229 201 230 202 networking.firewall.allowedTCPPorts = [ ··· 270 242 locations."= /current".extraConfig = '' 271 243 proxy_pass http://localhost:8002; 272 244 ''; 273 - locations."= /skip".extraConfig = '' 274 - proxy_pass http://localhost:8001; 275 - ''; 276 - locations."= /good".extraConfig = '' 277 - proxy_pass http://localhost:8001; 278 - ''; 245 + locations."= /skip".extraConfig = trackAction skip_track; 246 + locations."= /good".extraConfig = trackAction good_track; 279 247 locations."= /radio.sh".alias = pkgs.writeScript "radio.sh" '' 280 248 #!/bin/sh 281 249 trap 'exit 0' EXIT
+43 -34
configs/services/radio/news.nix
··· 1 1 { 2 2 self, 3 + config, 3 4 pkgs, 4 5 ... 5 6 }: 6 7 let 8 + news = "/home/radio-news/news"; 9 + 10 + # GET / lists the news, POST / adds a JSON object { from, to, text, priority } 11 + newsCgi = pkgs.writers.writeDash "radio-news-cgi" '' 12 + case "$REQUEST_METHOD $DOCUMENT_URI" in 13 + "GET /") 14 + printf 'Content-Type: application/json\r\n\r\n' 15 + cat ${news} 2>/dev/null | ${pkgs.jq}/bin/jq -sc . 16 + ;; 17 + "POST /") 18 + if entries=$(${pkgs.jq}/bin/jq -c '{ from, to, text, priority: (.priority // 0) }'); then 19 + printf '%s\n' "$entries" >> ${news} 20 + printf 'Status: 200 OK\r\n\r\n' 21 + else 22 + printf 'Status: 400 Bad Request\r\n\r\n' 23 + fi 24 + ;; 25 + *) 26 + printf 'Status: 404 Not Found\r\n\r\n' 27 + ;; 28 + esac 29 + ''; 30 + 7 31 send_to_radio = pkgs.writers.writeDashBin "send_to_radio" '' 8 32 ${pkgs.vorbis-tools}/bin/oggenc - | 9 33 ${self.packages.${pkgs.stdenv.hostPlatform.system}.cyberlocker-tools}/bin/cput news.ogg ··· 64 88 }; 65 89 66 90 services.nginx.virtualHosts."radio-news.r" = { 67 - locations."/" = { 68 - proxyPass = "http://localhost:7999"; 69 - proxyWebsockets = true; 70 - extraConfig = '' 71 - add_header 'Access-Control-Allow-Origin' '*'; 72 - add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS'; 73 - ''; 74 - }; 91 + locations."/".extraConfig = '' 92 + add_header 'Access-Control-Allow-Origin' '*'; 93 + add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS'; 94 + include ${config.services.nginx.package}/conf/fastcgi_params; 95 + fastcgi_param SCRIPT_FILENAME ${newsCgi}; 96 + fastcgi_pass unix:${config.services.fcgiwrap.instances.radio-news.socket.address}; 97 + ''; 75 98 }; 76 99 imports = [ 77 100 ./tts.nix 78 101 ]; 79 - krebs.htgen.news = { 80 - port = 7999; 81 - user = { 82 - name = "radio-news"; 83 - }; 84 - script = ". ${pkgs.writers.writeDash "htgen-news" '' 85 - set -xefu 86 - case "''${Method:-GET} $Request_URI" in 87 - "GET /") 88 - printf 'HTTP/1.1 200 OK\r\n' 89 - printf 'Connection: close\r\n' 90 - printf '\r\n' 91 - cat "$HOME"/news | jq -sc . 92 - exit 93 - ;; 94 - "POST /") 95 - payload=$(head -c "$req_content_length") 96 - printf '%s' "$payload" | jq 'has("from") and has("to") and has("text")' >&2 97 - printf '%s' "$payload" | jq -c '{ from: .from, to: .to, text: .text, priority: (.priority // 0)}' >> "$HOME"/news 98 - printf 'HTTP/1.1 200 OK\r\n' 99 - printf 'Connection: close\r\n' 100 - printf '\r\n' 101 - exit 102 - ;; 103 - esac 104 - ''}"; 102 + services.fcgiwrap.instances.radio-news = { 103 + process.user = "radio-news"; 104 + process.group = "radio-news"; 105 + socket.user = config.services.nginx.user; 106 + socket.group = config.services.nginx.group; 105 107 }; 108 + users.users.radio-news = { 109 + isSystemUser = true; 110 + group = "radio-news"; 111 + home = "/home/radio-news"; 112 + createHome = true; 113 + }; 114 + users.groups.radio-news = { }; 106 115 107 116 # debug 108 117 environment.systemPackages = [
+13 -9
configs/services/radio/proxy.nix
··· 1 - { pkgs, ... }: 2 - { 1 + _: { 3 2 services.nginx.virtualHosts."radio.lassul.us" = { 4 3 enableACME = true; 5 4 addSSL = true; ··· 34 33 ''; 35 34 }; 36 35 }; 37 - krebs.htgen.radio-redirect = { 38 - port = 8000; 39 - scriptFile = pkgs.writers.writeDash "redir" '' 40 - printf 'HTTP/1.1 301 Moved Permanently\r\n' 41 - printf "Location: http://radio.lassul.us''${Request_URI}\r\n" 42 - printf '\r\n' 43 - ''; 36 + services.nginx.virtualHosts.radio-redirect = { 37 + listen = [ 38 + { 39 + addr = "0.0.0.0"; 40 + port = 8000; 41 + } 42 + { 43 + addr = "[::]"; 44 + port = 8000; 45 + } 46 + ]; 47 + locations."/".return = "301 http://radio.lassul.us$request_uri"; 44 48 }; 45 49 networking.firewall.allowedTCPPorts = [ 8000 ]; 46 50 }