diff --git a/admin_autoupdate.php b/admin_autoupdate.php
new file mode 100644
index 00000000..f3ffa7f0
--- /dev/null
+++ b/admin_autoupdate.php
@@ -0,0 +1,202 @@
+ (2016-)
+ * @license non-free
+ * @package Auto-Update
+ * @version 0.1
+ */
+
+define('AREA', 'admin');
+require './lib/init.php';
+
+// define update-uri
+define('UPDATE_URI', "http://version.froxlor.org/Froxlor/legacy/" . $version);
+define('RELEASE_URI', "http://autoupdate.froxlor.org/froxlor-{version}.zip");
+define('MD5SUM_URI', "http://autoupdate.froxlor.org/froxlor-{version}.zip.md5");
+
+// check for allow_url_fopen
+if (ini_get('allow_url_fopen') === false) {
+ redirectTo($filename, array('s' => $s, 'page' => 'error', 'errno' => 1));
+}
+
+// check for archive-stuff
+if (function_exists('gzopen') === false) {
+ redirectTo($filename, array('s' => $s, 'page' => 'error', 'errno' => 2));
+}
+
+// display initial version check
+if ($page == 'overview') {
+
+ // log our actions
+ $log->logAction(ADM_ACTION, LOG_NOTICE, "checking auto-update");
+
+ // check for new version
+ $latestversion = @file(UPDATE_URI);
+
+ if (isset($latestversion[0])) {
+ $latestversion = explode('|', $latestversion[0]);
+
+ if (is_array($latestversion)
+ && count($latestversion) >= 1
+ ) {
+ $_version = $latestversion[0];
+ $_message = isset($latestversion[1]) ? $latestversion[1] : '';
+ $_link = isset($latestversion[2]) ? $latestversion[2] : htmlspecialchars($filename . '?s=' . urlencode($s) . '&page=' . urlencode($page) . '&lookfornewversion=yes');
+
+ // add the branding so debian guys are not gettings confused
+ // about their version-number
+ $version_label = $_version.$branding;
+ $version_link = $_link;
+ $message_addinfo = $_message;
+
+ // not numeric -> error-message
+ if (!preg_match('/^((\d+\\.)(\d+\\.)(\d+\\.)?(\d+)?(\-(svn|dev|rc)(\d+))?)$/', $_version)) {
+ // check for customized version to not output
+ // "There is a newer version of froxlor" besides the error-message
+ redirectTo($filename, array('s' => $s, 'page' => 'error', 'errno' => 3));
+ } elseif (version_compare2($version, $_version) == -1) {
+ // there is a newer version - yay
+ $isnewerversion = 1;
+ } else {
+ // nothing new
+ $isnewerversion = 0;
+ }
+
+ // anzeige über version-status mit ggfls. formular
+ // zum update schritt #1 -> download
+ if ($isnewerversion == 1) {
+ $text = 'There is a newer version available. Update to version '.$_version.' now?
(Your current version is: '.$version.')';
+ $hiddenparams = '';
+ $yesfile = $filename.'?s='.$s.'&page=getdownload';
+ eval("echo \"" . getTemplate("misc/question_yesno", true) . "\";");
+ exit;
+ }
+ elseif ($isnewerversion == 0) {
+ // all good
+ standard_success ('noupdatesavail');
+ } else {
+ standard_error ('customized_version');
+ }
+ }
+ }
+ // error (something weird came from version.froxlor.org)
+ redirectTo($filename, array('s' => $s, 'page' => 'error', 'errno' => 5));
+}
+// download the new archive
+elseif ($page == 'getdownload') {
+
+ // retreive the new version from the form
+ $newversion = isset($_POST['newversion']) ? $_POST['newversion'] : null;
+
+ // valid?
+ if ($newversion !== null) {
+
+ // define files to get
+ $toLoad = str_replace('{version}', $newversion, RELEASE_URI);
+ $toCheck = str_replace('{version}', $newversion, MD5SUM_URI);
+
+ // get archive data
+ $newArchive = @file_get_contents($toLoad);
+
+ // check for local destination folder
+ if (!is_dir(FROXLOR_INSTALL_DIR.'/updates/')) {
+ mkdir(FROXLOR_INSTALL_DIR.'/updates/');
+ }
+
+ // name archive
+ $localArchive = FROXLOR_INSTALL_DIR.'/updates/'.basename($toLoad);
+
+ $log->logAction(ADM_ACTION, LOG_NOTICE, "Downloading ".$toLoad." to ".$localArchive);
+
+ // remove old archive
+ if (file_exists($localArchive)) {
+ @unlink($localArchive);
+ }
+
+ // store archive
+ $fh = fopen($localArchive, 'w');
+ if (!fwrite($fh, $newArchive)) {
+ redirectTo($filename, array('s' => $s, 'page' => 'error', 'errno' => 4));
+ }
+
+ // close file-handle
+ fclose($fh);
+
+ // validate MD5
+ $_shouldsum = @file_get_contents($toCheck);
+ if (!empty($_shouldsum)) {
+ $_t = explode(" ", $_shouldsum);
+ $shouldsum = $_t[0];
+ } else {
+ $shouldsum = null;
+ }
+ $filesum = md5_file($localArchive);
+
+ if ($filesum != $shouldsum) {
+ redirectTo($filename, array('s' => $s, 'page' => 'error', 'errno' => 9));
+ }
+
+ // to the next step
+ redirectTo($filename, array('s' => $s, 'page' => 'extract', 'archive' => basename($localArchive)));
+ }
+ redirectTo($filename, array('s' => $s, 'page' => 'error', 'errno' => 6));
+}
+// extract and install new version
+elseif ($page == 'extract') {
+
+ $toExtract = isset($_GET['archive']) ? $_GET['archive'] : null;
+ $localArchive = FROXLOR_INSTALL_DIR.'/updates/'.$toExtract;
+
+ if (isset($_POST['send'])
+ && $_POST['send'] == 'send'
+ ) {
+ // decompress from zip
+ $zip = new ZipArchive;
+ $res = $zip->open($localArchive);
+ if ($res === true) {
+ $log->logAction(ADM_ACTION, LOG_NOTICE, "Extracting ".$localArchive." to ".dirname(FROXLOR_INSTALL_DIR));
+ $zip->extractTo(dirname(FROXLOR_INSTALL_DIR));
+ $zip->close();
+ // success - remove unused archive
+ @unlink($localArchive);
+ } else {
+ // error
+ redirectTo($filename, array('s' => $s, 'page' => 'error', 'errno' => 8));
+ }
+
+ // redirect to update-page?
+ redirectTo('admin_updates.php', array('s' => $s));
+ }
+
+ if (!file_exists($localArchive)) {
+ redirectTo($filename, array('s' => $s, 'page' => 'error', 'errno' => 7));
+ }
+
+ $text = 'Extract downloaded archive "'.$toExtract.'"?';
+ $hiddenparams = '';
+ $yesfile = $filename.'?s='.$s.'&page=extract&archive='.$toExtract;
+ eval("echo \"" . getTemplate("misc/question_yesno", true) . "\";");
+}
+
+// display error
+elseif ($page == 'error') {
+
+ // retreive error-number via url-parameter
+ $errno = isset($_GET['errno']) ? (int)$_GET['errno'] : 0;
+
+ // 1 = no allow_url_fopen
+ // 2 = no Zlib
+ // 3 = custom version detected
+ // 4 = could not store archive to local hdd
+ // 5 = some weird value came from version.froxlor.org
+ // 6 = download without valid version
+ // 7 = local archive does not exist
+ // 8 = could not extract archive
+ // 9 = md5 mismatch
+ standard_error ('autoupdate_'.$errno);
+}
diff --git a/lib/navigation/00.froxlor.main.php b/lib/navigation/00.froxlor.main.php
index 826552a9..b5e1845c 100644
--- a/lib/navigation/00.froxlor.main.php
+++ b/lib/navigation/00.froxlor.main.php
@@ -173,16 +173,21 @@ return array (
'label' => $lng['admin']['customers'],
'required_resources' => 'customers',
),
- array (
- 'url' => 'admin_domains.php?page=domains',
- 'label' => $lng['admin']['domains'],
- 'required_resources' => 'domains',
- ),
array (
'url' => 'admin_admins.php?page=admins',
'label' => $lng['admin']['admins'],
'required_resources' => 'change_serversettings',
),
+ array (
+ 'url' => 'admin_domains.php?page=domains',
+ 'label' => $lng['admin']['domains'],
+ 'required_resources' => 'domains',
+ ),
+ array (
+ 'url' => 'admin_ipsandports.php?page=ipsandports',
+ 'label' => $lng['admin']['ipsandports']['ipsandports'],
+ 'required_resources' => 'change_serversettings',
+ ),
),
),
'traffic' => array (
@@ -210,32 +215,6 @@ return array (
'label' => $lng['admin']['serversettings'],
'required_resources' => 'change_serversettings',
),
- array (
- 'url' => 'admin_settings.php?page=phpinfo',
- 'label' => $lng['admin']['phpinfo'],
- 'required_resources' => 'change_serversettings',
- ),
- array (
- 'url' => 'admin_apcuinfo.php?page=showinfo',
- 'label' => $lng['admin']['apcuinfo'],
- 'required_resources' => 'change_serversettings',
- 'show_element' => (
- function_exists('apcu_cache_info') === true
- ),
- ),
- array (
- 'url' => 'admin_opcacheinfo.php?page=showinfo',
- 'label' => $lng['admin']['opcacheinfo'],
- 'required_resources' => 'change_serversettings',
- 'show_element' => (
- function_exists('opcache_get_configuration') === true
- ),
- ),
- array (
- 'url' => 'admin_ipsandports.php?page=ipsandports',
- 'label' => $lng['admin']['ipsandports']['ipsandports'],
- 'required_resources' => 'change_serversettings',
- ),
array (
'url' => 'admin_cronjobs.php?page=overview',
'label' => $lng['admin']['cron']['cronsettings'],
@@ -256,16 +235,48 @@ return array (
'label' => $lng['admin']['integritycheck'],
'required_resources' => 'change_serversettings',
),
- array (
- 'url' => 'admin_phpsettings.php?page=overview',
- 'label' => $lng['menue']['phpsettings']['maintitle'],
- 'show_element' => (
- Settings::Get('system.mod_fcgid') == true ||
- Settings::Get('phpfpm.enabled') == true
- ),
- ),
+ array (
+ 'url' => 'admin_autoupdate.php?page=overview',
+ 'label' => $lng['admin']['autoupdate'],
+ 'required_resources' => 'change_serversettings',
+ ),
),
),
+ 'server_php' => array (
+ 'label' => $lng['admin']['server_php'],
+ 'required_resources' => 'change_serversettings',
+ 'elements' => array (
+ array (
+ 'url' => 'admin_phpsettings.php?page=overview',
+ 'label' => $lng['menue']['phpsettings']['maintitle'],
+ 'show_element' => (
+ Settings::Get('system.mod_fcgid') == true ||
+ Settings::Get('phpfpm.enabled') == true
+ ),
+ ),
+ array (
+ 'url' => 'admin_settings.php?page=phpinfo',
+ 'label' => $lng['admin']['phpinfo'],
+ 'required_resources' => 'change_serversettings',
+ ),
+ array (
+ 'url' => 'admin_apcuinfo.php?page=showinfo',
+ 'label' => $lng['admin']['apcuinfo'],
+ 'required_resources' => 'change_serversettings',
+ 'show_element' => (
+ function_exists('apcu_cache_info') === true
+ ),
+ ),
+ array (
+ 'url' => 'admin_opcacheinfo.php?page=showinfo',
+ 'label' => $lng['admin']['opcacheinfo'],
+ 'required_resources' => 'change_serversettings',
+ 'show_element' => (
+ function_exists('opcache_get_configuration') === true
+ ),
+ ),
+ ),
+ ),
'misc' => array (
'label' => $lng['admin']['misc'],
'elements' => array (
diff --git a/lng/english.lng.php b/lng/english.lng.php
index c780385c..ec88d3e3 100644
--- a/lng/english.lng.php
+++ b/lng/english.lng.php
@@ -1940,3 +1940,17 @@ $lng['serversettings']['letsencryptcountrycode']['description'] = "2 letter coun
$lng['serversettings']['letsencryptstate']['title'] = "Let's Encrypt state";
$lng['serversettings']['letsencryptstate']['description'] = "State used to generate Let's Encrypt certificates.
ATTENTION:Let's Encrypt is still in beta";
+// Autoupdate
+$lng['admin']['autoupdate'] = 'Auto-Update';
+$lng['error']['customized_version'] = 'It looks like your Froxlor installation has been customized, no support sorry.';
+$lng['error']['autoupdate_0'] = 'Unknown error';
+$lng['error']['autoupdate_1'] = 'PHP setting allow_url_fopen is disabled. Autoupdate needs this setting to be enabled in the php.ini';
+$lng['error']['autoupdate_2'] = 'PHP extension Zlib not found, please ensure it is installed and activated';
+$lng['error']['autoupdate_4'] = 'The froxlor archive could not be stored to the disk :(';
+$lng['error']['autoupdate_5'] = 'version.froxlor.org returned inacceptable values :(';
+$lng['error']['autoupdate_6'] = 'Woops, there was no (valid) version given to download :(';
+$lng['error']['autoupdate_7'] = 'The downloaded archive could not be found :(';
+$lng['error']['autoupdate_8'] = 'The archive could not be extraxted :(';
+$lng['error']['autoupdate_9'] = 'The MD5 sum of the downloaded file is not correct. Please try to update again.';
+
+$lng['admin']['server_php'] = 'PHP';
diff --git a/lng/lng_references.php b/lng/lng_references.php
index 5d874255..a25a3b0f 100644
--- a/lng/lng_references.php
+++ b/lng/lng_references.php
@@ -38,3 +38,6 @@ $lng['error']['notmorethanxopentickets'] = $lng['ticket']['notmorethanxopenticke
* other language-strings which need no translation
*/
$lng['domains']['ipandport_ssl_multi']['description'] = $lng['domains']['ipandport_multi']['description'];
+
+$lng['success']['noupdatesavail'] = $lng['update']['noupdatesavail'];
+$lng['error']['autoupdate_3'] = $lng['error']['customized_version'];