From 60159169da4906478f22220379aaf0d54e15c6e2 Mon Sep 17 00:00:00 2001 From: dkoukoul Date: Wed, 29 Nov 2023 18:02:26 +0200 Subject: [PATCH] improvements --- README.md | 2 +- conf/systemd.service | 6 +- doc/ADMIN.md | 6 ++ doc/DESCRIPTION.md | 2 - doc/PRE_INSTALL.md | 1 + doc/screenshots/example.jpg | Bin 35451 -> 0 bytes doc/screenshots/screenshot.png | Bin 0 -> 19287 bytes manifest.toml | 43 +++++------ scripts/backup | 91 ---------------------- scripts/change_url | 47 ------------ scripts/install | 35 ++++----- scripts/remove | 22 ++---- scripts/restore | 81 -------------------- scripts/upgrade | 135 --------------------------------- 14 files changed, 53 insertions(+), 418 deletions(-) create mode 100644 doc/ADMIN.md create mode 100644 doc/PRE_INSTALL.md delete mode 100644 doc/screenshots/example.jpg create mode 100644 doc/screenshots/screenshot.png delete mode 100755 scripts/backup delete mode 100644 scripts/change_url delete mode 100755 scripts/restore delete mode 100755 scripts/upgrade diff --git a/README.md b/README.md index e9d1868..ab6c833 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,3 @@ -# cjdns yunohost app +# Cjdns for Yunohost This is a cjdns app for yunohost. \ No newline at end of file diff --git a/conf/systemd.service b/conf/systemd.service index 2a48118..0b2071d 100644 --- a/conf/systemd.service +++ b/conf/systemd.service @@ -1,12 +1,12 @@ [Unit] Description=Cjdns network -After=network.target +After=network.target cjdns.service [Service] User=root Group=root -WorkingDirectory=__DATA_DIR__/ -ExecStart=/bin/bash -c '__DATA_DIR__/cjdroute < __DATA_DIR__/cjdroute.conf' +WorkingDirectory=__INSTALL_DIR__/ +ExecStart=/bin/bash -c '__INSTALL_DIR__/cjdroute < __INSTALL_DIR__/cjdroute.conf' KillMode=process Restart=no diff --git a/doc/ADMIN.md b/doc/ADMIN.md new file mode 100644 index 0000000..3422a0c --- /dev/null +++ b/doc/ADMIN.md @@ -0,0 +1,6 @@ +Security + +Upgrading + +Other +... \ No newline at end of file diff --git a/doc/DESCRIPTION.md b/doc/DESCRIPTION.md index 1ea6ca3..9cc83d6 100644 --- a/doc/DESCRIPTION.md +++ b/doc/DESCRIPTION.md @@ -1,5 +1,3 @@ -# cjdns - Networking Reinvented Cjdns implements an encrypted IPv6 network using public-key cryptography for address allocation and a distributed hash table for routing. This provides near-zero-configuration networking, and prevents many of the security and scalability issues that plague existing networks. diff --git a/doc/PRE_INSTALL.md b/doc/PRE_INSTALL.md new file mode 100644 index 0000000..1c5eb48 --- /dev/null +++ b/doc/PRE_INSTALL.md @@ -0,0 +1 @@ +What you need to know before installing cjdns... \ No newline at end of file diff --git a/doc/screenshots/example.jpg b/doc/screenshots/example.jpg deleted file mode 100644 index a1efa1a36d593384df59dc13db03fa83b0436d69..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35451 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 UE-)&$xd9C0IsX9d#{5|Pe`qLcKmY&$ diff --git a/doc/screenshots/screenshot.png b/doc/screenshots/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..8a5d7460f84786f03fed77ef9e71b18f75256dbf GIT binary patch literal 19287 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 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 deleted file mode 100644 index f0964a6..0000000 --- a/scripts/change_url +++ /dev/null @@ -1,47 +0,0 @@ -#!/bin/bash - -#================================================= -# GENERIC STARTING -#================================================= -# IMPORT GENERIC HELPERS -#================================================= - -source _common.sh -source /usr/share/yunohost/helpers - -#================================================= -# 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 - -#================================================= -# SPECIFIC MODIFICATIONS -#================================================= -# ... -#================================================= - -#================================================= -# GENERIC FINALISATION -#================================================= -# START SYSTEMD SERVICE -#================================================= -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" - -#================================================= -# END OF SCRIPT -#================================================= - -ynh_script_progression --message="Change of URL completed for $app" --last diff --git a/scripts/install b/scripts/install index ef1f62b..6c9d1a3 100755 --- a/scripts/install +++ b/scripts/install @@ -14,26 +14,25 @@ source /usr/share/yunohost/helpers #================================================= # DOWNLOAD, CHECK AND UNPACK SOURCE #================================================= -ynh_script_progression --message="Downloading cjdns binary..." --weight=1 -cd $data_dir -wget https://github.com/dkoukoul/cjdns/releases/download/debian/cjdroute +ynh_script_progression --message="Setting up source files..." --weight=1 +# Download, check integrity, uncompress and patch the source from app.src +ynh_setup_source --dest_dir="$install_dir" + +chmod -R o-rwx "$install_dir" +chown -R $app:www-data "$install_dir" +chmod +x "$install_dir/cjdroute" + +# mv $install_dir/cjdroute $data_dir/cjdroute #================================================= -# SYSTEM CONFIGURATION +# CONFIGURING CJDNS #================================================= -ynh_script_progression --message="Generating cjdroute configuration file..." --weight=1 +ynh_script_progression --message="Configuring cjdns..." --weight=1 -chmod +x cjdroute -./cjdroute --genconf | ./cjdroute --cleanconf > cjdroute.conf -echo "Cjdroute configuration file generated" -### echo "Generating seed..." -### echo "/data/cjdroute.conf|$PKTEER_SECRET" | sha256sum | /server/cjdns/cjdroute --genconf-seed -echo "Editing cjdroute configuration file..." -jq '.security[0].setuser = 0' $data_dir/cjdroute.conf > $data_dir/cjdroute.conf.tmp && mv $data_dir/cjdroute.conf.tmp $data_dir/cjdroute.conf -jq '.noBackground = 1' $data_dir/cjdroute.conf > $data_dir/cjdroute.conf.tmp && mv $data_dir/cjdroute.conf.tmp $data_dir/cjdroute.conf +$install_dir/cjdroute --genconf | $install_dir/cjdroute --cleanconf > $install_dir/cjdroute.conf -# Use logrotate to manage application logfile(s) -# ynh_use_logrotate +jq '.security[0].setuser = 0' $install_dir/cjdroute.conf > $install_dir/cjdroute.conf.tmp && mv $install_dir/cjdroute.conf.tmp $install_dir/cjdroute.conf +jq '.noBackground = 1' $install_dir/cjdroute.conf > $install_dir/cjdroute.conf.tmp && mv $install_dir/cjdroute.conf.tmp $install_dir/cjdroute.conf #================================================= # SETUP SYSTEMD @@ -43,12 +42,14 @@ ynh_script_progression --message="Configuring cjdns systemd service..." # Create a dedicated systemd config ynh_add_systemd_config +# Use logrotate to manage application logfile(s) +ynh_use_logrotate #================================================= # INTEGRATE SERVICE IN YUNOHOST #================================================= ynh_script_progression --message="Integrating cjdns service in YunoHost..." -yunohost service add $app --description="$app service" +yunohost service add $app --description="$app service" --log="/var/log/$app/$app.log" #================================================= # GENERIC FINALIZATION @@ -58,7 +59,7 @@ yunohost service add $app --description="$app service" ynh_script_progression --message="Launching cjdns service..." --weight=1 # Start a systemd service -ynh_systemd_action --service_name=$app --action="start" +ynh_systemd_action --service_name=$app --action="start" --log_path="systemd" #================================================= # END OF SCRIPT diff --git a/scripts/remove b/scripts/remove index 932548d..b5d3290 100755 --- a/scripts/remove +++ b/scripts/remove @@ -9,18 +9,6 @@ source _common.sh source /usr/share/yunohost/helpers -# Settings are automatically loaded as bash variables -# in every app script context, therefore typically these will exist: -# - $domain -# - $path -# - $language -# - $install_dir -# - $port -# ... - -# For remove operations : -# - the core will deprovision every resource defined in the manifest **after** this script is ran -# this includes removing the install directory, and data directory (if --purge was used) #================================================= # REMOVE SYSTEM CONFIGURATIONS @@ -40,13 +28,17 @@ fi ynh_remove_systemd_config -ynh_remove_logrotate +# ================================================= +# STOP AND REMOVE SERVICE +#================================================= +ynh_script_progression --message="Stopping and removing the systemd service..." --weight=1 +systemctl stop cjdns +killall cjdroute # Remove other various files specific to the app... such as : - ynh_secure_remove --file="/var/log/$app" - +ynh_secure_remove --file="$install_dir" #================================================= # END OF SCRIPT #================================================= diff --git a/scripts/restore b/scripts/restore deleted file mode 100755 index 0440828..0000000 --- a/scripts/restore +++ /dev/null @@ -1,81 +0,0 @@ -#!/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 - -#================================================= -# RESTORE THE APP MAIN DIR -#================================================= -ynh_script_progression --message="Restoring the app main directory..." --weight=1 - -ynh_restore_file --origin_path="$install_dir" - -# $install_dir will automatically be initialized with some decent -# permissions by default ... however, you may need to recursively reapply -# ownership to all files such as after the ynh_setup_source step -chown -R $app:www-data "$install_dir" - -#================================================= -# RESTORE THE DATA DIRECTORY -#================================================= -ynh_script_progression --message="Restoring the data directory..." --weight=1 - -ynh_restore_file --origin_path="$data_dir" --not_mandatory - -# (Same as for install dir) -chown -R $app:www-data "$data_dir" - -#================================================= -# RESTORE SYSTEM CONFIGURATIONS -#================================================= -# RESTORE THE PHP-FPM CONFIGURATION -#================================================= -ynh_script_progression --message="Restoring system configurations related to $app..." --weight=1 - -# This should be a symetric version of what happens in the install script - -ynh_restore_file --origin_path="/etc/php/$phpversion/fpm/pool.d/$app.conf" - -ynh_restore_file --origin_path="/etc/nginx/conf.d/$domain.d/$app.conf" - -ynh_restore_file --origin_path="/etc/systemd/system/$app.service" -systemctl enable $app.service --quiet - -yunohost service add $app --description="A short description of the app" --log="/var/log/$app/$app.log" - -ynh_restore_file --origin_path="/etc/logrotate.d/$app" - -ynh_restore_file --origin_path="/etc/fail2ban/jail.d/$app.conf" -ynh_restore_file --origin_path="/etc/fail2ban/filter.d/$app.conf" -ynh_systemd_action --action=restart --service_name=fail2ban - -# Other various files... - -ynh_restore_file --origin_path="/etc/cron.d/$app" -ynh_restore_file --origin_path="/etc/$app/" - -#================================================= -# GENERIC FINALIZATION -#================================================= -# RELOAD NGINX AND PHP-FPM OR THE APP SERVICE -#================================================= -ynh_script_progression --message="Reloading NGINX web server and $app's service..." --weight=1 - -# Typically you only have either $app or php-fpm but not both at the same time... -ynh_systemd_action --service_name=$app --action="start" --log_path="/var/log/$app/$app.log" -ynh_systemd_action --service_name=php$phpversion-fpm --action=reload - -ynh_systemd_action --service_name=nginx --action=reload - -#================================================= -# END OF SCRIPT -#================================================= - -ynh_script_progression --message="Restoration completed for $app" --last diff --git a/scripts/upgrade b/scripts/upgrade deleted file mode 100755 index aae56b5..0000000 --- a/scripts/upgrade +++ /dev/null @@ -1,135 +0,0 @@ -#!/bin/bash - -#================================================= -# GENERIC START -#================================================= -# IMPORT GENERIC HELPERS -#================================================= - -source _common.sh -source /usr/share/yunohost/helpers - -# Settings are automatically loaded as bash variables -# in every app script context, therefore typically these will exist: -# - $domain -# - $path -# - $language -# - $install_dir -# - $port -# ... - -# In the context of upgrade, -# - resources are automatically provisioned / updated / deleted (depending on existing resources) -# - a safety backup is automatically created by the core and will be restored if the upgrade fails - -### This helper will compare the version of the currently installed app and the version of the upstream package. -### $upgrade_type can have 2 different values -### - UPGRADE_APP if the upstream app version has changed -### - UPGRADE_PACKAGE if only the YunoHost package has changed -### ynh_check_app_version_changed will stop the upgrade if the app is up to date. -### UPGRADE_APP should be used to upgrade the core app only if there's an upgrade to do. -upgrade_type=$(ynh_check_app_version_changed) - -#================================================= -# STANDARD UPGRADE STEPS -#================================================= -# ENSURE DOWNWARD COMPATIBILITY -#================================================= -#ynh_script_progression --message="Ensuring downward compatibility..." --weight=1 - -# -# N.B. : the following setting migration snippets are provided as *EXAMPLES* -# of what you may want to do in some cases (e.g. a setting was not defined on -# some legacy installs and you therefore want to initiaze stuff during upgrade) -# - -# 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 install_dir doesn't exist, create it -#if [ -z "$install_dir" ]; then -# install_dir=/var/www/$app -# ynh_app_setting_set --app=$app --key=install_dir --value=$install_dir -#fi - -#================================================= -# 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" - -#================================================= -# "REBUILD" THE APP (DEPLOY NEW SOURCES, RERUN NPM BUILD...) -#================================================= -# DOWNLOAD, CHECK AND UNPACK SOURCE -#================================================= - -if [ "$upgrade_type" == "UPGRADE_APP" ] -then - ynh_script_progression --message="Upgrading source files..." --weight=1 - - # Download, check integrity, uncompress and patch the source from manifest.toml - ynh_setup_source --dest_dir="$install_dir" -fi - -# $install_dir will automatically be initialized with some decent -# permissions by default ... however, you may need to recursively reapply -# ownership to all files such as after the ynh_setup_source step -chown -R $app:www-data "$install_dir" - -#================================================= -# REAPPLY SYSTEM CONFIGURATIONS -#================================================= -ynh_script_progression --message="Upgrading system configurations related to $app..." --weight=1 - -# This should be a literal copypaste of what happened in the install's "System configuration" section - -ynh_add_systemd_config - -yunohost service add $app --description="A short description of the app" --log="/var/log/$app/$app.log" - -ynh_use_logrotate --non-append - -#================================================= -# RECONFIGURE THE APP (UPDATE CONF, APPLY MIGRATIONS...) -#================================================= -# UPDATE A CONFIG FILE -#================================================= -ynh_script_progression --message="Updating a configuration file..." --weight=1 - -### Same as during install -### -### The file will automatically be backed-up if it's found to be manually modified (because -### ynh_add_config keeps track of the file's checksum) - -ynh_add_config --template="some_config_file" --destination="$install_dir/some_config_file" - -# FIXME: this should be handled by the core in the future -# You may need to use chmod 600 instead of 400, -# for example if the app is expected to be able to modify its own config -chmod 400 "$install_dir/some_config_file" -chown $app:$app "$install_dir/some_config_file" - -### For more complex cases where you want to replace stuff using regexes, -### you shoud rely on ynh_replace_string (which is basically a wrapper for sed) -### When doing so, you also need to manually call ynh_store_file_checksum -### -### ynh_replace_string --match_string="match_string" --replace_string="replace_string" --target_file="$install_dir/some_config_file" -### ynh_store_file_checksum --file="$install_dir/some_config_file" - -#================================================= -# START SYSTEMD SERVICE -#================================================= -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" - -#================================================= -# END OF SCRIPT -#================================================= - -ynh_script_progression --message="Upgrade of $app completed" --last