This repository has no description
1{
2 self,
3 config,
4 pkgs,
5 ...
6}:
7let
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
31 send_to_radio = pkgs.writers.writeDashBin "send_to_radio" ''
32 ${pkgs.vorbis-tools}/bin/oggenc - |
33 ${self.packages.${pkgs.stdenv.hostPlatform.system}.cyberlocker-tools}/bin/cput news.ogg
34 ${pkgs.curl}/bin/curl -fSs -X POST http://localhost:8002/newsshow
35 '';
36
37 gc_news = pkgs.writers.writeDashBin "gc_news" ''
38 set -xefu
39 export TZ=UTC #workaround for jq parsing wrong timestamp
40 ${pkgs.coreutils}/bin/cat $HOME/news | ${pkgs.jq}/bin/jq -cs 'map(select((.to|fromdateiso8601) > now)) | .[]' > $HOME/bla-news.tmp
41 ${pkgs.coreutils}/bin/mv $HOME/bla-news.tmp $HOME/news
42 '';
43
44 get_current_news = pkgs.writers.writeDashBin "get_current_news" ''
45 set -xefu
46 export TZ=UTC #workaround for jq parsing wrong timestamp
47 ${pkgs.coreutils}/bin/cat $HOME/news | ${pkgs.jq}/bin/jq -rs '
48 sort_by(.priority) |
49 map(select(
50 ((.to | fromdateiso8601) > now) and
51 (.from|fromdateiso8601) < now) |
52 .text
53 ) | .[]'
54 '';
55
56 newsshow =
57 pkgs.writers.writeDashBin "newsshow" # sh
58 ''
59 cat << EOF
60 hello crabpeople!
61 $(${pkgs.ddate}/bin/ddate +'Today is %{%A, the %e of %B%}, %Y. %N%nCelebrate %H')
62 It is $(date --utc +%H) o clock U.T.C.
63 todays news:
64 $(get_current_news)
65 $(gc_news)
66 EOF
67 '';
68in
69{
70 systemd.services.newsshow = {
71 path = [
72 newsshow
73 send_to_radio
74 gc_news
75 get_current_news
76 pkgs.retry
77 ];
78 script = ''
79 set -efu
80 retry -t 5 -d 10 -- newsshow |
81 retry -t 5 -d 10 -- /run/current-system/sw/bin/tts |
82 retry -t 5 -d 10 -- send_to_radio
83 '';
84 startAt = "*:00:00";
85 serviceConfig = {
86 User = "radio-news";
87 };
88 };
89
90 services.nginx.virtualHosts."radio-news.r" = {
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 '';
98 };
99 imports = [
100 ./tts.nix
101 ];
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;
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 = { };
115
116 # debug
117 environment.systemPackages = [
118 send_to_radio
119 newsshow
120 get_current_news
121 gc_news
122 ];
123}