Compare commits

...

10 Commits

Author SHA1 Message Date
OpenXE
23f390a74f upgrade initialize git repository if there is none 2022-12-03 16:27:00 +00:00
OpenXE
8cc64aee19 bugfix mustal, upgrade remove stash, do reset instead 2022-12-03 15:59:00 +00:00
OpenXE
36501a5013 Mustal upgrade tool & utf8mb3 definition 2022-12-03 15:43:30 +00:00
OpenXE
c1c963624d Mustal upgrade tool & utf8mb3 definition 2022-12-03 12:06:01 +00:00
OpenXE
a041c6a82c Merge branch 'master' into develop 2022-12-03 11:43:11 +00:00
OpenXE
4815e61883 Upgrade system with git and database upgrade 2022-12-03 11:41:52 +00:00
OpenXE
1a343b4b55 Bugfix www/pages/shopimporter_shopware6.php typo 2022-12-03 10:03:28 +00:00
OpenXE
b70676f4a0 Merge branch 'master' into develop 2022-12-02 13:25:22 +00:00
OpenXE
9b62b7c247 Merge branch 'master' into develop 2022-12-02 12:15:36 +00:00
OpenXE
ae261d7a47 Removed xentral update functions 2022-12-02 11:20:02 +00:00
21 changed files with 230426 additions and 15946 deletions

View File

@ -1,726 +0,0 @@
<?php
/*
**** COPYRIGHT & LICENSE NOTICE *** DO NOT REMOVE ****
*
* Xentral (c) Xentral ERP Sorftware GmbH, Fuggerstrasse 11, D-86150 Augsburg, * Germany 2019
*
* This file is licensed under the Embedded Projects General Public License *Version 3.1.
*
* You should have received a copy of this license from your vendor and/or *along with this file; If not, please visit www.wawision.de/Lizenzhinweis
* to obtain the text of the corresponding license version.
*
**** END OF COPYRIGHT & LICENSE NOTICE *** DO NOT REMOVE ****
*/
?>
<?php
final class DatabaseUpgrade
{
/** @var Application $app */
private $app;
/** @var array $CheckColumnTableCache */
private $CheckColumnTableCache;
/** @var bool $check_column_missing_run */
private $check_column_missing_run=false;
/** @var array $check_column_missing */
private $check_column_missing=array();
/** @var array $check_index_missing */
private $check_index_missing=array();
/** @var array */
private $allTables = [];
/** @var array */
private $indexe = [];
/**
* @param Application $app
*/
public function __construct($app)
{
$this->app = $app;
}
public function emptyTableCache(){
$this->CheckColumnTableCache = [];
$this->allTables = [];
$this->indexe = [];
}
/**
* @var bool $force
*
* @return array
*/
public function getAllTables($force = false)
{
if($force || empty($this->allTables)) {
$this->allTables = $this->app->DB->SelectFirstCols('SHOW TABLES');
}
return $this->allTables;
}
/**
* @param string $table
* @param string $pk
*/
public function createTable($table, $pk = 'id')
{
$sql = "CREATE TABLE `$table` (`".$pk."` INT NOT NULL AUTO_INCREMENT, PRIMARY KEY (`".$pk."`)) ENGINE = InnoDB DEFAULT CHARSET=utf8";
$this->app->DB->Query($sql);
$this->addPrimary($table, $pk);
}
/**
* @param string $table
* @param string $pk
*/
public function addPrimary($table, $pk = 'id')
{
$this->CheckAlterTable(
"ALTER TABLE `$table`
ADD PRIMARY KEY (`".$pk."`)",
true
);
$this->CheckAlterTable(
"ALTER TABLE `$table`
MODIFY `".$pk."` int(11) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=1",
true
);
}
/**
* @param string $table
* @param bool $force
*
* @return array
*/
public function getIndexeCached($table, $force = false)
{
if($force || !isset($this->indexe[$table])){
$this->indexe[$table] = $this->app->DB->SelectArr(sprintf('SHOW INDEX FROM `%s`', $table));
if($this->indexe[$table] === null) {
$this->indexe[$table] = [];
}
}
return $this->indexe[$table];
}
/**
* @param string $table
*/
public function clearIndexCached($table)
{
if(!isset($this->indexe[$table])) {
return;
}
unset($this->indexe[$table]);
}
/**
* @param string $table
* @param string $pk
*/
public function hasPrimaryKey($table, $pk = 'id')
{
$indexe = $this->getIndexeCached($table);
if(empty($indexe)) {
return false;
}
foreach($indexe as $index) {
if($index['Column_name'] === $pk
&& $index['Key_name'] === 'PRIMARY'
&& (int)$index['Non_unique'] === 0
) {
return true;
}
}
return false;
}
/**
* @param string $table
* @param string $pk
*
* @return void
*/
function CheckTable($table, $pk = 'id')
{
if($pk === 'id') {
$tables = $this->getAllTables();
if(!empty($tables)){
if(!in_array($table, $tables)){
$this->createTable($table, $pk);
return;
}
if(!$this->hasPrimaryKey($table, $pk)) {
$this->addPrimary($table, $pk);
}
return;
}
}
$found = false;
$tables = $this->getAllTables(true);
if($tables) {
$found = in_array($table, $tables);
}
else{
$check = $this->app->DB->Select("SELECT $pk FROM `$table` LIMIT 1");
if($check) {
$found = true;
}
}
if($found==false)
{
$sql = "CREATE TABLE `$table` (`".$pk."` INT NOT NULL AUTO_INCREMENT, PRIMARY KEY (`".$pk."`)) ENGINE = InnoDB DEFAULT CHARSET=utf8";
$this->app->DB->Update($sql);
$this->CheckAlterTable("ALTER TABLE `$table`
ADD PRIMARY KEY (`".$pk."`)");
$this->CheckAlterTable("ALTER TABLE `$table`
MODIFY `".$pk."` int(11) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=1");
}
if($pk !== 'id') {
$this->CheckColumn('created_at','timestamp',$table,"DEFAULT CURRENT_TIMESTAMP NOT NULL");
}
}
/**
* @param string $column
* @param string $type
* @param string $table
* @param string $default
*
* @return void
*/
function UpdateColumn($column,$type,$table,$default="NOT NULL")
{
$fields = $this->app->DB->SelectArr("show columns from `".$table."`");
if($fields)
{
foreach($fields as $val)
{
$field_array[] = $val['Field'];
}
}
if (in_array($column, $field_array))
{
$this->app->DB->Query('ALTER TABLE `'.$table.'` CHANGE `'.$column.'` `'.$column.'` '.$type.' '.$default.';');
}
}
/**
* @param string $column
* @param string $table
*
* @return void
*/
public function DeleteColumn($column,$table)
{
$this->app->DB->Query('ALTER TABLE `'.$table.'` DROP `'.$column.'`;');
}
/**
* @param string $column
* @param string $type
* @param string $table
* @param string $default
*
* @return void
*/
public function CheckColumn($column,$type,$table,$default="")
{
if($table === 'firmendaten')
{
if($this->app->DB->Select("SELECT `id` FROM `firmendaten_werte` WHERE `name` = '$column' LIMIT 1"))return;
}
if(!isset($this->CheckColumnTableCache[$table]))
{
$tmp=$this->app->DB->SelectArr("show columns from `".$table."`");
if($tmp)
{
foreach($tmp as $val)
{
$this->CheckColumnTableCache[$table][] = $val['Field'];
//$types[$val['Field']] = strtolower($val['Type']);
}
}
}
if (isset($this->CheckColumnTableCache[$table]) && !in_array($column, $this->CheckColumnTableCache[$table]))
{
if($this->check_column_missing_run)
{
//$result = mysqli_query($this->app->DB->connection,'ALTER TABLE `'.$table.'` ADD `'.$column.'` '.$type.' '.$default.';');
$this->check_column_missing[$table][]=$column;
} else {
$result = $this->app->DB->Query('ALTER TABLE `'.$table.'` ADD `'.$column.'` '.$type.' '.$default.';');
if($table === 'firmendaten' && $this->app->DB->error())
{
if((method_exists($this->app->DB, 'errno2') && $this->app->DB->errno() == '1118')
|| strpos($this->app->DB->error(),'Row size too large') !== false
)
{
$this->ChangeFirmendatenToMyIsam();
$this->app->DB->Query('ALTER TABLE `'.$table.'` ADD `'.$column.'` '.$type.' '.$default.';');
}
}
}
}
}
/**
* @param array $indexe
*
* @return array
*/
protected function getGroupedIndexe($indexe)
{
if(empty($indexe)) {
return $indexe;
}
$return = [];
foreach($indexe as $index) {
$keyName = $index['Key_name'];
$isUnique = $index['Non_unique'] == '0';
$seq = $index['Seq_in_index'];
$columnName = $index['Column_name'];
$return[$isUnique?'unique':'index'][$keyName][(int)$seq - 1] = $columnName;
}
return $return;
}
/**
* @param array $indexe
*
* @return array
*/
protected function getDoubleIndexeFromGroupedIndexe($indexe)
{
if(empty($indexe)) {
return [];
}
$ret = [];
foreach($indexe as $type => $indexArrs) {
$columnStrings = [];
foreach($indexArrs as $indexKey => $columns) {
$columnString = implode('|', $columns);
if(in_array($columnString, $columnStrings)) {
$ret[$type][] = $indexKey;
continue;
}
$columnStrings[] = $columnString;
}
}
return $ret;
}
/**
* @param string $table
* @param array $indexe
* @param bool $noCache
*
* @return array|null
*/
public function CheckDoubleIndex($table, $indexe, $noCache = false)
{
$query = $noCache?null:$this->CheckAlterTable("SHOW INDEX FROM `$table`");
if(!$query) {
$indexeGrouped = $this->getGroupedIndexe($indexe);
$doubleIndexe = $this->getDoubleIndexeFromGroupedIndexe($indexeGrouped);
if(!empty($doubleIndexe)) {
$indexe = $this->getIndexeCached($table, true);
$indexeGrouped = $this->getGroupedIndexe($indexe);
$doubleIndexe = $this->getDoubleIndexeFromGroupedIndexe($indexeGrouped);
if(empty($doubleIndexe)) {
return $indexe;
}
foreach($doubleIndexe as $type => $doubleIndex) {
foreach($doubleIndex as $indexName) {
$this->app->DB->Query("ALTER TABLE `".$table."` DROP INDEX `".$indexName."`");
}
}
}
elseif($noCache) {
return $indexe;
}
$this->CheckAlterTable("SHOW INDEX FROM `$table`", true);
return $this->getIndexeCached($table, true);
}
if(empty($indexe) || count($indexe) == 1){
return $indexe;
}
$uniquearr = array();
$indexarr = array();
foreach($indexe as $index)
{
if($index['Key_name'] !== 'PRIMARY' && !empty($index['Column_name']))
{
if($index['Non_unique'])
{
$indexarr[$index['Key_name']][] = $index['Column_name'];
}else{
$uniquearr[$index['Key_name']][] = $index['Column_name'];
}
}
}
$cindex = count($indexarr);
$cuniqe = count($uniquearr);
$changed = false;
if($cindex > 1)
{
$check = array();
foreach($indexarr as $key => $value)
{
if(empty($value))
{
continue;
}
if(count($value) > 1){
sort($value);
}
$vstr = implode(',', $value);
if(in_array($vstr, $check))
{
$this->app->DB->Query("DROP INDEX `".$key."` ON `".$table."`");
$changed = true;
}else{
$check[] = $vstr;
}
}
}
if($cuniqe > 1)
{
$check = array();
foreach($uniquearr as $key => $value)
{
if(empty($value))
{
continue;
}
if(count($value) > 1){
sort($value);
}
$vstr = implode(',', $value);
if(in_array($vstr, $check))
{
$this->app->DB->Query("DROP UNIQUE `".$key."` ON `".$table."`");
$changed = true;
}else{
$check[] = $vstr;
}
}
}
if($changed) {
return $this->getIndexeCached($table, true);
}
return $indexe;
}
/**
* @param string $table
* @param string|array $column
*
* @return bool
*/
public function CheckFulltextIndex($table,$column)
{
if(empty($table) || empty($column))
{
return false;
}
if(!is_array($column))
{
$column = [$column];
}
$columnmasked = [];
foreach($column as $keyColumn => $valueColumn)
{
if(!empty($valueColumn))
{
$columnmasked[] = "`$valueColumn`";
}else{
unset($column[$keyColumn]);
}
}
if(empty($column))
{
return false;
}
$columnsFound = [];
$indexe = $this->getIndexeCached($table, true);
$indexeFound = [];
if(!empty($indexe))
{
foreach($indexe as $index)
{
if($index['Index_type'] === 'FULLTEXT')
{
$indexeFound[] = $index['Column_name'];
if(!in_array($index['Column_name'], $columnsFound))
{
$columnsFound[] = $index['Column_name'];
}
}
}
$cindexeFound = count($indexeFound);
$column = count($column);
if(($column === $cindexeFound) && (count($columnsFound) === $column))
{
return true;
}
if($cindexeFound > 0)
{
return false;
}
}
$this->app->DB->Query(
"ALTER TABLE `$table`
ADD FULLTEXT INDEX `FullText`
(".implode(',',$columnmasked).");"
);
$error = $this->app->DB->error();
return empty($error);
}
/**
* @param string $table
* @param string $column
* @param bool $unique
*
* @return void
*/
function CheckIndex($table, $column, $unique = false)
{
$indexex = null;
$indexexother = null;
$indexe = $this->getIndexeCached($table);
if($indexe)
{
$indexe = $this->CheckDoubleIndex($table, $indexe, true);
foreach($indexe as $index)
{
if(is_array($column) && $index['Key_name'] !== 'PRIMARY')
{
if($unique && !$index['Non_unique'])
{
if(in_array($index['Column_name'], $column))
{
$indexex[$index['Key_name']][$index['Column_name']] = true;
}else{
$indexexother[$index['Key_name']][$index['Column_name']] = true;
}
}
elseif(!$unique){
if(in_array($index['Column_name'], $column)) {
$indexex[$index['Key_name']][$index['Column_name']] = true;
}
}
}
elseif(!is_array($column)){
if($index['Column_name'] == $column)
{
return;
}
}
}
if($this->check_column_missing_run)
{
$this->check_index_missing[$table][] = $column;
}
if(!$unique)
{
if(is_array($column))
{
if($indexex)
{
foreach($indexex as $k => $v) {
if(count($v) === 1 && count($column) > 1) {
$this->app->DB->Query("DROP INDEX `".$k."` ON `".$table."`");
$this->clearIndexCached($table);
unset($indexex[$k]);
}
}
foreach($indexex as $k => $v)
{
if(count($v) == count($column)){
return;
}
}
foreach($indexex as $k => $v)
{
if(!isset($indexexother[$k]))
{
$this->app->DB->Query("DROP INDEX `".$k."` ON `".$table."`");
$cols = null;
foreach($column as $c) {
$cols[] = "`$c`";
}
$this->CheckAlterTable("ALTER TABLE `$table` ADD INDEX(".implode(', ',$cols)."); ",true);
$this->clearIndexCached($table);
return;
}
}
}
$cols = null;
foreach($column as $c) {
$cols[] = "`$c`";
}
$this->CheckAlterTable("ALTER TABLE `$table` ADD INDEX(".implode(', ',$cols)."); ", true);
$this->clearIndexCached($table);
}
else{
$this->CheckAlterTable("ALTER TABLE `$table` ADD INDEX(`$column`); ", true);
$this->clearIndexCached($table);
}
}
else{
if(is_array($column))
{
if($indexex)
{
foreach($indexex as $k => $v)
{
if(count($v) == count($column))
{
return;
}
}
foreach($indexex as $k => $v)
{
if(!isset($indexexother[$k]))
{
$this->app->DB->Query("DROP INDEX `".$k."` ON `".$table."`");
$cols = null;
foreach($column as $c) {
$cols[] = "`$c`";
}
$this->CheckAlterTable("ALTER TABLE `$table` ADD UNIQUE(".implode(', ',$cols)."); ", true);
$this->clearIndexCached($table);
return;
}
}
}
$cols = null;
foreach($column as $c) {
$cols[] = "`$c`";
}
$this->CheckAlterTable("ALTER TABLE `$table` ADD UNIQUE(".implode(', ',$cols)."); ", true);
$this->clearIndexCached($table);
}else{
$this->CheckAlterTable("ALTER TABLE `$table` ADD UNIQUE(`$column`); ", true);
$this->clearIndexCached($table);
}
}
}
elseif(!is_array($column))
{
if(!$unique)
{
$this->CheckAlterTable("ALTER TABLE `$table` ADD INDEX(`$column`); ");
}else{
$this->CheckAlterTable("ALTER TABLE `$table` ADD UNIQUE(`$column`); ");
}
$this->clearIndexCached($table);
}
elseif(is_array($column))
{
$cols = null;
foreach($column as $c) {
$cols[] = "`$c`";
}
$this->CheckAlterTable("ALTER TABLE `$table` ADD UNIQUE(".implode(', ',$cols)."); ");
$this->clearIndexCached($table);
}
}
/**
* @param string $sql
* @param bool $force
*
* @return mysqli_result|bool
*/
function CheckAlterTable($sql, $force = false)
{
$sqlmd5 = md5($sql);
$check = $this->app->DB->Select("SELECT id FROM checkaltertable WHERE checksum='$sqlmd5' LIMIT 1");
if($check > 0 && !$force) return;
$query = $this->app->DB->Query($sql);
if($query && empty($check) && !$this->app->DB->error()){
$this->app->DB->Insert("INSERT INTO checkaltertable (id,checksum) VALUES ('','$sqlmd5')");
}
return $query;
}
/**
* @return void
*/
public function ChangeFirmendatenToMyIsam()
{
$this->app->DB->Query("ALTER TABLE firmendaten ENGINE = MyISAM;");
}
/**
* @param string $table
*
* @return array
*/
public function getSortedIndexColumnsByIndexName($table): array
{
$indexesByName = [];
$indexes = $this->app->DB->SelectArr(sprintf('SHOW INDEX FROM `%s`', $table));
if(empty($indexes)) {
return $indexesByName;
}
foreach($indexes as $index) {
$indexesByName[$index['Key_name']][] = $index['Column_name'];
}
foreach($indexesByName as $indexName => $columns) {
$columns = array_unique($columns);
sort($columns);
$indexesByName[$indexName] = $columns;
}
return $indexesByName;
}
/**
* @deprecated will be removed in 21.4
*
* @param string $table
* @param array $columns
*/
public function dropIndex($table, $columns): void
{
if(empty($table) || empty($columns)) {
return;
}
$columns = array_unique($columns);
sort($columns);
$countColumns = count($columns);
$indexes = $this->getSortedIndexColumnsByIndexName($table);
if(empty($indexes)) {
return;
}
foreach($indexes as $indexName => $indexColumns) {
if(count($indexColumns) !== $countColumns) {
continue;
}
if(count(array_intersect($indexColumns, $columns)) === $countColumns) {
$this->app->DB->Query(sprintf('ALTER TABLE `%s` DROP INDEX `%s`', $table, $indexName));
}
}
}
}

View File

@ -53,9 +53,7 @@ MariaDB [openxe]> show keys from wiki;
*/
function implode_with_quote(string $quote, string $delimiter, array $array_to_implode) : string {
return($quote.implode($quote.$delimiter.$quote, $array_to_implode).$quote);
}
require('mustal_mysql_upgrade_tool.php');
$connection_info_file_name = "connection_info.json";
$target_folder = ".";
@ -71,12 +69,6 @@ $color_green = "\033[32m";
$color_yellow = "\033[33m";
$color_default = "\033[39m";
// These default values will not be in quotes
$replacers = [
['current_timestamp','current_timestamp()'],
['on update current_timestamp','on update current_timestamp()']
];
// -------------------------------- START
echo("\n");
@ -144,7 +136,7 @@ if ($argc > 1) {
$schema = $connection_info['database'];
echo("--------------- Loading from database '$schema@$host'... ---------------\n");
$db_def = load_tables_from_db($host, $schema, $user, $passwd, $replacers);
$db_def = mustal_load_tables_from_db($host, $schema, $user, $passwd, $mustal_replacers);
if (empty($db_def)) {
echo ("Could not load from $schema@$host\n");
@ -157,7 +149,7 @@ if ($argc > 1) {
echo("--------------- Export to JSON... ---------------\n");
// $result = save_tables_to_csv($db_def, $target_folder, $tables_file_name_wo_folder, $delimiter, $quote, $keys_postfix, $force);
$result = save_tables_to_json($db_def, $target_folder, $tables_file_name_wo_folder, $force);
$result = mustal_save_tables_to_json($db_def, $target_folder, $tables_file_name_wo_folder, $force);
if ($result != 0) {
@ -177,7 +169,7 @@ if ($argc > 1) {
$compare_differences = array();
echo("--------------- Loading from JSON... ---------------\n");
$compare_def = load_tables_from_json($target_folder, $tables_file_name_wo_folder);
$compare_def = mustal_load_tables_from_json($target_folder, $tables_file_name_wo_folder);
if (empty($compare_def)) {
echo ("Could not load from JSON $tables_file_name_w_folder\n");
@ -205,7 +197,7 @@ if ($argc > 1) {
}*/
echo("--------------- Comparing database '$schema@$host' vs. JSON '".$compare_def['database']."@".$compare_def['host']."' ---------------\n");
$compare_differences = compare_table_array($compare_def,"in JSON",$db_def,"in DB",true);
$compare_differences = mustal_compare_table_array($compare_def,"in JSON",$db_def,"in DB",true);
echo((empty($compare_differences)?0:count($compare_differences))." differences.\n");
if ($verbose) {
@ -227,194 +219,14 @@ if ($argc > 1) {
echo("--------------- Calculating database upgrade for '$schema@$host'... ---------------\n");
$upgrade_sql = array();
if (count($compare_differences) > 0) {
$upgrade_sql[] = ("SET SQL_MODE='ALLOW_INVALID_DATES';");
$result = mustal_calculate_db_upgrade($compare_def, $db_def, $upgrade_sql);
if ($result != 0) {
echo("Error: $result\n");
exit;
}
$compare_differences = compare_table_array($compare_def,"in JSON",$db_def,"in DB",true);
foreach ($compare_differences as $compare_difference) {
switch ($compare_difference['type']) {
case 'Table existance':
// Get table definition from JSON
$table_name = $compare_difference['in JSON'];
$table_key = array_search($table_name,array_column($compare_def['tables'],'name'));
if ($table_key !== false) {
$table = $compare_def['tables'][$table_key];
switch ($table['type']) {
case 'BASE TABLE':
// Create table in DB
$sql = "";
$sql = "CREATE TABLE `".$table['name']."` (";
$comma = "";
foreach ($table['columns'] as $column) {
$sql .= $comma."`".$column['Field']."` ".column_sql_definition($table_name, $column,array_column($replacers,1));
$comma = ", ";
}
// Add keys
$comma = ", ";
foreach ($table['keys'] as $key) {
if ($key['Key_name'] == 'PRIMARY') {
$keystring = "PRIMARY KEY ";
} else {
if(array_key_exists('Index_type', $key)) {
$index_type = $key['Index_type'];
} else {
$index_type = "";
}
$keystring = $index_type." KEY `".$key['Key_name']."` ";
}
$sql .= $comma.$keystring."(`".implode("`,`",$key['columns'])."`) ";
}
$sql .= ")";
$upgrade_sql[] = $sql;
break;
default:
echo("Upgrade type '".$table['type']."' on table '".$table['name']."' not supported.\n");
break;
}
} else {
echo("Error table_key while creating upgrade for table existance `$table_name`.\n");
}
break;
case 'Column existance':
$table_name = $compare_difference['table'];
$column_name = $compare_difference['in JSON'];
$table_key = array_search($table_name,array_column($compare_def['tables'],'name'));
if ($table_key !== false) {
$table = $compare_def['tables'][$table_key];
$columns = $table['columns'];
$column_key = array_search($column_name,array_column($columns,'Field'));
if ($column_key !== false) {
$column = $table['columns'][$column_key];
$sql = "ALTER TABLE `$table_name` ADD COLUMN `".$column_name."` ";
$sql .= column_sql_definition($table_name, $column, array_column($replacers,1));
$sql .= ";";
$upgrade_sql[] = $sql;
}
else {
echo("Error column_key while creating column '$column_name' in table '".$table['name']."'\n");
}
}
else {
echo("Error table_key while creating upgrade for column existance '$column_name' in table '$table_name'.\n");
}
// Add Column in DB
break;
case 'Column definition':
$table_name = $compare_difference['table'];
$column_name = $compare_difference['column'];
$table_key = array_search($table_name,array_column($compare_def['tables'],'name'));
if ($table_key !== false) {
$table = $compare_def['tables'][$table_key];
$columns = $table['columns'];
$column_names = array_column($columns,'Field');
$column_key = array_search($column_name,$column_names);
if ($column_key !== false) {
$column = $table['columns'][$column_key];
$sql = "ALTER TABLE `$table_name` MODIFY COLUMN `".$column_name."` ";
$sql .= column_sql_definition($table_name, $column,array_column($replacers,1));
$sql .= ";";
$upgrade_sql[] = $sql;
}
else {
echo("Error column_key while modifying column '$column_name' in table '".$table['name']."'\n");
exit;
}
}
else {
echo("Error table_key while modifying column '$column_name' in table '$table_name'.\n");
}
// Modify Column in DB
break;
case "Key definition":
$table_name = $compare_difference['table'];
$key_name = $compare_difference['key'];
$table_key = array_search($table_name,array_column($compare_def['tables'],'name'));
if ($table_key !== false) {
$table = $compare_def['tables'][$table_key];
$keys = $table['keys'];
$key_names = array_column($keys,'Key_name');
$key_key = array_search($key_name,$key_names);
if ($key_key !== false) {
$key = $table['keys'][$key_key];
$sql = "ALTER TABLE `$table_name` DROP KEY `".$key_name."`;";
$upgrade_sql[] = $sql;
$sql = "ALTER TABLE `$table_name` ADD KEY `".$key_name."` ";
$sql .= "(`".implode("`,`",$key['columns'])."`)";
$sql .= ";";
$upgrade_sql[] = $sql;
}
else {
echo("Error key_key while changing key '$key_name' in table '".$table['name']."'\n");
exit;
}
}
else {
echo("Error table_key while changing key '$key_name' in table '$table_name'.\n");
}
break;
case 'Key existance':
$table_name = $compare_difference['table'];
$key_name = $compare_difference['in JSON'];
$table_key = array_search($table_name,array_column($compare_def['tables'],'name'));
if ($table_key !== false) {
$table = $compare_def['tables'][$table_key];
$keys = $table['keys'];
$key_names = array_column($keys,'Key_name');
$key_key = array_search($key_name,$key_names);
if ($key_key !== false) {
$key = $table['keys'][$key_key];
$sql = "ALTER TABLE `$table_name` ADD KEY `".$key_name."` ";
$sql .= "(`".implode("`,`",$key['columns'])."`)";
$sql .= ";";
$upgrade_sql[] = $sql;
}
else {
echo("Error key_key while adding key '$key_name' in table '".$table['name']."'\n");
exit;
}
}
else {
echo("Error table_key while adding key '$key_name' in table '$table_name'.\n");
}
break;
case 'Table count':
// Nothing to do
break;
case 'Table type':
echo("Upgrade type '".$compare_difference['type']."' on table '".$compare_difference['table']."' not supported.\n");
break;
default:
echo("Upgrade type '".$compare_difference['type']."' not supported.\n");
break;
}
}
$upgrade_sql = array_unique($upgrade_sql);
echo("--------------- Database upgrade for '$schema@$host'... ---------------\n");
if ($verbose) {
foreach($upgrade_sql as $statement) {
@ -426,8 +238,7 @@ if ($argc > 1) {
echo("--------------- Database upgrade calculated for '$schema@$host' (show SQL with -v). ---------------\n");
if ($doupgrade) {
echo("--------------- Executing database upgrade for '$schema@$host' database will be written! ---------------\n");
echo("--------------- Executing database upgrade for '$schema@$host' database will be written! ---------------\n");
// First get the contents of the database table structure
$mysqli = mysqli_connect($host, $user, $passwd, $schema);
@ -467,7 +278,7 @@ if ($argc > 1) {
echo("--------------- Executing database upgrade for '$schema@$host' done. ---------------\n");
echo("--------------- Checking database upgrade for '$schema@$host'... ---------------\n");
$db_def = load_tables_from_db($host, $schema, $user, $passwd, $replacers);
$db_def = mustal_load_tables_from_db($host, $schema, $user, $passwd, $mustal_replacers);
echo("--------------- Comparing database '$schema@$host' vs. JSON '".$compare_def['database']."@".$compare_def['host']."' ---------------\n");
$compare_differences = compare_table_array($compare_def,"in JSON",$db_def,"in DB",true);
@ -488,372 +299,6 @@ if ($argc > 1) {
exit;
}
// Load all db_def from a DB connection into a db_def array
function load_tables_from_db(string $host, string $schema, string $user, string $passwd, $replacers) : array {
// First get the contents of the database table structure
$mysqli = mysqli_connect($host, $user, $passwd, $schema);
/* Check if the connection succeeded */
if (!$mysqli) {
return(array());
}
// Get db_def and views
$sql = "SHOW FULL tables";
$query_result = mysqli_query($mysqli, $sql);
if (!$query_result) {
return(array());
}
while ($row = mysqli_fetch_assoc($query_result)) {
$table = array();
$table['name'] = $row['Tables_in_'.$schema];
$table['type'] = $row['Table_type'];
$tables[] = $table; // Add table to list of tables
}
// Get and add columns of the table
foreach ($tables as &$table) {
$sql = "SHOW FULL COLUMNS FROM ".$table['name'];
$query_result = mysqli_query($mysqli, $sql);
if (!$query_result) {
return(array());
}
$columns = array();
while ($column = mysqli_fetch_assoc($query_result)) {
// Do some harmonization
if ($column['Default'] !== NULL) {
sql_replace_reserved_functions($column,$replacers);
$column['Default'] = mysql_put_text_type_in_quotes($column['Type'],$column['Default']);
}
$columns[] = $column; // Add column to list of columns
}
$table['columns'] = $columns;
$sql = "SHOW KEYS FROM ".$table['name'];
$query_result = mysqli_query($mysqli, $sql);
if (!$query_result) {
return(array());
}
$keys = array();
while ($key = mysqli_fetch_assoc($query_result)) {
$keys[] = $key; // Add key to list of keys
}
// Compose comparable format for keys
$composed_keys = array();
foreach ($keys as $key) {
// Check if this key exists already
$key_pos = array_search($key['Key_name'],array_column($composed_keys,'Key_name'));
if ($key_pos == false) {
// New key
$composed_key = array();
$composed_key['Key_name'] = $key['Key_name'];
$composed_key['Index_type'] = $key['Index_type'];
$composed_key['columns'][] = $key['Column_name'];
$composed_keys[] = $composed_key;
} else {
// Given key, add column
$composed_keys[$key_pos]['columns'][] .= $key['Column_name'];
}
}
unset($key);
$table['keys'] = $composed_keys;
unset($composed_keys);
}
unset($table);
$result = array();
$result['host'] = $host;
$result['database'] = $schema;
$result['user'] = $user;
$result['tables'] = $tables;
return($result);
}
function save_tables_to_json(array $db_def, string $path, string $tables_file_name, bool $force) : int {
// Prepare db_def file
if (!is_dir($path)) {
mkdir($path);
}
if (!$force && file_exists($path."/".$tables_file_name)) {
return(2);
}
$tables_file = fopen($path."/".$tables_file_name, "w");
if (empty($tables_file)) {
return(2);
}
fwrite($tables_file, json_encode($db_def,JSON_PRETTY_PRINT));
fclose($tables_file);
return(0);
}
// Load all db_def from JSON file
function load_tables_from_json(string $path, string $tables_file_name) : array {
$db_def = array();
$contents = file_get_contents($path."/".$tables_file_name);
if (!$contents) {
return(array());
}
$db_def = json_decode($contents, true);
if (!$db_def) {
return(array());
}
return($db_def);
}
// Compare two definitions
// Report based on the first array
// Return Array
function compare_table_array(array $nominal, string $nominal_name, array $actual, string $actual_name, bool $check_column_definitions) : array {
$compare_differences = array();
if (count($nominal['tables']) != count($actual['tables'])) {
$compare_difference = array();
$compare_difference['type'] = "Table count";
$compare_difference[$nominal_name] = count($nominal['tables']);
$compare_difference[$actual_name] = count($actual['tables']);
$compare_differences[] = $compare_difference;
}
foreach ($nominal['tables'] as $database_table) {
$found_table = array();
foreach ($actual['tables'] as $compare_table) {
if ($database_table['name'] == $compare_table['name']) {
$found_table = $compare_table;
break;
}
}
unset($compare_table);
if ($found_table) {
// Check type table vs view
if ($database_table['type'] != $found_table['type']) {
$compare_difference = array();
$compare_difference['type'] = "Table type";
$compare_difference['table'] = $database_table['name'];
$compare_difference[$nominal_name] = $database_table['type'];
$compare_difference[$actual_name] = $found_table['type'];
$compare_differences[] = $compare_difference;
}
// Only BASE TABLE supported now
if ($found_table['type'] != 'BASE TABLE') {
continue;
}
// Check columns
$compare_table_columns = array_column($found_table['columns'],'Field');
foreach ($database_table['columns'] as $column) {
$column_name_to_find = $column['Field'];
$column_key = array_search($column_name_to_find,$compare_table_columns,true);
if ($column_key !== false) {
// Compare the properties of the columns
if ($check_column_definitions) {
$found_column = $found_table['columns'][$column_key];
foreach ($column as $key => $value) {
if ($found_column[$key] != $value) {
if ($key != 'Key') { // Keys will be handled separately
$compare_difference = array();
$compare_difference['type'] = "Column definition";
$compare_difference['table'] = $database_table['name'];
$compare_difference['column'] = $column['Field'];
$compare_difference['property'] = $key;
$compare_difference[$nominal_name] = $value;
$compare_difference[$actual_name] = $found_column[$key];
$compare_differences[] = $compare_difference;
}
}
}
unset($value);
} // $check_column_definitions
} else {
$compare_difference = array();
$compare_difference['type'] = "Column existance";
$compare_difference['table'] = $database_table['name'];
$compare_difference[$nominal_name] = $column['Field'];
$compare_differences[] = $compare_difference;
}
}
unset($column);
// Check keys
$compare_table_sql_indexs = array_column($found_table['keys'],'Key_name');
foreach ($database_table['keys'] as $sql_index) {
$sql_index_name_to_find = $sql_index['Key_name'];
$sql_index_key = array_search($sql_index_name_to_find,$compare_table_sql_indexs,true);
if ($sql_index_key !== false) {
// Compare the properties of the sql_indexs
if ($check_column_definitions) {
$found_sql_index = $found_table['keys'][$sql_index_key];
foreach ($sql_index as $key => $value) {
if ($found_sql_index[$key] != $value) {
// if ($key != 'permissions') {
$compare_difference = array();
$compare_difference['type'] = "Key definition";
$compare_difference['table'] = $database_table['name'];
$compare_difference['key'] = $sql_index['Key_name'];
$compare_difference['property'] = $key;
$compare_difference[$nominal_name] = implode(',',$value);
$compare_difference[$actual_name] = implode(',',$found_sql_index[$key]);
$compare_differences[] = $compare_difference;
// }
}
}
unset($value);
} // $check_sql_index_definitions
} else {
$compare_difference = array();
$compare_difference['type'] = "Key existance";
$compare_difference['table'] = $database_table['name'];
$compare_difference[$nominal_name] = $sql_index['Key_name'];
$compare_differences[] = $compare_difference;
}
}
unset($sql_index);
} else {
$compare_difference = array();
$compare_difference['type'] = "Table existance";
$compare_difference[$nominal_name] = $database_table['name'];
$compare_differences[] = $compare_difference;
}
}
unset($database_table);
return($compare_differences);
}
// Generate SQL to create or modify column
function column_sql_definition(string $table_name, array $column, array $reserved_words_without_quote) : string {
foreach($column as $key => &$value) {
$value = (string) $value;
$value = column_sql_create_property_definition($key,$value,$reserved_words_without_quote);
}
// Default handling here
if ($column['Default'] == " DEFAULT ''") {
$column['Default'] = "";
}
$sql =
$column['Type'].
$column['Null'].
$column['Default'].
$column['Extra'].
$column['Collation'];
return($sql);
}
// Generate SQL to modify a single column property
function column_sql_create_property_definition(string $property, string $property_value, array $reserved_words_without_quote) : string {
switch ($property) {
case 'Type':
break;
case 'Null':
if ($property_value == "NO") {
$property_value = " NOT NULL"; // Idiotic...
}
if ($property_value == "YES") {
$property_value = " NULL"; // Also Idiotic...
}
break;
case 'Default':
// Check for MYSQL function call as default
if (in_array(strtolower($property_value),$reserved_words_without_quote)) {
$quote = "";
} else {
// Remove quotes if there are
$property_value = trim($property_value,"'");
$quote = "'";
}
$property_value = " DEFAULT $quote".$property_value."$quote";
break;
case 'Extra':
if ($property_value != '') {
$property_value = " ".$property_value;
}
break;
case 'Collation':
if ($property_value != '') {
$property_value = " COLLATE ".$property_value;
}
break;
default:
$property_value = "";
break;
}
return($property_value);
}
// Replaces different variants of the same function to allow comparison
function sql_replace_reserved_functions(array &$column, array $replacers) {
$result = strtolower($column['Default']);
foreach ($replacers as $replace) {
if ($result == $replace[0]) {
$result = $replace[1];
}
}
$column['Default'] = $result;
$result = strtolower($column['Extra']);
foreach ($replacers as $replace) {
if ($result == $replace[0]) {
$result = $replace[1];
}
}
$column['Extra'] = $result;
}
// Is it a text type? -> Use quotes then
function mysql_put_text_type_in_quotes(string $checktype, string $value) : string {
$types = array('char','varchar','tinytext','text','mediumtext','longtext');
foreach($types as $type) {
if (stripos($checktype, $type) !== false) {
return("'".$value."'");
}
}
return($value);
}
function info() {
echo("OpenXE database compare\n");
echo("Copyright 2022 (c) OpenXE project\n");

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,654 @@
<?php
/*
MUSTAL Mysql Upgrade Schema Tool by Alex Ledis
Helper to compare database structures from JSON files vs. database and upgrade database
Copyright (c) 2022 Alex Ledis
Licensed under AGPL v3
Version 1.0
function mustal_load_tables_from_db(string $host, string $schema, string $user, string $passwd, $replacers) : array
Load structure from db connection to an array.
function mustal_save_tables_to_json(array $db_def, string $path, string $tables_file_name, bool $force) : int
Save structure from array to a JSON file.
function mustal_load_tables_from_json(string $path, string $tables_file_name) : array
Load structure from JSON file into array.
function mustal_compare_table_array(array $nominal, string $nominal_name, array $actual, string $actual_name, bool $check_column_definitions) : array
Compare two database structures
Returns a structured array containing information on all the differences.
function mustal_calculate_db_upgrade(array $compare_def, array $db_def, array &$upgrade_sql) : int
Generate the SQL needed to upgrade the database to match the definition, based on a comparison.
Data structure in Array and JSON
{
"host": "hostname",
"database": "schemaname",
"user": "username",
"tables": [
{
"name": "",
"type": "",
"columns": [
{
"Field": "",
"Type": "",
"Collation": "",
"Null": "",
"Key": "",
"Default": "",
"Extra": "",
"Privileges": "",
"Comment": ""
}
],
"keys": [
{
"Key_name": "",
"columns": [
"",
""
]
}
]
}
]
}
*/
// These default values will not be in quotes, converted to lowercase and be replaced by the second entry
$mustal_replacers = [
['current_timestamp','current_timestamp()'],
['on update current_timestamp','on update current_timestamp()']
];
// Load all db_def from a DB connection into a db_def array
function mustal_load_tables_from_db(string $host, string $schema, string $user, string $passwd, $replacers) : array {
// First get the contents of the database table structure
$mysqli = mysqli_connect($host, $user, $passwd, $schema);
/* Check if the connection succeeded */
if (!$mysqli) {
return(array());
}
// Get db_def and views
$sql = "SHOW FULL tables";
$query_result = mysqli_query($mysqli, $sql);
if (!$query_result) {
return(array());
}
while ($row = mysqli_fetch_assoc($query_result)) {
$table = array();
$table['name'] = $row['Tables_in_'.$schema];
$table['type'] = $row['Table_type'];
$tables[] = $table; // Add table to list of tables
}
// Get and add columns of the table
foreach ($tables as &$table) {
$sql = "SHOW FULL COLUMNS FROM ".$table['name'];
$query_result = mysqli_query($mysqli, $sql);
if (!$query_result) {
return(array());
}
$columns = array();
while ($column = mysqli_fetch_assoc($query_result)) {
// Do some harmonization
if ($column['Default'] !== NULL) {
mustal_sql_replace_reserved_functions($column,$replacers);
$column['Default'] = mustal_mysql_put_text_type_in_quotes($column['Type'],$column['Default']);
}
$columns[] = $column; // Add column to list of columns
}
$table['columns'] = $columns;
$sql = "SHOW KEYS FROM ".$table['name'];
$query_result = mysqli_query($mysqli, $sql);
if (!$query_result) {
return(array());
}
$keys = array();
while ($key = mysqli_fetch_assoc($query_result)) {
$keys[] = $key; // Add key to list of keys
}
// Compose comparable format for keys
$composed_keys = array();
foreach ($keys as $key) {
// Check if this key exists already
$key_pos = array_search($key['Key_name'],array_column($composed_keys,'Key_name'));
if ($key_pos == false) {
// New key
$composed_key = array();
$composed_key['Key_name'] = $key['Key_name'];
$composed_key['Index_type'] = $key['Index_type'];
$composed_key['columns'][] = $key['Column_name'];
$composed_keys[] = $composed_key;
} else {
// Given key, add column
$composed_keys[$key_pos]['columns'][] .= $key['Column_name'];
}
}
unset($key);
$table['keys'] = $composed_keys;
unset($composed_keys);
}
unset($table);
$result = array();
$result['host'] = $host;
$result['database'] = $schema;
$result['user'] = $user;
$result['tables'] = $tables;
return($result);
}
function mustal_save_tables_to_json(array $db_def, string $path, string $tables_file_name, bool $force) : int {
// Prepare db_def file
if (!is_dir($path)) {
mkdir($path);
}
if (!$force && file_exists($path."/".$tables_file_name)) {
return(2);
}
$tables_file = fopen($path."/".$tables_file_name, "w");
if (empty($tables_file)) {
return(2);
}
fwrite($tables_file, json_encode($db_def,JSON_PRETTY_PRINT));
fclose($tables_file);
return(0);
}
// Load all db_def from JSON file
function mustal_load_tables_from_json(string $path, string $tables_file_name) : array {
$db_def = array();
$contents = file_get_contents($path."/".$tables_file_name);
if (!$contents) {
return(array());
}
$db_def = json_decode($contents, true);
if (!$db_def) {
return(array());
}
return($db_def);
}
// Compare two definitions
// Report based on the first array
// Return Array
function mustal_compare_table_array(array $nominal, string $nominal_name, array $actual, string $actual_name, bool $check_column_definitions) : array {
$compare_differences = array();
if (count($nominal['tables']) != count($actual['tables'])) {
$compare_difference = array();
$compare_difference['type'] = "Table count";
$compare_difference[$nominal_name] = count($nominal['tables']);
$compare_difference[$actual_name] = count($actual['tables']);
$compare_differences[] = $compare_difference;
}
foreach ($nominal['tables'] as $database_table) {
$found_table = array();
foreach ($actual['tables'] as $compare_table) {
if ($database_table['name'] == $compare_table['name']) {
$found_table = $compare_table;
break;
}
}
unset($compare_table);
if ($found_table) {
// Check type table vs view
if ($database_table['type'] != $found_table['type']) {
$compare_difference = array();
$compare_difference['type'] = "Table type";
$compare_difference['table'] = $database_table['name'];
$compare_difference[$nominal_name] = $database_table['type'];
$compare_difference[$actual_name] = $found_table['type'];
$compare_differences[] = $compare_difference;
}
// Only BASE TABLE supported now
if ($found_table['type'] != 'BASE TABLE') {
continue;
}
// Check columns
$compare_table_columns = array_column($found_table['columns'],'Field');
foreach ($database_table['columns'] as $column) {
$column_name_to_find = $column['Field'];
$column_key = array_search($column_name_to_find,$compare_table_columns,true);
if ($column_key !== false) {
// Compare the properties of the columns
if ($check_column_definitions) {
$found_column = $found_table['columns'][$column_key];
foreach ($column as $key => $value) {
if ($found_column[$key] != $value) {
if ($key != 'Key') { // Keys will be handled separately
$compare_difference = array();
$compare_difference['type'] = "Column definition";
$compare_difference['table'] = $database_table['name'];
$compare_difference['column'] = $column['Field'];
$compare_difference['property'] = $key;
$compare_difference[$nominal_name] = $value;
$compare_difference[$actual_name] = $found_column[$key];
$compare_differences[] = $compare_difference;
}
}
}
unset($value);
} // $check_column_definitions
} else {
$compare_difference = array();
$compare_difference['type'] = "Column existence";
$compare_difference['table'] = $database_table['name'];
$compare_difference[$nominal_name] = $column['Field'];
$compare_differences[] = $compare_difference;
}
}
unset($column);
// Check keys
$compare_table_sql_indexs = array_column($found_table['keys'],'Key_name');
foreach ($database_table['keys'] as $sql_index) {
$sql_index_name_to_find = $sql_index['Key_name'];
$sql_index_key = array_search($sql_index_name_to_find,$compare_table_sql_indexs,true);
if ($sql_index_key !== false) {
// Compare the properties of the sql_indexs
if ($check_column_definitions) {
$found_sql_index = $found_table['keys'][$sql_index_key];
foreach ($sql_index as $key => $value) {
if ($found_sql_index[$key] != $value) {
// if ($key != 'permissions') {
$compare_difference = array();
$compare_difference['type'] = "Key definition";
$compare_difference['table'] = $database_table['name'];
$compare_difference['key'] = $sql_index['Key_name'];
$compare_difference['property'] = $key;
$compare_difference[$nominal_name] = implode(',',$value);
$compare_difference[$actual_name] = implode(',',$found_sql_index[$key]);
$compare_differences[] = $compare_difference;
// }
}
}
unset($value);
} // $check_sql_index_definitions
} else {
$compare_difference = array();
$compare_difference['type'] = "Key existence";
$compare_difference['table'] = $database_table['name'];
$compare_difference[$nominal_name] = $sql_index['Key_name'];
$compare_differences[] = $compare_difference;
}
}
unset($sql_index);
} else {
$compare_difference = array();
$compare_difference['type'] = "Table existence";
$compare_difference[$nominal_name] = $database_table['name'];
$compare_differences[] = $compare_difference;
}
}
unset($database_table);
return($compare_differences);
}
// Generate SQL to create or modify column
function mustal_column_sql_definition(string $table_name, array $column, array $reserved_words_without_quote) : string {
foreach($column as $key => &$value) {
$value = (string) $value;
$value = mustal_column_sql_create_property_definition($key,$value,$reserved_words_without_quote);
}
// Default handling here
if ($column['Default'] == " DEFAULT ''") {
$column['Default'] = "";
}
$sql =
$column['Type'].
$column['Null'].
$column['Default'].
$column['Extra'].
$column['Collation'];
return($sql);
}
// Generate SQL to modify a single column property
function mustal_column_sql_create_property_definition(string $property, string $property_value, array $reserved_words_without_quote) : string {
switch ($property) {
case 'Type':
break;
case 'Null':
if ($property_value == "NO") {
$property_value = " NOT NULL"; // Idiotic...
}
if ($property_value == "YES") {
$property_value = " NULL"; // Also Idiotic...
}
break;
case 'Default':
// Check for MYSQL function mustal_call as default
if (in_array(strtolower($property_value),$reserved_words_without_quote)) {
$quote = "";
} else {
// Remove quotes if there are
$property_value = trim($property_value,"'");
$quote = "'";
}
$property_value = " DEFAULT $quote".$property_value."$quote";
break;
case 'Extra':
if ($property_value != '') {
$property_value = " ".$property_value;
}
break;
case 'Collation':
if ($property_value != '') {
$property_value = " COLLATE ".$property_value;
}
break;
default:
$property_value = "";
break;
}
return($property_value);
}
// Replaces different variants of the same function mustal_to allow comparison
function mustal_sql_replace_reserved_functions(array &$column, array $replacers) {
$result = strtolower($column['Default']);
foreach ($replacers as $replace) {
if ($result == $replace[0]) {
$result = $replace[1];
}
}
$column['Default'] = $result;
$result = strtolower($column['Extra']);
foreach ($replacers as $replace) {
if ($result == $replace[0]) {
$result = $replace[1];
}
}
$column['Extra'] = $result;
}
// Is it a text type? -> Use quotes then
function mustal_mysql_put_text_type_in_quotes(string $checktype, string $value) : string {
$types = array('char','varchar','tinytext','text','mediumtext','longtext');
foreach($types as $type) {
if (stripos($checktype, $type) !== false) {
return("'".$value."'");
}
}
return($value);
}
function mustal_implode_with_quote(string $quote, string $delimiter, array $array_to_implode) : string {
return($quote.implode($quote.$delimiter.$quote, $array_to_implode).$quote);
}
// Calculate the sql neccessary to update the database
// Error codes:
// 0 ok
// 1 Upgrade type of table not supported
// 2 Error on table upgrade
// 3 Error on column existence upgrade
// 4 Error on column existence upgrade
// 5 Error on column definition upgrade
// 6 Error on column definition upgrade
// 7 Error on key existence upgrade
// 8 Error on key existence upgrade
// 9 Error on key definition upgrade
// 10 Error on key definition upgrade
// 11 Table type upgrade not supported
// 12 Upgrade type not supported
function mustal_calculate_db_upgrade(array $compare_def, array $db_def, array &$upgrade_sql, array $replacers) : int {
$upgrade_sql = array();
$compare_differences = mustal_compare_table_array($compare_def,"in JSON",$db_def,"in DB",true);
if (count($compare_differences) > 0) {
$upgrade_sql[] = ("SET SQL_MODE='ALLOW_INVALID_DATES';");
}
foreach ($compare_differences as $compare_difference) {
switch ($compare_difference['type']) {
case 'Table existence':
// Get table definition from JSON
$table_name = $compare_difference['in JSON'];
$table_key = array_search($table_name,array_column($compare_def['tables'],'name'));
if ($table_key !== false) {
$table = $compare_def['tables'][$table_key];
switch ($table['type']) {
case 'BASE TABLE':
// Create table in DB
$sql = "";
$sql = "CREATE TABLE `".$table['name']."` (";
$comma = "";
foreach ($table['columns'] as $column) {
$sql .= $comma."`".$column['Field']."` ".mustal_column_sql_definition($table_name, $column,array_column($replacers,1));
$comma = ", ";
}
// Add keys
$comma = ", ";
foreach ($table['keys'] as $key) {
if ($key['Key_name'] == 'PRIMARY') {
$keystring = "PRIMARY KEY ";
} else {
if(array_key_exists('Index_type', $key)) {
$index_type = $key['Index_type'];
} else {
$index_type = "";
}
$keystring = $index_type." KEY `".$key['Key_name']."` ";
}
$sql .= $comma.$keystring."(`".implode("`,`",$key['columns'])."`) ";
}
$sql .= ")";
$upgrade_sql[] = $sql;
break;
default:
//echo("Upgrade type '".$table['type']."' on table '".$table['name']."' not supported.\n");
return(1);
break;
}
} else {
// echo("Error table_key while creating upgrade for table existence `$table_name`.\n");
return(2);
}
break;
case 'Column existence':
$table_name = $compare_difference['table'];
$column_name = $compare_difference['in JSON'];
$table_key = array_search($table_name,array_column($compare_def['tables'],'name'));
if ($table_key !== false) {
$table = $compare_def['tables'][$table_key];
$columns = $table['columns'];
$column_key = array_search($column_name,array_column($columns,'Field'));
if ($column_key !== false) {
$column = $table['columns'][$column_key];
$sql = "ALTER TABLE `$table_name` ADD COLUMN `".$column_name."` ";
$sql .= mustal_column_sql_definition($table_name, $column, array_column($replacers,1));
$sql .= ";";
$upgrade_sql[] = $sql;
}
else {
// echo("Error column_key while creating column '$column_name' in table '".$table['name']."'\n");
return(3);
}
}
else {
// echo("Error table_key while creating upgrade for column existence '$column_name' in table '$table_name'.\n");
return(4);
}
// Add Column in DB
break;
case 'Column definition':
$table_name = $compare_difference['table'];
$column_name = $compare_difference['column'];
$table_key = array_search($table_name,array_column($compare_def['tables'],'name'));
if ($table_key !== false) {
$table = $compare_def['tables'][$table_key];
$columns = $table['columns'];
$column_names = array_column($columns,'Field');
$column_key = array_search($column_name,$column_names);
if ($column_key !== false) {
$column = $table['columns'][$column_key];
$sql = "ALTER TABLE `$table_name` MODIFY COLUMN `".$column_name."` ";
$sql .= mustal_column_sql_definition($table_name, $column,array_column($replacers,1));
$sql .= ";";
$upgrade_sql[] = $sql;
}
else {
//echo("Error column_key while modifying column '$column_name' in table '".$table['name']."'\n");
return(5);
}
}
else {
// echo("Error table_key while modifying column '$column_name' in table '$table_name'.\n");
return(6);
}
// Modify Column in DB
break;
case 'Key existence':
$table_name = $compare_difference['table'];
$key_name = $compare_difference['in JSON'];
$table_key = array_search($table_name,array_column($compare_def['tables'],'name'));
if ($table_key !== false) {
$table = $compare_def['tables'][$table_key];
$keys = $table['keys'];
$key_names = array_column($keys,'Key_name');
$key_key = array_search($key_name,$key_names);
if ($key_key !== false) {
$key = $table['keys'][$key_key];
$sql = "ALTER TABLE `$table_name` ADD KEY `".$key_name."` ";
$sql .= "(`".implode("`,`",$key['columns'])."`)";
$sql .= ";";
$upgrade_sql[] = $sql;
}
else {
//echo("Error key_key while adding key '$key_name' in table '".$table['name']."'\n");
return(7);
}
}
else {
//echo("Error table_key while adding key '$key_name' in table '$table_name'.\n");
return(8);
}
break;
case "Key definition":
$table_name = $compare_difference['table'];
$key_name = $compare_difference['key'];
$table_key = array_search($table_name,array_column($compare_def['tables'],'name'));
if ($table_key !== false) {
$table = $compare_def['tables'][$table_key];
$keys = $table['keys'];
$key_names = array_column($keys,'Key_name');
$key_key = array_search($key_name,$key_names);
if ($key_key !== false) {
$key = $table['keys'][$key_key];
$sql = "ALTER TABLE `$table_name` DROP KEY `".$key_name."`;";
$upgrade_sql[] = $sql;
$sql = "ALTER TABLE `$table_name` ADD KEY `".$key_name."` ";
$sql .= "(`".implode("`,`",$key['columns'])."`)";
$sql .= ";";
$upgrade_sql[] = $sql;
}
else {
//echo("Error key_key while changing key '$key_name' in table '".$table['name']."'\n");
return(9);
}
}
else {
// echo("Error table_key while changing key '$key_name' in table '$table_name'.\n");
return(10);
}
break;
case 'Table count':
// Nothing to do
break;
case 'Table type':
// echo("Upgrade type '".$compare_difference['type']."' on table '".$compare_difference['table']."' not supported.\n");
return(11);
break;
default:
// echo("Upgrade type '".$compare_difference['type']."' not supported.\n");
return(12);
break;
}
}
$upgrade_sql = array_unique($upgrade_sql);
return(0);
}

View File

@ -1,2 +0,0 @@
<?php
header('Location: ./www/update.php?rand=' . sha1(mt_rand()));

View File

@ -1,3 +0,0 @@
<?php
include("upgradesystemclient2.php");
include("upgradedbonly.php");

16
upgrade/UPGRADE.md Normal file
View File

@ -0,0 +1,16 @@
Upgrade the OpenXE system.
NOTE:
The upgrade system is for use in LINUX only and needs to have git installed.
1. get files from git
2. run database upgrade
Files in this directory:
UPGRADE.md -> This file
upgrade.php -> The upgrade program
Files in the data subdirectory:
.in_progress.flag -> if this file exists, an upgrade is in progress, system will be locked
db_schema.json -> Contains the nominal database structure
remote.json -> Contains the git remote & branch which should be used for upgrade

114725
upgrade/data/db_schema.json Normal file

File diff suppressed because it is too large Load Diff

4
upgrade/data/remote.json Normal file
View File

@ -0,0 +1,4 @@
{
"host": "https://github.com/openxe-org/openxe.git",
"branch": "master"
}

241
upgrade/upgrade.php Normal file
View File

@ -0,0 +1,241 @@
<?php
/*
* Upgrader using git for file upgrade and mustal to update the database definition
*
* Copyright (c) 2022 OpenXE project
*
*/
class DatabaseConnectionInfo {
function __construct() {
require('../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) {
echo("git ".$command."\n");
}
exec("git ".$command,$output,$retval);
if (!empty($output)) {
if ($verbose || $retval != 0) {
echo_output($output);
}
}
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
if (in_array('-v', $argv)) {
$verbose = true;
} else {
$verbose = false;
}
if (in_array('-f', $argv)) {
$force = true;
} else {
$force = false;
}
echo("--------------- OpenXE upgrade ---------------\n");
if (basename(getcwd()) != 'upgrade') {
abort("Must be executed from 'upgrade' directory.");
}
$remote_info_contents = file_get_contents($remote_file_name);
if (!$remote_info_contents) {
abort("Unable to load $remote_file_name");
}
$remote_info = json_decode($remote_info_contents, true);
// Get changed files on system -> Should be empty
$output = array();
$retval = git("ls-files -m ..", $output,$verbose,"Git not initialized.");
// Not a git repository -> Create it and then go ahead
if ($retval == 128) {
echo("Setting up git...");
$retval = git("init ..", $output,$verbose,"Error while initializing git!");
if ($retval != 0) {
abort("");
}
$retval = git("add ../.", $output,$verbose,"Error while initializing git!");
if ($retval != 0) {
abort("");
}
$retval = git("fetch ".$remote_info['host']." ".$remote_info['branch'], $output,$verbose,"Error while initializing git!");
if ($retval != 0) {
abort("");
}
$retval = git("checkout FETCH_HEAD -f", $output,$verbose,"Error while initializing git!");
if ($retval != 0) {
abort("");
}
}
if ($retval != 0) {
abort("Error while executing git!");
}
if (!empty($output)) {
echo("There are modified files:");
echo_output($output);
if (!$force) {
abort("Clear modified files or use -f");
}
}
echo("--------------- Locking system ---------------\n");
if (file_exists($lockfile_name)) {
echo("System is already locked.\n");
} else {
file_put_contents($lockfile_name," ");
}
echo("--------------- Pulling files... ---------------\n");
if ($force) {
$retval = git("reset --hard",$output,$verbose,"Error while resetting modified files!");
if ($retval != 0) {
echo_output($output);
abort("");
}
}
$retval = git("pull ".$remote_info['host']." ".$remote_info['branch'],$output,$verbose,"Error while pulling files!");
if ($retval != 0) {
echo_output($output);
abort("");
}
$retval = git("reset --hard",$output,$verbose,"Error while applying files!");
if ($retval != 0) {
echo_output($output);
abort("");
}
echo("--------------- Files upgrade completed ---------------\n");
$retval = git("log -1 ",$output,$verbose,"Error while checking files!");
if ($retval != 0) {
echo_output($output);
abort("");
}
echo_output($output);
echo("--------------- Loading from database '$schema@$host'... ---------------\n");
$db_def = mustal_load_tables_from_db($host, $schema, $user, $passwd, $mustal_replacers);
if (empty($db_def)) {
echo ("Could not load from $schema@$host\n");
exit;
}
$compare_differences = array();
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;
}
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);
echo((empty($compare_differences)?0:count($compare_differences))." differences.\n");
echo("--------------- Calculating database upgrade for '$schema@$host'... ---------------\n");
$upgrade_sql = array();
$result = mustal_calculate_db_upgrade($compare_def, $db_def, $upgrade_sql, $mustal_replacers);
if ($result != 0) {
echo("Error: $result\n");
exit;
}
echo(count($upgrade_sql)." upgrade statements\n");
echo("--------------- Executing database upgrade for '$schema@$host' database... ---------------\n");
// First get the contents of the database table structure
$mysqli = mysqli_connect($host, $user, $passwd, $schema);
/* Check if the connection succeeded */
if (!$mysqli) {
echo ("Failed to connect!\n");
} else {
$counter = 0;
$error_counter = 0;
$number_of_statements = count($upgrade_sql);
foreach ($upgrade_sql as $sql) {
$counter++;
echo("\rUpgrade step $counter of $number_of_statements... ");
$query_result = mysqli_query($mysqli, $sql);
if (!$query_result) {
$error = " not ok: ". mysqli_error($mysqli);
echo($error);
echo("\n");
file_put_contents("./errors.txt",date()." ".$error.$sql."\n",FILE_APPEND);
$error_counter++;
} else {
echo("ok.\r");
}
}
echo("\n");
echo("$error_counter errors.\n");
if ($error_counter > 0) {
echo("See 'errors.txt'\n");
}
echo("--------------- Checking database upgrade for '$schema@$host'... ---------------\n");
$db_def = mustal_load_tables_from_db($host, $schema, $user, $passwd, $mustal_replacers);
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);
echo((empty($compare_differences)?0:count($compare_differences))." differences.\n");
}
echo("--------------- Unlocking system ---------------\n");
unlink($lockfile_name);
echo("--------------- Done! ---------------\n");
exit(0);

View File

@ -1,98 +0,0 @@
<?php
//include("wawision.inc.php");
use Xentral\Core\Installer\Installer;
use Xentral\Core\Installer\InstallerCacheConfig;
use Xentral\Core\Installer\InstallerCacheWriter;
use Xentral\Core\Installer\ClassMapGenerator;
use Xentral\Core\Installer\Psr4ClassNameResolver;
use Xentral\Core\Installer\TableSchemaEnsurer;
use Xentral\Components\Database\DatabaseConfig;
// Nur einfache Fehler melden
error_reporting(E_ERROR | E_COMPILE_ERROR | E_CORE_ERROR | E_RECOVERABLE_ERROR | E_USER_ERROR | E_PARSE);
if(file_exists(__DIR__.'/xentral_autoloader.php')){
include_once (__DIR__.'/xentral_autoloader.php');
}
include_once("conf/main.conf.php");
include_once("phpwf/plugins/class.mysql.php");
include_once("www/lib/class.erpapi.php");
if(file_exists("www/lib/class.erpapi_custom.php")){
include_once("www/lib/class.erpapi_custom.php");
}
/*
class app_t
{
var $DB;
var $user;
var $Conf;
}
$app = new app_t();
*/
$config = new Config();
// Delete ServiceMap-CacheFile
$installConf = new InstallerCacheConfig($config->WFuserdata . '/tmp/' . $config->WFdbname);
$serviceCacheFile = $installConf->getServiceCacheFile();
@unlink($serviceCacheFile);
$app = new ApplicationCore();
$DEBUG = 0;
$app->Conf = $config;
$app->DB = new DB($app->Conf->WFdbhost,$app->Conf->WFdbname,$app->Conf->WFdbuser,$app->Conf->WFdbpass, $app, $app->Conf->WFdbport);
if(class_exists('erpAPICustom'))
{
$erp = new erpAPICustom($app);
}else{
$erp = new erpAPI($app);
}
echo "STARTE DB Upgrade\r\n";
$erp->UpgradeDatabase();
echo "ENDE DB Upgrade\r\n\r\n";
try {
echo "STARTE Installer\r\n";
$resolver = new Psr4ClassNameResolver();
$resolver->addNamespace('Xentral\\', __DIR__ . '/classes');
$resolver->excludeFile(__DIR__ . '/classes/bootstrap.php');
$generator = new ClassMapGenerator($resolver, __DIR__);
$installer = new Installer($generator, $resolver);
$writer = new InstallerCacheWriter($installConf, $installer);
$dbConfig = new DatabaseConfig(
$app->Conf->WFdbhost,
$app->Conf->WFdbuser,
$app->Conf->WFdbpass,
$app->Conf->WFdbname,
null,
$app->Conf->WFdbport
);
$tableSchemaCreator = new TableSchemaEnsurer(
$app->Container->get('SchemaCreator'),
$installConf,
$dbConfig
);
echo "SCHREIBE ServiceMap\r\n";
$writer->writeServiceCache();
echo "SCHREIBE JavascriptMap\r\n";
$writer->writeJavascriptCache();
echo "ERZEUGE Table Schemas\r\n";
$schemaCollection = $installer->getTableSchemas();
$tableSchemaCreator->ensureSchemas($schemaCollection);
echo "ENDE Installer\r\n";
//
} catch (Exception $e) {
echo "FEHLER " . $e->getMessage() . "\r\n";
}

View File

@ -1,7 +0,0 @@
<?php
$intern = true;
if(!empty($argv[1]) && strtolower($argv[1]) === 'changeversion'){
$allowChangeVersion = true;
}
include __DIR__.'/www/update.php';

View File

@ -1,812 +0,0 @@
<?php
//include("wawision.inc.php");
// Nur einfache Fehler melden
//error_reporting(E_ERROR | E_WARNING | E_PARSE);
error_reporting(E_ERROR | E_PARSE);
include_once("conf/main.conf.php");
include_once("phpwf/plugins/class.mysql.php");
include_once("www/lib/class.erpapi.php");
class app_t {
var $DB;
var $user;
var $Conf;
}
$app = new app_t();
$DEBUG = 0;
$app->Conf = new Config();
$app->DB = new DB($app->Conf->WFdbhost,$app->Conf->WFdbname,$app->Conf->WFdbuser,$app->Conf->WFdbpass,null,$app->Conf->WFdbport);
$erp = new erpAPI($app);
$WAWISION['host'] = $app->Conf->updateHost ?? 'removed.upgrade.host';
$WAWISION['port']="443";
$myUpd = new UpgradeClient($WAWISION);
echo "STARTE UPDATE\n";
echo "Im folgenden stehen die Dateien die geaendert wurden.\n
Erscheinen keine Dateien sind Sie auf der neusten Version.\n";
$myUpd->Connect();
//$myUpd->CheckCRT();
$myUpd->CheckUpdate();
$myUpd->CheckUpdateCustom();
$myUpd->CheckUpdateModules();
echo "ENDE UPDATE\n";
//echo "STARTE DB UPGRADE\n";
//$erp->UpgradeDatabase();
//echo "ENDE DB UPGRADE\n";
//include("version.php");
//echo "\r\nRevision: $version_revision\r\n";
//$myUpd->Request();
//echo
class UpgradeClient
{
var $localmd5sums;
function __construct($conf)
{
$this->conf = $conf;
}
function Connect()
{
// check connection then stop
}
function CheckCRT()
{
$cert = shell_exec("openssl s_client -connect {$this->conf['host']}:{$this->conf['port']} < /dev/null 2>/dev/null | openssl x509 -in /dev/stdin");
if($cert==$this->conf['cert']."\n") return 1;
else {
echo "wrong\n";
exit;
}
}
function CheckUpdate()
{
$parameter['version']=@$this->conf['version'];
$result = $this->Request("md5list",$parameter);
if($result=="ERROR") { echo "Updates: ERROR FROM SERVER (Perhaps a wrong license?)\n"; return;}
$rows = explode(";",$result);
if(count($rows)>0)
{
foreach($rows as $value)
{
unset($single_row);
$single_row = explode(":",$value);
if(count($single_row)>=2 && strlen($single_row[0])>3 && strlen($single_row[1])>3)
{
$file = $single_row[0];
$md5sum = $single_row[1];
$parameter['file']=$file;
$parameter['md5sum']=$md5sum;
if($file=="./upgradesystemclient.php")
{
}
else if(is_file($file))
{
// pruefe md5sum
if(md5_file($file)!=$md5sum)
{
// wenn update dann UPD_
echo "update <- $file\n";
$result = $this->Request("getfile",$parameter);
$output = (base64_decode($result));
//$output = preg_replace('/[^(\x22-\x7F)\x0A]*/','', $output);
file_put_contents($file."UPD", $output);
/*
$fp = fopen($file."UPD","wb+");
fwrite($fp,base64_decode($result));
fclose($fp);
*/
// pruefsuemme neu berechnen wenn passt umbenennen und ins archiv
echo md5_file($file."UPD");
echo "-".$md5sum."\n";
if(md5_file($file."UPD")==$md5sum)
{
echo "update ok $file\n";
rename($file."UPD",$file);
}
}
} else if($file!="") {
echo "datei <- $file\n";
// pruefe ob es verzeichnis gibt
$verzeichnis = dirname($file);
if(!is_dir($verzeichnis))
{
echo "verzeichnis <- $verzeichnis\n";
mkdir($verzeichnis,0777,true);
}
$result = $this->Request("getfile",$parameter);
$output = base64_decode($result);
//$output = iconv("UTF-8","ISO-8859-1//IGNORE",$output);
//$output = iconv("ISO-8859-1","UTF-8",$output);
//$output = preg_replace('/[^(\x20-\x7F)\x0A]*/','', $output);
file_put_contents($file."NEW", $output);
/*$fp = fopen($file."NEW","wb+");
fwrite($fp,base64_decode($result));
fclose($fp);
*/
if(md5_file($file."NEW")==$md5sum)
{
echo "datei ok $file\n";
rename($file."NEW",$file);
} else {
// echo "datei XX $file local: ".md5_file($file."NEW")." remote: ".$md5sum."\n";
}
} else { }
}
}
}
//pruefe, update, lege verzeichnis an, lege datei an, loesche datei????
// download all files with UPD_ prefix
// get md5 liste von server
// pruefe ob alle dateien passen, wenn ja dann alle updaten am schluss
// wenn nein fehler abbrechen und ganzen prozess nochmal starten
//echo $md5sums;
}
function CheckUpdateModules()
{
$parameter['version']=@$this->conf['version'];
$result = $this->Request("md5listmodules",$parameter);
if($result=="ERROR") { echo "Modules: ERROR FROM SERVER (Perhaps a wrong license?)\n"; return;}
$rows = explode(";",$result);
if(count($rows)>0)
{
foreach($rows as $value)
{
unset($single_row);
$single_row = explode(":",$value);
if(count($single_row)>=2 && strlen($single_row[0])>3 && strlen($single_row[1])>3)
{
$file = $single_row[0];
$md5sum = $single_row[1];
$parameter['file']=$file;
$parameter['md5sum']=$md5sum;
if($file=="./upgradesystemclient.php")
{
}
else if(is_file($file))
{
// pruefe md5sum
if(md5_file($file)!=$md5sum)
{
// wenn update dann UPD_
echo "update (M) <- $file\n";
$result = $this->Request("getfilemodules",$parameter);
$output = (base64_decode($result));
//$output = preg_replace('/[^(\x22-\x7F)\x0A]*/','', $output);
file_put_contents($file."UPD", $output);
/*
$fp = fopen($file."UPD","wb+");
fwrite($fp,base64_decode($result));
fclose($fp);
*/
// pruefsuemme neu berechnen wenn passt umbenennen und ins archiv
echo md5_file($file."UPD");
echo "-".$md5sum."\n";
if(md5_file($file."UPD")==$md5sum)
{
echo "update (M) ok $file\n";
rename($file."UPD",$file);
}
}
} else if($file!="") {
echo "datei (M) <- $file\n";
// pruefe ob es verzeichnis gibt
$verzeichnis = dirname($file);
if(!is_dir($verzeichnis))
{
echo "verzeichnis (M) <- $verzeichnis\n";
mkdir($verzeichnis,0777,true);
}
$result = $this->Request("getfilemodules",$parameter);
$output = base64_decode($result);
//$output = iconv("UTF-8","ISO-8859-1//IGNORE",$output);
//$output = iconv("ISO-8859-1","UTF-8",$output);
//$output = preg_replace('/[^(\x20-\x7F)\x0A]*/','', $output);
file_put_contents($file."NEW", $output);
/*$fp = fopen($file."NEW","wb+");
fwrite($fp,base64_decode($result));
fclose($fp);
*/
if(md5_file($file."NEW")==$md5sum)
{
echo "datei (M) ok $file\n";
rename($file."NEW",$file);
} else {
// echo "datei XX $file local: ".md5_file($file."NEW")." remote: ".$md5sum."\n";
}
} else { }
}
}
}
//pruefe, update, lege verzeichnis an, lege datei an, loesche datei????
// download all files with UPD_ prefix
// get md5 liste von server
// pruefe ob alle dateien passen, wenn ja dann alle updaten am schluss
// wenn nein fehler abbrechen und ganzen prozess nochmal starten
//echo $md5sums;
}
function CheckUpdateCustom()
{
$parameter['version']=@$this->conf['version'];
$result = $this->Request("md5listcustom",$parameter);
if($result=="ERROR") { echo "Custom: ERROR FROM SERVER (Perhaps a wrong license?)\n"; return;}
$rows = explode(";",$result);
if(count($rows)>0)
{
foreach($rows as $value)
{
unset($single_row);
$single_row = explode(":",$value);
if(count($single_row)>=2 && strlen($single_row[0])>3 && strlen($single_row[1])>3)
{
$file = $single_row[0];
$md5sum = $single_row[1];
$parameter['file']=$file;
$parameter['md5sum']=$md5sum;
if($file=="./upgradesystemclient.php")
{
}
else if(is_file($file))
{
// pruefe md5sum
if(md5_file($file)!=$md5sum)
{
// wenn update dann UPD_
echo "update (C) <- $file\n";
$result = $this->Request("getfilecustom",$parameter);
$output = (base64_decode($result));
//$output = preg_replace('/[^(\x22-\x7F)\x0A]*/','', $output);
file_put_contents($file."UPD", $output);
/*
$fp = fopen($file."UPD","wb+");
fwrite($fp,base64_decode($result));
fclose($fp);
*/
// pruefsuemme neu berechnen wenn passt umbenennen und ins archiv
echo md5_file($file."UPD");
echo "-".$md5sum."\n";
if(md5_file($file."UPD")==$md5sum)
{
echo "update (C) ok $file\n";
rename($file."UPD",$file);
}
}
} else if($file!="") {
echo "datei (C) <- $file\n";
// pruefe ob es verzeichnis gibt
$verzeichnis = dirname($file);
if(!is_dir($verzeichnis))
{
echo "verzeichnis (C) <- $verzeichnis\n";
mkdir($verzeichnis,0777,true);
}
$result = $this->Request("getfilecustom",$parameter);
$output = base64_decode($result);
//$output = iconv("UTF-8","ISO-8859-1//IGNORE",$output);
//$output = iconv("ISO-8859-1","UTF-8",$output);
//$output = preg_replace('/[^(\x20-\x7F)\x0A]*/','', $output);
file_put_contents($file."NEW", $output);
/*$fp = fopen($file."NEW","wb+");
fwrite($fp,base64_decode($result));
fclose($fp);
*/
if(md5_file($file."NEW")==$md5sum)
{
echo "datei (C) ok $file\n";
rename($file."NEW",$file);
} else {
// echo "datei XX $file local: ".md5_file($file."NEW")." remote: ".$md5sum."\n";
}
} else { }
}
}
}
//pruefe, update, lege verzeichnis an, lege datei an, loesche datei????
// download all files with UPD_ prefix
// get md5 liste von server
// pruefe ob alle dateien passen, wenn ja dann alle updaten am schluss
// wenn nein fehler abbrechen und ganzen prozess nochmal starten
//echo $md5sums;
}
function DownloadUpdate()
{
}
function CheckDownloadedUpdate()
{
}
function ExecuteUpdate()
{
}
function Request($command,$parameter)
{
global $erp;
$auth['serial']=trim($erp->Firmendaten("lizenz"));//$this->conf['serial'];
$auth['authkey']=trim($erp->Firmendaten("schluessel"));//$this->conf['authkey'];
$auth = base64_encode(json_encode($auth));
$parameter = base64_encode(json_encode($parameter));
$client = new HttpClient($this->conf['host'],$this->conf['port']);
$client->post('/upgradesystem.php', array( "authjson" => $auth, "parameterjson"=>$parameter,"command"=>"$command" ));
$pageContents = $client->getContent();
return $pageContents;
}
function dir_rekursiv($verzeichnis)
{
$handle = opendir($verzeichnis);
while ($datei = readdir($handle))
{
if ($datei != "." && $datei != "..")
{
if (is_dir($verzeichnis.$datei)) // Wenn Verzeichniseintrag ein Verzeichnis ist
{
// Erneuter Funktionsaufruf, um das aktuelle Verzeichnis auszulesen
$this->dir_rekursiv($verzeichnis.$datei.'/');
}
else
{
// Wenn Verzeichnis-Eintrag eine Datei ist, diese ausgeben
$this->localmd5sums[$verzeichnis.$datei] = md5_file($verzeichnis.$datei);
}
}
}
closedir($handle);
}
}
/* Version 0.9, 6th April 2003 - Simon Willison ( http://simon.incutio.com/ )
Manual: http://scripts.incutio.com/httpclient/
*/
class HttpClient {
// Request vars
var $host;
var $port;
var $path;
var $method;
var $postdata = '';
var $cookies = array();
var $referer;
var $accept = 'text/xml,application/xml,application/xhtml+xml,text/html,text/plain,image/png,image/jpeg,image/gif,*/*';
var $accept_encoding = 'gzip';
var $accept_language = 'en-us';
var $user_agent = 'Incutio HttpClient v0.9';
// Options
var $timeout = 20;
var $use_gzip = true;
var $persist_cookies = true; // If true, received cookies are placed in the $this->cookies array ready for the next request
// Note: This currently ignores the cookie path (and time) completely. Time is not important,
// but path could possibly lead to security problems.
var $persist_referers = true; // For each request, sends path of last request as referer
var $debug = false;
var $handle_redirects = true; // Auaomtically redirect if Location or URI header is found
var $max_redirects = 5;
var $headers_only = false; // If true, stops receiving once headers have been read.
// Basic authorization variables
var $username;
var $password;
// Response vars
var $status;
var $headers = array();
var $content = '';
var $errormsg;
// Tracker variables
var $redirect_count = 0;
var $cookie_host = '';
function __construct($host, $port=80) {
$this->host = $host;
$this->port = $port;
}
function get($path, $data = false) {
$this->path = $path;
$this->method = 'GET';
if ($data) {
$this->path .= '?'.$this->buildQueryString($data);
}
return $this->doRequest();
}
function post($path, $data) {
$this->path = $path;
$this->method = 'POST';
$this->postdata = $this->buildQueryString($data);
return $this->doRequest();
}
function buildQueryString($data) {
$querystring = '';
if (is_array($data)) {
// Change data in to postable data
foreach ($data as $key => $val) {
if (is_array($val)) {
foreach ($val as $val2) {
$querystring .= urlencode($key).'='.urlencode($val2).'&';
}
} else {
$querystring .= urlencode($key).'='.urlencode($val).'&';
}
}
$querystring = substr($querystring, 0, -1); // Eliminate unnecessary &
} else {
$querystring = $data;
}
return $querystring;
}
function doRequest() {
// Performs the actual HTTP request, returning true or false depending on outcome
if(!fsockopen("ssl://".$this->host, $this->port, $errno, $errstr, $this->timeout) && $this->port==443)
{
$this->port=80;
}
if($this->port==443)
$url = "ssl://".$this->host;
else
$url = $this->host;
if (!$fp = @fsockopen($url, $this->port, $errno, $errstr, $this->timeout)) {
// Set error message
switch($errno) {
case -3:
$this->errormsg = 'Socket creation failed (-3)';
case -4:
$this->errormsg = 'DNS lookup failure (-4)';
case -5:
$this->errormsg = 'Connection refused or timed out (-5)';
default:
$this->errormsg = 'Connection failed ('.$errno.')';
$this->errormsg .= ' '.$errstr;
$this->debug($this->errormsg);
}
return false;
}
stream_set_timeout($fp, $this->timeout);
$request = $this->buildRequest();
$this->debug('Request', $request);
fwrite($fp, $request);
// Reset all the variables that should not persist between requests
$this->headers = array();
$this->content = '';
$this->errormsg = '';
// Set a couple of flags
$inHeaders = true;
$atStart = true;
// Now start reading back the response
while (!feof($fp)) {
$line = fgets($fp, 4096);
if ($atStart) {
// Deal with first line of returned data
$atStart = false;
if (!preg_match('/HTTP\/(\\d\\.\\d)\\s*(\\d+)\\s*(.*)/', $line, $m)) {
$this->errormsg = "Status code line invalid: ".htmlentities($line);
$this->debug($this->errormsg);
//return false;
}
$http_version = $m[1]; // not used
$this->status = $m[2];
$status_string = $m[3]; // not used
$this->debug(trim($line));
continue;
}
if ($inHeaders) {
if (trim($line) == '') {
$inHeaders = false;
$this->debug('Received Headers', $this->headers);
if ($this->headers_only) {
break; // Skip the rest of the input
}
continue;
}
if (!preg_match('/([^:]+):\\s*(.*)/', $line, $m)) {
// Skip to the next header
continue;
}
$key = strtolower(trim($m[1]));
$val = trim($m[2]);
// Deal with the possibility of multiple headers of same name
if (isset($this->headers[$key])) {
if (is_array($this->headers[$key])) {
$this->headers[$key][] = $val;
} else {
$this->headers[$key] = array($this->headers[$key], $val);
}
} else {
$this->headers[$key] = $val;
}
continue;
}
// We're not in the headers, so append the line to the contents
$this->content .= $line;
}
fclose($fp);
// If data is compressed, uncompress it
if (isset($this->headers['content-encoding']) && $this->headers['content-encoding'] == 'gzip') {
$this->debug('Content is gzip encoded, unzipping it');
$this->content = substr($this->content, 10); // See http://www.php.net/manual/en/function.gzencode.php
$this->content = gzinflate($this->content);
}
// If $persist_cookies, deal with any cookies
if ($this->persist_cookies && isset($this->headers['set-cookie']) && $this->host == $this->cookie_host) {
$cookies = $this->headers['set-cookie'];
if (!is_array($cookies)) {
$cookies = array($cookies);
}
foreach ($cookies as $cookie) {
if (preg_match('/([^=]+)=([^;]+);/', $cookie, $m)) {
$this->cookies[$m[1]] = $m[2];
}
}
// Record domain of cookies for security reasons
$this->cookie_host = $this->host;
}
// If $persist_referers, set the referer ready for the next request
if ($this->persist_referers) {
$this->debug('Persisting referer: '.$this->getRequestURL());
$this->referer = $this->getRequestURL();
}
// Finally, if handle_redirects and a redirect is sent, do that
if ($this->handle_redirects) {
if (++$this->redirect_count >= $this->max_redirects) {
$this->errormsg = 'Number of redirects exceeded maximum ('.$this->max_redirects.')';
$this->debug($this->errormsg);
$this->redirect_count = 0;
return false;
}
$location = isset($this->headers['location']) ? $this->headers['location'] : '';
$uri = isset($this->headers['uri']) ? $this->headers['uri'] : '';
if ($location || $uri) {
$url = parse_url($location.$uri);
// This will FAIL if redirect is to a different site
return $this->get($url['path']);
}
}
return true;
}
function buildRequest() {
$headers = array();
$headers[] = "{$this->method} {$this->path} HTTP/1.0"; // Using 1.1 leads to all manner of problems, such as "chunked" encoding
$headers[] = "Host: {$this->host}";
$headers[] = "User-Agent: {$this->user_agent}";
$headers[] = "Accept: {$this->accept}";
if ($this->use_gzip) {
$headers[] = "Accept-encoding: {$this->accept_encoding}";
}
$headers[] = "Accept-language: {$this->accept_language}";
if ($this->referer) {
$headers[] = "Referer: {$this->referer}";
}
// Cookies
if ($this->cookies) {
$cookie = 'Cookie: ';
foreach ($this->cookies as $key => $value) {
$cookie .= "$key=$value; ";
}
$headers[] = $cookie;
}
// Basic authentication
if ($this->username && $this->password) {
$headers[] = 'Authorization: BASIC '.base64_encode($this->username.':'.$this->password);
}
// If this is a POST, set the content type and length
if ($this->postdata) {
$headers[] = 'Content-Type: application/x-www-form-urlencoded';
$headers[] = 'Content-Length: '.strlen($this->postdata);
}
$request = implode("\r\n", $headers)."\r\n\r\n".$this->postdata;
return $request;
}
function getStatus() {
return $this->status;
}
function getContent() {
return $this->content;
}
function getHeaders() {
return $this->headers;
}
function getHeader($header) {
$header = strtolower($header);
if (isset($this->headers[$header])) {
return $this->headers[$header];
} else {
return false;
}
}
function getError() {
return $this->errormsg;
}
function getCookies() {
return $this->cookies;
}
function getRequestURL() {
$url = 'http://'.$this->host;
if ($this->port != 80) {
$url .= ':'.$this->port;
}
$url .= $this->path;
return $url;
}
// Setter methods
function setUserAgent($string) {
$this->user_agent = $string;
}
function setAuthorization($username, $password) {
$this->username = $username;
$this->password = $password;
}
function setCookies($array) {
$this->cookies = $array;
}
// Option setting methods
function useGzip($boolean) {
$this->use_gzip = $boolean;
}
function setPersistCookies($boolean) {
$this->persist_cookies = $boolean;
}
function setPersistReferers($boolean) {
$this->persist_referers = $boolean;
}
function setHandleRedirects($boolean) {
$this->handle_redirects = $boolean;
}
function setMaxRedirects($num) {
$this->max_redirects = $num;
}
function setHeadersOnly($boolean) {
$this->headers_only = $boolean;
}
function setDebug($boolean) {
$this->debug = $boolean;
}
// "Quick" static methods
function quickGet($url) {
$bits = parse_url($url);
$host = $bits['host'];
$port = isset($bits['port']) ? $bits['port'] : 80;
$path = isset($bits['path']) ? $bits['path'] : '/';
if (isset($bits['query'])) {
$path .= '?'.$bits['query'];
}
$client = new HttpClient($host, $port);
if (!$client->get($path)) {
return false;
} else {
return $client->getContent();
}
}
function quickPost($url, $data) {
$bits = parse_url($url);
$host = $bits['host'];
$port = isset($bits['port']) ? $bits['port'] : 80;
$path = isset($bits['path']) ? $bits['path'] : '/';
$client = new HttpClient($host, $port);
if (!$client->post($path, $data)) {
return false;
} else {
return $client->getContent();
}
}
function debug($msg, $object = false) {
if ($this->debug) {
print '<div style="border: 1px solid red; padding: 0.5em; margin: 0.5em;"><strong>HttpClient Debug:</strong> '.$msg;
if ($object) {
ob_start();
print_r($object);
$content = htmlentities(ob_get_contents());
ob_end_clean();
print '<pre>'.$content.'</pre>';
}
print '</div>';
}
}
}

View File

@ -1,783 +0,0 @@
<?php
require_once __DIR__ . '/xentral_autoloader.php';
if (class_exists(Config::class)){
$config = new Config();
$updateHost = $config->updateHost ?: 'removed.upgrade.host';
}else{
$updateHost = 'removed.upgrade.host';
}
$WAWISION['host']=$updateHost;
$WAWISION['port']="443";
$myUpd = new UpgradeClient($WAWISION,$this->app);
echo "STARTE UPDATE\n";
echo "Im folgenden stehen die Dateien die geaendert wurden.\n
Erscheinen keine Dateien sind Sie auf der neusten Version.\n";
$myUpd->Connect();
//$myUpd->CheckCRT();
$myUpd->CheckUpdate();
$myUpd->CheckUpdateCustom();
$myUpd->CheckUpdateModules();
class UpgradeClient
{
var $localmd5sums;
function __construct($conf,&$app)
{
$this->conf = $conf;
$this->app=&$app;
}
function Connect()
{
// check connection then stop
}
function CheckCRT()
{
$cert = shell_exec("openssl s_client -connect update.embedded-projects.net:443 < /dev/null 2>/dev/null | openssl x509 -in /dev/stdin");
if($cert==$this->conf['cert']."\n") return 1;
else {
echo "wrong\n";
exit;
}
}
function CheckUpdate()
{
$parameter['version']=@$this->conf['version'];
$result = $this->Request("md5list",$parameter);
if($result=="ERROR") { echo "Updates: ERROR FROM SERVER (Perhaps a wrong license?)\n"; return;}
$rows = explode(";",$result);
if(count($rows)>0)
{
foreach($rows as $value)
{
unset($single_row);
$single_row = explode(":",$value);
if(count($single_row)>=2 && strlen($single_row[0])>3 && strlen($single_row[1])>3)
{
$filename = $single_row[0];
$file = __DIR__."/".$single_row[0];
$md5sum = $single_row[1];
$parameter['file']=$filename;
$parameter['md5sum']=$md5sum;
if($file=="./upgradesystemclient.php")
{
}
else if(is_file($file))
{
// pruefe md5sum
if(md5_file($file)!=$md5sum)
{
// wenn update dann UPD_
echo "update <- $file\n";
$result = $this->Request("getfile",$parameter);
$output = (base64_decode($result));
//$output = preg_replace('/[^(\x22-\x7F)\x0A]*/','', $output);
file_put_contents($file."UPD", $output);
/*
$fp = fopen($file."UPD","wb+");
fwrite($fp,base64_decode($result));
fclose($fp);
*/
// pruefsuemme neu berechnen wenn passt umbenennen und ins archiv
echo md5_file($file."UPD");
echo "-".$md5sum."\n";
if(md5_file($file."UPD")==$md5sum)
{
echo "update ok $file\n";
rename($file."UPD",$file);
}
}
} else if($file!="") {
echo "datei <- $file\n";
// pruefe ob es verzeichnis gibt
$verzeichnis = dirname($file);
if(!is_dir($verzeichnis))
{
echo "verzeichnis <- $verzeichnis\n";
mkdir($verzeichnis,0777,true);
}
$result = $this->Request("getfile",$parameter);
$output = base64_decode($result);
//$output = iconv("UTF-8","ISO-8859-1//IGNORE",$output);
//$output = iconv("ISO-8859-1","UTF-8",$output);
//$output = preg_replace('/[^(\x20-\x7F)\x0A]*/','', $output);
file_put_contents($file."NEW", $output);
/*$fp = fopen($file."NEW","wb+");
fwrite($fp,base64_decode($result));
fclose($fp);
*/
if(md5_file($file."NEW")==$md5sum)
{
echo "datei ok $file\n";
rename($file."NEW",$file);
} else {
// echo "datei XX $file local: ".md5_file($file."NEW")." remote: ".$md5sum."\n";
}
} else { }
}
}
}
//pruefe, update, lege verzeichnis an, lege datei an, loesche datei????
// download all files with UPD_ prefix
// get md5 liste von server
// pruefe ob alle dateien passen, wenn ja dann alle updaten am schluss
// wenn nein fehler abbrechen und ganzen prozess nochmal starten
//echo $md5sums;
}
function CheckUpdateModules()
{
$parameter['version']=@$this->conf['version'];
$result = $this->Request("md5listmodules",$parameter);
if($result=="ERROR") { echo "Modules: ERROR FROM SERVER (Perhaps a wrong license?)\n"; return;}
$rows = explode(";",$result);
if(count($rows)>0)
{
foreach($rows as $value)
{
unset($single_row);
$single_row = explode(":",$value);
if(count($single_row)>=2 && strlen($single_row[0])>3 && strlen($single_row[1])>3)
{
$filename = $single_row[0];
$file = dirname(__FILE__)."/".$single_row[0];
$md5sum = $single_row[1];
$parameter['file']=$filename;
$parameter['md5sum']=$md5sum;
if($file=="./upgradesystemclient.php")
{
}
else if(is_file($file))
{
// pruefe md5sum
if(md5_file($file)!=$md5sum)
{
// wenn update dann UPD_
echo "update (M) <- $file\n";
$result = $this->Request("getfilemodules",$parameter);
$output = (base64_decode($result));
//$output = preg_replace('/[^(\x22-\x7F)\x0A]*/','', $output);
file_put_contents($file."UPD", $output);
/*
$fp = fopen($file."UPD","wb+");
fwrite($fp,base64_decode($result));
fclose($fp);
*/
// pruefsuemme neu berechnen wenn passt umbenennen und ins archiv
echo md5_file($file."UPD");
echo "-".$md5sum."\n";
if(md5_file($file."UPD")==$md5sum)
{
echo "update (M) ok $file\n";
rename($file."UPD",$file);
}
}
} else if($file!="") {
echo "datei (M) <- $file\n";
// pruefe ob es verzeichnis gibt
$verzeichnis = dirname($file);
if(!is_dir($verzeichnis))
{
echo "verzeichnis (M) <- $verzeichnis\n";
mkdir($verzeichnis,0777,true);
}
$result = $this->Request("getfilemodules",$parameter);
$output = base64_decode($result);
//$output = iconv("UTF-8","ISO-8859-1//IGNORE",$output);
//$output = iconv("ISO-8859-1","UTF-8",$output);
//$output = preg_replace('/[^(\x20-\x7F)\x0A]*/','', $output);
file_put_contents($file."NEW", $output);
/*$fp = fopen($file."NEW","wb+");
fwrite($fp,base64_decode($result));
fclose($fp);
*/
if(md5_file($file."NEW")==$md5sum)
{
echo "datei (M) ok $file\n";
rename($file."NEW",$file);
} else {
// echo "datei XX $file local: ".md5_file($file."NEW")." remote: ".$md5sum."\n";
}
} else { }
}
}
}
//pruefe, update, lege verzeichnis an, lege datei an, loesche datei????
// download all files with UPD_ prefix
// get md5 liste von server
// pruefe ob alle dateien passen, wenn ja dann alle updaten am schluss
// wenn nein fehler abbrechen und ganzen prozess nochmal starten
//echo $md5sums;
}
function CheckUpdateCustom()
{
$parameter['version']=@$this->conf['version'];
$result = $this->Request("md5listcustom",$parameter);
if($result=="ERROR") { echo "Custom: ERROR FROM SERVER (Perhaps a wrong license?)\n"; return;}
$rows = explode(";",$result);
if(count($rows)>0)
{
foreach($rows as $value)
{
unset($single_row);
$single_row = explode(":",$value);
if(count($single_row)>=2 && strlen($single_row[0])>3 && strlen($single_row[1])>3)
{
$filename = $single_row[0];
$file = __DIR__."/".$single_row[0];
$md5sum = $single_row[1];
$parameter['file']=$filename;
$parameter['md5sum']=$md5sum;
if($file=="./upgradesystemclient.php")
{
}
else if(is_file($file))
{
// pruefe md5sum
if(md5_file($file)!=$md5sum)
{
// wenn update dann UPD_
echo "update (C) <- $file\n";
$result = $this->Request("getfilecustom",$parameter);
$output = (base64_decode($result));
//$output = preg_replace('/[^(\x22-\x7F)\x0A]*/','', $output);
file_put_contents($file."UPD", $output);
/*
$fp = fopen($file."UPD","wb+");
fwrite($fp,base64_decode($result));
fclose($fp);
*/
// pruefsuemme neu berechnen wenn passt umbenennen und ins archiv
echo md5_file($file."UPD");
echo "-".$md5sum."\n";
if(md5_file($file."UPD")==$md5sum)
{
echo "update (C) ok $file\n";
rename($file."UPD",$file);
}
}
} else if($file!="") {
echo "datei (C) <- $file\n";
// pruefe ob es verzeichnis gibt
$verzeichnis = dirname($file);
if(!is_dir($verzeichnis))
{
echo "verzeichnis (C) <- $verzeichnis\n";
mkdir($verzeichnis,0777,true);
}
$result = $this->Request("getfilecustom",$parameter);
$output = base64_decode($result);
//$output = iconv("UTF-8","ISO-8859-1//IGNORE",$output);
//$output = iconv("ISO-8859-1","UTF-8",$output);
//$output = preg_replace('/[^(\x20-\x7F)\x0A]*/','', $output);
file_put_contents($file."NEW", $output);
/*$fp = fopen($file."NEW","wb+");
fwrite($fp,base64_decode($result));
fclose($fp);
*/
if(md5_file($file."NEW")==$md5sum)
{
echo "datei (C) ok $file\n";
rename($file."NEW",$file);
} else {
// echo "datei XX $file local: ".md5_file($file."NEW")." remote: ".$md5sum."\n";
}
} else { }
}
}
}
//pruefe, update, lege verzeichnis an, lege datei an, loesche datei????
// download all files with UPD_ prefix
// get md5 liste von server
// pruefe ob alle dateien passen, wenn ja dann alle updaten am schluss
// wenn nein fehler abbrechen und ganzen prozess nochmal starten
//echo $md5sums;
}
function DownloadUpdate()
{
}
function CheckDownloadedUpdate()
{
}
function ExecuteUpdate()
{
}
function Request($command,$parameter)
{
global $erp;
$auth['serial']=$this->app->erp->Firmendaten("lizenz");//$this->conf['serial'];
$auth['authkey']=$this->app->erp->Firmendaten("schluessel");//$this->conf['authkey'];
$auth = base64_encode(json_encode($auth));
$parameter = base64_encode(json_encode($parameter));
$client = new HttpClientUpgrade($this->conf['host'],$this->conf['port']);
$client->post('/upgradesystem.php', array( "authjson" => $auth, "parameterjson"=>$parameter,"command"=>"$command" ));
$pageContents = $client->getContent();
return $pageContents;
}
function dir_rekursiv($verzeichnis)
{
$handle = opendir($verzeichnis);
while ($datei = readdir($handle))
{
if ($datei != "." && $datei != "..")
{
if (is_dir($verzeichnis.$datei)) // Wenn Verzeichniseintrag ein Verzeichnis ist
{
// Erneuter Funktionsaufruf, um das aktuelle Verzeichnis auszulesen
$this->dir_rekursiv($verzeichnis.$datei.'/');
}
else
{
// Wenn Verzeichnis-Eintrag eine Datei ist, diese ausgeben
$this->localmd5sums[$verzeichnis.$datei] = md5_file($verzeichnis.$datei);
}
}
}
closedir($handle);
}
}
/* Version 0.9, 6th April 2003 - Simon Willison ( http://simon.incutio.com/ )
Manual: http://scripts.incutio.com/httpclient/
*/
class HttpClientUpgrade {
// Request vars
var $host;
var $port;
var $path;
var $method;
var $postdata = '';
var $cookies = array();
var $referer;
var $accept = 'text/xml,application/xml,application/xhtml+xml,text/html,text/plain,image/png,image/jpeg,image/gif,*/*';
var $accept_encoding = 'gzip';
var $accept_language = 'en-us';
var $user_agent = 'Incutio HttpClientUpgrade v0.9';
// Options
var $timeout = 20;
var $use_gzip = true;
var $persist_cookies = true; // If true, received cookies are placed in the $this->cookies array ready for the next request
// Note: This currently ignores the cookie path (and time) completely. Time is not important,
// but path could possibly lead to security problems.
var $persist_referers = true; // For each request, sends path of last request as referer
var $debug = false;
var $handle_redirects = true; // Auaomtically redirect if Location or URI header is found
var $max_redirects = 5;
var $headers_only = false; // If true, stops receiving once headers have been read.
// Basic authorization variables
var $username;
var $password;
// Response vars
var $status;
var $headers = array();
var $content = '';
var $errormsg;
// Tracker variables
var $redirect_count = 0;
var $cookie_host = '';
function __construct($host, $port=80) {
$this->host = $host;
$this->port = $port;
}
function get($path, $data = false) {
$this->path = $path;
$this->method = 'GET';
if ($data) {
$this->path .= '?'.$this->buildQueryString($data);
}
return $this->doRequest();
}
function post($path, $data) {
$this->path = $path;
$this->method = 'POST';
$this->postdata = $this->buildQueryString($data);
return $this->doRequest();
}
function buildQueryString($data) {
$querystring = '';
if (is_array($data)) {
// Change data in to postable data
foreach ($data as $key => $val) {
if (is_array($val)) {
foreach ($val as $val2) {
$querystring .= urlencode($key).'='.urlencode($val2).'&';
}
} else {
$querystring .= urlencode($key).'='.urlencode($val).'&';
}
}
$querystring = substr($querystring, 0, -1); // Eliminate unnecessary &
} else {
$querystring = $data;
}
return $querystring;
}
function doRequest() {
// Performs the actual HTTP request, returning true or false depending on outcome
// check if port is available
if(!fsockopen("ssl://".$this->host, $this->port, $errno, $errstr, $this->timeout) && $this->port==443)
{
$this->port=80;
}
if($this->port==443)
$url = "ssl://".$this->host;
else
$url = $this->host;
if (!$fp = @fsockopen($url, $this->port, $errno, $errstr, $this->timeout)) {
// Set error message
switch($errno) {
case -3:
$this->errormsg = 'Socket creation failed (-3)';
case -4:
$this->errormsg = 'DNS lookup failure (-4)';
case -5:
$this->errormsg = 'Connection refused or timed out (-5)';
default:
$this->errormsg = 'Connection failed ('.$errno.')';
$this->errormsg .= ' '.$errstr;
$this->debug($this->errormsg);
}
return false;
}
stream_set_timeout($fp, $this->timeout);
$request = $this->buildRequest();
$this->debug('Request', $request);
fwrite($fp, $request);
// Reset all the variables that should not persist between requests
$this->headers = array();
$this->content = '';
$this->errormsg = '';
// Set a couple of flags
$inHeaders = true;
$atStart = true;
// Now start reading back the response
while (!feof($fp)) {
$line = fgets($fp, 4096);
if ($atStart) {
// Deal with first line of returned data
$atStart = false;
if (!preg_match('/HTTP\/(\\d\\.\\d)\\s*(\\d+)\\s*(.*)/', $line, $m)) {
$this->errormsg = "Status code line invalid: ".htmlentities($line);
$this->debug($this->errormsg);
//return false;
}
$http_version = $m[1]; // not used
$this->status = $m[2];
$status_string = $m[3]; // not used
$this->debug(trim($line));
continue;
}
if ($inHeaders) {
if (trim($line) == '') {
$inHeaders = false;
$this->debug('Received Headers', $this->headers);
if ($this->headers_only) {
break; // Skip the rest of the input
}
continue;
}
if (!preg_match('/([^:]+):\\s*(.*)/', $line, $m)) {
// Skip to the next header
continue;
}
$key = strtolower(trim($m[1]));
$val = trim($m[2]);
// Deal with the possibility of multiple headers of same name
if (isset($this->headers[$key])) {
if (is_array($this->headers[$key])) {
$this->headers[$key][] = $val;
} else {
$this->headers[$key] = array($this->headers[$key], $val);
}
} else {
$this->headers[$key] = $val;
}
continue;
}
// We're not in the headers, so append the line to the contents
$this->content .= $line;
}
fclose($fp);
// If data is compressed, uncompress it
if (isset($this->headers['content-encoding']) && $this->headers['content-encoding'] == 'gzip') {
$this->debug('Content is gzip encoded, unzipping it');
$this->content = substr($this->content, 10); // See http://www.php.net/manual/en/function.gzencode.php
$this->content = gzinflate($this->content);
}
// If $persist_cookies, deal with any cookies
if ($this->persist_cookies && isset($this->headers['set-cookie']) && $this->host == $this->cookie_host) {
$cookies = $this->headers['set-cookie'];
if (!is_array($cookies)) {
$cookies = array($cookies);
}
foreach ($cookies as $cookie) {
if (preg_match('/([^=]+)=([^;]+);/', $cookie, $m)) {
$this->cookies[$m[1]] = $m[2];
}
}
// Record domain of cookies for security reasons
$this->cookie_host = $this->host;
}
// If $persist_referers, set the referer ready for the next request
if ($this->persist_referers) {
$this->debug('Persisting referer: '.$this->getRequestURL());
$this->referer = $this->getRequestURL();
}
// Finally, if handle_redirects and a redirect is sent, do that
if ($this->handle_redirects) {
if (++$this->redirect_count >= $this->max_redirects) {
$this->errormsg = 'Number of redirects exceeded maximum ('.$this->max_redirects.')';
$this->debug($this->errormsg);
$this->redirect_count = 0;
return false;
}
$location = isset($this->headers['location']) ? $this->headers['location'] : '';
$uri = isset($this->headers['uri']) ? $this->headers['uri'] : '';
if ($location || $uri) {
$url = parse_url($location.$uri);
// This will FAIL if redirect is to a different site
return $this->get($url['path']);
}
}
return true;
}
function buildRequest() {
$headers = array();
$headers[] = "{$this->method} {$this->path} HTTP/1.0"; // Using 1.1 leads to all manner of problems, such as "chunked" encoding
$headers[] = "Host: {$this->host}";
$headers[] = "User-Agent: {$this->user_agent}";
$headers[] = "Accept: {$this->accept}";
if ($this->use_gzip) {
$headers[] = "Accept-encoding: {$this->accept_encoding}";
}
$headers[] = "Accept-language: {$this->accept_language}";
if ($this->referer) {
$headers[] = "Referer: {$this->referer}";
}
// Cookies
if ($this->cookies) {
$cookie = 'Cookie: ';
foreach ($this->cookies as $key => $value) {
$cookie .= "$key=$value; ";
}
$headers[] = $cookie;
}
// Basic authentication
if ($this->username && $this->password) {
$headers[] = 'Authorization: BASIC '.base64_encode($this->username.':'.$this->password);
}
// If this is a POST, set the content type and length
if ($this->postdata) {
$headers[] = 'Content-Type: application/x-www-form-urlencoded';
$headers[] = 'Content-Length: '.strlen($this->postdata);
}
$request = implode("\r\n", $headers)."\r\n\r\n".$this->postdata;
return $request;
}
function getStatus() {
return $this->status;
}
function getContent() {
return $this->content;
}
function getHeaders() {
return $this->headers;
}
function getHeader($header) {
$header = strtolower($header);
if (isset($this->headers[$header])) {
return $this->headers[$header];
} else {
return false;
}
}
function getError() {
return $this->errormsg;
}
function getCookies() {
return $this->cookies;
}
function getRequestURL() {
$url = 'http://'.$this->host;
if ($this->port != 80) {
$url .= ':'.$this->port;
}
$url .= $this->path;
return $url;
}
// Setter methods
function setUserAgent($string) {
$this->user_agent = $string;
}
function setAuthorization($username, $password) {
$this->username = $username;
$this->password = $password;
}
function setCookies($array) {
$this->cookies = $array;
}
// Option setting methods
function useGzip($boolean) {
$this->use_gzip = $boolean;
}
function setPersistCookies($boolean) {
$this->persist_cookies = $boolean;
}
function setPersistReferers($boolean) {
$this->persist_referers = $boolean;
}
function setHandleRedirects($boolean) {
$this->handle_redirects = $boolean;
}
function setMaxRedirects($num) {
$this->max_redirects = $num;
}
function setHeadersOnly($boolean) {
$this->headers_only = $boolean;
}
function setDebug($boolean) {
$this->debug = $boolean;
}
// "Quick" static methods
function quickGet($url) {
$bits = parse_url($url);
$host = $bits['host'];
$port = isset($bits['port']) ? $bits['port'] : 80;
$path = isset($bits['path']) ? $bits['path'] : '/';
if (isset($bits['query'])) {
$path .= '?'.$bits['query'];
}
$client = new HttpClientUpgrade($host, $port);
if (!$client->get($path)) {
return false;
} else {
return $client->getContent();
}
}
function quickPost($url, $data) {
$bits = parse_url($url);
$host = $bits['host'];
$port = isset($bits['port']) ? $bits['port'] : 80;
$path = isset($bits['path']) ? $bits['path'] : '/';
$client = new HttpClientUpgrade($host, $port);
if (!$client->post($path, $data)) {
return false;
} else {
return $client->getContent();
}
}
function debug($msg, $object = false) {
if ($this->debug) {
print '<div style="border: 1px solid red; padding: 0.5em; margin: 0.5em;"><strong>HttpClientUpgrade Debug:</strong> '.$msg;
if ($object) {
ob_start();
print_r($object);
$content = htmlentities(ob_get_contents());
ob_end_clean();
print '<pre>'.$content.'</pre>';
}
print '</div>';
}
}
}

View File

@ -1,928 +0,0 @@
<?php
require_once __DIR__ . '/xentral_autoloader.php';
if (class_exists(Config::class)){
$config = new Config();
$updateHost = $config->updateHost ?: 'removed.upgrade.host';
}else{
$updateHost = 'removed.upgrade.host';
}
define('XENTRAL_UPDATE_HOST', $updateHost);
$WAWISION['host']=XENTRAL_UPDATE_HOST;
$WAWISION['port']="443";
$myUpd = new UpgradeClient($WAWISION,$this->app);
$myUpd->Connect();
if(isset($sendStats)) {
}
elseif(isset($buy)) {
}
elseif(isset($getBuyList)) {
}
elseif(isset($getBuyInfo)) {
}
elseif(isset($setBeta)) {
}
elseif(isset($setDevelopmentVersion)) {
}
elseif(isset($buyFromDemo)) {
}
elseif(isset($resetXentral)) {
}
elseif(isset($fiskalyCommand)) {
}
elseif(isset($createFiskalyClientFromClientId) && isset($tseId) && isset($organizationId)) {
}
elseif(isset($sma) && isset($sendSmaErrorMessage)) {
}
else{
}
if(!class_exists('Md5Dateien'))
{
class Md5Dateien
{
var $Dateien;
function __construct($quellverzeichnis)
{
$this->getVerzeichnis($quellverzeichnis, '', 0, '');
}
function getVerzeichnis($quellverzeichnis, $zielverzeichnis, $lvl, $relativ){
//echo "Verzeichnis: ".$quellverzeichnis." ".$zielverzeichnis. "\r\n";
$quelllast = $quellverzeichnis;
if($quellverzeichnis[strlen($quellverzeichnis) - 1] == '/')$quelllast = substr($quellverzeichnis, 0, strlen($quellverzeichnis) - 1);
$path_parts = pathinfo($quelllast);
$quelllast = $path_parts['basename'];
if(file_exists($quellverzeichnis))
{
if($quelllast != 'importer' || $lvl != 1){
if ($handle = opendir($quellverzeichnis)) {
while (false !== ($entry = readdir($handle))) {
if($entry != '.' && $entry != '..' && $entry != '.git' && $entry != '.svn' && $entry != 'main.conf.php' && $entry != 'user.inc.php' && $entry != 'user_db_version.php' && $entry != 'pygen')
{
if(is_dir($quellverzeichnis.'/'.$entry))
{
if(!($lvl == 1 && $entry == 'vorlagen' && strpos($quellverzeichnis,'www')))
$this->getVerzeichnis($quellverzeichnis.(strrpos($quellverzeichnis,'/')!==strlen($quellverzeichnis)-1?'/':'').$entry,$zielverzeichnis .(strrpos($zielverzeichnis,'/')!==strlen($zielverzeichnis)-1?'/':'').$entry, $lvl + 1,$relativ.'/'.$entry);
} else {
if(!($lvl == 0 && ($entry == 'INSTALL' || $entry == 'LICENSE_LIST' || $entry == 'LICENSE' || $entry == 'README' || $entry == 'gitlog.txt')))
{
//$this->getFile($quellverzeichnis.(strrpos($quellverzeichnis,'/')!==strlen($quellverzeichnis)-1?'/':'').$entry,$zielverzeichnis .(strrpos($zielverzeichnis,'/')!==strlen($zielverzeichnis)-1?'/':'').$entry,$relativ.'/'.$entry);
if(strtolower(substr($entry,-4)) == '.php')$this->Dateien[$relativ.'/'.$entry] = md5_file($quellverzeichnis.(strrpos($quellverzeichnis,'/')!==strlen($quellverzeichnis)-1?'/':'').$entry);
}
}
}
}
@closedir($handle);
} else {
}
}
} else {
}
return true;
}
}
}
class UpgradeClient
{
var $localmd5sums;
/**
* UpgradeClient constructor.
*
* @param Config $conf
* @param ApplicationCore $app
*/
public function __construct($conf, $app)
{
$this->conf = $conf;
$this->app = $app;
}
function Connect()
{
// check connection then stop
}
function CheckCRT()
{
$updateHost = XENTRAL_UPDATE_HOST;
$cert = shell_exec("openssl s_client -connect {$updateHost}:443 < /dev/null 2>/dev/null | openssl x509 -in /dev/stdin");
if($cert==$this->conf['cert']."\n") return 1;
else {
echo "wrong\n";
exit;
}
}
function CheckUpdate()
{
//$this->dir_rekursiv("./");
//$parameter['md5sums'] = $this->localmd5sums;
//shell_exec('find ./ -exec md5sum "{}" \;');
$lines = null;
$funktions_ind = null;
$dateien = new Md5Dateien(__DIR__.'/');
if(!empty($dateien->Dateien) && is_array($dateien->Dateien)) {
foreach($dateien->Dateien as $k => $v) {
if(
strtolower(substr($k,-4)) === '.php'
&& strpos($k, '_custom') !== false
&& strpos($k,'/vendor/') === false
) {
$datei = __DIR__.$k;
if(!file_exists($datei)) {
continue;
}
$fh = fopen($datei, 'r');
if(!$fh) {
continue;
}
$f_ind = -1;
if(isset($lines)) {
unset($lines);
}
$i = -1;
while(($line = fgets($fh)) !== false) {
$i++;
$lines[$i] = $line;
if(isset($funktions_ind) && isset($funktions_ind[$k])) {
foreach($funktions_ind[$k] as $k2 => $v2) {
if($v2 + 5 >= $i) {
$funktions[$k][$k2][] = $line;
}
}
}
if(strpos($line, 'function') !== false) {
$f_ind++;
for($j = $i-5; $j <= $i; $j++) {
if($j > -1) {
$funktions[$k][$f_ind][] = $lines[$j];
}
}
$funktions_ind[$k][$f_ind] = $i;
}
}
fclose($fh);
}
}
}
$parameter['version'] = @$this->conf['version'];
if(isset($funktions)) {
$parameter['funktionen'] = $funktions;
$this->Request("versionen", $parameter);
}
if (is_file(__DIR__ . '/marketing_labels.txt')) {
$parameter['marketing_labels'] = explode(',', (string)@file_get_contents(__DIR__ . '/marketing_labels.txt'));
}
$result = $this->Request("md5list",$parameter);
if($result==="ERROR") {
echo "Updates: ERROR FROM SERVER (Perhaps a wrong license?)\n";
return;
}
$rows = explode(";",$result);
if(count($rows)>0)
{
foreach($rows as $value)
{
unset($single_row);
$single_row = explode(":",$value);
if(count($single_row)>=2 && strlen($single_row[0])>3 && strlen($single_row[1])>3)
{
$filename = $single_row[0];
$file = __DIR__."/".$single_row[0];
$md5sum = $single_row[1];
$parameter['file']=$filename;
$parameter['md5sum']=$md5sum;
if($file==="./upgradesystemclient.php")
{
}
else if(is_file($file))
{
// pruefe md5sum
if(md5_file($file)!=$md5sum)
{
// wenn update dann UPD_
echo "update <- $file\n";
$result = $this->Request("getfile",$parameter);
$output = (base64_decode($result));
//$output = preg_replace('/[^(\x22-\x7F)\x0A]*/','', $output);
file_put_contents($file."UPD", $output);
/*
$fp = fopen($file."UPD","wb+");
fwrite($fp,base64_decode($result));
fclose($fp);
*/
// pruefsuemme neu berechnen wenn passt umbenennen und ins archiv
echo md5_file($file."UPD");
echo "-".$md5sum."\n";
if(md5_file($file."UPD")==$md5sum)
{
echo "update ok $file\n";
rename($file."UPD",$file);
}
}
} else if($file!="") {
echo "datei <- $file\n";
// pruefe ob es verzeichnis gibt
$verzeichnis = dirname($file);
if(!is_dir($verzeichnis))
{
echo "verzeichnis <- $verzeichnis\n";
mkdir($verzeichnis,0777,true);
}
$result = $this->Request("getfile",$parameter);
$output = base64_decode($result);
//$output = iconv("UTF-8","ISO-8859-1//IGNORE",$output);
//$output = iconv("ISO-8859-1","UTF-8",$output);
//$output = preg_replace('/[^(\x20-\x7F)\x0A]*/','', $output);
file_put_contents($file."NEW", $output);
/*$fp = fopen($file."NEW","wb+");
fwrite($fp,base64_decode($result));
fclose($fp);
*/
if(md5_file($file."NEW")==$md5sum)
{
echo "datei ok $file\n";
rename($file."NEW",$file);
} else {
// echo "datei XX $file local: ".md5_file($file."NEW")." remote: ".$md5sum."\n";
}
} else { }
}
}
}
//pruefe, update, lege verzeichnis an, lege datei an, loesche datei????
// download all files with UPD_ prefix
// get md5 liste von server
// pruefe ob alle dateien passen, wenn ja dann alle updaten am schluss
// wenn nein fehler abbrechen und ganzen prozess nochmal starten
//echo $md5sums;
}
function CheckUpdateModules()
{
$parameter['version']=@$this->conf['version'];
$result = $this->Request("md5listmodules",$parameter);
if($result=="ERROR") { echo "Modules: ERROR FROM SERVER (Perhaps a wrong license?)\n"; return;}
$rows = explode(";",$result);
if(count($rows)>0)
{
foreach($rows as $value)
{
unset($single_row);
$single_row = explode(":",$value);
if(count($single_row)>=2 && strlen($single_row[0])>3 && strlen($single_row[1])>3)
{
$filename = $single_row[0];
$file = dirname(__FILE__)."/".$single_row[0];
$md5sum = $single_row[1];
$parameter['file']=$filename;
$parameter['md5sum']=$md5sum;
if($file=="./upgradesystemclient.php")
{
}
else if(is_file($file))
{
// pruefe md5sum
if(md5_file($file)!=$md5sum)
{
// wenn update dann UPD_
echo "update (M) <- $file\n";
$result = $this->Request("getfilemodules",$parameter);
$output = (base64_decode($result));
//$output = preg_replace('/[^(\x22-\x7F)\x0A]*/','', $output);
file_put_contents($file."UPD", $output);
/*
$fp = fopen($file."UPD","wb+");
fwrite($fp,base64_decode($result));
fclose($fp);
*/
// pruefsuemme neu berechnen wenn passt umbenennen und ins archiv
echo md5_file($file."UPD");
echo "-".$md5sum."\n";
if(md5_file($file."UPD")==$md5sum)
{
echo "update (M) ok $file\n";
rename($file."UPD",$file);
}
}
} else if($file!="") {
echo "datei (M) <- $file\n";
// pruefe ob es verzeichnis gibt
$verzeichnis = dirname($file);
if(!is_dir($verzeichnis))
{
echo "verzeichnis (M) <- $verzeichnis\n";
mkdir($verzeichnis,0777,true);
}
$result = $this->Request("getfilemodules",$parameter);
$output = base64_decode($result);
//$output = iconv("UTF-8","ISO-8859-1//IGNORE",$output);
//$output = iconv("ISO-8859-1","UTF-8",$output);
//$output = preg_replace('/[^(\x20-\x7F)\x0A]*/','', $output);
file_put_contents($file."NEW", $output);
/*$fp = fopen($file."NEW","wb+");
fwrite($fp,base64_decode($result));
fclose($fp);
*/
if(md5_file($file."NEW")==$md5sum)
{
echo "datei (M) ok $file\n";
rename($file."NEW",$file);
} else {
// echo "datei XX $file local: ".md5_file($file."NEW")." remote: ".$md5sum."\n";
}
} else { }
}
}
}
//pruefe, update, lege verzeichnis an, lege datei an, loesche datei????
// download all files with UPD_ prefix
// get md5 liste von server
// pruefe ob alle dateien passen, wenn ja dann alle updaten am schluss
// wenn nein fehler abbrechen und ganzen prozess nochmal starten
//echo $md5sums;
}
/**
* @param array $data
*
* @return string|null
*/
public function sendSetDevelopmentStatus($data)
{
$parameter['version'] = isset($this->conf['version']) ? $this->conf['version']: null;
$parameter['data'] = $data;
return $this->Request('setdevelopmentversion', $parameter);
}
/**
* @param array $data
*
* @return string|null
*/
public function sendSetBetaStatus($data)
{
$parameter['version'] = isset($this->conf['version']) ? $this->conf['version']: null;
$parameter['data'] = $data;
return $this->Request('setbeta', $parameter);
}
function CheckUpdateKey()
{
$parameter['SERVER_NAME'] = $_SERVER['SERVER_NAME'];
if(!empty($_SERVER['HTTP_HOST']) && (empty($parameter['SERVER_NAME']) || $parameter['SERVER_NAME'] === '_')) {
$parameter['SERVER_NAME'] = $_SERVER['HTTP_HOST'];
}
$parameter['phpversion'] = (String)phpversion();
$parameter['mysqlversion'] = $this->app->DB->GetVersion();
$parameter['version']=@$this->conf['version'];
$result = $this->Request('md5listcustom',$parameter);
if($result==='ERROR') {
return false;
}
$rows = explode(';',$result);
$return = false;
if(count($rows) <= 0) {
return false;
}
foreach($rows as $value) {
unset($single_row);
$single_row = explode(':',$value);
if(count($single_row)>=2 && strlen($single_row[0])>3 && strlen($single_row[1])>3) {
$filename = $single_row[0];
$file = __DIR__.'/'.$single_row[0];
$md5sum = $single_row[1];
$parameter['file']=$filename;
$parameter['md5sum']=$md5sum;
$fileOk = $filename === './key.php';
if(!$fileOk && strpos($md5sum, 'DEL') === false) {
if($filename === './www/themes/new/templates/loginslider.tpl') {
$fileOk = true;
}
elseif(strpos($filename ,'./www/themes/new/templates/') === 0
&& (substr($filename,-4) === '.jpg' || substr($filename,-5) === '.jpeg')
&& strpos($filename, '/', 28) === false) {
$fileOk = true;
}
}
if(!$fileOk) {
continue;
}
if(is_file($file)) {
// pruefe md5sum
if(md5_file($file)!=$md5sum) {
// wenn update dann UPD_
$result = $this->Request('getfilecustom',$parameter);
$output = (base64_decode($result));
file_put_contents($file.'UPD', $output);
if(md5_file($file.'UPD')==$md5sum && $result) {
$return = rename($file.'UPD',$file);
}
}
else {
$return = true;
}
continue;
}
// pruefe ob es verzeichnis gibt
$verzeichnis = dirname($file);
if(!is_dir($verzeichnis) && !mkdir($verzeichnis,0777,true) && !is_dir($verzeichnis)) {
}
$result = $this->Request('getfilecustom',$parameter);
$output = base64_decode($result);
file_put_contents($file.'NEW', $output);
if(md5_file($file.'NEW')==$md5sum) {
$return = rename($file.'NEW',$file);
}
}
}
return $return;
}
function DownloadUpdate()
{
}
function CheckDownloadedUpdate()
{
}
function ExecuteUpdate()
{
}
function Request($command,$parameter)
{
global $erp;
$auth['serial']=$this->app->erp->Firmendaten("lizenz");//$this->conf['serial'];
$auth['authkey']=$this->app->erp->Firmendaten("schluessel");//$this->conf['authkey'];
$auth['SERVER_NAME'] = (isset($_SERVER['SERVER_NAME']) && $_SERVER['SERVER_NAME'] != '')?$_SERVER['SERVER_NAME']:(isset($_SERVER['HTTP_HOST'])?$_SERVER['HTTP_HOST']:'');
$auth = base64_encode(json_encode($auth));
$parameter = base64_encode(json_encode($parameter));
$client = new HttpClientUpgrade($this->conf['host'],$this->conf['port']);
$client->post('/upgradesystem.php', array( "authjson" => $auth, "parameterjson"=>$parameter,"command"=>"$command" ));
$pageContents = $client->getContent();
return $pageContents;
}
function dir_rekursiv($verzeichnis)
{
$handle = opendir($verzeichnis);
while ($datei = readdir($handle))
{
if ($datei != "." && $datei != "..")
{
if (is_dir($verzeichnis.$datei)) // Wenn Verzeichniseintrag ein Verzeichnis ist
{
// Erneuter Funktionsaufruf, um das aktuelle Verzeichnis auszulesen
$this->dir_rekursiv($verzeichnis.$datei.'/');
}
else
{
// Wenn Verzeichnis-Eintrag eine Datei ist, diese ausgeben
$this->localmd5sums[$verzeichnis.$datei] = md5_file($verzeichnis.$datei);
}
}
}
closedir($handle);
}
}
/* Version 0.9, 6th April 2003 - Simon Willison ( http://simon.incutio.com/ )
Manual: http://scripts.incutio.com/httpclient/
*/
class HttpClientUpgrade {
// Request vars
var $host;
var $port;
var $path;
var $method;
var $postdata = '';
var $cookies = array();
var $referer;
var $accept = 'text/xml,application/xml,application/xhtml+xml,text/html,text/plain,image/png,image/jpeg,image/gif,*/*';
var $accept_encoding = 'gzip';
var $accept_language = 'en-us';
var $user_agent = 'Incutio HttpClientUpgrade v0.9';
// Options
var $timeout = 20;
var $use_gzip = true;
var $persist_cookies = true; // If true, received cookies are placed in the $this->cookies array ready for the next request
// Note: This currently ignores the cookie path (and time) completely. Time is not important,
// but path could possibly lead to security problems.
var $persist_referers = true; // For each request, sends path of last request as referer
var $debug = false;
var $handle_redirects = true; // Auaomtically redirect if Location or URI header is found
var $max_redirects = 5;
var $headers_only = false; // If true, stops receiving once headers have been read.
// Basic authorization variables
var $username;
var $password;
// Response vars
var $status;
var $headers = array();
var $content = '';
var $errormsg;
// Tracker variables
var $redirect_count = 0;
var $cookie_host = '';
function __construct($host, $port=80) {
$this->host = $host;
$this->port = $port;
}
function get($path, $data = false) {
$this->path = $path;
$this->method = 'GET';
if ($data) {
$this->path .= '?'.$this->buildQueryString($data);
}
return $this->doRequest();
}
function post($path, $data) {
$this->path = $path;
$this->method = 'POST';
$this->postdata = $this->buildQueryString($data);
return $this->doRequest();
}
function buildQueryString($data) {
$querystring = '';
if (is_array($data)) {
// Change data in to postable data
foreach ($data as $key => $val) {
if (is_array($val)) {
foreach ($val as $val2) {
$querystring .= urlencode($key).'='.urlencode($val2).'&';
}
} else {
$querystring .= urlencode($key).'='.urlencode($val).'&';
}
}
$querystring = substr($querystring, 0, -1); // Eliminate unnecessary &
} else {
$querystring = $data;
}
return $querystring;
}
function doRequest() {
// Performs the actual HTTP request, returning true or false depending on outcome
// check if port is available
if(!fsockopen("ssl://".$this->host, $this->port, $errno, $errstr, $this->timeout) && $this->port==443)
{
$this->port=80;
}
if($this->port==443)
$url = "ssl://".$this->host;
else
$url = $this->host;
if (!$fp = @fsockopen($url, $this->port, $errno, $errstr, $this->timeout)) {
// Set error message
switch($errno) {
case -3:
$this->errormsg = 'Socket creation failed (-3)';
case -4:
$this->errormsg = 'DNS lookup failure (-4)';
case -5:
$this->errormsg = 'Connection refused or timed out (-5)';
default:
$this->errormsg = 'Connection failed ('.$errno.')';
$this->errormsg .= ' '.$errstr;
$this->debug($this->errormsg);
}
return false;
}
socket_set_timeout($fp, $this->timeout);
$request = $this->buildRequest();
$this->debug('Request', $request);
fwrite($fp, $request);
// Reset all the variables that should not persist between requests
$this->headers = array();
$this->content = '';
$this->errormsg = '';
// Set a couple of flags
$inHeaders = true;
$atStart = true;
// Now start reading back the response
while (!feof($fp)) {
$line = fgets($fp, 4096);
if ($atStart) {
// Deal with first line of returned data
$atStart = false;
if (!preg_match('/HTTP\/(\\d\\.\\d)\\s*(\\d+)\\s*(.*)/', $line, $m)) {
$this->errormsg = "Status code line invalid: ".htmlentities($line);
$this->debug($this->errormsg);
//return false;
}
$http_version = $m[1]; // not used
$this->status = $m[2];
$status_string = $m[3]; // not used
$this->debug(trim($line));
continue;
}
if ($inHeaders) {
if (trim($line) == '') {
$inHeaders = false;
$this->debug('Received Headers', $this->headers);
if ($this->headers_only) {
break; // Skip the rest of the input
}
continue;
}
if (!preg_match('/([^:]+):\\s*(.*)/', $line, $m)) {
// Skip to the next header
continue;
}
$key = strtolower(trim($m[1]));
$val = trim($m[2]);
// Deal with the possibility of multiple headers of same name
if (isset($this->headers[$key])) {
if (is_array($this->headers[$key])) {
$this->headers[$key][] = $val;
} else {
$this->headers[$key] = array($this->headers[$key], $val);
}
} else {
$this->headers[$key] = $val;
}
continue;
}
// We're not in the headers, so append the line to the contents
$this->content .= $line;
}
fclose($fp);
// If data is compressed, uncompress it
if (isset($this->headers['content-encoding']) && $this->headers['content-encoding'] == 'gzip') {
$this->debug('Content is gzip encoded, unzipping it');
$this->content = substr($this->content, 10); // See http://www.php.net/manual/en/function.gzencode.php
$this->content = gzinflate($this->content);
}
// If $persist_cookies, deal with any cookies
if ($this->persist_cookies && isset($this->headers['set-cookie']) && $this->host == $this->cookie_host) {
$cookies = $this->headers['set-cookie'];
if (!is_array($cookies)) {
$cookies = array($cookies);
}
foreach ($cookies as $cookie) {
if (preg_match('/([^=]+)=([^;]+);/', $cookie, $m)) {
$this->cookies[$m[1]] = $m[2];
}
}
// Record domain of cookies for security reasons
$this->cookie_host = $this->host;
}
// If $persist_referers, set the referer ready for the next request
if ($this->persist_referers) {
$this->debug('Persisting referer: '.$this->getRequestURL());
$this->referer = $this->getRequestURL();
}
// Finally, if handle_redirects and a redirect is sent, do that
if ($this->handle_redirects) {
if (++$this->redirect_count >= $this->max_redirects) {
$this->errormsg = 'Number of redirects exceeded maximum ('.$this->max_redirects.')';
$this->debug($this->errormsg);
$this->redirect_count = 0;
return false;
}
$location = isset($this->headers['location']) ? $this->headers['location'] : '';
$uri = isset($this->headers['uri']) ? $this->headers['uri'] : '';
if ($location || $uri) {
$url = parse_url($location.$uri);
// This will FAIL if redirect is to a different site
return $this->get($url['path']);
}
}
return true;
}
function buildRequest() {
$headers = array();
$headers[] = "{$this->method} {$this->path} HTTP/1.0"; // Using 1.1 leads to all manner of problems, such as "chunked" encoding
$headers[] = "Host: {$this->host}";
$headers[] = "User-Agent: {$this->user_agent}";
$headers[] = "Accept: {$this->accept}";
if ($this->use_gzip) {
$headers[] = "Accept-encoding: {$this->accept_encoding}";
}
$headers[] = "Accept-language: {$this->accept_language}";
if ($this->referer) {
$headers[] = "Referer: {$this->referer}";
}
// Cookies
if ($this->cookies) {
$cookie = 'Cookie: ';
foreach ($this->cookies as $key => $value) {
$cookie .= "$key=$value; ";
}
$headers[] = $cookie;
}
// Basic authentication
if ($this->username && $this->password) {
$headers[] = 'Authorization: BASIC '.base64_encode($this->username.':'.$this->password);
}
// If this is a POST, set the content type and length
if ($this->postdata) {
$headers[] = 'Content-Type: application/x-www-form-urlencoded';
$headers[] = 'Content-Length: '.strlen($this->postdata);
}
$request = implode("\r\n", $headers)."\r\n\r\n".$this->postdata;
return $request;
}
function getStatus() {
return $this->status;
}
function getContent() {
return $this->content;
}
function getHeaders() {
return $this->headers;
}
function getHeader($header) {
$header = strtolower($header);
if (isset($this->headers[$header])) {
return $this->headers[$header];
} else {
return false;
}
}
function getError() {
return $this->errormsg;
}
function getCookies() {
return $this->cookies;
}
function getRequestURL() {
$url = 'http://'.$this->host;
if ($this->port != 80) {
$url .= ':'.$this->port;
}
$url .= $this->path;
return $url;
}
// Setter methods
function setUserAgent($string) {
$this->user_agent = $string;
}
function setAuthorization($username, $password) {
$this->username = $username;
$this->password = $password;
}
function setCookies($array) {
$this->cookies = $array;
}
// Option setting methods
function useGzip($boolean) {
$this->use_gzip = $boolean;
}
function setPersistCookies($boolean) {
$this->persist_cookies = $boolean;
}
function setPersistReferers($boolean) {
$this->persist_referers = $boolean;
}
function setHandleRedirects($boolean) {
$this->handle_redirects = $boolean;
}
function setMaxRedirects($num) {
$this->max_redirects = $num;
}
function setHeadersOnly($boolean) {
$this->headers_only = $boolean;
}
function setDebug($boolean) {
$this->debug = $boolean;
}
// "Quick" static methods
function quickGet($url) {
$bits = parse_url($url);
$host = $bits['host'];
$port = isset($bits['port']) ? $bits['port'] : 80;
$path = isset($bits['path']) ? $bits['path'] : '/';
if (isset($bits['query'])) {
$path .= '?'.$bits['query'];
}
$client = new HttpClientUpgrade($host, $port);
if (!$client->get($path)) {
return false;
} else {
return $client->getContent();
}
}
function quickPost($url, $data) {
$bits = parse_url($url);
$host = $bits['host'];
$port = isset($bits['port']) ? $bits['port'] : 80;
$path = isset($bits['path']) ? $bits['path'] : '/';
$client = new HttpClientUpgrade($host, $port);
if (!$client->post($path, $data)) {
return false;
} else {
return $client->getContent();
}
}
function debug($msg, $object = false) {
if ($this->debug) {
print '<div style="border: 1px solid red; padding: 0.5em; margin: 0.5em;"><strong>HttpClientUpgrade Debug:</strong> '.$msg;
if ($object) {
ob_start();
print_r($object);
$content = htmlentities(ob_get_contents());
ob_end_clean();
print '<pre>'.$content.'</pre>';
}
print '</div>';
}
}
}

File diff suppressed because it is too large Load Diff

View File

@ -3017,7 +3017,7 @@ class Shopimporter_Shopware6 extends ShopimporterBase
$ordersToProcess = $this->getOrdersToProcess($this->getOrderSearchLimit());
return (!empty(count($ordersToProcess['data'])?count($ordersToProcess['data']):0);
return (!empty(count($ordersToProcess['data'])?count($ordersToProcess['data']):0));
}
/**

View File

@ -90,8 +90,6 @@ class Welcome
$this->app->ActionHandler("mobileapps","WelcomeMobileApps");
$this->app->ActionHandler("spooler","WelcomeSpooler");
$this->app->ActionHandler("redirect","WelcomeRedirect");
$this->app->ActionHandler("upgrade","WelcomeUpgrade");
$this->app->ActionHandler("upgradedb","WelcomeUpgradeDB");
$this->app->ActionHandler("startseite","WelcomeStartseite");
$this->app->ActionHandler("addnote","WelcomeAddNote");
@ -886,8 +884,6 @@ $this->app->Tpl->Add('TODOFORUSER',"<tr><td width=\"90%\">".$tmp[$i]['aufgabe'].
$this->app->Tpl->Parse('AUFGABENPOPUP','aufgaben_popup.tpl');
// ENDE:Aufgabe-Bearbeiten-Popup
$this->XentralUpgradeFeed();
$this->app->erp->RunHook('welcome_start', 1 , $this);
// Xentral 20 database compatibility
@ -1113,97 +1109,6 @@ $this->app->Tpl->Add('TODOFORUSER',"<tr><td width=\"90%\">".$tmp[$i]['aufgabe'].
$this->app->erp->ExitWawi();
}
protected function XentralUpgradeFeed($max=3)
{
if(!$this->app->Conf->WFoffline)
{
$version = $this->app->erp->Version();
$revision = $this->app->erp->Revision();
/*
$tmp = explode('.',$revision);
$branch = strtolower($version).'_'.$tmp[0].'.'.$tmp[1];
$BLOGURL = "https://{$this->app->Conf->updateHost}/wawision_2016.php?branch=".$branch;
$CACHEFILE = $this->app->erp->GetTMP().md5($BLOGURL);
$CACHEFILE2 = $this->app->erp->GetTMP().md5($BLOGURL).'2';
if(!file_exists($CACHEFILE2))
{
if(file_exists($CACHEFILE)){
@unlink($CACHEFILE);
}
}else{
if(trim(file_get_contents($CACHEFILE2)) != $version.$revision){
@unlink($CACHEFILE);
}
}
$CACHETIME = 4; # hours
if(!file_exists($CACHEFILE) || ((time() - filemtime($CACHEFILE)) > 3600 * $CACHETIME)) {
if($feed_contents = @file_get_contents($BLOGURL)) {
$fp = fopen($CACHEFILE, 'w');
fwrite($fp, $feed_contents);
fclose($fp);
@file_put_contents($CACHEFILE2, $version.$revision);
}
}
$feed_contents = file_get_contents($CACHEFILE);
$xml = simplexml_load_string($feed_contents);
$json = json_encode($xml);
$array = json_decode($json,TRUE);
$found = false;
$version_revision = null;
include dirname(dirname(__DIR__)) .'/version.php';
if($version_revision != '') {
$ra = explode('.', $version_revision);
if(isset($ra[2]) && $ra[2] != '') {
$itemsCount = isset($array['channel']['item'])?count($array['channel']['item']):0;
for($i = 0; $i< $itemsCount; $i++) {
if($found !== false) {
unset($array['channel']['item'][$i]);
}
else{
$rev = isset($array['channel']['item'][$i]['guid'])?(string)$array['channel']['item'][$i]['guid']:'';
if($rev === '') {
$rev = trim(trim($array['channel']['item'][$i]['title']),')');
$rev = trim(substr($rev, strrpos($rev, '(')+4));
}
if($rev == $ra[2]) {
$found = $i;
unset($array['channel']['item'][$i]);
}
}
}
}
}
if(!empty($array['channel']) && !empty($array['channel']['item']) && is_array($array['channel']['item'])) {
$itemsCount = isset($array['channel']['item'])?count($array['channel']['item']):0;
for($i = 0; $i < $itemsCount; $i++) {
$this->app->Tpl->Add('WAIWISONFEEDS','<tr><td><b>'.$array['channel']['item'][$i]['title']
.'</b></td></tr><tr><td style="font-size:7pt">'.$array['channel']['item'][$i]['description'].'</td></tr>');
}
}
elseif($found !== false){
$this->app->Tpl->Add('WAIWISONFEEDS','<tr><td><br><b>Ihre Version ist auf dem neusten Stand.</b></td></tr>');
}
$version = $this->app->erp->Version();
if($version==='OSS') {
$this->app->Tpl->Set('INFO', '<br>Sie verwenden die Open-Source Version.');
$this->app->Tpl->Set('TESTBUTTON','<div class="btn">
<a href="index.php?module=appstore&action=testen" class="button" target="_blank">14 Tage Business testen</a>
</div>');
}
$this->app->Tpl->Set('RAND',md5(microtime(true)));
if(!$this->app->erp->RechteVorhanden('welcome','changelog')) {
$this->app->Tpl->Set('BEFORECHANGELOG', '<!--');
$this->app->Tpl->Set('AFTERCHANGELOG', '-->');
}
$this->app->erp->RunHook('welcome_news');
$this->app->Tpl->Parse('WELCOMENEWS','welcome_news.tpl');
*/
}
}
public function WelcomeAddPinwand()
{
@ -1668,156 +1573,6 @@ $this->app->Tpl->Add('TODOFORUSER',"<tr><td width=\"90%\">".$tmp[$i]['aufgabe'].
return $out;
}
public function WelcomeUpgrade()
{
$this->app->erp->MenuEintrag('index.php?module=welcome&action=start','zur&uuml;ck zur Startseite');
$this->app->erp->Headlines('Update f&uuml;r Xentral');
$this->app->Tpl->Set('STARTBUTTON','<!--');
$this->app->Tpl->Set('ENDEBUTTON','-->');
$lizenz = $this->app->erp->Firmendaten('lizenz');
$schluessel = $this->app->erp->Firmendaten('schluessel');
if($lizenz=='' || $schluessel=='')
{
if(is_file('../wawision.inc.php'))
{
include_once '../wawision.inc.php';
$this->app->erp->FirmendatenSet('lizenz',$WAWISION['serial']);
$this->app->erp->FirmendatenSet('schluessel',$WAWISION['authkey']);
}
}
$this->app->erp->MenuEintrag('index.php?module=welcome&action=upgrade','Update');
$this->XentralUpgradeFeed(5);
$result = '';
if($this->app->Secure->GetPOST('upgrade'))
{
ob_start();
// dringend nacheinander, sonst wird das alte upgrade nur ausgefuehrt
if(!is_dir('.svn'))
{
echo "new update system\r\n";
include '../upgradesystemclient2_include.php';
} else {
echo "Update in Entwicklungsversion\r\n";
}
$result .= "\r\n>>>>>>Bitte klicken Sie jetzt auf \"Weiter mit Schritt 2\"<<<<<<\r\n\r\n";
$result .= ob_get_contents();
$result .= "\r\n>>>>>>Bitte klicken Sie jetzt auf \"Weiter mit Schritt 2\"<<<<<<\r\n\r\n";
ob_end_clean();
if(is_dir('.svn'))
{
$version_revision = 'SVN';
} else {
include '../version.php';
}
$result .="\r\nIhre Version: $version_revision\r\n";
} else {
$result .=">>>>>Bitte auf \"Dateien aktualisieren jetzt starten\" klicken<<<<<<\r\n";
}
if($this->app->erp->Firmendaten('version')==''){
$this->app->erp->FirmendatenSet('version', $this->app->erp->RevisionPlain());
}
$doc_root = preg_replace("!{$_SERVER['SCRIPT_NAME']}$!", '', $_SERVER['SCRIPT_FILENAME']); # ex: /var/www
$path = preg_replace("!^{$doc_root}!", '', __DIR__);
$this->app->Tpl->Add('TAB1',"<h2>Schritt 1 von 2: Dateien aktualisieren</h2><table width=\"100%\"><tr valign=\"top\"><td width=\"70%\"><form action=\"\" method=\"post\" class=\"updateForm\"><input type=\"hidden\" name=\"upgrade\" value=\"1\">
<textarea rows=\"15\" cols=\"90\">$result</textarea>
<br><input type=\"submit\" value=\"Dateien aktualisieren jetzt starten\" name=\"upgrade\">&nbsp;
<input type=\"button\" value=\"Weiter mit Schritt 2\" onclick=\"window.location.href='index.php?module=welcome&action=upgradedb'\">&nbsp;
</form></td><td>[WELCOMENEWS]</td></tr></table>");
$this->app->Tpl->Parse('PAGE','tabview.tpl');
}
public function WelcomeUpgradeDB()
{
$this->app->erp->MenuEintrag('index.php?module=welcome&action=start','zur&uuml;ck zur Startseite');
$this->app->erp->Headlines('Update f&uuml;r Xentral');
$lizenz = $this->app->erp->Firmendaten('lizenz');
$schluessel = $this->app->erp->Firmendaten('schluessel');
if($lizenz=='' || $schluessel=='')
{
if(is_file('../wawision.inc.php'))
{
include_once '../wawision.inc.php';
$this->app->erp->FirmendatenSet('lizenz',$WAWISION['serial']);
$this->app->erp->FirmendatenSet('schluessel',$WAWISION['authkey']);
}
}
$this->app->erp->MenuEintrag('index.php?module=welcome&action=upgradedb','Update');
$this->XentralUpgradeFeed(5);
$result = '';
if($this->app->Secure->GetPOST('upgradedb'))
{
ob_start();
// include("upgradesystemclient.php");
$result .="Starte DB Update\r\n";
$this->app->erp->UpgradeDatabase();
$this->app->erp->check_column_missing_run = true;
$this->app->erp->UpgradeDatabase();
if((!empty($this->app->erp->check_column_missing)?count($this->app->erp->check_column_missing):0) > 0)
{
$result .= "\r\n**** INFORMATION DATENBANK ****\r\n";
foreach($this->app->erp->check_column_missing as $tablename=>$columns)
{
$result .= "\r\n";
foreach($columns as $key=>$columname) {
$result .= $tablename . ':' . $columname . "\r\n";
}
}
$result .= "\r\n**** INFORMATION DATENBANK ****\r\n\r\n";
}
if((!empty($this->app->erp->check_index_missing)?count($this->app->erp->check_index_missing):0) > 0)
{
$result .= "\r\n**** INFORMATION DATENBANK INDEXE ****\r\n";
foreach($this->app->erp->check_index_missing as $tablename=>$columns)
{
$result .= "\r\n";
foreach($columns as $key=>$columname) {
$result .= $tablename . ":" . $columname . "\r\n";
}
}
$result .= "\r\n**** INFORMATION DATENBANK INDEXE ****\r\n\r\n";
}
$result .="Fertig DB Update\r\n";
$result .="\r\n\r\nDas Datenbank Update wurde durchgef&uuml;hrt\r\n";
$result .="\r\n>>>>>Sie k&ouml;nnen nun mit Xentral weiterarbeiten.<<<<<<\r\n";
$result .= ob_get_contents();
ob_end_clean();
} else {
$result .="\r\n>>>>>Bitte auf \"Datenbank Anpassungen jetzt durchf&uuml;hren\" klicken<<<<<<\r\n";
}
if($this->app->erp->Firmendaten('version')==''){
$this->app->erp->FirmendatenSet('version', $this->app->erp->RevisionPlain());
}
$doc_root = preg_replace("!{$_SERVER['SCRIPT_NAME']}$!", '', $_SERVER['SCRIPT_FILENAME']); # ex: /var/www
$path = preg_replace("!^{$doc_root}!", '', __DIR__);
$this->app->Tpl->Add('TAB1',"<h2>Schritt 2 von 2: Datenbank anpassen</h2><table width=\"100%\"><tr valign=\"top\"><td width=\"70%\"><form action=\"\" method=\"post\" class=\"updateForm\"><input type=\"hidden\" name=\"upgrade\" value=\"1\">
<textarea rows=\"15\" cols=\"90\">$result</textarea>
<br><input type=\"submit\" value=\"Datenbank Anpassungen jetzt durchf&uuml;hren\" name=\"upgradedb\">&nbsp;
<input type=\"button\" value=\"Zur&uuml;ck\" onclick=\"window.location.href='index.php?module=welcome&action=upgrade'\">&nbsp;
<input type=\"button\" value=\"Abbrechen\" onclick=\"window.location.href='index.php'\">&nbsp;
</form></td><td>[WELCOMENEWS]</td></tr></table>");
$this->app->Tpl->Parse('PAGE','tabview.tpl');
}
public function Termine($date)
{
$userid = $this->app->User->GetID();

File diff suppressed because it is too large Load Diff

View File

@ -1,886 +0,0 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta name="viewport" content="initial-scale=1, user-scalable=no">
<meta http-equiv="cache-control" content="max-age=0" />
<meta http-equiv="cache-control" content="no-cache" />
<meta http-equiv="expires" content="0" />
<meta http-equiv="expires" content="Tue, 01 Jan 1980 1:00:00 GMT" />
<meta http-equiv="pragma" content="no-cache" />
<script type="text/javascript" src="./jquery-update.js"></script>
<script type="text/javascript" src="./jquery-ui-update.js"></script>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<!--<meta name="viewport" content="width=1200, user-scalable=yes" />-->
<title>OpenXE Update</title>
<link rel="stylesheet" type="text/css" href="./jquery-ui.min.css">
<style type="text/css">
@font-face{
font-family: 'Inter';
font-style: normal;
font-weight: 400;
font-display: swap;
src: url('./themes/new/fonts/Inter-Regular.woff2?v=3.13') format("woff2"),
url('./themes/new/fonts/Inter-Regular.woff?v=3.13') format("woff");
}
@font-face {
font-family: 'Inter';
font-style: italic;
font-weight: 400;
font-display: swap;
src: url('./themes/new/fonts/Inter-Italic.woff2?v=3.13') format("woff2"),
url('./themes/new/fonts/Inter-Italic.woff?v=3.13') format("woff");
}
@font-face {
font-family: 'Inter';
font-style: normal;
font-weight: 700;
font-display: swap;
src: url('./themes/new/fonts/Inter-Bold.woff2?v=3.13') format("woff2"),
url('../themes/new/fonts/Inter-Bold.woff?v=3.13') format("woff");
}
@font-face {
font-family: 'Inter';
font-style: italic;
font-weight: 700;
font-display: swap;
src: url('./themes/new/fonts/Inter-BoldItalic.woff2?v=3.13') format("woff2"),
url('./themes/new/fonts/Inter-BoldItalic.woff?v=3.13') format("woff");
}
html, body {
height:100%;
}
body{
background:#ffffff;
font-family: 'Inter', Arial, Helvetica, sans-serif;
font-size: 8pt;
color: var(--grey);
margin: 0;
padding: 0;
line-height:1.4;
height: 100vh;
SCROLLBAR-FACE-COLOR: #fff;
SCROLLBAR-HIGHLIGHT-COLOR: #fff;
SCROLLBAR-SHADOW-COLOR: #fff;
SCROLLBAR-ARROW-COLOR: #d4d4d4;
SCROLLBAR-BASE-COLOR: #d4d4d4;
SCROLLBAR-DARKSHADOW-COLOR: #d4d4d4;
SCROLLBAR-TRACK-COLOR: #fff;
}
h1 {
color:#000;
text-align:center;
width:100%;
font-size:2em;
padding-top:10px;
}
DIV#footer {
height:32px; margin-top:-6px;
width:100%;
text-align:center; color: #c9c9cb;}
DIV#footer ul {
list-style-type:none;width:100%; text-align:center;
margin: 8px 0 0 0;
padding: 0;
}
DIV#footer ul li { color:rgb(73, 73, 73);font-weight:bold;display: inline;
padding-right: 8px;
list-style: none;
font-size: 0.9em;
}
DIV#footer ul li a{ color:rgb(73, 73, 73);font-weight:bold;ext-decoration: none;
}
#page_container
{
/*border: 0px solid rgb(166, 201, 226);
border-right:8px solid rgb(1, 143, 163);
border-left:8px solid rgb(1, 143, 163);*/
background-color:white;
min-height: calc(100vh - 230px);
/*border-bottom:8px solid rgb(1, 143, 163);*/
overflow:auto
}
input[type="button"] {
cursor:pointer;
}
input[type="submit"] {
cursor:pointer;
}
img.details {
cursor:pointer;
}
.button {
width: 300px;
height: 25px;
background: rgb(120, 185, 93);
padding: 10px;
text-align: center;
border-radius: 3px;
color: white !important;
font-weight: bold;
top: 20px;
position: relative;
text-decoration:none;
}
.button2 {
width: 300px;
height: 25px;
/*background: rgb(1, 143, 163);*/
text-align: center;
border-radius: 3px;
color: white !important;
font-weight: bold;
text-decoration:none;
border:1px solid rgb(120, 185, 93) !important;
margin-left:5px;
background: rgb(120, 185, 93);
}
input:disabled {
background: #dddddd;
}
</style>
[CSSLINKS]
[JAVASCRIPT]
<script type="application/javascript">
var aktprozent = 0;
var updateval = '';
function openPermissionbox(data)
{
var html = '';
if(typeof data.FolderError != 'undefined')
{
html += '<h3>In folgenden Ordnern fehlen Schreibrechte</h3>';
$(data.FolderError).each(function(k,v)
{
html += v+'<br />';
});
}
if(typeof data.FileError != 'undefined')
{
html += '<h3>In folgenden Dateien fehlen Schreibrechte</h3>';
$(data.FileError).each(function(k,v)
{
html += v+'<br />';
});
}
$('#permissionbox').dialog('open');
$('#permissionboxcontent').html(html);
}
$(document).ready(function() {
$('#upgrade').prop('disabled',true);
updateval = $('input#upgrade').val();
$('input#upgrade').val('Suche nach Updates. Bitte warten');
$.ajax({
url: 'update.php?action=ajax&cmd=checkforupdate',
type: 'POST',
dataType: 'json',
data: { version: '[AKTVERSION]'},
fail : function( ) {
$('#upgrade').prop('disabled',false);
$('input#upgrade').val(updateval);
},
error : function() {
$('#upgrade').prop('disabled',false);
$('input#upgrade').val(updateval);
},
success: function(data) {
if(typeof data != 'undefined' && data != null && typeof data.reload != 'undefined')
{
$('input#upgrade').val(updateval);
window.location = window.location.href;
}else{
$('#upgrade').prop('disabled',false);
$('input#upgrade').val(updateval);
if(data !== null && typeof data.error != 'undefined' && data.error != '') {
alert(data.error);
}
}
}
});
setInterval(function(){
if(aktprozent > 0)
{
var pr = parseInt(aktprozent);
if(pr > 0)
{
var modulo = pr % 10;
if(modulo < 9)pr++;
updateprogressbardbupgrade(pr);
}
}
},1000);
$('#permissionbox').dialog(
{
modal: true,
autoOpen: false,
minWidth: 940,
title:'Dateirechte',
buttons: {
OK: function() {
$(this).dialog('close');
}
},
close: function(event, ui){
}
});
});
[DATATABLES]
[SPERRMELDUNG]
[AUTOCOMPLETE]
[JQUERY]
</script>
[ADDITIONALJAVASCRIPT]
<style>
.ui-autocomplete-loading { background: white url('images/ui-anim_basic_16x16.gif') right center no-repeat; }
input.ui-autocomplete-input { background-color:#D5ECF2; }
.ui-autocomplete { font-size: 8pt;z-index: 100000 !important ; }
.ui-widget-header {border:0px;}
.ui-dialog { z-index: 10000 !important ;}
[YUICSS]
</style>
</head>
<body class="ex_highlight_row" [BODYSTYLE]>
[SPERRMELDUNGNACHRICHT]
<div class="container_6" style="height:100%;">
<div class="grid_6 bgstyle" style=" min-height: calc(100vh - 150px);">
<table width="100%"><tr valign="top">
[ICONBAR]
<td>
<style>
.ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default {
color:#fff;/*[TPLFIRMENFARBEHELL];*/
background-color:[TPLFIRMENFARBEHELL];
}
.ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight {
border: 1px solid #53bed0;
background:none;
background-color: #E5E4E2;
color: #53bed0;
}
.ui-state-hover a,
.ui-state-hover a:hover,
.ui-state-hover a:link,
.ui-state-hover a:visited {
color: #53bed0;
text-decoration: none;
}
.ui-state-hover,
.ui-widget-content .ui-state-hover,
.ui-widget-header .ui-state-hover,
.ui-state-focus,
.ui-widget-content .ui-state-focus,
.ui-widget-header .ui-state-focus {
border: 1px solid #448dae;
font-weight: normal;
color: #53bed0;
}
.ui-tabs-nav {
background: [TPLFIRMENFARBEHELL];
}
.ui-widget-content {
border-top: 1px solid [TPLFIRMENFARBEHELL];
border-left: 1px solid [TPLFIRMENFARBEHELL];
border-right: 1px solid [TPLFIRMENFARBEHELL];
}
.ui-accordion {
border-bottom: 1px solid [TPLFIRMENFARBEHELL];
}
.ui-state-default, .ui-widget-header .ui-state-default {
border: 0px solid none;
}
.ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default {
border: 0px solid [TPLFIRMENFARBEHELL];
}
.ui-widget-content .ui-state-default a, .ui-widget-header .ui-state-default a, .ui-button-text {
font-size:8pt;
font-weight:bold;
border: 0px;
}
.ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active {
color:#53bed0;
}
.ui-widget-content .ui-state-active a, .ui-widget-header .ui-state-active a {
color:#53bed0;
font-weight:bold;
font-size:8pt;
background-color:[TPLFIRMENFARBEHELL];
border: 0px;
}
ul.ui-tabs-nav {
background: [TPLFIRMENFARBEHELL];
padding:2px;
}
.ui-widget-header {
background: [TPLFIRMENFARBEHELL];
}
.ui-button-icon-primary.ui-icon.ui-icon-closethick
{
background-color:[TPLFIRMENFARBEDUNKEL];
color:white;
}
#toolbar {
padding: 4px;
display: inline-block;
}
/* support: IE7 */
*+html #toolbar {
display: inline;
}
#wawilink
{
display:none;
font-size:150%;
text-align:center;
}
#downloadhinweis
{
display:none;
font-size:150%;
color:#000;
}
#installhinweis
{
display:none;
font-size:150%;
color:#000;
}
#upgradediv
{
display:none;
}
#dbhinweis
{
display:none;
font-size:150%;
color:#000;
}
#wawilink a {
color:#000;
}
@media screen and (max-width: 767px){
#tabsul
{
float:left;
display:block;
width:70%;
padding-left:0vw;
min-width:55vw;
}
#tabsul li a {
width:100%;
display:block;
}
#tabsul li
{
display:none;
}
#tabsul li.menuaktiv
{
display:block;
width:100%;
padding-top:0px;
}
#tabsul li.opentab
{
width:98%;
display:block;
}
#tabsul li.opentab a
{
width:100%;
display:block;
background-color:#53bed0;
}
#scroller2{
max-width:99vw !important;
}
.navdirekt{
min-width:70vw !important;
}
}
</style>
<div id="scroller2" style="margin-top:3px; padding:0px; position:relative; height:53px;">
<h1>OpenXE Update</h1>
</div>
<div id="page_container">
[PAGE]
<div id="progress" style="width:50%;top:100px;left:25%;position:relative;display:block;">
<div id="downloadhinweis">Download:</div>
<div id="progressbardownload"></div>
<div id="installhinweis">Installieren:</div>
<div id="progressbarupdate"></div>
<div id="dbhinweis">Datenbank Update:</div>
<div id="progressbardbupgrade"></div>
<div id="wawilink"><a href="./index.php" class="button">Installation vollst&auml;ndig - Zur&uuml;ck zu OpenXE</a></div>
<div id="upgradediv"><form id="upgradefrm" method="POST" action="index.php?module=welcome&action=upgradedb"><input type="hidden" name="upgradedb" value="1" /><input type="submit" style="display:none;" value=" "></form></div>
</div>
<script type="application/javascript">
var aktversion = '[AKTVERSION]';
var downloadversion = '[AKTVERSION]';
var ioncubeversion = '[IONCUBEVERSION]';
var phpversion = '[PHPVERSION]';
var todownload = null;
var tocopy = null;
var anzcheck = 0;
var runDownloaded = 0;
function versel()
{
downloadversion = $('#verssel').val();
}
function upgrade()
{
if(aktversion && downloadversion)
{
var text = 'Wirklich updaten?';
if(aktversion == downloadversion)
{
}else{
text = 'Wirklich auf neue Version upgraden?';
}
if(confirm(text))
{
anzcheck = 0;
check2();
}
}
}
function check2()
{
if(anzcheck > 10)
{
alert('Verbindungsproblem beim Updaten. Bitte nochmal das Update starten!');
return;
}
$('#downloadhinweis').show();
$('#installhinweis').show();
$('#dbhinweis').show();
anzcheck++;
$( "#progressbardownload" ).progressbar({
value: 0
});
$( "#progressbarupdate" ).progressbar({
value: 0
});
$( "#progressbardbupgrade" ).progressbar({
value: 0
});
aktprozent = 0;
$.ajax({
url: 'update.php?action=ajax&cmd=checkfiles2',
type: 'POST',
dataType: 'json',
data: { version: downloadversion}})
.done( function(data) {
if(typeof data.error != 'undefined')
{
alert(data.error);
return;
}
if(typeof data.FolderError != 'undefined' || typeof data.FileError != 'undefined')
{
openPermissionbox(data);
return;
}
if(downloadversion != aktversion)
{
$.ajax({
url: 'update.php?action=ajax&cmd=changeversion',
type: 'POST',
dataType: 'json',
data: { version: downloadversion}})
.done( function(data) {
if(typeof data.version != 'undefined')
{
if(downloadversion == data.version)
aktversion = data.version;
check2();
}
});
return;
}
if(typeof data.download != 'undefined')
{
todownload = data.download;
}else{
todownload = null;
}
if(typeof data.copy != 'undefined')
{
tocopy = data.copy;
}else{
tocopy = null;
}
if(todownload != null)
{
if(typeof todownload != 'undefined' && todownload > 0)
{
runDownloaded = 0;
return download2(todownload);
}
}else {
runDownloaded++;
if(runDownloaded < 3) {
return download2(1);
}
$( "#progressbardownload" ).progressbar({
value: 100
});
}
if(tocopy != null)
{
if(typeof tocopy != 'undefined' && tocopy > 0)
{
return copy2(tocopy);
}else {
copy2(0);
}
}else {
copy2(0);
}
})
.fail(function( jqXHR, textStatus, errorThrown ) {
alert('Verbindungsproblem beim Updaten. Bitte nochmal das Update starten!');
}
);
}
function download2(anzahl)
{
if(todownload == null)
{
$( "#progressbardownload" ).progressbar({
value: 100
});
if(anzahl > 0)check2();
if(anzahl == 0)copy2();
}
else if((typeof todownload == 'undefined' || todownload == 0) )
{
$( "#progressbardownload" ).progressbar({
value: 100
});
check2();
}else if((todownload == 0))
{
$( "#progressbardownload" ).progressbar({
value: 100
});
check2();
}else{
var len = todownload;
if(anzahl <= len)
{
$( "#progressbardownload" ).progressbar({
value: false
});
}else if(anzahl > len){
$( "#progressbardownload" ).progressbar({
value: 100*((anzahl-len)/anzahl)
});
}
if(len > 0)
{
var j = 0;
for(j = 0; j < 250; j++) {
$.ajax({
url: 'update.php?action=ajax&cmd=downloadfiles2',
type: 'POST',
dataType: 'json',
async: false,
data: {version: downloadversion}
})
.done(
function (data) {
if (typeof data.todownload !== undefined) {
todownload = data.todownload;
if (todownload === null) {
len = 0;
} else {
len = todownload;
runDownloaded = 0;
}
$("#progressbardownload").progressbar({
value: 100 * ((anzahl - len) / anzahl)
});
}
else {
todownload = null;
}
})
.fail(function (jqXHR, textStatus) {
todownload = null;
check2();
});
if(todownload === null) {
break;
}
}
check2();
}
}
}
function copy2(anzahl)
{
if((todownload == null) || (typeof todownload == 'undefined') || (todownload == 0))
{
if((tocopy == null) || (typeof tocopy == 'undefined') || (tocopy == 0))
{
$( "#progressbarupdate" ).progressbar({
value: 100
});
upgradedb2(1);
}
else{
var len = tocopy;
if(anzahl <= len)
{
$( "#progressbarupdate" ).progressbar({
value: false
});
}else if(anzahl > len){
$( "#progressbarupdate" ).progressbar({
value: 100*(len/anzahl)
});
}
if(len > 0)
{
$.ajax({
url: 'update.php?action=ajax&cmd=copyfiles2',
type: 'POST',
dataType: 'json',
data: { version: downloadversion}})
.done(function(data) {
if(typeof data.tocopy != 'undefined')
{
tocopy = data.tocopy;
if(tocopy === null)
{
len = 0;
}else{
len = tocopy;
}
$( "#progressbardownload" ).progressbar({
value: 100*((anzahl-len)/anzahl)
});
copy2(anzahl);
}
})
.fail(function( jqXHR, textStatus, errorThrown ) {
check2();
});
}
}
}else{
check2();
}
}
function updateprogressbardbupgrade(prozent)
{
aktprozent = prozent;
$( "#progressbardbupgrade" ).progressbar({
value: prozent
});
}
var aktdb = null;
var aktsubdb = null;
function upgradedb2(nr)
{
if(anzcheck > 12 && nr == 0) {
return;
}
if(todownload == null || typeof todownload == 'undefined' || todownload == 0)
{
if(tocopy == null || typeof tocopy == 'undefined' || tocopy == 0)
{
if(nr == 1) {
anzcheck = 0;
}
if(nr < 1)
{
updateprogressbardbupgrade(1);
}else{
updateprogressbardbupgrade(8 * nr - 5);
}
aktdb = nr;
$.ajax({
url: 'update.php?action=ajax&cmd=upgradedb',
type: 'POST',
dataType: 'json',
data: {
version: downloadversion,
nummer: (nr!=10 || aktsubdb == null)?nr:nr+'-'+aktsubdb
}})
.done( function(data) {
if(typeof data.nr != 'undefined')
{
var nrar = (data.nr+'').split('-');
nr = parseInt(nrar[ 0 ]);
if(typeof nrar[ 1 ] != 'undefined') {
aktsubdb = parseInt(nrar[ 1 ]);
}
else {
aktsubdb = null;
}
if(nr > 11 || data.nr == null)
{
updateprogressbardbupgrade(100);
$('#wawilink').show();
}else{
updateprogressbardbupgrade(8 * nr);
upgradedb2(data.nr);
}
}
}).fail(function( jqXHR, textStatus, errorThrown ) {
if(aktdb < 12)
{
if(aktdb == 10) {
if(aktsubdb == null) {
aktsubdb = 1;
}
else {
aktsubdb++;
if(aktsubdb > 100) {
aktdb++;
aktsubdb = null;
}
}
}
else {
aktdb++;
aktsubdb = null;
}
upgradedb2(aktdb);
}else {
aktsubdb = null;
$('#upgradediv').show();
$('#upgradefrm').submit();
}
}
);
}else{
check2();
}
}else{
check2();
}
}
</script>
</div>
</td></tr></table>
<div class="clear"></div>
</div>
<!-- end CONTENT -->
<!-- end RIGHT -->
<div id="footer" class="grid_6">
&copy; [YEAR] OpenXE project & Xentral ERP Software GmbH
</div>
<!-- end FOOTER -->
<div class="clear"></div>
</div>
[JSSCRIPTS]
[BODYENDE]
<div id="permissionbox" style="display:none;">
<div id="permissionboxcontent"></div>
</div>
</body>
</html>

View File

@ -1,121 +0,0 @@
<center>
<table border="0" celpadding="0" cellspacing="4" width="100%"
height="100%" align="left">
<tr>
<td valign="top">
<form action="" id="frmlogin" method="post"><br>
<table align="center">
[MULTIDB]
<tr>
<td style="width:100%;text-align:center;"><input style="display:none;width:200px;" id="chtype" type="button" value="Login mit Username / PW" /></td>
</tr>
<tr>
<td align="center"><input type="hidden" name="isbarcode" id="isbarcode" value="0" /><input name="username" type="text" size="45" id="username" placeholder="Benutzer"></td>
</tr>
<tr>
<td align="center"><input name="password" id="password" type="password" size="45" placeholder="Passwort"></td>
</tr>
<tr>
<td align="center"><span id="loginmsg">[LOGINMSG]</span>
<span style="color:red">[LOGINERRORMSG]</span></td>
</tr>
<tr>
<td align="center">[STECHUHRDEVICE]</td>
</tr>
<tr>
<td align="center"><input name="token" id="token" type="text" size="45" autocomplete="off" placeholder="optional OTP"><br></td>
</tr>
<tr>
<td align="center"><br><br><input type="submit" value="anmelden"> <input type="reset"
name="Submit" value="zur&uuml;cksetzen"></td>
</tr>
<tr>
<td><br></td>
<td></td>
</tr>
</table>
</form>
</td>
</tr>
</table>
</center>
<script type="text/javascript">
var siv = null;
document.getElementById("username").focus();
$("#isbarcode").val('0');
$(document).ready(function() {
$( "#username" ).focus();
$( "#username" ).on('keydown',function( event ) {
var which = event.which;
if ( which == 13 ) {
event.preventDefault();
if($( "#username" ).val().indexOf("!!!") < 1)
{
$('#password').focus();
}else{
$('#frmlogin').submit();
}
} else {
var iof = $( "#username" ).val().indexOf("!!!");
if(iof > 0)
{
$('#password').focus();
$('#username').val($( "#username" ).val().substring(0,iof));
$("#isbarcode").val('1');
}
}
});
if(typeof(Storage) !== "undefined") {
[RESETSTORAGE]
var devicecode = localStorage.getItem("devicecode");
if(devicecode)
{
$('#stechuhrdevice').each(function(){
$('#token').hide();
$('#password').hide();
$('#username').hide();
$('#loginmsg').hide();
$('#chtype').show();
$('#chtype').on('click',function()
{
$('#token').show();
$('#password').show();
$('#username').show();
$('#loginmsg').show();
$(this).hide();
clearInterval(siv);
});
$('#code').val(devicecode);
$('#stechuhrdevice').focus();
$( "#stechuhrdevice" ).on('keydown',function( event ) {
setTimeout(function(){
if($('#stechuhrdevice').val().length > 205)
setTimeout(function(){$('#frmlogin').submit();},100);
}, 500);
});
siv = setInterval(function(){$('#stechuhrdevice').focus(),200});
});
} else {
$('#stechuhrdevice').hide();
}
} else {
$('#stechuhrdevice').hide();
}
});
</script>