From 70359744ca07ddc8561af7ecce90c62ec19aa2b2 Mon Sep 17 00:00:00 2001 From: Parthiv Seetharaman Date: Mon, 3 Jan 2022 14:34:38 -0800 Subject: [PATCH 1/3] python3Packages.seafobj: init at unstable-2021-07-08 --- .../python-modules/seafobj/default.nix | 30 +++++++++++++++++++ .../python-modules/seafobj/setuptools.patch | 24 +++++++++++++++ pkgs/top-level/python-packages.nix | 2 ++ 3 files changed, 56 insertions(+) create mode 100644 pkgs/development/python-modules/seafobj/default.nix create mode 100644 pkgs/development/python-modules/seafobj/setuptools.patch diff --git a/pkgs/development/python-modules/seafobj/default.nix b/pkgs/development/python-modules/seafobj/default.nix new file mode 100644 index 00000000000000..e900ef7883deca --- /dev/null +++ b/pkgs/development/python-modules/seafobj/default.nix @@ -0,0 +1,30 @@ +{ lib +, fetchFromGitHub +, buildPythonPackage +}: + +buildPythonPackage rec { + pname = "seafobj"; + version = "unstable-2021-07-08"; + + src = fetchFromGitHub { + owner = "haiwen"; + repo = "seafobj"; + rev = "df13a98e7e32c926083ca60bb7fb1bbc4dfcdbd0"; + sha256 = "0jwgbx083mwwh18x7450igq748bbld9s7zgibwv1cxwrrny1aari"; + }; + + patches = [ + ./setuptools.patch + ]; + + doCheck = false; # disabled because it requires a ccnet environment + + meta = with lib; { + homepage = "https://github.com/haiwen/seafobj"; + description = "Python library for accessing seafile data model"; + license = licenses.asl20; + platforms = platforms.linux; + maintainers = with maintainers; [ pacman99 ]; + }; +} diff --git a/pkgs/development/python-modules/seafobj/setuptools.patch b/pkgs/development/python-modules/seafobj/setuptools.patch new file mode 100644 index 00000000000000..2a4e8c9ff583f0 --- /dev/null +++ b/pkgs/development/python-modules/seafobj/setuptools.patch @@ -0,0 +1,24 @@ +diff --git a/setup.py b/setup.py +new file mode 100644 +index 0000000..898cbe7 +--- /dev/null ++++ b/setup.py +@@ -0,0 +1,18 @@ ++from setuptools import setup, find_packages ++ ++__version__ = '7.0.0' ++ ++ ++setup(name='seafobj', ++ version=__version__, ++ license='ASL2', ++ description='python library for accessing seafile data model', ++ author='Shuai Lin', ++ author_email='linshuai2012@gmail.com', ++ url='http://seafile.com', ++ platforms=['Any'], ++ packages=find_packages(exclude=["test.*", "test"]), ++ classifiers=['Development Status :: 4 - Beta', ++ 'License :: OSI Approved :: Apache Software License', ++ 'Operating System :: OS Independent', ++ 'Programming Language :: Python']) diff --git a/pkgs/top-level/python-packages.nix b/pkgs/top-level/python-packages.nix index cf500972540dba..05be3ea5165623 100644 --- a/pkgs/top-level/python-packages.nix +++ b/pkgs/top-level/python-packages.nix @@ -8863,6 +8863,8 @@ in { seabreeze = callPackage ../development/python-modules/seabreeze { }; + seafobj = callPackage ../development/python-modules/seafobj { }; + seaserv = toPythonModule (pkgs.seafile-server.override { python3 = self.python; }); From 929f49904548467dee4cf775dd24c3d9b04300c0 Mon Sep 17 00:00:00 2001 From: Parthiv Seetharaman Date: Mon, 3 Jan 2022 14:36:22 -0800 Subject: [PATCH 2/3] seafdav: init at unstable-2021-05-09 --- pkgs/servers/seafdav/default.nix | 40 ++++++++++++++++++++++++++++++++ pkgs/top-level/all-packages.nix | 2 ++ 2 files changed, 42 insertions(+) create mode 100644 pkgs/servers/seafdav/default.nix diff --git a/pkgs/servers/seafdav/default.nix b/pkgs/servers/seafdav/default.nix new file mode 100644 index 00000000000000..393dad7d5537aa --- /dev/null +++ b/pkgs/servers/seafdav/default.nix @@ -0,0 +1,40 @@ +{ lib, fetchFromGitHub, python3 }: + +python3.pkgs.buildPythonApplication rec { + pname = "seafdav"; + version = "unstable-2021-05-09"; + + src = fetchFromGitHub { + owner = "haiwen"; + repo = "seafdav"; + rev = "0f178088879a8d03c22d9a6b55e7e7ddc39a0c0c"; # using a fixed revision because upstream may re-tag releases :/ + sha256 = "1gpvmfamjbw90gh9njgmba58qnzxji1w1sra46spnhi9k778mds3"; + }; + + doCheck = false; # disabled because it requires a ccnet environment + + + propagatedBuildInputs = with python3.pkgs; [ + seaserv + seafobj + defusedxml + pysearpc + future + gunicorn + jinja2 + json5 + python-pam + pyyaml + six + lxml + sqlalchemy + ]; + + meta = with lib; { + homepage = "https://github.com/haiwen/seafdav"; + description = "WebDAV server for seafile"; + license = licenses.mit; + platforms = platforms.linux; + maintainers = with maintainers; [ pacman99 ]; + }; +} diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index 8434166c2935b4..c97323e77e3a6d 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -33709,6 +33709,8 @@ with pkgs; seafile-shared = callPackage ../misc/seafile-shared { }; + seafdav = callPackage ../servers/seafdav { }; + ser2net = callPackage ../servers/ser2net {}; serviio = callPackage ../servers/serviio {}; From aee3050e6a21ce5bc9776f8be037ed1ab9edef5f Mon Sep 17 00:00:00 2001 From: Parthiv Seetharaman Date: Mon, 3 Jan 2022 14:37:06 -0800 Subject: [PATCH 3/3] nixos/seafile: add optional seafdav service --- nixos/modules/services/networking/seafile.nix | 67 +++++++++++++++++++ nixos/tests/seafile.nix | 9 +++ 2 files changed, 76 insertions(+) diff --git a/nixos/modules/services/networking/seafile.nix b/nixos/modules/services/networking/seafile.nix index 2839ffb60a1fd9..1bfce315095d93 100644 --- a/nixos/modules/services/networking/seafile.nix +++ b/nixos/modules/services/networking/seafile.nix @@ -8,6 +8,10 @@ let seafileConf = settingsFormat.generate "seafile.conf" cfg.seafileSettings; + seafdavConf = settingsFormat.generate "seafdav.conf" { + WEBDAV = cfg.seafdavSettings; + }; + seahubSettings = pkgs.writeText "seahub_settings.py" '' FILE_SERVER_ROOT = '${cfg.ccnetSettings.General.SERVICE_URL}/seafhttp' DATABASES = { @@ -93,6 +97,37 @@ in { ''; }; + seafdavSettings = mkOption { + type = types.submodule { + freeformType = settingsFormat.type; + + options = { + enabled = mkEnableOption "seafdav server to access seafile through webdav"; + port = mkOption { + type = types.port; + default = 6001; + description = '' + The tcp port used by seafdav. + ''; + }; + share_name = mkOption { + type = types.str; + default = "/"; + description = '' + The location of the seafile webdav share. + This could be set to the location of a reverse proxy for seafdav. + ''; + }; + }; + }; + default = { }; + description = '' + Configuration for seafdav set under the WEBDAV section, see + + for supported values. + ''; + }; + workers = mkOption { type = types.int; default = 4; @@ -282,6 +317,38 @@ in { fi ''; }; + + seafdav = mkIf cfg.seafdavSettings.enabled { + description = "seafdav Server for WebDAV access to seafile"; + wantedBy = [ "seafile.target" ]; + partOf = [ "seafile.target" ]; + after = [ "network.target" "seaf-server.service" ]; + requires = [ "seaf-server" ]; + restartTriggers = [ seafdavConf ]; + environment = { + PYTHONPATH = "/etc/seafile"; # seafdav imports seahub_settings.py + SEAFDAV_CONF = seafdavConf; + CCNET_CONF_DIR = ccnetDir; + SEAFILE_CONF_DIR = dataDir; + SEAFILE_CENTRAL_CONF_DIR = "/etc/seafile"; + SEAFILE_RPC_PIPE_PATH = "/run/seafile"; + }; + serviceConfig = securityOptions // { + User = "seafile"; + Group = "seafile"; + DynamicUser = true; + RuntimeDirectory = "seafile"; + StateDirectory = "seafile"; + LogsDirectory = "seafile"; + ExecStart = '' + ${pkgs.seafdav}/bin/wsgidav \ + --root=/ \ + --server=gunicorn \ + --log-file=/var/log/seafile/seafdav.log \ + --port=${toString cfg.seafdavSettings.port} + ''; + }; + }; }; }; } diff --git a/nixos/tests/seafile.nix b/nixos/tests/seafile.nix index 6eec8b1fbe55c8..b23e85af3b0cd4 100644 --- a/nixos/tests/seafile.nix +++ b/nixos/tests/seafile.nix @@ -16,11 +16,16 @@ import ./make-test-python.nix ({ pkgs, ... }: ccnetSettings.General.SERVICE_URL = "http://server"; adminEmail = "admin@example.com"; initialAdminPassword = "seafile_password"; + seafdavSettings = { + enabled = true; + share_name = "/seafdav"; + }; }; services.nginx = { enable = true; virtualHosts."server" = { locations."/".proxyPass = "http://unix:/run/seahub/gunicorn.sock"; + locations."/seafdav".proxyPass = "http://127.0.0.1:6001"; locations."/seafhttp" = { proxyPass = "http://127.0.0.1:8082"; extraConfig = '' @@ -50,6 +55,7 @@ import ./make-test-python.nix ({ pkgs, ... }: with subtest("start seahub"): server.wait_for_unit("seahub.service") + server.wait_for_unit("seafdav.service") server.wait_for_unit("nginx.service") server.wait_for_file("/run/seahub/gunicorn.sock") @@ -117,5 +123,8 @@ import ./make-test-python.nix ({ pkgs, ... }: client2.succeed("ls -la test01 >&2") client2.succeed('[ `cat test01/first_file` = "bla" ]') + + with subtest("seafdav query"): + client1.succeed("curl --anyauth --user 'admin@example.com:seafile_password' http://server/seafdav | grep 'Authenticated user' >&2") ''; })