From 7abdb48ac011a19eb38c45ad6d811d7680deeb05 Mon Sep 17 00:00:00 2001 From: Evgeniy Alekseev Date: Fri, 10 Sep 2021 03:32:45 +0300 Subject: [PATCH] documentation update --- Makefile | 2 +- README.md | 95 +- docs/ahriman-architecture.svg | 3261 +++++++++++++++++++++++ docs/architecture.md | 157 ++ CONFIGURING.md => docs/configuration.md | 2 +- docs/setup.md | 60 + setup.py | 1 - web.png | Bin 0 -> 89280 bytes 8 files changed, 3527 insertions(+), 51 deletions(-) create mode 100644 docs/ahriman-architecture.svg create mode 100644 docs/architecture.md rename CONFIGURING.md => docs/configuration.md (99%) create mode 100644 docs/setup.md create mode 100644 web.png diff --git a/Makefile b/Makefile index f082e6c5..7b15133c 100644 --- a/Makefile +++ b/Makefile @@ -3,7 +3,7 @@ PROJECT := ahriman -FILES := AUTHORS COPYING CONFIGURING.md README.md package src setup.cfg setup.py +FILES := AUTHORS COPYING CONFIGURING.md README.md docs package src setup.cfg setup.py TARGET_FILES := $(addprefix $(PROJECT)/, $(FILES)) IGNORE_FILES := package/archlinux src/.mypy_cache diff --git a/README.md b/README.md index e62edcd7..1b896549 100644 --- a/README.md +++ b/README.md @@ -13,61 +13,60 @@ Wrapper for managing custom repository inspired by [repo-scripts](https://github * Sign support with gpg (repository, package, per package settings). * Synchronization to remote services (rsync, s3) and report generation (html). * Dependency manager. -* Repository status interface with optional authorization. +* Repository status interface with optional authorization and control options: + + ![web interface](web.png) ## Installation and run -* Install package as usual. -* Change settings if required, see [CONFIGURING](CONFIGURING.md) for more details. -* Create `/var/lib/ahriman/.makepkg.conf` with `makepkg.conf` overrides if required (at least you might want to set `PACKAGER`): +For installation details please refer to the [documentation](docs/setup.md). For command help, `--help` subcommand must be used, e.g.: - ```shell - echo 'PACKAGER="John Doe "' | sudo -u ahriman tee -a /var/lib/ahriman/.makepkg.conf - ``` +```shell +$ ahriman --help +usage: ahriman [-h] [-a ARCHITECTURE] [-c CONFIGURATION] [--force] [-l LOCK] [--no-log] [--no-report] [--unsafe] [-v] + {add,check,clean,config,create-user,init,key-import,rebuild,remove,remove-unknown,report,search,setup,sign,status,status-update,sync,update,web} ... -* Configure build tools (it is required for correct dependency management system): +ArcHlinux ReposItory MANager - * create build command, e.g. `ln -s /usr/bin/archbuild /usr/local/bin/ahriman-x86_64-build` (you can choose any name for command, basically it should be `{name}-{arch}-build`); - * create configuration file, e.g. `cp /usr/share/devtools/pacman-{extra,ahriman}.conf` (same as previous `pacman-{name}.conf`); - * change configuration file, add your own repository, add multilib repository etc; - * set `build_command` option to point to your command; - * configure `/etc/sudoers.d/ahriman` to allow running command without a password. +optional arguments: + -h, --help show this help message and exit + -a ARCHITECTURE, --architecture ARCHITECTURE + target architectures (can be used multiple times) (default: None) + -c CONFIGURATION, --configuration CONFIGURATION + configuration path (default: /etc/ahriman.ini) + --force force run, remove file lock (default: False) + -l LOCK, --lock LOCK lock file (default: /tmp/ahriman.lock) + --no-log redirect all log messages to stderr (default: False) + --no-report force disable reporting to web service (default: False) + --unsafe allow to run ahriman as non-ahriman user (default: False) + -v, --version show program's version number and exit - ```shell - ln -s /usr/bin/archbuild /usr/local/bin/ahriman-x86_64-build - cp /usr/share/devtools/pacman-{extra,ahriman}.conf +command: + {add,check,clean,config,create-user,init,key-import,rebuild,remove,remove-unknown,report,search,setup,sign,status,status-update,sync,update,web} + command to run + add add package + check check for updates + clean clean local caches + config dump configuration + create-user create user for web services + init create repository tree + key-import import PGP key + rebuild rebuild repository + remove remove package + remove-unknown remove unknown packages + report generate report + search search for package + setup initial service configuration + sign sign packages + status get package status + status-update update package status + sync sync repository + update update packages + web start web server +``` - echo '[multilib]' | tee -a /usr/share/devtools/pacman-ahriman.conf - echo 'Include = /etc/pacman.d/mirrorlist' | tee -a /usr/share/devtools/pacman-ahriman.conf +Subcommands have own help message as well. - echo '[aur-clone]' | tee -a /usr/share/devtools/pacman-ahriman.conf - echo 'SigLevel = Optional TrustAll' | tee -a /usr/share/devtools/pacman-ahriman.conf - echo 'Server = file:///var/lib/ahriman/repository/$arch' | tee -a /usr/share/devtools/pacman-ahriman.conf +## Configuration - echo '[build]' | tee -a /etc/ahriman.ini.d/build.ini - echo 'build_command = ahriman-x86_64-build' | tee -a /etc/ahriman.ini.d/build.ini - - echo 'Cmnd_Alias CARCHBUILD_CMD = /usr/local/bin/ahriman-x86_64-build *' | tee -a /etc/sudoers.d/ahriman - echo 'ahriman ALL=(ALL) NOPASSWD: CARCHBUILD_CMD' | tee -a /etc/sudoers.d/ahriman - chmod 400 /etc/sudoers.d/ahriman - ``` - -* Start and enable `ahriman@.timer` via `systemctl`: - - ```shell - systemctl enable --now ahriman@x86_64.timer - ``` - -* Start and enable status page: - - ```shell - systemctl enable --now ahriman-web@x86_64 - ``` - -* Add packages by using `ahriman add {package}` command: - - ```shell - sudo -u ahriman ahriman -a x86_64 add yay --now - ``` - -Note that initial service configuration can be done by running `ahriman setup` with specific arguments. +Every available option is described in the [documentation](docs/configuration.md). diff --git a/docs/ahriman-architecture.svg b/docs/ahriman-architecture.svg new file mode 100644 index 00000000..16c33c6f --- /dev/null +++ b/docs/ahriman-architecture.svg @@ -0,0 +1,3261 @@ + + + + + + +G + + + +ahriman_application_ahriman + +ahriman. +application. +ahriman + + + +ahriman_application_application + +ahriman. +application. +application + + + +ahriman_application_handlers_add + +ahriman. +application. +handlers. +add + + + +ahriman_application_application->ahriman_application_handlers_add + + + + + +ahriman_application_handlers_clean + +ahriman. +application. +handlers. +clean + + + +ahriman_application_application->ahriman_application_handlers_clean + + + + + + +ahriman_application_handlers_init + +ahriman. +application. +handlers. +init + + + +ahriman_application_application->ahriman_application_handlers_init + + + + + +ahriman_application_handlers_key_import + +ahriman. +application. +handlers. +key_import + + + +ahriman_application_application->ahriman_application_handlers_key_import + + + + + +ahriman_application_handlers_rebuild + +ahriman. +application. +handlers. +rebuild + + + +ahriman_application_application->ahriman_application_handlers_rebuild + + + + + + +ahriman_application_handlers_remove + +ahriman. +application. +handlers. +remove + + + +ahriman_application_application->ahriman_application_handlers_remove + + + + + +ahriman_application_handlers_remove_unknown + +ahriman. +application. +handlers. +remove_unknown + + + +ahriman_application_application->ahriman_application_handlers_remove_unknown + + + + +ahriman_application_handlers_report + +ahriman. +application. +handlers. +report + + + +ahriman_application_application->ahriman_application_handlers_report + + + + + +ahriman_application_handlers_setup + +ahriman. +application. +handlers. +setup + + + +ahriman_application_application->ahriman_application_handlers_setup + + + + + + +ahriman_application_handlers_sign + +ahriman. +application. +handlers. +sign + + + +ahriman_application_application->ahriman_application_handlers_sign + + + + + +ahriman_application_handlers_status + +ahriman. +application. +handlers. +status + + + +ahriman_application_application->ahriman_application_handlers_status + + + + + +ahriman_application_handlers_status_update + +ahriman. +application. +handlers. +status_update + + + +ahriman_application_application->ahriman_application_handlers_status_update + + + + + +ahriman_application_handlers_sync + +ahriman. +application. +handlers. +sync + + + +ahriman_application_application->ahriman_application_handlers_sync + + + + + +ahriman_application_handlers_update + +ahriman. +application. +handlers. +update + + + +ahriman_application_application->ahriman_application_handlers_update + + + + + +ahriman_application_handlers + +ahriman. +application. +handlers + + + +ahriman_application_handlers->ahriman_application_ahriman + + + + + +ahriman_application_handlers_add->ahriman_application_handlers + + + + +ahriman_application_handlers_clean->ahriman_application_handlers + + + + +ahriman_application_handlers_create_user + +ahriman. +application. +handlers. +create_user + + + +ahriman_application_handlers_create_user->ahriman_application_handlers + + + + +ahriman_application_handlers_dump + +ahriman. +application. +handlers. +dump + + + +ahriman_application_handlers_dump->ahriman_application_handlers + + + + +ahriman_application_handlers_handler + +ahriman. +application. +handlers. +handler + + + +ahriman_application_handlers_handler->ahriman_application_handlers + + + + +ahriman_application_handlers_handler->ahriman_application_handlers_add + + + + + +ahriman_application_handlers_handler->ahriman_application_handlers_clean + + + + + +ahriman_application_handlers_handler->ahriman_application_handlers_create_user + + + + + +ahriman_application_handlers_handler->ahriman_application_handlers_dump + + + + + +ahriman_application_handlers_handler->ahriman_application_handlers_init + + + + + +ahriman_application_handlers_handler->ahriman_application_handlers_key_import + + + + + +ahriman_application_handlers_handler->ahriman_application_handlers_rebuild + + + + + +ahriman_application_handlers_handler->ahriman_application_handlers_remove + + + + + +ahriman_application_handlers_handler->ahriman_application_handlers_remove_unknown + + + + + +ahriman_application_handlers_handler->ahriman_application_handlers_report + + + + + +ahriman_application_handlers_search + +ahriman. +application. +handlers. +search + + + +ahriman_application_handlers_handler->ahriman_application_handlers_search + + + + + +ahriman_application_handlers_handler->ahriman_application_handlers_setup + + + + + +ahriman_application_handlers_handler->ahriman_application_handlers_sign + + + + + +ahriman_application_handlers_handler->ahriman_application_handlers_status + + + + + +ahriman_application_handlers_handler->ahriman_application_handlers_status_update + + + + + +ahriman_application_handlers_handler->ahriman_application_handlers_sync + + + + + +ahriman_application_handlers_handler->ahriman_application_handlers_update + + + + + +ahriman_application_handlers_web + +ahriman. +application. +handlers. +web + + + +ahriman_application_handlers_handler->ahriman_application_handlers_web + + + + + +ahriman_application_handlers_init->ahriman_application_handlers + + + + +ahriman_application_handlers_key_import->ahriman_application_handlers + + + + +ahriman_application_handlers_rebuild->ahriman_application_handlers + + + + +ahriman_application_handlers_remove->ahriman_application_handlers + + + + + +ahriman_application_handlers_remove_unknown->ahriman_application_handlers + + + + +ahriman_application_handlers_report->ahriman_application_handlers + + + + +ahriman_application_handlers_search->ahriman_application_handlers + + + + +ahriman_application_handlers_setup->ahriman_application_handlers + + + + +ahriman_application_handlers_sign->ahriman_application_handlers + + + + + + + +ahriman_application_handlers_status->ahriman_application_handlers + + + + +ahriman_application_handlers_status_update->ahriman_application_handlers + + + + +ahriman_application_handlers_sync->ahriman_application_handlers + + + + +ahriman_application_handlers_update->ahriman_application_handlers + + + + +ahriman_application_handlers_web->ahriman_application_handlers + + + + + +ahriman_application_lock + +ahriman. +application. +lock + + + +ahriman_application_lock->ahriman_application_handlers_handler + + + + + + +ahriman_core + +ahriman.core + + + +ahriman_core->ahriman_application_application + + + + + + +ahriman_core->ahriman_application_handlers_add + + + + + + +ahriman_core->ahriman_application_handlers_clean + + + + +ahriman_core->ahriman_application_handlers_create_user + + + + +ahriman_core->ahriman_application_handlers_dump + + + + + + +ahriman_core->ahriman_application_handlers_handler + + + + + +ahriman_core->ahriman_application_handlers_init + + + + + + + +ahriman_core->ahriman_application_handlers_key_import + + + + + + + +ahriman_core->ahriman_application_handlers_rebuild + + + + + + +ahriman_core->ahriman_application_handlers_remove + + + + + + + +ahriman_core->ahriman_application_handlers_remove_unknown + + + + + + + +ahriman_core->ahriman_application_handlers_report + + + + + +ahriman_core->ahriman_application_handlers_search + + + + +ahriman_core->ahriman_application_handlers_setup + + + + + +ahriman_core->ahriman_application_handlers_sign + + + + + +ahriman_core->ahriman_application_handlers_status + + + + +ahriman_core->ahriman_application_handlers_status_update + + + + + + +ahriman_core->ahriman_application_handlers_sync + + + + + +ahriman_core->ahriman_application_handlers_update + + + + + +ahriman_core->ahriman_application_handlers_web + + + + +ahriman_core->ahriman_application_lock + + + + + + +ahriman_models_auth_settings + +ahriman. +models. +auth_settings + + + +ahriman_core->ahriman_models_auth_settings + + + + + +ahriman_models_build_status + +ahriman. +models. +build_status + + + +ahriman_core->ahriman_models_build_status + + + + + +ahriman_models_package + +ahriman. +models. +package + + + +ahriman_core->ahriman_models_package + + + + +ahriman_models_report_settings + +ahriman. +models. +report_settings + + + +ahriman_core->ahriman_models_report_settings + + + + + + +ahriman_models_sign_settings + +ahriman. +models. +sign_settings + + + +ahriman_core->ahriman_models_sign_settings + + + + + +ahriman_models_upload_settings + +ahriman. +models. +upload_settings + + + +ahriman_core->ahriman_models_upload_settings + + + + + +ahriman_web_middlewares_auth_handler + +ahriman. +web. +middlewares. +auth_handler + + + +ahriman_core->ahriman_web_middlewares_auth_handler + + + + + +ahriman_web_views_base + +ahriman. +web. +views. +base + + + +ahriman_core->ahriman_web_views_base + + + + + +ahriman_web_views_index + +ahriman. +web. +views. +index + + + +ahriman_core->ahriman_web_views_index + + + + + + + +ahriman_web_views_status_package + +ahriman. +web. +views. +status. +package + + + +ahriman_core->ahriman_web_views_status_package + + + + + + +ahriman_web_views_user_login + +ahriman. +web. +views. +user. +login + + + +ahriman_core->ahriman_web_views_user_login + + + + + +ahriman_web_views_user_logout + +ahriman. +web. +views. +user. +logout + + + +ahriman_core->ahriman_web_views_user_logout + + + + + + +ahriman_web_web + +ahriman. +web. +web + + + +ahriman_core->ahriman_web_web + + + + + +ahriman_core_alpm + +ahriman. +core. +alpm + + + +ahriman_core_repository_properties + +ahriman. +core. +repository. +properties + + + +ahriman_core_alpm->ahriman_core_repository_properties + + + + + +ahriman_core_alpm->ahriman_models_package + + + + + +ahriman_core_alpm_pacman + +ahriman. +core. +alpm. +pacman + + + +ahriman_core_alpm_pacman->ahriman_core_repository_properties + + + + +ahriman_core_alpm_pacman->ahriman_models_package + + + + + +ahriman_core_alpm_repo + +ahriman. +core. +alpm. +repo + + + +ahriman_core_alpm_repo->ahriman_core_repository_properties + + + + + + +ahriman_core_auth + +ahriman. +core. +auth + + + +ahriman_core_auth->ahriman_web_middlewares_auth_handler + + + + + +ahriman_core_auth->ahriman_web_views_base + + + + + + +ahriman_core_auth->ahriman_web_views_index + + + + +ahriman_core_auth->ahriman_web_views_user_login + + + + + + +ahriman_core_auth->ahriman_web_views_user_logout + + + + + +ahriman_core_auth->ahriman_web_web + + + + + + +ahriman_core_auth_auth + +ahriman. +core. +auth. +auth + + + +ahriman_core_auth_mapping_auth + +ahriman. +core. +auth. +mapping_auth + + + +ahriman_core_auth_auth->ahriman_core_auth_mapping_auth + + + + + + +ahriman_core_auth_auth->ahriman_web_middlewares_auth_handler + + + + + + + +ahriman_core_auth_auth->ahriman_web_views_base + + + + +ahriman_core_auth_auth->ahriman_web_web + + + + + + +ahriman_core_auth_helpers + +ahriman. +core. +auth. +helpers + + + +ahriman_core_auth_helpers->ahriman_web_views_index + + + + + +ahriman_core_auth_helpers->ahriman_web_views_user_login + + + + +ahriman_core_auth_helpers->ahriman_web_views_user_logout + + + + + + + +ahriman_core_build_tools + +ahriman. +core. +build_tools + + + +ahriman_core_build_tools->ahriman_application_application + + + + +ahriman_core_repository_executor + +ahriman. +core. +repository. +executor + + + +ahriman_core_build_tools->ahriman_core_repository_executor + + + + + +ahriman_core_tree + +ahriman. +core. +tree + + + +ahriman_core_build_tools->ahriman_core_tree + + + + + +ahriman_core_build_tools->ahriman_models_package + + + + + + +ahriman_core_build_tools_task + +ahriman. +core. +build_tools. +task + + + +ahriman_core_build_tools_task->ahriman_application_application + + + + + + +ahriman_core_build_tools_task->ahriman_core_repository_executor + + + + +ahriman_core_build_tools_task->ahriman_core_tree + + + + + +ahriman_core_configuration + +ahriman. +core. +configuration + + + +ahriman_core_configuration->ahriman_application_application + + + + + + +ahriman_core_configuration->ahriman_application_handlers_add + + + + + + +ahriman_core_configuration->ahriman_application_handlers_clean + + + + + + +ahriman_core_configuration->ahriman_application_handlers_create_user + + + + + +ahriman_core_configuration->ahriman_application_handlers_dump + + + + +ahriman_core_configuration->ahriman_application_handlers_handler + + + + + +ahriman_core_configuration->ahriman_application_handlers_init + + + + + + + +ahriman_core_configuration->ahriman_application_handlers_key_import + + + + +ahriman_core_configuration->ahriman_application_handlers_rebuild + + + + + +ahriman_core_configuration->ahriman_application_handlers_remove + + + + +ahriman_core_configuration->ahriman_application_handlers_remove_unknown + + + + + + +ahriman_core_configuration->ahriman_application_handlers_report + + + + + +ahriman_core_configuration->ahriman_application_handlers_search + + + + + +ahriman_core_configuration->ahriman_application_handlers_setup + + + + + + +ahriman_core_configuration->ahriman_application_handlers_sign + + + + + +ahriman_core_configuration->ahriman_application_handlers_status + + + + + +ahriman_core_configuration->ahriman_application_handlers_status_update + + + + + +ahriman_core_configuration->ahriman_application_handlers_sync + + + + + + +ahriman_core_configuration->ahriman_application_handlers_update + + + + + + + +ahriman_core_configuration->ahriman_application_handlers_web + + + + + + + +ahriman_core_configuration->ahriman_application_lock + + + + + +ahriman_core_configuration->ahriman_core_alpm_pacman + + + + + +ahriman_core_configuration->ahriman_core_auth_auth + + + + +ahriman_core_configuration->ahriman_core_auth_mapping_auth + + + + + + + + + +ahriman_core_configuration->ahriman_core_build_tools_task + + + + + + +ahriman_core_report_email + +ahriman. +core. +report. +email + + + +ahriman_core_configuration->ahriman_core_report_email + + + + + +ahriman_core_report_html + +ahriman. +core. +report. +html + + + +ahriman_core_configuration->ahriman_core_report_html + + + + + +ahriman_core_report_jinja_template + +ahriman. +core. +report. +jinja_template + + + +ahriman_core_configuration->ahriman_core_report_jinja_template + + + + + +ahriman_core_report_report + +ahriman. +core. +report. +report + + + +ahriman_core_configuration->ahriman_core_report_report + + + + + + +ahriman_core_configuration->ahriman_core_repository_properties + + + + + +ahriman_core_sign_gpg + +ahriman. +core. +sign. +gpg + + + +ahriman_core_configuration->ahriman_core_sign_gpg + + + + + +ahriman_core_spawn + +ahriman. +core. +spawn + + + +ahriman_core_configuration->ahriman_core_spawn + + + + + +ahriman_core_status_client + +ahriman. +core. +status. +client + + + +ahriman_core_configuration->ahriman_core_status_client + + + + + +ahriman_core_status_watcher + +ahriman. +core. +status. +watcher + + + +ahriman_core_configuration->ahriman_core_status_watcher + + + + + + +ahriman_core_status_web_client + +ahriman. +core. +status. +web_client + + + +ahriman_core_configuration->ahriman_core_status_web_client + + + + +ahriman_core_upload_rsync + +ahriman. +core. +upload. +rsync + + + +ahriman_core_configuration->ahriman_core_upload_rsync + + + + + +ahriman_core_upload_s3 + +ahriman. +core. +upload. +s3 + + + +ahriman_core_configuration->ahriman_core_upload_s3 + + + + + + +ahriman_core_upload_upload + +ahriman. +core. +upload. +upload + + + +ahriman_core_configuration->ahriman_core_upload_upload + + + + + +ahriman_core_configuration->ahriman_web_web + + + + + + +ahriman_core_exceptions + +ahriman. +core. +exceptions + + + +ahriman_core_exceptions->ahriman_application_handlers_handler + + + + + + +ahriman_core_exceptions->ahriman_application_lock + + + + + +ahriman_core_exceptions->ahriman_core_alpm_repo + + + + + + +ahriman_core_exceptions->ahriman_core_auth_mapping_auth + + + + + +ahriman_core_exceptions->ahriman_core_build_tools_task + + + + + +ahriman_core_exceptions->ahriman_core_report_report + + + + + + +ahriman_core_exceptions->ahriman_core_sign_gpg + + + + + +ahriman_core_exceptions->ahriman_core_status_watcher + + + + + +ahriman_core_exceptions->ahriman_core_upload_upload + + + + +ahriman_core_util + +ahriman. +core. +util + + + +ahriman_core_exceptions->ahriman_core_util + + + + + +ahriman_core_exceptions->ahriman_models_auth_settings + + + + + +ahriman_core_exceptions->ahriman_models_package + + + + + +ahriman_core_exceptions->ahriman_models_report_settings + + + + + + +ahriman_core_exceptions->ahriman_models_sign_settings + + + + + +ahriman_core_exceptions->ahriman_models_upload_settings + + + + + +ahriman_core_exceptions->ahriman_web_views_status_package + + + + +ahriman_core_exceptions->ahriman_web_web + + + + + +ahriman_core_report + +ahriman. +core. +report + + + +ahriman_core_report->ahriman_core_repository_executor + + + + +ahriman_core_report_email->ahriman_core_report_report + + + + + + +ahriman_core_report_jinja_template->ahriman_core_report_email + + + + + +ahriman_core_report_jinja_template->ahriman_core_report_html + + + + +ahriman_core_report_report->ahriman_core_report_html + + + + + + +ahriman_core_report_report->ahriman_core_repository_executor + + + + +ahriman_core_repository + +ahriman. +core. +repository + + + +ahriman_core_repository->ahriman_application_application + + + + + +ahriman_core_repository->ahriman_core_status_watcher + + + + + +ahriman_core_repository_cleaner + +ahriman. +core. +repository. +cleaner + + + +ahriman_core_repository_cleaner->ahriman_core_repository_executor + + + + + +ahriman_core_repository_update_handler + +ahriman. +core. +repository. +update_handler + + + +ahriman_core_repository_cleaner->ahriman_core_repository_update_handler + + + + + +ahriman_core_repository_repository + +ahriman. +core. +repository. +repository + + + +ahriman_core_repository_executor->ahriman_core_repository_repository + + + + + +ahriman_core_repository_properties->ahriman_core_repository_cleaner + + + + + +ahriman_core_repository_repository->ahriman_application_application + + + + + +ahriman_core_repository_repository->ahriman_core_status_watcher + + + + +ahriman_core_repository_update_handler->ahriman_core_repository_repository + + + + + +ahriman_core_sign + +ahriman. +core. +sign + + + +ahriman_core_sign->ahriman_core_report_jinja_template + + + + +ahriman_core_sign->ahriman_core_repository_properties + + + + + +ahriman_core_sign_gpg->ahriman_core_report_jinja_template + + + + +ahriman_core_sign_gpg->ahriman_core_repository_properties + + + + + +ahriman_core_spawn->ahriman_application_handlers_web + + + + + + +ahriman_core_spawn->ahriman_web_views_base + + + + + +ahriman_core_spawn->ahriman_web_web + + + + +ahriman_core_status + +ahriman. +core. +status + + + +ahriman_core_status->ahriman_application_lock + + + + + + + +ahriman_core_status->ahriman_core_repository_properties + + + + +ahriman_core_status->ahriman_web_views_base + + + + + +ahriman_core_status->ahriman_web_web + + + + + + +ahriman_core_status_client->ahriman_application_lock + + + + + + +ahriman_core_status_client->ahriman_core_repository_properties + + + + + +ahriman_core_status_client->ahriman_core_status_web_client + + + + + + +ahriman_core_status_watcher->ahriman_web_views_base + + + + + + +ahriman_core_status_watcher->ahriman_web_web + + + + +ahriman_core_tree->ahriman_application_application + + + + +ahriman_core_upload + +ahriman. +core. +upload + + + +ahriman_core_upload->ahriman_core_repository_executor + + + + +ahriman_core_upload_rsync->ahriman_core_upload_upload + + + + + + +ahriman_core_upload_upload->ahriman_core_repository_executor + + + + + + + + +ahriman_core_upload_upload->ahriman_core_upload_s3 + + + + + + +ahriman_core_util->ahriman_application_application + + + + + + +ahriman_core_util->ahriman_core_alpm_repo + + + + + +ahriman_core_util->ahriman_core_build_tools_task + + + + + +ahriman_core_util->ahriman_core_report_email + + + + + +ahriman_core_util->ahriman_core_report_jinja_template + + + + + + +ahriman_core_util->ahriman_core_repository_repository + + + + + + + +ahriman_core_util->ahriman_core_sign_gpg + + + + + +ahriman_core_util->ahriman_core_status_web_client + + + + + + +ahriman_core_util->ahriman_core_upload_rsync + + + + + + +ahriman_core_util->ahriman_models_build_status + + + + + +ahriman_core_util->ahriman_models_package + + + + + +ahriman_core_util->ahriman_web_views_index + + + + + +ahriman_models + +ahriman.models + + + +ahriman_models->ahriman_application_ahriman + + + + + +ahriman_models->ahriman_application_application + + + + + + + +ahriman_models->ahriman_application_handlers_create_user + + + + + + + +ahriman_models->ahriman_application_handlers_handler + + + + +ahriman_models->ahriman_application_handlers_remove_unknown + + + + + +ahriman_models->ahriman_application_handlers_setup + + + + + + +ahriman_models->ahriman_application_handlers_status + + + + + + +ahriman_models->ahriman_application_lock + + + + +ahriman_models->ahriman_core_alpm_repo + + + + + +ahriman_models->ahriman_core_auth_auth + + + + + +ahriman_models->ahriman_core_auth_mapping_auth + + + + +ahriman_models->ahriman_core_build_tools_task + + + + + +ahriman_models->ahriman_core_report_email + + + + + +ahriman_models->ahriman_core_report_html + + + + + + +ahriman_models->ahriman_core_report_jinja_template + + + + + +ahriman_models->ahriman_core_report_report + + + + + + +ahriman_models->ahriman_core_repository_executor + + + + +ahriman_models->ahriman_core_repository_properties + + + + +ahriman_models->ahriman_core_repository_repository + + + + + + +ahriman_models->ahriman_core_repository_update_handler + + + + + + +ahriman_models->ahriman_core_sign_gpg + + + + + +ahriman_models->ahriman_core_status_client + + + + + +ahriman_models->ahriman_core_status_watcher + + + + + +ahriman_models->ahriman_core_status_web_client + + + + + + + +ahriman_models->ahriman_core_tree + + + + + + +ahriman_models->ahriman_core_upload_rsync + + + + + + +ahriman_models->ahriman_core_upload_s3 + + + + + +ahriman_models->ahriman_core_upload_upload + + + + + + +ahriman_models->ahriman_web_middlewares_auth_handler + + + + + + +ahriman_web_views_status_ahriman + +ahriman. +web. +views. +status. +ahriman + + + +ahriman_models->ahriman_web_views_status_ahriman + + + + + + +ahriman_models->ahriman_web_views_status_package + + + + + +ahriman_web_views_status_status + +ahriman. +web. +views. +status. +status + + + +ahriman_models->ahriman_web_views_status_status + + + + + +ahriman_models_auth_settings->ahriman_core_auth_auth + + + + + + +ahriman_models_auth_settings->ahriman_core_auth_mapping_auth + + + + +ahriman_models_build_status->ahriman_application_ahriman + + + + + +ahriman_models_build_status->ahriman_application_handlers_status + + + + + + +ahriman_models_build_status->ahriman_application_lock + + + + + +ahriman_models_build_status->ahriman_core_status_client + + + + + +ahriman_models_build_status->ahriman_core_status_watcher + + + + + + + +ahriman_models_build_status->ahriman_core_status_web_client + + + + +ahriman_models_counters + +ahriman. +models. +counters + + + +ahriman_models_build_status->ahriman_models_counters + + + + + +ahriman_models_build_status->ahriman_web_views_status_ahriman + + + + + +ahriman_models_build_status->ahriman_web_views_status_package + + + + + +ahriman_models_internal_status + +ahriman. +models. +internal_status + + + +ahriman_models_counters->ahriman_models_internal_status + + + + + +ahriman_models_counters->ahriman_web_views_status_status + + + + + + +ahriman_models_internal_status->ahriman_core_status_client + + + + + +ahriman_models_internal_status->ahriman_core_status_web_client + + + + + + +ahriman_models_internal_status->ahriman_web_views_status_status + + + + +ahriman_models_package->ahriman_application_application + + + + + +ahriman_models_package->ahriman_application_handlers_remove_unknown + + + + + + +ahriman_models_package->ahriman_application_handlers_status + + + + +ahriman_models_package->ahriman_core_build_tools_task + + + + + + +ahriman_models_package->ahriman_core_report_email + + + + + +ahriman_models_package->ahriman_core_report_html + + + + + + +ahriman_models_package->ahriman_core_report_jinja_template + + + + + + +ahriman_models_package->ahriman_core_report_report + + + + + + +ahriman_models_package->ahriman_core_repository_executor + + + + + + + + +ahriman_models_package->ahriman_core_repository_repository + + + + +ahriman_models_package->ahriman_core_repository_update_handler + + + + + +ahriman_models_package->ahriman_core_status_client + + + + + +ahriman_models_package->ahriman_core_status_watcher + + + + + + + +ahriman_models_package->ahriman_core_status_web_client + + + + +ahriman_models_package->ahriman_core_tree + + + + + +ahriman_models_package->ahriman_core_upload_rsync + + + + + +ahriman_models_package->ahriman_core_upload_s3 + + + + + + + + + +ahriman_models_package->ahriman_core_upload_upload + + + + + + +ahriman_models_package->ahriman_models_counters + + + + + +ahriman_models_package->ahriman_web_views_status_package + + + + + + +ahriman_models_package_description + +ahriman. +models. +package_description + + + +ahriman_models_package_description->ahriman_models_package + + + + + +ahriman_models_report_settings->ahriman_core_report_report + + + + + +ahriman_models_repository_paths + +ahriman. +models. +repository_paths + + + +ahriman_models_repository_paths->ahriman_application_handlers_handler + + + + + + +ahriman_models_repository_paths->ahriman_application_handlers_setup + + + + + +ahriman_models_repository_paths->ahriman_core_alpm_repo + + + + + +ahriman_models_repository_paths->ahriman_core_build_tools_task + + + + + +ahriman_models_repository_paths->ahriman_core_repository_properties + + + + + +ahriman_models_repository_paths->ahriman_models_package + + + + + +ahriman_models_sign_settings->ahriman_application_ahriman + + + + +ahriman_models_sign_settings->ahriman_core_report_jinja_template + + + + + +ahriman_models_sign_settings->ahriman_core_sign_gpg + + + + + +ahriman_models_smtp_ssl_settings + +ahriman. +models. +smtp_ssl_settings + + + +ahriman_models_smtp_ssl_settings->ahriman_core_report_email + + + + + + +ahriman_models_upload_settings->ahriman_core_upload_upload + + + + + + +ahriman_models_user + +ahriman. +models. +user + + + +ahriman_models_user->ahriman_application_handlers_create_user + + + + + + +ahriman_models_user->ahriman_core_auth_mapping_auth + + + + + +ahriman_models_user->ahriman_core_status_web_client + + + + + +ahriman_models_user_access + +ahriman. +models. +user_access + + + +ahriman_models_user_access->ahriman_application_ahriman + + + + + + + + + + +ahriman_models_user_access->ahriman_core_auth_auth + + + + + + +ahriman_models_user_access->ahriman_core_auth_mapping_auth + + + + + +ahriman_models_user_access->ahriman_models_user + + + + + +ahriman_models_user_access->ahriman_web_middlewares_auth_handler + + + + + +ahriman_version + +ahriman. +version + + + +ahriman_version->ahriman_application_ahriman + + + + + +ahriman_version->ahriman_application_lock + + + + + +ahriman_version->ahriman_web_views_index + + + + + +ahriman_version->ahriman_web_views_status_status + + + + + + +ahriman_web + +ahriman.web + + + +ahriman_web->ahriman_application_handlers_web + + + + +ahriman_web_middlewares + +ahriman. +web. +middlewares + + + +ahriman_web_middlewares->ahriman_web_web + + + + + +ahriman_web_middlewares_auth_handler->ahriman_web_web + + + + +ahriman_web_middlewares_exception_handler + +ahriman. +web. +middlewares. +exception_handler + + + +ahriman_web_middlewares_exception_handler->ahriman_web_web + + + + + + +ahriman_web_routes + +ahriman. +web. +routes + + + +ahriman_web_routes->ahriman_web_web + + + + + +ahriman_web_views + +ahriman. +web. +views + + + +ahriman_web_views->ahriman_web_routes + + + + + +ahriman_web_views_base->ahriman_web_views_index + + + + + +ahriman_web_views_service_add + +ahriman. +web. +views. +service. +add + + + +ahriman_web_views_base->ahriman_web_views_service_add + + + + + +ahriman_web_views_service_remove + +ahriman. +web. +views. +service. +remove + + + +ahriman_web_views_base->ahriman_web_views_service_remove + + + + + +ahriman_web_views_service_search + +ahriman. +web. +views. +service. +search + + + +ahriman_web_views_base->ahriman_web_views_service_search + + + + + +ahriman_web_views_base->ahriman_web_views_status_ahriman + + + + + +ahriman_web_views_base->ahriman_web_views_status_package + + + + + +ahriman_web_views_status_packages + +ahriman. +web. +views. +status. +packages + + + +ahriman_web_views_base->ahriman_web_views_status_packages + + + + + +ahriman_web_views_base->ahriman_web_views_status_status + + + + + +ahriman_web_views_base->ahriman_web_views_user_login + + + + + +ahriman_web_views_base->ahriman_web_views_user_logout + + + + + +ahriman_web_views_index->ahriman_web_routes + + + + +ahriman_web_views_service + +ahriman. +web. +views. +service + + + +ahriman_web_views_service->ahriman_web_routes + + + + + + +ahriman_web_views_service_add->ahriman_web_routes + + + + +ahriman_web_views_service_remove->ahriman_web_routes + + + + +ahriman_web_views_service_search->ahriman_web_routes + + + + +ahriman_web_views_status + +ahriman. +web. +views. +status + + + +ahriman_web_views_status->ahriman_web_routes + + + + +ahriman_web_views_status_ahriman->ahriman_web_routes + + + + +ahriman_web_views_status_package->ahriman_web_routes + + + + + + +ahriman_web_views_status_packages->ahriman_web_routes + + + + +ahriman_web_views_status_status->ahriman_web_routes + + + + + +ahriman_web_views_user + +ahriman. +web. +views. +user + + + +ahriman_web_views_user->ahriman_web_routes + + + + +ahriman_web_views_user_login->ahriman_web_routes + + + + +ahriman_web_views_user_logout->ahriman_web_routes + + + + +ahriman_web_web->ahriman_application_handlers_web + + + + + +aiohttp + +aiohttp + + + +aiohttp->ahriman_web_middlewares + + + + + + +aiohttp->ahriman_web_middlewares_auth_handler + + + + +aiohttp->ahriman_web_middlewares_exception_handler + + + + + +aiohttp->ahriman_web_routes + + + + + + + +aiohttp->ahriman_web_views_base + + + + +aiohttp->ahriman_web_views_service_add + + + + + + +aiohttp->ahriman_web_views_service_remove + + + + + +aiohttp->ahriman_web_views_service_search + + + + + +aiohttp->ahriman_web_views_status_ahriman + + + + + +aiohttp->ahriman_web_views_status_package + + + + + + + +aiohttp->ahriman_web_views_status_packages + + + + + +aiohttp->ahriman_web_views_status_status + + + + + + +aiohttp->ahriman_web_views_user_login + + + + + + +aiohttp->ahriman_web_views_user_logout + + + + + +aiohttp->ahriman_web_web + + + + + +aiohttpjinja2 + +aiohttpjinja2 + + + +aiohttp->aiohttpjinja2 + + + + + +aiohttpsession + +aiohttpsession + + + +aiohttp->aiohttpsession + + + + + + +aiohttpjinja2->ahriman_web_views_index + + + + + + +aiohttpjinja2->ahriman_web_web + + + + +aiohttpsecurity + +aiohttpsecurity + + + +aiohttpsecurity->ahriman_core_auth_helpers + + + + + +aiohttpsecurity->ahriman_web_middlewares_auth_handler + + + + + +aiohttpsession->ahriman_web_middlewares_auth_handler + + + + +aur + +aur + + + +aur->ahriman_application_handlers_search + + + + + + +aur->ahriman_models_package + + + + + + +aur->ahriman_web_views_service_search + + + + + + +boto3 + +boto3 + + + +boto3->ahriman_core_upload_s3 + + + + +cryptography + +cryptography + + + +cryptography->ahriman_web_middlewares_auth_handler + + + + + + +cryptography->aiohttpsession + + + + + +requests + +requests + + + +cryptography->requests + + + + + +jinja2 + +jinja2 + + + +jinja2->ahriman_core_report_jinja_template + + + + + +jinja2->ahriman_web_web + + + + + + +jinja2->aiohttpjinja2 + + + + + +passlib + +passlib + + + +passlib->ahriman_models_user + + + + + +pyalpm + +pyalpm + + + +pyalpm->ahriman_core_alpm_pacman + + + + + +pyalpm->ahriman_models_package + + + + + + +pyalpm->ahriman_models_package_description + + + + + + +requests->ahriman_core_sign_gpg + + + + + +requests->ahriman_core_status_web_client + + + + + + +requests->ahriman_core_util + + + + + +requests->aur + + + + + + +srcinfo + +srcinfo + + + +srcinfo->ahriman_models_package + + + + diff --git a/docs/architecture.md b/docs/architecture.md new file mode 100644 index 00000000..cba25b8d --- /dev/null +++ b/docs/architecture.md @@ -0,0 +1,157 @@ +# Package structure + +Packages have strict rules of importing: + +* `ahriman.application` package must not be used anywhere except for itself. +* `ahriman.core` and `ahriman.models` packages don't have any import restriction. Actually we would like to totally restrict importing of `core` package from `models`, but it is impossible at the moment. +* `ahriman.web` package is allowed to be imported from `ahriman.application` (web handler only, only `ahriman.web.web` methods). It also must not be imported globally, only local import is allowed. + +Full dependency diagram: + +![architecture](ahriman-architecture.svg) + +## `ahriman.application` package + +This package contains application (aka executable) related classes and everything for that. It also contains package called `ahriman.application.handlers` in which all available subcommands are described as separated classes derived from base `ahriman.application.handlers.handler.Handler` class. `ahriman.application.ahriman` contains only command line parses and executes specified `Handler` on success, `ahriman.application.application.Application` is a god class which provides interfaces for all repository related actions. `ahriman.application.lock.Lock` is additional class which provides file-based lock and also performs some common checks. + +## `ahriman.core` package + +This package contains everything which is required for any time of application run and separated to several packages: + +* `ahriman.core.alpm` package controls pacman related functions. It provides wrappers for `pyalpm` library and safe calls for repository tools (`repo-add` and `repo-remove`). +* `ahriman.core.auth` package provides classes for authorization methods used by web mostly. Base class is `ahriman.core.auth.auth.Auth` which must be called by `load` method. +* `ahriman.core.build_tools` is a package which provides wrapper for `devtools` commands. +* `ahriman.core.report` is a package with reporting classes. Usually it must be called by `ahriman.core.report.report.Report.load` method. +* `ahriman.core.repository` contains several traits and base repository (`ahriman.core.repository.repository.Repository` class) implementation. +* `ahriman.core.sign` package provides sign feature (only gpg calls are available). +* `ahriman.core.status` contains helpers and watcher class which are required for web application. Reporter must be initialized by using `ahriman.core.status.client.Client.load` method. +* `ahriman.core.upload` package provides sync feature, must be called by `ahriman.core.upload.upload.Upload.load` method. + +This package also provides some generic functions and classes which may be used by other packages: + +* `ahriman.core.configuration.Configuration` is an extension for standard `configparser` library. +* `ahriman.core.exceptions` provides custom exceptions. +* `ahriman.core.spawn.Spawn` is a tool which can spawn another `ahriman` process. This feature is used by web application. +* `ahriman.core.tree` is a dependency tree implementation. + +## `ahriman.models` package + +It provides models for any other part of application. Unlike `ahriman.core` package classes from here provides only conversion methods (e.g. create class from another or convert to). Mostly case classes and enumerations. + +## `ahriman.web` package + +Web application. It is important that this package is isolated from any other to allow it to be optional feature (i.e. dependencies which are required by the package are optional). + +* `ahriman.web.middlewares` provides middlewares for request handlers. +* `ahriman.web.views` contains web views derived from aiohttp view class. +* `ahriman.web.routes` creates routes for web application. +* `ahriman.web.web` provides main web application functions (e.g. start, initialization). + +# Application run + +* Parse command line arguments, find command and related handler which is set by parser. +* Call `Handler.execute` method. +* Define list of architectures to run. In case if there is more than one architecture specified run several subprocesses or process in current process otherwise. Class attribute `ALLOW_MULTI_ARCHITECTURE_RUN` controls whether application can be run in multiple processes or not - this feature is required for some handlers (e.g. `Web`) which should be able to spawn child process in daemon mode (it is impossible to do for daemonic processes). +* In each child process call lock functions. +* After success checks pass control to `Handler.run` method defined by specific handler class. +* Return result (success or failure) of each subprocess and exit from application. + +In most cases handlers spawn god class `ahriman.application.application.Application` class and call required methods. + +Application is designed to run from `systemd` services and provides parametrized by architecture timer and service file for that. + +# Basic flows + +## Add new packages or rebuild existing + +Idea is to copy package to the directory from which it will be handled at the next update run. Different variants are supported: + +* If supplied argument is file then application moves the file to the directory with built packages. Same rule applies for directory, but in this case it copies every package-like file from the specified directory. +* If supplied argument iis not file then application tries to lookup for the specified name in AUR and clones it into the directory with manual updates. This scenario can also handle package dependencies which are missing in repositories. + +## Rebuild packages + +Same as add function for every package in repository. Optional filter by reverse dependency can be supplied. + +## Remove packages + +This flow removes package from filesystem, updates repository database and also runs synchronization and reporting methods. + +## Update packages + +This feature is divided into to stages: check AUR for updates and run rebuild for required packages. Whereas check does not do anything except for check itself, update flow is the following: + +1. Process every built package first. Those packages are usually added manually. +2. Run sync and report methods. +3. Generate dependency tree for packages to be built. +4. For each level of tree it does: + 1. Download package data from AUR. + 2. Build every package in clean chroot. + 3. Sign packages if required. + 4. Add packages to database and sign database if required. + 5. Process sync and report methods. + +After any step any package data is being removed. + +# Core functions reference + +## Configuration + +`ahriman.core.configuration.Configuration` class provides some additional methods (e.g. `getpath` and `getlist`) and also combines multiple files into single configuration dictionary using architecture overrides. It is recommended to read class related settings from the class, not outside. + +## Utils + +For every external command run (which is actually not recommended if possible) custom wrapper for `subprocess` is used. Additional functions `ahriman.core.auth.helpers` provide safe calls for `aiohttp_security` methods and are required to make this dependency optional. + +## Submodules + +Some packages provide different behaviour depending on configuration settings. In this cases inheritance is used and recommended way to deal with them is to call class method `load` from base classes. + +## Additional features + +Some features require optional dependencies to be installed: + +* Version control executables (e.g. `git`, `svn`) for VCS packages. +* `gnupg` application for package and repository sign feature. +* `rsync` application for rsync based repository sync. +* `boto3` python package for `S3` sync. +* `Jinja2` python package for HTML report generation (it is also used by web application). + +# Web application + +Web application requires the following python packages to be installed: + +* Core part requires `aiohttp` (application itself), `aiohttp_jinja2` and `Jinja2` (HTML generation from templates). +* In addition authorization feature requires `aiohttp_security`, `aiohttp_session` and `cryptography`. + +## Middlewares + +Service provides some custom middlewares, e.g. logging every exception (except for user ones) and user authorization. + +## Web views + +All web views are defined in separated package and derived from `ahriman.web.views.base.Base` class which provides typed interfaces for web application. + +REST API supports both form and JSON data, but the last one is recommended. + +Different APIs are separated into different packages: + +* `ahriman.web.views.service` provides views for application controls. +* `ahriman.web.views.status` package provides REST API for application reporting. +* `ahriman.web.views.user` package provides login and logout methods which can be called without authorization. + +## Templating + +Package provides base jinja templates which can be overridden by settings. Vanilla templates are actively using bootstrap library. + +## Requests and scopes + +Service provides optional authorization which can be turned on in settings. In order to control user access there are two levels of authorization - read-only (only GET-like requests) and write (anything). + +If this feature is configured any request except for whitelisted will be prohibited without authentication. In addition, configuration flag `auth.allow_read_only` can be used in order to allow seeing main page without authorization (this page is in default white list). + +For authorized users it uses encrypted session cookies to store tokens; encryption key is generated each time at the start of the application. + +## External calls + +Web application provides external calls to control main service. It spawns child process with specific arguments and waits for its termination. This feature must be used either with authorization or in safe (i.e. when status page is not available world-wide) environment. diff --git a/CONFIGURING.md b/docs/configuration.md similarity index 99% rename from CONFIGURING.md rename to docs/configuration.md index 45f311cf..4d113643 100644 --- a/CONFIGURING.md +++ b/docs/configuration.md @@ -23,7 +23,7 @@ libalpm and AUR related configuration. Base authorization settings. * `target` - specifies authorization provider, string, optional, default `disabled`. Allowed values are `disabled`, `configuration`. -* `allow_read_only` - allow to request read only pages without authorization, boolean, required. +* `allow_read_only` - allow requesting read only pages without authorization, boolean, required. * `allowed_paths` - URI paths (exact match) which can be accessed without authorization, space separated list of strings, optional. * `allowed_paths_groups` - URI paths prefixes which can be accessed without authorization, space separated list of strings, optional. * `salt` - password hash salt, string, required in case if authorization enabled (automatically generated by `create-user` subcommand). diff --git a/docs/setup.md b/docs/setup.md new file mode 100644 index 00000000..b302d977 --- /dev/null +++ b/docs/setup.md @@ -0,0 +1,60 @@ +# Setup instructions + +1. Install package as usual. +2. Change settings if required, see [configuration reference](configuration.md) for more details. +3. Create `/var/lib/ahriman/.makepkg.conf` with `makepkg.conf` overrides if required (at least you might want to set `PACKAGER`): + + ```shell + echo 'PACKAGER="John Doe "' | sudo -u ahriman tee -a /var/lib/ahriman/.makepkg.conf + ``` + +4. Configure build tools (it is required for correct dependency management system): + + 1. Create build command, e.g. `ln -s /usr/bin/archbuild /usr/local/bin/ahriman-x86_64-build` (you can choose any name for command, basically it should be `{name}-{arch}-build`). + 2. Create configuration file, e.g. `cp /usr/share/devtools/pacman-{extra,ahriman}.conf` (same as previous `pacman-{name}.conf`). + 3. Change configuration file, add your own repository, add multilib repository etc; + 4. Set `build_command` option to point to your command. + 5. Configure `/etc/sudoers.d/ahriman` to allow running command without a password. + + ```shell + ln -s /usr/bin/archbuild /usr/local/bin/ahriman-x86_64-build + cp /usr/share/devtools/pacman-{extra,ahriman}.conf + + echo '[multilib]' | tee -a /usr/share/devtools/pacman-ahriman.conf + echo 'Include = /etc/pacman.d/mirrorlist' | tee -a /usr/share/devtools/pacman-ahriman.conf + + echo '[aur-clone]' | tee -a /usr/share/devtools/pacman-ahriman.conf + echo 'SigLevel = Optional TrustAll' | tee -a /usr/share/devtools/pacman-ahriman.conf + echo 'Server = file:///var/lib/ahriman/repository/$arch' | tee -a /usr/share/devtools/pacman-ahriman.conf + + echo '[build]' | tee -a /etc/ahriman.ini.d/build.ini + echo 'build_command = ahriman-x86_64-build' | tee -a /etc/ahriman.ini.d/build.ini + + echo 'Cmnd_Alias CARCHBUILD_CMD = /usr/local/bin/ahriman-x86_64-build *' | tee -a /etc/sudoers.d/ahriman + echo 'ahriman ALL=(ALL) NOPASSWD: CARCHBUILD_CMD' | tee -a /etc/sudoers.d/ahriman + chmod 400 /etc/sudoers.d/ahriman + ``` + +5. Start and enable `ahriman@.timer` via `systemctl`: + + ```shell + systemctl enable --now ahriman@x86_64.timer + ``` + +6. Start and enable status page: + + ```shell + systemctl enable --now ahriman-web@x86_64 + ``` + +7. Add packages by using `ahriman add {package}` command: + + ```shell + sudo -u ahriman ahriman -a x86_64 add yay --now + ``` + +Note that initial service configuration can be done by running `ahriman setup` with specific arguments. + +## User creation + +`create-user` subcommand is recommended for new user creation. \ No newline at end of file diff --git a/setup.py b/setup.py index a1ec1fef..4104b16f 100644 --- a/setup.py +++ b/setup.py @@ -106,7 +106,6 @@ setup( "aiohttp_session", "aiohttp_security", "cryptography", - "passlib", ], }, ) diff --git a/web.png b/web.png new file mode 100644 index 0000000000000000000000000000000000000000..8c2a52014bb5b5811929457982053cd68aef2b08 GIT binary patch literal 89280 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

@BWHr>25k7MAj=kM)@?NM`Z6{s{1sGWX&9 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
UD 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 literal 0 HcmV?d00001