diff --git a/README.md b/README.md index 87da3c1..514991b 100644 --- a/README.md +++ b/README.md @@ -18,12 +18,23 @@ If you don't have YunoHost, please consult [the guide](https://yunohost.org/#/in COIN is an Information System designed for associative ISPs in the FFDN. +### Features -**Shipped version:** 20220401~ynh1 +- Provide a nice, clean UI for members +- Manage memberships +- Handle service requests for VPN, VPS, Housing, external accounts, etc, + - including IP pools management + - custom hooks can be added to interface with the actual infrastructure and provision services from the admin + - members can get status info regarding their services + - handle invoices, send reminders, import payment from bank, derive a member balance +- Optional features: mailing list, hardware provisionning + + +**Shipped version:** 20231216~ynh1 ## Screenshots -![Screenshot of Coin](./doc/screenshots/user-subscriptions.png) +![Screenshot of Coin](./doc/screenshots/screenshot.png) ## Documentation and resources diff --git a/README_fr.md b/README_fr.md index c5cb7cc..5030b68 100644 --- a/README_fr.md +++ b/README_fr.md @@ -16,14 +16,25 @@ Si vous n’avez pas YunoHost, regardez [ici](https://yunohost.org/#/install) po ## Vue d’ensemble -COIN is an Information System designed for associative ISPs in the FFDN. +COIN est un système d'information pour FAI associatif dans la FFDN + +### Fonctionnalités + +- Fourni une interface pour les membres +- Gestion des adhésions +- Gestion des demandes de services tels que VPN, VPS, Housing, compte externe, etc ... + - gestion des pools d'IP + - des hooks peuvent être ajoutés à l'interface pour s'interfacer avec la "vraie" infra et provisionner les services depuis l'admin + - les membres peuvent voir le status et infos de leurs services depuis leur espace + - gestion des factures, des rappels, import des paiements de la banque, calcul de solde +- Optionnel : gestion de mailing liste, prêt de matériel -**Version incluse :** 20220401~ynh1 +**Version incluse :** 20231216~ynh1 ## Captures d’écran -![Capture d’écran de Coin](./doc/screenshots/user-subscriptions.png) +![Capture d’écran de Coin](./doc/screenshots/screenshot.png) ## Documentations et ressources diff --git a/check_process b/check_process deleted file mode 100644 index 894a568..0000000 --- a/check_process +++ /dev/null @@ -1,25 +0,0 @@ -;; Test complet sans multisite - auto_remove=1 - ; Manifest - domain="domain.tld" - admin="john" - email="john@example.com" - isp_name="ARN" - isp_site="https://arn-fai.net" - ; Checks - pkg_linter=1 - setup_sub_dir=0 - setup_root=1 - setup_nourl=0 - setup_private=0 - setup_public=0 - upgrade=1 - # 20200630~ynh1 - #upgrade=1 from_commit=41916dc245ca37d999782cc2bc46a3a6ea9fa1c8 - backup_restore=1 - multi_instance=0 - port_already_use=0 - change_url=0 -;;; Options -Email= -Notification=none diff --git a/conf/app.src b/conf/app.src deleted file mode 100644 index be1a359..0000000 --- a/conf/app.src +++ /dev/null @@ -1,7 +0,0 @@ -SOURCE_URL=https://code.ffdn.org/ffdn/coin/-/archive/afcf0846f939e80f34956d5f24f7bdd6a5058282/coin-afcf0846f939e80f34956d5f24f7bdd6a5058282.tar.gz -SOURCE_SUM=71a2570a7f145ae826042853f7af2dff46350ef70f83698871b14fa7f9884219 -SOURCE_SUM_PRG=sha256sum -SOURCE_FORMAT=tar.gz -SOURCE_IN_SUBDIR=true -SOURCE_FILENAME= -SOURCE_EXTRACT=true diff --git a/conf/gunicorn.service b/conf/gunicorn.service deleted file mode 100644 index 87ba5fa..0000000 --- a/conf/gunicorn.service +++ /dev/null @@ -1,16 +0,0 @@ -[Unit] -Description=YNH_APP_INSTANCE_NAME gunicorn daemon -After=network.target - -[Service] -PIDFile=/run/gunicorn/YNH_APP_INSTANCE_NAME-pid -User=YNH_APP_INSTANCE_NAME -Group=www-data -WorkingDirectory=/opt/YNH_APP_INSTANCE_NAME -ExecStart=__YNH_PYTHON_PATH__/gunicorn -c /opt/YNH_APP_INSTANCE_NAME/gunicorn_config.py YNH_APP_INSTANCE_NAME.wsgi -ExecReload=/bin/kill -s HUP $MAINPID -ExecStop=/bin/kill -s TERM $MAINPID -PrivateTmp=true - -[Install] -WantedBy=multi-user.target diff --git a/conf/gunicorn_config.py b/conf/gunicorn_config.py index d1c2a5d..bb99fbc 100644 --- a/conf/gunicorn_config.py +++ b/conf/gunicorn_config.py @@ -1,11 +1,11 @@ -command = '__YNH_PYTHON_PATH__/gunicorn' -pythonpath = '/opt/__APP__' -workers = 4 -user = '__APP__' -bind = 'unix:/opt/__APP__/sock' -pid = '/run/gunicorn/__APP__-pid' -errorlog = '/var/log/__APP__/error.log' -accesslog = '/var/log/__APP__/access.log' -access_log_format = '%({X-Real-IP}i)s %({X-Forwarded-For}i)s %(h)s %(l)s %(u)s %(t)s "%(r)s" %(s)s %(b)s "%(f)s" "%(a)s"' -loglevel = 'warning' -capture_output = True +command = '__INSTALL_DIR/venv/bin/gunicorn' +pythonpath = '__INSTALL_DIR__' +workers = 4 +user = '__APP__' +bind = 'unix:__INSTALL_DIR__/sock' +pid = '/run/gunicorn/__APP__-pid' +errorlog = '/var/log/__APP__/error.log' +accesslog = '/var/log/__APP__/access.log' +access_log_format = '%({X-Real-IP}i)s %({X-Forwarded-For}i)s %(h)s %(l)s %(u)s %(t)s "%(r)s" %(s)s %(b)s "%(f)s" "%(a)s"' +loglevel = 'warning' +capture_output = True diff --git a/conf/local.py b/conf/local.py deleted file mode 100644 index c129bc4..0000000 --- a/conf/local.py +++ /dev/null @@ -1,94 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals -import os -from settings_base import * - -DEBUG = TEMPLATE_DEBUG = False - -ALLOWED_HOSTS = ['YNH_APP_ARG_DOMAIN'] - -URL_PREFIX = 'YNH_APP_PREFIX' -STATIC_ROOT = 'YNH_APP_STATIC_ROOT' -NOTIFICATION_EMAILS = ['YNH_APP_ARG_EMAIL'] -DEFAULT_FROM_EMAIL = 'notifier@YNH_APP_ARG_DOMAIN' -SITE_URL = "https://YNH_APP_ARG_DOMAINYNH_APP_ARG_PATH" -SECRET_KEY = 'YNH_APP_SECRET_KEY' -ISP = { - 'NAME' : 'YNH_APP_ARG_ISP_NAME', - 'SITE' : 'YNH_APP_ARG_ISP_SITE', - 'EMAIL' : 'YNH_APP_ARG_EMAIL', -} -SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https') - -PROJECT_DIR = os.path.abspath(os.path.dirname(__file__)) - -DATABASES = { - 'default': { - 'ENGINE': 'django.db.backends.postgresql_psycopg2', - 'NAME': 'YNH_DB_NAME', - 'USER': 'YNH_DB_USER', - 'PASSWORD': 'YNH_DB_PASSWORD', - 'HOST': '', # Empty for localhost through domain sockets - 'PORT': '', # Empty for default - }, -} - -FEEDS = (('isp', 'http://www.illyse.net/feed/', 3), - ('ffdn', 'http://www.ffdn.org/fr/rss.xml', 3)) - - - - - - - - - - - - - - - - - - - - - -# Tous accés -# paramétrer SSO en protect_uris -# OU -# Pas d'accès -# hook -# paramétrer SSO en protect_uris -import ldap -from django_auth_ldap.config import LDAPSearch, PosixGroupType -AUTHENTICATION_BACKENDS = ( - 'django_auth_ldap.backend.LDAPBackend', - 'django.contrib.auth.backends.ModelBackend', -) -AUTH_LDAP_SERVER_URI = "ldap://localhost:389" -AUTH_LDAP_USER_SEARCH = LDAPSearch("uid=YNH_APP_ARG_ADMIN,ou=users,dc=yunohost,dc=org", ldap.SCOPE_SUBTREE, "(uid=%(user)s)") -AUTH_LDAP_USER_ATTR_MAP = { - "username": "uid", - "first_name": "givenName", - "last_name": "sn", - "email": "mail", -} -AUTH_LDAP_USER_FLAGS_BY_GROUP = { - "is_active": "cn=sftpusers,ou=groups,dc=yunohost,dc=org", - "is_staff": "cn=sftpusers,ou=groups,dc=yunohost,dc=org", - "is_superuser": "cn=sftpusers,ou=groups,dc=yunohost,dc=org" -} -AUTH_LDAP_GROUP_SEARCH = LDAPSearch("ou=groups,dc=yunohost,dc=org", ldap.SCOPE_SUBTREE, "(objectClass=posixGroup)") -AUTH_LDAP_GROUP_TYPE = PosixGroupType() -AUTH_LDAP_ALWAYS_UPDATE_USER = True -AUTH_LDAP_AUTHORIZE_ALL_USERS = True -AUTH_LDAP_FIND_GROUP_PERMS = True -#AUTH_LDAP_CACHE_GROUPS = True -#AUTH_LDAP_GROUP_CACHE_TIMEOUT = 300 -#import logging -#logger = logging.getLogger('django_auth_ldap') -#logger.addHandler(logging.StreamHandler()) -#logger.setLevel(logging.DEBUG) diff --git a/conf/local.py.j2 b/conf/local.py.j2 index b260fee..477fd56 100644 --- a/conf/local.py.j2 +++ b/conf/local.py.j2 @@ -1,17 +1,17 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals import os -from settings_base import * +from .settings_base import * DEBUG = TEMPLATE_DEBUG = False ALLOWED_HOSTS = ['{{ domain }}'] URL_PREFIX = '{{ prefix }}' -STATIC_ROOT = '{{ final_path }}/static' +STATIC_ROOT = '{{ install_dir }}/static' NOTIFICATION_EMAILS = ['{{ email }}'] DEFAULT_FROM_EMAIL = 'notifier@{{ domain }}' -SITE_URL = "https://{{ domain }}{{ path_url }}" +SITE_URL = "https://{{ domain }}{{ path }}" SECRET_KEY = '{{ secret }}' ISP = { 'NAME': '{{ isp_name }}', @@ -37,57 +37,39 @@ FEEDS = (('ffdn', 'http://www.ffdn.org/fr/rss.xml', 3),) - - - - - - - - - - - - - - - - - - -# Tous acces -# parametrer SSO en protect_uris -# OU -# Pas d'acces -# hook -# parametrer SSO en protect_uris -import ldap -from django_auth_ldap.config import LDAPSearch, PosixGroupType -AUTHENTICATION_BACKENDS = ( - 'django_auth_ldap.backend.LDAPBackend', - 'django.contrib.auth.backends.ModelBackend', -) -AUTH_LDAP_SERVER_URI = "ldap://localhost:389" -AUTH_LDAP_USER_SEARCH = LDAPSearch("uid={{ admin }},ou=users,dc=yunohost,dc=org", ldap.SCOPE_SUBTREE, "(uid=%(user)s)") -AUTH_LDAP_USER_ATTR_MAP = { - "username": "uid", - "first_name": "givenName", - "last_name": "sn", - "email": "mail", -} -AUTH_LDAP_USER_FLAGS_BY_GROUP = { - "is_active": "cn=sftpusers,ou=groups,dc=yunohost,dc=org", - "is_staff": "cn=sftpusers,ou=groups,dc=yunohost,dc=org", - "is_superuser": "cn=sftpusers,ou=groups,dc=yunohost,dc=org" -} -AUTH_LDAP_GROUP_SEARCH = LDAPSearch("ou=groups,dc=yunohost,dc=org", ldap.SCOPE_SUBTREE, "(objectClass=posixGroup)") -AUTH_LDAP_GROUP_TYPE = PosixGroupType() -AUTH_LDAP_ALWAYS_UPDATE_USER = True -AUTH_LDAP_AUTHORIZE_ALL_USERS = True -AUTH_LDAP_FIND_GROUP_PERMS = True -#AUTH_LDAP_CACHE_GROUPS = True -#AUTH_LDAP_GROUP_CACHE_TIMEOUT = 300 -#import logging -#logger = logging.getLogger('django_auth_ldap') -#logger.addHandler(logging.StreamHandler()) -#logger.setLevel(logging.DEBUG) +# # Tous acces +# # parametrer SSO en protect_uris +# # OU +# # Pas d'acces +# # hook +# # parametrer SSO en protect_uris +# import ldap +# from django_auth_ldap.config import LDAPSearch, PosixGroupType +# AUTHENTICATION_BACKENDS = ( +# 'django_auth_ldap.backend.LDAPBackend', +# 'django.contrib.auth.backends.ModelBackend', +# ) +# AUTH_LDAP_SERVER_URI = "ldap://localhost:389" +# AUTH_LDAP_USER_SEARCH = LDAPSearch("uid={{ admin }},ou=users,dc=yunohost,dc=org", ldap.SCOPE_SUBTREE, "(uid=%(user)s)") +# AUTH_LDAP_USER_ATTR_MAP = { +# "username": "uid", +# "first_name": "givenName", +# "last_name": "sn", +# "email": "mail", +# } +# AUTH_LDAP_USER_FLAGS_BY_GROUP = { +# "is_active": "cn=sftpusers,ou=groups,dc=yunohost,dc=org", +# "is_staff": "cn=sftpusers,ou=groups,dc=yunohost,dc=org", +# "is_superuser": "cn=sftpusers,ou=groups,dc=yunohost,dc=org" +# } +# AUTH_LDAP_GROUP_SEARCH = LDAPSearch("ou=groups,dc=yunohost,dc=org", ldap.SCOPE_SUBTREE, "(objectClass=posixGroup)") +# AUTH_LDAP_GROUP_TYPE = PosixGroupType() +# AUTH_LDAP_ALWAYS_UPDATE_USER = True +# AUTH_LDAP_AUTHORIZE_ALL_USERS = True +# AUTH_LDAP_FIND_GROUP_PERMS = True +# #AUTH_LDAP_CACHE_GROUPS = True +# #AUTH_LDAP_GROUP_CACHE_TIMEOUT = 300 +# #import logging +# #logger = logging.getLogger('django_auth_ldap') +# #logger.addHandler(logging.StreamHandler()) +# #logger.setLevel(logging.DEBUG) diff --git a/conf/nginx.conf b/conf/nginx.conf index 6f929db..2ee1541 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -5,19 +5,19 @@ location __PATH__/ { location __PATH__/protected/ { internal; - alias __FINALPATH__/__NAME__/smedia/; + alias __INSTALL_DIR__/__NAME__/smedia/; } location __PATH__/media/ { - alias __FINALPATH__/media/; + alias __INSTALL_DIR__/media/; } location __PATH__/static/ { - alias __FINALPATH__/static/; + alias __INSTALL_DIR__/static/; } location __PATH__/assets/ { - alias __FINALPATH__/static/; + alias __INSTALL_DIR__/static/; } location @__NAME__ { @@ -25,5 +25,5 @@ location @__NAME__ { proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; - proxy_pass http://unix:__FINALPATH__/sock; + proxy_pass http://unix:__INSTALL_DIR__/sock; } diff --git a/conf/systemd.service b/conf/systemd.service index 3e1d373..9179d0e 100644 --- a/conf/systemd.service +++ b/conf/systemd.service @@ -1,16 +1,16 @@ -[Unit] -Description=__APP__ gunicorn daemon -After=network.target - -[Service] -PIDFile=/run/gunicorn/__APP__-pid -User=__APP__ -Group=__APP__ -WorkingDirectory=__FINALPATH__/ -ExecStart=__YNH_PYTHON_PATH__/gunicorn -c __FINALPATH__/gunicorn_config.py __APP__.wsgi -ExecReload=/bin/kill -s HUP $MAINPID -ExecStop=/bin/kill -s TERM $MAINPID -PrivateTmp=true - -[Install] -WantedBy=multi-user.target +[Unit] +Description=__APP__ gunicorn daemon +After=network.target + +[Service] +PIDFile=/run/gunicorn/__APP__-pid +User=__APP__ +Group=__APP__ +WorkingDirectory=__INSTALL_DIR__/ +ExecStart=__INSTALL_DIR__/venv/bin/gunicorn -c __INSTALL_DIR__/gunicorn_config.py __APP__.wsgi +ExecReload=/bin/kill -s HUP $MAINPID +ExecStop=/bin/kill -s TERM $MAINPID +PrivateTmp=true + +[Install] +WantedBy=multi-user.target diff --git a/doc/DESCRIPTION.md b/doc/DESCRIPTION.md index cf72c40..b3c9380 100644 --- a/doc/DESCRIPTION.md +++ b/doc/DESCRIPTION.md @@ -1 +1,12 @@ COIN is an Information System designed for associative ISPs in the FFDN. + +### Features + +- Provide a nice, clean UI for members +- Manage memberships +- Handle service requests for VPN, VPS, Housing, external accounts, etc, + - including IP pools management + - custom hooks can be added to interface with the actual infrastructure and provision services from the admin + - members can get status info regarding their services + - handle invoices, send reminders, import payment from bank, derive a member balance +- Optional features: mailing list, hardware provisionning diff --git a/doc/DESCRIPTION_fr.md b/doc/DESCRIPTION_fr.md new file mode 100644 index 0000000..61ef12f --- /dev/null +++ b/doc/DESCRIPTION_fr.md @@ -0,0 +1,12 @@ +COIN est un système d'information pour FAI associatif dans la FFDN + +### Fonctionnalités + +- Fourni une interface pour les membres +- Gestion des adhésions +- Gestion des demandes de services tels que VPN, VPS, Housing, compte externe, etc ... + - gestion des pools d'IP + - des hooks peuvent être ajoutés à l'interface pour s'interfacer avec la "vraie" infra et provisionner les services depuis l'admin + - les membres peuvent voir le status et infos de leurs services depuis leur espace + - gestion des factures, des rappels, import des paiements de la banque, calcul de solde +- Optionnel : gestion de mailing liste, prêt de matériel diff --git a/doc/DISCLAIMER.md b/doc/DISCLAIMER.md deleted file mode 100644 index e69de29..0000000 diff --git a/doc/screenshots/screenshot.png b/doc/screenshots/screenshot.png new file mode 100644 index 0000000..2be03eb Binary files /dev/null and b/doc/screenshots/screenshot.png differ diff --git a/doc/screenshots/user-subscriptions.png b/doc/screenshots/user-subscriptions.png deleted file mode 100644 index f03a2a6..0000000 Binary files a/doc/screenshots/user-subscriptions.png and /dev/null differ diff --git a/manifest.json b/manifest.json deleted file mode 100644 index a5154dc..0000000 --- a/manifest.json +++ /dev/null @@ -1,68 +0,0 @@ -{ - "name": "Coin", - "id": "coin", - "packaging_format": 1, - "description": { - "en": "Member dashboard for non profit isp.", - "fr": "Coin est un Outil pour un Internet Neutre." - }, - "version": "20220401~ynh1", - "url": "https://code.ffdn.org/FFDN/coin/", - "upstream": { - "license": "AGPL-3.0-or-later", - "website": "https://code.ffdn.org/FFDN/coin", - "code": "https://code.ffdn.org/ffdn/coin" - }, - "license": "AGPL-3.0-or-later", - "maintainer": { - "name": "ljf", - "email": "ljf+coin_ynh@grimaud.me", - "url": "https://www.arn-fai.net" - }, - "requirements": { - "yunohost": ">= 11.0.0" - }, - "multi_instance": true, - "services": [ - "nginx" - ], - "arguments": { - "install": [ - { - "name": "domain", - "type": "domain" - }, - { - "name": "admin", - "type": "user" - }, - { - "name": "email", - "type": "string", - "ask": { - "en": "Choose email were send notification", - "fr": "Choisissez l'email vers lequel envoyer les notifications" - }, - "example": "admin@example.tld" - }, - { - "name": "isp_name", - "type": "string", - "ask": { - "en": "Enter your ISP name", - "fr": "Indiquez le nom de votre FAI" - }, - "example": "My ISP" - }, - { - "name": "isp_site", - "type": "string", - "ask": { - "en": "Enter the address of your ISP website", - "fr": "Saisissez l'adresse du siteweb de votre FAI" - }, - "example": "//www.exemple.tld" - } - ] - } -} diff --git a/manifest.toml b/manifest.toml new file mode 100644 index 0000000..3853642 --- /dev/null +++ b/manifest.toml @@ -0,0 +1,73 @@ +#:schema https://raw.githubusercontent.com/YunoHost/apps/master/schemas/manifest.v2.schema.json + +packaging_format = 2 + +id = "coin" +name = "Coin" +description.en = "Member dashboard for non profit isp." +description.fr = "Coin est un Outil pour un Internet Neutre." + +version = "20231216~ynh1" + +maintainers = ["ljf", "aleks"] + +[upstream] +license = "AGPL-3.0-or-later" +website = "https://code.ffdn.org/FFDN/coin" +code = "https://code.ffdn.org/ffdn/coin" + +[integration] +yunohost = ">= 11.0.0" +architectures = "all" +multi_instance = false +ldap = false +sso = false +disk = "50M" +ram.build = "50M" +ram.runtime = "50M" + +[install] + [install.domain] + # this is a generic question - ask strings are automatically handled by Yunohost's core + type = "domain" + + [install.admin] + # this is a generic question - ask strings are automatically handled by Yunohost's core + type = "user" + + [install.email] + ask.en = "Choose email were send notification" + ask.fr = "Choisissez l'email vers lequel envoyer les notifications" + type = "string" + example = "admin@example.tld" + + [install.isp_name] + ask.en = "Enter your ISP name" + ask.fr = "Indiquez le nom de votre FAI" + type = "string" + example = "My ISP" + + [install.isp_site] + ask.en = "Enter the address of your ISP website" + ask.fr = "Saisissez l'adresse du siteweb de votre FAI" + type = "string" + example = "https://www.exemple.tld" + +[resources] + [resources.sources.main] + url = "https://code.ffdn.org/ffdn/coin/-/archive/bcaad5f.tar.gz" + sha256 = "241d527c7bab5410bcc225d5beeff8286aa8ae649b9711c421624ae96136cdd7" + + [resources.system_user] + + [resources.install_dir] + + [resources.permissions] + main.url = "/" + main.allowed = "visitors" + + [resources.apt] + packages = "gunicorn, python3, python3-venv, libpq-dev, libsasl2-dev, libjpeg-dev, libxml2-dev, libxslt1-dev, libpango1.0-0, postgresql, postgresql-contrib, postgresql-server-dev-13" + + [resources.database] + type = "postgresql" diff --git a/scripts/_common.sh b/scripts/_common.sh index ba3926a..05a7907 100644 --- a/scripts/_common.sh +++ b/scripts/_common.sh @@ -1,22 +1,2 @@ #!/bin/bash -#================================================= -# COMMON VARIABLES -#================================================= - -python_version=2.7.18 - -# dependencies used by the app -pkg_dependencies="gunicorn libldap2-dev libpq-dev libsasl2-dev libjpeg-dev libxml2-dev libxslt1-dev libffi-dev libpango1.0-0 postgresql postgresql-contrib postgresql-server-dev-13" - -#================================================= -# PERSONAL HELPERS -#================================================= - -#================================================= -# EXPERIMENTAL HELPERS -#================================================= - -#================================================= -# FUTURE OFFICIAL HELPERS -#================================================= diff --git a/scripts/backup b/scripts/backup index 19f6fe4..a79e87e 100644 --- a/scripts/backup +++ b/scripts/backup @@ -1,68 +1,22 @@ #!/bin/bash -#================================================= -# GENERIC START -#================================================= -# IMPORT GENERIC HELPERS -#================================================= - # Keep this path for calling _common.sh inside the execution's context of backup and restore scripts source ../settings/scripts/_common.sh source /usr/share/yunohost/helpers -#================================================= -# MANAGE SCRIPT FAILURE -#================================================= - -ynh_clean_setup () { - true -} -# Exit if an error occurs during the execution of the script -ynh_abort_if_errors - -#================================================= -# LOAD SETTINGS -#================================================= -ynh_print_info --message="Loading installation settings..." - -app=$YNH_APP_INSTANCE_NAME - -final_path=$(ynh_app_setting_get --app=$app --key=final_path) -domain=$(ynh_app_setting_get --app=$app --key=domain) -db_name=$(ynh_app_setting_get --app=$app --key=db_name) - #================================================= # DECLARE DATA AND CONF FILES TO BACKUP #================================================= ynh_print_info --message="Declaring files to be backed up..." -#================================================= -# BACKUP THE APP MAIN DIR -#================================================= - -ynh_backup --src_path="$final_path" - -#================================================= -# BACKUP THE NGINX CONFIGURATION -#================================================= - +ynh_backup --src_path="$install_dir" ynh_backup --src_path="/etc/nginx/conf.d/$domain.d/$app.conf" - -#================================================= -# BACKUP SYSTEMD -#================================================= - ynh_backup --src_path="/etc/systemd/system/$app.service" -#================================================= -# BACKUP THE POSTGRESQL DATABASE -#================================================= ynh_print_info --message="Backing up the PostgreSQL database..." - ynh_psql_dump_db --database="$db_name" > db.sql #================================================= # END OF SCRIPT #================================================= - ynh_print_info --message="Backup script completed for $app. (YunoHost will then actually copy those files to the archive)." diff --git a/scripts/change_url b/scripts/change_url index 94b1b70..2eb3b36 100644 --- a/scripts/change_url +++ b/scripts/change_url @@ -1,135 +1,19 @@ #!/bin/bash -#================================================= -# GENERIC STARTING -#================================================= -# IMPORT GENERIC HELPERS -#================================================= - source _common.sh source /usr/share/yunohost/helpers -#================================================= -# RETRIEVE ARGUMENTS -#================================================= - -old_domain=$YNH_APP_OLD_DOMAIN -old_path=$YNH_APP_OLD_PATH - -new_domain=$YNH_APP_NEW_DOMAIN -new_path=$YNH_APP_NEW_PATH - -app=$YNH_APP_INSTANCE_NAME - -#================================================= -# LOAD SETTINGS -#================================================= -ynh_script_progression --message="Loading installation settings..." --weight=1 - -# Needed for helper "ynh_add_nginx_config" -final_path=$(ynh_app_setting_get --app=$app --key=final_path) - -# Add settings here as needed by your application -#db_name=$(ynh_app_setting_get --app=$app --key=db_name) -#db_user=$db_name -#db_pwd=$(ynh_app_setting_get --app=$app --key=db_pwd) - -#================================================= -# BACKUP BEFORE CHANGE URL THEN ACTIVE TRAP -#================================================= -ynh_script_progression --message="Backing up the app before changing its URL (may take a while)..." --weight=1 - -# Backup the current version of the app -ynh_backup_before_upgrade -ynh_clean_setup () { - # Remove the new domain config file, the remove script won't do it as it doesn't know yet its location. - ynh_secure_remove --file="/etc/nginx/conf.d/$new_domain.d/$app.conf" - - # Restore it if the upgrade fails - ynh_restore_upgradebackup -} -# Exit if an error occurs during the execution of the script -ynh_abort_if_errors - -#================================================= -# CHECK WHICH PARTS SHOULD BE CHANGED -#================================================= - -change_domain=0 -if [ "$old_domain" != "$new_domain" ] -then - change_domain=1 -fi - -change_path=0 -if [ "$old_path" != "$new_path" ] -then - change_path=1 -fi - -#================================================= -# STANDARD MODIFICATIONS -#================================================= -# STOP SYSTEMD SERVICE -#================================================= -ynh_script_progression --message="Stopping a systemd service..." --weight=1 - ynh_systemd_action --service_name=$app --action="stop" --log_path="/var/log/$app/$app.log" -#================================================= -# MODIFY URL IN NGINX CONF -#================================================= -ynh_script_progression --message="Updating NGINX web server configuration..." --weight=1 +ynh_change_url_nginx_config -nginx_conf_path=/etc/nginx/conf.d/$old_domain.d/$app.conf +ynh_backup_if_checksum_is_different --file="$install_dir/coin/settings_local.py" +ynh_render_template ../conf/local.py.j2 "$install_dir/coin/settings_local.py" +ynh_store_file_checksum --file="$install_dir/coin/settings_local.py" -# Change the path in the NGINX config file -if [ $change_path -eq 1 ] -then - # Make a backup of the original NGINX config file if modified - ynh_backup_if_checksum_is_different --file="$nginx_conf_path" - # Set global variables for NGINX helper - domain="$old_domain" - path_url="$new_path" - # Create a dedicated NGINX config - ynh_add_nginx_config -fi +chmod 400 "$install_dir/coin/settings_local.py" +chown $app "$install_dir/coin/settings_local.py" -# Change the domain for NGINX -if [ $change_domain -eq 1 ] -then - # Delete file checksum for the old conf file location - ynh_delete_file_checksum --file="$nginx_conf_path" - mv $nginx_conf_path /etc/nginx/conf.d/$new_domain.d/$app.conf - # Store file checksum for the new config file location - ynh_store_file_checksum --file="/etc/nginx/conf.d/$new_domain.d/$app.conf" -fi - -#================================================= -# SPECIFIC MODIFICATIONS -#================================================= -# ... -#================================================= - -#================================================= -# GENERIC FINALISATION -#================================================= -# START SYSTEMD SERVICE -#================================================= -ynh_script_progression --message="Starting a systemd service..." --weight=1 - -# Start a systemd service ynh_systemd_action --service_name=$app --action="start" --log_path="/var/log/$app/$app.log" -#================================================= -# RELOAD NGINX -#================================================= -ynh_script_progression --message="Reloading NGINX web server..." --weight=1 - -ynh_systemd_action --service_name=nginx --action=reload - -#================================================= -# END OF SCRIPT -#================================================= - ynh_script_progression --message="Change of URL completed for $app" --last diff --git a/scripts/install b/scripts/install index 30a17b5..005049a 100644 --- a/scripts/install +++ b/scripts/install @@ -1,166 +1,63 @@ #!/bin/bash -#================================================= -# GENERIC START -#================================================= -# IMPORT GENERIC HELPERS -#================================================= - source _common.sh -source ynh_install_python source /usr/share/yunohost/helpers -#================================================= -# MANAGE SCRIPT FAILURE -#================================================= - -ynh_clean_setup () { - true -} -# Exit if an error occurs during the execution of the script -ynh_abort_if_errors - -#================================================= -# RETRIEVE ARGUMENTS FROM THE MANIFEST -#================================================= - -export domain=$YNH_APP_ARG_DOMAIN -export path_url=/ -export admin=$YNH_APP_ARG_ADMIN -export email=$YNH_APP_ARG_EMAIL -export isp_name=$YNH_APP_ARG_ISP_NAME -export isp_site=$YNH_APP_ARG_ISP_SITE -is_public=1 export secret=$(ynh_string_random 24) - -export app=$YNH_APP_INSTANCE_NAME - -#================================================= -# CHECK IF THE APP CAN BE INSTALLED WITH THESE ARGS -#================================================= -ynh_script_progression --message="Validating installation parameters..." --weight=1 - -export final_path=/opt/$app -test ! -e "$final_path" || ynh_die --message="This path already contains a folder" - -# Register (book) web path -ynh_webpath_register --app=$app --domain=$domain --path_url=$path_url - -#================================================= -# STORE SETTINGS FROM MANIFEST -#================================================= -ynh_script_progression --message="Storing installation settings..." --weight=1 - -ynh_app_setting_set --app=$app --key=domain --value=$domain -ynh_app_setting_set --app=$app --key=path --value=$path_url -ynh_app_setting_set --app=$app --key=admin --value=$admin -ynh_app_setting_set --app=$app --key=email --value=$email -ynh_app_setting_set --app=$app --key=isp_name --value=$isp_name -ynh_app_setting_set --app=$app --key=isp_site --value=$isp_site - -#================================================= -# STANDARD MODIFICATIONS -#================================================= -# INSTALL DEPENDENCIES -#================================================= -ynh_script_progression --message="Installing dependencies..." --weight=1 - -ynh_install_app_dependencies $pkg_dependencies -ynh_install_python --python_version=$python_version - -#================================================= -# CREATE DEDICATED USER -#================================================= -ynh_script_progression --message="Configuring system user..." --weight=1 - -# Create a system user -ynh_system_user_create --username=$app - -#================================================= -# CREATE A POSTGRESQL DATABASE -#================================================= -ynh_script_progression --message="Creating a PostgreSQL database..." --weight=1 - -export db_name=$(ynh_sanitize_dbid --db_name=$app) -export db_user=$db_name -ynh_app_setting_set --app=$app --key=db_name --value=$db_name -ynh_psql_test_if_first_run -ynh_psql_setup_db --db_user=$db_user --db_name=$db_name -export db_pwd=$(ynh_app_setting_get --app=$app --key=psqlpwd) +ynh_app_setting_set --app=$app --key=secret --value=$secret #================================================= # DOWNLOAD, CHECK AND UNPACK SOURCE #================================================= -ynh_script_progression --message="Setting up source files..." --weight=1 +ynh_script_progression --message="Setting up source files..." -ynh_app_setting_set --app=$app --key=final_path --value=$final_path -# Download, check integrity, uncompress and patch the source from app.src -ynh_setup_source --dest_dir="$final_path" +ynh_setup_source --dest_dir="$install_dir" -chmod 750 "$final_path" -chmod -R o-rwx "$final_path" -chown -R $app:www-data "$final_path" - -#================================================= -# NGINX CONFIGURATION -#================================================= -ynh_script_progression --message="Configuring NGINX web server..." --weight=1 - -# Create a dedicated NGINX config -ynh_add_nginx_config +chmod 750 "$install_dir" +chmod -R o-rwx "$install_dir" +chown -R $app:www-data "$install_dir" #================================================= # SPECIFIC SETUP #================================================= # PYTHON DEPENDENCIES #================================================= -ynh_script_progression --message="Installing more dependencies..." --weight=1 +ynh_script_progression --message="Installing more dependencies..." -pushd "$final_path" - ynh_use_python - ynh_exec_warn_less $ynh_pip install --upgrade pip - ynh_exec_warn_less $ynh_pip install gunicorn - echo "django-auth-ldap<1.4" >> $final_path/requirements.txt - ynh_exec_warn_less $ynh_pip install -r $final_path/requirements.txt +pushd "$install_dir" + python3 -m venv venv + venv/bin/pip install --upgrade pip + venv/bin/pip install gunicorn + #echo "django-auth-ldap<1.4" >> $install_dir/requirements.txt + venv/bin/pip install -r requirements.txt popd #================================================= # CONFIGURATION DJANGO #================================================= -ynh_script_progression --message="Configuring application..." --weight=1 +ynh_script_progression --message="Configuring application..." -export prefix="${path_url#"/"}/" +export prefix="${path#"/"}/" prefix=${prefix%"/"} -ynh_render_template ../conf/local.py.j2 "$final_path/coin/settings_local.py" -ynh_store_file_checksum --file="$final_path/coin/settings_local.py" +ynh_render_template ../conf/local.py.j2 "$install_dir/coin/settings_local.py" +ynh_store_file_checksum --file="$install_dir/coin/settings_local.py" +chmod 400 "$install_dir/coin/settings_local.py" +chown $app "$install_dir/coin/settings_local.py" -#================================================= # SERVE STATIC FILES IN PRODUCTION MODE -#================================================= +ln -s $install_dir/$app/static $install_dir/static -ln -s $final_path/$app/static $final_path/static - -#================================================= -# SETUP DATABASE -#================================================= - -# Set permissions -chown -R $app:www-data $final_path - -pushd $final_path - ynh_exec_warn_less $ynh_python manage.py migrate --noinput - ynh_exec_warn_less $ynh_python manage.py collectstatic --noinput +pushd $install_dir + ynh_exec_warn_less venv/bin/python3 manage.py migrate --noinput + ynh_exec_warn_less venv/bin/python3 manage.py collectstatic --noinput popd # Set permissions to directory -chmod 750 "$final_path" -chmod -R o-rwx "$final_path" -chown -R $app:www-data "$final_path" - -#================================================= -# CONFIGURE LOG DIR -#================================================= +chmod 750 "$install_dir" +chmod -R o-rwx "$install_dir" +chown -R $app:www-data "$install_dir" +# Setup log permissions mkdir -p /var/log/$app chown -R $app /var/log/$app chown -R $app:www-data "/var/log/$app" @@ -168,57 +65,34 @@ chown -R $app:www-data "/var/log/$app" #================================================= # ADD A CONFIGURATION #================================================= -ynh_script_progression --message="Adding a configuration file..." --weight=1 +ynh_script_progression --message="Adding a configuration file..." -ynh_add_config --template="../conf/gunicorn_config.py" --destination="$final_path/gunicorn_config.py" +ynh_add_config --template="gunicorn_config.py" --destination="$install_dir/gunicorn_config.py" -chown $app:www-data "$final_path/gunicorn_config.py" +chown $app:www-data "$install_dir/gunicorn_config.py" #================================================= # SETUP SYSTEMD #================================================= -ynh_script_progression --message="Configuring a systemd service..." --weight=1 +ynh_script_progression --message="Configuring system..." + +# Create a dedicated NGINX config +ynh_add_nginx_config # Create a dedicated systemd config ynh_add_systemd_config -#================================================= -# GENERIC FINALIZATION -#================================================= -# INTEGRATE SERVICE IN YUNOHOST -#================================================= -ynh_script_progression --message="Integrating service in YunoHost..." --weight=1 - +# Integrating service in YunoHost yunohost service add $app --description "$app daemon" --log="/var/log/$app/$app.log" #================================================= # START SYSTEMD SERVICE #================================================= -ynh_script_progression --message="Starting a systemd service..." --weight=1 +ynh_script_progression --message="Starting systemd service..." # Start a systemd service ynh_systemd_action --service_name=$app --action="start" --log_path="/var/log/$app/$app.log" -#================================================= -# SETUP SSOWAT -#================================================= -ynh_script_progression --message="Configuring permissions..." --weight=1 - -# Make app public if necessary -if [ $is_public -eq 1 ] -then - # Everyone can access the app. - # The "main" permission is automatically created before the install script. - ynh_permission_update --permission="main" --add="visitors" -fi - -#================================================= -# RELOAD NGINX -#================================================= -ynh_script_progression --message="Reloading NGINX web server..." --weight=1 - -ynh_systemd_action --service_name=nginx --action=reload - #================================================= # END OF SCRIPT #================================================= diff --git a/scripts/remove b/scripts/remove index 86b1c6d..23b5bb5 100644 --- a/scripts/remove +++ b/scripts/remove @@ -1,102 +1,25 @@ #!/bin/bash -#================================================= -# GENERIC START -#================================================= -# IMPORT GENERIC HELPERS -#================================================= - source _common.sh -source ynh_install_python source /usr/share/yunohost/helpers -#================================================= -# LOAD SETTINGS -#================================================= -ynh_script_progression --message="Loading installation settings..." --weight=1 - -app=$YNH_APP_INSTANCE_NAME - -domain=$(ynh_app_setting_get --app=$app --key=domain) -port=$(ynh_app_setting_get --app=$app --key=port) -db_name=$(ynh_app_setting_get --app=$app --key=db_name) -db_user=$db_name -final_path=$(ynh_app_setting_get --app=$app --key=final_path) - -#================================================= -# STANDARD REMOVE -#================================================= -# REMOVE SERVICE INTEGRATION IN YUNOHOST -#================================================= +ynh_script_progression --message="Removing system configurations..." --weight=1 # Remove the service from the list of services known by YunoHost (added from `yunohost service add`) if ynh_exec_warn_less yunohost service status $app >/dev/null then - ynh_script_progression --message="Removing $app service integration..." --weight=1 yunohost service remove $app fi -#================================================= -# STOP AND REMOVE SERVICE -#================================================= -ynh_script_progression --message="Stopping and removing the systemd service..." --weight=1 - # Remove the dedicated systemd config ynh_remove_systemd_config -#================================================= -# REMOVE THE POSTGRESQL DATABASE -#================================================= -ynh_script_progression --message="Removing the PostgreSQL database..." --weight=1 - -# Remove a database if it exists, along with the associated user -ynh_psql_remove_db --db_user=$db_user --db_name=$db_name - -#================================================= -# REMOVE APP MAIN DIR -#================================================= -ynh_script_progression --message="Removing app main directory..." --weight=1 - -# Remove the app directory securely -ynh_secure_remove --file="$final_path" - -#================================================= -# REMOVE NGINX CONFIGURATION -#================================================= -ynh_script_progression --message="Removing NGINX web server configuration..." --weight=1 - # Remove the dedicated NGINX config ynh_remove_nginx_config -#================================================= -# REMOVE DEPENDENCIES -#================================================= -ynh_script_progression --message="Removing dependencies..." --weight=1 - -# Remove metapackage and its dependencies -ynh_remove_python -ynh_remove_app_dependencies - -#================================================= -# SPECIFIC REMOVE -#================================================= -# REMOVE VARIOUS FILES -#================================================= -ynh_script_progression --message="Removing various files..." --weight=1 - # Remove the log files ynh_secure_remove --file="/var/log/$app" -#================================================= -# GENERIC FINALIZATION -#================================================= -# REMOVE DEDICATED USER -#================================================= -ynh_script_progression --message="Removing the dedicated system user..." --weight=1 - -# Delete a system user -ynh_system_user_delete --username=$app - #================================================= # END OF SCRIPT #================================================= diff --git a/scripts/restore b/scripts/restore index 51e23ee..c8080d8 100644 --- a/scripts/restore +++ b/scripts/restore @@ -1,83 +1,19 @@ #!/bin/bash -#================================================= -# GENERIC START -#================================================= -# IMPORT GENERIC HELPERS -#================================================= - # Keep this path for calling _common.sh inside the execution's context of backup and restore scripts source ../settings/scripts/_common.sh -source ../settings/scripts/ynh_install_python source /usr/share/yunohost/helpers -#================================================= -# MANAGE SCRIPT FAILURE -#================================================= - -ynh_clean_setup () { - true -} -# Exit if an error occurs during the execution of the script -ynh_abort_if_errors - -#================================================= -# LOAD SETTINGS -#================================================= -ynh_script_progression --message="Loading installation settings..." --weight=1 - -export app=$YNH_APP_INSTANCE_NAME - -export domain=$(ynh_app_setting_get --app=$app --key=domain) -export path_url=$(ynh_app_setting_get --app=$app --key=path) -export final_path=$(ynh_app_setting_get --app=$app --key=final_path) -export db_name=$(ynh_app_setting_get --app=$app --key=db_name) -export db_user=$db_name -export admin=$(ynh_app_setting_get --app=$app --key=admin) -export email=$(ynh_app_setting_get --app=$app --key=email) -export isp_name=$(ynh_app_setting_get --app=$app --key=isp_name) -export isp_site=$(ynh_app_setting_get --app=$app --key=isp_site) -export secret=$(ynh_app_setting_get --app=$app --key=secret) - -#================================================= -# CHECK IF THE APP CAN BE RESTORED -#================================================= -ynh_script_progression --message="Validating restoration parameters..." --weight=1 - -test ! -d $final_path \ - || ynh_die --message="There is already a directory: $final_path " - -#================================================= -# STANDARD RESTORATION STEPS -#================================================= -# RECREATE THE DEDICATED USER -#================================================= -ynh_script_progression --message="Recreating the dedicated system user..." --weight=1 - -# Create the dedicated user (if not existing) -ynh_system_user_create --username=$app - #================================================= # RESTORE THE APP MAIN DIR #================================================= ynh_script_progression --message="Restoring the app main directory..." --weight=1 -ynh_restore_file --origin_path="$final_path" +ynh_restore_file --origin_path="$install_dir" -chmod 750 "$final_path" -chmod -R o-rwx "$final_path" -chown -R $app:www-data "$final_path" - -#================================================= -# SPECIFIC RESTORATION -#================================================= -# REINSTALL DEPENDENCIES -#================================================= -ynh_script_progression --message="Reinstalling dependencies..." --weight=1 - -# Define and install dependencies -ynh_install_app_dependencies $pkg_dependencies -ynh_install_python --python_version=$python_version +chmod 750 "$install_dir" +chmod -R o-rwx "$install_dir" +chown -R $app:www-data "$install_dir" #================================================= # RESTORE THE NGINX CONFIGURATION @@ -86,29 +22,29 @@ ynh_script_progression --message="Restoring the NGINX web server configuration.. ynh_restore_file --origin_path="/etc/nginx/conf.d/$domain.d/$app.conf" -#================================================= -# RESTORE THE POSTGRESQL DATABASE -#================================================= -ynh_script_progression --message="Restoring the PostgreSQL database..." --weight=1 - -export db_pwd=$(ynh_app_setting_get --app=$app --key=psqlpwd) -ynh_psql_test_if_first_run -ynh_psql_setup_db --db_user=$db_user --db_name=$db_name --db_pwd=$db_pwd ynh_psql_execute_file_as_root --file="./db.sql" --database=$db_name #================================================= # PYTHON DEPENDENCIES #================================================= -ynh_script_progression --message="Installing more dependencies..." --weight=1 +ynh_script_progression --message="Reinstalling venv..." --weight=1 -pushd "$final_path" - ynh_use_python - ynh_exec_warn_less $ynh_pip install --upgrade pip - ynh_exec_warn_less $ynh_pip install gunicorn - echo "django-auth-ldap<1.4" >> $final_path/requirements.txt - ynh_exec_warn_less $ynh_pip install -r $final_path/requirements.txt +ynh_secure_remove --file="${install_dir}/venv" +pushd "$install_dir" + python3 -m venv venv + venv/bin/pip install --upgrade pip + venv/bin/pip install gunicorn + #echo "django-auth-ldap<1.4" >> $install_dir/requirements.txt + venv/bin/pip install -r requirements.txt popd +#================================================= +# CONFIGURE LOG DIR +#================================================= + +mkdir -p /var/log/$app +chown -R $app:www-data /var/log/$app + #================================================= # RESTORE SYSTEMD #================================================= @@ -117,19 +53,6 @@ ynh_script_progression --message="Restoring the systemd configuration..." --weig ynh_restore_file --origin_path="/etc/systemd/system/$app.service" systemctl enable $app.service --quiet -#================================================= -# CONFIGURE LOG DIR -#================================================= - -mkdir -p /var/log/$app -chown -R $app /var/log/$app -chgrp -R www-data /var/log/$app - -#================================================= -# INTEGRATE SERVICE IN YUNOHOST -#================================================= -ynh_script_progression --message="Integrating service in YunoHost..." --weight=1 - yunohost service add $app --description "$app daemon" --log="/var/log/$app/$app.log" #================================================= diff --git a/scripts/upgrade b/scripts/upgrade index 16045d0..06bbca8 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -1,55 +1,10 @@ #!/bin/bash -#================================================= -# GENERIC START -#================================================= -# IMPORT GENERIC HELPERS -#================================================= - source _common.sh -source ynh_install_python source /usr/share/yunohost/helpers -#================================================= -# LOAD SETTINGS -#================================================= -ynh_script_progression --message="Loading installation settings..." --weight=1 - -export app=$YNH_APP_INSTANCE_NAME - -export domain=$(ynh_app_setting_get --app=$app --key=domain) -export path_url=$(ynh_app_setting_get --app=$app --key=path) -export admin=$(ynh_app_setting_get --app=$app --key=admin) -export email=$(ynh_app_setting_get --app=$app --key=email) -export isp_name=$(ynh_app_setting_get --app=$app --key=isp_name) -export isp_site=$(ynh_app_setting_get --app=$app --key=isp_site) -export secret=$(ynh_app_setting_get --app=$app --key=secret) -export final_path=$(ynh_app_setting_get --app=$app --key=final_path) -export db_name=$(ynh_app_setting_get --app=$app --key=db_name) -export db_user=$db_name -export db_pwd=$(ynh_app_setting_get --app=$app --key=psqlpwd) - -#================================================= -# CHECK VERSION -#================================================= -ynh_script_progression --message="Checking version..." --weight=1 - upgrade_type=$(ynh_check_app_version_changed) -#================================================= -# BACKUP BEFORE UPGRADE THEN ACTIVE TRAP -#================================================= -ynh_script_progression --message="Backing up the app before upgrading (may take a while)..." --weight=1 - -# Backup the current version of the app -ynh_backup_before_upgrade -ynh_clean_setup () { - # Restore it if the upgrade fails - ynh_restore_upgradebackup -} -# Exit if an error occurs during the execution of the script -ynh_abort_if_errors - #================================================= # STANDARD UPGRADE STEPS #================================================= @@ -59,40 +14,6 @@ ynh_script_progression --message="Stopping a systemd service..." --weight=1 ynh_systemd_action --service_name=$app --action="stop" --log_path="/var/log/$app/$app.log" -#================================================= -# ENSURE DOWNWARD COMPATIBILITY -#================================================= -ynh_script_progression --message="Ensuring downward compatibility..." --weight=1 - -# Cleaning legacy permissions -if ynh_legacy_permissions_exists; then - ynh_legacy_permissions_delete_all - - ynh_app_setting_delete --app=$app --key=is_public -fi - -# If db_name doesn't exist, create it -if [ -z "$db_name" ]; then - db_name=$(ynh_sanitize_dbid --db_name=$app) - ynh_app_setting_set --app=$app --key=db_name --value=$db_name -fi - -# If final_path doesn't exist, create it -if [ -z "$final_path" ]; then - final_path=/opt/$app - ynh_app_setting_set --app=$app --key=final_path --value=$final_path -fi - -ynh_secure_remove --file="${final_path}/venv" - -#================================================= -# CREATE DEDICATED USER -#================================================= -ynh_script_progression --message="Making sure dedicated system user exists..." --weight=1 - -# Create a dedicated user (if not existing) -ynh_system_user_create --username=$app - #================================================= # DOWNLOAD, CHECK AND UNPACK SOURCE #================================================= @@ -102,28 +23,22 @@ then ynh_script_progression --message="Upgrading source files..." --weight=1 # Download, check integrity, uncompress and patch the source from app.src - ynh_setup_source --dest_dir="$final_path" + ynh_setup_source --dest_dir="$install_dir" fi -chmod 750 "$final_path" -chmod -R o-rwx "$final_path" -chown -R $app:www-data "$final_path" -#================================================= -# UPGRADE DEPENDENCIES -#================================================= -ynh_script_progression --message="Upgrading dependencies..." --weight=1 +ynh_secure_remove --file="${install_dir}/venv" +pushd "$install_dir" + python3 -m venv venv + venv/bin/pip install --upgrade pip + venv/bin/pip install gunicorn + #echo "django-auth-ldap<1.4" >> $install_dir/requirements.txt + venv/bin/pip install -r requirements.txt +popd -ynh_install_app_dependencies $pkg_dependencies -ynh_install_python --python_version=$python_version - -#================================================= -# NGINX CONFIGURATION -#================================================= -ynh_script_progression --message="Upgrading NGINX web server configuration..." --weight=1 - -# Create a dedicated NGINX config -ynh_add_nginx_config +chmod 750 "$install_dir" +chmod -R o-rwx "$install_dir" +chown -R $app:www-data "$install_dir" #================================================= # SPECIFIC UPGRADE @@ -132,32 +47,25 @@ ynh_add_nginx_config #================================================= ynh_script_progression --message="Configuring Django..." --weight=1 -export prefix="${path_url#"/"}/" +export prefix="${path#"/"}/" prefix=${prefix%"/"} -ynh_backup_if_checksum_is_different --file="$final_path/coin/settings_local.py" -ynh_render_template ../conf/local.py.j2 "$final_path/coin/setings_local.py" -ynh_store_file_checksum --file="$final_path/coin/settings_local.py" +ynh_backup_if_checksum_is_different --file="$install_dir/coin/settings_local.py" +ynh_render_template ../conf/local.py.j2 "$install_dir/coin/settings_local.py" +ynh_store_file_checksum --file="$install_dir/coin/settings_local.py" -#================================================= -# PYTHON DEPENDENCIES -#================================================= -ynh_script_progression --message="Installing more dependencies..." --weight=1 +chmod 400 "$install_dir/coin/settings_local.py" +chown $app "$install_dir/coin/settings_local.py" -pushd "$final_path" - ynh_use_python - ynh_exec_warn_less $ynh_pip install --upgrade pip - ynh_exec_warn_less $ynh_pip install gunicorn - echo "django-auth-ldap<1.4" >> $final_path/requirements.txt - ynh_exec_warn_less $ynh_pip install -r $final_path/requirements.txt -popd +ynh_add_config --template="../conf/gunicorn_config.py" --destination="$install_dir/gunicorn_config.py" +chown $app:www-data "$install_dir/gunicorn_config.py" #================================================= # MIGRATE DB #================================================= ynh_script_progression --message="Migrating database..." --weight=1 -pushd "$final_path" - ynh_exec_warn_less $ynh_python manage.py migrate --noinput +pushd "$install_dir" + ynh_exec_warn_less venv/bin/python3 manage.py migrate --noinput popd #================================================= @@ -165,38 +73,25 @@ popd #================================================= ynh_script_progression --message="Collecting files..." --weight=1 -pushd "$final_path" - ynh_exec_warn_less $ynh_python manage.py collectstatic --noinput +pushd "$install_dir" + ynh_exec_warn_less venv/bin/python3 manage.py collectstatic --noinput popd -chmod 750 "$final_path" -chmod -R o-rwx "$final_path" -chown -R $app:www-data "$final_path" - -#================================================ -# UPDATE A CONFIG FILE -#================================================= -ynh_script_progression --message="Updating a configuration file..." --weight=1 - -ynh_add_config --template="../conf/gunicorn_config.py" --destination="$final_path/gunicorn_config.py" - -chown $app:www-data "$final_path/gunicorn_config.py" +chmod 750 "$install_dir" +chmod -R o-rwx "$install_dir" +chown -R $app:www-data "$install_dir" #================================================= # SETUP SYSTEMD #================================================= -ynh_script_progression --message="Upgrading systemd configuration..." --weight=1 +ynh_script_progression --message="Upgrading system configurations..." --weight=1 + +# Create a dedicated NGINX config +ynh_add_nginx_config # Create a dedicated systemd config ynh_add_systemd_config -#================================================= -# GENERIC FINALIZATION -#================================================= -# INTEGRATE SERVICE IN YUNOHOST -#================================================= -ynh_script_progression --message="Integrating service in YunoHost..." --weight=1 - yunohost service add $app --description "$app daemon" --log="/var/log/$app/$app.log" #================================================= @@ -206,13 +101,6 @@ ynh_script_progression --message="Starting a systemd service..." --weight=1 ynh_systemd_action --service_name=$app --action="start" --log_path="/var/log/$app/$app.log" -#================================================= -# RELOAD NGINX -#================================================= -ynh_script_progression --message="Reloading NGINX web server..." --weight=1 - -ynh_systemd_action --service_name=nginx --action=reload - #================================================= # END OF SCRIPT #================================================= diff --git a/scripts/ynh_install_python b/scripts/ynh_install_python deleted file mode 100644 index 5747fd5..0000000 --- a/scripts/ynh_install_python +++ /dev/null @@ -1,267 +0,0 @@ -#!/bin/bash - -ynh_python_try_bash_extension() { - if [ -x src/configure ]; then - src/configure && make -C src || { - ynh_print_info --message="Optional bash extension failed to build, but things will still work normally." - } - fi -} - -pyenv_install_dir="/opt/pyenv" -python_version_path="$pyenv_install_dir/versions" -# PYENV_ROOT is the directory of pyenv, it needs to be loaded as a environment variable. -export PYENV_ROOT="$pyenv_install_dir" -export pyenv_root="$pyenv_install_dir" - -# Required dependencies -pyenv_dependencies="make build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm libncursesw5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev libffi-dev liblzma-dev git" - -# Load the version of Python for an app, and set variables. -# -# ynh_use_python has to be used in any app scripts before using Python for the first time. -# This helper will provide alias and variables to use in your scripts. -# -# To use pip or Python, use the alias `ynh_pip` and `ynh_python` -# Those alias will use the correct version installed for the app -# For example: use `ynh_pip install` instead of `pip install` -# -# With `sudo` or `ynh_exec_as`, use instead the fallback variables `$ynh_pip` and `$ynh_python` -# And propagate $PATH to sudo with $ynh_python_load_path -# Exemple: `ynh_exec_as $app $ynh_python_load_path $ynh_pip install` -# -# $PATH contains the path of the requested version of Python. -# However, $PATH is duplicated into $ynh_python_path to outlast any manipulation of $PATH -# You can use the variable `$ynh_python_load_path` to quickly load your Python version -# in $PATH for an usage into a separate script. -# Exemple: $ynh_python_load_path $final_path/script_that_use_pip.sh` -# -# -# Finally, to start a Python service with the correct version, 2 solutions -# Either the app is dependent of python or pip, but does not called it directly. -# In such situation, you need to load PATH -# `Environment="__YNH_PYTHON_LOAD_PATH__"` -# `ExecStart=__FINALPATH__/my_app` -# You will replace __YNH_PYTHON_LOAD_PATH__ with $ynh_python_load_path -# -# Or Python start the app directly, then you don't need to load the PATH variable -# `ExecStart=__YNH_PYTHON__ my_app run` -# You will replace __YNH_PYTHON__ with $ynh_python -# -# one other variable is also available -# - $ynh_python_path: The absolute path to Python binaries for the chosen version. -# -# usage: ynh_use_python -# -# Requires YunoHost version 3.2.2 or higher. -ynh_use_python () { - python_version=$(ynh_app_setting_get --app=$app --key=python_version) - - # Get the absolute path of this version of Python - ynh_python_path="$python_version_path/$YNH_APP_INSTANCE_NAME/bin" - - # Allow alias to be used into bash script - shopt -s expand_aliases - - # Create an alias for the specific version of Python and a variable as fallback - ynh_python="$ynh_python_path/python" - alias ynh_python="$ynh_python" - # And pip - ynh_pip="$ynh_python_path/pip" - alias ynh_pip="$ynh_pip" - - # Load the path of this version of Python in $PATH - if [[ :$PATH: != *":$ynh_python_path"* ]]; then - PATH="$ynh_python_path:$PATH" - fi - # Create an alias to easily load the PATH - ynh_python_load_path="PATH=$PATH" - - # Sets the local application-specific Python version - pushd $final_path - $pyenv_install_dir/bin/pyenv local $python_version - popd -} - -# Install a specific version of Python -# -# ynh_install_python will install the version of Python provided as argument by using pyenv. -# -# This helper creates a /etc/profile.d/pyenv.sh that configures PATH environment for pyenv -# for every LOGIN user, hence your user must have a defined shell (as opposed to /usr/sbin/nologin) -# -# Don't forget to execute python-dependent command in a login environment -# (e.g. sudo --login option) -# When not possible (e.g. in systemd service definition), please use direct path -# to pyenv shims (e.g. $PYENV_ROOT/shims/bundle) -# -# usage: ynh_install_python --python_version=python_version -# | arg: -v, --python_version= - Version of Python to install. -# -# Requires YunoHost version 3.2.2 or higher. -ynh_install_python () { - # Declare an array to define the options of this helper. - local legacy_args=v - local -A args_array=( [v]=python_version= ) - local python_version - # Manage arguments with getopts - ynh_handle_getopts_args "$@" - - # Install required dependencies - ynh_add_app_dependencies --package="$pyenv_dependencies" - - # Load pyenv path in PATH - local CLEAR_PATH="$pyenv_install_dir/bin:$PATH" - - # Remove /usr/local/bin in PATH in case of Python prior installation - PATH=$(echo $CLEAR_PATH | sed 's@/usr/local/bin:@@') - - # Move an existing Python binary, to avoid to block pyenv - #test -x /usr/bin/python && mv /usr/bin/python /usr/bin/python_pyenv - - # Install or update pyenv - pyenv="$(command -v pyenv $pyenv_install_dir/bin/pyenv | head -1)" - if [ -n "$pyenv" ]; then - ynh_print_info --message="pyenv already seems installed in \`$pyenv'." - pushd "${pyenv%/*/*}" - if git remote -v 2>/dev/null | grep "https://github.com/pyenv/pyenv.git"; then - ynh_print_info --message="Trying to update with git..." - git pull -q --tags origin master - cd .. - ynh_python_try_bash_extension - fi - popd - else - ynh_print_info --message="Installing pyenv with git..." - mkdir -p $pyenv_install_dir - pushd $pyenv_install_dir - git init -q - git remote add -f -t master origin https://github.com/pyenv/pyenv.git > /dev/null 2>&1 - git checkout -q -b master origin/master - ynh_python_try_bash_extension - pyenv=$pyenv_install_dir/bin/pyenv - popd - fi - - pyenv_virtualenv="$(command -v "$pyenv_install_dir"/plugins/*/bin/pyenv-virtualenv pyenv-virtualenv | head -1)" - if [ -n "$pyenv_virtualenv" ]; then - ynh_print_info --message="\`pyenv virtualenv' command already available in \`$pyenv_virtualenv'." - pushd "${pyenv_virtualenv%/*/*}" - if git remote -v 2>/dev/null | grep "https://github.com/pyenv/pyenv-virtualenv.git"; then - ynh_print_info --message="Trying to update pyenv-virtualenv with git..." - git pull -q origin master - fi - popd - else - ynh_print_info --message="Installing pyenv-virtualenv with git..." - mkdir -p "${pyenv_install_dir}/plugins" - git clone -q https://github.com/pyenv/pyenv-virtualenv.git "${pyenv_install_dir}/plugins/pyenv-virtualenv" - fi - - # Enable caching - mkdir -p "${pyenv_install_dir}/cache" - - # Create shims directory if needed - mkdir -p "${pyenv_install_dir}/shims" - chmod -R a+w "${pyenv_install_dir}/shims" - - # Restore /usr/local/bin in PATH - PATH=$CLEAR_PATH - - # And replace the old Python binary - # test -x /usr/bin/python_pyenv && mv /usr/bin/python_pyenv /usr/bin/python - - # Install the requested version of Python - ynh_print_info --message="Installation of Python-$python_version" - pyenv install --skip-existing $python_version > /dev/null 2>&1 - - # Store python_version into the config of this app - ynh_app_setting_set --app=$YNH_APP_INSTANCE_NAME --key=python_version --value=$python_version - - # Remove app virtualenv - if `pyenv virtualenvs | grep --quiet "$YNH_APP_INSTANCE_NAME " 1>/dev/null 2>&1` - then - pyenv virtualenv-delete --force $YNH_APP_INSTANCE_NAME - fi - - # Create app virtualenv - pyenv virtualenv --force $python_version $YNH_APP_INSTANCE_NAME - - # Cleanup Python versions - ynh_cleanup_python - - # Set environment for Python users - echo "#pyenv -export PYENV_ROOT=$pyenv_install_dir -export PATH=\"$pyenv_install_dir/bin:$PATH\" -eval \"\$(pyenv init -)\" -#pyenv" > /etc/profile.d/pyenv.sh - - # Load the environment - eval "$(pyenv init -)" -} - -# Remove the version of Python used by the app. -# -# This helper will also cleanup Python versions -# -# usage: ynh_remove_python -ynh_remove_python () { - local python_version=$(ynh_app_setting_get --app=$YNH_APP_INSTANCE_NAME --key=python_version) - - # Load pyenv path in PATH - local CLEAR_PATH="$pyenv_install_dir/bin:$PATH" - - # Remove /usr/local/bin in PATH in case of Python prior installation - PATH=$(echo $CLEAR_PATH | sed 's@/usr/local/bin:@@') - - pyenv virtualenv-delete --force $YNH_APP_INSTANCE_NAME - - # Remove the line for this app - ynh_app_setting_delete --app=$YNH_APP_INSTANCE_NAME --key=python_version - - # Cleanup Python versions - ynh_cleanup_python -} - -# Remove no more needed versions of Python used by the app. -# -# This helper will check what Python version are no more required, -# and uninstall them -# If no app uses Python, pyenv will be also removed. -# -# usage: ynh_cleanup_python -ynh_cleanup_python () { - - # List required Python versions - local installed_apps=$(yunohost app list | grep -oP 'id: \K.*$') - local required_python_versions="" - for installed_app in $installed_apps - do - local installed_app_python_version=$(ynh_app_setting_get --app=$installed_app --key="python_version") - if [[ $installed_app_python_version ]] - then - required_python_versions="${installed_app_python_version}\n${required_python_versions}" - fi - done - - # Remove no more needed Python versions - local installed_python_versions=$(pyenv versions --bare --skip-aliases | grep -Ev '/') - for installed_python_version in $installed_python_versions - do - if ! `echo ${required_python_versions} | grep "${installed_python_version}" 1>/dev/null 2>&1` - then - ynh_print_info --message="Removing of Python-$installed_python_version" - $pyenv_install_dir/bin/pyenv uninstall --force $installed_python_version - fi - done - - # If none Python version is required - if [[ ! $required_python_versions ]] - then - # Remove pyenv environment configuration - ynh_print_info --message="Removing of pyenv-$pyenv_version" - ynh_secure_remove --file="$pyenv_install_dir" - ynh_secure_remove --file="/etc/profile.d/pyenv.sh" - fi -} diff --git a/tests.toml b/tests.toml new file mode 100644 index 0000000..8546ea3 --- /dev/null +++ b/tests.toml @@ -0,0 +1,7 @@ +test_format = 1.0 + +[default] + + args.email = "john@example.com" + args.isp_name = "SuperFAI" + args.isp_site = "https://super.fai.net"