Loading nixos/modules/services/web-apps/powerdns-admin.nix +2 −1 Original line number Diff line number Diff line Loading @@ -78,7 +78,8 @@ in environment.PYTHONPATH = pkgs.powerdns-admin.pythonPath; serviceConfig = { ExecStart = "${pkgs.powerdns-admin}/bin/powerdns-admin --pid /run/powerdns-admin/pid ${escapeShellArgs cfg.extraArgs}"; ExecStartPre = "${pkgs.coreutils}/bin/env FLASK_APP=${pkgs.powerdns-admin}/share/powerdnsadmin/__init__.py ${pkgs.python3Packages.flask}/bin/flask db upgrade -d ${pkgs.powerdns-admin}/share/migrations"; # Set environment variables only for starting flask database upgrade ExecStartPre = "${pkgs.coreutils}/bin/env FLASK_APP=${pkgs.powerdns-admin}/share/powerdnsadmin/__init__.py SESSION_TYPE= ${pkgs.python3Packages.flask}/bin/flask db upgrade -d ${pkgs.powerdns-admin}/share/migrations"; ExecReload = "${pkgs.coreutils}/bin/kill -HUP $MAINPID"; ExecStop = "${pkgs.coreutils}/bin/kill -TERM $MAINPID"; PIDFile = "/run/powerdns-admin/pid"; Loading nixos/tests/powerdns-admin.nix +24 −0 Original line number Diff line number Diff line Loading @@ -10,6 +10,7 @@ let defaultConfig = '' BIND_ADDRESS = '127.0.0.1' PORT = 8000 CAPTCHA_ENABLE = False ''; makeAppTest = name: configs: makeTest { Loading Loading @@ -98,7 +99,30 @@ let tcp = { services.powerdns-admin.extraArgs = [ "-b" "127.0.0.1:8000" ]; system.build.testScript = '' set -euxo pipefail curl -sSf http://127.0.0.1:8000/ # Create account to check that the database migrations ran csrf_token="$(curl -sSfc session http://127.0.0.1:8000/register | grep _csrf_token | cut -d\" -f6)" # Outputs 'Redirecting' if successful curl -sSfb session http://127.0.0.1:8000/register \ -F "_csrf_token=$csrf_token" \ -F "firstname=first" \ -F "lastname=last" \ -F "email=a@example.com" \ -F "username=user" \ -F "password=password" \ -F "rpassword=password" | grep Redirecting # Login # Outputs 'Redirecting' if successful curl -sSfb session http://127.0.0.1:8000/login \ -F "_csrf_token=$csrf_token" \ -F "username=user" \ -F "password=password" | grep Redirecting # Check that we are logged in, this redirects to /admin/setting/pdns if we are curl -sSfb session http://127.0.0.1:8000/dashboard/ | grep /admin/setting ''; }; unix = { Loading pkgs/applications/networking/powerdns-admin/default.nix +27 −19 Original line number Diff line number Diff line { lib, stdenv, fetchFromGitHub, mkYarnPackage, nixosTests, writeText, python3 }: let version = "0.3.0"; version = "0.4.1"; src = fetchFromGitHub { owner = "ngoduykhanh"; owner = "PowerDNS-Admin"; repo = "PowerDNS-Admin"; rev = "v${version}"; hash = "sha256-e11u0jdJr+2TDXvBAPlDfnuuDwSfBq+JtvnDUTNKp/c="; hash = "sha256-AwqEcAPD1SF1Ma3wtH03mXlTywM0Q19hciCmTtlr3gk="; }; python = python3; pythonDeps = with python.pkgs; [ flask flask_assets flask-login flask-sqlalchemy flask_migrate flask-seasurf flask_mail flask-session flask-sslify flask flask_assets flask-login flask-sqlalchemy flask_migrate flask-seasurf flask_mail flask-session flask-session-captcha flask-sslify mysqlclient psycopg2 sqlalchemy cffi configobj cryptography bcrypt requests python-ldap pyotp qrcode dnspython gunicorn python3-saml pytz cssmin rjsmin authlib bravado-core lima pytimeparse pyyaml jinja2 itsdangerous werkzeug certifi cffi configobj cryptography bcrypt requests python-ldap pyotp qrcode dnspython gunicorn itsdangerous python3-saml pytz rcssmin rjsmin authlib bravado-core lima lxml passlib pyasn1 pytimeparse pyyaml jinja2 itsdangerous webcolors werkzeug zipp zxcvbn ]; assets = mkYarnPackage { inherit src version; packageJSON = ./package.json; yarnNix = ./yarndeps.nix; # Copied from package.json, see also # https://github.com/NixOS/nixpkgs/pull/214952 packageResolutions = { "@fortawesome/fontawesome-free" = "6.3.0"; }; nativeBuildInputs = pythonDeps; patchPhase = '' sed -i -r -e "s|'cssmin',\s?'cssrewrite'|'cssmin'|g" powerdnsadmin/assets.py sed -i -r -e "s|'rcssmin',\s?'cssrewrite'|'rcssmin'|g" powerdnsadmin/assets.py ''; buildPhase = '' # The build process expects the directory to be writable # with node_modules at a specific path # https://github.com/ngoduykhanh/PowerDNS-Admin/blob/master/.yarnrc # https://github.com/PowerDNS-Admin/PowerDNS-Admin/blob/master/.yarnrc approot=deps/powerdns-admin-assets ln -s $node_modules $approot/powerdnsadmin/static/node_modules FLASK_APP=$approot/powerdnsadmin/__init__.py flask assets build SESSION_TYPE=filesystem FLASK_APP=$approot/powerdnsadmin/__init__.py flask assets build ''; installPhase = '' # https://github.com/ngoduykhanh/PowerDNS-Admin/blob/54b257768f600c5548a1c7e50eac49c40df49f92/docker/Dockerfile#L43 # https://github.com/PowerDNS-Admin/PowerDNS-Admin/blob/54b257768f600c5548a1c7e50eac49c40df49f92/docker/Dockerfile#L43 mkdir $out cp -r $approot/powerdnsadmin/static/{generated,assets,img} $out find $node_modules -name webfonts -exec cp -r {} $out \; find $node_modules -name fonts -exec cp -r {} $out \; find $node_modules/icheck/skins/square -name '*.png' -exec cp {} $out/generated \; mkdir $out/fonts cp $node_modules/ionicons/dist/fonts/* $out/fonts cp $node_modules/bootstrap/dist/fonts/* $out/fonts cp $node_modules/font-awesome/fonts/* $out/fonts ''; distPhase = "true"; }; Loading @@ -61,7 +63,7 @@ let assets.register('js_main', 'generated/main.js') assets.register('css_main', 'generated/main.css') ''; in stdenv.mkDerivation rec { in stdenv.mkDerivation { pname = "powerdns-admin"; inherit src version; Loading @@ -81,7 +83,13 @@ in stdenv.mkDerivation rec { postPatch = '' rm -r powerdnsadmin/static powerdnsadmin/assets.py sed -i "s/id:/'id':/" migrations/versions/787bdba9e147_init_db.py # flask-migrate 4.0 compatibility: https://github.com/PowerDNS-Admin/PowerDNS-Admin/issues/1376 substituteInPlace migrations/env.py --replace "render_as_batch=config.get_main_option('sqlalchemy.url').startswith('sqlite:')," "" # flask-session and powerdns-admin both try to add sqlalchemy to flask. # Reuse the database for flask-session substituteInPlace powerdnsadmin/__init__.py --replace "sess = Session(app)" "app.config['SESSION_SQLALCHEMY'] = models.base.db; sess = Session(app)" # Routes creates session database tables, so it needs a context substituteInPlace powerdnsadmin/__init__.py --replace "routes.init_app(app)" "with app.app_context(): routes.init_app(app)" ''; installPhase = '' Loading Loading @@ -113,7 +121,7 @@ in stdenv.mkDerivation rec { meta = with lib; { description = "A PowerDNS web interface with advanced features"; homepage = "https://github.com/ngoduykhanh/PowerDNS-Admin"; homepage = "https://github.com/PowerDNS-Admin/PowerDNS-Admin"; license = licenses.mit; maintainers = with maintainers; [ Flakebi zhaofengli ]; }; Loading pkgs/applications/networking/powerdns-admin/package.json +14 −7 Original line number Diff line number Diff line { "dependencies": { "admin-lte": "2.4.9", "bootstrap": "^3.4.1", "bootstrap-datepicker": "^1.8.0", "@fortawesome/fontawesome-free": "6.3.0", "admin-lte": "3.2.0", "bootstrap": "4.6.2", "bootstrap-datepicker": "^1.9.0", "bootstrap-validator": "^0.11.9", "datatables.net-plugins": "^1.10.19", "datatables.net-plugins": "^1.13.1", "icheck": "^1.0.2", "jquery-slimscroll": "^1.3.8", "jquery-ui-dist": "^1.12.1", "jquery-sparkline": "^2.4.0", "jquery-ui-dist": "^1.13.2", "jquery.quicksearch": "^2.4.0", "jtimeout": "^3.1.0", "jquery-validation": "^1.19.5", "jtimeout": "^3.2.0", "knockout": "^3.5.1", "multiselect": "^0.9.12" }, "resolutions": { "admin-lte/@fortawesome/fontawesome-free": "6.3.0" }, "name": "powerdns-admin-assets", "version": "0.3.0" "version": "0.4.1" } pkgs/applications/networking/powerdns-admin/yarndeps.nix +970 −690 File changed.Preview size limit exceeded, changes collapsed. Show changes Loading
nixos/modules/services/web-apps/powerdns-admin.nix +2 −1 Original line number Diff line number Diff line Loading @@ -78,7 +78,8 @@ in environment.PYTHONPATH = pkgs.powerdns-admin.pythonPath; serviceConfig = { ExecStart = "${pkgs.powerdns-admin}/bin/powerdns-admin --pid /run/powerdns-admin/pid ${escapeShellArgs cfg.extraArgs}"; ExecStartPre = "${pkgs.coreutils}/bin/env FLASK_APP=${pkgs.powerdns-admin}/share/powerdnsadmin/__init__.py ${pkgs.python3Packages.flask}/bin/flask db upgrade -d ${pkgs.powerdns-admin}/share/migrations"; # Set environment variables only for starting flask database upgrade ExecStartPre = "${pkgs.coreutils}/bin/env FLASK_APP=${pkgs.powerdns-admin}/share/powerdnsadmin/__init__.py SESSION_TYPE= ${pkgs.python3Packages.flask}/bin/flask db upgrade -d ${pkgs.powerdns-admin}/share/migrations"; ExecReload = "${pkgs.coreutils}/bin/kill -HUP $MAINPID"; ExecStop = "${pkgs.coreutils}/bin/kill -TERM $MAINPID"; PIDFile = "/run/powerdns-admin/pid"; Loading
nixos/tests/powerdns-admin.nix +24 −0 Original line number Diff line number Diff line Loading @@ -10,6 +10,7 @@ let defaultConfig = '' BIND_ADDRESS = '127.0.0.1' PORT = 8000 CAPTCHA_ENABLE = False ''; makeAppTest = name: configs: makeTest { Loading Loading @@ -98,7 +99,30 @@ let tcp = { services.powerdns-admin.extraArgs = [ "-b" "127.0.0.1:8000" ]; system.build.testScript = '' set -euxo pipefail curl -sSf http://127.0.0.1:8000/ # Create account to check that the database migrations ran csrf_token="$(curl -sSfc session http://127.0.0.1:8000/register | grep _csrf_token | cut -d\" -f6)" # Outputs 'Redirecting' if successful curl -sSfb session http://127.0.0.1:8000/register \ -F "_csrf_token=$csrf_token" \ -F "firstname=first" \ -F "lastname=last" \ -F "email=a@example.com" \ -F "username=user" \ -F "password=password" \ -F "rpassword=password" | grep Redirecting # Login # Outputs 'Redirecting' if successful curl -sSfb session http://127.0.0.1:8000/login \ -F "_csrf_token=$csrf_token" \ -F "username=user" \ -F "password=password" | grep Redirecting # Check that we are logged in, this redirects to /admin/setting/pdns if we are curl -sSfb session http://127.0.0.1:8000/dashboard/ | grep /admin/setting ''; }; unix = { Loading
pkgs/applications/networking/powerdns-admin/default.nix +27 −19 Original line number Diff line number Diff line { lib, stdenv, fetchFromGitHub, mkYarnPackage, nixosTests, writeText, python3 }: let version = "0.3.0"; version = "0.4.1"; src = fetchFromGitHub { owner = "ngoduykhanh"; owner = "PowerDNS-Admin"; repo = "PowerDNS-Admin"; rev = "v${version}"; hash = "sha256-e11u0jdJr+2TDXvBAPlDfnuuDwSfBq+JtvnDUTNKp/c="; hash = "sha256-AwqEcAPD1SF1Ma3wtH03mXlTywM0Q19hciCmTtlr3gk="; }; python = python3; pythonDeps = with python.pkgs; [ flask flask_assets flask-login flask-sqlalchemy flask_migrate flask-seasurf flask_mail flask-session flask-sslify flask flask_assets flask-login flask-sqlalchemy flask_migrate flask-seasurf flask_mail flask-session flask-session-captcha flask-sslify mysqlclient psycopg2 sqlalchemy cffi configobj cryptography bcrypt requests python-ldap pyotp qrcode dnspython gunicorn python3-saml pytz cssmin rjsmin authlib bravado-core lima pytimeparse pyyaml jinja2 itsdangerous werkzeug certifi cffi configobj cryptography bcrypt requests python-ldap pyotp qrcode dnspython gunicorn itsdangerous python3-saml pytz rcssmin rjsmin authlib bravado-core lima lxml passlib pyasn1 pytimeparse pyyaml jinja2 itsdangerous webcolors werkzeug zipp zxcvbn ]; assets = mkYarnPackage { inherit src version; packageJSON = ./package.json; yarnNix = ./yarndeps.nix; # Copied from package.json, see also # https://github.com/NixOS/nixpkgs/pull/214952 packageResolutions = { "@fortawesome/fontawesome-free" = "6.3.0"; }; nativeBuildInputs = pythonDeps; patchPhase = '' sed -i -r -e "s|'cssmin',\s?'cssrewrite'|'cssmin'|g" powerdnsadmin/assets.py sed -i -r -e "s|'rcssmin',\s?'cssrewrite'|'rcssmin'|g" powerdnsadmin/assets.py ''; buildPhase = '' # The build process expects the directory to be writable # with node_modules at a specific path # https://github.com/ngoduykhanh/PowerDNS-Admin/blob/master/.yarnrc # https://github.com/PowerDNS-Admin/PowerDNS-Admin/blob/master/.yarnrc approot=deps/powerdns-admin-assets ln -s $node_modules $approot/powerdnsadmin/static/node_modules FLASK_APP=$approot/powerdnsadmin/__init__.py flask assets build SESSION_TYPE=filesystem FLASK_APP=$approot/powerdnsadmin/__init__.py flask assets build ''; installPhase = '' # https://github.com/ngoduykhanh/PowerDNS-Admin/blob/54b257768f600c5548a1c7e50eac49c40df49f92/docker/Dockerfile#L43 # https://github.com/PowerDNS-Admin/PowerDNS-Admin/blob/54b257768f600c5548a1c7e50eac49c40df49f92/docker/Dockerfile#L43 mkdir $out cp -r $approot/powerdnsadmin/static/{generated,assets,img} $out find $node_modules -name webfonts -exec cp -r {} $out \; find $node_modules -name fonts -exec cp -r {} $out \; find $node_modules/icheck/skins/square -name '*.png' -exec cp {} $out/generated \; mkdir $out/fonts cp $node_modules/ionicons/dist/fonts/* $out/fonts cp $node_modules/bootstrap/dist/fonts/* $out/fonts cp $node_modules/font-awesome/fonts/* $out/fonts ''; distPhase = "true"; }; Loading @@ -61,7 +63,7 @@ let assets.register('js_main', 'generated/main.js') assets.register('css_main', 'generated/main.css') ''; in stdenv.mkDerivation rec { in stdenv.mkDerivation { pname = "powerdns-admin"; inherit src version; Loading @@ -81,7 +83,13 @@ in stdenv.mkDerivation rec { postPatch = '' rm -r powerdnsadmin/static powerdnsadmin/assets.py sed -i "s/id:/'id':/" migrations/versions/787bdba9e147_init_db.py # flask-migrate 4.0 compatibility: https://github.com/PowerDNS-Admin/PowerDNS-Admin/issues/1376 substituteInPlace migrations/env.py --replace "render_as_batch=config.get_main_option('sqlalchemy.url').startswith('sqlite:')," "" # flask-session and powerdns-admin both try to add sqlalchemy to flask. # Reuse the database for flask-session substituteInPlace powerdnsadmin/__init__.py --replace "sess = Session(app)" "app.config['SESSION_SQLALCHEMY'] = models.base.db; sess = Session(app)" # Routes creates session database tables, so it needs a context substituteInPlace powerdnsadmin/__init__.py --replace "routes.init_app(app)" "with app.app_context(): routes.init_app(app)" ''; installPhase = '' Loading Loading @@ -113,7 +121,7 @@ in stdenv.mkDerivation rec { meta = with lib; { description = "A PowerDNS web interface with advanced features"; homepage = "https://github.com/ngoduykhanh/PowerDNS-Admin"; homepage = "https://github.com/PowerDNS-Admin/PowerDNS-Admin"; license = licenses.mit; maintainers = with maintainers; [ Flakebi zhaofengli ]; }; Loading
pkgs/applications/networking/powerdns-admin/package.json +14 −7 Original line number Diff line number Diff line { "dependencies": { "admin-lte": "2.4.9", "bootstrap": "^3.4.1", "bootstrap-datepicker": "^1.8.0", "@fortawesome/fontawesome-free": "6.3.0", "admin-lte": "3.2.0", "bootstrap": "4.6.2", "bootstrap-datepicker": "^1.9.0", "bootstrap-validator": "^0.11.9", "datatables.net-plugins": "^1.10.19", "datatables.net-plugins": "^1.13.1", "icheck": "^1.0.2", "jquery-slimscroll": "^1.3.8", "jquery-ui-dist": "^1.12.1", "jquery-sparkline": "^2.4.0", "jquery-ui-dist": "^1.13.2", "jquery.quicksearch": "^2.4.0", "jtimeout": "^3.1.0", "jquery-validation": "^1.19.5", "jtimeout": "^3.2.0", "knockout": "^3.5.1", "multiselect": "^0.9.12" }, "resolutions": { "admin-lte/@fortawesome/fontawesome-free": "6.3.0" }, "name": "powerdns-admin-assets", "version": "0.3.0" "version": "0.4.1" }
pkgs/applications/networking/powerdns-admin/yarndeps.nix +970 −690 File changed.Preview size limit exceeded, changes collapsed. Show changes