From 6329b618796845c0c046fe68e33c363c66eb6dec Mon Sep 17 00:00:00 2001 From: VirtuBox Date: Sat, 5 Oct 2019 12:29:49 +0200 Subject: [PATCH 01/44] Install WordOps from pypi --- install | 83 ++++++++------------------------------------------------ setup.py | 16 ++++++----- 2 files changed, 21 insertions(+), 78 deletions(-) diff --git a/install b/install index 4378362..7f9a97c 100755 --- a/install +++ b/install @@ -9,7 +9,7 @@ # ------------------------------------------------------------------------- # wget -qO wo wops.cc && sudo bash wo # ------------------------------------------------------------------------- -# Version 3.9.9.1 - 2019-09-27 +# Version 3.9.9.3 - 2019-10-05 # ------------------------------------------------------------------------- # CONTENTS @@ -62,9 +62,6 @@ while [ "$#" -gt 0 ]; do wo_branch="$2" shift ;; - -p | --preserve) - wo_preserve_config="y" - ;; --force) wo_force_install="y" ;; @@ -78,10 +75,6 @@ while [ "$#" -gt 0 ]; do --purge | --uninstall) wo_purge="y" ;; - -v | --version) - wo_version="$2" - shift - ;; *) # positional args ;; esac @@ -167,7 +160,6 @@ readonly wo_tmp_dir=/var/lib/wo/tmp readonly wo_install_log=/var/log/wo/install.log readonly wo_linux_distro=$(lsb_release -is) readonly wo_distro_version=$(lsb_release -sc) -readonly wo_distro_id=$(lsb_release -rs) readonly TIME_FORMAT='%d-%b-%Y-%H%M%S' readonly TIME=$(date +"$TIME_FORMAT") readonly NGINX_BACKUP_FILE="/var/lib/wo-backup/nginx-backup.$TIME.tar.gz" @@ -232,13 +224,13 @@ wo_install_dep() { if [ "$wo_linux_distro" == "Ubuntu" ]; then # install dependencies apt-get -option=Dpkg::options::=--force-confmiss --option=Dpkg::options::=--force-confold --assume-yes install \ - build-essential curl gzip python3 python3-apt python3-setuptools python3-dev sqlite3 git tar software-properties-common pigz \ + build-essential curl gzip python3-pip python3-wheel python3-apt python3-setuptools python3-dev sqlite3 git tar software-properties-common pigz \ gnupg2 cron ccze rsync tree haveged ufw unattended-upgrades tzdata ntp > /dev/null 2>&1 add-apt-repository ppa:wordops/nginx-wo -yn else # install dependencies apt-get -option=Dpkg::options::=--force-confmiss --option=Dpkg::options::=--force-confold --assume-yes install \ - build-essential curl gzip dirmngr sudo python3 python3-apt python3-setuptools python3-requests python3-dev ca-certificates sqlite3 git tar \ + build-essential curl gzip dirmngr sudo python3 python3-pip python3-wheel python3-apt python3-setuptools python3-dev ca-certificates sqlite3 git tar \ software-properties-common pigz apt-transport-https gnupg2 cron ccze rsync tree haveged ufw unattended-upgrades tzdata ntp > /dev/null 2>&1 # add php repository gpg key [ -d /etc/apt/trusted.gpg.d ] && { wget -qO /etc/apt/trusted.gpg.d/php.gpg https://packages.sury.org/php/apt.gpg; } @@ -318,16 +310,6 @@ wo_sync_db() { wo_site_current_type=$(grep "common/" "/etc/nginx/sites-available/$site" | awk -F "/" '{print $2}') - if echo "$wo_site_current_type" | grep -q "php"; then - if echo "$wo_site_current_type" | grep -q "php7"; then - wo_php_version="7.0" - else - wo_php_version="5.6" - fi - else - wo_php_version="" - fi - if echo "$wo_site_current_type" | grep -q "redis"; then wo_site_current_cache="wpredis" elif echo "$wo_site_current_type" | grep -q wpsc; then @@ -458,19 +440,6 @@ wo_install_acme_sh() { fi } -# Download WordOps -wo_download() { - rm -f /etc/bash_completion.d/wo_auto.rc - rm -rf /var/lib/wo/tmp/WordOps-* - if [ -z "$wo_version" ]; then - curl -sL https://github.com/WordOps/WordOps/archive/${wo_branch}.tar.gz | tar -I pigz -xf - -C /var/lib/wo/tmp - mv "/var/lib/wo/tmp/WordOps-$wo_branch" /var/lib/wo/tmp/WordOps-install - else - curl -sL https://github.com/WordOps/WordOps/archive/v${wo_version}.tar.gz | tar -I pigz -xf - -C /var/lib/wo/tmp - mv "/var/lib/wo/tmp/WordOps-$wo_version" /var/lib/wo/tmp/WordOps-install - fi -} - wo_git_config() { if [ "$wo_force_install" = "y" ]; then @@ -486,22 +455,10 @@ wo_git_config() { # WordOps install wo_install() { - cd /var/lib/wo/tmp/WordOps-install || exit 1 - python3 setup.py install - -} - -# Clone Github repository if it doesn't exist -wo_install_travis() { - - if [ "$wo_force_install" = "y" ]; then - [ ! -f "$HOME/.gitconfig" ] && { bash -c 'echo -e "[user]\n\tname = $USER\n\temail = root@$HOSTNAME.local" > $HOME/.gitconfig'; } - fi - - if [ -f "$HOME/.gitconfig" ]; then - # install and redirect log to not print python package install - python3 setup.py install - fi + python3 -m pip install pip --upgrade + python3 -m pip install wordops --upgrade + cp -rf /usr/local/lib/python3.*/dist-packages/etc/* /etc/ + cp -rf /usr/local/lib/python3.*/dist-packages/usr/* /usr/ } @@ -610,32 +567,18 @@ wo_update_latest() { chmod 600 /root/.my.cnf fi fi - - # Fix Redis-server security issue - # http://redis.io/topics/security - if [ -f /etc/redis/redis.conf ]; then - CHECK_REDIS_BIND=$(grep -0 -v "#" /etc/redis/redis.conf | grep 'bind' >> /dev/null 2>&1) - - if [ -z "$CHECK_REDIS_BIND" ]; then - echo 'bind 127.0.0.1 ::1' >> /etc/redis/redis.conf - - service redis-server restart - - fi - fi - } wo_backup_ee() { local BACKUP_EE="" [ -d /etc/nginx ] && { BACKUP_EE="$BACKUP_EE /etc/nginx"; } [ -d /etc/letsencrypt ] && { BACKUP_EE="$BACKUP_EE /etc/letsencrypt"; } - /bin/tar -I pigz -cf "$EE_BACKUP_FILE" /usr/local/bin/ee /usr/lib/ee/templates /usr/local/lib/python3.*/dist-packages/ee-*.egg /etc/ee /var/lib/ee "$BACKUP_EE" + /bin/tar -I pigz -cf "$EE_BACKUP_FILE" /usr/local/bin/ee /usr/lib/ee/templates /etc/ee /var/lib/ee "$BACKUP_EE" return 0 } wo_backup_wo() { - /bin/tar -I pigz -cf "$WO_BACKUP_FILE" /etc/nginx /etc/wo /var/lib/wo "$WO_LE" + /bin/tar -I pigz -cf "$WO_BACKUP_FILE" /etc/nginx /etc/wo /var/lib/wo return 0 } @@ -686,7 +629,7 @@ wo_systemd_tweak() { } wo_domain_suffix() { - curl -sL https://raw.githubusercontent.com/publicsuffix/list/master/public_suffix_list.dat | sed '/^\/\//d' | sed '/^$/d' | sed 's/^\s+//g' > /var/lib/wo/public_suffix_list.dat + curl -m 10 --retry 3 -sL https://raw.githubusercontent.com/publicsuffix/list/master/public_suffix_list.dat | sed '/^\/\//d' | sed '/^$/d' | sed 's/^\s+//g' > /var/lib/wo/public_suffix_list.dat } wo_mariadb_tweak() { @@ -715,6 +658,7 @@ wo_clean() { } wo_uninstall() { + python3 -m pip uninstall wordops rm -rf /usr/local/lib/python3.*/dist-packages/{pystache-*,cement-2.*,wo-*} /usr/local/bin/wo /etc/bash_completion.d/wo_auto.rc /var/lib/wo /etc/wo /usr/lib/wo/templates } @@ -827,13 +771,10 @@ else #fi # skip steps if travis if [ -z "$wo_travis" ]; then - _run wo_download "Downloading WordOps" _run wo_dist_upgrade wo_git_config - _run wo_install "Installing WordOps" - else - _run wo_install_travis "Installing WordOps" fi + _run wo_install "Installing WordOps" if [ -x /usr/local/bin/ee ]; then _run wo_upgrade_nginx "Upgrading Nginx" _run wo_clean_ee "Cleaning previous EasyEngine install" diff --git a/setup.py b/setup.py index 160ee85..be28dd0 100644 --- a/setup.py +++ b/setup.py @@ -10,24 +10,26 @@ with open("README.md", "r") as fh: conf = [] templates = [] +short_description = """An essential toolset that eases WordPress + site and server administration""" + for name in glob.glob('config/plugins.d/*.conf'): conf.insert(1, name) for name in glob.glob('wo/cli/templates/*.mustache'): templates.insert(1, name) -if os.geteuid() == 0: - if not os.path.exists('/var/log/wo/'): - os.makedirs('/var/log/wo/') +if not os.path.exists('/var/log/wo/'): + os.makedirs('/var/log/wo/') - if not os.path.exists('/var/lib/wo/tmp/'): - os.makedirs('/var/lib/wo/tmp/') +if not os.path.exists('/var/lib/wo/tmp/'): + os.makedirs('/var/lib/wo/tmp/') setup(name='wordops', version='3.9.9.2', - description='WordPress & server administration toolset', + description=short_description, long_description=long_description, - long_description_content_type='text/markdown', + long_description_content_type="text/markdown", classifiers=[ "Programming Language :: Python :: 3", "License :: OSI Approved :: MIT License", From b553f1bf0260c825a7ce6efee03e1acd69f74fd9 Mon Sep 17 00:00:00 2001 From: VirtuBox Date: Sat, 5 Oct 2019 13:31:16 +0200 Subject: [PATCH 02/44] Fix uninstall confirmation --- install | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install b/install index 7f9a97c..0eef3dc 100755 --- a/install +++ b/install @@ -658,7 +658,7 @@ wo_clean() { } wo_uninstall() { - python3 -m pip uninstall wordops + python3 -m pip uninstall wordops -y rm -rf /usr/local/lib/python3.*/dist-packages/{pystache-*,cement-2.*,wo-*} /usr/local/bin/wo /etc/bash_completion.d/wo_auto.rc /var/lib/wo /etc/wo /usr/lib/wo/templates } From 92c2bdfd3a57adbc0b3191b1ded2ea569f26efa0 Mon Sep 17 00:00:00 2001 From: VirtuBox Date: Mon, 7 Oct 2019 12:27:16 +0200 Subject: [PATCH 03/44] Fix for secure --- CHANGELOG.md | 5 +++++ wo/cli/plugins/secure.py | 3 +-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 852f9c7..be081d7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,11 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), ### v3.9.x - [Unreleased] +#### Changed + +- WordOps is now installed from PyPI using pip [WordOps](https://pypi.org/project/wordops/) +- New Nginx package built with OpenSSL 1.1.1d and updated brotli module + ### v3.9.9.2 - 2019-10-04 #### Added diff --git a/wo/cli/plugins/secure.py b/wo/cli/plugins/secure.py index 889f765..e1c6797 100644 --- a/wo/cli/plugins/secure.py +++ b/wo/cli/plugins/secure.py @@ -3,7 +3,6 @@ import os from cement.core import handler, hook from cement.core.controller import CementBaseController, expose - from wo.core.fileutils import WOFileUtils from wo.core.git import WOGit from wo.core.logging import Log @@ -70,7 +69,7 @@ class WOSecureController(CementBaseController): WOGit.add(self, ["/etc/nginx"], msg="Add Nginx to into Git") pargs = self.app.pargs - passwd = RANDOM.gen(self, length='24') + passwd = RANDOM.gen(self) if not pargs.user_input: username = input("Provide HTTP authentication user " "name [{0}] :".format(WOVar.wo_user)) From 99d36aaa2d05158e8f593e124b5e7f5ef6e7fdb7 Mon Sep 17 00:00:00 2001 From: VirtuBox Date: Mon, 7 Oct 2019 13:11:38 +0200 Subject: [PATCH 04/44] another fix for secure --- wo/cli/plugins/secure.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/wo/cli/plugins/secure.py b/wo/cli/plugins/secure.py index e1c6797..ceead3f 100644 --- a/wo/cli/plugins/secure.py +++ b/wo/cli/plugins/secure.py @@ -108,11 +108,12 @@ class WOSecureController(CementBaseController): Log.info(self, "Please enter a valid port number ") pargs.user_input = input("WordOps " "admin port [22222]:") - if not pargs.user_input: + else: port = input("WordOps admin port [22222]:") if port == "": port = 22222 - while (not port.isdigit()) and (port != "") and (not port < 65536): + while ((not port.isdigit()) and (not port != "") and + (not port < 65536)): Log.info(self, "Please Enter valid port number :") port = input("WordOps admin port [22222]:") pargs.user_input = port From e3f38bb86437a60d25a3e819db7c5fe36ddafb78 Mon Sep 17 00:00:00 2001 From: VirtuBox Date: Tue, 8 Oct 2019 02:19:22 +0200 Subject: [PATCH 05/44] Fix `wo stack upgrade` issues --- wo/cli/plugins/stack_upgrade.py | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/wo/cli/plugins/stack_upgrade.py b/wo/cli/plugins/stack_upgrade.py index 136aeaf..e4415b5 100644 --- a/wo/cli/plugins/stack_upgrade.py +++ b/wo/cli/plugins/stack_upgrade.py @@ -94,7 +94,7 @@ class WOStackUpgradeController(CementBaseController): if WOAptGet.is_installed(self, 'nginx-custom'): apt_packages = apt_packages + WOVar.wo_nginx else: - if os.path.isfile(self, '/usr/sbin/nginx'): + if os.path.isfile('/usr/sbin/nginx'): Log.info(self, "Updating Nginx templates") post_pref(self, WOVar.wo_nginx, []) else: @@ -186,15 +186,14 @@ class WOStackUpgradeController(CementBaseController): self.app.args.print_help() else: if (apt_packages): - if not (set(["php7.2-fpm"]).issubset(set(apt_packages)) and - set(["php7.3-fpm"]).issubset(set(apt_packages)) and - set(["nginx-custom", - "nginx-wo"]).issubset(set(apt_packages)) and - set(['mariadb-server']).issubset(set(apt_packages))): + if (("php7.2-fpm" not in apt_packages) and + ("php7.3-fpm" not in apt_packages) and + ("nginx-custom" not in apt_packages) and + ("mariadb-server" not in apt_packages)): pass else: Log.info( - self, "Your site may be down for few seconds if " + self, "Your sites may be down for few seconds if " "you are upgrading Nginx, PHP-FPM, MariaDB or Redis") # Check prompt if ((not pargs.no_prompt) and (not pargs.force)): @@ -219,7 +218,6 @@ class WOStackUpgradeController(CementBaseController): # check if nginx upgrade is blocked if os.path.isfile( '/etc/apt/preferences.d/nginx-block'): - apt_packages.remove(WOVar.wo_nginx) post_pref(self, WOVar.wo_nginx, [], True) # upgrade packages WOAptGet.install(self, apt_packages) From d2f1eb651b2844185fc4efc71c72e2d95072a23d Mon Sep 17 00:00:00 2001 From: VirtuBox Date: Tue, 8 Oct 2019 02:36:14 +0200 Subject: [PATCH 06/44] Update travis testing --- .travis.yml | 4 +++- install | 14 +++++++++++++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 64c9c5f..9abb1fb 100644 --- a/.travis.yml +++ b/.travis.yml @@ -23,7 +23,7 @@ before_script: - sudo bash -c 'echo example.com > /etc/hostname' - unset LANG - sudo apt-get -qq purge mysql* graphviz* redis* - - sudo apt-get install -qq git python3-setuptools python3-dev python3-apt ccze tree + - sudo apt-get install -qq git python3-setuptools python3-dev python3-apt ccze tree python3-wheel python3-pip - sudo apt-get -qq autoremove --purge @@ -37,6 +37,8 @@ script: - lsb_release -a - sudo bash -c 'echo -e "[user]\n\tname = abc\n\temail = root@localhost.com" > /home/travis/.gitconfig' - sudo echo "Travis Banch = $TRAVIS_BRANCH" + - sudo python3 setup.py sdist bdist_wheel + - sudo time bash install --travis -b "$TRAVIS_BRANCH" - sudo time bash tests/travis.sh - sudo wo update --travis \ No newline at end of file diff --git a/install b/install index 0eef3dc..1d647c9 100755 --- a/install +++ b/install @@ -462,6 +462,16 @@ wo_install() { } +# WordOps install +wo_travis_install() { + + python3 -m pip install pip --upgrade + python3 -m pip install dist/*.whl --upgrade + cp -rf /usr/local/lib/python3.*/dist-packages/etc/* /etc/ + cp -rf /usr/local/lib/python3.*/dist-packages/usr/* /usr/ + +} + wo_upgrade_nginx() { if [ -d /var/lib/wo-backup/nginx ]; then @@ -773,8 +783,10 @@ else if [ -z "$wo_travis" ]; then _run wo_dist_upgrade wo_git_config + _run wo_install "Installing WordOps" + else + _run wo_travis_install "Installing WordOps" fi - _run wo_install "Installing WordOps" if [ -x /usr/local/bin/ee ]; then _run wo_upgrade_nginx "Upgrading Nginx" _run wo_clean_ee "Cleaning previous EasyEngine install" From d8059f265261e9144e17549b734efe12759381e6 Mon Sep 17 00:00:00 2001 From: VirtuBox Date: Tue, 8 Oct 2019 02:39:53 +0200 Subject: [PATCH 07/44] switch back to bionic --- .travis.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 9abb1fb..dd5268a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,5 +1,5 @@ sudo: required -dist: xenial +dist: bionic language: bash @@ -38,7 +38,6 @@ script: - sudo bash -c 'echo -e "[user]\n\tname = abc\n\temail = root@localhost.com" > /home/travis/.gitconfig' - sudo echo "Travis Banch = $TRAVIS_BRANCH" - sudo python3 setup.py sdist bdist_wheel - - sudo time bash install --travis -b "$TRAVIS_BRANCH" - sudo time bash tests/travis.sh - sudo wo update --travis \ No newline at end of file From 2eb6afe647f0625d3e67ae7b335f23dc5baab792 Mon Sep 17 00:00:00 2001 From: VirtuBox Date: Tue, 8 Oct 2019 02:41:42 +0200 Subject: [PATCH 08/44] update github actions --- .github/workflows/main.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 53ae6b1..61757a7 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -15,10 +15,11 @@ jobs: sudo apt update -qq sudo LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php -y sudo apt-get -qq purge graphviz* redis* - sudo apt-get install -qq git python3-setuptools python3-dev python3-apt ccze tree + sudo apt-get install -qq git python3-setuptools python3-dev python3-apt python3-wheel python3-pip ccze tree sudo apt-get -qq autoremove --purge sudo mkdir -p /etc/mysql/conf.d echo -e '[client]\nuser = root\npassword = root\n' | sudo tee /etc/mysql/conf.d/my.cnf + sudo python3 setup.py sdist bdist_wheel - name: Install WordOps run: sudo timeout 1800 bash install --travis - name: Run tests From 07755b13ff9ce0047b666899cd12422682549853 Mon Sep 17 00:00:00 2001 From: VirtuBox Date: Tue, 8 Oct 2019 10:04:40 +0200 Subject: [PATCH 09/44] Fix secure --- setup.py | 2 +- wo/core/random.py | 4 ++-- wo/core/variables.py | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/setup.py b/setup.py index be28dd0..cd2a888 100644 --- a/setup.py +++ b/setup.py @@ -26,7 +26,7 @@ if not os.path.exists('/var/lib/wo/tmp/'): os.makedirs('/var/lib/wo/tmp/') setup(name='wordops', - version='3.9.9.2', + version='3.9.9.3', description=short_description, long_description=long_description, long_description_content_type="text/markdown", diff --git a/wo/core/random.py b/wo/core/random.py index f6ff3b0..d8dc66e 100644 --- a/wo/core/random.py +++ b/wo/core/random.py @@ -5,8 +5,8 @@ import string class RANDOM: """Random strings generator""" - def gen(self, length='24'): + def gen(self): short_random = ''.join([random.choice (string.ascii_letters + string.digits) - for n in range(length)]) + for n in range(24)]) return short_random diff --git a/wo/core/variables.py b/wo/core/variables.py index 67c86dd..5e452b7 100644 --- a/wo/core/variables.py +++ b/wo/core/variables.py @@ -13,7 +13,7 @@ class WOVar(): """Intialization of core variables""" # WordOps version - wo_version = "3.9.9.2" + wo_version = "3.9.9.3" # WordOps packages versions wo_wp_cli = "2.3.0" wo_adminer = "4.7.3" From 4181b49e5de7c99b590f547b759e4beaa65230ad Mon Sep 17 00:00:00 2001 From: VirtuBox Date: Tue, 8 Oct 2019 11:17:07 +0200 Subject: [PATCH 10/44] Fix `wo secure --sshport` --- CHANGELOG.md | 6 ++++++ wo/cli/plugins/secure.py | 13 +++++++++---- wo/core/random.py | 8 +++++++- 3 files changed, 22 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index be081d7..a42df5c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,12 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), - WordOps is now installed from PyPI using pip [WordOps](https://pypi.org/project/wordops/) - New Nginx package built with OpenSSL 1.1.1d and updated brotli module +#### Fixed + +- `wo stack upgrade` when using nginx-ee +- `wo secure --auth` +- `wo secure --sshport` not working with default ssh config + ### v3.9.9.2 - 2019-10-04 #### Added diff --git a/wo/cli/plugins/secure.py b/wo/cli/plugins/secure.py index ceead3f..719e0b5 100644 --- a/wo/cli/plugins/secure.py +++ b/wo/cli/plugins/secure.py @@ -69,7 +69,7 @@ class WOSecureController(CementBaseController): WOGit.add(self, ["/etc/nginx"], msg="Add Nginx to into Git") pargs = self.app.pargs - passwd = RANDOM.gen(self) + passwd = RANDOM.long(self) if not pargs.user_input: username = input("Provide HTTP authentication user " "name [{0}] :".format(WOVar.wo_user)) @@ -220,9 +220,14 @@ class WOSecureController(CementBaseController): Log.info(self, "Please Enter valid port number :") port = input("Server SSH port [22]:") pargs.user_input = port - WOShellExec.cmd_exec(self, "sed -i \"s/Port.*/Port " - "{port}/\" /etc/ssh/sshd_config" - .format(port=pargs.user_input)) + if WOFileUtils.grepcheck(self, '/etc/ssh/sshd_config', '#Port'): + WOShellExec.cmd_exec(self, "sed -i \"s/#Port.*/Port " + "{port}/\" /etc/ssh/sshd_config" + .format(port=pargs.user_input)) + else: + WOShellExec.cmd_exec(self, "sed -i \"s/Port.*/Port " + "{port}/\" /etc/ssh/sshd_config" + .format(port=pargs.user_input)) # allow new ssh port if ufw is enabled if os.path.isfile('/etc/ufw/ufw.conf'): # add rule for proftpd with UFW diff --git a/wo/core/random.py b/wo/core/random.py index d8dc66e..a0bc7f6 100644 --- a/wo/core/random.py +++ b/wo/core/random.py @@ -5,7 +5,13 @@ import string class RANDOM: """Random strings generator""" - def gen(self): + def long(self): + long_random = ''.join([random.choice + (string.ascii_letters + string.digits) + for n in range(24)]) + return long_random + + def short(self): short_random = ''.join([random.choice (string.ascii_letters + string.digits) for n in range(24)]) From 91a91abeefe8026a2db9a36a153ba761ce6a8a82 Mon Sep 17 00:00:00 2001 From: VirtuBox Date: Tue, 8 Oct 2019 12:09:54 +0200 Subject: [PATCH 11/44] Delete main.yml --- .github/workflows/main.yml | 26 -------------------------- 1 file changed, 26 deletions(-) delete mode 100644 .github/workflows/main.yml diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml deleted file mode 100644 index 61757a7..0000000 --- a/.github/workflows/main.yml +++ /dev/null @@ -1,26 +0,0 @@ -name: CI - -on: [push] - -jobs: - build: - - runs-on: ubuntu-18.04 - - steps: - - uses: actions/checkout@v1 - - name: Prepare VM - run: | - unset LANG - sudo apt update -qq - sudo LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php -y - sudo apt-get -qq purge graphviz* redis* - sudo apt-get install -qq git python3-setuptools python3-dev python3-apt python3-wheel python3-pip ccze tree - sudo apt-get -qq autoremove --purge - sudo mkdir -p /etc/mysql/conf.d - echo -e '[client]\nuser = root\npassword = root\n' | sudo tee /etc/mysql/conf.d/my.cnf - sudo python3 setup.py sdist bdist_wheel - - name: Install WordOps - run: sudo timeout 1800 bash install --travis - - name: Run tests - run: sudo timeout 1800 bash tests/travis.sh --actions From c90ac2620e089d85f365da65b45da1b170c2223e Mon Sep 17 00:00:00 2001 From: VirtuBox Date: Tue, 8 Oct 2019 17:14:22 +0200 Subject: [PATCH 12/44] Fix issues with APT repositories --- CHANGELOG.md | 3 ++- install | 47 ++++++++++++++++++++++++--------------- setup.py | 1 - wo/core/apt_repo.py | 8 ++++--- wo/core/aptget.py | 54 ++++++++++++++++++++++----------------------- 5 files changed, 63 insertions(+), 50 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a42df5c..7e09887 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,13 +11,14 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), #### Changed - WordOps is now installed from PyPI using pip [WordOps](https://pypi.org/project/wordops/) -- New Nginx package built with OpenSSL 1.1.1d and updated brotli module +- New Nginx package built with OpenSSL_1.1.1d and the latest ngx_brotli module #### Fixed - `wo stack upgrade` when using nginx-ee - `wo secure --auth` - `wo secure --sshport` not working with default ssh config +- Issues after APT repositories informations changed ### v3.9.9.2 - 2019-10-04 diff --git a/install b/install index 1d647c9..24df83f 100755 --- a/install +++ b/install @@ -9,7 +9,7 @@ # ------------------------------------------------------------------------- # wget -qO wo wops.cc && sudo bash wo # ------------------------------------------------------------------------- -# Version 3.9.9.3 - 2019-10-05 +# Version 3.9.9.3 - 2019-10-08 # ------------------------------------------------------------------------- # CONTENTS @@ -90,14 +90,15 @@ if [[ $EUID -ne 0 ]]; then exit 100 fi -### -# 1- Update the apt sewers with fresh info -### export DEBIAN_FRONTEND=noninteractive unset LANG export LANG='en_US.UTF-8' export LC_ALL='C.UTF-8' +### +# 1- Main functions +### + # check if a command exist command_exists() { command -v "$@" > /dev/null 2>&1 @@ -114,14 +115,9 @@ _run() { } -check_path() { - if [ -d "$1" ]; then - return 0 - else - return 1 - fi -} - +### +# 1- Update the apt sewers with fresh info +### if [ -z "$wo_travis" ]; then if command_exists curl; then apt-get update -qq @@ -219,18 +215,32 @@ wo_dist_upgrade() { apt-get dist-upgrade --option=Dpkg::options::=--force-confmiss --option=Dpkg::options::=--force-confold --option=Dpkg::options::=--force-unsafe-io --assume-yes --quiet } +# install apt-mirror-updater and find the fastest mirror available +wo_apt_mirror() { + + apt-get -option=Dpkg::options::=--force-confmiss --option=Dpkg::options::=--force-confold --assume-yes install \ + python3-pip python3-wheel python3-apt python3-setuptools > /dev/null 2>&1 + python3 -m pip install pip --upgrade + if { + python3 -m pip install apt-mirror-updater --upgrade + }; then + /usr/local/bin/apt-mirror-updater -a + fi + +} + wo_install_dep() { if [ "$wo_linux_distro" == "Ubuntu" ]; then # install dependencies apt-get -option=Dpkg::options::=--force-confmiss --option=Dpkg::options::=--force-confold --assume-yes install \ - build-essential curl gzip python3-pip python3-wheel python3-apt python3-setuptools python3-dev sqlite3 git tar software-properties-common pigz \ - gnupg2 cron ccze rsync tree haveged ufw unattended-upgrades tzdata ntp > /dev/null 2>&1 + build-essential curl gzip python3-dev sqlite3 git tar software-properties-common pigz \ + gnupg2 cron ccze rsync apt-transport-https tree haveged ufw unattended-upgrades tzdata ntp > /dev/null 2>&1 add-apt-repository ppa:wordops/nginx-wo -yn else # install dependencies apt-get -option=Dpkg::options::=--force-confmiss --option=Dpkg::options::=--force-confold --assume-yes install \ - build-essential curl gzip dirmngr sudo python3 python3-pip python3-wheel python3-apt python3-setuptools python3-dev ca-certificates sqlite3 git tar \ + build-essential curl gzip dirmngr sudo python3-dev ca-certificates sqlite3 git tar \ software-properties-common pigz apt-transport-https gnupg2 cron ccze rsync tree haveged ufw unattended-upgrades tzdata ntp > /dev/null 2>&1 # add php repository gpg key [ -d /etc/apt/trusted.gpg.d ] && { wget -qO /etc/apt/trusted.gpg.d/php.gpg https://packages.sury.org/php/apt.gpg; } @@ -455,7 +465,6 @@ wo_git_config() { # WordOps install wo_install() { - python3 -m pip install pip --upgrade python3 -m pip install wordops --upgrade cp -rf /usr/local/lib/python3.*/dist-packages/etc/* /etc/ cp -rf /usr/local/lib/python3.*/dist-packages/usr/* /usr/ @@ -465,7 +474,6 @@ wo_install() { # WordOps install wo_travis_install() { - python3 -m pip install pip --upgrade python3 -m pip install dist/*.whl --upgrade cp -rf /usr/local/lib/python3.*/dist-packages/etc/* /etc/ cp -rf /usr/local/lib/python3.*/dist-packages/usr/* /usr/ @@ -588,7 +596,9 @@ wo_backup_ee() { } wo_backup_wo() { - /bin/tar -I pigz -cf "$WO_BACKUP_FILE" /etc/nginx /etc/wo /var/lib/wo + if [ -d /etc/nginx ] && [ -d /etc/wo ] && [ -d /var/lib/wo ]; then + /bin/tar -I pigz -cf "$WO_BACKUP_FILE" /etc/nginx /etc/wo /var/lib/wo + fi return 0 } @@ -774,6 +784,7 @@ else _run wo_remove_ee_cron "Removing EasyEngine cronjob" _run wo_sync_db "Syncing WO database" fi + _run wo_apt_mirror "Finding the fastest APT mirror" _run wo_install_dep "Installing wo dependencies" _run wo_timesync #if [ "$ufw" = "y" ]; then diff --git a/setup.py b/setup.py index cd2a888..a0f765e 100644 --- a/setup.py +++ b/setup.py @@ -63,7 +63,6 @@ setup(name='wordops', 'SQLAlchemy >= 1.3.8', 'requests >= 2.22.0', 'distro >= 1.4.0', - 'apt-mirror-updater >= 6.1', ], extras_require={ # Optional 'testing': ['nose', 'coverage'], diff --git a/wo/core/apt_repo.py b/wo/core/apt_repo.py index f7ba7b6..5192cdd 100644 --- a/wo/core/apt_repo.py +++ b/wo/core/apt_repo.py @@ -48,9 +48,11 @@ class WORepo(): Log.debug(self, "{0}".format(e)) Log.error(self, "Unable to add repo") if ppa is not None: - WOShellExec.cmd_exec( - self, "LC_ALL=C.UTF-8 add-apt-repository -yu '{ppa_name}'" - .format(ppa_name=ppa)) + if WOShellExec.cmd_exec( + self, "LC_ALL=C.UTF-8 add-apt-repository -yu '{ppa_name}'" + .format(ppa_name=ppa)): + return True + return False def remove(self, ppa=None, repo_url=None): """ diff --git a/wo/core/aptget.py b/wo/core/aptget.py index d3c2a81..4e6fa40 100644 --- a/wo/core/aptget.py +++ b/wo/core/aptget.py @@ -18,11 +18,11 @@ class WOAptGet(): """ try: with open('/var/log/wo/wordops.log', 'a') as f: - proc = subprocess.Popen('apt-mirror-updater -u', - shell=True, - stdin=None, stdout=f, - stderr=subprocess.PIPE, - executable="/bin/bash") + proc = subprocess.Popen( + 'DEBIAN_FRONTEND=noninteractive apt-get update ' + '--allow-releaseinfo-change', + shell=True, stdin=None, stdout=f, + stderr=subprocess.PIPE, executable="/bin/bash") proc.wait() output, error_output = proc.communicate() @@ -83,18 +83,16 @@ class WOAptGet(): """ try: with open('/var/log/wo/wordops.log', 'a') as f: - proc = subprocess.Popen("DEBIAN_FRONTEND=noninteractive " - "apt-get dist-upgrade " - "--option=Dpkg::options::=" - "--force-confdef " - "--option=Dpkg::options::=" - "--force-unsafe-io " - "--option=Dpkg::options::=" - "--force-confold " - "--assume-yes --quiet ", - shell=True, stdin=None, - stdout=f, stderr=f, - executable="/bin/bash") + proc = subprocess.Popen( + "DEBIAN_FRONTEND=noninteractive " + "apt-get dist-upgrade " + "--option=Dpkg::options::=--force-confdef " + "--option=Dpkg::options::=--force-unsafe-io " + "--option=Dpkg::options::=--force-confold " + "--assume-yes --quiet ", + shell=True, stdin=None, + stdout=f, stderr=f, + executable="/bin/bash") proc.wait() if proc.returncode == 0: @@ -228,16 +226,18 @@ class WOAptGet(): WORepo.add(self, repo_url=repo_url) if repo_key is not None: WORepo.add_key(self, repo_key) - proc = subprocess.Popen("apt-get update && " - "DEBIAN_FRONTEND=noninteractive " - "apt-get install -o " - "Dpkg::Options::=\"--force-confdef\"" - " -o " - "Dpkg::Options::=\"--force-confold\"" - " -y --download-only {0}" - .format(packages), shell=True, - stdin=None, stdout=f, stderr=f, - executable="/bin/bash") + proc = subprocess.Popen( + "DEBIAN_FRONTEND=noninteractive apt-get update " + "--allow-releaseinfo-change && " + "DEBIAN_FRONTEND=noninteractive " + "apt-get install -o " + "Dpkg::Options::=\"--force-confdef\"" + " -o " + "Dpkg::Options::=\"--force-confold\"" + " -y --download-only {0}" + .format(packages), shell=True, + stdin=None, stdout=f, stderr=f, + executable="/bin/bash") proc.wait() if proc.returncode == 0: From cbe5dbd9e7f0bdc7c64ea6d340f9d0855f660cc7 Mon Sep 17 00:00:00 2001 From: VirtuBox Date: Tue, 8 Oct 2019 17:29:01 +0200 Subject: [PATCH 13/44] update setup.cfg --- setup.cfg | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/setup.cfg b/setup.cfg index 0e6f9dd..4ee5196 100644 --- a/setup.cfg +++ b/setup.cfg @@ -9,4 +9,7 @@ cover-inclusive=1 cover-erase=1 cover-html=1 cover-html-dir=coverage_report/ -where=tests/ \ No newline at end of file +where=tests/ + +[metadata] +license-file = LICENSE \ No newline at end of file From e98beb68d0c42f42ea24dc4b85ccaecbf16042e7 Mon Sep 17 00:00:00 2001 From: VirtuBox Date: Tue, 8 Oct 2019 17:30:37 +0200 Subject: [PATCH 14/44] update travis --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index dd5268a..3c37fe2 100644 --- a/.travis.yml +++ b/.travis.yml @@ -37,7 +37,7 @@ script: - lsb_release -a - sudo bash -c 'echo -e "[user]\n\tname = abc\n\temail = root@localhost.com" > /home/travis/.gitconfig' - sudo echo "Travis Banch = $TRAVIS_BRANCH" - - sudo python3 setup.py sdist bdist_wheel + - sudo python3 setup.py sdist bdist_wheel >> /var/log/wo/install.log 2>&1 - sudo time bash install --travis -b "$TRAVIS_BRANCH" - sudo time bash tests/travis.sh - sudo wo update --travis \ No newline at end of file From cc2621e6ff63615173e29703b2d613f570365ff5 Mon Sep 17 00:00:00 2001 From: VirtuBox Date: Tue, 8 Oct 2019 17:36:24 +0200 Subject: [PATCH 15/44] Change description --- setup.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/setup.py b/setup.py index a0f765e..8d009d8 100644 --- a/setup.py +++ b/setup.py @@ -10,9 +10,6 @@ with open("README.md", "r") as fh: conf = [] templates = [] -short_description = """An essential toolset that eases WordPress - site and server administration""" - for name in glob.glob('config/plugins.d/*.conf'): conf.insert(1, name) @@ -27,7 +24,7 @@ if not os.path.exists('/var/lib/wo/tmp/'): setup(name='wordops', version='3.9.9.3', - description=short_description, + description='WordPress & server administration toolset', long_description=long_description, long_description_content_type="text/markdown", classifiers=[ From d691f3a319c0abd82e2818430638335c7607032b Mon Sep 17 00:00:00 2001 From: VirtuBox Date: Tue, 8 Oct 2019 17:39:00 +0200 Subject: [PATCH 16/44] Fix setup.py --- setup.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/setup.py b/setup.py index 8d009d8..ce63717 100644 --- a/setup.py +++ b/setup.py @@ -16,11 +16,12 @@ for name in glob.glob('config/plugins.d/*.conf'): for name in glob.glob('wo/cli/templates/*.mustache'): templates.insert(1, name) -if not os.path.exists('/var/log/wo/'): - os.makedirs('/var/log/wo/') +if os.geteuid() == 0: + if not os.path.exists('/var/log/wo/'): + os.makedirs('/var/log/wo/') -if not os.path.exists('/var/lib/wo/tmp/'): - os.makedirs('/var/lib/wo/tmp/') + if not os.path.exists('/var/lib/wo/tmp/'): + os.makedirs('/var/lib/wo/tmp/') setup(name='wordops', version='3.9.9.3', From 4b13ed8537e8b0fee2f840c7e6b32c8590776a56 Mon Sep 17 00:00:00 2001 From: VirtuBox Date: Tue, 8 Oct 2019 17:39:37 +0200 Subject: [PATCH 17/44] Fix travis --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 3c37fe2..d01b7b6 100644 --- a/.travis.yml +++ b/.travis.yml @@ -37,7 +37,7 @@ script: - lsb_release -a - sudo bash -c 'echo -e "[user]\n\tname = abc\n\temail = root@localhost.com" > /home/travis/.gitconfig' - sudo echo "Travis Banch = $TRAVIS_BRANCH" - - sudo python3 setup.py sdist bdist_wheel >> /var/log/wo/install.log 2>&1 + - sudo python3 setup.py sdist bdist_wheel >> install.log - sudo time bash install --travis -b "$TRAVIS_BRANCH" - sudo time bash tests/travis.sh - sudo wo update --travis \ No newline at end of file From 888009aaa7904ad9f735922302623f5e99a108a4 Mon Sep 17 00:00:00 2001 From: VirtuBox Date: Tue, 8 Oct 2019 17:47:06 +0200 Subject: [PATCH 18/44] add tests to travis --- tests/travis.sh | 42 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) diff --git a/tests/travis.sh b/tests/travis.sh index be1e8a3..3e53210 100644 --- a/tests/travis.sh +++ b/tests/travis.sh @@ -65,7 +65,7 @@ done echo -e "${CGREEN}#############################################${CEND}" echo -e ' wo site update --php73 ' echo -e "${CGREEN}#############################################${CEND}" -other_site_types='html mysql wp wpfc wpsc wpredis wpce wprocket wpsubdomain wpsubdir' +other_site_types='html mysql wp wpfc wpsc wpredis wpce wprocket wpsubdomain wpsubdir ngxblocker' for site in $other_site_types; do echo -ne " Updating site to $site php73 [..]\r" if { @@ -180,6 +180,46 @@ for stack in $stack_clean; do fi done +echo -e "${CGREEN}#############################################${CEND}" +echo -e ' wo secure ' +echo -e "${CGREEN}#############################################${CEND}" +echo -ne " wo secure --auth [..]\r" +if { + wo secure --auth wordops mypassword +} >> /var/log/wo/test.log; then + echo -ne " wo secure --auth [${CGREEN}OK${CEND}]\\r" + echo -ne '\n' +else + echo -e " wo secure --auth [${CRED}FAIL${CEND}]" + echo -ne '\n' + exit_script + +fi +echo -ne " wo secure --sshport [..]\r" +if { + wo secure --sshport 2022 +} >> /var/log/wo/test.log; then + echo -ne " wo secure --sshport [${CGREEN}OK${CEND}]\\r" + echo -ne '\n' +else + echo -e " wo secure --sshport [${CRED}FAIL${CEND}]" + echo -ne '\n' + exit_script + +fi +echo -ne " wo secure --ssh [..]\r" +if { + wo secure --ssh --force +} >> /var/log/wo/test.log; then + echo -ne " wo secure --ssh [${CGREEN}OK${CEND}]\\r" + echo -ne '\n' +else + echo -e " wo secure --ssh [${CRED}FAIL${CEND}]" + echo -ne '\n' + exit_script + +fi + echo -e "${CGREEN}#############################################${CEND}" echo -e ' various informations ' echo -e "${CGREEN}#############################################${CEND}" From a26fc2cb109816f2a3f7d2283520ac2975742b1a Mon Sep 17 00:00:00 2001 From: VirtuBox Date: Tue, 8 Oct 2019 17:48:34 +0200 Subject: [PATCH 19/44] update changelog --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7e09887..3d414d0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), ### v3.9.x - [Unreleased] +### v3.9.9.3 - 2019-10-08 + #### Changed - WordOps is now installed from PyPI using pip [WordOps](https://pypi.org/project/wordops/) From b877b1e8c7de4f266b26e40753dcf4db041954f5 Mon Sep 17 00:00:00 2001 From: VirtuBox Date: Tue, 8 Oct 2019 17:50:51 +0200 Subject: [PATCH 20/44] Add TLS 1.3 0-RTT nginx configuration --- wo/cli/templates/nginx-core.mustache | 1 + wo/cli/templates/tweaks.mustache | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/wo/cli/templates/nginx-core.mustache b/wo/cli/templates/nginx-core.mustache index 096a599..5de705c 100644 --- a/wo/cli/templates/nginx-core.mustache +++ b/wo/cli/templates/nginx-core.mustache @@ -55,6 +55,7 @@ http { ssl_session_cache shared:SSL:50m; ssl_session_tickets off; ssl_prefer_server_ciphers on; + ssl_early_data on; {{#tls13}}ssl_ciphers 'TLS13+AESGCM+AES256:TLS13+AESGCM+AES128:TLS13+CHACHA20:EECDH+AESGCM:EECDH+CHACHA20'; ssl_protocols TLSv1.2 TLSv1.3;{{/tls13}} ssl_ecdh_curve X25519:P-521:P-384:P-256; diff --git a/wo/cli/templates/tweaks.mustache b/wo/cli/templates/tweaks.mustache index 6f7f56f..ea2ee2b 100644 --- a/wo/cli/templates/tweaks.mustache +++ b/wo/cli/templates/tweaks.mustache @@ -27,3 +27,8 @@ open_file_cache_min_uses 2; open_file_cache_valid 120s; open_log_file_cache max=10000 inactive=30s min_uses=2; + + ssl_dyn_rec_size_hi 4229; + ssl_dyn_rec_size_lo 1369; + ssl_dyn_rec_threshold 40; + ssl_dyn_rec_timeout 1000; From abe59498259d2816cb7a1db08e6de361fd7b6175 Mon Sep 17 00:00:00 2001 From: VirtuBox Date: Tue, 8 Oct 2019 17:51:23 +0200 Subject: [PATCH 21/44] Update changelog --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3d414d0..d216244 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,10 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), ### v3.9.9.3 - 2019-10-08 +#### Added + +- Add Nginx TLS 1.3 0-RTT configuration + #### Changed - WordOps is now installed from PyPI using pip [WordOps](https://pypi.org/project/wordops/) From bcd2416c1603a488270beb3db712cd5d2a8d3e56 Mon Sep 17 00:00:00 2001 From: VirtuBox Date: Tue, 8 Oct 2019 17:52:29 +0200 Subject: [PATCH 22/44] Update changelog --- CHANGELOG.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d216244..d420606 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,12 +12,12 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), #### Added -- Add Nginx TLS 1.3 0-RTT configuration +- [STACK] Add Nginx TLS 1.3 0-RTT configuration #### Changed -- WordOps is now installed from PyPI using pip [WordOps](https://pypi.org/project/wordops/) -- New Nginx package built with OpenSSL_1.1.1d and the latest ngx_brotli module +- [CORE] WordOps is now installed from PyPI using pip [WordOps](https://pypi.org/project/wordops/) +- [STACK] New Nginx package built with OpenSSL_1.1.1d and the latest ngx_brotli module #### Fixed From e79041b31eabd7aa66940c886bbb3c437ac7f701 Mon Sep 17 00:00:00 2001 From: VirtuBox Date: Tue, 8 Oct 2019 18:56:46 +0200 Subject: [PATCH 23/44] Fix travis --- tests/travis.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/travis.sh b/tests/travis.sh index 3e53210..8b6b244 100644 --- a/tests/travis.sh +++ b/tests/travis.sh @@ -47,7 +47,7 @@ done echo -e "${CGREEN}#############################################${CEND}" echo -e ' Simple site create ' echo -e "${CGREEN}#############################################${CEND}" -site_types='html php php73 mysql wp wpfc wpsc wpredis wpce wprocket wpsubdomain wpsubdir' +site_types='html php php73 mysql wp wpfc wpsc wpredis wpce wprocket wpsubdomain wpsubdir ngxblocker' for site in $site_types; do echo -ne " Creating $site [..]\r" if { From 45607fb2d3904e8b1e7511f3c19d27d4b4b276ff Mon Sep 17 00:00:00 2001 From: VirtuBox Date: Tue, 8 Oct 2019 19:19:43 +0200 Subject: [PATCH 24/44] Fix install --- install | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/install b/install index 24df83f..6d4f371 100755 --- a/install +++ b/install @@ -120,9 +120,9 @@ _run() { ### if [ -z "$wo_travis" ]; then if command_exists curl; then - apt-get update -qq + apt-get update --allow-releaseinfo-change -qq else - apt-get update -qq && apt-get -y install curl -qq > /dev/null 2>&1 + apt-get update --allow-releaseinfo-change -qq && apt-get -y install curl -qq > /dev/null 2>&1 fi fi @@ -225,6 +225,7 @@ wo_apt_mirror() { python3 -m pip install apt-mirror-updater --upgrade }; then /usr/local/bin/apt-mirror-updater -a + apt-get update --allow-releaseinfo-change -qq fi } From fb20aa47b2188f4a5648c60271b6615747c53e14 Mon Sep 17 00:00:00 2001 From: VirtuBox Date: Tue, 8 Oct 2019 19:25:23 +0200 Subject: [PATCH 25/44] Fix install --- install | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/install b/install index 6d4f371..0283a6e 100755 --- a/install +++ b/install @@ -120,9 +120,9 @@ _run() { ### if [ -z "$wo_travis" ]; then if command_exists curl; then - apt-get update --allow-releaseinfo-change -qq + apt-get update -qq else - apt-get update --allow-releaseinfo-change -qq && apt-get -y install curl -qq > /dev/null 2>&1 + apt-get update -qq && apt-get -y install curl -qq > /dev/null 2>&1 fi fi @@ -225,7 +225,7 @@ wo_apt_mirror() { python3 -m pip install apt-mirror-updater --upgrade }; then /usr/local/bin/apt-mirror-updater -a - apt-get update --allow-releaseinfo-change -qq + apt-get update -qq fi } From a9a8b3348c8a5d251947d0acd06f1ebcbccd5ee7 Mon Sep 17 00:00:00 2001 From: VirtuBox Date: Wed, 9 Oct 2019 11:43:09 +0200 Subject: [PATCH 26/44] Fix install on xenial --- install | 10 +++++++--- wo/core/aptget.py | 3 +-- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/install b/install index 0283a6e..a0253e9 100755 --- a/install +++ b/install @@ -118,10 +118,14 @@ _run() { ### # 1- Update the apt sewers with fresh info ### + if [ -z "$wo_travis" ]; then - if command_exists curl; then - apt-get update -qq - else + if ! { + apt-get update --allow-releaseinfo-change -qq > /dev/null 2>&1 + }; then + apt-get update -qq > /dev/null 2>&1 + fi + if ! command_exists curl; then apt-get update -qq && apt-get -y install curl -qq > /dev/null 2>&1 fi fi diff --git a/wo/core/aptget.py b/wo/core/aptget.py index 4e6fa40..ee6271d 100644 --- a/wo/core/aptget.py +++ b/wo/core/aptget.py @@ -19,8 +19,7 @@ class WOAptGet(): try: with open('/var/log/wo/wordops.log', 'a') as f: proc = subprocess.Popen( - 'DEBIAN_FRONTEND=noninteractive apt-get update ' - '--allow-releaseinfo-change', + 'DEBIAN_FRONTEND=noninteractive apt-get update -qq', shell=True, stdin=None, stdout=f, stderr=subprocess.PIPE, executable="/bin/bash") proc.wait() From 8ac269b1970b2616ee8cb80cd85f73aae54410af Mon Sep 17 00:00:00 2001 From: VirtuBox Date: Wed, 9 Oct 2019 12:53:00 +0200 Subject: [PATCH 27/44] Fix install --- install | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/install b/install index a0253e9..63621c5 100755 --- a/install +++ b/install @@ -462,8 +462,8 @@ wo_git_config() { fi # .gitconfig inital setup - cd /var/lib/wo/tmp/WordOps-install || exit 1 - python3 gitconfig.py + #cd /var/lib/wo/tmp/WordOps-install || exit 1 + #python3 gitconfig.py } From 8d47374c2adecf245e1b3ff1ec5a20f38426bc96 Mon Sep 17 00:00:00 2001 From: VirtuBox Date: Wed, 9 Oct 2019 15:24:12 +0200 Subject: [PATCH 28/44] Update travis --- tests/travis.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/travis.sh b/tests/travis.sh index 8b6b244..0bf6a32 100644 --- a/tests/travis.sh +++ b/tests/travis.sh @@ -21,7 +21,7 @@ if [ -z "$1" ]; then fi exit_script() { - curl --progress-bar --upload-file /var/log/wo/wordops.log https://transfer.vtbox.net/"$(basename wordops.log)" && echo "" + curl --progress-bar --upload-file /var/log/wo/wordops.log https://transfer.vtbox.net/"$(basename wordops.txt)" && echo "" exit 1 } From ab6d44afd4b3d85d31cd31da300c5859584851e2 Mon Sep 17 00:00:00 2001 From: VirtuBox Date: Wed, 9 Oct 2019 17:35:23 +0200 Subject: [PATCH 29/44] Fix mariaDB key --- setup.py | 5 ++--- wo/cli/plugins/stack.py | 4 ++-- wo/cli/plugins/stack_pref.py | 4 ++-- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/setup.py b/setup.py index ce63717..c47ef64 100644 --- a/setup.py +++ b/setup.py @@ -5,7 +5,7 @@ import os from setuptools import find_packages, setup with open("README.md", "r") as fh: - long_description = fh.read() + LONG = fh.read() conf = [] templates = [] @@ -26,8 +26,7 @@ if os.geteuid() == 0: setup(name='wordops', version='3.9.9.3', description='WordPress & server administration toolset', - long_description=long_description, - long_description_content_type="text/markdown", + long_description=LONG, classifiers=[ "Programming Language :: Python :: 3", "License :: OSI Approved :: MIT License", diff --git a/wo/cli/plugins/stack.py b/wo/cli/plugins/stack.py index ab75744..e66c8b4 100644 --- a/wo/cli/plugins/stack.py +++ b/wo/cli/plugins/stack.py @@ -168,14 +168,14 @@ class WOStackController(CementBaseController): if WOAptGet.is_installed(self, 'nginx-plus'): Log.info(self, "NGINX PLUS Detected ...") apt = ["nginx-plus"] + WOVar.wo_nginx - self.post_pref(apt, empty_packages) + post_pref(self, apt, empty_packages) elif WOAptGet.is_installed(self, 'nginx'): Log.info(self, "WordOps detected an already " "installed nginx package." "It may or may not have " "required modules.\n") apt = ["nginx"] + WOVar.wo_nginx - self.post_pref(apt, empty_packages) + post_pref(self, apt, empty_packages) else: Log.debug(self, "Nginx already installed") diff --git a/wo/cli/plugins/stack_pref.py b/wo/cli/plugins/stack_pref.py index 2bcce47..b1068d4 100644 --- a/wo/cli/plugins/stack_pref.py +++ b/wo/cli/plugins/stack_pref.py @@ -41,9 +41,9 @@ def pre_pref(self, apt_packages): mysql_pref_file.write(mysql_pref) WORepo.add(self, repo_url=WOVar.wo_mysql_repo) WORepo.add_key(self, '0xcbcb082a1bb943db', - keyserver='keys.gnupg.net') + keyserver='keyserver.ubuntu.com') WORepo.add_key(self, '0xF1656F24C74CD1D8', - keyserver='keys.gnupg.net') + keyserver='keyserver.ubuntu.com') if "mariadb-server" in apt_packages: # generate random 24 characters root password chars = ''.join(random.sample(string.ascii_letters, 24)) From cf4f9c17b1cfd107bcd7c3056bad74c632c08c53 Mon Sep 17 00:00:00 2001 From: VirtuBox Date: Wed, 9 Oct 2019 17:38:00 +0200 Subject: [PATCH 30/44] Switch MariaDB APT mirrors to OVH --- wo/core/variables.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/wo/core/variables.py b/wo/core/variables.py index 5e452b7..a2d4a2e 100644 --- a/wo/core/variables.py +++ b/wo/core/variables.py @@ -165,7 +165,7 @@ class WOVar(): wo_redis_repo = ("ppa:chris-lea/redis-server") wo_goaccess_repo = ("ppa:alex-p/goaccess") wo_mysql_repo = ("deb [arch=amd64,ppc64el] " - "http://sfo1.mirrors.digitalocean.com/mariadb/repo/" + "http://mariadb.mirrors.ovh.net/MariaDB/repo/" "10.3/ubuntu {codename} main" .format(codename=wo_platform_codename)) @@ -177,7 +177,7 @@ class WOVar(): wo_redis_repo = ("deb https://packages.sury.org/php/ {codename} all" .format(codename=wo_platform_codename)) wo_mysql_repo = ("deb [arch=amd64,ppc64el] " - "http://sfo1.mirrors.digitalocean.com/mariadb/repo/" + "http://mariadb.mirrors.ovh.net/MariaDB/repo/" "10.3/debian {codename} main" .format(codename=wo_platform_codename)) From 1482cdbc106e3445dd4743523df82259cf6ff5b8 Mon Sep 17 00:00:00 2001 From: VirtuBox Date: Wed, 9 Oct 2019 17:39:55 +0200 Subject: [PATCH 31/44] Update issue script --- tests/issue.sh | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/tests/issue.sh b/tests/issue.sh index 61bf57e..72f0556 100644 --- a/tests/issue.sh +++ b/tests/issue.sh @@ -14,13 +14,9 @@ if [ -f /var/log/wo/wordops.log ]; then cd /var/log/wo/ || exit 1 - if { - tar -I pigz -cf wordops.tar.gz wordops.log - }; then - wo_link=$(curl -sL --upload-file wordops.tar.gz https://transfer.sh/wordops.tar.gz) - echo - echo "Here the link to provide in your github issue : $wo_link" - echo - fi + wo_link=$(curl -sL --upload-file wordops.log https://transfer.vtbox.net/wordops.txt) + echo + echo "Here the link to provide in your github issue : $wo_link" + echo cd || exit 1 fi From 499caa929c5b563a484df76bb54af940d583707e Mon Sep 17 00:00:00 2001 From: VirtuBox Date: Wed, 9 Oct 2019 18:50:43 +0200 Subject: [PATCH 32/44] Fix install --- install | 25 +++++-------------------- 1 file changed, 5 insertions(+), 20 deletions(-) diff --git a/install b/install index 63621c5..d76de0b 100755 --- a/install +++ b/install @@ -219,33 +219,18 @@ wo_dist_upgrade() { apt-get dist-upgrade --option=Dpkg::options::=--force-confmiss --option=Dpkg::options::=--force-confold --option=Dpkg::options::=--force-unsafe-io --assume-yes --quiet } -# install apt-mirror-updater and find the fastest mirror available -wo_apt_mirror() { - - apt-get -option=Dpkg::options::=--force-confmiss --option=Dpkg::options::=--force-confold --assume-yes install \ - python3-pip python3-wheel python3-apt python3-setuptools > /dev/null 2>&1 - python3 -m pip install pip --upgrade - if { - python3 -m pip install apt-mirror-updater --upgrade - }; then - /usr/local/bin/apt-mirror-updater -a - apt-get update -qq - fi - -} - wo_install_dep() { if [ "$wo_linux_distro" == "Ubuntu" ]; then # install dependencies apt-get -option=Dpkg::options::=--force-confmiss --option=Dpkg::options::=--force-confold --assume-yes install \ - build-essential curl gzip python3-dev sqlite3 git tar software-properties-common pigz \ + build-essential curl gzip python3-pip python3-wheel python3-apt python3-setuptools python3-dev sqlite3 git tar software-properties-common pigz \ gnupg2 cron ccze rsync apt-transport-https tree haveged ufw unattended-upgrades tzdata ntp > /dev/null 2>&1 add-apt-repository ppa:wordops/nginx-wo -yn else # install dependencies apt-get -option=Dpkg::options::=--force-confmiss --option=Dpkg::options::=--force-confold --assume-yes install \ - build-essential curl gzip dirmngr sudo python3-dev ca-certificates sqlite3 git tar \ + build-essential curl gzip dirmngr sudo python3-pip python3-wheel python3-apt python3-setuptools python3-dev ca-certificates sqlite3 git tar \ software-properties-common pigz apt-transport-https gnupg2 cron ccze rsync tree haveged ufw unattended-upgrades tzdata ntp > /dev/null 2>&1 # add php repository gpg key [ -d /etc/apt/trusted.gpg.d ] && { wget -qO /etc/apt/trusted.gpg.d/php.gpg https://packages.sury.org/php/apt.gpg; } @@ -470,7 +455,8 @@ wo_git_config() { # WordOps install wo_install() { - python3 -m pip install wordops --upgrade + python3 -m pip install --upgrade pip + python3 -m pip install --upgrade wordops cp -rf /usr/local/lib/python3.*/dist-packages/etc/* /etc/ cp -rf /usr/local/lib/python3.*/dist-packages/usr/* /usr/ @@ -479,7 +465,7 @@ wo_install() { # WordOps install wo_travis_install() { - python3 -m pip install dist/*.whl --upgrade + python3 -m pip install --upgrade dist/*.whl cp -rf /usr/local/lib/python3.*/dist-packages/etc/* /etc/ cp -rf /usr/local/lib/python3.*/dist-packages/usr/* /usr/ @@ -789,7 +775,6 @@ else _run wo_remove_ee_cron "Removing EasyEngine cronjob" _run wo_sync_db "Syncing WO database" fi - _run wo_apt_mirror "Finding the fastest APT mirror" _run wo_install_dep "Installing wo dependencies" _run wo_timesync #if [ "$ufw" = "y" ]; then From fe46cd696b74c9366b33a2e9d2b5d94e0e8f1d8b Mon Sep 17 00:00:00 2001 From: VirtuBox Date: Thu, 10 Oct 2019 12:57:31 +0200 Subject: [PATCH 33/44] fix install --- install | 1 + 1 file changed, 1 insertion(+) diff --git a/install b/install index d76de0b..f5313c0 100755 --- a/install +++ b/install @@ -465,6 +465,7 @@ wo_install() { # WordOps install wo_travis_install() { + python3 -m pip install --upgrade pip python3 -m pip install --upgrade dist/*.whl cp -rf /usr/local/lib/python3.*/dist-packages/etc/* /etc/ cp -rf /usr/local/lib/python3.*/dist-packages/usr/* /usr/ From e32a2a1102c1e08a485a5ece220dafff27c0816f Mon Sep 17 00:00:00 2001 From: VirtuBox Date: Fri, 11 Oct 2019 12:19:32 +0200 Subject: [PATCH 34/44] Fix travis --- .travis.yml | 4 ++-- CHANGELOG.md | 1 - install | 42 +++++++++++++++++++++++++++++------------- setup.py | 2 +- 4 files changed, 32 insertions(+), 17 deletions(-) diff --git a/.travis.yml b/.travis.yml index d01b7b6..265c8da 100644 --- a/.travis.yml +++ b/.travis.yml @@ -22,8 +22,9 @@ before_script: - sudo rm -rf /etc/mysql - sudo bash -c 'echo example.com > /etc/hostname' - unset LANG + - sudo apt-get update --allow-releaseinfo-change -qq - sudo apt-get -qq purge mysql* graphviz* redis* - - sudo apt-get install -qq git python3-setuptools python3-dev python3-apt ccze tree python3-wheel python3-pip + - sudo apt-get install -qq git python3-setuptools python3-dev python3-apt ccze tree - sudo apt-get -qq autoremove --purge @@ -37,7 +38,6 @@ script: - lsb_release -a - sudo bash -c 'echo -e "[user]\n\tname = abc\n\temail = root@localhost.com" > /home/travis/.gitconfig' - sudo echo "Travis Banch = $TRAVIS_BRANCH" - - sudo python3 setup.py sdist bdist_wheel >> install.log - sudo time bash install --travis -b "$TRAVIS_BRANCH" - sudo time bash tests/travis.sh - sudo wo update --travis \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index d420606..da616ff 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,7 +16,6 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), #### Changed -- [CORE] WordOps is now installed from PyPI using pip [WordOps](https://pypi.org/project/wordops/) - [STACK] New Nginx package built with OpenSSL_1.1.1d and the latest ngx_brotli module #### Fixed diff --git a/install b/install index f5313c0..e22df35 100755 --- a/install +++ b/install @@ -452,23 +452,38 @@ wo_git_config() { } -# WordOps install -wo_install() { - - python3 -m pip install --upgrade pip - python3 -m pip install --upgrade wordops - cp -rf /usr/local/lib/python3.*/dist-packages/etc/* /etc/ - cp -rf /usr/local/lib/python3.*/dist-packages/usr/* /usr/ - +# Download WordOps +wo_download() { + rm -f /etc/bash_completion.d/wo_auto.rc + rm -rf /var/lib/wo/tmp/WordOps-* + if [ -z "$wo_version" ]; then + curl -sL https://github.com/WordOps/WordOps/archive/${wo_branch}.tar.gz | tar -I pigz -xf - -C /var/lib/wo/tmp + mv "/var/lib/wo/tmp/WordOps-$wo_branch" /var/lib/wo/tmp/WordOps-install + else + curl -sL https://github.com/WordOps/WordOps/archive/v${wo_version}.tar.gz | tar -I pigz -xf - -C /var/lib/wo/tmp + mv "/var/lib/wo/tmp/WordOps-$wo_version" /var/lib/wo/tmp/WordOps-install + fi } # WordOps install -wo_travis_install() { +wo_install() { - python3 -m pip install --upgrade pip - python3 -m pip install --upgrade dist/*.whl - cp -rf /usr/local/lib/python3.*/dist-packages/etc/* /etc/ - cp -rf /usr/local/lib/python3.*/dist-packages/usr/* /usr/ + cd /var/lib/wo/tmp/WordOps-install || exit 1 + python3 setup.py install + +} + +# Clone Github repository if it doesn't exist +wo_install_travis() { + + if [ "$wo_force_install" = "y" ]; then + [ ! -f "$HOME/.gitconfig" ] && { bash -c 'echo -e "[user]\n\tname = $USER\n\temail = root@$HOSTNAME.local" > $HOME/.gitconfig'; } + fi + + if [ -f "$HOME/.gitconfig" ]; then + # install and redirect log to not print python package install + python3 setup.py install + fi } @@ -784,6 +799,7 @@ else # skip steps if travis if [ -z "$wo_travis" ]; then _run wo_dist_upgrade + _run wo_download "Downloading WordOps" wo_git_config _run wo_install "Installing WordOps" else diff --git a/setup.py b/setup.py index c47ef64..269b8a9 100644 --- a/setup.py +++ b/setup.py @@ -4,7 +4,7 @@ import os from setuptools import find_packages, setup -with open("README.md", "r") as fh: +with open("README.md", "r", encoding="utf-8") as fh: LONG = fh.read() conf = [] From e42eb52bba3a5f5c716ccb9d843688c4cda1b6bf Mon Sep 17 00:00:00 2001 From: VirtuBox Date: Fri, 11 Oct 2019 12:39:00 +0200 Subject: [PATCH 35/44] Improve apt-get update process --- install | 4 ++-- wo/core/aptget.py | 44 ++++++++++++++++++++++++++------------------ 2 files changed, 28 insertions(+), 20 deletions(-) diff --git a/install b/install index e22df35..501e955 100755 --- a/install +++ b/install @@ -447,8 +447,8 @@ wo_git_config() { fi # .gitconfig inital setup - #cd /var/lib/wo/tmp/WordOps-install || exit 1 - #python3 gitconfig.py + cd /var/lib/wo/tmp/WordOps-install || exit 1 + python3 gitconfig.py } diff --git a/wo/core/aptget.py b/wo/core/aptget.py index ee6271d..f7281c4 100644 --- a/wo/core/aptget.py +++ b/wo/core/aptget.py @@ -19,12 +19,21 @@ class WOAptGet(): try: with open('/var/log/wo/wordops.log', 'a') as f: proc = subprocess.Popen( - 'DEBIAN_FRONTEND=noninteractive apt-get update -qq', + 'DEBIAN_FRONTEND=noninteractive apt-get update -qq ' + '--allow-releaseinfo-change', shell=True, stdin=None, stdout=f, stderr=subprocess.PIPE, executable="/bin/bash") proc.wait() output, error_output = proc.communicate() + if "--allow-releaseinfo-change" in str(error_output): + proc = subprocess.Popen( + 'DEBIAN_FRONTEND=noninteractive apt-get update -qq', + shell=True, + stdin=None, stdout=f, stderr=f, + executable="/bin/bash") + proc.wait() + output, error_output = proc.communicate() # Check what is error in error_output if "NO_PUBKEY" in str(error_output): # Split the output @@ -38,10 +47,11 @@ class WOAptGet(): WORepo.add_key( self, key, keyserver="hkp://pgp.mit.edu") - proc = subprocess.Popen('apt-get update', - shell=True, - stdin=None, stdout=f, stderr=f, - executable="/bin/bash") + proc = subprocess.Popen( + 'DEBIAN_FRONTEND=noninteractive apt-get update -qq', + shell=True, + stdin=None, stdout=f, stderr=f, + executable="/bin/bash") proc.wait() if proc.returncode == 0: @@ -84,11 +94,11 @@ class WOAptGet(): with open('/var/log/wo/wordops.log', 'a') as f: proc = subprocess.Popen( "DEBIAN_FRONTEND=noninteractive " - "apt-get dist-upgrade " + "apt-get " "--option=Dpkg::options::=--force-confdef " "--option=Dpkg::options::=--force-unsafe-io " "--option=Dpkg::options::=--force-confold " - "--assume-yes --quiet ", + "--assume-yes --quiet dist-upgrade", shell=True, stdin=None, stdout=f, stderr=f, executable="/bin/bash") @@ -111,17 +121,15 @@ class WOAptGet(): all_packages = ' '.join(packages) try: with open('/var/log/wo/wordops.log', 'a') as f: - proc = subprocess.Popen("DEBIAN_FRONTEND=noninteractive " - "apt-get install " - "--option=Dpkg::options::=" - "--force-confdef " - "--option=Dpkg::options::=" - "--force-confold " - "--assume-yes " - "--allow-unauthenticated {0}" - .format(all_packages), shell=True, - stdin=None, stdout=f, stderr=f, - executable="/bin/bash") + proc = subprocess.Popen( + "DEBIAN_FRONTEND=noninteractive " + "apt-get install " + "--option=Dpkg::options::=--force-confdef " + "--option=Dpkg::options::=--force-confold " + "--assume-yes --allow-unauthenticated {0}" + .format(all_packages), shell=True, + stdin=None, stdout=f, stderr=f, + executable="/bin/bash") proc.wait() if proc.returncode == 0: From 5d0f9f62bf550f6445ef5262b43dcd33e3ac4bfa Mon Sep 17 00:00:00 2001 From: VirtuBox Date: Fri, 11 Oct 2019 12:52:15 +0200 Subject: [PATCH 36/44] Print install log --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 265c8da..7d62b60 100644 --- a/.travis.yml +++ b/.travis.yml @@ -29,7 +29,7 @@ before_script: after_script: - - sudo cat /var/log/wo/test.log | ccze -A -p syslog + - sudo cat /var/log/wo/install.log | ccze -A -p syslog - sudo bash install --purge - sudo curl --progress-bar --upload-file /var/log/wo/wordops.log https://transfer.vtbox.net/"$(basename wordops.log)" && echo "" | sudo tee -a $HOME/.transfer.log && echo "" From 947efe1e21b4bd2d08632a2dc4fe65e2e4e080a1 Mon Sep 17 00:00:00 2001 From: VirtuBox Date: Fri, 11 Oct 2019 13:01:00 +0200 Subject: [PATCH 37/44] More improvement in aptget.py --- .travis.yml | 2 -- install | 75 ++--------------------------------------------- wo/core/aptget.py | 28 +++++++++--------- 3 files changed, 16 insertions(+), 89 deletions(-) diff --git a/.travis.yml b/.travis.yml index 7d62b60..7880919 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,7 +4,6 @@ dist: bionic language: bash notifications: - slack: wordops:MyZBNbI7JfhbAi3YyFckMdaa webhooks: secure: "JiGtzYplTyFg/L6Rsi7ptEQIV29O5qCWU2Zf5pLITsQrBrQO4cIXXp9G4Z+cenXjfIiqbqIgU0US3zXeIAl4g14xdfzmMYeMMwuKBpI8afMYv8MD6ldoP0MTFHQfROE6OXxKLVUvZn1R0oLLU1fzVSI0qGjNkt20cf/Lrt/reH/zS5hAI92kWI3u2zPu7Zn/g/a8MO/Y3Iv7v1PSQaVkVJVqtOK3U2GJqhIv2G1AVcaPb7Nh/V2zm2dDYBVT0UotBnlBUcUXbEMP77D9pjtWXd1/0rWuJIHixMjwUybpZqY75UMee5INynU6OZRsv029LRHAIMkWhfBkdVN/U5jhQJzui14+vRQrb5nfUMG8Cd8INojDlu6dk/ps2GzTCCXBITeMQKAouUoHD2LEbsNp17xi1K4ZlKb3+0lrOAiS4JYFE6wOo4yMlLTYoquYSqk7AuxuUS8A5OD5MYxhk9uafiTSxKFOo39KYWTSaACsPD8q1swaTSjoYm9skyZvIkIFq5bHBCYEGFe6X/NY9l5tz3hSe+TJOerCHsg+dXVuQl+pIp5nw2as9TH9ox5Vgqc9Zh4GbTDQVvdAmUpmlsZ/SKoOMCkmkB1aRNFq/7RnERIJyAEGJbauHWmjtOM4cCxesl0L0b2Eab89zQpSn7pzE8JTiJgpzCUc22p653PTaqM=" @@ -31,7 +30,6 @@ before_script: after_script: - sudo cat /var/log/wo/install.log | ccze -A -p syslog - sudo bash install --purge - - sudo curl --progress-bar --upload-file /var/log/wo/wordops.log https://transfer.vtbox.net/"$(basename wordops.log)" && echo "" | sudo tee -a $HOME/.transfer.log && echo "" script: diff --git a/install b/install index 501e955..6128193 100755 --- a/install +++ b/install @@ -9,7 +9,7 @@ # ------------------------------------------------------------------------- # wget -qO wo wops.cc && sudo bash wo # ------------------------------------------------------------------------- -# Version 3.9.9.3 - 2019-10-08 +# Version 3.9.9.3 - 2019-10-11 # ------------------------------------------------------------------------- # CONTENTS @@ -126,7 +126,7 @@ if [ -z "$wo_travis" ]; then apt-get update -qq > /dev/null 2>&1 fi if ! command_exists curl; then - apt-get update -qq && apt-get -y install curl -qq > /dev/null 2>&1 + apt-get -y install curl -qq > /dev/null 2>&1 fi fi @@ -171,13 +171,8 @@ WO_ARCH="$(uname -m)" if [ -x /usr/local/bin/ee ]; then ee_migration=1 - ufw="n" elif [ -x /usr/local/bin/wo ]; then wo_upgrade=1 - ufw="n" -fi -if [ -z "$ufw" ]; then - ufw="y" fi ### # 1 - Checking linux distro @@ -689,66 +684,6 @@ wo_uninstall() { rm -rf /usr/local/lib/python3.*/dist-packages/{pystache-*,cement-2.*,wo-*} /usr/local/bin/wo /etc/bash_completion.d/wo_auto.rc /var/lib/wo /etc/wo /usr/lib/wo/templates } -wo_ufw_setup() { - if ! grep -q "ENABLED=yes" /etc/ufw/ufw.conf; then - # get custom ssh port - if [ -f /etc/ssh/sshd_config ]; then - CURRENT_SSH_PORT=$(grep "Port" /etc/ssh/sshd_config | awk -F " " '{print $2}') - fi - # define firewall rules - if ! grep -q "LOGLEVEL=low" /etc/ufw/ufw.conf; then - ufw logging low - fi - if ! grep -q 'DEFAULT_OUTPUT_POLICY="ACCEPT"' /etc/default/ufw; then - ufw default allow outgoing - fi - if ! grep -q 'DEFAULT_INPUT_POLICY="DROP"' /etc/default/ufw; then - ufw default deny incoming - fi - if ! grep -q "\-\-dport 22 -j" /etc/ufw/user.rules; then - # default ssh port - ufw limit 22 - fi - - # custom ssh port - if [ "$CURRENT_SSH_PORT" != "22" ]; then - if ! grep -q "\-\-dport $CURRENT_SSH_PORT -j" /etc/ufw/user.rules; then - ufw limit "$CURRENT_SSH_PORT" - fi - fi - - # nginx - if ! grep -q "\-\-dport 80 -j" /etc/ufw/user.rules; then - # http - ufw allow http - fi - if ! grep -q "\-\-dport 443 -j" /etc/ufw/user.rules; then - # https - ufw allow https - fi - - # ntp - if ! grep -q "\-\-dport 123 -j" /etc/ufw/user.rules; then - ufw allow 123 - fi - - if ! grep -q "\-\-dport 22222 -j" /etc/ufw/user.rules; then - # wordops backend - ufw limit 22222 - fi - # enable ufw - if [ -n "$CURRENT_SSH_PORT" ]; then - ufw --force enable - fi - - # remove ufw from syslog - if [ -f /etc/rsyslog.d/20-ufw.conf ]; then - sed -i 's/\#\& stop/\& stop/' /etc/rsyslog.d/20-ufw.conf - service rsyslog restart - fi - fi -} - wo_cheat_install() { curl -sL https://cht.sh/:cht.sh > /usr/local/bin/cht.sh chmod +x /usr/local/bin/cht.sh @@ -793,9 +728,6 @@ else fi _run wo_install_dep "Installing wo dependencies" _run wo_timesync - #if [ "$ufw" = "y" ]; then - # _run wo_ufw_setup "Configuring UFW" - #fi # skip steps if travis if [ -z "$wo_travis" ]; then _run wo_dist_upgrade @@ -860,6 +792,3 @@ else wo_lib_echo "Give WordOps a GitHub star : https://github.com/WordOps/WordOps/" echo fi -# if [ -z "$wo_travis" ]; then -# /bin/bash --init-file "/var/lib/wo/tmp/WordOps-$wo_branch/tests/init-file" -# fi diff --git a/wo/core/aptget.py b/wo/core/aptget.py index f7281c4..2fe2be9 100644 --- a/wo/core/aptget.py +++ b/wo/core/aptget.py @@ -154,19 +154,19 @@ class WOAptGet(): try: with open('/var/log/wo/wordops.log', 'a') as f: if purge: - proc = subprocess.Popen('DEBIAN_FRONTEND=noninteractive ' - 'apt-get autoremove --purge ' - '-qq {0}' - .format(all_packages), shell=True, - stdin=None, stdout=f, stderr=f, - executable="/bin/bash") + proc = subprocess.Popen( + 'DEBIAN_FRONTEND=noninteractive ' + 'apt-get autoremove --purge -qq {0}' + .format(all_packages), shell=True, + stdin=None, stdout=f, stderr=f, + executable="/bin/bash") else: - proc = subprocess.Popen('DEBIAN_FRONTEND=noninteractive ' - 'apt-get autoremove ' - '-qq {0}' - .format(all_packages), shell=True, - stdin=None, stdout=f, stderr=f, - executable="/bin/bash") + proc = subprocess.Popen( + 'DEBIAN_FRONTEND=noninteractive ' + 'apt-get autoremove -qq {0}' + .format(all_packages), shell=True, + stdin=None, stdout=f, stderr=f, + executable="/bin/bash") proc.wait() if proc.returncode == 0: return True @@ -235,13 +235,13 @@ class WOAptGet(): WORepo.add_key(self, repo_key) proc = subprocess.Popen( "DEBIAN_FRONTEND=noninteractive apt-get update " - "--allow-releaseinfo-change && " + "-qq && " "DEBIAN_FRONTEND=noninteractive " "apt-get install -o " "Dpkg::Options::=\"--force-confdef\"" " -o " "Dpkg::Options::=\"--force-confold\"" - " -y --download-only {0}" + " -y --download-only {0}" .format(packages), shell=True, stdin=None, stdout=f, stderr=f, executable="/bin/bash") From 8c8a092510256a387a5a3a8b966c10237a4d325c Mon Sep 17 00:00:00 2001 From: VirtuBox Date: Fri, 11 Oct 2019 13:02:02 +0200 Subject: [PATCH 38/44] Fix wrong travis install function name --- install | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install b/install index 6128193..0363f1a 100755 --- a/install +++ b/install @@ -469,7 +469,7 @@ wo_install() { } # Clone Github repository if it doesn't exist -wo_install_travis() { +wo_travis_install() { if [ "$wo_force_install" = "y" ]; then [ ! -f "$HOME/.gitconfig" ] && { bash -c 'echo -e "[user]\n\tname = $USER\n\temail = root@$HOSTNAME.local" > $HOME/.gitconfig'; } From 3c0498c4add74d6658ff13aa647eff2ce73f1758 Mon Sep 17 00:00:00 2001 From: VirtuBox Date: Sat, 12 Oct 2019 11:07:25 +0200 Subject: [PATCH 39/44] Fix subdomains detection for acme --- wo/core/domainvalidate.py | 11 ++++++----- wo/core/shellexec.py | 8 ++++---- wo/core/template.py | 2 +- wo/core/variables.py | 21 ++++++++++----------- 4 files changed, 21 insertions(+), 21 deletions(-) diff --git a/wo/core/domainvalidate.py b/wo/core/domainvalidate.py index 50ab1dc..80afb0f 100644 --- a/wo/core/domainvalidate.py +++ b/wo/core/domainvalidate.py @@ -37,16 +37,17 @@ class WODomain(): if os.path.isfile("/var/lib/wo/public_suffix_list.dat"): # Read mode opens a file for reading only. suffix_file = open( - "/var/lib/wo/public_suffix_list.dat", encoding='utf-8', ) + "/var/lib/wo/public_suffix_list.dat", encoding='utf-8') # Read all the lines into a list. for domain_suffix in suffix_file: if (str(domain_suffix).strip()) == ('.'.join(domain_name[1:])): domain_type = 'domain' - root_domain = ('.'.join(domain_name[0:])) break else: domain_type = 'subdomain' - root_domain = ('.'.join(domain_name[1:])) suffix_file.close() - return (domain_type, root_domain) - return ('other', domain) + if domain_type == 'domain': + root_domain = ('.'.join(domain_name[0:])) + else: + root_domain = ('.'.join(domain_name[1:])) + return (domain_type, root_domain) diff --git a/wo/core/shellexec.py b/wo/core/shellexec.py index 979affb..61b12ea 100644 --- a/wo/core/shellexec.py +++ b/wo/core/shellexec.py @@ -23,9 +23,9 @@ class WOShellExec(): stderr=subprocess.PIPE, shell=True) as proc: (cmd_stdout_bytes, cmd_stderr_bytes) = proc.communicate() (cmd_stdout, cmd_stderr) = (cmd_stdout_bytes.decode('utf-8', - "replace"), + "replace"), cmd_stderr_bytes.decode('utf-8', - "replace")) + "replace")) if proc.returncode == 0: Log.debug(self, "Command Output: {0}, \nCommand Error: {1}" @@ -60,9 +60,9 @@ class WOShellExec(): stderr=subprocess.PIPE, shell=True) as proc: (cmd_stdout_bytes, cmd_stderr_bytes) = proc.communicate() (cmd_stdout, cmd_stderr) = (cmd_stdout_bytes.decode('utf-8', - "replace"), + "replace"), cmd_stderr_bytes.decode('utf-8', - "replace")) + "replace")) if proc.returncode == 0: Log.debug(self, "Command Output: {0}, \nCommand Error: {1}" diff --git a/wo/core/template.py b/wo/core/template.py index 93ee44c..cfbce0b 100644 --- a/wo/core/template.py +++ b/wo/core/template.py @@ -8,7 +8,7 @@ Render Templates """ -class WOTemplate(): +class WOTemplate: """WordOps template utilities""" def deploy(self, fileconf, template, data, overwrite=True): diff --git a/wo/core/variables.py b/wo/core/variables.py index a2d4a2e..16729d9 100644 --- a/wo/core/variables.py +++ b/wo/core/variables.py @@ -140,21 +140,20 @@ class WOVar(): wo_php_extra = ["php-memcached", "php-imagick", "graphviz", "php-xdebug", "php-msgpack", "php-redis"] - if not wo_distro == 'raspbian': - if (not wo_platform_codename == 'jessie'): - wo_mysql = ["mariadb-server", "percona-toolkit", - "python3-mysqldb", "mariadb-backup"] + wo_mysql = ["mariadb-server", "percona-toolkit"] + if wo_distro == 'raspbian': + wo_mysql = wo_mysql + ["python3-mysqldb"] + else: + if wo_platform_codename == 'jessie': + wo_mysql = wo_mysql + ["python3-mysql.connector"] else: - wo_mysql = ["mariadb-server", "percona-toolkit", - "python3-mysql.connector"] - else: - wo_mysql = ["mariadb-server", "percona-toolkit", - "python3-mysqldb"] + wo_mysql = wo_mysql + ["python3-mysqldb", "mariadb-backup"] + wo_mysql_client = ["mariadb-client"] if wo_platform_codename == 'jessie': - wo_mysql_client = ["mariadb-client", "python3-mysqldb"] + wo_mysql_client = wo_mysql_client + ["python3-mysqldb"] else: - wo_mysql_client = ["mariadb-client", "python3-mysql.connector"] + wo_mysql_client = wo_mysql_client + ["python3-mysql.connector"] wo_fail2ban = ["fail2ban"] wo_clamav = ["clamav", "clamav-freshclam"] From c1dc18360f715735b971d3d13191a9858004429d Mon Sep 17 00:00:00 2001 From: VirtuBox Date: Sat, 12 Oct 2019 11:09:35 +0200 Subject: [PATCH 40/44] Fix www added to subdomain --- install | 4 +++ wo/cli/plugins/site_functions.py | 54 +++++++++++++++++--------------- 2 files changed, 32 insertions(+), 26 deletions(-) diff --git a/install b/install index 0363f1a..ff1b5c1 100755 --- a/install +++ b/install @@ -62,6 +62,10 @@ while [ "$#" -gt 0 ]; do wo_branch="$2" shift ;; + -v | --version) + wo_version="$2" + shift + ;; --force) wo_force_install="y" ;; diff --git a/wo/cli/plugins/site_functions.py b/wo/cli/plugins/site_functions.py index e9b0454..a14f911 100644 --- a/wo/cli/plugins/site_functions.py +++ b/wo/cli/plugins/site_functions.py @@ -462,19 +462,20 @@ def setupwordpress(self, data, vhostonly=False): Log.debug(self, "{0} --allow-root core install " .format(WOVar.wo_wpcli_path) + "--url=\'{0}\' --title=\'{0}\' --admin_name=\'{1}\' " - .format(data['www_domain'], wo_wp_user) + + .format(data['site_name'], wo_wp_user) + "--admin_password= --admin_email=\'{1}\'" - .format(wo_wp_pass, wo_wp_email)) + .format(wo_wp_email)) try: - if WOShellExec.cmd_exec(self, "{0} --allow-root core " - .format(WOVar.wo_wpcli_path) + - "install --url=\'{0}\' --title=\'{0}\' " - "--admin_name=\'{1}\' " - .format(data['www_domain'], wo_wp_user) + - "--admin_password=\'{0}\' " - "--admin_email=\'{1}\'" - .format(wo_wp_pass, wo_wp_email), - log=False): + if WOShellExec.cmd_exec( + self, "{0} --allow-root core " + .format(WOVar.wo_wpcli_path) + + "install --url=\'{0}\' --title=\'{0}\' " + "--admin_name=\'{1}\' " + .format(data['site_name'], wo_wp_user) + + "--admin_password=\'{0}\' " + "--admin_email=\'{1}\'" + .format(wo_wp_pass, wo_wp_email), + log=False): pass else: raise SiteError( @@ -487,26 +488,27 @@ def setupwordpress(self, data, vhostonly=False): .format(WOVar.wo_wpcli_path) + "core multisite-install " "--url=\'{0}\' --title=\'{0}\' --admin_name=\'{1}\' " - .format(data['www_domain'], wo_wp_user) + + .format(data['site_name'], wo_wp_user) + "--admin_password= --admin_email=\'{1}\' " "{subdomains}" - .format(wo_wp_pass, wo_wp_email, + .format(wo_wp_email, subdomains='--subdomains' if not data['wpsubdir'] else '')) try: - if WOShellExec.cmd_exec(self, "{0} --allow-root " - .format(WOVar.wo_wpcli_path) + - "core multisite-install " - "--url=\'{0}\' --title=\'{0}\' " - "--admin_name=\'{1}\' " - .format(data['www_domain'], wo_wp_user) + - "--admin_password=\'{0}\' " - "--admin_email=\'{1}\' " - "{subdomains}" - .format(wo_wp_pass, wo_wp_email, - subdomains='--subdomains' - if not data['wpsubdir'] else ''), - log=False): + if WOShellExec.cmd_exec( + self, "{0} --allow-root " + .format(WOVar.wo_wpcli_path) + + "core multisite-install " + "--url=\'{0}\' --title=\'{0}\' " + "--admin_name=\'{1}\' " + .format(data['site_name'], wo_wp_user) + + "--admin_password=\'{0}\' " + "--admin_email=\'{1}\' " + "{subdomains}" + .format(wo_wp_pass, wo_wp_email, + subdomains='--subdomains' + if not data['wpsubdir'] else ''), + log=False): pass else: raise SiteError( From dc7ec443eddeb164369bee27008b02bdab528ae5 Mon Sep 17 00:00:00 2001 From: VirtuBox Date: Sat, 12 Oct 2019 11:16:25 +0200 Subject: [PATCH 41/44] Few improvements --- gitconfig.py | 2 ++ requirements.txt | 3 +-- wo/core/domainvalidate.py | 6 +++--- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/gitconfig.py b/gitconfig.py index 65ef8e2..f335b14 100644 --- a/gitconfig.py +++ b/gitconfig.py @@ -1,3 +1,5 @@ +#!/usr/bin/env python3 + import configparser import os import re diff --git a/requirements.txt b/requirements.txt index c396386..e3ca0dd 100644 --- a/requirements.txt +++ b/requirements.txt @@ -6,5 +6,4 @@ psutil>=5.6.3 sh>=1.12.14 SQLAlchemy>=1.3.8 requests>=2.22.0 -distro>=1.4.0 -apt-mirror-updater>=6.1 \ No newline at end of file +distro>=1.4.0 \ No newline at end of file diff --git a/wo/core/domainvalidate.py b/wo/core/domainvalidate.py index 80afb0f..fb4f477 100644 --- a/wo/core/domainvalidate.py +++ b/wo/core/domainvalidate.py @@ -21,10 +21,10 @@ class WODomain(): final_domain = '' if www_domain_name[0] == 'www': final_domain = '.'.join(www_domain_name[1:]) - else: - final_domain = domain_name + return final_domain + return domain_name + - return final_domain def getlevel(self, domain): """ From 9d5072c751438cb1663ecbf4c5745c2456d81e1d Mon Sep 17 00:00:00 2001 From: VirtuBox Date: Sat, 12 Oct 2019 11:46:11 +0200 Subject: [PATCH 42/44] Fix WordPress install error --- CHANGELOG.md | 1 + wo/cli/plugins/site_functions.py | 17 ++++++++--------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index da616ff..b3c6783 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -24,6 +24,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), - `wo secure --auth` - `wo secure --sshport` not working with default ssh config - Issues after APT repositories informations changed +- `www` was added to WordPress site url with subdomains [Issue #178](https://github.com/WordOps/WordOps/issues/178) ### v3.9.9.2 - 2019-10-04 diff --git a/wo/cli/plugins/site_functions.py b/wo/cli/plugins/site_functions.py index a14f911..6edab35 100644 --- a/wo/cli/plugins/site_functions.py +++ b/wo/cli/plugins/site_functions.py @@ -301,10 +301,9 @@ def setupwordpress(self, data, vhostonly=False): "--dbhost=\'{3}\' " .format(data['wo_db_name'], wo_wp_prefix, data['wo_db_user'], data['wo_db_host']) + - "--dbpass=\'{0}\' " - "--extra-php< Date: Sat, 12 Oct 2019 13:34:45 +0200 Subject: [PATCH 43/44] Fix Logwatcher --- CHANGELOG.md | 3 ++- wo/cli/plugins/site_functions.py | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b3c6783..42adbe5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,7 +8,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), ### v3.9.x - [Unreleased] -### v3.9.9.3 - 2019-10-08 +### v3.9.9.3 - [Unreleased] #### Added @@ -25,6 +25,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), - `wo secure --sshport` not working with default ssh config - Issues after APT repositories informations changed - `www` was added to WordPress site url with subdomains [Issue #178](https://github.com/WordOps/WordOps/issues/178) +- Issuing certificate with acme.sh for sub.sub-domains not working ### v3.9.9.2 - 2019-10-04 diff --git a/wo/cli/plugins/site_functions.py b/wo/cli/plugins/site_functions.py index 6edab35..4251c7a 100644 --- a/wo/cli/plugins/site_functions.py +++ b/wo/cli/plugins/site_functions.py @@ -1054,7 +1054,7 @@ def logwatch(self, logfiles): import zlib import base64 import time - from wo.core import logwatch + from wo.core.logwatch import LogWatcher def callback(filename, lines): for line in lines: @@ -1071,7 +1071,7 @@ def logwatch(self, logfiles): 'caught exception rendering a new log line in %s' % filename) - logl = logwatch.LogWatcher(logfiles, callback) + logl = LogWatcher(logfiles, callback) logl.loop() From 1cf1d16f5817fea9da23933aaa00b6f9bf0c71cf Mon Sep 17 00:00:00 2001 From: VirtuBox Date: Mon, 14 Oct 2019 19:30:22 +0200 Subject: [PATCH 44/44] Add gitattributes --- .gitattributes | 39 +++++++++++++++++++++++++++++++++++++++ install | 2 +- 2 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 .gitattributes diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..d52fc3e --- /dev/null +++ b/.gitattributes @@ -0,0 +1,39 @@ +# Auto detect text files and perform LF normalization +* text=auto + +# Documents +*.md text +*.tex text diff=tex +*.adoc text +*.textile text +*.mustache text +*.csv text +*.tab text +*.tsv text +*.txt text +*.sql text + +# Scripts +*.bash text eol=lf +*.fish text eol=lf +*.sh text eol=lf + +# Source files +# ============ +*.pxd text diff=python +*.py text diff=python +*.py3 text diff=python +*.pyc text diff=python +*.pyd text diff=python +*.pyo text diff=python +*.pyw text diff=python +*.pyx text diff=python +*.pyz text diff=python + + +# +# Exclude files from exporting +# + +.gitattributes export-ignore +.gitignore export-ignore \ No newline at end of file diff --git a/install b/install index ff1b5c1..9ed4b8c 100755 --- a/install +++ b/install @@ -9,7 +9,7 @@ # ------------------------------------------------------------------------- # wget -qO wo wops.cc && sudo bash wo # ------------------------------------------------------------------------- -# Version 3.9.9.3 - 2019-10-11 +# Version 3.9.9.3 - 2019-10-14 # ------------------------------------------------------------------------- # CONTENTS