Compare commits

...

11 Commits

Author SHA1 Message Date
22227c2849 fix: admpass.sh hang, OLS httpd_config structure, listener maps
Some checks failed
CI / test WordOps (ubuntu-22.04) (push) Has been cancelled
CI / test WordOps (ubuntu-24.04) (push) Has been cancelled
Three fixes:

1. Replace admpass.sh calls with direct htpasswd writes — the script
   is interactive-only (no --password flag) and hangs forever in
   automation. Write admin htpasswd directly with openssl passwd.

2. Fix httpd_config.conf template — OLS requires virtualHost {} blocks
   with vhRoot/configFile, not bare include of vhconf.conf files.
   Add proper _backend virtualHost block, map it to Backend listener,
   use self-signed cert for Secure listener until real certs exist.

3. Fix addOLSListenerMap to only add maps to Default and Secure
   listeners (not Backend which is reserved for the admin panel).

4. Fix default PHP detection to read from wo.conf config instead
   of picking first installed version (which would prefer php74).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-09 13:08:03 +01:00
eaa5a95168 fix: make lsphp opcache conditional — not available for PHP 8.5
Some checks failed
CI / test WordOps (ubuntu-22.04) (push) Has been cancelled
CI / test WordOps (ubuntu-24.04) (push) Has been cancelled
lsphp85-opcache doesn't exist in the LiteSpeed repo (opcache is
bundled in the base lsphp85 package). Only add opcache as a
separate package for PHP 7.4-8.4.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-09 11:55:39 +01:00
06352bbc30 fix: align LSPHP module list with actual OLS repo packages
Some checks failed
CI / test WordOps (ubuntu-22.04) (push) Has been cancelled
CI / test WordOps (ubuntu-24.04) (push) Has been cancelled
LSPHP packages don't have separate gd, mbstring, xml, zip, soap,
imap modules - these are bundled in lsphp-common. Updated module
list to only include packages that exist in the OLS repository:
common, curl, igbinary, imagick, intl, memcached, msgpack, mysql,
opcache, pear, redis, snmp, sqlite3, tidy.

Also update default PHP version to 8.5.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-09 11:51:26 +01:00
0c20a10efd fix: use correct OLS GPG key URL (lst_repo.gpg) without dearmoring
Some checks failed
CI / test WordOps (ubuntu-22.04) (push) Has been cancelled
CI / test WordOps (ubuntu-24.04) (push) Has been cancelled
The old URL (lst_debian_repo.gpg) piped through gpg --dearmor was
producing a corrupted keyring that sqv (Debian 13's GPG verifier)
could not parse. Use lst_repo.gpg directly which is already in the
correct binary GPG format.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-09 11:44:26 +01:00
3585aca1ad fix: skip external MariaDB repo on trixie, clean stale repo files
Some checks failed
CI / test WordOps (ubuntu-22.04) (push) Has been cancelled
CI / test WordOps (ubuntu-24.04) (push) Has been cancelled
- Trixie uses native Debian mariadb packages (external repo has no
  trixie release), so wo_mysql_repo is empty and repo add is skipped
- Clean up old openlitespeed.list and mariadb.list during install so
  they get regenerated with correct GPG keyring paths

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-09 11:39:33 +01:00
317181e4be fix: match OLS GPG keyring filename between install and variables
Some checks failed
CI / test WordOps (ubuntu-22.04) (push) Has been cancelled
CI / test WordOps (ubuntu-24.04) (push) Has been cancelled
Install script saves key as openlitespeed-archive-keyring.gpg but
variables.py referenced openlitespeed-keyring.gpg, causing apt
signed-by verification to fail during wo stack install.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-09 08:26:13 +01:00
f58d1e919d fix: remove --no-deps from pip install to include dependencies
Some checks failed
CI / test WordOps (ubuntu-22.04) (push) Has been cancelled
CI / test WordOps (ubuntu-24.04) (push) Has been cancelled
The --no-deps flag was skipping cement, sh, and other required deps.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-09 08:21:29 +01:00
418d0fdda2 fix: save install dir before cd and use absolute path for setup.py
Some checks failed
CI / test WordOps (ubuntu-22.04) (push) Has been cancelled
CI / test WordOps (ubuntu-24.04) (push) Has been cancelled
wo_install() does cd to HOME before checking for setup.py, so
./setup.py was always checking /root/setup.py (doesn't exist) instead
of /root/WPIQ/setup.py. Save pwd at script start and reference it.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-09 08:19:17 +01:00
15e70efa01 fix: force reinstall from local checkout to bypass pip cache
Some checks failed
CI / test WordOps (ubuntu-22.04) (push) Has been cancelled
CI / test WordOps (ubuntu-24.04) (push) Has been cancelled
pip install -U skips reinstall when version number hasn't changed,
causing stale code to remain. Use --force-reinstall --no-cache-dir
to ensure local source is always installed fresh.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-09 08:16:32 +01:00
35efce33c5 fix: install from local checkout and remove dead wo_deb_repo code
Some checks failed
CI / test WordOps (ubuntu-22.04) (push) Has been cancelled
CI / test WordOps (ubuntu-24.04) (push) Has been cancelled
- wo_install() now detects local setup.py and installs from it instead
  of always pulling from PyPI/GitHub (which installs the old upstream)
- Removed unused wo_deb_repo variable branches in variables.py that
  caused NameError on unsupported codenames
- OLS repo URL uses codename directly for all distros (same format)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-09 07:35:46 +01:00
9c4e71a43c fix: install script for Debian 13 (Python 3.13) compatibility
Some checks failed
CI / test WordOps (ubuntu-22.04) (push) Has been cancelled
CI / test WordOps (ubuntu-24.04) (push) Has been cancelled
- Split apt-get deps by distro version to avoid missing package failures
  (python3-distutils-extra removed in 3.12+, ntp replaced by systemd-timesyncd)
- Dynamically detect Python version for python3.XX-venv package
- Guard bare `pip` call with trixie exclusion and error suppression
- Check unattended-upgrades file exists before copying
- Fix 3 missing closing parentheses in site_backup.py format strings
- Update remaining Nginx references in comments and help text

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-09 06:48:13 +01:00
7 changed files with 168 additions and 99 deletions

View File

@@ -79,7 +79,7 @@ keylength = "ec-384"
[php] [php]
### Default PHP version ### Default PHP version
version = 8.3 version = 8.5
[mariadb] [mariadb]

85
install
View File

@@ -206,33 +206,59 @@ wo_dir_init() {
wo_install_dep() { wo_install_dep() {
local wo_linux_distro local wo_linux_distro
wo_linux_distro=$(lsb_release -is) wo_linux_distro=$(lsb_release -is)
wo_python_venv=$(apt-cache policy python3.12-venv 2>&1 | grep -q Installed) local python_ver
python_ver=$(python3 -c "import sys; print(sys.version_info[1])")
local wo_distro_codename
wo_distro_codename=$(lsb_release -sc)
# base packages available on all supported distros
local base_deps="build-essential curl gzip gcc python3-dev python3-pip python3-apt \
ca-certificates sqlite3 git tar software-properties-common pigz apt-transport-https \
gnupg2 cron ccze rsync tree ufw tzdata zstd libapt-pkg-dev bash-completion"
# distro-specific packages
local extra_deps=""
case "$wo_distro_codename" in
trixie)
# Debian 13: ntp replaced by systemd-timesyncd, distutils removed
extra_deps="dirmngr sudo python3-full systemd-timesyncd"
;;
bookworm)
extra_deps="dirmngr sudo python3-distutils-extra haveged unattended-upgrades ntp idn"
;;
noble)
extra_deps="python3-distutils-extra haveged unattended-upgrades ntp idn"
;;
*)
extra_deps="dirmngr sudo python3-distutils-extra haveged unattended-upgrades ntp idn"
;;
esac
if [ "$wo_linux_distro" == "Ubuntu" ]; then if [ "$wo_linux_distro" == "Ubuntu" ]; then
# install dependencies
add-apt-repository ppa:git-core/ppa -y add-apt-repository ppa:git-core/ppa -y
apt-get --option=Dpkg::options::=--force-confmiss --option=Dpkg::options::=--force-confold --assume-yes install \
build-essential curl gzip python3-pip python3-apt python3-venv gcc python3-dev sqlite3 git tar software-properties-common pigz \
gnupg2 cron ccze rsync apt-transport-https tree haveged ufw unattended-upgrades tzdata ntp zstd idn \
python3-distutils-extra libapt-pkg-dev bash-completion >/dev/null 2>&1
if $wo_python_venv; then
apt install -yy python3.12-venv >/dev/null 2>&1
fi fi
else
# install dependencies # install dependencies
apt-get --option=Dpkg::options::=--force-confmiss --option=Dpkg::options::=--force-confold --assume-yes install \ apt-get --option=Dpkg::options::=--force-confmiss --option=Dpkg::options::=--force-confold \
build-essential curl gzip dirmngr sudo python3-pip python3-apt python3-venv gcc python3-dev ca-certificates sqlite3 git tar \ --assume-yes install $base_deps $extra_deps >/dev/null 2>&1
software-properties-common pigz apt-transport-https gnupg2 cron ccze rsync tree haveged ufw unattended-upgrades tzdata ntp zstd idn \
python3-distutils-extra libapt-pkg-dev bash-completion >/dev/null 2>&1 # install versioned python3-venv package
apt-get --assume-yes install "python3.${python_ver}-venv" >/dev/null 2>&1 || \
apt-get --assume-yes install python3-venv >/dev/null 2>&1
if [ "$wo_linux_distro" != "Ubuntu" ]; then
# add php repository gpg key # add php repository gpg key
curl -sSLo /tmp/debsuryorg-archive-keyring.deb https://packages.sury.org/debsuryorg-archive-keyring.deb curl -sSLo /tmp/debsuryorg-archive-keyring.deb https://packages.sury.org/debsuryorg-archive-keyring.deb
dpkg -i /tmp/debsuryorg-archive-keyring.deb && rm -f /tmp/debsuryorg-archive-keyring.deb dpkg -i /tmp/debsuryorg-archive-keyring.deb && rm -f /tmp/debsuryorg-archive-keyring.deb
fi fi
locale-gen en locale-gen en
# enable unattended upgades # enable unattended upgrades
if [ -f /usr/share/unattended-upgrades/20auto-upgrades ]; then
if [ ! -f /etc/apt/apt.conf.d/20auto-upgrades ]; then if [ ! -f /etc/apt/apt.conf.d/20auto-upgrades ]; then
cp -f /usr/share/unattended-upgrades/20auto-upgrades /etc/apt/apt.conf.d/20auto-upgrades cp -f /usr/share/unattended-upgrades/20auto-upgrades /etc/apt/apt.conf.d/20auto-upgrades
fi fi
fi
} }
wo_download_gpg_keys() { wo_download_gpg_keys() {
@@ -251,7 +277,7 @@ wo_download_gpg_keys() {
curl -o /etc/apt/keyrings/mariadb-keyring.pgp 'https://mariadb.org/mariadb_release_signing_key.pgp' curl -o /etc/apt/keyrings/mariadb-keyring.pgp 'https://mariadb.org/mariadb_release_signing_key.pgp'
# openlitespeed # openlitespeed
curl -fsSL https://rpms.litespeedtech.com/debian/lst_debian_repo.gpg | gpg --dearmor | tee /usr/share/keyrings/openlitespeed-archive-keyring.gpg >/dev/null 2>&1 curl -fsSL -o /usr/share/keyrings/openlitespeed-archive-keyring.gpg https://rpms.litespeedtech.com/debian/lst_repo.gpg
} }
wo_update_repo() { wo_update_repo() {
@@ -481,8 +507,8 @@ wo_install() {
if [ -d /usr/local/lib/python3."$python_ver"/dist-packages ]; then if [ -d /usr/local/lib/python3."$python_ver"/dist-packages ]; then
cd /usr/local/lib/python3."$python_ver"/dist-packages || exit 1 cd /usr/local/lib/python3."$python_ver"/dist-packages || exit 1
fi fi
if [ "$wo_distro_codename" != "bookworm" ]; then if [ "$wo_distro_codename" != "bookworm" ] && [ "$wo_distro_codename" != "trixie" ]; then
pip uninstall -yq wo wordops ee pip uninstall -yq wo wordops ee 2>/dev/null || true
fi fi
cd || exit 1 cd || exit 1
@@ -526,7 +552,11 @@ wo_install() {
fi fi
fi fi
if [ "$wo_branch" = "master" ]; then if [ -f "$wo_install_dir/setup.py" ]; then
cd "$wo_install_dir" || exit 1
/opt/wo/bin/pip install --force-reinstall --no-cache-dir .
cd || exit 1
elif [ "$wo_branch" = "master" ]; then
/opt/wo/bin/pip install -U wordops --upgrade-strategy=eager /opt/wo/bin/pip install -U wordops --upgrade-strategy=eager
else else
/opt/wo/bin/pip install -I "git+https://github.com/WordOps/WordOps.git@$wo_branch#egg=wordops" --upgrade-strategy=eager /opt/wo/bin/pip install -I "git+https://github.com/WordOps/WordOps.git@$wo_branch#egg=wordops" --upgrade-strategy=eager
@@ -552,10 +582,10 @@ wo_travis_install() {
wo_distro_codename=$(lsb_release -sc) wo_distro_codename=$(lsb_release -sc)
local wo_linux_distro local wo_linux_distro
wo_linux_distro=$(lsb_release -is) wo_linux_distro=$(lsb_release -is)
if [ -d ./dist ]; then if [ -d "$wo_install_dir/dist" ]; then
rm -rf dist rm -rf "$wo_install_dir/dist"
fi fi
if [ -f ./setup.py ]; then if [ -f "$wo_install_dir/setup.py" ]; then
if [ -d /opt/wo/lib/python3."$python_ver"/site-packages/apt ]; then if [ -d /opt/wo/lib/python3."$python_ver"/site-packages/apt ]; then
source /opt/wo/bin/activate source /opt/wo/bin/activate
/opt/wo/bin/pip uninstall -yq setuptools /opt/wo/bin/pip uninstall -yq setuptools
@@ -743,7 +773,7 @@ wo_woconf() {
echo -e '\n[letsencrypt]\n\nkeylength = "ec-384"' >>/etc/wo/wo.conf echo -e '\n[letsencrypt]\n\nkeylength = "ec-384"' >>/etc/wo/wo.conf
fi fi
if ! grep -q "php" /etc/wo/wo.conf; then if ! grep -q "php" /etc/wo/wo.conf; then
echo -e '\n[php]\n\nversion = 8.2' >>/etc/wo/wo.conf echo -e '\n[php]\n\nversion = 8.5' >>/etc/wo/wo.conf
fi fi
fi fi
} }
@@ -787,8 +817,8 @@ wo_init() {
bash -c "echo -e \"[user]\n\tname = $USER_OR_WORDOPS\n\temail = root@$HOSTNAME.local\" > $HOME/.gitconfig" bash -c "echo -e \"[user]\n\tname = $USER_OR_WORDOPS\n\temail = root@$HOSTNAME.local\" > $HOME/.gitconfig"
} }
fi fi
if [ -f ./setup.py ]; then if [ -f "$wo_install_dir/setup.py" ]; then
wo_version_new=$(grep "version='" setup.py | awk -F "'" '{print $2}' 2>&1) wo_version_new=$(grep "version='" "$wo_install_dir/setup.py" | awk -F "'" '{print $2}' 2>&1)
else else
wo_version_new=$(curl -m 5 --retry 3 -sL https://api.github.com/repos/WordOps/WordOps/releases/latest 2>&1 | jq -r '.tag_name') wo_version_new=$(curl -m 5 --retry 3 -sL https://api.github.com/repos/WordOps/WordOps/releases/latest 2>&1 | jq -r '.tag_name')
fi fi
@@ -816,6 +846,9 @@ wo_git_secure_path() {
# 4 - WO MAIN SETUP # 4 - WO MAIN SETUP
### ###
# save the directory from which the install was launched
readonly wo_install_dir="$(pwd)"
# create required directories # create required directories
wo_dir_init wo_dir_init
# install lsb_release, curl, gpg and display header # install lsb_release, curl, gpg and display header
@@ -826,6 +859,10 @@ wo_init_variables
_run wo_clean_repo _run wo_clean_repo
_run wo_download_gpg_keys _run wo_download_gpg_keys
# clean up stale repo list files so they get regenerated correctly
rm -f /etc/apt/sources.list.d/openlitespeed.list 2>/dev/null
rm -f /etc/apt/sources.list.d/mariadb.list 2>/dev/null
if [ -z "$wo_force_install" ]; then if [ -z "$wo_force_install" ]; then
# check distribution support # check distribution support
wo_check_distro wo_check_distro

View File

@@ -93,13 +93,27 @@ class WOSecureController(CementBaseController):
pargs.user_pass = password pargs.user_pass = password
if password == "": if password == "":
pargs.user_pass = passwd pargs.user_pass = passwd
# Set OLS admin password using admpass.sh # Set OLS admin + backend password directly
# (admpass.sh is interactive-only and hangs in automation)
WOShellExec.cmd_exec( WOShellExec.cmd_exec(
self, "/usr/local/lsws/admin/misc/admpass.sh " self, "printf \"{username}:"
"{username} {password}" "$(openssl passwd -apr1 '{password}' "
"2>/dev/null)\n\" "
"> /usr/local/lsws/admin/conf/htpasswd "
"2>/dev/null"
.format(username=pargs.user_input, .format(username=pargs.user_input,
password=pargs.user_pass), password=pargs.user_pass),
log=False) log=False)
WOShellExec.cmd_exec(
self, "printf \"{username}:"
"$(openssl passwd -apr1 '{password}' "
"2>/dev/null)\n\" "
"> {conf}/htpasswd-wo "
"2>/dev/null"
.format(username=pargs.user_input,
password=pargs.user_pass,
conf=WOVar.wo_ols_conf_dir),
log=False)
WOGit.add(self, [WOVar.wo_ols_conf_dir], WOGit.add(self, [WOVar.wo_ols_conf_dir],
msg="Adding changed secure auth into Git") msg="Adding changed secure auth into Git")

View File

@@ -80,7 +80,7 @@ def addOLSVhost(self, domain, webroot):
def addOLSListenerMap(self, domain): def addOLSListenerMap(self, domain):
"""Add map entries for domain to listener blocks in httpd_config.conf""" """Add map entries for domain to Default+Secure listeners in httpd_config.conf"""
httpd_conf = '{0}/httpd_config.conf'.format(WOVar.wo_ols_conf_dir) httpd_conf = '{0}/httpd_config.conf'.format(WOVar.wo_ols_conf_dir)
map_line = ' map {0} {0}\n'.format(domain) map_line = ' map {0} {0}\n'.format(domain)
@@ -89,11 +89,14 @@ def addOLSListenerMap(self, domain):
new_lines = [] new_lines = []
in_listener = False in_listener = False
listener_name = ''
for line in lines: for line in lines:
if line.strip().startswith('listener '): if line.strip().startswith('listener '):
in_listener = True in_listener = True
listener_name = line.strip().split()[1]
if in_listener and line.strip() == '}': if in_listener and line.strip() == '}':
# Check if map for this domain already exists # Only add maps to Default and Secure listeners (not Backend)
if listener_name in ('Default', 'Secure'):
if not any(domain in l and 'map' in l for l in new_lines): if not any(domain in l and 'map' in l for l in new_lines):
new_lines.append(map_line) new_lines.append(map_line)
in_listener = False in_listener = False

View File

@@ -27,8 +27,8 @@ def pre_pref(self, apt_packages):
"""Pre settings to do before installation packages""" """Pre settings to do before installation packages"""
if ("mariadb-server" in apt_packages or "mariadb-client" in apt_packages): if ("mariadb-server" in apt_packages or "mariadb-client" in apt_packages):
# add mariadb repository excepted on raspbian and ubuntu 19.04 # add mariadb repository excepted on raspbian, trixie (uses native pkgs)
if not (WOVar.wo_distro == 'raspbian'): if not (WOVar.wo_distro == 'raspbian') and WOVar.wo_mysql_repo:
Log.info(self, "Adding repository for MySQL, please wait...") Log.info(self, "Adding repository for MySQL, please wait...")
mysql_pref = ( mysql_pref = (
"Package: *\nPin: origin deb.mariadb.org" "Package: *\nPin: origin deb.mariadb.org"
@@ -109,11 +109,22 @@ def post_pref(self, apt_packages, packages, upgrade=False):
if not os.path.exists(ols_vhost): if not os.path.exists(ols_vhost):
os.makedirs(ols_vhost) os.makedirs(ols_vhost)
# Determine default PHP version # Determine default PHP version from config
default_php_short = '84' try:
for ver_key, ver_num in WOVar.wo_php_versions.items(): config_php = self.app.config.get('php', 'version')
default_php_short = config_php.replace('.', '')
except Exception:
default_php_short = '85'
# Fallback: if configured LSPHP binary doesn't exist, find one
if not os.path.exists(
'/usr/local/lsws/lsphp{0}/bin/lsphp'
.format(default_php_short)):
for ver_num in reversed(
list(WOVar.wo_php_versions.values())):
short = ver_num.replace('.', '') short = ver_num.replace('.', '')
if os.path.exists('/usr/local/lsws/lsphp{0}/bin/lsphp'.format(short)): if os.path.exists(
'/usr/local/lsws/lsphp{0}/bin/lsphp'
.format(short)):
default_php_short = short default_php_short = short
break break
@@ -181,13 +192,18 @@ def post_pref(self, apt_packages, packages, upgrade=False):
.format(ngxroot))): .format(ngxroot))):
SSL.selfsignedcert(self, proftpd=False, backend=True) SSL.selfsignedcert(self, proftpd=False, backend=True)
# Deploy OLS admin password via admpass.sh # Set OLS WebAdmin password directly
if os.path.isfile('/usr/local/lsws/admin/misc/admpass.sh'): # (admpass.sh is interactive-only and hangs in automation)
admin_htpasswd = '/usr/local/lsws/admin/conf/htpasswd'
try: try:
WOShellExec.cmd_exec( WOShellExec.cmd_exec(
self, self, "printf \"admin:"
'/usr/local/lsws/admin/misc/admpass.sh ' "$(openssl passwd -apr1 "
'--password "{0}"'.format(passwd)) "{password} 2> /dev/null)\n\""
"> {htpasswd} "
"2>/dev/null"
.format(password=passwd,
htpasswd=admin_htpasswd))
except CommandExecutionError as e: except CommandExecutionError as e:
Log.debug(self, "{0}".format(e)) Log.debug(self, "{0}".format(e))

View File

@@ -176,6 +176,18 @@ module cache {
privateExpireInSeconds 3600 privateExpireInSeconds 3600
} }
# Include LSPHP external app definitions
include /usr/local/lsws/conf/lsphp*.conf
# Backend virtual host (port 22222 admin panel)
virtualHost _backend {
vhRoot /var/www/22222/
configFile /usr/local/lsws/conf/vhosts/_backend/vhconf.conf
allowSymbolLink 1
enableScript 1
restrained 0
}
# Listener for HTTP on port 80 # Listener for HTTP on port 80
listener Default { listener Default {
address *:80 address *:80
@@ -186,8 +198,8 @@ listener Default {
listener Secure { listener Secure {
address *:443 address *:443
secure 1 secure 1
keyFile /usr/local/lsws/conf/example.key keyFile /var/www/22222/cert/22222.key
certFile /usr/local/lsws/conf/example.crt certFile /var/www/22222/cert/22222.crt
sslProtocol 24 sslProtocol 24
enableQuic 1 enableQuic 1
} }
@@ -199,10 +211,7 @@ listener Backend {
keyFile /var/www/22222/cert/22222.key keyFile /var/www/22222/cert/22222.key
certFile /var/www/22222/cert/22222.crt certFile /var/www/22222/cert/22222.crt
sslProtocol 24 sslProtocol 24
map _backend *
} }
# Include external app definitions # WordOps managed vhost mappings below (do not edit this line)
include /usr/local/lsws/conf/lsphp*.conf
# Include virtual host mappings
include /usr/local/lsws/conf/vhosts/*/vhconf.conf

View File

@@ -122,35 +122,12 @@ class WOVar():
wo_ols_ctrl = '/usr/local/lsws/bin/lswsctrl' wo_ols_ctrl = '/usr/local/lsws/bin/lswsctrl'
# OpenLiteSpeed repo and packages # OpenLiteSpeed repo and packages
if wo_distro == 'ubuntu': wo_ols_repo = ("deb [signed-by=/usr/share/keyrings/openlitespeed-archive-keyring.gpg] "
wo_ols_repo = ("deb [signed-by=/usr/share/keyrings/openlitespeed-keyring.gpg] "
"http://rpms.litespeedtech.com/debian/ "
"{0} main".format(wo_platform_codename))
else:
if wo_distro == 'debian':
if wo_platform_codename == 'buster':
wo_deb_repo = "Debian_10"
elif wo_platform_codename == 'bullseye':
wo_deb_repo = "Debian_11"
elif wo_platform_codename == 'bookworm':
wo_deb_repo = "Debian_12"
elif wo_platform_codename == 'trixie':
wo_deb_repo = "Debian_13"
elif wo_distro == 'raspbian':
if wo_platform_codename == 'buster':
wo_deb_repo = "Raspbian_10"
elif wo_platform_codename == 'bullseye':
wo_deb_repo = "Raspbian_11"
elif wo_platform_codename == 'bookworm':
wo_deb_repo = "Raspbian_12"
elif wo_platform_codename == 'trixie':
wo_deb_repo = "Raspbian_13"
wo_ols_repo = ("deb [signed-by=/usr/share/keyrings/openlitespeed-keyring.gpg] "
"http://rpms.litespeedtech.com/debian/ " "http://rpms.litespeedtech.com/debian/ "
"{0} main".format(wo_platform_codename)) "{0} main".format(wo_platform_codename))
wo_ols = ["openlitespeed"] wo_ols = ["openlitespeed"]
wo_ols_repo_key = "https://rpms.litespeedtech.com/debian/lst_debian_repo.gpg" wo_ols_repo_key = "https://rpms.litespeedtech.com/debian/lst_repo.gpg"
wo_php_versions = { wo_php_versions = {
'php74': '7.4', 'php74': '7.4',
@@ -164,12 +141,18 @@ class WOVar():
def generate_lsphp_modules(version_prefix, version_number): def generate_lsphp_modules(version_prefix, version_number):
"""Generate LSPHP module package list for a given PHP version. """Generate LSPHP module package list for a given PHP version.
LSPHP packages use lsphpXX- naming (no dot in version).""" LSPHP packages use lsphpXX- naming (no dot in version).
Note: gd, mbstring, xml, zip, soap, imap are bundled in
lsphp-common and do not have separate packages."""
short_ver = version_number.replace('.', '') short_ver = version_number.replace('.', '')
wo_module = ["common", "curl", "gd", "igbinary", wo_module = ["common", "curl", "igbinary",
"imagick", "imap", "intl", "mbstring", "memcached", "msgpack", "imagick", "intl", "memcached", "msgpack",
"mysql", "opcache", "redis", "soap", "mysql", "pear", "redis",
"xml", "zip"] "snmp", "sqlite3", "tidy"]
# opcache is a separate package only on older PHP versions
if version_number in ('7.4', '8.0', '8.1', '8.2', '8.3', '8.4'):
wo_module.append("opcache")
# lsphp packages: lsphpXX, lsphpXX-common, lsphpXX-curl, etc. # lsphp packages: lsphpXX, lsphpXX-common, lsphpXX-curl, etc.
php_modules = ["lsphp{0}".format(short_ver)] php_modules = ["lsphp{0}".format(short_ver)]
@@ -195,6 +178,9 @@ class WOVar():
"mariadb-common", "python3-mysqldb"] "mariadb-common", "python3-mysqldb"]
if wo_distro == 'raspbian': if wo_distro == 'raspbian':
mariadb_ver = '10.3' mariadb_ver = '10.3'
elif wo_platform_codename == 'trixie':
mariadb_ver = ''
wo_mysql = wo_mysql + ["mariadb-backup"]
else: else:
mariadb_ver = '11.4' mariadb_ver = '11.4'
wo_mysql = wo_mysql + ["mariadb-backup"] wo_mysql = wo_mysql + ["mariadb-backup"]
@@ -205,9 +191,13 @@ class WOVar():
wo_clamav = ["clamav", "clamav-freshclam"] wo_clamav = ["clamav", "clamav-freshclam"]
# APT repositories # APT repositories
if mariadb_ver:
wo_mysql_repo = ("deb [signed-by=/etc/apt/keyrings/mariadb-keyring.pgp] " wo_mysql_repo = ("deb [signed-by=/etc/apt/keyrings/mariadb-keyring.pgp] "
"http://deb.mariadb.org/" "http://deb.mariadb.org/"
f"{mariadb_ver}/{wo_distro} {wo_platform_codename} main") f"{mariadb_ver}/{wo_distro} {wo_platform_codename} main")
else:
# trixie: use native Debian mariadb packages, no external repo
wo_mysql_repo = ""
mariadb_repo_key = "https://mariadb.org/mariadb_release_signing_key.pgp" mariadb_repo_key = "https://mariadb.org/mariadb_release_signing_key.pgp"
if wo_distro == 'ubuntu': if wo_distro == 'ubuntu':
# LSPHP comes from LiteSpeed repo (same as OLS) # LSPHP comes from LiteSpeed repo (same as OLS)