Upgrade from frontend

This commit is contained in:
OpenXE 2022-12-05 17:11:32 +00:00
parent c248cb16fb
commit e4773da6f0
4 changed files with 416 additions and 187 deletions

View File

@ -7,26 +7,21 @@
*
*/
function echo_output(array $output) {
echo(implode("\n",$output)."\n");
}
function abort(string $message) {
echo($message."\n");
echo("--------------- Aborted! ---------------\n");
}
class DatabaseConnectionInfo {
function __construct() {
require('../conf/user.inc.php');
require_once('../conf/user.inc.php');
}
}
$dbci = new DatabaseConnectionInfo;
$host = $dbci->WFdbhost;
$user = $dbci->WFdbuser;
$passwd = $dbci->WFdbpass;
$schema = $dbci->WFdbname;
require('../tools/database_compare/mustal_mysql_upgrade_tool.php');
$lockfile_name = "data/.in_progress.flag";
$remote_file_name = "data/remote.json";
$datafolder = "data";
$schema_file_name = "db_schema.json";
function git(string $command, &$output, bool $verbose, string $error_text) : int {
$output = array();
if ($verbose) {
@ -41,18 +36,21 @@ function git(string $command, &$output, bool $verbose, string $error_text) : int
return($retval);
}
function echo_output(array $output) {
echo("\n".implode("\n",$output)."\n");
}
function abort(string $message) {
echo($message."\n");
echo("--------------- Aborted! ---------------\n");
exit(-1);
}
// -------------------------------- START
// Check for correct call method
$directory = "";
if (php_sapi_name() == "cli") {
$cli = true;
$directory = ".";
} else if (basename(getcwd()) != 'upgrade') {
// Started from "www"
$directory = "../upgrade";
} else {
abort("Must be executed from 'upgrade' directory.");
return(-1);
}
if ($cli) {
if (in_array('-v', $argv)) {
$verbose = true;
} else {
@ -65,15 +63,39 @@ if (in_array('-f', $argv)) {
$force = false;
}
if (in_array('-do', $argv)) {
$do_upgrade = true;
} else {
$do_upgrade = false;
}
upgrade_main($directory, $verbose, $do_upgrade, $force);
}
// -------------------------------- END
function upgrade_main(string $directory,bool $verbose, bool $do_upgrade, bool $force) {
$dbci = new DatabaseConnectionInfo;
$host = $dbci->WFdbhost;
$user = $dbci->WFdbuser;
$passwd = $dbci->WFdbpass;
$schema = $dbci->WFdbname;
require_once($directory.'/../tools/database_compare/mustal_mysql_upgrade_tool.php');
$datafolder = $directory."/data";
$lockfile_name = $datafolder."/.in_progress.flag";
$remote_file_name = $datafolder."/remote.json";
$schema_file_name = "db_schema.json";
echo("--------------- OpenXE upgrade ---------------\n");
if (basename(getcwd()) != 'upgrade') {
abort("Must be executed from 'upgrade' directory.");
}
require_once($directory.'/../cronjobs/githash.php');
$remote_info_contents = file_get_contents($remote_file_name);
if (!$remote_info_contents) {
abort("Unable to load $remote_file_name");
return(-1);
}
$remote_info = json_decode($remote_info_contents, true);
@ -87,30 +109,48 @@ if ($retval == 128) {
$retval = git("init ..", $output,$verbose,"Error while initializing git!");
if ($retval != 0) {
abort("");
return(-1);
}
$retval = git("add ../.", $output,$verbose,"Error while initializing git!");
if ($retval != 0) {
abort("");
return(-1);
}
$retval = git("fetch ".$remote_info['host']." ".$remote_info['branch'], $output,$verbose,"Error while initializing git!");
if ($retval != 0) {
abort("");
return(-1);
}
$retval = git("checkout FETCH_HEAD -f", $output,$verbose,"Error while initializing git!");
if ($retval != 0) {
abort("");
return(-1);
}
}
if ($retval != 0) {
abort("Error while executing git!");
return(-1);
}
if ($verbose) {
echo("--------------- Update history ---------------\n");
$retval = git("log --date=short-local --pretty=\"%cd (%h): %s\" HEAD --not HEAD~4",$output,$verbose,"Error while showing history!");
if ($retval != 0) {
abort("");
return(-1);
}
}
if ($do_upgrade) {
if (!empty($output)) {
echo("There are modified files:");
echo_output($output);
if (!$force) {
abort("Clear modified files or use -f");
return(-1);
}
}
@ -128,6 +168,7 @@ if ($force) {
if ($retval != 0) {
echo_output($output);
abort("");
return(-1);
}
}
@ -135,12 +176,14 @@ $retval = git("pull ".$remote_info['host']." ".$remote_info['branch'],$output,$v
if ($retval != 0) {
echo_output($output);
abort("");
return(-1);
}
$retval = git("reset --hard",$output,$verbose,"Error while applying files!");
if ($retval != 0) {
echo_output($output);
abort("");
return(-1);
}
echo("--------------- Files upgrade completed ---------------\n");
@ -148,6 +191,7 @@ $retval = git("log -1 ",$output,$verbose,"Error while checking files!");
if ($retval != 0) {
echo_output($output);
abort("");
return(-1);
}
echo_output($output);
@ -164,8 +208,8 @@ echo("--------------- Loading from JSON... ---------------\n");
$compare_def = mustal_load_tables_from_json($datafolder, $schema_file_name);
if (empty($compare_def)) {
echo ("Could not load from JSON $schema_file_name\n");
exit;
abort("Could not load from JSON $schema_file_name\n");
return(-1);
}
echo("--------------- Comparing database '$schema@$host' vs. JSON '".$compare_def['database']."@".$compare_def['host']."' ---------------\n");
$compare_differences = mustal_compare_table_array($compare_def,"in JSON",$db_def,"in DB",true);
@ -178,8 +222,8 @@ $upgrade_sql = array();
$result = mustal_calculate_db_upgrade($compare_def, $db_def, $upgrade_sql, $mustal_replacers);
if ($result != 0) {
echo("Error: $result\n");
exit;
abort("Error: $result\n");
return(-1);
}
echo(count($upgrade_sql)." upgrade statements\n");
@ -233,9 +277,33 @@ if (!$mysqli) {
echo("--------------- Unlocking system ---------------\n");
unlink($lockfile_name);
}
else { // Dry run
echo("--------------- Dry run, use -do to upgrade ---------------\n");
echo("--------------- Fetching files... ---------------\n");
$retval = git("fetch ".$remote_info['host']." ".$remote_info['branch'],$output,$verbose,"Error while fetching files!");
if ($retval != 0) {
echo_output($output);
abort("");
}
echo("--------------- Pending upgrades: ---------------\n");
$retval = git("log --date=short-local --pretty=\"%cd (%h): %s\" FETCH_HEAD --not HEAD",$output,$verbose,"Error while fetching files!");
if (!$verbose) {
echo_output($output);
}
if (empty($output)) {
echo("No upgrades pending.\n");
}
if ($retval != 0) {
abort("");
}
}
echo("--------------- Done! ---------------\n");
exit(0);
return(0);
}

View File

@ -7107,6 +7107,7 @@ title: 'Abschicken',
$navarray['menu']['admin'][$menu]['sec'][] = array('Einstellungen','einstellungen','list');
$navarray['menu']['admin'][$menu]['sec'][] = array('Online-Shops / Marktplätze','onlineshops','list');
$navarray['menu']['admin'][$menu]['sec'][] = array('Backup','backup','list','recover','delete','reset');
$navarray['menu']['admin'][$menu]['sec'][] = array('Upgrade','upgrade','list','recover','delete','reset');
//$navarray['menu']['admin'][$menu]['sec'][] = array('AppStore','appstore','list');
$navarray['menu']['admin'][++$menu]['first'] = array('Mein Bereich','welcome','main');

View File

@ -0,0 +1,108 @@
<div id="tabs">
<ul>
<li><a href="#tabs-1"></a></li>
</ul>
<!-- Example for multiple tabs
<ul hidden">
<li><a href="#tabs-1">First Tab</a></li>
<li><a href="#tabs-2">Second Tab</a></li>
</ul>
-->
<div id="tabs-1">
[MESSAGE]
<form action="" method="post">
[FORMHANDLEREVENT]
<div class="row">
<div class="row-height">
<div class="col-xs-14 col-md-12 col-md-height">
<div class="inside inside-full-height">
<div class="row">
<div class="row-height">
<div class="col-xs-14 col-md-12 col-md-height">
<div class="inside inside-full-height">
<fieldset>
<legend>{|Aktuelle Version|}</legend>
<table width="100%" border="0" class="mkTableFormular">
<b>OpenXE [CURRENT]</b>
</table>
</fieldset>
</div>
</div>
</div>
</div>
<div [PENDING_VISIBLE] class="row">
<div class="row-height">
<div class="col-xs-14 col-md-12 col-md-height">
<div class="inside inside-full-height">
<fieldset>
<legend>{|Verf&uuml;gbare Upgrades|}</legend>
<table width="100%" border="0" class="mkTableFormular">
<pre style="white-space:pre-line;">
[OUTPUT_FROM_CLI]
</pre>
</table>
</fieldset>
</div>
</div>
</div>
</div>
<div [PROGRESS_VISIBLE] class="row">
<div class="row-height">
<div class="col-xs-12 col-md-12 col-full-height">
<div class="inside inside-full-height">
<fieldset>
<legend>{|Upgrade-Fortschritt|}</legend>
<table width="100%" border="0" class="mkTableFormular">
<pre style="white-space:pre-line;">
[OUTPUT_FROM_CLI]
</pre>
</table>
</fieldset>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="col-xs-14 col-md-2 col-md-height">
<div class="inside inside-full-height">
<fieldset>
<legend>{|Aktionen|}</legend>
<table width="100%" border="0" class="mkTableFormular">
<tr><td>{|Details anzeigen|}:</td><td><input type="checkbox" name="details_anzeigen" value=1 size="20"></td></tr>
<tr><td colspan=2><button name="submit" value="refresh" class="ui-button-icon" style="width:100%;">Auffrischen</button></td></tr>
<tr><td>{|Erzwingen (-f)|}:</td><td><input type="checkbox" name="erzwingen" value=1 size="20"></td></tr>
<tr><td colspan=2><button name="submit" value="do_upgrade" class="ui-button-icon" style="width:100%;">UPGRADE!</button></td></tr>
</table>
</fieldset>
</div>
</div>
</div>
</div>
</form>
</div>
<!-- Example for 2nd tab
<div id="tabs-2">
[MESSAGE]
<form action="" method="post">
[FORMHANDLEREVENT]
<div class="row">
<div class="row-height">
<div class="col-xs-12 col-md-12 col-md-height">
<div class="inside inside-full-height">
<fieldset>
<legend>{|...|}</legend>
<table width="100%" border="0" class="mkTableFormular">
...
</table>
</fieldset>
</div>
</div>
</div>
</div>
<input type="submit" name="submit" value="Speichern" style="float:right"/>
</form>
</div>
-->
</div>

52
www/pages/upgrade.php Normal file
View File

@ -0,0 +1,52 @@
<?php
/*
* Copyright (c) 2022 OpenXE project
*/
use Xentral\Components\Database\Exception\QueryFailureException;
class upgrade {
function __construct($app, $intern = false) {
$this->app = $app;
if ($intern)
return;
$this->app->ActionHandlerInit($this);
$this->app->ActionHandler("list", "upgrade_overview");
$this->app->DefaultActionHandler("list");
$this->app->ActionHandlerListen($app);
}
public function Install() {
/* Fill out manually later */
}
function upgrade_overview() {
$submit = $this->app->Secure->GetPOST('submit');
$verbose = $this->app->Secure->GetPOST('details_anzeigen') === '1';
$force = $this->app->Secure->GetPOST('erzwingen') === '1';
ob_start();
include("../upgrade/upgrade.php");
if ($submit == 'do_upgrade') {
$do_upgrade = true;
$this->app->Tpl->Set('PENDING_VISIBLE', "hidden");
} else {
$do_upgrade = false;
$this->app->Tpl->Set('PROGRESS_VISIBLE', "hidden");
}
upgrade_main("../upgrade",$verbose,$do_upgrade,$force);
$result = ob_get_contents();
ob_end_clean();
$this->app->Tpl->Set('CURRENT', $this->app->erp->Revision());
$this->app->Tpl->Set('OUTPUT_FROM_CLI',$result);
$this->app->Tpl->Parse('PAGE', "upgrade.tpl");
}
}