Files
WPIQ/wo/cli/plugins/stack_migrate.py

164 lines
6.6 KiB
Python
Raw Normal View History

2024-06-07 15:55:19 +02:00
import os
import re
2019-09-02 04:37:13 +02:00
from cement.core.controller import CementBaseController, expose
2019-09-05 11:47:04 +02:00
from wo.cli.plugins.stack_pref import post_pref, pre_pref
2018-11-13 21:55:59 +01:00
from wo.core.aptget import WOAptGet
from wo.core.fileutils import WOFileUtils
2019-09-02 04:37:13 +02:00
from wo.core.logging import Log
from wo.core.mysql import WOMysql
2018-11-13 21:55:59 +01:00
from wo.core.shellexec import WOShellExec
2019-10-02 13:13:32 +02:00
from wo.core.variables import WOVar
2024-06-08 14:27:16 +02:00
from wo.cli.plugins.sitedb import (getAllsites)
from wo.core.template import WOTemplate
2018-11-13 21:55:59 +01:00
2020-10-23 13:49:14 +02:00
2018-11-13 21:55:59 +01:00
class WOStackMigrateController(CementBaseController):
class Meta:
label = 'migrate'
stacked_on = 'stack'
stacked_type = 'nested'
description = ('Migrate stack safely')
arguments = [
(['--mariadb'],
dict(help="Migrate/Upgrade database to MariaDB",
action='store_true')),
2024-06-08 14:27:16 +02:00
(['--nginx'],
dict(help="Migrate Nginx TLS configuration to HTTP/3 QUIC",
action='store_true')),
(['--force'],
dict(help="Force Packages upgrade without any prompt",
2018-11-13 21:55:59 +01:00
action='store_true')),
2020-10-28 11:45:30 +01:00
(['--ci'],
dict(help="Argument used for testing, "
"do not use it on your server",
action='store_true')),
2019-03-19 16:58:35 +01:00
]
2018-11-13 21:55:59 +01:00
@expose(hide=True)
2020-10-28 12:25:09 +01:00
def migrate_mariadb(self, ci=False):
2023-07-16 23:29:52 +02:00
2024-06-08 14:27:16 +02:00
# Backup all database
WOMysql.backupAll(self, fulldump=True)
2023-07-16 23:29:52 +02:00
# Check current MariaDB version
2024-06-07 15:55:19 +02:00
if (os.path.exists('/etc/apt/sources.list.d/wo-repo.list') and
WOFileUtils.grepcheck(self, "/etc/apt/sources.list.d/wo-repo.list", "mariadb")):
wo_mysql_current_repo = WOFileUtils.grep(
self, '/etc/apt/sources.list.d/wo-repo.list', 'mariadb')
repo_path = '/etc/apt/sources.list.d/wo-repo.list'
elif (os.path.exists('/etc/apt/sources.list.d/mariadb.list') and
WOFileUtils.grepcheck(self, '/etc/apt/sources.list.d/mariadb.list', "mariadb")):
wo_mysql_current_repo = WOFileUtils.grep(
self, '/etc/apt/sources.list.d/mariadb.list', 'mariadb')
repo_path = '/etc/apt/sources.list.d/mariadb.list'
2023-07-16 23:29:52 +02:00
if wo_mysql_current_repo:
2024-06-07 15:55:19 +02:00
Log.debug(self, "Looking for MariaDB version")
pattern = r"/(\d+\.\d+)/"
match = re.search(pattern, wo_mysql_current_repo)
current_mysql_version = match.group(1)
Log.debug(self, f"Current MariaDB version is {current_mysql_version}")
2023-07-16 23:29:52 +02:00
else:
2023-08-04 16:46:00 +02:00
Log.error(self, "MariaDB is not installed from repository yet")
2023-07-16 23:29:52 +02:00
2023-08-13 14:51:30 +02:00
if self.app.config.has_section('mariadb'):
mariadb_release = self.app.config.get(
'mariadb', 'release')
if mariadb_release < WOVar.mariadb_ver:
mariadb_release = WOVar.mariadb_ver
else:
mariadb_release = WOVar.mariadb_ver
2023-08-13 12:32:17 +02:00
if mariadb_release == current_mysql_version:
2023-07-16 23:29:52 +02:00
Log.info(self, "You already have the latest "
"MariaDB version available")
return 0
2024-06-07 15:55:19 +02:00
WOFileUtils.rm(self, repo_path)
2018-11-13 21:55:59 +01:00
# Add MariaDB repo
pre_pref(self, WOVar.wo_mysql)
2018-11-13 21:55:59 +01:00
# Install MariaDB
2020-10-23 16:33:35 +02:00
Log.wait(self, "Updating apt-cache ")
2018-11-13 21:55:59 +01:00
WOAptGet.update(self)
2020-10-23 16:33:35 +02:00
Log.valide(self, "Updating apt-cache ")
Log.wait(self, "Upgrading MariaDB ")
WOAptGet.remove(self, ["mariadb-server"])
2018-11-13 21:55:59 +01:00
WOAptGet.auto_remove(self)
WOAptGet.install(self, WOVar.wo_mysql)
2020-10-28 12:25:09 +01:00
if not ci:
2020-10-28 11:45:30 +01:00
WOAptGet.dist_upgrade(self)
2020-10-28 11:11:01 +01:00
WOAptGet.auto_remove(self)
WOAptGet.auto_clean(self)
2020-10-23 16:33:35 +02:00
Log.valide(self, "Upgrading MariaDB ")
WOFileUtils.mvfile(
self, '/etc/mysql/my.cnf', '/etc/mysql/my.cnf.old')
WOFileUtils.create_symlink(
self, ['/etc/mysql/mariadb.cnf', '/etc/mysql/my.cnf'])
2020-10-23 16:33:35 +02:00
WOShellExec.cmd_exec(self, 'systemctl daemon-reload')
2020-10-27 11:25:14 +01:00
WOShellExec.cmd_exec(self, 'systemctl enable mariadb')
2020-10-23 16:33:35 +02:00
post_pref(self, WOVar.wo_mysql, [])
2024-06-08 14:27:16 +02:00
@expose(hide=True)
def migrate_nginx(self):
# Add Nginx repo
pre_pref(self, WOVar.wo_nginx)
# Install Nginx
Log.wait(self, "Updating apt-cache ")
WOAptGet.update(self)
Log.valide(self, "Updating apt-cache ")
Log.wait(self, "Upgrading Nginx ")
if WOAptGet.install(self, WOVar.wo_nginx):
Log.valide(self, "Upgrading Nginx ")
else:
Log.failed(self, "Upgrading Nginx ")
allsites = getAllsites(self)
for site in allsites:
if not site:
pass
if (os.path.exists(f'/var/www/{site.sitename}/conf/nginx/ssl.conf') and
not os.path.islink(f'/var/www/{site.sitename}/conf/nginx/ssl.conf')):
2024-06-08 14:27:16 +02:00
data = dict(ssl_live_path=WOVar.wo_ssl_live,
2024-06-08 16:04:57 +02:00
domain=site.sitename, quic=True)
2024-06-08 14:27:16 +02:00
WOTemplate.deploy(
self, f'/var/www/{site.sitename}/conf/nginx/ssl.conf',
'ssl.mustache', data, overwrite=True)
post_pref(self, WOVar.wo_nginx, [])
2018-11-13 21:55:59 +01:00
@expose(hide=True)
def default(self):
pargs = self.app.pargs
2024-06-08 14:27:16 +02:00
if not pargs.mariadb and not pargs.nginx:
2018-11-13 21:55:59 +01:00
self.app.args.print_help()
if pargs.mariadb:
2020-10-28 11:45:30 +01:00
if WOVar.wo_distro == 'raspbian':
Log.error(self, "MariaDB upgrade is not available on Raspbian")
2019-10-02 13:13:32 +02:00
if WOVar.wo_mysql_host != "localhost":
2019-03-19 16:58:35 +01:00
Log.error(
self, "Remote MySQL server in use, skipping local install")
2018-11-13 21:55:59 +01:00
if WOMysql.mariadb_ping(self):
2018-11-13 21:55:59 +01:00
Log.info(self, "If your database size is big, "
"migration may take some time.")
Log.info(self, "During migration non nginx-cached parts of "
"your site may remain down")
if not pargs.force:
start_upgrade = input("Do you want to continue:[y/N]")
if start_upgrade != "Y" and start_upgrade != "y":
Log.error(self, "Not starting package update")
2020-10-28 12:25:09 +01:00
if not pargs.ci:
self.migrate_mariadb()
else:
self.migrate_mariadb(ci=True)
2018-11-13 21:55:59 +01:00
else:
Log.error(self, "Your current MySQL is not alive or "
"you allready installed MariaDB")
2024-06-08 14:27:16 +02:00
if pargs.nginx:
if os.path.exists('/usr/sbin/nginx'):
self.migrate_nginx()
else:
Log.error(self, "Unable to connect to MariaDB")