From 696f879a31dc5d0313b700f6a5bd7e6a1b93b055 Mon Sep 17 00:00:00 2001 From: kolaente Date: Thu, 10 Nov 2016 22:45:17 +0100 Subject: [PATCH] Added the ability to update System and apps seperatly --- admin/action.php | 126 --------- .../js/tinymce/skins/light/skin.min.css | 4 +- admin/general_config.php | 46 ++-- admin/install-dev.php | 2 +- admin/lang/lang.de.php | 32 ++- admin/lang/lang.en.php | 32 ++- admin/update.php | 255 ++++++++++++++++++ apps/Files/config.php | 2 + apps/SimplePages/config.php | 4 +- apps/logfiles/config.php | 2 + apps/meta/config.php | 2 + apps/sidebar/config.php | 2 + apps/testing/config.php | 2 + 13 files changed, 325 insertions(+), 186 deletions(-) create mode 100644 admin/update.php diff --git a/admin/action.php b/admin/action.php index f265005..ed13799 100755 --- a/admin/action.php +++ b/admin/action.php @@ -149,132 +149,6 @@ if (hasPerm('manage_system')) } } } - - //Update - if (isset($_GET['update'])) - { - printHeader($lang->get('general_update')); - if (hasPerm('update')) - { - $nextVersion = $MCONF['version_num'] + 1; - - //Check for version.json on the remote server - $dUri = $MCONF['update_uri'] . 'v' . $nextVersion . '/'; - if(remote_file_exists($dUri . 'version.json')) - { - $version_remote = json_decode(file_get_contents($dUri . 'version.json')); - //Check if the remote version is newer - if ($version_remote->versionNum > $MCONF['version_num']) - { - //Download the update - if (copy($dUri . 'update.v' . $version_remote->versionNum . '.incremental.zip', 'update.zip')) - { - //Check for md5 hash - if (md5_file('update.zip') == $version_remote->md5) - { - //unzip to temporary folder - $updateTmpDir = 'updateTmp/'; - if (!file_exists($updateTmpDir)) - { - if(mkdir($updateTmpDir, 0777) === false) - { - echo msg('fail', 'Error creating temporary folder.'); - } - } - - $zip = new ZipArchive; - $res = $zip->open('update.zip'); - if ($res === true) - { - $zip->extractTo($updateTmpDir); - $zip->close(); - $updateInfos = json_decode(file_get_contents($updateTmpDir . 'filesToUpdate.json')); - - $isUp = false; - $fTU = []; - foreach ($updateInfos->files as $num => $file) - { - $fTU[] = $file; - $upNeu = $updateTmpDir . $file; - $upRem = '../' . $file; - if (copy($upNeu, $upRem)) - { - echo msg('succes', sprintf($lang->get('action_update_item_succss'), $file)); - $isUp = true; - } else - { - echo msg('fail', sprintf($lang->get('action_update_item_fail'), $file)); - } - } - - //Update Version in Config File - $config = Yaml::parse(file_get_contents('../inc/config.yml', FILE_USE_INCLUDE_PATH)); - $config['Versioning']['version'] = $version_remote->version; - $config['Versioning']['version_num'] = $version_remote->versionNum; - $configfile = Yaml::dump($config); - if (!file_put_contents('../inc/config.yml', $configfile)) - { - echo msg('fail', $lang->get('action_update_config_fail')); - } - - //Remove "old" update - if (rrmdir($updateTmpDir) && $isUp && unlink('update.zip')) - { - echo msg('succes', $lang->get('action_update_succss') . ' ' . $lang->get('back') . ''); - } else - { - echo msg('fail', $lang->get('action_update_fail') . ' ' . $lang->get('back') . ''); - } - } else - { - echo msg('fail', $lang->get('action_update_fail_unzip')); - } - } else - { - echo msg('fail', $lang->get('action_update_md5_fake')); - } - } else - { - echo msg('fail', $lang->get('action_update_fail_copy')); - } - } else - { - echo msg('info', $lang->get('general_version_current_new')); - } - } else - { - echo msg('info', $lang->get('general_version_current_new')); - } - } - } - - //Show Changelog - if(isset($_GET['showChangelog'])) - { - printHeader($lang->get('general_showChangelog')); - echo '
'; - if(hasPerm('update')) - { - if(isset($_GET['v'])) - { - if(remote_file_exists($MCONF['update_uri'] . 'v' . $_GET['v'] . '/changelog.md')) - { - require_once '../inc/libs/Parsedown.php'; - $Parsedown = new Parsedown(); - echo $Parsedown->text(file_get_contents($MCONF['update_uri'] . 'v' . $_GET['v'] . '/changelog.md')); - } - } - else - { - echo 'Missing Version.'; - } - } - else - { - echo msg('info', $lang->get('missing_permission')); - } - echo '
'; - } } else { printHeader($lang->get('action_edit_content')); diff --git a/admin/assets/js/tinymce/skins/light/skin.min.css b/admin/assets/js/tinymce/skins/light/skin.min.css index e200385..bd75269 100755 --- a/admin/assets/js/tinymce/skins/light/skin.min.css +++ b/admin/assets/js/tinymce/skins/light/skin.min.css @@ -7,8 +7,8 @@ .mce-toolbar .mce-btn { background: #fff; border: 0; } .mce-toolbar .mce-btn i { color: #555; } .mce-toolbar .mce-btn:hover i { color: #333; } -.mce-primary { background: #6ba72b; } -.mce-primary:hover { background: #68a029; } +.mce-primary { background: #4CAF50; } +.mce-primary:hover { background: #4CAF50; } .mce-btn-group:not(:first-child) { border-left: 3px solid #fff; } .mce-menu-item:hover { background: #eee; } .mce-menu-item.mce-disabled * { color: #ddd !important; } diff --git a/admin/general_config.php b/admin/general_config.php index 149ba82..6ce41d9 100755 --- a/admin/general_config.php +++ b/admin/general_config.php @@ -40,39 +40,29 @@ tinymce(); { ?> -

get('general_version'); ?>

-

get('general_version_current'); ?>: +

get('update_version'); ?>

+

get('update_version_current'); ?>:

- versionNum > $MCONF['version_num']) - { - echo $lang->get('general_new_version') . ' ' . $version_remote->version . ' ' . $lang->get('general_update') . ''; - - //Check for Changelog - if(remote_file_exists($MCONF['update_uri'] . 'v' . $nextVersion . '/changelog.md')) - { - echo '  Changelog'; - } - } else - { - echo $lang->get('general_version_current_new'); - } - }else - { - echo $lang->get('general_version_current_new'); - } - ?> +

+
+ + + +
+
Überprüfe auf Updates...
+

+ + + '; require_once '../inc/footer.php'; ?> \ No newline at end of file diff --git a/admin/install-dev.php b/admin/install-dev.php index b74eb3b..1bd4315 100644 --- a/admin/install-dev.php +++ b/admin/install-dev.php @@ -71,7 +71,7 @@ if (isset($_POST['submit'])) $CONFIG['Templating']['tpl_webUri'] = 'website_uri'; $CONFIG['Versioning']['version'] = '0.94 Beta'; $CONFIG['Versioning']['version_num'] = 5; - $CONFIG['Versioning']['update_uri'] = 'https://cdn.kola-entertainments.de/cms/'; + $CONFIG['Versioning']['update_uri'][] = 'https://cdn.kola-entertainments.de/cms/'; $CONFIG['Mail']['smtp'] = false; //Mail Settings diff --git a/admin/lang/lang.de.php b/admin/lang/lang.de.php index f9ab1d0..7102cab 100755 --- a/admin/lang/lang.de.php +++ b/admin/lang/lang.de.php @@ -81,15 +81,9 @@ $lang['general_construction_mode'] = 'Baustellenzustand'; $lang['general_end_construction_mode'] = 'Baustellenzustand aufheben'; $lang['general_start_construction_mode'] = 'Seite in Baustellenzustand versetzen'; $lang['general_edit_message'] = 'Meldung bearbeiten'; -$lang['general_version'] = 'Version'; -$lang['general_version_current'] = 'Installierte Version'; -$lang['general_new_version'] = 'Neue Version verfügbar!'; -$lang['general_version_current_new'] = 'Die installierte Version ist aktuell.'; -$lang['general_update'] = 'Update'; $lang['general_database'] = 'Datenbank'; $lang['general_create_backup'] = 'Datenbank Backup erstellen'; $lang['general_go_phpmyadmin'] = 'Zu phpmyadmin'; -$lang['general_showChangelog'] = 'Changelog anzeigen'; /* * Manage Admins @@ -200,11 +194,21 @@ $lang['action_construction_confirm'] = 'Wollen Sie die Webseite wirklich in den $lang['action_construction_removed_success'] = 'Der Baustellenzustand wurde erfolgreich aufgehoben.'; $lang['action_construction_remove'] = 'Wollen Sie den Baustellenzustand wirklich aufheben?'; $lang['action_change_page_title_success'] = 'Die Änderungen des Seitentitels wurden erfolgreich gespeichert.'; -$lang['action_update_item_succss'] = '"%1$s" wurde erfolgreich upgedatet.'; -$lang['action_update_item_fail'] = 'Fehler beim Updaten von "%1$s"'; -$lang['action_update_succss'] = 'Mowie CMS wurde erfolgreich upgedatet.'; -$lang['action_update_fail'] = 'Fehler beim Updaten.'; -$lang['action_update_config_fail'] = 'Beim Bearbeiten der Configdatei ist ein Fehler aufgetreten.'; -$lang['action_update_fail_unzip'] = 'Fehler beim Entpacken des Updates.'; -$lang['action_update_md5_fake'] = 'Die Heruntergeladene Datei ist vermutlich falsch.'; -$lang['action_update_fail_copy'] = 'Fehler beim Herunterladen des Updates. Hinweis: Der Nutzer, unter welchem der Webserver läuft, muss im Verzeichnis /admin Schreibrechte haben!'; \ No newline at end of file + +//Update +$lang['update_title'] = 'Update'; +$lang['update_showChangelog'] = 'Changelog anzeigen'; +$lang['update_item_succss'] = '"%1$s" wurde erfolgreich upgedatet.'; +$lang['update_item_fail'] = 'Fehler beim Updaten von "%1$s"'; +$lang['update_succss'] = 'Mowie CMS wurde erfolgreich upgedatet.'; +$lang['update_app_succss'] = '"%1$s" wurde erfolgreich upgedatet.'; +$lang['update_fail'] = 'Fehler beim Updaten.'; +$lang['update_config_fail'] = 'Beim Bearbeiten der Configdatei ist ein Fehler aufgetreten.'; +$lang['update_fail_unzip'] = 'Fehler beim Entpacken des Updates.'; +$lang['update_md5_fake'] = 'Die Heruntergeladene Datei ist vermutlich falsch.'; +$lang['update_fail_copy'] = 'Fehler beim Herunterladen des Updates. Hinweis: Der Nutzer, unter welchem der Webserver läuft, muss im Verzeichnis /admin Schreibrechte haben!'; +$lang['update_version'] = 'Version'; +$lang['update_version_current'] = 'Installierte Version'; +$lang['update_new_version'] = 'Neue Version verfügbar!'; +$lang['update_version_current_new'] = 'Die installierte Version ist aktuell.'; +$lang['update_app_update_available'] = 'App-Update - Neue Version für "%1$s" verfügbar: %2$s'; \ No newline at end of file diff --git a/admin/lang/lang.en.php b/admin/lang/lang.en.php index 4022dd5..bcfef09 100755 --- a/admin/lang/lang.en.php +++ b/admin/lang/lang.en.php @@ -82,14 +82,9 @@ $lang['general_end_construction_mode'] = 'End Construction Mode'; $lang['general_start_construction_mode'] = 'Start Construction Mode'; $lang['general_edit_message'] = 'Edit Construction Message'; $lang['general_version'] = 'Version'; -$lang['general_version_current'] = 'Installed Version'; -$lang['general_new_version'] = 'New Version Available!'; -$lang['general_version_current_new'] = 'Installed Version is up-to-date'; -$lang['general_update'] = 'Update'; $lang['general_database'] = 'Database'; $lang['general_create_backup'] = 'Create Database Backup'; $lang['general_go_phpmyadmin'] = 'phpmyadmin'; -$lang['general_showChangelog'] = 'Show Changelog'; /* * Manage Admins @@ -200,11 +195,22 @@ $lang['action_construction_confirm'] = 'Are you sure you want to enable construc $lang['action_construction_removed_success'] = 'Construction Mode was successfully disabled.'; $lang['action_construction_remove'] = 'Are you sure you want to disable construction mode?'; $lang['action_change_page_title_success'] = 'Page Title was successfully edited.'; -$lang['action_update_item_succss'] = '"%1$s" was successfully updated.'; -$lang['action_update_item_fail'] = 'An error occured while updating "%1$s"'; -$lang['action_update_succss'] = 'Mowie CMS was updated successfully.'; -$lang['action_update_fail'] = 'An error occured while updating.'; -$lang['action_update_config_fail'] = 'An error occured while updating the config file.'; -$lang['action_update_fail_unzip'] = 'An error occured while unpacking the update.'; -$lang['action_update_md5_fake'] = 'The downloaded file has a wrong checksum.'; -$lang['action_update_fail_copy'] = 'An error occured while downloading the update. Hint: The webserver needs writing permissions in the folder /admin!'; \ No newline at end of file + + +//Update +$lang['update_title'] = 'Update'; +$lang['update_showChangelog'] = 'Show Changelog'; +$lang['update_item_succss'] = '"%1$s" was successfully updated.'; +$lang['update_item_fail'] = 'An error occured while updating "%1$s"'; +$lang['update_succss'] = 'Mowie CMS was updated successfully.'; +$lang['update_app_succss'] = '"%1$s" was updated successfully.'; +$lang['update_fail'] = 'An error occured while updating.'; +$lang['update_config_fail'] = 'An error occured while updating the config file.'; +$lang['update_fail_unzip'] = 'An error occured while unpacking the update.'; +$lang['update_md5_fake'] = 'The downloaded file has a wrong checksum.'; +$lang['update_fail_copy'] = 'An error occured while downloading the update. Hint: The webserver needs writing permissions in the folder /admin!'; +$lang['update_version'] = 'Version'; +$lang['update_version_current'] = 'Installed Version'; +$lang['update_new_version'] = 'New Version Available!'; +$lang['update_version_current_new'] = 'Installed Version is up-to-date'; +$lang['update_app_update_available'] = 'App-Update - New Version for "%1$s" available: %2$s'; \ No newline at end of file diff --git a/admin/update.php b/admin/update.php new file mode 100644 index 0000000..63b9355 --- /dev/null +++ b/admin/update.php @@ -0,0 +1,255 @@ +versionNum > $MCONF['version_num']) + { + $foundNewVersion = true; + + //Check for Changelog + if (remote_file_exists($updateUrl . '/changelog.md')) + { + $hasChangelog = $update_server; + } + } + } + } + + if ($foundNewVersion) + { + echo $lang->get('update_new_version') . ' ' . $version_remote->version . ' ' . $lang->get('update_title') . ''; + if ($hasChangelog !== false) + { + echo '  Changelog'; + } + } else + { + echo $lang->get('update_version_current_new'); + } + + //Check for App-Updates + foreach ($apps->getApps() as $appdir => $app) + { + if(isset($app['app_build'])) + { + $nextVersion = $app['app_build'] + 1; + $foundNewVersion = false; + $hasChangelog = false; + + foreach ($MCONF['update_uri'] as $update_server) + { + $updateUrl = $update_server . 'apps/' . str_replace(' ', '-', $app['app_name']) . '/v' . $nextVersion; + if (remote_file_exists($updateUrl . '/version.json')) + { + $version_remote = json_decode(file_get_contents($updateUrl . '/version.json')); + if ($version_remote->versionNum > $app['app_build']) + { + $foundNewVersion = true; + + //Check for Changelog + if (remote_file_exists($updateUrl . '/changelog.md')) + { + $hasChangelog = $update_server; + } + } + } + } + + if ($foundNewVersion) + { + echo '
'.sprintf($lang->get('update_app_update_available'), $app['app_name'], $version_remote->version). ' ' . $lang->get('update_title') . ''; + if ($hasChangelog !== false) + { + echo '  Changelog'; + } + } + } + } + } + exit; +} + +//Show Changelog +if (isset($_GET['showChangelog'])) +{ + printHeader($lang->get('update_showChangelog')); + echo '
'; + if (hasPerm('update')) + { + if(isset($_GET['server'])) + { + //If we want to see the changelog for an app, we need to look in a different directory + $remoteSubDir = 'System'; + if(isset($_GET['app'])) + { + $remoteSubDir = 'apps/'.$_GET['app']; + } + if (isset($_GET['v'])) + { + if (remote_file_exists(urldecode($_GET['server']) . $remoteSubDir . '/v' . $_GET['v'] . '/changelog.md')) + { + require_once '../inc/libs/Parsedown.php'; + $Parsedown = new Parsedown(); + echo $Parsedown->text(file_get_contents(urldecode($_GET['server']) . $remoteSubDir . '/v' . $_GET['v'] . '/changelog.md')); + } + } else + { + echo 'Missing Version.'; + } + } + else + { + echo 'Missing Server'; + } + } else + { + echo msg('info', $lang->get('missing_permission')); + } + echo ''.$lang->get('back').'
'; + exit; +} + + +//Update +if (isset($_GET['update'])) +{ + printHeader($lang->get('update_title')); + if (hasPerm('update')) + { + $updated = false; + foreach ($MCONF['update_uri'] as $update_server) + { + $nextVersion = $MCONF['version_num'] + 1; + $installedVersion = $MCONF['version_num']; + + //If we want to see the changelog for an app, we need to look in a different directory + $remoteSubDir = 'System'; + $systemSubDir = '../'; + if (isset($_GET['appUpdate'])) + { + require '../apps/' . urldecode($_GET['appUpdate']) . '/config.php'; + $remoteSubDir = 'apps/' . str_replace(' ', '-', $_CONF['app_name']); + $nextVersion = $_CONF['app_build'] + 1; + $systemSubDir = '../apps/' . urldecode($_GET['appUpdate']) . '/'; + $installedVersion = $_CONF['app_build']; + } + + //Check for version.json on the remote server + $dUri = $update_server . $remoteSubDir . '/v' . $nextVersion . '/'; + if (remote_file_exists($dUri . 'version.json')) + { + $version_remote = json_decode(file_get_contents($dUri . 'version.json')); + //Check if the remote version is newer + if ($version_remote->versionNum > $installedVersion) + { + //Download the update + if (copy($dUri . 'update.v' . $version_remote->versionNum . '.incremental.zip', 'update.zip')) + { + $updated = true; + //Check for md5 hash + if (md5_file('update.zip') == $version_remote->md5) + { + //unzip to temporary folder + $updateTmpDir = 'updateTmp/'; + if (!file_exists($updateTmpDir)) + { + if (mkdir($updateTmpDir, 0777) === false) + { + echo msg('fail', 'Error creating temporary folder.'); + } + } + + $zip = new ZipArchive; + $res = $zip->open('update.zip'); + if ($res === true) + { + $zip->extractTo($updateTmpDir); + $zip->close(); + $updateInfos = json_decode(file_get_contents($updateTmpDir . 'filesToUpdate.json')); + + $isUp = false; + $fTU = []; + foreach ($updateInfos->files as $num => $file) + { + $fTU[] = $file; + $upNeu = $updateTmpDir . $file; + $upRem = $systemSubDir . $file; + if (copy($upNeu, $upRem)) + { + echo msg('succes', sprintf($lang->get('update_item_succss'), $file)); + $isUp = true; + } else + { + echo msg('fail', sprintf($lang->get('update_item_fail'), $file)); + } + } + + //Update Version in Config File - only if we don't update an app + if (!isset($_GET['appUpdate'])) + { + $config = Yaml::parse(file_get_contents('../inc/config.yml', FILE_USE_INCLUDE_PATH)); + $config['Versioning']['version'] = $version_remote->version; + $config['Versioning']['version_num'] = $version_remote->versionNum; + $configfile = Yaml::dump($config); + if (!file_put_contents('../inc/config.yml', $configfile)) + { + echo msg('fail', $lang->get('general_config_fail')); + } + } + + //Remove "old" update + if (rrmdir($updateTmpDir) && $isUp && unlink('update.zip')) + { + if(isset($_GET['appUpdate'])) + { + echo msg('succes', sprintf($lang->get('update_app_succss'), $_CONF['app_name']) . ' ' . $lang->get('back') . ''); + } + else + { + echo msg('succes', $lang->get('update_succss') . ' ' . $lang->get('back') . ''); + } + } else + { + echo msg('fail', $lang->get('update_fail') . ' ' . $lang->get('back') . ''); + } + } else + { + echo msg('fail', $lang->get('update_fail_unzip')); + } + } else + { + echo msg('fail', $lang->get('update_md5_fake')); + } + } else + { + echo msg('fail', $lang->get('update_fail_copy')); + } + } else + { + echo msg('info', $lang->get('update_version_current_new')); + } + } + } + + if(!$updated) + { + echo msg('info', $lang->get('update_version_current_new')); + } + } +} \ No newline at end of file diff --git a/apps/Files/config.php b/apps/Files/config.php index 39964fc..3994245 100755 --- a/apps/Files/config.php +++ b/apps/Files/config.php @@ -4,6 +4,8 @@ $GLOBALS['lang']->set('Manage Files', 'files_title', 'en'); $_CONF['app_name'] = 'Files'; $_CONF['app_desc'] = 'Ein Modul zum Anzeigen & Uploaden von Dateien'; +$_CONF['app_build'] = 1; +$_CONF['app_version'] = 'v0.9 Beta'; $_CONF['menu_top'] = ' '.$GLOBALS['lang']->get('files_title'); $_CONF['menu'] = ['menu_top' => 'index.php']; $_CONF['type'] = 'none'; diff --git a/apps/SimplePages/config.php b/apps/SimplePages/config.php index acd4088..5047228 100755 --- a/apps/SimplePages/config.php +++ b/apps/SimplePages/config.php @@ -12,6 +12,8 @@ $GLOBALS['lang']->set('Create New Page', 'sp_create_new', 'en'); $_CONF['app_name'] = 'SimplePages'; $_CONF['app_desc'] = 'Wird benutzt, um Einfache statische Seitn zu erzeugen und zu verwalten.'; +$_CONF['app_build'] = 1; +$_CONF['app_version'] = 'v0.9 Beta'; $_CONF['base_url'] = '/'; //Basisurl des moduls, wenn es über das Frontend aufgerufen wird $_CONF['base_file'] = 'front/page.php'; //Datei, die angezeigt wird, wenn die basisurl aufgerufen wird $_CONF['menu_top'] = ' '.$GLOBALS['lang']->get('sp_pages'); //Name des Moduls, wie es im Adminbereich im Hauptmenü auftaucht @@ -42,5 +44,3 @@ if(file_exists($iniFile)) $db->get(); if(isset($db->data[0])) $confirmationUserMail = $db->data[0]['mail'];*/ } - -//print_r($config); \ No newline at end of file diff --git a/apps/logfiles/config.php b/apps/logfiles/config.php index bbe1172..cefa15c 100755 --- a/apps/logfiles/config.php +++ b/apps/logfiles/config.php @@ -5,6 +5,8 @@ $GLOBALS['lang']->set('Logfiles', 'log_title', 'en'); $_CONF['app_name'] = 'Logfiles'; $_CONF['app_desc'] = 'Logfiles'; +$_CONF['app_build'] = 1; +$_CONF['app_version'] = 'v0.9 Beta'; //$_CONF['base_url'] = 'demomodul/'; //Basisurl des moduls, wenn es über das Frontend aufgerufen wird $_CONF['base_file'] = 'log.php'; //Datei, die angezeigt wird, wenn die basisurl aufgerufen wird $_CONF['menu_top'] = ' '.$GLOBALS['lang']->get('log_title'); //Name des Moduls, wie es im Adminbereich im Hauptmenü auftaucht diff --git a/apps/meta/config.php b/apps/meta/config.php index 025102f..8d4ead1 100755 --- a/apps/meta/config.php +++ b/apps/meta/config.php @@ -1,6 +1,8 @@