From 0eebcc5740d533ddfd082f9b07aa4776d763a009 Mon Sep 17 00:00:00 2001 From: Evgeniy Alekseev Date: Fri, 1 Sep 2023 03:07:06 +0300 Subject: [PATCH] support of new schema in systemd units --- docs/ahriman.core.database.migrations.rst | 8 ++++ docs/ahriman.models.rst | 8 ++++ docs/faq.rst | 8 ++-- docs/setup.rst | 4 +- .../lib/systemd/system/ahriman-web@.service | 4 +- package/lib/systemd/system/ahriman@.service | 4 +- package/lib/systemd/system/ahriman@.timer | 2 +- .../bash-completion/completions/_ahriman | 20 +++++----- package/share/man/man1/ahriman.1 | 33 +++++++-------- package/share/zsh/site-functions/_ahriman | 15 ++----- src/ahriman/application/ahriman.py | 3 ++ src/ahriman/application/handlers/handler.py | 9 +++++ tests/ahriman/application/conftest.py | 3 +- .../application/handlers/test_handler.py | 40 +++++++++++++++---- 14 files changed, 101 insertions(+), 60 deletions(-) diff --git a/docs/ahriman.core.database.migrations.rst b/docs/ahriman.core.database.migrations.rst index a144ed6a..88a69538 100644 --- a/docs/ahriman.core.database.migrations.rst +++ b/docs/ahriman.core.database.migrations.rst @@ -92,6 +92,14 @@ ahriman.core.database.migrations.m010\_version\_based\_logs\_removal module :no-undoc-members: :show-inheritance: +ahriman.core.database.migrations.m011\_repository\_name module +-------------------------------------------------------------- + +.. automodule:: ahriman.core.database.migrations.m011_repository_name + :members: + :no-undoc-members: + :show-inheritance: + Module contents --------------- diff --git a/docs/ahriman.models.rst b/docs/ahriman.models.rst index 253e2e45..742fb4f3 100644 --- a/docs/ahriman.models.rst +++ b/docs/ahriman.models.rst @@ -164,6 +164,14 @@ ahriman.models.report\_settings module :no-undoc-members: :show-inheritance: +ahriman.models.repository\_id module +------------------------------------ + +.. automodule:: ahriman.models.repository_id + :members: + :no-undoc-members: + :show-inheritance: + ahriman.models.repository\_paths module --------------------------------------- diff --git a/docs/faq.rst b/docs/faq.rst index ab112223..8f24a952 100644 --- a/docs/faq.rst +++ b/docs/faq.rst @@ -18,7 +18,7 @@ TL;DR yay -S ahriman ahriman -a x86_64 -r aur-clone service-setup --packager "ahriman bot " - systemctl enable --now ahriman@x86_64.timer + systemctl enable --now ahriman@x86_64-aur-clone.timer Long answer """"""""""" @@ -1046,7 +1046,7 @@ How to setup web service port = 8080 #. - Start the web service ``systemctl enable --now ahriman-web@x86_64``. + Start the web service ``systemctl enable --now ahriman-web@x86_64-aur-clone``. How to enable basic authorization ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -1103,7 +1103,7 @@ How to enable basic authorization sudo -u ahriman ahriman user-add -r full my-first-user #. - Restart web service ``systemctl restart ahriman-web@x86_64``. + Restart web service ``systemctl restart ahriman-web@x86_64-aur-clone``. How to enable OAuth authorization ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -1149,7 +1149,7 @@ How to enable OAuth authorization When it will ask for the password leave it blank. #. - Restart web service ``systemctl restart ahriman-web@x86_64``. + Restart web service ``systemctl restart ahriman-web@x86_64-aur-clone``. How to implement own interface ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/docs/setup.rst b/docs/setup.rst index 410aa712..34227cbd 100644 --- a/docs/setup.rst +++ b/docs/setup.rst @@ -74,14 +74,14 @@ Initial setup .. code-block:: shell - systemctl enable --now ahriman@x86_64.timer + systemctl enable --now ahriman@x86_64-aur-clone.timer #. Start and enable status page: .. code-block:: shell - systemctl enable --now ahriman-web@x86_64 + systemctl enable --now ahriman-web@x86_64-aur-clone #. Add packages by using ``ahriman package-add {package}`` command: diff --git a/package/lib/systemd/system/ahriman-web@.service b/package/lib/systemd/system/ahriman-web@.service index f9c8c052..7b137599 100644 --- a/package/lib/systemd/system/ahriman-web@.service +++ b/package/lib/systemd/system/ahriman-web@.service @@ -1,10 +1,10 @@ [Unit] -Description=ArcH linux ReposItory MANager web server (%I architecture) +Description=ArcH linux ReposItory MANager web server (%i) After=network.target [Service] Type=simple -ExecStart=/usr/bin/ahriman --architecture %i web +ExecStart=/usr/bin/ahriman --repository-id "%I" web User=ahriman Group=ahriman diff --git a/package/lib/systemd/system/ahriman@.service b/package/lib/systemd/system/ahriman@.service index 0fc74ed4..10b95123 100644 --- a/package/lib/systemd/system/ahriman@.service +++ b/package/lib/systemd/system/ahriman@.service @@ -1,7 +1,7 @@ [Unit] -Description=ArcH linux ReposItory MANager (%I architecture) +Description=ArcH linux ReposItory MANager (%i) [Service] -ExecStart=/usr/bin/ahriman --architecture %i repo-update --refresh +ExecStart=/usr/bin/ahriman --repository-id "%I" repo-update --refresh User=ahriman Group=ahriman \ No newline at end of file diff --git a/package/lib/systemd/system/ahriman@.timer b/package/lib/systemd/system/ahriman@.timer index 61164a83..03731030 100644 --- a/package/lib/systemd/system/ahriman@.timer +++ b/package/lib/systemd/system/ahriman@.timer @@ -1,5 +1,5 @@ [Unit] -Description=ArcH linux ReposItory MANager timer (%I architecture) +Description=ArcH linux ReposItory MANager timer (%i) [Timer] OnCalendar=daily diff --git a/package/share/bash-completion/completions/_ahriman b/package/share/bash-completion/completions/_ahriman index 5fedf474..e6a77301 100644 --- a/package/share/bash-completion/completions/_ahriman +++ b/package/share/bash-completion/completions/_ahriman @@ -2,7 +2,7 @@ _shtab_ahriman_subparsers=('aur-search' 'search' 'help' 'help-commands-unsafe' 'help-updates' 'help-version' 'version' 'package-add' 'add' 'package-update' 'package-remove' 'remove' 'package-status' 'status' 'package-status-remove' 'package-status-update' 'status-update' 'patch-add' 'patch-list' 'patch-remove' 'patch-set-add' 'repo-backup' 'repo-check' 'check' 'repo-create-keyring' 'repo-create-mirrorlist' 'repo-daemon' 'daemon' 'repo-rebuild' 'rebuild' 'repo-remove-unknown' 'remove-unknown' 'repo-report' 'report' 'repo-restore' 'repo-sign' 'sign' 'repo-status-update' 'repo-sync' 'sync' 'repo-tree' 'repo-triggers' 'repo-update' 'update' 'service-clean' 'clean' 'repo-clean' 'service-config' 'config' 'repo-config' 'service-config-validate' 'config-validate' 'repo-config-validate' 'service-key-import' 'key-import' 'service-setup' 'init' 'repo-init' 'repo-setup' 'setup' 'service-shell' 'shell' 'user-add' 'user-list' 'user-remove' 'web') -_shtab_ahriman_option_strings=('-h' '--help' '-a' '--architecture' '-c' '--configuration' '--force' '-l' '--lock' '--log-handler' '--report' '--no-report' '-q' '--quiet' '--unsafe' '--wait-timeout' '-V' '--version') +_shtab_ahriman_option_strings=('-h' '--help' '-a' '--architecture' '-c' '--configuration' '--force' '-l' '--lock' '--log-handler' '--report' '--no-report' '-r' '--repository' '-q' '--quiet' '--unsafe' '--wait-timeout' '-V' '--version') _shtab_ahriman_aur_search_option_strings=('-h' '--help' '-e' '--exit-code' '--info' '--no-info' '--sort-by') _shtab_ahriman_search_option_strings=('-h' '--help' '-e' '--exit-code' '--info' '--no-info' '--sort-by') _shtab_ahriman_help_option_strings=('-h' '--help') @@ -58,15 +58,15 @@ _shtab_ahriman_config_validate_option_strings=('-h' '--help' '-e' '--exit-code') _shtab_ahriman_repo_config_validate_option_strings=('-h' '--help' '-e' '--exit-code') _shtab_ahriman_service_key_import_option_strings=('-h' '--help' '--key-server') _shtab_ahriman_key_import_option_strings=('-h' '--help' '--key-server') -_shtab_ahriman_service_setup_option_strings=('-h' '--help' '--build-as-user' '--build-command' '--from-configuration' '--generate-salt' '--no-generate-salt' '--makeflags-jobs' '--no-makeflags-jobs' '--mirror' '--multilib' '--no-multilib' '--packager' '--repository' '--server' '--sign-key' '--sign-target' '--web-port' '--web-unix-socket') -_shtab_ahriman_init_option_strings=('-h' '--help' '--build-as-user' '--build-command' '--from-configuration' '--generate-salt' '--no-generate-salt' '--makeflags-jobs' '--no-makeflags-jobs' '--mirror' '--multilib' '--no-multilib' '--packager' '--repository' '--server' '--sign-key' '--sign-target' '--web-port' '--web-unix-socket') -_shtab_ahriman_repo_init_option_strings=('-h' '--help' '--build-as-user' '--build-command' '--from-configuration' '--generate-salt' '--no-generate-salt' '--makeflags-jobs' '--no-makeflags-jobs' '--mirror' '--multilib' '--no-multilib' '--packager' '--repository' '--server' '--sign-key' '--sign-target' '--web-port' '--web-unix-socket') -_shtab_ahriman_repo_setup_option_strings=('-h' '--help' '--build-as-user' '--build-command' '--from-configuration' '--generate-salt' '--no-generate-salt' '--makeflags-jobs' '--no-makeflags-jobs' '--mirror' '--multilib' '--no-multilib' '--packager' '--repository' '--server' '--sign-key' '--sign-target' '--web-port' '--web-unix-socket') -_shtab_ahriman_setup_option_strings=('-h' '--help' '--build-as-user' '--build-command' '--from-configuration' '--generate-salt' '--no-generate-salt' '--makeflags-jobs' '--no-makeflags-jobs' '--mirror' '--multilib' '--no-multilib' '--packager' '--repository' '--server' '--sign-key' '--sign-target' '--web-port' '--web-unix-socket') +_shtab_ahriman_service_setup_option_strings=('-h' '--help' '--build-as-user' '--from-configuration' '--generate-salt' '--no-generate-salt' '--makeflags-jobs' '--no-makeflags-jobs' '--mirror' '--multilib' '--no-multilib' '--packager' '--server' '--sign-key' '--sign-target' '--web-port' '--web-unix-socket') +_shtab_ahriman_init_option_strings=('-h' '--help' '--build-as-user' '--from-configuration' '--generate-salt' '--no-generate-salt' '--makeflags-jobs' '--no-makeflags-jobs' '--mirror' '--multilib' '--no-multilib' '--packager' '--server' '--sign-key' '--sign-target' '--web-port' '--web-unix-socket') +_shtab_ahriman_repo_init_option_strings=('-h' '--help' '--build-as-user' '--from-configuration' '--generate-salt' '--no-generate-salt' '--makeflags-jobs' '--no-makeflags-jobs' '--mirror' '--multilib' '--no-multilib' '--packager' '--server' '--sign-key' '--sign-target' '--web-port' '--web-unix-socket') +_shtab_ahriman_repo_setup_option_strings=('-h' '--help' '--build-as-user' '--from-configuration' '--generate-salt' '--no-generate-salt' '--makeflags-jobs' '--no-makeflags-jobs' '--mirror' '--multilib' '--no-multilib' '--packager' '--server' '--sign-key' '--sign-target' '--web-port' '--web-unix-socket') +_shtab_ahriman_setup_option_strings=('-h' '--help' '--build-as-user' '--from-configuration' '--generate-salt' '--no-generate-salt' '--makeflags-jobs' '--no-makeflags-jobs' '--mirror' '--multilib' '--no-multilib' '--packager' '--server' '--sign-key' '--sign-target' '--web-port' '--web-unix-socket') _shtab_ahriman_service_shell_option_strings=('-h' '--help') _shtab_ahriman_shell_option_strings=('-h' '--help') -_shtab_ahriman_user_add_option_strings=('-h' '--help' '--key' '--packager' '-p' '--password' '-r' '--role') -_shtab_ahriman_user_list_option_strings=('-h' '--help' '-e' '--exit-code' '-r' '--role') +_shtab_ahriman_user_add_option_strings=('-h' '--help' '--key' '--packager' '-p' '--password' '-R' '--role') +_shtab_ahriman_user_list_option_strings=('-h' '--help' '-e' '--exit-code' '-R' '--role') _shtab_ahriman_user_remove_option_strings=('-h' '--help') _shtab_ahriman_web_option_strings=('-h' '--help') @@ -101,9 +101,9 @@ _shtab_ahriman_init___sign_target_choices=('disabled' 'packages' 'repository') _shtab_ahriman_repo_init___sign_target_choices=('disabled' 'packages' 'repository') _shtab_ahriman_repo_setup___sign_target_choices=('disabled' 'packages' 'repository') _shtab_ahriman_setup___sign_target_choices=('disabled' 'packages' 'repository') -_shtab_ahriman_user_add__r_choices=('unauthorized' 'read' 'reporter' 'full') +_shtab_ahriman_user_add__R_choices=('unauthorized' 'read' 'reporter' 'full') _shtab_ahriman_user_add___role_choices=('unauthorized' 'read' 'reporter' 'full') -_shtab_ahriman_user_list__r_choices=('unauthorized' 'read' 'reporter' 'full') +_shtab_ahriman_user_list__R_choices=('unauthorized' 'read' 'reporter' 'full') _shtab_ahriman_user_list___role_choices=('unauthorized' 'read' 'reporter' 'full') _shtab_ahriman_pos_0_nargs=A... diff --git a/package/share/man/man1/ahriman.1 b/package/share/man/man1/ahriman.1 index cab20277..c88d27c2 100644 --- a/package/share/man/man1/ahriman.1 +++ b/package/share/man/man1/ahriman.1 @@ -1,9 +1,9 @@ -.TH AHRIMAN "1" "2023\-08\-26" "ahriman" "Generated Python Manual" +.TH AHRIMAN "1" "2023\-09\-01" "ahriman" "Generated Python Manual" .SH NAME ahriman .SH SYNOPSIS .B ahriman -[-h] [-a ARCHITECTURE] [-c CONFIGURATION] [--force] [-l LOCK] [--log-handler {console,syslog,journald}] [--report | --no-report] [-q] [--unsafe] [--wait-timeout WAIT_TIMEOUT] [-V] {aur-search,search,help,help-commands-unsafe,help-updates,help-version,version,package-add,add,package-update,package-remove,remove,package-status,status,package-status-remove,package-status-update,status-update,patch-add,patch-list,patch-remove,patch-set-add,repo-backup,repo-check,check,repo-create-keyring,repo-create-mirrorlist,repo-daemon,daemon,repo-rebuild,rebuild,repo-remove-unknown,remove-unknown,repo-report,report,repo-restore,repo-sign,sign,repo-status-update,repo-sync,sync,repo-tree,repo-triggers,repo-update,update,service-clean,clean,repo-clean,service-config,config,repo-config,service-config-validate,config-validate,repo-config-validate,service-key-import,key-import,service-setup,init,repo-init,repo-setup,setup,service-shell,shell,user-add,user-list,user-remove,web} ... +[-h] [-a ARCHITECTURE] [-c CONFIGURATION] [--force] [-l LOCK] [--log-handler {console,syslog,journald}] [--report | --no-report] [-r REPOSITORY] [-q] [--unsafe] [--wait-timeout WAIT_TIMEOUT] [-V] {aur-search,search,help,help-commands-unsafe,help-updates,help-version,version,package-add,add,package-update,package-remove,remove,package-status,status,package-status-remove,package-status-update,status-update,patch-add,patch-list,patch-remove,patch-set-add,repo-backup,repo-check,check,repo-create-keyring,repo-create-mirrorlist,repo-daemon,daemon,repo-rebuild,rebuild,repo-remove-unknown,remove-unknown,repo-report,report,repo-restore,repo-sign,sign,repo-status-update,repo-sync,sync,repo-tree,repo-triggers,repo-update,update,service-clean,clean,repo-clean,service-config,config,repo-config,service-config-validate,config-validate,repo-config-validate,service-key-import,key-import,service-setup,init,repo-init,repo-setup,setup,service-shell,shell,user-add,user-list,user-remove,web} ... .SH DESCRIPTION ArcH linux ReposItory MANager @@ -32,6 +32,10 @@ explicit log handler specification. If none set, the handler will be guessed fro \fB\-\-report\fR, \fB\-\-no\-report\fR force enable or disable reporting to web service +.TP +\fB\-r\fR \fI\,REPOSITORY\/\fR, \fB\-\-repository\fR \fI\,REPOSITORY\/\fR +target repository. For several subcommands it can be used multiple times + .TP \fB\-q\fR, \fB\-\-quiet\fR force disable any logging @@ -691,11 +695,10 @@ PGP key to import from public server key server for key import .SH COMMAND \fI\,'ahriman service\-setup'\/\fR -usage: ahriman service\-setup [\-h] [\-\-build\-as\-user BUILD_AS_USER] [\-\-build\-command BUILD_COMMAND] - [\-\-from\-configuration FROM_CONFIGURATION] [\-\-generate\-salt | \-\-no\-generate\-salt] - [\-\-makeflags\-jobs | \-\-no\-makeflags\-jobs] [\-\-mirror MIRROR] [\-\-multilib | \-\-no\-multilib] - \-\-packager PACKAGER \-\-repository REPOSITORY [\-\-server SERVER] [\-\-sign\-key SIGN_KEY] - [\-\-sign\-target {disabled,packages,repository}] [\-\-web\-port WEB_PORT] +usage: ahriman service\-setup [\-h] [\-\-build\-as\-user BUILD_AS_USER] [\-\-from\-configuration FROM_CONFIGURATION] + [\-\-generate\-salt | \-\-no\-generate\-salt] [\-\-makeflags\-jobs | \-\-no\-makeflags\-jobs] + [\-\-mirror MIRROR] [\-\-multilib | \-\-no\-multilib] \-\-packager PACKAGER [\-\-server SERVER] + [\-\-sign\-key SIGN_KEY] [\-\-sign\-target {disabled,packages,repository}] [\-\-web\-port WEB_PORT] [\-\-web\-unix\-socket WEB_UNIX_SOCKET] create initial service configuration, requires root @@ -705,10 +708,6 @@ create initial service configuration, requires root \fB\-\-build\-as\-user\fR \fI\,BUILD_AS_USER\/\fR force makepkg user to the specific one -.TP -\fB\-\-build\-command\fR \fI\,BUILD_COMMAND\/\fR -build command prefix - .TP \fB\-\-from\-configuration\fR \fI\,FROM_CONFIGURATION\/\fR path to default devtools pacman configuration @@ -733,10 +732,6 @@ add or do not multilib repository \fB\-\-packager\fR \fI\,PACKAGER\/\fR packager name and email -.TP -\fB\-\-repository\fR \fI\,REPOSITORY\/\fR -repository name - .TP \fB\-\-server\fR \fI\,SERVER\/\fR server to be used for devtools. If none set, local files will be used @@ -767,7 +762,7 @@ drop into python shell instead of dropping into shell, just execute the specified code .SH COMMAND \fI\,'ahriman user\-add'\/\fR -usage: ahriman user\-add [\-h] [\-\-key KEY] [\-\-packager PACKAGER] [\-p PASSWORD] [\-r {unauthorized,read,reporter,full}] +usage: ahriman user\-add [\-h] [\-\-key KEY] [\-\-packager PACKAGER] [\-p PASSWORD] [\-R {unauthorized,read,reporter,full}] username update user for web services with the given password and role. In case if password was not entered it will be asked interactively @@ -791,11 +786,11 @@ user password. Blank password will be treated as empty password, which is in par authorization type. .TP -\fB\-r\fR \fI\,{unauthorized,read,reporter,full}\/\fR, \fB\-\-role\fR \fI\,{unauthorized,read,reporter,full}\/\fR +\fB\-R\fR \fI\,{unauthorized,read,reporter,full}\/\fR, \fB\-\-role\fR \fI\,{unauthorized,read,reporter,full}\/\fR user access level .SH COMMAND \fI\,'ahriman user\-list'\/\fR -usage: ahriman user\-list [\-h] [\-e] [\-r {unauthorized,read,reporter,full}] [username] +usage: ahriman user\-list [\-h] [\-e] [\-R {unauthorized,read,reporter,full}] [username] list users from the user mapping and their roles @@ -809,7 +804,7 @@ filter users by username return non\-zero exit status if result is empty .TP -\fB\-r\fR \fI\,{unauthorized,read,reporter,full}\/\fR, \fB\-\-role\fR \fI\,{unauthorized,read,reporter,full}\/\fR +\fB\-R\fR \fI\,{unauthorized,read,reporter,full}\/\fR, \fB\-\-role\fR \fI\,{unauthorized,read,reporter,full}\/\fR filter users by role .SH COMMAND \fI\,'ahriman user\-remove'\/\fR diff --git a/package/share/zsh/site-functions/_ahriman b/package/share/zsh/site-functions/_ahriman index a6649f6f..e23bb806 100644 --- a/package/share/zsh/site-functions/_ahriman +++ b/package/share/zsh/site-functions/_ahriman @@ -83,6 +83,7 @@ _shtab_ahriman_options=( {-l,--lock}"[lock file (default\: \/tmp\/ahriman.lock)]:lock:" "--log-handler[explicit log handler specification. If none set, the handler will be guessed from environment (default\: None)]:log_handler:(console syslog journald)" {--report,--no-report}"[force enable or disable reporting to web service (default\: True)]:report:" + "*"{-r,--repository}"[target repository. For several subcommands it can be used multiple times (default\: None)]:repository:" {-q,--quiet}"[force disable any logging (default\: False)]" "--unsafe[allow to run ahriman as non-ahriman user. Some actions might be unavailable (default\: False)]" "--wait-timeout[wait for lock to be free. Negative value will lead to immediate application run even if there is lock file. In case of zero value, the application will wait infinitely (default\: -1)]:wait_timeout:" @@ -169,14 +170,12 @@ _shtab_ahriman_help_version_options=( _shtab_ahriman_init_options=( "(- : *)"{-h,--help}"[show this help message and exit]" "--build-as-user[force makepkg user to the specific one (default\: None)]:build_as_user:" - "--build-command[build command prefix (default\: ahriman)]:build_command:" "--from-configuration[path to default devtools pacman configuration (default\: \/usr\/share\/devtools\/pacman.conf.d\/extra.conf)]:from_configuration:" {--generate-salt,--no-generate-salt}"[generate salt for user passwords (default\: False)]:generate_salt:" {--makeflags-jobs,--no-makeflags-jobs}"[append MAKEFLAGS variable with parallelism set to number of cores (default\: True)]:makeflags_jobs:" "--mirror[use the specified explicitly mirror instead of including mirrorlist (default\: None)]:mirror:" {--multilib,--no-multilib}"[add or do not multilib repository (default\: True)]:multilib:" "--packager[packager name and email (default\: None)]:packager:" - "--repository[repository name (default\: None)]:repository:" "--server[server to be used for devtools. If none set, local files will be used (default\: None)]:server:" "--sign-key[sign key id (default\: None)]:sign_key:" "*--sign-target[sign options (default\: None)]:sign_target:(disabled packages repository)" @@ -340,14 +339,12 @@ _shtab_ahriman_repo_daemon_options=( _shtab_ahriman_repo_init_options=( "(- : *)"{-h,--help}"[show this help message and exit]" "--build-as-user[force makepkg user to the specific one (default\: None)]:build_as_user:" - "--build-command[build command prefix (default\: ahriman)]:build_command:" "--from-configuration[path to default devtools pacman configuration (default\: \/usr\/share\/devtools\/pacman.conf.d\/extra.conf)]:from_configuration:" {--generate-salt,--no-generate-salt}"[generate salt for user passwords (default\: False)]:generate_salt:" {--makeflags-jobs,--no-makeflags-jobs}"[append MAKEFLAGS variable with parallelism set to number of cores (default\: True)]:makeflags_jobs:" "--mirror[use the specified explicitly mirror instead of including mirrorlist (default\: None)]:mirror:" {--multilib,--no-multilib}"[add or do not multilib repository (default\: True)]:multilib:" "--packager[packager name and email (default\: None)]:packager:" - "--repository[repository name (default\: None)]:repository:" "--server[server to be used for devtools. If none set, local files will be used (default\: None)]:server:" "--sign-key[sign key id (default\: None)]:sign_key:" "*--sign-target[sign options (default\: None)]:sign_target:(disabled packages repository)" @@ -384,14 +381,12 @@ _shtab_ahriman_repo_restore_options=( _shtab_ahriman_repo_setup_options=( "(- : *)"{-h,--help}"[show this help message and exit]" "--build-as-user[force makepkg user to the specific one (default\: None)]:build_as_user:" - "--build-command[build command prefix (default\: ahriman)]:build_command:" "--from-configuration[path to default devtools pacman configuration (default\: \/usr\/share\/devtools\/pacman.conf.d\/extra.conf)]:from_configuration:" {--generate-salt,--no-generate-salt}"[generate salt for user passwords (default\: False)]:generate_salt:" {--makeflags-jobs,--no-makeflags-jobs}"[append MAKEFLAGS variable with parallelism set to number of cores (default\: True)]:makeflags_jobs:" "--mirror[use the specified explicitly mirror instead of including mirrorlist (default\: None)]:mirror:" {--multilib,--no-multilib}"[add or do not multilib repository (default\: True)]:multilib:" "--packager[packager name and email (default\: None)]:packager:" - "--repository[repository name (default\: None)]:repository:" "--server[server to be used for devtools. If none set, local files will be used (default\: None)]:server:" "--sign-key[sign key id (default\: None)]:sign_key:" "*--sign-target[sign options (default\: None)]:sign_target:(disabled packages repository)" @@ -478,14 +473,12 @@ _shtab_ahriman_service_key_import_options=( _shtab_ahriman_service_setup_options=( "(- : *)"{-h,--help}"[show this help message and exit]" "--build-as-user[force makepkg user to the specific one (default\: None)]:build_as_user:" - "--build-command[build command prefix (default\: ahriman)]:build_command:" "--from-configuration[path to default devtools pacman configuration (default\: \/usr\/share\/devtools\/pacman.conf.d\/extra.conf)]:from_configuration:" {--generate-salt,--no-generate-salt}"[generate salt for user passwords (default\: False)]:generate_salt:" {--makeflags-jobs,--no-makeflags-jobs}"[append MAKEFLAGS variable with parallelism set to number of cores (default\: True)]:makeflags_jobs:" "--mirror[use the specified explicitly mirror instead of including mirrorlist (default\: None)]:mirror:" {--multilib,--no-multilib}"[add or do not multilib repository (default\: True)]:multilib:" "--packager[packager name and email (default\: None)]:packager:" - "--repository[repository name (default\: None)]:repository:" "--server[server to be used for devtools. If none set, local files will be used (default\: None)]:server:" "--sign-key[sign key id (default\: None)]:sign_key:" "*--sign-target[sign options (default\: None)]:sign_target:(disabled packages repository)" @@ -501,14 +494,12 @@ _shtab_ahriman_service_shell_options=( _shtab_ahriman_setup_options=( "(- : *)"{-h,--help}"[show this help message and exit]" "--build-as-user[force makepkg user to the specific one (default\: None)]:build_as_user:" - "--build-command[build command prefix (default\: ahriman)]:build_command:" "--from-configuration[path to default devtools pacman configuration (default\: \/usr\/share\/devtools\/pacman.conf.d\/extra.conf)]:from_configuration:" {--generate-salt,--no-generate-salt}"[generate salt for user passwords (default\: False)]:generate_salt:" {--makeflags-jobs,--no-makeflags-jobs}"[append MAKEFLAGS variable with parallelism set to number of cores (default\: True)]:makeflags_jobs:" "--mirror[use the specified explicitly mirror instead of including mirrorlist (default\: None)]:mirror:" {--multilib,--no-multilib}"[add or do not multilib repository (default\: True)]:multilib:" "--packager[packager name and email (default\: None)]:packager:" - "--repository[repository name (default\: None)]:repository:" "--server[server to be used for devtools. If none set, local files will be used (default\: None)]:server:" "--sign-key[sign key id (default\: None)]:sign_key:" "*--sign-target[sign options (default\: None)]:sign_target:(disabled packages repository)" @@ -565,14 +556,14 @@ _shtab_ahriman_user_add_options=( "--key[optional PGP key used by this user. The private key must be imported (default\: None)]:key:" "--packager[optional packager id used for build process in form of \`Name Surname \\` (default\: None)]:packager:" {-p,--password}"[user password. Blank password will be treated as empty password, which is in particular must be used for OAuth2 authorization type. (default\: None)]:password:" - {-r,--role}"[user access level (default\: UserAccess.Read)]:role:(unauthorized read reporter full)" + {-R,--role}"[user access level (default\: UserAccess.Read)]:role:(unauthorized read reporter full)" ":username for web service:" ) _shtab_ahriman_user_list_options=( "(- : *)"{-h,--help}"[show this help message and exit]" {-e,--exit-code}"[return non-zero exit status if result is empty (default\: False)]" - {-r,--role}"[filter users by role (default\: None)]:role:(unauthorized read reporter full)" + {-R,--role}"[filter users by role (default\: None)]:role:(unauthorized read reporter full)" ":filter users by username (default\: None):" ) diff --git a/src/ahriman/application/ahriman.py b/src/ahriman/application/ahriman.py index 03ab648e..5a72afb9 100644 --- a/src/ahriman/application/ahriman.py +++ b/src/ahriman/application/ahriman.py @@ -83,6 +83,9 @@ def _parser() -> argparse.ArgumentParser: action=argparse.BooleanOptionalAction, default=True) parser.add_argument("-r", "--repository", help="target repository. For several subcommands it can be used " "multiple times", action="append") + # special secret argument for systemd unit. The issue is that systemd doesn't allow multiple arguments to template + # name. This parameter accepts [[arch]-repo] in order to keep backward compatibility + parser.add_argument("--repository-id", help=argparse.SUPPRESS) parser.add_argument("-q", "--quiet", help="force disable any logging", action="store_true") parser.add_argument("--unsafe", help="allow to run ahriman as non-ahriman user. Some actions might be unavailable", action="store_true") diff --git a/src/ahriman/application/handlers/handler.py b/src/ahriman/application/handlers/handler.py index b717b1bc..6509dec1 100644 --- a/src/ahriman/application/handlers/handler.py +++ b/src/ahriman/application/handlers/handler.py @@ -124,6 +124,15 @@ class Handler: # pylint, wtf??? root = configuration.getpath("repository", "root") # pylint: disable=assignment-from-no-return + # preparse systemd repository-id argument + # we are using unescaped values, so / is not allowed here, because it is impossible to separate if from dashes + if args.repository_id is not None: + # repository parts is optional for backward compatibility + architecture, *repository_parts = args.repository_id.split("/") + args.architecture = [architecture] + if repository_parts: + args.repository = ["-".join(repository_parts)] # replace slash with dash + # extract repository names first names = args.repository if names is None: # try to read file system first diff --git a/tests/ahriman/application/conftest.py b/tests/ahriman/application/conftest.py index a2fd871e..fa98c1c1 100644 --- a/tests/ahriman/application/conftest.py +++ b/tests/ahriman/application/conftest.py @@ -40,7 +40,8 @@ def args() -> argparse.Namespace: Returns: argparse.Namespace: command line arguments test instance """ - return argparse.Namespace(architecture=None, lock=None, force=False, unsafe=False, report=False, wait_timeout=-1) + return argparse.Namespace(architecture=None, lock=None, force=False, unsafe=False, report=False, + repository=None, repository_id=None, wait_timeout=-1) @pytest.fixture diff --git a/tests/ahriman/application/handlers/test_handler.py b/tests/ahriman/application/handlers/test_handler.py index d49bf8b4..ba2572c5 100644 --- a/tests/ahriman/application/handlers/test_handler.py +++ b/tests/ahriman/application/handlers/test_handler.py @@ -137,7 +137,6 @@ def test_repositories_extract_repository(args: argparse.Namespace, configuration """ args.architecture = ["arch"] args.configuration = configuration.path - args.repository = None known_architectures_mock = mocker.patch("ahriman.models.repository_paths.RepositoryPaths.known_architectures") known_repositories_mock = mocker.patch("ahriman.models.repository_paths.RepositoryPaths.known_repositories", return_value={"repo"}) @@ -154,12 +153,11 @@ def test_repositories_extract_repository_legacy(args: argparse.Namespace, config """ args.architecture = ["arch"] args.configuration = configuration.path - args.repository = None known_architectures_mock = mocker.patch("ahriman.models.repository_paths.RepositoryPaths.known_architectures") known_repositories_mock = mocker.patch("ahriman.models.repository_paths.RepositoryPaths.known_repositories", - return_value={"repo"}) + return_value=set()) - assert Handler.repositories_extract(args) == [RepositoryId("arch", "repo")] + assert Handler.repositories_extract(args) == [RepositoryId("arch", "aur-clone")] known_architectures_mock.assert_not_called() known_repositories_mock.assert_called_once_with(configuration.repository_paths.root) @@ -169,7 +167,6 @@ def test_repositories_extract_architecture(args: argparse.Namespace, configurati """ must read repository name from config """ - args.architecture = None args.configuration = configuration.path args.repository = ["repo"] known_architectures_mock = mocker.patch("ahriman.models.repository_paths.RepositoryPaths.known_architectures", @@ -187,9 +184,7 @@ def test_repositories_extract_empty(args: argparse.Namespace, configuration: Con must raise exception if no available architectures found """ args.command = "config" - args.architecture = None args.configuration = configuration.path - args.repository = None mocker.patch("ahriman.models.repository_paths.RepositoryPaths.known_architectures", return_value=set()) mocker.patch("ahriman.models.repository_paths.RepositoryPaths.known_repositories", return_value=set()) @@ -197,6 +192,37 @@ def test_repositories_extract_empty(args: argparse.Namespace, configuration: Con Handler.repositories_extract(args) +def test_repositories_extract_systemd(args: argparse.Namespace, configuration: Configuration, + mocker: MockerFixture) -> None: + """ + must extract repository list for systemd units + """ + args.configuration = configuration.path + args.repository_id = "i686/some/repo/name" + known_architectures_mock = mocker.patch("ahriman.models.repository_paths.RepositoryPaths.known_architectures") + known_repositories_mock = mocker.patch("ahriman.models.repository_paths.RepositoryPaths.known_repositories") + + assert Handler.repositories_extract(args) == [RepositoryId("i686", "some-repo-name")] + known_architectures_mock.assert_not_called() + known_repositories_mock.assert_not_called() + + +def test_repositories_extract_systemd_legacy(args: argparse.Namespace, configuration: Configuration, + mocker: MockerFixture) -> None: + """ + must extract repository list for systemd units in legacy format + """ + args.configuration = configuration.path + args.repository_id = "i686" + known_architectures_mock = mocker.patch("ahriman.models.repository_paths.RepositoryPaths.known_architectures") + known_repositories_mock = mocker.patch("ahriman.models.repository_paths.RepositoryPaths.known_repositories", + return_value=set()) + + assert Handler.repositories_extract(args) == [RepositoryId("i686", "aur-clone")] + known_architectures_mock.assert_not_called() + known_repositories_mock.assert_called_once_with(configuration.repository_paths.root) + + def test_check_if_empty() -> None: """ must raise exception in case if predicate is True and enabled