From 0c0316a44383997838246d99f34c63a13b78ea4d Mon Sep 17 00:00:00 2001 From: Maniack Crudelis Date: Wed, 17 Jun 2020 21:54:05 +0200 Subject: [PATCH] Work in progress... --- README.md | 6 +- README_fr.md | 6 +- actions.toml | 38 +++ check_process | 74 +++-- conf/FTL_3.src | 7 +- conf/FTL_last.src | 4 +- conf/admin_dashboard_last.src | 4 +- conf/app_last.src | 4 +- conf/dns-servers.conf | 10 + conf/dnsmasq_regenconf_hook | 64 ++-- conf/pihole-FTL.conf | 28 +- config_panel.toml | 6 + manifest.json | 188 +++++------ scripts/_common.sh | 293 +----------------- scripts/_variables | 11 + scripts/_ynh_add_fpm_config | 132 -------- scripts/actions/reset_default_app | 256 +++++++++++++++ scripts/actions/reset_default_config | 77 +++-- scripts/actions/reset_default_system | 64 ++++ scripts/backup | 19 +- scripts/change_url | 36 +-- scripts/config | 77 +++-- scripts/install | 93 +++--- scripts/remove | 14 +- scripts/restore | 93 ++++-- scripts/upgrade | 214 ++++++++----- sources/patches/.gitignore | 2 - .../patches/FTL_last-dns_replacement.patch | 131 -------- 28 files changed, 1000 insertions(+), 951 deletions(-) create mode 100644 conf/dns-servers.conf delete mode 100644 scripts/_ynh_add_fpm_config create mode 100755 scripts/actions/reset_default_app create mode 100755 scripts/actions/reset_default_system delete mode 100644 sources/patches/.gitignore delete mode 100644 sources/patches/FTL_last-dns_replacement.patch diff --git a/README.md b/README.md index ce6f798..d461fbb 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ If you don't have YunoHost, please see [here](https://yunohost.org/#/install) to ## Overview Network-wide ad blocking via your own Linux hardware -**Shipped version:** 3.3.1 +**Shipped version:** 3.3.1 or 5.0 ## Screenshots @@ -41,7 +41,7 @@ Use the admin panel of your Pi-hole to configure this app. You may also need to * x86-64b - [![](https://ci-apps.yunohost.org/ci/logs/pihole%20%28Apps%29.svg)](https://ci-apps.yunohost.org/ci/apps/pihole/) * ARMv8-A - [![](https://ci-apps-arm.yunohost.org/ci/logs/pihole%20%28Apps%29.svg)](https://ci-apps-arm.yunohost.org/ci/apps/pihole/) -* Jessie x86-64b - [![](https://ci-stretch.nohost.me/ci/logs/pihole%20%28Apps%29.svg)](https://ci-stretch.nohost.me/ci/apps/pihole/) +* Buster x86-64b - [![](https://ci-buster.nohost.me/ci/logs/pihole%20%28Apps%29.svg)](https://ci-buster.nohost.me/ci/apps/pihole/) ## Limitations @@ -66,7 +66,7 @@ Please do your pull request to the [testing branch](https://github.com/YunoHost- To try the testing branch, please do the following: ``` -sudo yunohost app install https://github.com/YunoHost-Apps/pihole_ynh/tree/testing --debug +sudo yunohost app install https://github.com/YunoHost-Apps/pihole_ynh/tree/testing --force --debug or sudo yunohost app upgrade pihole -u https://github.com/YunoHost-Apps/pihole_ynh/tree/testing --debug ``` diff --git a/README_fr.md b/README_fr.md index f7838b9..636f57f 100644 --- a/README_fr.md +++ b/README_fr.md @@ -11,7 +11,7 @@ Si vous n'avez pas YunoHost, merci de regarder [ici](https://yunohost.org/#/inst ## Résumé Blocage des publicités sur l'ensemble du réseau via votre propre matériel Linux -**Version embarquée:** 3.3.1 +**Version embarquée:** 3.3.1 ou 5.0 ## Captures d'écran @@ -42,7 +42,7 @@ Utiliser le panneau d'administration de votre Pi-hole pour configurer cette appl * x86-64b - [![](https://ci-apps.yunohost.org/ci/logs/pihole%20%28Apps%29.svg)](https://ci-apps.yunohost.org/ci/apps/pihole/) * ARMv8-A - [![](https://ci-apps-arm.yunohost.org/ci/logs/pihole%20%28Apps%29.svg)](https://ci-apps-arm.yunohost.org/ci/apps/pihole/) -* Jessie x86-64b - [![](https://ci-stretch.nohost.me/ci/logs/pihole%20%28Apps%29.svg)](https://ci-stretch.nohost.me/ci/apps/pihole/) +* Buster x86-64b - [![](https://ci-buster.nohost.me/ci/logs/pihole%20%28Apps%29.svg)](https://ci-buster.nohost.me/ci/apps/pihole/) ## Limitations @@ -67,7 +67,7 @@ Merci de faire vos pull request sur la [branche testing](https://github.com/Yuno Pour tester la branche testing, merci de procéder ainsi. ``` -sudo yunohost app install https://github.com/YunoHost-Apps/pihole_ynh/tree/testing --debug +sudo yunohost app install https://github.com/YunoHost-Apps/pihole_ynh/tree/testing --force --debug ou sudo yunohost app upgrade pihole -u https://github.com/YunoHost-Apps/pihole_ynh/tree/testing --debug ``` diff --git a/actions.toml b/actions.toml index 5aff36a..fc7f8aa 100644 --- a/actions.toml +++ b/actions.toml @@ -15,3 +15,41 @@ command = "/bin/bash scripts/actions/reset_default_config \"pihole-FTL.conf\"" # accepted_return_codes = [0, 1, 2, 3] # optional accepted_return_codes = [0] description = "Reset the config file pihole-FTL.conf." + +[reset_default_dnsmasq] +name = "Reset the config file and restore a default one." +command = "/bin/bash scripts/actions/reset_default_config \"01-pihole.conf\"" +# user = "root" # optional +# cwd = "/" # optional +# accepted_return_codes = [0, 1, 2, 3] # optional +accepted_return_codes = [0] +description = "Reset the config file dnsmasq.d/01-pihole.conf." + + +[reset_default_nginx] +name = "Reset the nginx config for this app." +command = "/bin/bash scripts/actions/reset_default_system nginx" +# user = "root" # optional +# cwd = "/" # optional +# accepted_return_codes = [0, 1, 2, 3] # optional +accepted_return_codes = [0] +description = "Reset the nginx config for this app." + +[reset_default_phpfpm] +name = "Reset the php-fpm config for this app." +command = "/bin/bash scripts/actions/reset_default_system phpfpm" +# user = "root" # optional +# cwd = "/" # optional +# accepted_return_codes = [0, 1, 2, 3] # optional +accepted_return_codes = [0] +description = "Reset the php-fpm config for this app." + + +[reset_default_app] +name = "Reset the app with a default configuration." +command = "/bin/bash scripts/actions/reset_default_app" +# user = "root" # optional +# cwd = "/" # optional +# accepted_return_codes = [0, 1, 2, 3] # optional +accepted_return_codes = [0] +description = "Reset the app to its default configuration to try to fix potential issues.
This action won't remove any data added to the app.
However, if you have modified any configuration, it will be overwritten." diff --git a/check_process b/check_process index b255fb0..96ed247 100644 --- a/check_process +++ b/check_process @@ -1,28 +1,56 @@ -;; Test complet - ; Manifest - domain="domain.tld" (DOMAIN) - path="/path" (PATH) - admin="john" (USER) - query_logging="1" - ; Checks - pkg_linter=1 - setup_sub_dir=1 - setup_root=1 - setup_nourl=0 - setup_private=1 - setup_public=0 - upgrade=1 - upgrade=1 from_commit=d79ec131b3038ff4695c3317b5d3ee4eda9c8932 - backup_restore=1 - multi_instance=0 - port_already_use=1 (4711) - change_url=1 +;; Test version last version + ; Manifest + domain="domain.tld" (DOMAIN) + path="/path" (PATH) + admin="john" (USER) + query_logging=1 + enable_dhcp=0 + pihole_version="Last available" + ; Config_panel + main.overwrite_files.overwrite_setupvars=0|1 + main.overwrite_files.overwrite_ftl=0|1 + main.overwrite_files.overwrite_nginx=0|1 + main.overwrite_files.overwrite_phpfpm=0|1 + main.global_config.email_type=0|1 + main.php_fpm_config.footprint=low|medium|high + main.php_fpm_config.free_footprint=20 + main.php_fpm_config.usage=low|medium|high + main.php_fpm_config.force_max_children=20|0 + ; Checks + pkg_linter=1 + setup_sub_dir=1 + setup_root=1 + setup_nourl=0 + setup_private=1 + setup_public=0 + upgrade=1 + backup_restore=1 + multi_instance=0 + port_already_use=1 (4711) + change_url=1 + actions=1 + config_panel=1 +;; Test version 3 + ; Manifest + domain="domain.tld" (DOMAIN) + path="/path" (PATH) + admin="john" (USER) + query_logging=1 + enable_dhcp=0 + pihole_version="Last 3.X" + ; Checks + setup_sub_dir=1 + setup_root=0 + upgrade=1 + upgrade=1 from_commit=d79ec131b3038ff4695c3317b5d3ee4eda9c8932 + backup_restore=1 + actions=1 ;;; Levels - Level 5=auto + Level 5=auto ;;; Options Email= Notification=change ;;; Upgrade options - ; commit=d79ec131b3038ff4695c3317b5d3ee4eda9c8932 - name= Stretch fix - manifest_arg=domain=DOMAIN&path=PATH&admin=USER&query_logging=1& + ; commit=d79ec131b3038ff4695c3317b5d3ee4eda9c8932 + name= Stretch fix + manifest_arg=domain=DOMAIN&path=PATH&admin=USER&query_logging=1& diff --git a/conf/FTL_3.src b/conf/FTL_3.src index 31d1e65..c08c993 100644 --- a/conf/FTL_3.src +++ b/conf/FTL_3.src @@ -1,9 +1,6 @@ -SOURCE_URL=https://github.com/pi-hole/FTL/archive/v2.13.2.tar.gz -SOURCE_SUM=07383d2b3de1ef31526b090603e783b3 +SOURCE_URL=https://github.com/pi-hole/FTL/archive/v3.0.tar.gz +SOURCE_SUM=45fd33e4498b2ab9403d96e1251abb8c SOURCE_SUM_PRG=md5sum SOURCE_FORMAT=tar.gz SOURCE_IN_SUBDIR=true SOURCE_FILENAME= - -# Be carrefull, the version 3.0 isn't compatible with the version of dnsmasq available on Jessie. -# So, we need to stay stick on the version 2.13.2. diff --git a/conf/FTL_last.src b/conf/FTL_last.src index 60342ce..f6e3f41 100644 --- a/conf/FTL_last.src +++ b/conf/FTL_last.src @@ -1,5 +1,5 @@ -SOURCE_URL=https://github.com/pi-hole/FTL/archive/v4.3.1.tar.gz -SOURCE_SUM=1c0df5fa42e7f7b89c7e704fdc1b5154 +SOURCE_URL=https://github.com/pi-hole/FTL/archive/v5.0.tar.gz +SOURCE_SUM=a405fee9a924324eefe6bfb832180c3d SOURCE_SUM_PRG=md5sum SOURCE_FORMAT=tar.gz SOURCE_IN_SUBDIR=true diff --git a/conf/admin_dashboard_last.src b/conf/admin_dashboard_last.src index ee04744..25b95ff 100644 --- a/conf/admin_dashboard_last.src +++ b/conf/admin_dashboard_last.src @@ -1,5 +1,5 @@ -SOURCE_URL=https://github.com/pi-hole/AdminLTE/archive/v4.3.3.tar.gz -SOURCE_SUM=3f9da0e1f9134393758b7a1425ca66f6 +SOURCE_URL=https://github.com/pi-hole/AdminLTE/archive/v5.0.tar.gz +SOURCE_SUM=9402041b365e78a02a95942bdd3c3c05 SOURCE_SUM_PRG=md5sum SOURCE_FORMAT=tar.gz SOURCE_IN_SUBDIR=true diff --git a/conf/app_last.src b/conf/app_last.src index 3e7c2a8..4836f9a 100644 --- a/conf/app_last.src +++ b/conf/app_last.src @@ -1,5 +1,5 @@ -SOURCE_URL=https://github.com/pi-hole/pi-hole/archive/v4.4.tar.gz -SOURCE_SUM=970013bf8e273b868dd184ac2ffb1348 +SOURCE_URL=https://github.com/pi-hole/pi-hole/archive/v5.0.tar.gz +SOURCE_SUM=0f19aeefad3063c44f421de1ad21b233 SOURCE_SUM_PRG=md5sum SOURCE_FORMAT=tar.gz SOURCE_IN_SUBDIR=true diff --git a/conf/dns-servers.conf b/conf/dns-servers.conf new file mode 100644 index 0000000..cbe97e3 --- /dev/null +++ b/conf/dns-servers.conf @@ -0,0 +1,10 @@ +(FR) FDN;80.67.169.12;80.67.169.40;2001:910:800::12;2001:910:800::40 +(FR) LDN;80.67.188.188;2001:913::8 +(FR) ARN;89.234.141.66;2a00:5881:8100:1000::3 +(FR) Aquilenet;185.233.100.100;185.233.100.101;2a0c:e300::100;2a0c:e300::101 +(FR) gozmail / grifon;80.67.190.200;80.67.190.200;2a00:5884:8218::1;2a00:5884:8218::1 +(DE) FoeBud / Digital Courage;85.214.20.141;85.214.20.141 +(DE) CCC Berlin;195.160.173.53;195.160.173.53 +(DE) AS250;194.150.168.168;194.150.168.168;2001:4ce8::53;2001:4ce8::53 +(DE) Ideal-Hosting;84.200.69.80;84.200.70.40;2001:1608:10:25::1c04:b12f;2001:1608:10:25::9249:d69b +(DK) censurfridns;91.239.100.100;89.233.43.71;2001:67c:28a4::;2a01:3a0:53:53:: diff --git a/conf/dnsmasq_regenconf_hook b/conf/dnsmasq_regenconf_hook index 0212f09..0e4c2ef 100755 --- a/conf/dnsmasq_regenconf_hook +++ b/conf/dnsmasq_regenconf_hook @@ -7,47 +7,47 @@ pending_conf=$4 # Path of the pending conf file temp_dir=/tmp/pi-hole.bck do_pre_regen() { - if [ $dryrun -eq 0 ] - then - # Créer une sauvegarde des config dnsmasq de pi-hole. Que la regen-conf va sauvagement supprimer - mkdir $temp_dir - cp -a "/etc/dnsmasq.d/01-pihole.conf" "$temp_dir" - test -e "/etc/dnsmasq.d/02-pihole-dhcp.conf" && cp -a "/etc/dnsmasq.d/02-pihole-dhcp.conf" "$temp_dir" - test -e "/etc/dnsmasq.d/03-pihole-wildcard.conf" && cp -a "/etc/dnsmasq.d/03-pihole-wildcard.conf" "$temp_dir" + if [ $dryrun -eq 0 ] + then + # Créer une sauvegarde des config dnsmasq de pi-hole. Que la regen-conf va sauvagement supprimer + mkdir $temp_dir + cp -a "/etc/dnsmasq.d/01-pihole.conf" "$temp_dir" + test -e "/etc/dnsmasq.d/02-pihole-dhcp.conf" && cp -a "/etc/dnsmasq.d/02-pihole-dhcp.conf" "$temp_dir" + test -e "/etc/dnsmasq.d/03-pihole-wildcard.conf" && cp -a "/etc/dnsmasq.d/03-pihole-wildcard.conf" "$temp_dir" - # Décommente le cache-size de la config par défaut - sed --in-place "s/^#pihole# cache-size=/cache-size=/g" /etc/dnsmasq.conf - # Et commente celui de pi-hole - sed --in-place "s/^cache-size=/#cache-size=/g" /etc/dnsmasq.d/01-pihole.conf - fi + # Décommente le cache-size de la config par défaut + sed --in-place "s/^#pihole# cache-size=/cache-size=/g" /etc/dnsmasq.conf + # Et commente celui de pi-hole + sed --in-place "s/^cache-size=/#cache-size=/g" /etc/dnsmasq.d/01-pihole.conf + fi } do_post_regen() { - # Restaure la config dnsmasq de pi-hole - cp -a "$temp_dir/01-pihole.conf" "/etc/dnsmasq.d/" - test -e "$temp_dir/02-pihole-dhcp.conf" && cp -a "$temp_dir/02-pihole-dhcp.conf" "/etc/dnsmasq.d/" - test -e "$temp_dir/03-pihole-wildcard.conf" && cp -a "$temp_dir/03-pihole-wildcard.conf" "/etc/dnsmasq.d/" - # Supprime le dossier temporaire - test -n $temp_dir && rm -r $temp_dir + # Restaure la config dnsmasq de pi-hole + cp -a "$temp_dir/01-pihole.conf" "/etc/dnsmasq.d/" + test -e "$temp_dir/02-pihole-dhcp.conf" && cp -a "$temp_dir/02-pihole-dhcp.conf" "/etc/dnsmasq.d/" + test -e "$temp_dir/03-pihole-wildcard.conf" && cp -a "$temp_dir/03-pihole-wildcard.conf" "/etc/dnsmasq.d/" + # Supprime le dossier temporaire + test -n $temp_dir && rm -r $temp_dir - # Commente le cache-size de la config par défaut - sed --in-place "s/^cache-size=/#pihole# cache-size=/g" /etc/dnsmasq.conf + # Commente le cache-size de la config par défaut + sed --in-place "s/^cache-size=/#pihole# cache-size=/g" /etc/dnsmasq.conf - # Reload dnsmasq - systemctl reload dnsmasq + # Reload dnsmasq + systemctl reload dnsmasq } case "$1" in - pre) - do_pre_regen - ;; - post) - do_post_regen - ;; - *) - echo "Hook called with unknown argument \`$1'" >&2 - exit 1 - ;; + pre) + do_pre_regen + ;; + post) + do_post_regen + ;; + *) + echo "Hook called with unknown argument \`$1'" >&2 + exit 1 + ;; esac exit 0 diff --git a/conf/pihole-FTL.conf b/conf/pihole-FTL.conf index b9b8dca..869f50c 100644 --- a/conf/pihole-FTL.conf +++ b/conf/pihole-FTL.conf @@ -1,31 +1,31 @@ -# Listen only for local socket connections or permit all connections -# localonly|all +; Listen only for local socket connections or permit all connections +; localonly|all SOCKET_LISTENING=localonly -# Display all queries? Set to no to hide query display -# yes|no +; Display all queries? Set to no to hide query display +; yes|no QUERY_DISPLAY=yes -# Allow FTL to analyze AAAA queries from pihole.log? -# yes|no +; Allow FTL to analyze AAAA queries from pihole.log? +; yes|no AAAA_QUERY_ANALYSIS=yes -# How long should queries be stored in the database? Setting this to 0 disables the database altogether +; How long should queries be stored in the database? Setting this to 0 disables the database altogether MAXDBDAYS=365 -# Should FTL try to resolve IPv6 addresses to host names? -# yes|no +; Should FTL try to resolve IPv6 addresses to host names? +; yes|no RESOLVE_IPV6=yes -# Should FTL try to resolve IPv4 addresses to host names? -# yes|no +; Should FTL try to resolve IPv4 addresses to host names? +; yes|no RESOLVE_IPV4=yes -# How often do we store queries in FTL's database [minutes]? +; How often do we store queries in FTL's database [minutes]? DBINTERVAL=1.0 -# Specify path and filename of FTL's SQLite long-term database. Setting this to DBFILE= disables the database altogether +; Specify path and filename of FTL's SQLite long-term database. Setting this to DBFILE= disables the database altogether DBFILE=/etc/pihole/pihole-FTL.db -# Up to how many hours of queries should be imported from the database and logs? Maximum is 744 (31 days) +; Up to how many hours of queries should be imported from the database and logs? Maximum is 744 (31 days) MAXLOGAGE=24.0 diff --git a/config_panel.toml b/config_panel.toml index 338ee26..9721f5e 100644 --- a/config_panel.toml +++ b/config_panel.toml @@ -62,3 +62,9 @@ name = "PiHole configuration" choices = ["low", "medium", "high"] default = "low" help = "low: Personal usage, behind the sso. No RAM footprint when not used, but the impact on the processor can be high if many users are using the service.
medium: Low usage, few people or/and publicly accessible. Low RAM footprint, medium processor footprint when used.
high: High usage, frequently visited website. High RAM footprint, but lower on processor usage and quickly responding." + + [main.php_fpm_config.force_max_children] + ask = "Force the value of pm.max_children ?" + type = "number" + default = "0" + help = "Do not change this value unless you're sure about what you're doing !
pm.max_children is automatically defined by this formula: $max_ram / 2 / $footprint
You can force that value, and ignore the formula by changing the value here.
To reset to the default value, set to 0." diff --git a/manifest.json b/manifest.json index 7a603d8..b561183 100644 --- a/manifest.json +++ b/manifest.json @@ -1,96 +1,96 @@ { - "name": "Pi-hole", - "id": "pihole", - "packaging_format": 1, - "description": { - "en": "Network-wide ad blocking via your own DNS server.", - "fr": "Filtrage publicitaire sur l'ensemble du réseau via votre propre serveur DNS." - }, - "version": "3.3.1~ynh6", - "url": "https://pi-hole.net/", - "license": "EUPL-1.2", - "maintainer": { - "name": "Maniack Crudelis", - "email": "maniackc_dev@crudelis.fr" - }, - "requirements": { - "yunohost": ">= 3.6" - }, - "multi_instance": false, - "services": [ - "nginx", - "php7.0-fpm" - ], - "arguments": { - "install" : [ - { - "name": "domain", - "type": "domain", - "ask": { - "en": "Choose a domain for the admin interface of Pi-hole", - "fr": "Choisissez un domaine pour l'interface admin de Pi-hole" - }, - "example": "domain.org" - }, - { - "name": "path", - "type": "path", - "ask": { - "en": "Choose a path for the admin interface of Pi-hole", - "fr": "Choisissez un chemin pour l'interface admin de Pi-hole" - }, - "example": "/pihole", - "default": "/pihole" - }, - { - "name": "admin", - "type": "user", - "ask": { - "en": "Choose the Pi-hole administrator (must be an existing YunoHost user)", - "fr": "Administrateur de Pi-hole (doit être un utilisateur YunoHost existant)" - }, - "example": "john" - }, - { - "name": "query_logging", - "type": "boolean", - "ask": { - "en": "Do you want to log queries ?", - "fr": "Voulez-vous enregistrer les requêtes dns ?" - }, - "help": { - "en": "Keeping this option deactivate will render graphs on the admin page useless. But will respect the privacy of the other users.", - "fr": "Garder cette option désactivée rendra les graphiques sur la page d'administration inutiles. Mais respectera la vie privée des autres utilisateurs." - }, - "default": false - }, - { - "name": "enable_dhcp", - "type": "boolean", - "ask": { - "en": "Do you want to set Pi-hole as your DHCP server ?", - "fr": "Voulez-vous utiliser Pi-hole an tant que serveur DHCP ?" - }, - "help": { - "en": "If you want to do that, you really have to read this before !", - "fr": "Si vous voulez faire ça, vous devez vraiment lire cela avant !" - }, - "default": false - }, - { - "name": "pihole_version", - "type": "string", - "ask": { - "en": "Which version of Pi-Hole do you want to install ?", - "fr": "Quelle version de Pi-Hole voulez-vous installer ?" - }, - "help": { - "en": "The last 3.X version is the last version available with the Debian version of dnsmasq.", - "fr": "The last available version will replace the Debian version of dnsmasq by FTLDNS.
See the readme for more information." - }, - "choices" : ["Last 3.X","Last available"], - "default": "Last 3.X" - } - ] - } + "name": "Pi-hole", + "id": "pihole", + "packaging_format": 1, + "description": { + "en": "Network-wide ad blocking via your own DNS server.", + "fr": "Filtrage publicitaire sur l'ensemble du réseau via votre propre serveur DNS." + }, + "version": "5.0~ynh1", + "url": "https://pi-hole.net/", + "license": "EUPL-1.2", + "maintainer": { + "name": "Maniack Crudelis", + "email": "maniackc_dev@crudelis.fr" + }, + "requirements": { + "yunohost": ">= 3.8" + }, + "multi_instance": false, + "services": [ + "nginx", + "php7.0-fpm" + ], + "arguments": { + "install" : [ + { + "name": "domain", + "type": "domain", + "ask": { + "en": "Choose a domain for the admin interface of Pi-hole", + "fr": "Choisissez un domaine pour l'interface admin de Pi-hole" + }, + "example": "domain.org" + }, + { + "name": "path", + "type": "path", + "ask": { + "en": "Choose a path for the admin interface of Pi-hole", + "fr": "Choisissez un chemin pour l'interface admin de Pi-hole" + }, + "example": "/pihole", + "default": "/pihole" + }, + { + "name": "admin", + "type": "user", + "ask": { + "en": "Choose the Pi-hole administrator (must be an existing YunoHost user)", + "fr": "Administrateur de Pi-hole (doit être un utilisateur YunoHost existant)" + }, + "example": "john" + }, + { + "name": "query_logging", + "type": "boolean", + "ask": { + "en": "Do you want to log queries ?", + "fr": "Voulez-vous enregistrer les requêtes dns ?" + }, + "help": { + "en": "Keeping this option deactivate will render graphs on the admin page useless. But will respect the privacy of the other users.", + "fr": "Garder cette option désactivée rendra les graphiques sur la page d'administration inutiles. Mais respectera la vie privée des autres utilisateurs." + }, + "default": false + }, + { + "name": "enable_dhcp", + "type": "boolean", + "ask": { + "en": "Do you want to set Pi-hole as your DHCP server ?", + "fr": "Voulez-vous utiliser Pi-hole an tant que serveur DHCP ?" + }, + "help": { + "en": "If you want to do that, you really have to read this before !", + "fr": "Si vous voulez faire ça, vous devez vraiment lire cela avant !" + }, + "default": false + }, + { + "name": "pihole_version", + "type": "string", + "ask": { + "en": "Which version of Pi-Hole do you want to install ?", + "fr": "Quelle version de Pi-Hole voulez-vous installer ?" + }, + "help": { + "en": "The last 3.X version is the last version available with the Debian version of dnsmasq.", + "fr": "The last available version will replace the Debian version of dnsmasq by FTLDNS.
See the readme for more information." + }, + "choices": ["Last 3.X","Last available"], + "default": "Last 3.X" + } + ] + } } diff --git a/scripts/_common.sh b/scripts/_common.sh index 3770c0f..5c8cf50 100755 --- a/scripts/_common.sh +++ b/scripts/_common.sh @@ -1,44 +1,5 @@ #!/bin/bash -#================================================= -# PERSONAL HELPERS -#================================================= - -#================================================= -# BACKUP -#================================================= - -HUMAN_SIZE () { # Transforme une taille en Ko en une taille lisible pour un humain - human=$(numfmt --to=iec --from-unit=1K $1) - echo $human -} - -CHECK_SIZE () { # Vérifie avant chaque backup que l'espace est suffisant - file_to_analyse=$1 - backup_size=$(du --summarize "$file_to_analyse" | cut -f1) - free_space=$(df --output=avail "/home/yunohost.backup" | sed 1d) - - if [ $free_space -le $backup_size ] - then - ynh_print_err "Espace insuffisant pour sauvegarder $file_to_analyse." - ynh_print_err "Espace disponible: $(HUMAN_SIZE $free_space)" - ynh_die "Espace nécessaire: $(HUMAN_SIZE $backup_size)" - fi -} - -#================================================= -# PACKAGE CHECK BYPASSING... -#================================================= - -IS_PACKAGE_CHECK () { - if [ ${PACKAGE_CHECK_EXEC:-0} -eq 1 ] - then - return 0 - else - return 1 - fi -} - #================================================= # FUTUR OFFICIAL HELPERS #================================================= @@ -265,30 +226,6 @@ __PRE_TAG1__$(yunohost tools diagnosis | grep -B 100 "services:" | sed '/service #================================================= -ynh_debian_release () { - lsb_release --codename --short -} - -is_stretch () { - if [ "$(ynh_debian_release)" == "stretch" ] - then - return 0 - else - return 1 - fi -} - -is_jessie () { - if [ "$(ynh_debian_release)" == "jessie" ] - then - return 0 - else - return 1 - fi -} - -#================================================= - ynh_maintenance_mode_ON () { # Load value of $path_url and $domain from the config if their not set if [ -z $path_url ]; then @@ -508,237 +445,9 @@ ynh_app_changelog () { #================================================= -# Check the amount of available RAM -# -# usage: ynh_check_ram [--required=RAM required in Mb] [--no_swap|--only_swap] [--free_ram] -# | arg: -r, --required= - Amount of RAM required in Mb. The helper will return 0 is there's enough RAM, or 1 otherwise. -# If --required isn't set, the helper will print the amount of RAM, in Mb. -# | arg: -s, --no_swap - Ignore swap -# | arg: -o, --only_swap - Ignore real RAM, consider only swap. -# | arg: -f, --free_ram - Count only free RAM, not the total amount of RAM available. -ynh_check_ram () { - # Declare an array to define the options of this helper. - declare -Ar args_array=( [r]=required= [s]=no_swap [o]=only_swap [f]=free_ram ) - local required - local no_swap - local only_swap - # Manage arguments with getopts - ynh_handle_getopts_args "$@" - required=${required:-} - no_swap=${no_swap:-0} - only_swap=${only_swap:-0} - - local total_ram=$(vmstat --stats --unit M | grep "total memory" | awk '{print $1}') - local total_swap=$(vmstat --stats --unit M | grep "total swap" | awk '{print $1}') - local total_ram_swap=$(( total_ram + total_swap )) - - local free_ram=$(vmstat --stats --unit M | grep "free memory" | awk '{print $1}') - local free_swap=$(vmstat --stats --unit M | grep "free swap" | awk '{print $1}') - local free_ram_swap=$(( free_ram + free_swap )) - - # Use the total amount of ram - local ram=$total_ram_swap - if [ $free_ram -eq 1 ] - then - # Use the total amount of free ram - ram=$free_ram_swap - if [ $no_swap -eq 1 ] - then - # Use only the amount of free ram - ram=$free_ram - elif [ $only_swap -eq 1 ] - then - # Use only the amount of free swap - ram=$free_swap - fi - else - if [ $no_swap -eq 1 ] - then - # Use only the amount of free ram - ram=$total_ram - elif [ $only_swap -eq 1 ] - then - # Use only the amount of free swap - ram=$total_swap - fi - fi - - if [ -n "$required" ] - then - # Return 1 if the amount of ram isn't enough. - if [ $ram -lt $required ] - then - return 1 - else - return 0 - fi - - # If no RAM is required, return the amount of available ram. - else - echo $ram - fi -} - -#================================================= - -# Define the values to configure php-fpm -# -# usage: ynh_get_scalable_phpfpm --usage=usage --footprint=footprint [--print] -# | arg: -f, --footprint - Memory footprint of the service (low/medium/high). -# low - Less than 20Mb of ram by pool. -# medium - Between 20Mb and 40Mb of ram by pool. -# high - More than 40Mb of ram by pool. -# Or specify exactly the footprint, the load of the service as Mb by pool instead of having a standard value. -# To have this value, use the following command and stress the service. -# watch -n0.5 ps -o user,cmd,%cpu,rss -u APP -# -# | arg: -u, --usage - Expected usage of the service (low/medium/high). -# low - Personal usage, behind the sso. -# medium - Low usage, few people or/and publicly accessible. -# high - High usage, frequently visited website. -# -# | arg: -p, --print - Print the result -# -# -# -# The footprint of the service will be used to defined the maximum footprint we can allow, which is half the maximum RAM. -# So it will be used to defined 'pm.max_children' -# A lower value for the footprint will allow more children for 'pm.max_children'. And so for -# 'pm.start_servers', 'pm.min_spare_servers' and 'pm.max_spare_servers' which are defined from the -# value of 'pm.max_children' -# NOTE: 'pm.max_children' can't exceed 4 times the number of processor's cores. -# -# The usage value will defined the way php will handle the children for the pool. -# A value set as 'low' will set the process manager to 'ondemand'. Children will start only if the -# service is used, otherwise no child will stay alive. This config gives the lower footprint when the -# service is idle. But will use more proc since it has to start a child as soon it's used. -# Set as 'medium', the process manager will be at dynamic. If the service is idle, a number of children -# equal to pm.min_spare_servers will stay alive. So the service can be quick to answer to any request. -# The number of children can grow if needed. The footprint can stay low if the service is idle, but -# not null. The impact on the proc is a little bit less than 'ondemand' as there's always a few -# children already available. -# Set as 'high', the process manager will be set at 'static'. There will be always as many children as -# 'pm.max_children', the footprint is important (but will be set as maximum a quarter of the maximum -# RAM) but the impact on the proc is lower. The service will be quick to answer as there's always many -# children ready to answer. -ynh_get_scalable_phpfpm () { - local legacy_args=ufp - # Declare an array to define the options of this helper. - declare -Ar args_array=( [u]=usage= [f]=footprint= [p]=print ) - local usage - local footprint - local print - # Manage arguments with getopts - ynh_handle_getopts_args "$@" - # Set all characters as lowercase - footprint=${footprint,,} - usage=${usage,,} - print=${print:-0} - - if [ "$footprint" = "low" ] - then - footprint=20 - elif [ "$footprint" = "medium" ] - then - footprint=35 - elif [ "$footprint" = "high" ] - then - footprint=50 - fi - - # Define the way the process manager handle child processes. - if [ "$usage" = "low" ] - then - php_pm=ondemand - elif [ "$usage" = "medium" ] - then - php_pm=dynamic - elif [ "$usage" = "high" ] - then - php_pm=static - else - ynh_die --message="Does not recognize '$usage' as an usage value." - fi - - # Get the total of RAM available, except swap. - local max_ram=$(ynh_check_ram --no_swap) - - less0() { - # Do not allow value below 1 - if [ $1 -le 0 ] - then - echo 1 - else - echo $1 - fi - } - - # Define pm.max_children - # The value of pm.max_children is the total amount of ram divide by 2 and divide again by the footprint of a pool for this app. - # So if php-fpm start the maximum of children, it won't exceed half of the ram. - php_max_children=$(( $max_ram / 2 / $footprint )) - # If process manager is set as static, use half less children. - # Used as static, there's always as many children as the value of pm.max_children - if [ "$php_pm" = "static" ] - then - php_max_children=$(( $php_max_children / 2 )) - fi - php_max_children=$(less0 $php_max_children) - - # To not overload the proc, limit the number of children to 4 times the number of cores. - local core_number=$(nproc) - local max_proc=$(( $core_number * 4 )) - if [ $php_max_children -gt $max_proc ] - then - php_max_children=$max_proc - fi - - if [ "$php_pm" = "dynamic" ] - then - # Define pm.start_servers, pm.min_spare_servers and pm.max_spare_servers for a dynamic process manager - php_min_spare_servers=$(( $php_max_children / 8 )) - php_min_spare_servers=$(less0 $php_min_spare_servers) - - php_max_spare_servers=$(( $php_max_children / 2 )) - php_max_spare_servers=$(less0 $php_max_spare_servers) - - php_start_servers=$(( $php_min_spare_servers + ( $php_max_spare_servers - $php_min_spare_servers ) /2 )) - php_start_servers=$(less0 $php_start_servers) - else - php_min_spare_servers=0 - php_max_spare_servers=0 - php_start_servers=0 - fi - - if [ $print -eq 1 ] - then - ynh_debug --message="Footprint=${footprint}Mb by pool." - ynh_debug --message="Process manager=$php_pm" - ynh_debug --message="Max RAM=${max_ram}Mb" - if [ "$php_pm" != "static" ]; then - ynh_debug --message="\nMax estimated footprint=$(( $php_max_children * $footprint ))" - ynh_debug --message="Min estimated footprint=$(( $php_min_spare_servers * $footprint ))" - fi - if [ "$php_pm" = "dynamic" ]; then - ynh_debug --message="Estimated average footprint=$(( $php_max_spare_servers * $footprint ))" - elif [ "$php_pm" = "static" ]; then - ynh_debug --message="Estimated footprint=$(( $php_max_children * $footprint ))" - fi - ynh_debug --message="\nRaw php-fpm values:" - ynh_debug --message="pm.max_children = $php_max_children" - if [ "$php_pm" = "dynamic" ]; then - ynh_debug --message="pm.start_servers = $php_start_servers" - ynh_debug --message="pm.min_spare_servers = $php_min_spare_servers" - ynh_debug --message="pm.max_spare_servers = $php_max_spare_servers" - fi - fi -} - -#================================================= - # Execute a command as another user # usage: exec_as USER COMMAND [ARG ...] -exec_as() { +ynh_exec_as() { local USER=$1 shift 1 diff --git a/scripts/_variables b/scripts/_variables index 02834a9..331ded1 100644 --- a/scripts/_variables +++ b/scripts/_variables @@ -2,3 +2,14 @@ # Dependencies app_depencencies="sqlite idn2 php7.0-sqlite3 nettle-dev libcap2-bin" + +if [ "$YNH_APP_ARG_PIHOLE_VERSION" == "Last 3.X" ] +then + pihole_core_version=3.3.1 + dashboard_version=3.3 + FTL_version=3.0 +else + pihole_core_version=5.0 + dashboard_version=5.0 + FTL_version=5.0 +fi diff --git a/scripts/_ynh_add_fpm_config b/scripts/_ynh_add_fpm_config deleted file mode 100644 index 8d36834..0000000 --- a/scripts/_ynh_add_fpm_config +++ /dev/null @@ -1,132 +0,0 @@ -#!/bin/bash - -# Create a dedicated php-fpm config -# -# usage 1: ynh_add_fpm_config [--phpversion=7.X] [--use_template] -# | arg: -v, --phpversion - Version of php to use. -# | arg: -t, --use_template - Use this helper in template mode. -# -# ----------------------------------------------------------------------------- -# -# usage 2: ynh_add_fpm_config [--phpversion=7.X] --usage=usage --footprint=footprint -# | arg: -v, --phpversion - Version of php to use.# -# | arg: -f, --footprint - Memory footprint of the service (low/medium/high). -# low - Less than 20Mb of ram by pool. -# medium - Between 20Mb and 40Mb of ram by pool. -# high - More than 40Mb of ram by pool. -# Or specify exactly the footprint, the load of the service as Mb by pool instead of having a standard value. -# To have this value, use the following command and stress the service. -# watch -n0.5 ps -o user,cmd,%cpu,rss -u APP -# -# | arg: -u, --usage - Expected usage of the service (low/medium/high). -# low - Personal usage, behind the sso. -# medium - Low usage, few people or/and publicly accessible. -# high - High usage, frequently visited website. -# -# Requires YunoHost version 2.7.2 or higher. -ynh_add_fpm_config () { - # Declare an array to define the options of this helper. - local legacy_args=vtuf - declare -Ar args_array=( [v]=phpversion= [t]=use_template [u]=usage= [f]=footprint= ) - local phpversion - local use_template - local usage - local footprint - # Manage arguments with getopts - ynh_handle_getopts_args "$@" - # The default behaviour is to use the template. - use_template="${use_template:-1}" - usage="${usage:-}" - footprint="${footprint:-}" - if [ -n "$usage" ] || [ -n "$footprint" ]; then - use_template=0 - fi - - # Configure PHP-FPM 7.0 by default - phpversion="${phpversion:-7.0}" - - local fpm_config_dir="/etc/php/$phpversion/fpm" - local fpm_service="php${phpversion}-fpm" - # Configure PHP-FPM 5 on Debian Jessie - if [ "$(ynh_get_debian_release)" == "jessie" ]; then - fpm_config_dir="/etc/php5/fpm" - fpm_service="php5-fpm" - fi - ynh_app_setting_set --app=$app --key=fpm_config_dir --value="$fpm_config_dir" - ynh_app_setting_set --app=$app --key=fpm_service --value="$fpm_service" - finalphpconf="$fpm_config_dir/pool.d/$app.conf" - ynh_backup_if_checksum_is_different --file="$finalphpconf" - - if [ $use_template -eq 1 ] - then - # Usage 1, use the template in ../conf/php-fpm.conf - sudo cp ../conf/php-fpm.conf "$finalphpconf" - ynh_replace_string --match_string="__NAMETOCHANGE__" --replace_string="$app" --target_file="$finalphpconf" - ynh_replace_string --match_string="__FINALPATH__" --replace_string="$final_path" --target_file="$finalphpconf" - ynh_replace_string --match_string="__USER__" --replace_string="$app" --target_file="$finalphpconf" - ynh_replace_string --match_string="__PHPVERSION__" --replace_string="$phpversion" --target_file="$finalphpconf" - - else - # Store settings - ynh_app_setting_set --app=$app --key=fpm_footprint --value=$footprint - ynh_app_setting_set --app=$app --key=fpm_usage --value=$usage - - # Usage 2, generate a php-fpm config file with ynh_get_scalable_phpfpm - ynh_get_scalable_phpfpm --usage=$usage --footprint=$footprint - - # Copy the default file - sudo cp "$fpm_config_dir/pool.d/www.conf" "$finalphpconf" - - # Replace standard variables into the default file - ynh_replace_string --match_string="^\[www\]" --replace_string="[$app]" --target_file="$finalphpconf" - ynh_replace_string --match_string=".*listen = .*" --replace_string="listen = /var/run/php/php7.0-fpm-$app.sock" --target_file="$finalphpconf" - ynh_replace_string --match_string="^user = .*" --replace_string="user = $app" --target_file="$finalphpconf" - ynh_replace_string --match_string="^group = .*" --replace_string="group = $app" --target_file="$finalphpconf" - ynh_replace_string --match_string=".*chdir = .*" --replace_string="chdir = $final_path" --target_file="$finalphpconf" - - # Configure fpm children - ynh_replace_string --match_string=".*pm = .*" --replace_string="pm = $php_pm" --target_file="$finalphpconf" - ynh_replace_string --match_string=".*pm.max_children = .*" --replace_string="pm.max_children = $php_max_children" --target_file="$finalphpconf" - ynh_replace_string --match_string=".*pm.max_requests = .*" --replace_string="pm.max_requests = 500" --target_file="$finalphpconf" - ynh_replace_string --match_string=".*request_terminate_timeout = .*" --replace_string="request_terminate_timeout = 1d" --target_file="$finalphpconf" - if [ "$php_pm" = "dynamic" ] - then - ynh_replace_string --match_string=".*pm.start_servers = .*" --replace_string="pm.start_servers = $php_start_servers" --target_file="$finalphpconf" - ynh_replace_string --match_string=".*pm.min_spare_servers = .*" --replace_string="pm.min_spare_servers = $php_min_spare_servers" --target_file="$finalphpconf" - ynh_replace_string --match_string=".*pm.max_spare_servers = .*" --replace_string="pm.max_spare_servers = $php_max_spare_servers" --target_file="$finalphpconf" - elif [ "$php_pm" = "ondemand" ] - then - ynh_replace_string --match_string=".*pm.process_idle_timeout = .*" --replace_string="pm.process_idle_timeout = 10s" --target_file="$finalphpconf" - fi - - # Comment unused parameters - if [ "$php_pm" != "dynamic" ] - then - ynh_replace_string --match_string=".*\(pm.start_servers = .*\)" --replace_string=";\1" --target_file="$finalphpconf" - ynh_replace_string --match_string=".*\(pm.min_spare_servers = .*\)" --replace_string=";\1" --target_file="$finalphpconf" - ynh_replace_string --match_string=".*\(pm.max_spare_servers = .*\)" --replace_string=";\1" --target_file="$finalphpconf" - fi - if [ "$php_pm" != "ondemand" ] - then - ynh_replace_string --match_string=".*\(pm.process_idle_timeout = .*\)" --replace_string=";\1" --target_file="$finalphpconf" - fi - - # Concatene the extra config. - if [ -e ../conf/extra_php-fpm.conf ]; then - cat ../conf/extra_php-fpm.conf >> "$finalphpconf" - fi - fi - sudo chown root: "$finalphpconf" - ynh_store_file_checksum --file="$finalphpconf" - - if [ -e "../conf/php-fpm.ini" ] - then - echo "Packagers ! Please do not use a separate php ini file, merge your directives in the pool file instead." >&2 - finalphpini="$fpm_config_dir/conf.d/20-$app.ini" - ynh_backup_if_checksum_is_different "$finalphpini" - sudo cp ../conf/php-fpm.ini "$finalphpini" - sudo chown root: "$finalphpini" - ynh_store_file_checksum "$finalphpini" - fi - ynh_systemd_action --service_name=$fpm_service --action=reload -} diff --git a/scripts/actions/reset_default_app b/scripts/actions/reset_default_app new file mode 100755 index 0000000..5cc74fc --- /dev/null +++ b/scripts/actions/reset_default_app @@ -0,0 +1,256 @@ +#!/bin/bash + +#================================================= +# GENERIC STARTING +#================================================= +# IMPORT GENERIC HELPERS +#================================================= + +# Load common variables for all scripts. +source scripts/_variables + +source scripts/_common.sh +source /usr/share/yunohost/helpers + +#================================================= +# MANAGE SCRIPT FAILURE +#================================================= + +ynh_clean_setup () { +# Clean installation remaining that are not handle by the remove script. + ynh_clean_check_starting +} +# Exit if an error occurs during the execution of the script +ynh_abort_if_errors + +#================================================= +# RETRIEVE ARGUMENTS +#================================================= + +app=$YNH_APP_INSTANCE_NAME + +path_url=$(ynh_app_setting_get --app=$app --key=path) +domain=$(ynh_app_setting_get --app=$app --key=domain) +pihole_version="$(ynh_app_setting_get --app=$app --key=pihole_version)" + +#================================================= +# SPECIFIC ACTION +#================================================= +# ACTIVATE MAINTENANCE MODE +#================================================= +ynh_script_progression --message="Activating maintenance mode..." --time --weight=1 + +ynh_maintenance_mode_ON + +#================================================= +# DOWNLOAD, CHECK AND UNPACK SOURCE +#================================================= +ynh_script_progression --message="Resetting source files..." --time --weight=1 + +# Download, check integrity, uncompress and patch the source from app.src +pihole_local_repo="/etc/.pihole" +(cd scripts +if [ "$pihole_version" == "Last 3.X" ] +then + # Overwrite the version 3.3.1 + YNH_CWD=$PWD ynh_setup_source --dest_dir="$pihole_local_repo" --source_id=app_3 + # Overwrite admin dashboard + YNH_CWD=$PWD ynh_setup_source --dest_dir="$final_path" --source_id=admin_dashboard_3 +else + # Overwrite the last version available + YNH_CWD=$PWD ynh_setup_source --dest_dir="$pihole_local_repo" --source_id=app_last + # Overwrite admin dashboard + YNH_CWD=$PWD ynh_setup_source --dest_dir="$final_path" --source_id=admin_dashboard_last +fi +) + +#================================================= +# NGINX CONFIGURATION +#================================================= +ynh_script_progression --message="Resetting nginx web server configuration..." --time --weight=1 + +# Create a dedicated nginx config +yunohost app action run $app reset_default_nginx + +#================================================= +# CREATE DEDICATED USER +#================================================= +ynh_script_progression --message="Making sure dedicated system user exists..." --time --weight=1 + +# Create a dedicated user (if not existing) +ynh_system_user_create --username=$app + +#================================================= +# PHP-FPM CONFIGURATION +#================================================= +ynh_script_progression --message="Resetting php-fpm configuration..." --time --weight=1 + +# Create a dedicated php-fpm config +yunohost app action run $app reset_default_phpfpm + +#================================================= +# RECREATE DIRECTORIES +#================================================= +ynh_script_progression --message="Recreating and populating directories..." --time --weight=1 + +pihole_storage="/etc/pihole" +mkdir -p "$pihole_storage" +chown $app: -R "$pihole_storage" + +pihole_dir="/opt/pihole" +mkdir -p "$pihole_dir" + +# Make a copy of Pi-Hole scripts +cp -a "$pihole_local_repo/gravity.sh" "$pihole_dir/" +cp -a $pihole_local_repo/advanced/Scripts/*.sh "$pihole_dir/" + +# And copy this fucking COL_TABLE file... +cp -a "$pihole_local_repo/advanced/Scripts/COL_TABLE" "$pihole_dir/" + +#================================================= +# COPY PI-HOLE MAIN SCRIPT +#================================================= +ynh_script_progression --message="Copying Pi-Hole main script..." + +cp -a "$pihole_local_repo/pihole" /usr/local/bin/ +cp -a "$pihole_local_repo/advanced/bash-completion/pihole" /etc/bash_completion.d/pihole + +#================================================= +# RECREATE LOG FILES +#================================================= + +touch /var/log/{pihole,pihole-FTL}.log +chmod 644 /var/log/{pihole,pihole-FTL}.log +dnsmasq_user=$(grep DNSMASQ_USER= /etc/init.d/dnsmasq | cut -d'"' -f2) +chown $dnsmasq_user:root /var/log/{pihole,pihole-FTL}.log + +#================================================= +# RECREATE SUDOER FILE +#================================================= + +# This sudoers config allow pihole to execute /usr/local/bin/pihole as root without password. Nothing more. +if [ "$pihole_version" == "Last 3.X" ] +then + cp "$pihole_local_repo/advanced/pihole.sudo" /etc/sudoers.d/pihole +else + cp "$pihole_local_repo/advanced/Templates/pihole.sudo" /etc/sudoers.d/pihole +fi +echo "$app ALL=NOPASSWD: /usr/local/bin/pihole" >> /etc/sudoers.d/pihole +# echo "Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin" >> /etc/sudoers.d/pihole +chmod 0440 /etc/sudoers.d/pihole + +#================================================= +# REINSTALL LOGROTATE SCRIPT FOR PI-HOLE +#================================================= + +if [ "$pihole_version" == "Last 3.X" ] +then + cp "$pihole_local_repo/advanced/logrotate" "$pihole_storage/logrotate" +else + cp "$pihole_local_repo/advanced/Templates/logrotate" "$pihole_storage/logrotate" +fi +sed -i "/# su #/d;" "$pihole_storage/logrotate" + +#================================================= +# REINSTALLATION OF PIHOLE-FTL +#================================================= +ynh_script_progression --message="Reinstalling PiHole-FTL..." --weight=30 + +# Get the source of Pi-Hole-FTL +FTL_temp_path=$(mktemp -d) +if [ "$pihole_version" == "Last 3.X" ] +then + # Install the version 3.3.1 + ynh_setup_source --dest_dir="$FTL_temp_path" --source_id=FTL_3 +else + # Install the last version available + ynh_setup_source --dest_dir="$FTL_temp_path" --source_id=FTL_last +fi + +# Instead of downloading a binary file, we're going to compile it +( cd "$FTL_temp_path" +ynh_exec_warn_less make +ynh_exec_warn_less make install ) +ynh_secure_remove --file="$FTL_temp_path" + +cp "../conf/dns-servers.conf" "$pihole_storage" + +# Restore the default pihole-FTL.conf +yunohost app action run $app reset_default_ftl + +if [ "$pihole_version" == "Last 3.X" ] +then + # Version 3.3.1 + cp -a $pihole_local_repo/advanced/pihole-FTL.service /etc/init.d/pihole-FTL + chmod +x /etc/init.d/pihole-FTL + ynh_exec_warn_less systemctl enable pihole-FTL +else + cp -a $pihole_local_repo/advanced/Templates/pihole-FTL.service /etc/init.d/pihole-FTL + chmod +x /etc/init.d/pihole-FTL + ynh_exec_warn_less systemctl enable pihole-FTL + + # Reload systemd config + systemctl daemon-reload +fi + +#================================================= +# RESET THE VARIABLES FILE +#================================================= + +# Restore the default setupVars.conf +yunohost app action run $app reset_default_setupvars + +#================================================= +# RESET DNSMASQ CONFIG +#================================================= + +# Restore the default setupVars.conf +yunohost app action run $app reset_default_dnsmasq + +#================================================= +# REINSTALL CRON JOB +#================================================= + +if [ "$pihole_version" == "Last 3.X" ] +then + cp $pihole_local_repo/advanced/pihole.cron /etc/cron.d/pihole +else + cp $pihole_local_repo/advanced/Templates/pihole.cron /etc/cron.d/pihole +fi + +# Remove git usage for version. Which fails because we use here a release instead of master. +ynh_replace_string --match_string=".*updatechecker.*" --replace_string="#&" --target_file=/etc/cron.d/pihole + +#================================================= +# REINSTALL CONF_REGEN HOOK +#================================================= + +(cd scripts; cp ../conf/dnsmasq_regenconf_hook /usr/share/yunohost/hooks/conf_regen/50-dnsmasq_$app) + +#================================================= +# RESTART PIHOLE-FTL +#================================================= + +ynh_script_progression --message="Restarting PiHole-FTL..." --weight=2 + +ynh_systemd_action --action=restart --service_name=pihole-FTL + +#================================================= +# RELOAD NGINX +#================================================= +ynh_script_progression --message="Reloading nginx web server..." --time --weight=1 + +ynh_systemd_action --service_name=nginx --action=reload + +#================================================= +# DEACTIVE MAINTENANCE MODE +#================================================= +ynh_script_progression --message="Disabling maintenance mode..." --time --weight=1 + +ynh_maintenance_mode_OFF + +#================================================= +# END OF SCRIPT +#================================================= + +ynh_script_progression --message="Execution completed" --time --last diff --git a/scripts/actions/reset_default_config b/scripts/actions/reset_default_config index 1272710..24faea7 100755 --- a/scripts/actions/reset_default_config +++ b/scripts/actions/reset_default_config @@ -9,11 +9,18 @@ source scripts/_common.sh source /usr/share/yunohost/helpers +#================================================= +# MANAGE SCRIPT FAILURE +#================================================= + +# Exit if an error occurs during the execution of the script +ynh_abort_if_errors + #================================================= # RETRIEVE ARGUMENTS #================================================= -app=${YNH_APP_INSTANCE_NAME:-$YNH_APP_ID} +app=$YNH_APP_INSTANCE_NAME query_logging=$(ynh_app_setting_get --app=$app --key=query_logging) @@ -24,9 +31,11 @@ query_logging=$(ynh_app_setting_get --app=$app --key=query_logging) file="$1" if [ "$file" = "setupVars.conf" ]; then - config_file="/etc/pihole/setupVars.conf" + config_file="/etc/pihole/setupVars.conf" elif [ "$file" = "pihole-FTL.conf" ]; then - config_file="/etc/pihole/pihole-FTL.conf" + config_file="/etc/pihole/pihole-FTL.conf" +elif [ "$file" = "01-pihole.conf" ]; then + config_file="/etc/dnsmasq.d/01-pihole.conf" fi #================================================= @@ -39,33 +48,55 @@ ynh_script_progression --message="Resetting the config file $config_file..." --w # Verify the checksum and backup the file if it's different ynh_backup_if_checksum_is_different --file="$config_file" +main_iface=$(ip route | grep --max-count=1 default | awk '{print $5;}') + if [ "$file" = "setupVars.conf" ] then - # Recreate the default config - # Trouve l'interface réseau par défaut - main_iface=$(ip route | grep --max-count=1 default | awk '{print $5;}') - echo "PIHOLE_INTERFACE=$main_iface" > "$config_file" - echo "IPV4_ADDRESS=127.0.0.1" >> "$config_file" - echo "IPV6_ADDRESS=::1" >> "$config_file" - echo "PIHOLE_DNS_1=" >> "$config_file" - echo "PIHOLE_DNS_2=" >> "$config_file" - if [ $query_logging -eq 1 ]; then - query_logging=true - else - query_logging=false - fi - echo "QUERY_LOGGING=$query_logging" >> "$config_file" - echo "INSTALL_WEB=true" >> "$config_file" + # Recreate the default config + # Trouve l'interface réseau par défaut + echo "PIHOLE_INTERFACE=$main_iface" > "$config_file" + echo "IPV4_ADDRESS=127.0.0.1" >> "$config_file" + echo "IPV6_ADDRESS=::1" >> "$config_file" + echo "PIHOLE_DNS_1=" >> "$config_file" + echo "PIHOLE_DNS_2=" >> "$config_file" + if [ $query_logging -eq 1 ]; then + query_logging=true + else + query_logging=false + fi + echo "QUERY_LOGGING=$query_logging" >> "$config_file" + echo "INSTALL_WEB=true" >> "$config_file" elif [ "$file" = "pihole-FTL.conf" ] then - # Get the default file and overwrite the current config - cp /etc/yunohost/apps/$app/conf/pihole-FTL.conf "$config_file" + # Get the default file and overwrite the current config + cp /etc/yunohost/apps/$app/conf/pihole-FTL.conf "$config_file" - ynh_script_progression --message="Restarting PiHole..." --weight=2 + ynh_script_progression --message="Restarting PiHole..." --weight=2 - # Restart pihole-FTL - ynh_systemd_action --action=restart --service_name=pihole-FTL + # Restart pihole-FTL + ynh_systemd_action --action=restart --service_name=pihole-FTL + +elif [ "$file" = "01-pihole.conf" ] +then + cp "$pihole_local_repo/advanced/01-pihole.conf" $config_file + # Use dns from /etc/resolv.dnsmasq.conf + ynh_replace_string --match_string="@DNS1@" --replace_string="" --target_file=$config_file + ynh_replace_string --match_string="@DNS2@" --replace_string="" --target_file=$config_file + ynh_replace_string --match_string="^no-resolv" --replace_string="#no-resolv" --target_file=$config_file + + ynh_replace_string --match_string="@INT@" --replace_string="$main_iface" --target_file=$config_file + if [ "$query_logging" = "true" ]; then + ynh_replace_string --match_string="^#log-queries" --replace_string="log-queries" --target_file=$config_file + else + ynh_replace_string --match_string="^log-queries" --replace_string="#log-queries" --target_file=$config_file + fi + + # Fix a too recent option for our dnsmasq version. + ynh_replace_string --match_string="log-queries=extra" --replace_string="log-queries" --target_file=$config_file + + # To prevent any conflict with the original dnsmasq config, comment cache-size in the original config. + ynh_replace_string --match_string="^cache-size=" --replace_string="#pihole# cache-size=" --target_file=/etc/dnsmasq.conf fi # Calculate and store the config file checksum into the app settings diff --git a/scripts/actions/reset_default_system b/scripts/actions/reset_default_system new file mode 100755 index 0000000..c760535 --- /dev/null +++ b/scripts/actions/reset_default_system @@ -0,0 +1,64 @@ +#!/bin/bash + +#================================================= +# GENERIC STARTING +#================================================= +# IMPORT GENERIC HELPERS +#================================================= + +source scripts/_common.sh +source /usr/share/yunohost/helpers + +#================================================= +# MANAGE SCRIPT FAILURE +#================================================= + +ynh_clean_setup () { +# Clean installation remaining that are not handle by the remove script. + ynh_clean_check_starting +} +# Exit if an error occurs during the execution of the script +ynh_abort_if_errors + +#================================================= +# RETRIEVE ARGUMENTS +#================================================= + +app=$YNH_APP_INSTANCE_NAME + +type=$1 + +domain=$(ynh_app_setting_get --app=$app --key=domain) +path_url=$(ynh_app_setting_get --app=$app --key=path) +final_path=$(ynh_app_setting_get --app=$app --key=final_path) + +#================================================= +# SPECIFIC ACTION +#================================================= +# RESET THE CONFIG FILE +#================================================= + +if [ $type == nginx ]; then + name=Nginx +elif [ $type == phpfpm ]; then + name=PHP-FPM +else + ynh_die --message="The type $type is not recognized" +fi + +ynh_script_progression --message="Resetting the specific configuration of $name for the app $app..." --weight=3 + +if [ $type == nginx ] +then + (cd scripts; ynh_add_nginx_config) + +elif [ $type == phpfpm ] +then + (cd scripts; ynh_add_fpm_config --usage=low --footprint=low --dedicated_service) +fi + +#================================================= +# END OF SCRIPT +#================================================= + +ynh_script_progression --message="Execution completed" --last diff --git a/scripts/backup b/scripts/backup index 51aeb6e..1913355 100644 --- a/scripts/backup +++ b/scripts/backup @@ -27,6 +27,9 @@ final_path=$(ynh_app_setting_get --app=$app --key=final_path) path_url=$(ynh_app_setting_get --app=$app --key=path) domain=$(ynh_app_setting_get --app=$app --key=domain) +# Get variable from ynh_add_fpm_config +fpm_config_dir=$(ynh_app_setting_get --app=$app --key=fpm_config_dir) + #================================================= # STANDARD BACKUP STEPS #================================================= @@ -34,16 +37,9 @@ domain=$(ynh_app_setting_get --app=$app --key=domain) #================================================= ynh_script_progression --message="Backing up the main app directory..." --weight=5 -CHECK_SIZE "$final_path" ynh_backup --src_path="$final_path" - -CHECK_SIZE "/etc/.pihole" ynh_backup --src_path="/etc/.pihole" - -CHECK_SIZE "/etc/pihole" ynh_backup --src_path="/etc/pihole" - -CHECK_SIZE "/opt/pihole" ynh_backup --src_path="/opt/pihole" #================================================= @@ -58,7 +54,8 @@ ynh_backup --src_path="/etc/nginx/conf.d/$domain.d/$app.conf" #================================================= ynh_script_progression --message="Backing up php-fpm configuration..." -ynh_backup --src_path="/etc/php/7.0/fpm/pool.d/$app.conf" +ynh_backup --src_path="$fpm_config_dir/php-fpm-$app.conf" +ynh_backup --src_path="$fpm_config_dir/pool.d/$app.conf" #================================================= # SPECIFIC BACKUP @@ -84,13 +81,13 @@ ynh_backup --src_path="/usr/bin/pihole-FTL" ynh_backup --src_path="/etc/dnsmasq.d/01-pihole.conf" if test -e "/etc/dnsmasq.d/02-pihole-dhcp.conf"; then - ynh_backup --src_path="/etc/dnsmasq.d/02-pihole-dhcp.conf" + ynh_backup --src_path="/etc/dnsmasq.d/02-pihole-dhcp.conf" fi if test -e "/etc/dnsmasq.d/03-pihole-wildcard.conf"; then - ynh_backup --src_path="/etc/dnsmasq.d/03-pihole-wildcard.conf" + ynh_backup --src_path="/etc/dnsmasq.d/03-pihole-wildcard.conf" fi if test -e "/etc/dnsmasq.d/04-pihole-static-dhcp.conf"; then - ynh_backup --src_path="/etc/dnsmasq.d/04-pihole-static-dhcp.conf" + ynh_backup --src_path="/etc/dnsmasq.d/04-pihole-static-dhcp.conf" fi ynh_backup --src_path="/usr/share/yunohost/hooks/conf_regen/50-dnsmasq_$app" diff --git a/scripts/change_url b/scripts/change_url index c7fe581..1afb28e 100644 --- a/scripts/change_url +++ b/scripts/change_url @@ -36,11 +36,11 @@ ynh_script_progression --message="Backing up the app before changing its url (ma # 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" + # 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 + # restore it if the upgrade fails + ynh_restore_upgradebackup } # Exit if an error occurs during the execution of the script ynh_abort_if_errors @@ -61,13 +61,13 @@ ynh_maintenance_mode_ON change_domain=0 if [ "$old_domain" != "$new_domain" ] then - change_domain=1 + change_domain=1 fi change_path=0 if [ "$old_path" != "$new_path" ] then - change_path=1 + change_path=1 fi #================================================= @@ -82,26 +82,26 @@ nginx_conf_path=/etc/nginx/conf.d/$old_domain.d/$app.conf # 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" + # 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" + # Set global variables for nginx helper + domain="$old_domain" + path_url="$new_path" - # Create a dedicated nginx config - ynh_add_nginx_config + # Create a dedicated nginx config + ynh_add_nginx_config fi # 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 + # 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" + # Store file checksum for the new config file location + ynh_store_file_checksum --file="/etc/nginx/conf.d/$new_domain.d/$app.conf" fi #================================================= diff --git a/scripts/config b/scripts/config index 8772ea0..02a2d40 100644 --- a/scripts/config +++ b/scripts/config @@ -8,13 +8,14 @@ source _common.sh source /usr/share/yunohost/helpers -source _ynh_add_fpm_config #================================================= # RETRIEVE ARGUMENTS #================================================= -app=${YNH_APP_INSTANCE_NAME:-$YNH_APP_ID} +app=$YNH_APP_INSTANCE_NAME + +fpm_config_dir=$(ynh_app_setting_get --app=$app --key=fpm_config_dir) #================================================= # SPECIFIC CODE @@ -69,24 +70,33 @@ free_footprint="${YNH_CONFIG_MAIN_PHP_FPM_CONFIG_FREE_FOOTPRINT:-$old_free_footp old_fpm_usage="$(ynh_app_setting_get --app=$app --key=fpm_usage)" fpm_usage="${YNH_CONFIG_MAIN_PHP_FPM_CONFIG_USAGE:-$old_fpm_usage}" +# php_forced_max_children for php-fpm +old_php_forced_max_children="$(ynh_app_setting_get --app=$app --key=php_forced_max_children)" +# If php_forced_max_children isn't into settings.yml, get the current value from the fpm config +if [ -z "$old_php_forced_max_children" ]; then + old_php_forced_max_children="$(grep "^pm.max_children" "$fpm_config_dir/pool.d/$app.conf" | awk '{print $3}')" +fi +php_forced_max_children="${YNH_CONFIG_MAIN_PHP_FPM_CONFIG_FORCE_MAX_CHILDREN:-$old_php_forced_max_children}" + #================================================= # SHOW_CONFIG FUNCTION FOR 'SHOW' COMMAND #================================================= show_config() { - # here you are supposed to read some config file/database/other then print the values - # ynh_return "YNH_CONFIG_${PANEL_ID}_${SECTION_ID}_${OPTION_ID}=value" + # here you are supposed to read some config file/database/other then print the values + # ynh_return "YNH_CONFIG_${PANEL_ID}_${SECTION_ID}_${OPTION_ID}=value" - ynh_return "YNH_CONFIG_MAIN_OVERWRITE_FILES_OVERWRITE_SETUPVARS=$overwrite_setupvars" - ynh_return "YNH_CONFIG_MAIN_OVERWRITE_FILES_OVERWRITE_FTL=$overwrite_ftl" - ynh_return "YNH_CONFIG_MAIN_OVERWRITE_FILES_OVERWRITE_NGINX=$overwrite_nginx" - ynh_return "YNH_CONFIG_MAIN_OVERWRITE_FILES_OVERWRITE_PHPFPM=$overwrite_phpfpm" + ynh_return "YNH_CONFIG_MAIN_OVERWRITE_FILES_OVERWRITE_SETUPVARS=$overwrite_setupvars" + ynh_return "YNH_CONFIG_MAIN_OVERWRITE_FILES_OVERWRITE_FTL=$overwrite_ftl" + ynh_return "YNH_CONFIG_MAIN_OVERWRITE_FILES_OVERWRITE_NGINX=$overwrite_nginx" + ynh_return "YNH_CONFIG_MAIN_OVERWRITE_FILES_OVERWRITE_PHPFPM=$overwrite_phpfpm" - ynh_return "YNH_CONFIG_MAIN_GLOBAL_CONFIG_EMAIL_TYPE=$admin_mail_html" + ynh_return "YNH_CONFIG_MAIN_GLOBAL_CONFIG_EMAIL_TYPE=$admin_mail_html" - ynh_return "YNH_CONFIG_MAIN_PHP_FPM_CONFIG_FOOTPRINT=$fpm_footprint" - ynh_return "YNH_CONFIG_MAIN_PHP_FPM_CONFIG_FREE_FOOTPRINT=$free_footprint" - ynh_return "YNH_CONFIG_MAIN_PHP_FPM_CONFIG_USAGE=$fpm_usage" + ynh_return "YNH_CONFIG_MAIN_PHP_FPM_CONFIG_FOOTPRINT=$fpm_footprint" + ynh_return "YNH_CONFIG_MAIN_PHP_FPM_CONFIG_FREE_FOOTPRINT=$free_footprint" + ynh_return "YNH_CONFIG_MAIN_PHP_FPM_CONFIG_USAGE=$fpm_usage" + ynh_return "YNH_CONFIG_MAIN_PHP_FPM_CONFIG_FORCE_MAX_CHILDREN=$php_forced_max_children" } #================================================= @@ -99,27 +109,30 @@ apply_config() { # MODIFY OVERWRITTING SETTINGS #================================================= - # Set overwrite_setupvars - ynh_app_setting_set --app=$app --key=overwrite_setupvars --value="$overwrite_setupvars" - # Set overwrite_ftl - ynh_app_setting_set --app=$app --key=overwrite_ftl --value="$overwrite_ftl" - # Set overwrite_nginx - ynh_app_setting_set --app=$app --key=overwrite_nginx --value="$overwrite_nginx" - # Set overwrite_phpfpm - ynh_app_setting_set --app=$app --key=overwrite_phpfpm --value="$overwrite_phpfpm" + # Set overwrite_setupvars + ynh_app_setting_set --app=$app --key=overwrite_setupvars --value="$overwrite_setupvars" + # Set overwrite_ftl + ynh_app_setting_set --app=$app --key=overwrite_ftl --value="$overwrite_ftl" + # Set overwrite_nginx + ynh_app_setting_set --app=$app --key=overwrite_nginx --value="$overwrite_nginx" + # Set overwrite_phpfpm + ynh_app_setting_set --app=$app --key=overwrite_phpfpm --value="$overwrite_phpfpm" #================================================= # MODIFY EMAIL SETTING #================================================= - # Set admin_mail_html - ynh_app_setting_set --app=$app --key=admin_mail_html --value="$admin_mail_html" + # Set admin_mail_html + ynh_app_setting_set --app=$app --key=admin_mail_html --value="$admin_mail_html" #================================================= # RECONFIGURE PHP-FPM #================================================= - if [ "$fpm_usage" != "$old_fpm_usage" ] || [ "$fpm_footprint" != "$old_fpm_footprint" ] || [ "$free_footprint" != "$old_free_footprint" ] + if [ "$fpm_usage" != "$old_fpm_usage" ] || \ + [ "$fpm_footprint" != "$old_fpm_footprint" ] || \ + [ "$free_footprint" != "$old_free_footprint" ] || \ + [ "$php_forced_max_children" != "$old_php_forced_max_children" ] then # If fpm_footprint is set to 'specific', use $free_footprint value. if [ "$fpm_footprint" = "specific" ] @@ -127,9 +140,21 @@ apply_config() { fpm_footprint=$free_footprint fi + if [ "$php_forced_max_children" != "$old_php_forced_max_children" ] + then + # Set php_forced_max_children + if [ $php_forced_max_children -ne 0 ] + then + ynh_app_setting_set --app=$app --key=php_forced_max_children --value="$php_forced_max_children" + else + # If the value is set to 0, remove the setting + ynh_app_setting_delete --app=$app --key=php_forced_max_children + fi + fi + if [ "$fpm_footprint" != "0" ] then - ynh_add_fpm_config --usage=$fpm_usage --footprint=$fpm_footprint + ynh_add_fpm_config --usage=$fpm_usage --footprint=$fpm_footprint --dedicated_service else ynh_print_err --message="When selecting 'specific', you have to set a footprint value into the field below." fi @@ -143,6 +168,6 @@ apply_config() { #================================================= case $1 in - show) show_config;; - apply) apply_config;; + show) show_config;; + apply) apply_config;; esac diff --git a/scripts/install b/scripts/install index 9d93e60..4f17c8d 100644 --- a/scripts/install +++ b/scripts/install @@ -6,12 +6,12 @@ # IMPORT GENERIC HELPERS #================================================= -source _common.sh -source /usr/share/yunohost/helpers -source _ynh_add_fpm_config # Load common variables for all scripts. source _variables +source _common.sh +source /usr/share/yunohost/helpers + #================================================= # MANAGE FAILURE OF THE SCRIPT #================================================= @@ -72,7 +72,7 @@ ynh_script_progression --message="Configuring firewall..." --weight=12 port=$(ynh_find_port --port=4711) if [ $port -gt 4720 ] then - ynh_die --message="The ports 4711 to 4720 are already in use. Pi-hole can't works on another port. Please try to free one of this ports." + ynh_die --message="The ports 4711 to 4720 are already in use. Pi-hole can't works on another port. Please try to free one of this ports." fi # Open this port ynh_exec_fully_quiet yunohost firewall allow --no-upnp TCP $port @@ -132,7 +132,7 @@ ynh_system_user_create --username=$app ynh_script_progression --message="Configuring php-fpm..." --weight=2 # Create a dedicated php-fpm config -ynh_add_fpm_config --usage=low --footprint=low +ynh_add_fpm_config --usage=low --footprint=low --dedicated_service #================================================= # SPECIFIC SETUP @@ -167,10 +167,10 @@ cp -a "$pihole_local_repo/advanced/bash-completion/pihole" /etc/bash_completion. # CREATE LOG FILES #================================================= -touch /var/log/pihole.log -chmod 644 /var/log/pihole.log +touch /var/log/{pihole,pihole-FTL}.log +chmod 644 /var/log/{pihole,pihole-FTL}.log dnsmasq_user=$(grep DNSMASQ_USER= /etc/init.d/dnsmasq | cut -d'"' -f2) -chown $dnsmasq_user:root /var/log/pihole.log +chown $dnsmasq_user:root /var/log/{pihole,pihole-FTL}.log #================================================= # CREATE SUDOER FILE @@ -221,7 +221,9 @@ ynh_exec_warn_less make ynh_exec_warn_less make install ) ynh_secure_remove --file="$FTL_temp_path" +cp "../conf/dns-servers.conf" "$pihole_storage" cp "../conf/pihole-FTL.conf" "$pihole_storage" + # Calculate and store the config file checksum into the app settings ynh_store_file_checksum --file="$pihole_storage/pihole-FTL.conf" @@ -276,9 +278,9 @@ echo "IPV6_ADDRESS=::1" >> $setupVars echo "PIHOLE_DNS_1=" >> $setupVars echo "PIHOLE_DNS_2=" >> $setupVars if [ $query_logging -eq 1 ]; then - query_logging=true + query_logging=true else - query_logging=false + query_logging=false fi echo "QUERY_LOGGING=$query_logging" >> $setupVars echo "INSTALL_WEB=true" >> $setupVars @@ -302,9 +304,9 @@ ynh_replace_string --match_string="^no-resolv" --replace_string="#no-resolv" --t ynh_replace_string --match_string="@INT@" --replace_string="$main_iface" --target_file=$pihole_dnsmasq_config if [ "$query_logging" = "true" ]; then - ynh_replace_string --match_string="^#log-queries" --replace_string="log-queries" --target_file=$pihole_dnsmasq_config + ynh_replace_string --match_string="^#log-queries" --replace_string="log-queries" --target_file=$pihole_dnsmasq_config else - ynh_replace_string --match_string="^log-queries" --replace_string="#log-queries" --target_file=$pihole_dnsmasq_config + ynh_replace_string --match_string="^log-queries" --replace_string="#log-queries" --target_file=$pihole_dnsmasq_config fi # Fix a too recent option for our dnsmasq version. @@ -327,12 +329,12 @@ localipv4=$(ip address | grep "${main_iface}\$" | awk '{print $2;}' | cut -d/ -f # List all YunoHost domains while read perdomain do - # Comment domain resolution in /etc/hosts on 127.0.0.1, because they can interfere with the local network resolution. - ynh_replace_string --match_string="^127.0.0.1.*$perdomain" --replace_string="#Commented by pihole# &" --target_file=/etc/hosts + # Comment domain resolution in /etc/hosts on 127.0.0.1, because they can interfere with the local network resolution. + ynh_replace_string --match_string="^127.0.0.1.*$perdomain" --replace_string="#Commented by pihole# &" --target_file=/etc/hosts - # And add a resolution on the local IP instead - grep -q "^$localipv4.*$perdomain" /etc/hosts || \ - echo "$localipv4 $perdomain #Added by pihole#" >> /etc/hosts + # And add a resolution on the local IP instead + grep -q "^$localipv4.*$perdomain" /etc/hosts || \ + echo "$localipv4 $perdomain #Added by pihole#" >> /etc/hosts done <<< "$(yunohost domain list | grep "\." | sed 's/.*: \|.*- //')" #================================================= @@ -341,38 +343,45 @@ done <<< "$(yunohost domain list | grep "\." | sed 's/.*: \|.*- //')" if [ $enable_dhcp -eq 1 ] then - ynh_script_progression --message="Enabling dhcp server..." - max_dhcp_range=250 - dhcp_range=100 - # Define the dhcp range from the current ip - ip_beginning_part=$(echo "$localipv4" | cut -d. -f1-3) - ip_fourth_part=$(echo "$localipv4" | cut -d. -f4) - b_range=$(( $ip_fourth_part + $dhcp_range )) - if [ $b_range -gt $max_dhcp_range ]; then - b_range=$max_dhcp_range - fi - a_range=$(( $b_range - $dhcp_range )) + ynh_script_progression --message="Enabling dhcp server..." + max_dhcp_range=250 + dhcp_range=100 + # Define the dhcp range from the current ip + ip_beginning_part=$(echo "$localipv4" | cut -d. -f1-3) + ip_fourth_part=$(echo "$localipv4" | cut -d. -f4) + b_range=$(( $ip_fourth_part + $dhcp_range )) + if [ $b_range -gt $max_dhcp_range ]; then + b_range=$max_dhcp_range + fi + a_range=$(( $b_range - $dhcp_range )) - # Get the gateway - gateway=$(ip route | grep default | awk '{print $3;}') - # And the mac adress - hw_adress=$(ip link | grep -A1 "$main_iface" | tail -n1 | awk '{print $2;}') + # Get the gateway + gateway=$(ip route | grep default | awk '{print $3;}') + # And the mac adress + hw_adress=$(ip link | grep -A1 "$main_iface" | tail -n1 | awk '{print $2;}') - # Copy the config file - cp "../conf/02-pihole-dhcp.conf" "/etc/dnsmasq.d/" + # Copy the config file + cp "../conf/02-pihole-dhcp.conf" "/etc/dnsmasq.d/" - # And set the config - ynh_replace_string --match_string="__A_RANGE__" --replace_string="$ip_beginning_part.$a_range" --target_file="/etc/dnsmasq.d/02-pihole-dhcp.conf" - ynh_replace_string --match_string="__B_RANGE__" --replace_string="$ip_beginning_part.$b_range" --target_file="/etc/dnsmasq.d/02-pihole-dhcp.conf" - ynh_replace_string --match_string="__GATEWAY__" --replace_string="$gateway" --target_file="/etc/dnsmasq.d/02-pihole-dhcp.conf" + # And set the config + ynh_replace_string --match_string="__A_RANGE__" --replace_string="$ip_beginning_part.$a_range" --target_file="/etc/dnsmasq.d/02-pihole-dhcp.conf" + ynh_replace_string --match_string="__B_RANGE__" --replace_string="$ip_beginning_part.$b_range" --target_file="/etc/dnsmasq.d/02-pihole-dhcp.conf" + ynh_replace_string --match_string="__GATEWAY__" --replace_string="$gateway" --target_file="/etc/dnsmasq.d/02-pihole-dhcp.conf" - # Set a static ip for the server. - echo "dhcp-host=$hw_adress,$localipv4" > "/etc/dnsmasq.d/04-pihole-static-dhcp.conf" + # Set a static ip for the server. + echo "dhcp-host=$hw_adress,$localipv4" > "/etc/dnsmasq.d/04-pihole-static-dhcp.conf" fi # Open the UDP port 67 for dhcp ynh_exec_fully_quiet yunohost firewall allow UDP 67 --no-upnp +#================================================= +# SET VERSIONS FOR THE FOOTER OF THE WEB INTERFACE +#================================================= + +echo "master master master" > $pihole_storage/localbranches +echo "$pihole_core_version $dashboard_version $FTL_version" | tee $pihole_storage/{GitHubVersions,localversions} > /dev/null + #================================================= # INSTALL CRON JOB #================================================= @@ -457,12 +466,12 @@ admin_panel="https://$(grep portal_domain /etc/ssowat/conf.json | cut -d'"' -f4) if [ $enable_dhcp -eq 1 ] then - dhcp_alert="You asked to use the internal DHCP server of dnsmasq with PiHole. + dhcp_alert="You asked to use the internal DHCP server of dnsmasq with PiHole. You should really read the __URL_TAG1__documentation about that__URL_TAG2__https://github.com/YunoHost-Apps/pihole_ynh/blob/master/dhcp.md__URL_TAG3__ " else - dhcp_alert="" + dhcp_alert="" fi echo "${dhcp_alert}You can configure this app easily by using the experimental __URL_TAG1__config-panel feature__URL_TAG2__$admin_panel/config-panel__URL_TAG3__. diff --git a/scripts/remove b/scripts/remove index 7b3a87b..2da2bf2 100755 --- a/scripts/remove +++ b/scripts/remove @@ -113,14 +113,14 @@ ynh_script_progression --message="Closing port $port et 67..." --weight=13 if yunohost firewall list | grep -q "\- $port$" then - ynh_print_info "Close port $port" - ynh_exec_quiet yunohost firewall disallow TCP $port + ynh_print_info "Close port $port" + ynh_exec_quiet yunohost firewall disallow TCP $port fi if yunohost firewall list | grep -q "\- 67$" then - ynh_print_info "Close port 67" - ynh_exec_quiet yunohost firewall disallow UDP 67 + ynh_print_info "Close port 67" + ynh_exec_quiet yunohost firewall disallow UDP 67 fi #================================================= @@ -175,6 +175,12 @@ sed -i "/#Added by pihole#/d" /etc/hosts #================================================= ynh_script_progression --message="Restarting Dnsmasq..." +if [ "$pihole_version" == "Last available" ] +then + # Quietly start dnsmasq a first time, because it usually doesn't start correctly the first time. + ynh_exec_fully_quiet systemctl start dnsmasq + sleep 1 +fi ynh_systemd_action --action=restart --service_name=dnsmasq #================================================= diff --git a/scripts/restore b/scripts/restore index 92f8a9b..d2a3c99 100644 --- a/scripts/restore +++ b/scripts/restore @@ -6,11 +6,12 @@ # IMPORT GENERIC HELPERS #================================================= -source ../settings/scripts/_common.sh -source /usr/share/yunohost/helpers # Load common variables for all scripts. source ../settings/scripts/_variables +source ../settings/scripts/_common.sh +source /usr/share/yunohost/helpers + #================================================= # MANAGE SCRIPT FAILURE #================================================= @@ -30,6 +31,13 @@ path_url=$(ynh_app_setting_get --app=$app --key=path) final_path=$(ynh_app_setting_get --app=$app --key=final_path) enable_dhcp=$(ynh_app_setting_get --app=$app --key=enable_dhcp) admin=$(ynh_app_setting_get --app=$app --key=admin) +pihole_version="$(ynh_app_setting_get --app=$app --key=pihole_version)" + +# Get variables from ynh_add_fpm_config +fpm_footprint=$(ynh_app_setting_get --app=$app --key=fpm_footprint) +fpm_usage=$(ynh_app_setting_get --app=$app --key=fpm_usage) +fpm_config_dir=$(ynh_app_setting_get --app=$app --key=fpm_config_dir) +fpm_service=$(ynh_app_setting_get --app=$app --key=fpm_service) #================================================= # CHECK IF THE APP CAN BE RESTORED @@ -37,9 +45,9 @@ admin=$(ynh_app_setting_get --app=$app --key=admin) ynh_script_progression --message="Validating restoration parameters..." ynh_webpath_available --domain=$domain --path_url=$path_url \ - || ynh_die --message="Path not available: ${domain}${path_url}" + || ynh_die --message="Path not available: ${domain}${path_url}" test ! -d $final_path \ - || ynh_die --message="There is already a directory: $final_path " + || ynh_die --message="There is already a directory: $final_path " #================================================= # ACTIVATE MAINTENANCE MODE @@ -89,8 +97,14 @@ chown root: -R "/etc/pihole/logrotate" #================================================= # RESTORE THE PHP-FPM CONFIGURATION #================================================= +ynh_script_progression --message="Reconfiguring php-fpm..." --weight=7 -ynh_restore_file --origin_path="/etc/php/7.0/fpm/pool.d/$app.conf" +# Restore the file first, so it can have a backup if different +ynh_restore_file --origin_path="$fpm_config_dir/php-fpm-$app.conf" +ynh_restore_file --origin_path="$fpm_config_dir/pool.d/$app.conf" + +# Recreate a dedicated php-fpm config +ynh_add_fpm_config --usage=$fpm_usage --footprint=$fpm_footprint --dedicated_service #================================================= # SPECIFIC RESTORE @@ -137,6 +151,42 @@ ynh_restore_file --origin_path="/usr/bin/pihole-FTL" ynh_restore_file --origin_path="/usr/share/yunohost/hooks/conf_regen/50-dnsmasq_$app" +#================================================= +# REPLACE THE DEFAULT DNSMASQ BY PIHOLE-FTL +#================================================= + +if [ "$pihole_version" == "Last available" ] +then + # Last version available + # Stopped dnsmasq to replace it by pihole-FTL + ynh_systemd_action --action=stop --service_name=dnsmasq + + # Disable the real dnsmasq service + ynh_exec_warn_less systemctl disable dnsmasq + + # And move the files that make the service available in systemd to really disable it + mv /lib/systemd/system/dnsmasq.service /lib/systemd/system/.dnsmasq.service.backup_by_pihole + mv /etc/init.d/dnsmasq /etc/init.d/.dnsmasq.backup_by_pihole + + # Move dnsmasq to preserve the current binary + mv /usr/sbin/dnsmasq /usr/sbin/dnsmasq.backup_by_pihole + # Replace dnsmasq by pihole-FTL + # NOTE: pihole-FTL is actually a modified version of dnsmasq + # https://github.com/pi-hole/FTL/tree/master/dnsmasq + ln -s /usr/bin/pihole-FTL /usr/sbin/dnsmasq + + cp -a $pihole_local_repo/advanced/Templates/pihole-FTL.service /etc/init.d/pihole-FTL + chmod +x /etc/init.d/pihole-FTL + ynh_exec_warn_less systemctl enable pihole-FTL + + # Replace the service dnsmasq by pihole-FTL + # That way, YunoHost can continue to use dnsmasq by actually using pihole-FTL + ln -s /run/systemd/generator.late/pihole-FTL.service /etc/systemd/system/multi-user.target.wants/dnsmasq.service + + # Reload systemd config + systemctl daemon-reload +fi + #================================================= # RESTORE DNSMASQ CONFIG #================================================= @@ -146,11 +196,11 @@ ynh_systemd_action --action=stop --service_name=dnsmasq ynh_restore_file --origin_path="/etc/dnsmasq.d/01-pihole.conf" test -e "${YNH_APP_BACKUP_DIR}/etc/dnsmasq.d/02-pihole-dhcp.conf" && \ - ynh_restore_file --origin_path="/etc/dnsmasq.d/02-pihole-dhcp.conf" + ynh_restore_file --origin_path="/etc/dnsmasq.d/02-pihole-dhcp.conf" test -e "${YNH_APP_BACKUP_DIR}/etc/dnsmasq.d/03-pihole-wildcard.conf" && \ - ynh_restore_file --origin_path="/etc/dnsmasq.d/03-pihole-wildcard.conf" + ynh_restore_file --origin_path="/etc/dnsmasq.d/03-pihole-wildcard.conf" test -e "${YNH_APP_BACKUP_DIR}/etc/dnsmasq.d/04-pihole-static-dhcp.conf" && \ - ynh_restore_file --origin_path="/etc/dnsmasq.d/04-pihole-static-dhcp.conf" + ynh_restore_file --origin_path="/etc/dnsmasq.d/04-pihole-static-dhcp.conf" # To prevent any conflict with the original dnsmasq config, comment cache-size in the original config. ynh_replace_string --match_string="^cache-size=" --replace_string="#pihole# cache-size=" --target_file=/etc/dnsmasq.conf @@ -168,20 +218,25 @@ localipv4=$(ip address | grep "${main_iface}\$" | awk '{print $2;}' | cut -d/ -f # List all YunoHost domains while read perdomain do - # Comment domain resolution in /etc/hosts on 127.0.0.1, because they can interfere with the local network resolution. - ynh_replace_string --match_string="^127.0.0.1.*$perdomain" --replace_string="#Commented by pihole# &" --target_file=/etc/hosts + # Comment domain resolution in /etc/hosts on 127.0.0.1, because they can interfere with the local network resolution. + ynh_replace_string --match_string="^127.0.0.1.*$perdomain" --replace_string="#Commented by pihole# &" --target_file=/etc/hosts - # And add a resolution on the local IP instead - grep -q "^$localipv4.*$perdomain" /etc/hosts || \ - echo "$localipv4 $perdomain #Added by pihole#" >> /etc/hosts + # And add a resolution on the local IP instead + grep -q "^$localipv4.*$perdomain" /etc/hosts || \ + echo "$localipv4 $perdomain #Added by pihole#" >> /etc/hosts done <<< "$(yunohost domain list | grep "\." | sed 's/.*: \|.*- //')" #================================================= # RESTART DNSMASQ #================================================= -ynh_script_progression --message="Restarting Dnsmasq..." -ynh_systemd_action --action=restart --service_name=dnsmasq +# Restart dnsmasq only for the version 3.X, otherwise we're going to restart it twice. +if [ "$pihole_version" == "Last 3.X" ] +then + ynh_script_progression --message="Restarting Dnsmasq..." + + ynh_systemd_action --action=restart --service_name=dnsmasq +fi #================================================= # UPDATE VARIABLES FILE @@ -211,8 +266,8 @@ ynh_systemd_action --action=restart --service_name=pihole-FTL #================================================= ynh_script_progression --message="Reloading nginx web server and php-fpm..." -ynh_systemd_action --action=reload --service_name=php7.0-fpm -ynh_systemd_action --action=reload --service_name=nginx +ynh_systemd_action --service_name=$fpm_service --action=reload +ynh_systemd_action --service_name=nginx --action=reload #================================================= # DEACTIVE MAINTENANCE MODE @@ -230,12 +285,12 @@ admin_panel="https://$(grep portal_domain /etc/ssowat/conf.json | cut -d'"' -f4) if [ $enable_dhcp -eq 1 ] then - dhcp_alert="You asked to use the internal DHCP server of dnsmasq with PiHole. + dhcp_alert="You asked to use the internal DHCP server of dnsmasq with PiHole. You should really read the __URL_TAG1__documentation about that__URL_TAG2__https://github.com/YunoHost-Apps/pihole_ynh/blob/master/dhcp.md__URL_TAG3__ " else - dhcp_alert="" + dhcp_alert="" fi echo "${dhcp_alert}You can configure this app easily by using the experimental __URL_TAG1__config-panel feature__URL_TAG2__$admin_panel/config-panel__URL_TAG3__. diff --git a/scripts/upgrade b/scripts/upgrade index c2a9e82..d1e393e 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -6,12 +6,12 @@ # IMPORT GENERIC HELPERS #================================================= -source _common.sh -source /usr/share/yunohost/helpers -source _ynh_add_fpm_config # Load common variables for all scripts. source _variables +source _common.sh +source /usr/share/yunohost/helpers + #================================================= # LOAD SETTINGS #================================================= @@ -26,6 +26,7 @@ query_logging=$(ynh_app_setting_get --app=$app --key=query_logging) final_path=$(ynh_app_setting_get --app=$app --key=final_path) enable_dhcp=$(ynh_app_setting_get --app=$app --key=enable_dhcp) port=$(ynh_app_setting_get --app=$app --key=port) +pihole_version="$(ynh_app_setting_get --app=$app --key=pihole_version)" overwrite_setupvars=$(ynh_app_setting_get --app=$app --key=overwrite_setupvars) overwrite_ftl=$(ynh_app_setting_get --app=$app --key=overwrite_ftl) @@ -48,38 +49,50 @@ ynh_script_progression --message="Ensuring downward compatibility..." # If overwrite_setupvars doesn't exist, create it if [ -z "$overwrite_setupvars" ]; then - overwrite_setupvars=1 - ynh_app_setting_set --app=$app --key=overwrite_setupvars --value=$overwrite_setupvars + overwrite_setupvars=1 + ynh_app_setting_set --app=$app --key=overwrite_setupvars --value=$overwrite_setupvars fi # If overwrite_ftl doesn't exist, create it if [ -z "$overwrite_ftl" ]; then - overwrite_ftl=1 - ynh_app_setting_set --app=$app --key=overwrite_ftl --value=$overwrite_ftl + overwrite_ftl=1 + ynh_app_setting_set --app=$app --key=overwrite_ftl --value=$overwrite_ftl fi # If overwrite_nginx doesn't exist, create it if [ -z "$overwrite_nginx" ]; then - overwrite_nginx=1 - ynh_app_setting_set --app=$app --key=overwrite_nginx --value=$overwrite_nginx + overwrite_nginx=1 + ynh_app_setting_set --app=$app --key=overwrite_nginx --value=$overwrite_nginx fi # If overwrite_phpfpm doesn't exist, create it if [ -z "$overwrite_phpfpm" ]; then - overwrite_phpfpm=1 - ynh_app_setting_set --app=$app --key=overwrite_phpfpm --value=$overwrite_phpfpm + overwrite_phpfpm=1 + ynh_app_setting_set --app=$app --key=overwrite_phpfpm --value=$overwrite_phpfpm +fi + +# If admin_mail_html doesn't exist, create it +if [ -z "$admin_mail_html" ]; then + admin_mail_html=1 + ynh_app_setting_set --app=$app --key=admin_mail_html --value=$admin_mail_html fi # If fpm_footprint doesn't exist, create it if [ -z "$fpm_footprint" ]; then - fpm_footprint=low - ynh_app_setting_set --app=$app --key=fpm_footprint --value=$fpm_footprint + fpm_footprint=low + ynh_app_setting_set --app=$app --key=fpm_footprint --value=$fpm_footprint fi # If fpm_usage doesn't exist, create it if [ -z "$fpm_usage" ]; then - fpm_usage=low - ynh_app_setting_set --app=$app --key=fpm_usage --value=$fpm_usage + fpm_usage=low + ynh_app_setting_set --app=$app --key=fpm_usage --value=$fpm_usage +fi + +# If pihole_version doesn't exist, create it +if [ -z "$pihole_version" ]; then + pihole_version="Last 3.X" + ynh_app_setting_set --app=$app --key=pihole_version --value="$pihole_version" fi #================================================= @@ -90,8 +103,8 @@ ynh_script_progression --message="Backing up the app before upgrading (may take # Backup the current version of the app ynh_backup_before_upgrade ynh_clean_setup () { - # restore it if the upgrade fails - ynh_restore_upgradebackup + # restore it if the upgrade fails + ynh_restore_upgradebackup } # Exit if an error occurs during the execution of the script ynh_abort_if_errors @@ -126,11 +139,19 @@ ynh_install_app_dependencies $app_depencencies pihole_local_repo="/etc/.pihole" if [ "$upgrade_type" == "UPGRADE_APP" ] then - ynh_script_progression --message="Upgrading source files..." --weight=4 - # Update the local copy pihole repository (for Gravity) - ynh_setup_source --dest_dir="$pihole_local_repo" - # Update admin dashboard - ynh_setup_source --dest_dir="$final_path" --source_id=admin_dashboard + ynh_script_progression --message="Upgrading source files..." --weight=4 + if [ "$pihole_version" == "Last 3.X" ] + then + # Update the version 3.X + ynh_setup_source --dest_dir="$pihole_local_repo" --source_id=app_3 + # Update admin dashboard + ynh_setup_source --dest_dir="$final_path" --source_id=admin_dashboard_3 + else + # Update the last version available + ynh_setup_source --dest_dir="$pihole_local_repo" --source_id=app_last + # Update admin dashboard + ynh_setup_source --dest_dir="$final_path" --source_id=admin_dashboard_last + fi fi #================================================= @@ -140,9 +161,9 @@ fi # Overwrite the nginx configuration only if it's allowed if [ $overwrite_nginx -eq 1 ] then - ynh_script_progression --message="Upgrading nginx web server configuration..." --weight=2 - # Create a dedicated nginx config - ynh_add_nginx_config + ynh_script_progression --message="Upgrading nginx web server configuration..." --weight=2 + # Create a dedicated nginx config + ynh_add_nginx_config fi #================================================= @@ -160,9 +181,9 @@ ynh_system_user_create --username=$app # Overwrite the php-fpm configuration only if it's allowed if [ $overwrite_phpfpm -eq 1 ] then - ynh_script_progression --message="Upgrading php-fpm configuration..." --weight=3 - # Create a dedicated php-fpm config - ynh_add_fpm_config --usage=$fpm_usage --footprint=$fpm_footprint + ynh_script_progression --message="Upgrading php-fpm configuration..." --weight=3 + # Create a dedicated php-fpm config + ynh_add_fpm_config --usage=$fpm_usage --footprint=$fpm_footprint --dedicated_service fi #================================================= @@ -191,7 +212,12 @@ cp -a "$pihole_local_repo/advanced/bash-completion/pihole" /etc/bash_completion. #================================================= # This sudoers config allow pihole to execute /usr/local/bin/pihole as root without password. Nothing more. -cp "$pihole_local_repo/advanced/pihole.sudo" /etc/sudoers.d/pihole +if [ "$pihole_version" == "Last 3.X" ] +then + cp "$pihole_local_repo/advanced/pihole.sudo" /etc/sudoers.d/pihole +else + cp "$pihole_local_repo/advanced/Templates/pihole.sudo" /etc/sudoers.d/pihole +fi echo "$app ALL=NOPASSWD: /usr/local/bin/pihole" >> /etc/sudoers.d/pihole chmod 0440 /etc/sudoers.d/pihole @@ -200,7 +226,12 @@ chmod 0440 /etc/sudoers.d/pihole #================================================= pihole_storage="/etc/pihole" -cp "$pihole_local_repo/advanced/logrotate" "$pihole_storage/logrotate" +if [ "$pihole_version" == "Last 3.X" ] +then + cp "$pihole_local_repo/advanced/logrotate" "$pihole_storage/logrotate" +else + cp "$pihole_local_repo/advanced/Templates/logrotate" "$pihole_storage/logrotate" +fi dnsmasq_user=$(grep DNSMASQ_USER= /etc/init.d/dnsmasq | cut -d'"' -f2) sed -i "/# su #/d;" "$pihole_storage/logrotate" @@ -213,30 +244,70 @@ ynh_systemd_action --action=stop --service_name=pihole-FTL if [ "$upgrade_type" == "UPGRADE_APP" ] then - # Get the source of Pi-Hole-FTL - FTL_temp_path=$(mktemp -d) - ynh_setup_source --dest_dir="$FTL_temp_path" --source_id=FTL + # Get the source of Pi-Hole-FTL + FTL_temp_path=$(mktemp -d) + if [ "$pihole_version" == "Last 3.X" ] + then + # Install the version 3.3.1 + ynh_setup_source --dest_dir="$FTL_temp_path" --source_id=FTL_3 + else + # Install the last version available + ynh_setup_source --dest_dir="$FTL_temp_path" --source_id=FTL_last + fi - # Instead of downloading a binary file, we're going to compile it - ( cd "$FTL_temp_path" - ynh_exec_warn_less make - ynh_exec_warn_less make install ) - ynh_secure_remove --file="$FTL_temp_path" + # Instead of downloading a binary file, we're going to compile it + ( cd "$FTL_temp_path" + ynh_exec_warn_less make + ynh_exec_warn_less make install ) + ynh_secure_remove --file="$FTL_temp_path" fi # Overwrite pihole-FTL config file only if it's allowed if [ $overwrite_ftl -eq 1 ] then - # Verify the checksum of a file, stored by `ynh_store_file_checksum` in the install script. - ynh_backup_if_checksum_is_different --file="$pihole_storage/pihole-FTL.conf" - cp "../conf/pihole-FTL.conf" "$pihole_storage" - # Recalculate and store the checksum of the file for the next upgrade. - ynh_store_file_checksum --file="$pihole_storage/pihole-FTL.conf" + # Verify the checksum of a file, stored by `ynh_store_file_checksum` in the install script. + ynh_backup_if_checksum_is_different --file="$pihole_storage/pihole-FTL.conf" + cp "../conf/pihole-FTL.conf" "$pihole_storage" + # Recalculate and store the checksum of the file for the next upgrade. + ynh_store_file_checksum --file="$pihole_storage/pihole-FTL.conf" fi -cp -a $pihole_local_repo/advanced/pihole-FTL.service /etc/init.d/pihole-FTL -chmod +x /etc/init.d/pihole-FTL -ynh_exec_warn_less systemctl enable pihole-FTL +if [ "$pihole_version" == "Last 3.X" ] +then + # Version 3.3.1 + cp -a $pihole_local_repo/advanced/pihole-FTL.service /etc/init.d/pihole-FTL + chmod +x /etc/init.d/pihole-FTL + ynh_exec_warn_less systemctl enable pihole-FTL +else + # Last version available + # Stopped dnsmasq to replace it by pihole-FTL + ynh_systemd_action --action=stop --service_name=dnsmasq + + # Disable the real dnsmasq service + ynh_exec_warn_less systemctl disable dnsmasq + + # And move the files that make the service available in systemd to really disable it + mv /lib/systemd/system/dnsmasq.service /lib/systemd/system/.dnsmasq.service.backup_by_pihole + mv /etc/init.d/dnsmasq /etc/init.d/.dnsmasq.backup_by_pihole + + # Move dnsmasq to preserve the current binary + mv /usr/sbin/dnsmasq /usr/sbin/dnsmasq.backup_by_pihole + # Replace dnsmasq by pihole-FTL + # NOTE: pihole-FTL is actually a modified version of dnsmasq + # https://github.com/pi-hole/FTL/tree/master/dnsmasq + ln -s /usr/bin/pihole-FTL /usr/sbin/dnsmasq + + cp -a $pihole_local_repo/advanced/Templates/pihole-FTL.service /etc/init.d/pihole-FTL + chmod +x /etc/init.d/pihole-FTL + ynh_exec_warn_less systemctl enable pihole-FTL + + # Replace the service dnsmasq by pihole-FTL + # That way, YunoHost can continue to use dnsmasq by actually using pihole-FTL + ln -s /run/systemd/generator.late/pihole-FTL.service /etc/systemd/system/multi-user.target.wants/dnsmasq.service + + # Reload systemd config + systemctl daemon-reload +fi #================================================= # BUILD VARIABLES FILE @@ -247,33 +318,38 @@ setupVars="$pihole_storage/setupVars.conf" # Overwrite the setupVars config file only if it's allowed if [ $overwrite_setupvars -eq 1 ] then - # Verify the checksum of a file, stored by `ynh_store_file_checksum` in the install script. - ynh_backup_if_checksum_is_different --file="$setupVars" + # Verify the checksum of a file, stored by `ynh_store_file_checksum` in the install script. + ynh_backup_if_checksum_is_different --file="$setupVars" - # Get the default network interface - main_iface=$(ip route | grep --max-count=1 default | awk '{print $5;}') - echo "PIHOLE_INTERFACE=$main_iface" > $setupVars - echo "IPV4_ADDRESS=127.0.0.1" >> $setupVars - echo "IPV6_ADDRESS=::1" >> $setupVars - echo "PIHOLE_DNS_1=" >> $setupVars - echo "PIHOLE_DNS_2=" >> $setupVars - if [ $query_logging -eq 1 ]; then - query_logging=true - else - query_logging=false - fi - echo "QUERY_LOGGING=$query_logging" >> $setupVars - echo "INSTALL_WEB=true" >> $setupVars + # Get the default network interface + main_iface=$(ip route | grep --max-count=1 default | awk '{print $5;}') + echo "PIHOLE_INTERFACE=$main_iface" > $setupVars + echo "IPV4_ADDRESS=127.0.0.1" >> $setupVars + echo "IPV6_ADDRESS=::1" >> $setupVars + echo "PIHOLE_DNS_1=" >> $setupVars + echo "PIHOLE_DNS_2=" >> $setupVars + if [ $query_logging -eq 1 ]; then + query_logging=true + else + query_logging=false + fi + echo "QUERY_LOGGING=$query_logging" >> $setupVars + echo "INSTALL_WEB=true" >> $setupVars - # Recalculate and store the checksum of the file for the next upgrade. - ynh_store_file_checksum --file="$setupVars" + # Recalculate and store the checksum of the file for the next upgrade. + ynh_store_file_checksum --file="$setupVars" fi #================================================= # UPDATE CRON JOB #================================================= -cp $pihole_local_repo/advanced/pihole.cron /etc/cron.d/pihole +if [ "$pihole_version" == "Last 3.X" ] +then + cp $pihole_local_repo/advanced/pihole.cron /etc/cron.d/pihole +else + cp $pihole_local_repo/advanced/Templates/pihole.cron /etc/cron.d/pihole +fi # Remove git usage for version. Which fails because we use here a release instead of master. ynh_replace_string --match_string=".*updatechecker.*" --replace_string="#&" --target_file=/etc/cron.d/pihole @@ -311,10 +387,6 @@ ynh_maintenance_mode_OFF # Get main domain and buid the url of the admin panel of the app. admin_panel="https://$(grep portal_domain /etc/ssowat/conf.json | cut -d'"' -f4)/yunohost/admin/#/apps/$app" -# Build the changelog -# Get the value of admin_mail_html -admin_mail_html=$(ynh_app_setting_get $app admin_mail_html) -admin_mail_html="${admin_mail_html:-0}" # If a html email is required. Apply html to the changelog. if [ "$admin_mail_html" -eq 1 ]; then format=html @@ -325,12 +397,12 @@ ynh_app_changelog --format=$format if [ $enable_dhcp -eq 1 ] then - dhcp_alert="You asked to use the internal DHCP server of dnsmasq with PiHole. + dhcp_alert="You asked to use the internal DHCP server of dnsmasq with PiHole. You should really read the documentation about that, https://github.com/YunoHost-Apps/pihole_ynh/blob/master/dhcp.md " else - dhcp_alert="" + dhcp_alert="" fi echo "${dhcp_alert}You can configure this app easily by using the experimental __URL_TAG1__config-panel feature__URL_TAG2__$admin_panel/config-panel__URL_TAG3__. diff --git a/sources/patches/.gitignore b/sources/patches/.gitignore deleted file mode 100644 index d38c149..0000000 --- a/sources/patches/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -*.swp -*~ diff --git a/sources/patches/FTL_last-dns_replacement.patch b/sources/patches/FTL_last-dns_replacement.patch deleted file mode 100644 index 9f24389..0000000 --- a/sources/patches/FTL_last-dns_replacement.patch +++ /dev/null @@ -1,131 +0,0 @@ ---- a/args.c 2019-05-25 21:37:26.000000000 +0200 -+++ b/args.c 2020-04-24 00:32:27.000000000 +0200 -@@ -17,20 +17,88 @@ - int argc_dnsmasq = 0; - const char** argv_dnsmasq = NULL; - -+static inline bool strEndsWith(const char *input, const char *end){ -+ return strcmp(input + strlen(input) - strlen(end), end) == 0; -+} -+ - void parse_args(int argc, char* argv[]) - { -- int i; -- - // Regardless of any arguments, we always pass "-k" (nofork) to dnsmasq - argc_dnsmasq = 2; - argv_dnsmasq = calloc(argc_dnsmasq, sizeof(char*)); - argv_dnsmasq[0] = ""; - argv_dnsmasq[1] = "-k"; - -- // start from 1, as argv[0] is the executable name "pihole-FTL" -- for(i=1; i < argc; i++) -+ bool consume_for_dnsmasq = false; -+ // If the binary name is "dnsmasq" (e.g., symlink /usr/bin/dnsmasq -> /usr/bin/pihole-FTL), -+ // we operate in drop-in mode and consume all arguments for the embedded dnsmasq core -+ if(strEndsWith(argv[0], "dnsmasq")) -+ consume_for_dnsmasq = true; -+ -+ // start from 1, as argv[0] is the executable name -+ for(int i = 1; i < argc; i++) - { - bool ok = false; -+ -+ // Implement dnsmasq's test function, no need to prepare the entire FTL -+ // environment (initialize shared memory, lead queries from long-term -+ // database, ...) when the task is a simple (dnsmasq) syntax check -+ if(strcmp(argv[i], "dnsmasq-test") == 0 || -+ strcmp(argv[i], "--test") == 0) -+ { -+ const char *arg[2]; -+ arg[0] = ""; -+ arg[1] = "--test"; -+ main_dnsmasq(2, arg); -+ ok = true; -+ } -+ -+ // If we find "--" we collect everything behind that for dnsmasq -+ if(strcmp(argv[i], "--") == 0) -+ { -+ // Remember that the rest is for dnsmasq ... -+ consume_for_dnsmasq = true; -+ -+ // ... and skip the current argument ("--") -+ continue; -+ } -+ -+ // If consume_for_dnsmasq is true, we collect all remaining options for -+ // dnsmasq -+ if(consume_for_dnsmasq) -+ { -+ argc_dnsmasq = argc - i + 2; -+ if(argv_dnsmasq != NULL) -+ free(argv_dnsmasq); -+ -+ argv_dnsmasq = calloc(argc_dnsmasq, sizeof(const char*)); -+ argv_dnsmasq[0] = ""; -+ -+ if(debug) -+ argv_dnsmasq[1] = "-d"; -+ else -+ argv_dnsmasq[1] = "-k"; -+ -+ if(debug) -+ { -+ printf("dnsmasq options: [0]: %s\n", argv_dnsmasq[0]); -+ printf("dnsmasq options: [1]: %s\n", argv_dnsmasq[1]); -+ } -+ -+ int j = 2; -+ while(i < argc) -+ { -+ argv_dnsmasq[j++] = strdup(argv[i++]); -+ if(debug) -+ printf("dnsmasq options: [%i]: %s\n", j-1, argv_dnsmasq[j-1]); -+ } -+ -+ // Return early: We have consumes all available command line arguments -+ return; -+ } -+ -+ // What follows beyond this point are FTL internal command line arguments -+ - if(strcmp(argv[i], "d") == 0 || - strcmp(argv[i], "debug") == 0) - { -@@ -97,35 +165,6 @@ - ok = true; - } - -- // Implement dnsmasq's test function -- if(strcmp(argv[i], "dnsmasq-test") == 0) -- { -- const char *arg[2]; -- arg[0] = ""; -- arg[1] = "--test"; -- main_dnsmasq(2, arg); -- ok = true; -- } -- -- // If we find "--" we collect everything behind that for dnsmasq -- if(strcmp(argv[i], "--") == 0) -- { -- int j; -- argc_dnsmasq = argc - i + 1; -- if(argv_dnsmasq != NULL) free(argv_dnsmasq); -- argv_dnsmasq = calloc(argc_dnsmasq + 2,sizeof(const char*)); -- argv_dnsmasq[0] = ""; -- if(debug) argv_dnsmasq[1] = "-d"; -- else argv_dnsmasq[1] = "-k"; -- -- for(j=2; j < argc_dnsmasq; j++) -- { -- argv_dnsmasq[j] = strdup(argv[i+j-1]); -- if(debug) logg("dnsmasq options: [%i]: %s",j,argv_dnsmasq[j]); -- } -- return; -- } -- - // List of implemented arguments - if(strcmp(argv[i], "-h") == 0 || strcmp(argv[i], "help") == 0 || strcmp(argv[i], "--help") == 0) - {