 f74735c9d7
			
		
	
	
		f74735c9d7
		
	
	
	
	
		
			
			Since https://github.com/NixOS/nixpkgs/pull/61321, local-fs.target is part of sysinit.target again, meaning units without DefaultDependencies=no will automatically depend on it, and the manual set dependencies can be dropped.
		
			
				
	
	
		
			259 lines
		
	
	
		
			7.4 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
			
		
		
	
	
			259 lines
		
	
	
		
			7.4 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
| { config, lib, pkgs, ... }:
 | ||
| 
 | ||
| with lib;
 | ||
| 
 | ||
| let
 | ||
|   cfg = config.services.mwlib;
 | ||
|   pypkgs = pkgs.python27Packages;
 | ||
| 
 | ||
|   inherit (pypkgs) python mwlib;
 | ||
| 
 | ||
|   user = mkOption {
 | ||
|     default = "nobody";
 | ||
|     type = types.str;
 | ||
|     description = "User to run as.";
 | ||
|   };
 | ||
| 
 | ||
| in
 | ||
| {
 | ||
| 
 | ||
|   options.services.mwlib = {
 | ||
| 
 | ||
|     nserve = {
 | ||
|       enable = mkOption {
 | ||
|         default = false;
 | ||
|         type = types.bool;
 | ||
|         description = ''
 | ||
|           Whether to enable nserve. Nserve is a HTTP
 | ||
|           server.  The Collection extension is talking to
 | ||
|           that program directly.  Nserve uses at least
 | ||
|           one qserve instance in order to distribute
 | ||
|           and manage jobs.
 | ||
|         '';
 | ||
|       }; # nserve.enable
 | ||
| 
 | ||
|       port = mkOption {
 | ||
|         default = 8899;
 | ||
|         type = types.int;
 | ||
|         description = "Specify port to listen on.";
 | ||
|       }; # nserve.port
 | ||
| 
 | ||
|       address = mkOption {
 | ||
|         default = "127.0.0.1";
 | ||
|         type = types.str;
 | ||
|         description = "Specify network interface to listen on.";
 | ||
|       }; # nserve.address
 | ||
| 
 | ||
|       qserve = mkOption {
 | ||
|         default = [ "${cfg.qserve.address}:${toString cfg.qserve.port}" ];
 | ||
|         type = types.listOf types.str;
 | ||
|         description = "Register qserve instance.";
 | ||
|       }; # nserve.qserve
 | ||
| 
 | ||
|       inherit user;
 | ||
|     }; # nserve
 | ||
| 
 | ||
|     qserve = {
 | ||
|       enable = mkOption {
 | ||
|         default = false;
 | ||
|         type = types.bool;
 | ||
|         description = ''
 | ||
|           A job queue server used to distribute and manage
 | ||
|           jobs. You should start one qserve instance
 | ||
|           for each machine that is supposed to render pdf
 | ||
|           files. Unless you’re operating the Wikipedia
 | ||
|           installation, one machine should suffice.
 | ||
|         '';
 | ||
|       }; # qserve.enable
 | ||
| 
 | ||
|       port = mkOption {
 | ||
|         default = 14311;
 | ||
|         type = types.int;
 | ||
|         description = "Specify port to listen on.";
 | ||
|       }; # qserve.port
 | ||
| 
 | ||
|       address = mkOption {
 | ||
|         default = "127.0.0.1";
 | ||
|         type = types.str;
 | ||
|         description = "Specify network interface to listen on.";
 | ||
|       }; # qserve.address
 | ||
| 
 | ||
|       datadir = mkOption {
 | ||
|         default = "/var/lib/mwlib-qserve";
 | ||
|         type = types.path;
 | ||
|         description = "qserve data directory (FIXME: unused?)";
 | ||
|       }; # qserve.datadir
 | ||
| 
 | ||
|       allow = mkOption {
 | ||
|         default = [ "127.0.0.1" ];
 | ||
|         type = types.listOf types.str;
 | ||
|         description = "List of allowed client IPs. Empty means any.";
 | ||
|       }; # qserve.allow
 | ||
| 
 | ||
|       inherit user;
 | ||
|     }; # qserve
 | ||
| 
 | ||
|     nslave = {
 | ||
|       enable = mkOption {
 | ||
|         default = cfg.qserve.enable;
 | ||
|         type = types.bool;
 | ||
|         description = ''
 | ||
|           Pulls new jobs from exactly one qserve instance
 | ||
|           and calls the zip and render programs
 | ||
|           in order to download article collections and
 | ||
|           convert them to different output formats. Nslave
 | ||
|           uses a cache directory to store the generated
 | ||
|           documents. Nslave also starts an internal http
 | ||
|           server serving the content of the cache directory.
 | ||
|         '';
 | ||
|       }; # nslave.enable
 | ||
| 
 | ||
|       cachedir = mkOption {
 | ||
|         default = "/var/cache/mwlib-nslave";
 | ||
|         type = types.path;
 | ||
|         description = "Directory to store generated documents.";
 | ||
|       }; # nslave.cachedir
 | ||
| 
 | ||
|       numprocs = mkOption {
 | ||
|         default = 10;
 | ||
|         type = types.int;
 | ||
|         description = "Number of parallel jobs to be executed.";
 | ||
|       }; # nslave.numprocs
 | ||
| 
 | ||
|       http = mkOption {
 | ||
|         default = {};
 | ||
|         description = ''
 | ||
|           Internal http server serving the content of the cache directory.
 | ||
|           You have to enable it, or use your own way for serving files
 | ||
|           and set the http.url option accordingly.
 | ||
|           '';
 | ||
|         type = types.submodule ({
 | ||
|           options = {
 | ||
|             enable = mkOption {
 | ||
|               default = true;
 | ||
|               type = types.bool;
 | ||
|               description = "Enable internal http server.";
 | ||
|             }; # nslave.http.enable
 | ||
| 
 | ||
|             port = mkOption {
 | ||
|               default = 8898;
 | ||
|               type = types.int;
 | ||
|               description = "Port to listen to when serving files from cache.";
 | ||
|             }; # nslave.http.port
 | ||
| 
 | ||
|             address = mkOption {
 | ||
|               default = "127.0.0.1";
 | ||
|               type = types.str;
 | ||
|               description = "Specify network interface to listen on.";
 | ||
|             }; # nslave.http.address
 | ||
| 
 | ||
|             url = mkOption {
 | ||
|               default = "http://localhost:${toString cfg.nslave.http.port}/cache";
 | ||
|               type = types.str;
 | ||
|               description = ''
 | ||
|                 Specify URL for accessing generated files from cache.
 | ||
|                 The Collection extension of Mediawiki won't be able to
 | ||
|                 download files without it.
 | ||
|                 '';
 | ||
|             }; # nslave.http.url
 | ||
|           };
 | ||
|         }); # types.submodule
 | ||
|       }; # nslave.http
 | ||
| 
 | ||
|       inherit user;
 | ||
|     }; # nslave
 | ||
| 
 | ||
|   }; # options.services
 | ||
| 
 | ||
|   config = {
 | ||
| 
 | ||
|     systemd.services.mwlib-nserve = mkIf cfg.nserve.enable
 | ||
|     {
 | ||
|       description = "mwlib network interface";
 | ||
| 
 | ||
|       wantedBy = [ "multi-user.target" ];
 | ||
|       after = [ "network.target" "mwlib-qserve.service" ];
 | ||
| 
 | ||
|       serviceConfig = {
 | ||
|         ExecStart = concatStringsSep " " (
 | ||
|           [
 | ||
|             "${mwlib}/bin/nserve"
 | ||
|             "--port ${toString cfg.nserve.port}"
 | ||
|             "--interface ${cfg.nserve.address}"
 | ||
|           ] ++ cfg.nserve.qserve
 | ||
|         );
 | ||
|         User = cfg.nserve.user;
 | ||
|       };
 | ||
|     }; # systemd.services.mwlib-nserve
 | ||
| 
 | ||
|     systemd.services.mwlib-qserve = mkIf cfg.qserve.enable
 | ||
|     {
 | ||
|       description = "mwlib job queue server";
 | ||
| 
 | ||
|       wantedBy = [ "multi-user.target" ];
 | ||
| 
 | ||
|       preStart = ''
 | ||
|         mkdir -pv '${cfg.qserve.datadir}'
 | ||
|         chown -Rc ${cfg.qserve.user}:`id -ng ${cfg.qserve.user}` '${cfg.qserve.datadir}'
 | ||
|         chmod -Rc u=rwX,go= '${cfg.qserve.datadir}'
 | ||
|       '';
 | ||
| 
 | ||
|       serviceConfig = {
 | ||
|         ExecStart = concatStringsSep " " (
 | ||
|           [
 | ||
|             "${mwlib}/bin/mw-qserve"
 | ||
|             "-p ${toString cfg.qserve.port}"
 | ||
|             "-i ${cfg.qserve.address}"
 | ||
|             "-d ${cfg.qserve.datadir}"
 | ||
|           ] ++ map (a: "-a ${a}") cfg.qserve.allow
 | ||
|         );
 | ||
|         User = cfg.qserve.user;
 | ||
|         PermissionsStartOnly = true;
 | ||
|       };
 | ||
|     }; # systemd.services.mwlib-qserve
 | ||
| 
 | ||
|     systemd.services.mwlib-nslave = mkIf cfg.nslave.enable
 | ||
|     {
 | ||
|       description = "mwlib worker";
 | ||
| 
 | ||
|       wantedBy = [ "multi-user.target" ];
 | ||
|       after = [ "network.target" ];
 | ||
| 
 | ||
|       preStart = ''
 | ||
|         mkdir -pv '${cfg.nslave.cachedir}'
 | ||
|         chown -Rc ${cfg.nslave.user}:`id -ng ${cfg.nslave.user}` '${cfg.nslave.cachedir}'
 | ||
|         chmod -Rc u=rwX,go= '${cfg.nslave.cachedir}'
 | ||
|       '';
 | ||
| 
 | ||
|       path = with pkgs; [ imagemagick pdftk ];
 | ||
|       environment = {
 | ||
|         PYTHONPATH = concatMapStringsSep ":"
 | ||
|           (m: "${pypkgs.${m}}/lib/${python.libPrefix}/site-packages")
 | ||
|           [ "mwlib-rl" "mwlib-ext" "pygments" "pyfribidi" ];
 | ||
|       };
 | ||
| 
 | ||
|       serviceConfig = {
 | ||
|         ExecStart = concatStringsSep " " (
 | ||
|           [
 | ||
|             "${mwlib}/bin/nslave"
 | ||
|             "--cachedir ${cfg.nslave.cachedir}"
 | ||
|             "--numprocs ${toString cfg.nslave.numprocs}"
 | ||
|             "--url ${cfg.nslave.http.url}"
 | ||
|           ] ++ (
 | ||
|             if cfg.nslave.http.enable then
 | ||
|             [
 | ||
|               "--serve-files-port ${toString cfg.nslave.http.port}"
 | ||
|               "--serve-files-address ${cfg.nslave.http.address}"
 | ||
|             ] else
 | ||
|             [
 | ||
|               "--no-serve-files"
 | ||
|             ]
 | ||
|           ));
 | ||
|         User = cfg.nslave.user;
 | ||
|         PermissionsStartOnly = true;
 | ||
|       };
 | ||
|     }; # systemd.services.mwlib-nslave
 | ||
| 
 | ||
|   }; # config
 | ||
| }
 |