zope2 service (plone)

wip/yesman
Rok Garbas 11 years ago
parent 17f519e590
commit 81d28e744c
  1. 1
      modules/misc/ids.nix
  2. 1
      modules/module-list.nix
  3. 241
      modules/services/web-servers/zope2.nix

@ -100,6 +100,7 @@
minidlna = 91;
elasticsearch = 92;
tcpcryptd = 93; # tcpcryptd uses a hard-coded uid. We patch it in Nixpkgs to match this choice.
zope2 = 94;
# When adding a uid, make sure it doesn't match an existing gid.

@ -213,6 +213,7 @@
./services/web-servers/nginx/default.nix
./services/web-servers/tomcat.nix
./services/web-servers/varnish/default.nix
./services/web-servers/zope2.nix
./services/x11/desktop-managers/default.nix
./services/x11/display-managers/auto.nix
./services/x11/display-managers/default.nix

@ -0,0 +1,241 @@
{ pkgs, config, ... }:
with pkgs.lib;
let
cfg = config.services.zope2;
zope2Opts = { name, config, ... }: {
options = {
name = mkOption {
default = "${name}";
type = types.string;
description = "The name of the zope2 instance. If undefined, the name of the attribute set will be used.";
};
threads = mkOption {
default = 2;
type = types.int;
description = "Specify the number of threads that Zope's ZServer web server will use to service requests. ";
};
http_address = mkOption {
default = "localhost:8080";
type = types.string;
description = "Give a port and adress for the HTTP server.";
};
user = mkOption {
default = "zope2";
type = types.string;
description = "The name of the effective user for the Zope process.";
};
extra = mkOption {
default =
''
<zodb_db main>
mount-point /
cache-size 30000
<blobstorage>
blob-dir /var/lib/zope2/${name}/blobstorage
<filestorage>
path /var/lib/zope2/${name}/filestorage/Data.fs
</filestorage>
</blobstorage>
</zodb_db>
'';
type = types.string;
description = "Extra zope.conf";
};
packages = mkOption {
type = types.listOf types.package;
description = "The list of packages you want to make available to the zope2 instance.";
};
};
};
in
{
###### interface
options = {
services.zope2.instances = mkOption {
default = {};
type = types.loaOf types.optionSet;
example = {
plone01 = {
http_address = "127.0.0.1:8080";
extra =
''
<zodb_db main>
mount-point /
cache-size 30000
<blobstorage>
blob-dir /var/lib/zope2/plone01/blobstorage
<filestorage>
path /var/lib/zope2/plone01/filestorage/Data.fs
</filestorage>
</blobstorage>
</zodb_db>
'';
};
};
description = "zope2 instances to be created automaticaly by the system.";
options = [ zope2Opts ];
};
};
###### implementation
config = mkIf (cfg.instances != {}) {
users.extraUsers.zope2.uid = config.ids.uids.zope2;
systemd.services =
let
createZope2Instance = opts: name:
let
interpreter = pkgs.writeScript "interpreter"
''
import sys
_interactive = True
if len(sys.argv) > 1:
_options, _args = __import__("getopt").getopt(sys.argv[1:], 'ic:m:')
_interactive = False
for (_opt, _val) in _options:
if _opt == '-i':
_interactive = True
elif _opt == '-c':
exec _val
elif _opt == '-m':
sys.argv[1:] = _args
_args = []
__import__("runpy").run_module(
_val, {}, "__main__", alter_sys=True)
if _args:
sys.argv[:] = _args
__file__ = _args[0]
del _options, _args
execfile(__file__)
if _interactive:
del _interactive
__import__("code").interact(banner="", local=globals())
'';
env = pkgs.buildEnv {
name = "zope2-${name}-env";
paths = [ pyenv pkgs.gnumake ];
postBuild =
''
echo "#!$out/bin/python" > $out/bin/interpreter
cat ${interpreter} >> $out/bin/interpreter
'';
};
pyenv = pkgs.buildEnv {
name = "zope2-${name}-pyenv";
paths = [
pkgs.python27
pkgs.python27Packages.recursivePthLoader
pkgs.python27Packages."plone.recipe.zope2instance"
] ++ attrValues pkgs.python27.modules
++ opts.packages;
};
conf = pkgs.writeText "zope2-${name}-conf"
''%define INSTANCEHOME ${env}
instancehome $INSTANCEHOME
%define CLIENTHOME /var/lib/zope2/${name}
clienthome $CLIENTHOME
debug-mode off
security-policy-implementation C
verbose-security off
default-zpublisher-encoding utf-8
zserver-threads ${toString opts.threads}
effective-user ${opts.user}
pid-filename /var/run/zope2-${name}.pid
lock-filename /var/lock/zope2-${name}.lock
python-check-interval 1000
enable-product-installation off
<environment>
zope_i18n_compile_mo_files false
</environment>
<eventlog>
level INFO
<logfile>
path /var/log/zope2/${name}.log
level INFO
</logfile>
</eventlog>
<logger access>
level WARN
<logfile>
path /var/log/zope2/${name}-Z2.log
format %(message)s
</logfile>
</logger>
<http-server>
address ${opts.http_address}
</http-server>
<zodb_db temporary>
<temporarystorage>
name temporary storage for sessioning
</temporarystorage>
mount-point /temp_folder
container-class Products.TemporaryFolder.TemporaryContainer
</zodb_db>
${opts.extra}
'';
ctl = pkgs.writeScript "zope2-${name}-ctl"
''#!${env}/bin/python
import sys
import plone.recipe.zope2instance.ctl
if __name__ == '__main__':
sys.exit(plone.recipe.zope2instance.ctl.main(
["-C", "${conf}"]
+ sys.argv[1:]))'';
in {
description = "zope2 ${name} instance";
after = [ "network.target" ]; # with RelStorage also add "postgresql.service"
wantedBy = [ "multi-user.target" ];
path = opts.packages;
preStart =
''
mkdir -p /var/log/zope2/
mkdir -p /var/lib/zope2/${name}/filestorage /var/lib/zope2/${name}/blobstorage
chown ${opts.user} /var/lib/zope2/${name} -R
${ctl} adduser admin admin
'';
serviceConfig.Type = "forking";
serviceConfig.ExecStart = "${ctl} start";
serviceConfig.ExecStop = "${ctl} stop";
serviceConfig.ExecReload = "${ctl} restart";
};
in listToAttrs (map (name: { name = "zope2-${name}"; value = createZope2Instance (builtins.getAttr name cfg.instances) name; }) (builtins.attrNames cfg.instances));
};
}
Loading…
Cancel
Save