Skip to content

Commit e1bb26a

Browse files
authored
Merge pull request #1699 from master3395/v2.5.5-dev
Fix phpMyAdmin for install/upgrade on v2.5.5-dev
2 parents 1f7bf14 + 0ba2cf2 commit e1bb26a

File tree

4 files changed

+104
-8
lines changed

4 files changed

+104
-8
lines changed

fix-phpmyadmin.sh

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
#!/bin/bash
2+
# Fix phpMyAdmin 404 after upgrade. Run as root on the panel server.
3+
# Usage: sudo bash fix-phpmyadmin.sh
4+
# Then open https://YOUR_IP:2087/phpmyadmin/ (or from Databases -> phpMyAdmin in the panel).
5+
6+
set -e
7+
CP="${CP:-/usr/local/CyberCP}"
8+
PUBLIC="$CP/public"
9+
PYTHON="${PYTHON:-$CP/bin/python}"
10+
11+
if [[ $(id -u) -ne 0 ]]; then
12+
echo "Run as root: sudo bash $0"
13+
exit 1
14+
fi
15+
16+
echo "Ensuring $PUBLIC exists..."
17+
mkdir -p "$PUBLIC"
18+
19+
if [[ ! -x "$PYTHON" ]]; then
20+
PYTHON=$(which python3 2>/dev/null || which python2 2>/dev/null || true)
21+
fi
22+
if [[ -z "$PYTHON" ]]; then
23+
echo "ERROR: No Python found. Install phpMyAdmin manually or fix panel Python."
24+
exit 1
25+
fi
26+
27+
echo "Installing phpMyAdmin via panel upgrade module..."
28+
export DJANGO_SETTINGS_MODULE=CyberCP.settings
29+
"$PYTHON" -c "
30+
import sys
31+
sys.path.insert(0, '$CP')
32+
from plogical.upgrade import Upgrade
33+
Upgrade.download_install_phpmyadmin()
34+
" 2>&1 || true
35+
36+
if [[ -d "$PUBLIC/phpmyadmin" ]]; then
37+
echo "Setting ownership to lscpd:lscpd..."
38+
chown -R lscpd:lscpd "$PUBLIC/phpmyadmin" 2>/dev/null || true
39+
chmod 755 "$PUBLIC/phpmyadmin"
40+
chmod 755 "$PUBLIC/phpmyadmin/tmp" 2>/dev/null || true
41+
echo "Done. phpMyAdmin is at $PUBLIC/phpmyadmin"
42+
echo "Test: https://YOUR_IP:2087/phpmyadmin/ (or use the panel Databases -> phpMyAdmin link)"
43+
else
44+
echo "WARNING: $PUBLIC/phpmyadmin was not created. Check logs above."
45+
exit 1
46+
fi

install/install.py

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3807,17 +3807,31 @@ def download_install_phpmyadmin(self):
38073807
self.stdOut(f"Failed to fetch latest phpMyAdmin version, using fallback: {e}", 1)
38083808

38093809
self.stdOut("Installing phpMyAdmin...", 1)
3810+
tarball = '/usr/local/CyberCP/public/phpmyadmin.tar.gz'
38103811
command = (
3811-
f'wget -q -O /usr/local/CyberCP/public/phpmyadmin.tar.gz '
3812+
f'wget -q -O {tarball} '
38123813
f'https://files.phpmyadmin.net/phpMyAdmin/{phpmyadmin_version}/phpMyAdmin-{phpmyadmin_version}-all-languages.tar.gz'
38133814
)
38143815
preFlightsChecks.call(command, self.distro, f'[download_install_phpmyadmin] {phpmyadmin_version}',
38153816
command, 1, 0, os.EX_OSERR)
3817+
if not os.path.isfile(tarball) or os.path.getsize(tarball) < 1000000:
3818+
raise RuntimeError('phpMyAdmin download failed or file too small')
38163819
command = 'tar -xzf /usr/local/CyberCP/public/phpmyadmin.tar.gz -C /usr/local/CyberCP/public/'
38173820
preFlightsChecks.call(command, self.distro, '[download_install_phpmyadmin] extract',
38183821
command, 1, 0, os.EX_OSERR)
3819-
command = 'mv /usr/local/CyberCP/public/phpMyAdmin-*-all-languages /usr/local/CyberCP/public/phpmyadmin'
3820-
subprocess.call(command, shell=True)
3822+
import glob
3823+
extracted = glob.glob('/usr/local/CyberCP/public/phpMyAdmin-*-all-languages')
3824+
if not extracted:
3825+
extracted = glob.glob('/usr/local/CyberCP/public/phpMyAdmin-*')
3826+
if extracted:
3827+
if os.path.exists('/usr/local/CyberCP/public/phpmyadmin'):
3828+
shutil.rmtree('/usr/local/CyberCP/public/phpmyadmin')
3829+
os.rename(extracted[0], '/usr/local/CyberCP/public/phpmyadmin')
3830+
else:
3831+
command = 'mv /usr/local/CyberCP/public/phpMyAdmin-*-all-languages /usr/local/CyberCP/public/phpmyadmin'
3832+
subprocess.call(command, shell=True)
3833+
if not os.path.isdir('/usr/local/CyberCP/public/phpmyadmin'):
3834+
raise RuntimeError('phpMyAdmin directory was not created after extract/mv')
38213835
command = 'rm -f /usr/local/CyberCP/public/phpmyadmin.tar.gz'
38223836
preFlightsChecks.call(command, self.distro, '[download_install_phpmyadmin] cleanup',
38233837
command, 1, 0, os.EX_OSERR)

plogical/upgrade.py

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1217,19 +1217,33 @@ def download_install_phpmyadmin():
12171217
Upgrade.stdOut(f"Failed to fetch latest phpMyAdmin version, using fallback: {e}", 0)
12181218

12191219
Upgrade.stdOut("Installing phpMyAdmin...", 0)
1220-
1221-
command = f'wget -q -O /usr/local/CyberCP/public/phpmyadmin.tar.gz https://files.phpmyadmin.net/phpMyAdmin/{phpmyadmin_version}/phpMyAdmin-{phpmyadmin_version}-all-languages.tar.gz'
1220+
1221+
tarball = '/usr/local/CyberCP/public/phpmyadmin.tar.gz'
1222+
command = f'wget -q -O {tarball} https://files.phpmyadmin.net/phpMyAdmin/{phpmyadmin_version}/phpMyAdmin-{phpmyadmin_version}-all-languages.tar.gz'
12221223
Upgrade.executioner_silent(command, f'Download phpMyAdmin {phpmyadmin_version}')
1224+
if not os.path.isfile(tarball) or os.path.getsize(tarball) < 1000000:
1225+
raise RuntimeError('phpMyAdmin download failed or file too small (check files.phpmyadmin.net)')
12231226

12241227
command = 'tar -xzf /usr/local/CyberCP/public/phpmyadmin.tar.gz -C /usr/local/CyberCP/public/'
12251228
Upgrade.executioner_silent(command, 'Extract phpMyAdmin')
12261229

1227-
command = 'mv /usr/local/CyberCP/public/phpMyAdmin-*-all-languages /usr/local/CyberCP/public/phpmyadmin'
1228-
subprocess.call(command, shell=True, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
1230+
# Move extracted dir to phpmyadmin (support phpMyAdmin-X.Y.Z-all-languages or similar)
1231+
import glob
1232+
extracted = glob.glob('/usr/local/CyberCP/public/phpMyAdmin-*-all-languages')
1233+
if not extracted:
1234+
extracted = glob.glob('/usr/local/CyberCP/public/phpMyAdmin-*')
1235+
if extracted:
1236+
if os.path.exists('/usr/local/CyberCP/public/phpmyadmin'):
1237+
shutil.rmtree('/usr/local/CyberCP/public/phpmyadmin')
1238+
os.rename(extracted[0], '/usr/local/CyberCP/public/phpmyadmin')
1239+
else:
1240+
Upgrade.executioner('mv /usr/local/CyberCP/public/phpMyAdmin-*-all-languages /usr/local/CyberCP/public/phpmyadmin', 0)
12291241

12301242
command = 'rm -f /usr/local/CyberCP/public/phpmyadmin.tar.gz'
12311243
Upgrade.executioner_silent(command, 'Cleanup phpMyAdmin tar.gz')
1232-
1244+
1245+
if not os.path.isdir('/usr/local/CyberCP/public/phpmyadmin'):
1246+
raise RuntimeError('phpMyAdmin directory was not created after extract/mv')
12331247
Upgrade.stdOut("phpMyAdmin installation completed.", 0)
12341248

12351249
## Write secret phrase
@@ -1291,6 +1305,11 @@ def download_install_phpmyadmin():
12911305
except:
12921306
pass
12931307

1308+
command = 'chown -R lscpd:lscpd /usr/local/CyberCP/public/phpmyadmin'
1309+
Upgrade.executioner_silent(command, 'chown phpMyAdmin')
1310+
command = 'chown -R lscpd:lscpd /usr/local/CyberCP/public/phpmyadmin/tmp'
1311+
Upgrade.executioner_silent(command, 'chown phpMyAdmin tmp')
1312+
12941313
os.chdir(cwd)
12951314

12961315
except Exception as e:

plogical/versionFetcher.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,8 @@ def get_latest_version(component: str) -> str:
6161

6262
# Clean version string (remove 'v' prefix if present)
6363
version = re.sub(r'^v', '', version)
64+
# Normalize component-specific tag formats (e.g. phpMyAdmin uses RELEASE_5_2_3)
65+
version = VersionFetcher._normalize_version(component, version)
6466

6567
if version and VersionFetcher._is_valid_version(version):
6668
logging.info(f"Successfully fetched {component} version: {version}")
@@ -89,6 +91,21 @@ def get_latest_versions() -> dict:
8991
versions[component] = VersionFetcher.get_latest_version(component)
9092
return versions
9193

94+
@staticmethod
95+
def _normalize_version(component: str, version: str) -> str:
96+
"""
97+
Normalize tag to x.y.z format. phpMyAdmin uses RELEASE_5_2_3 or 5_2_3.
98+
"""
99+
if not version:
100+
return version
101+
# RELEASE_5_2_3 or 5_2_3 -> 5.2.3
102+
if 'RELEASE_' in version.upper() or (component == 'phpmyadmin' and '_' in version and '.' not in version):
103+
normalized = re.sub(r'^RELEASE_', '', version, flags=re.IGNORECASE)
104+
normalized = normalized.replace('_', '.')
105+
if re.match(r'^\d+\.\d+\.\d+', normalized):
106+
return normalized
107+
return version
108+
92109
@staticmethod
93110
def _is_valid_version(version: str) -> bool:
94111
"""

0 commit comments

Comments
 (0)