1{ config, pkgs, lib, serverInfo, ... }:
2let
3 inherit (pkgs) foswiki;
4 inherit (serverInfo.serverConfig) user group;
5 inherit (config) vardir;
6in
7{
8 options.vardir = lib.mkOption {
9 type = lib.types.path;
10 default = "/var/www/foswiki";
11 description = "The directory where variable foswiki data will be stored and served from.";
12 };
13
14 # TODO: this will probably need to be better customizable
15 extraConfig =
16 let httpd-conf = pkgs.runCommand "foswiki-httpd.conf"
17 { preferLocalBuild = true; }
18 ''
19 substitute '${foswiki}/foswiki_httpd_conf.txt' "$out" \
20 --replace /var/www/foswiki/ "${vardir}/"
21 '';
22 in
23 ''
24 RewriteEngine on
25 RewriteRule /foswiki/(.*) ${vardir}/$1
26
27 <Directory "${vardir}">
28 Require all granted
29 </Directory>
30
31 Include ${httpd-conf}
32 <Directory "${vardir}/pub">
33 Options FollowSymlinks
34 </Directory>
35 '';
36
37 /** This handles initial setup and updates.
38 It will probably need some tweaking, maybe per-site. */
39 startupScript = pkgs.writeScript "foswiki_startup.sh" (
40 let storeLink = "${vardir}/package"; in
41 ''
42 [ -e '${storeLink}' ] || needs_setup=1
43 mkdir -p '${vardir}'
44 cd '${vardir}'
45 ln -sf -T '${foswiki}' '${storeLink}'
46
47 if [ -n "$needs_setup" ]; then # do initial setup
48 mkdir -p bin lib
49 # setup most of data/ as copies only
50 cp -r '${foswiki}'/data '${vardir}/'
51 rm -r '${vardir}'/data/{System,mime.types}
52 ln -sr -t '${vardir}/data/' '${storeLink}'/data/{System,mime.types}
53
54 ln -sr '${storeLink}/locale' .
55
56 mkdir pub
57 ln -sr '${storeLink}/pub/System' pub/
58
59 mkdir templates
60 ln -sr '${storeLink}'/templates/* templates/
61
62 ln -sr '${storeLink}/tools' .
63
64 mkdir -p '${vardir}'/working/{logs,tmp}
65 ln -sr '${storeLink}/working/README' working/ # used to check dir validity
66
67 chown -R '${user}:${group}' .
68 chmod +w -R .
69 fi
70
71 # bin/* and lib/* shall always be overwritten, in case files are added
72 ln -srf '${storeLink}'/bin/* '${vardir}/bin/'
73 ln -srf '${storeLink}'/lib/* '${vardir}/lib/'
74 ''
75 /* Symlinking bin/ one-by-one ensures that ${vardir}/lib/LocalSite.cfg
76 is used instead of ${foswiki}/... */
77 );
78}