app=$app;
if($intern)
{
return;
}
$this->app->ActionHandlerInit($this);
$this->app->ActionHandler("list","SystemlogList");
$this->app->ActionHandler("minidetail","SystemlogMiniDetail");
$this->app->ActionHandler("datenbank","SystemlogDatenbank");
$this->app->ActionHandler("timeout","SystemlogTimeout");
//$this->app->ActionHandler("delete","SystemlogDelete");
//$this->app->ActionHandler("deleteall","SystemlogDeleteAll");
$this->app->DefaultActionHandler("list");
$this->app->ActionHandlerListen($app);
}
/*
function SystemlogDelete()
{
$id = $this->app->Secure->GetGET("id");
$this->app->DB->Delete("DELETE FROM systemlog WHERE id='$id' LIMIT 1");
$msg = $this->app->erp->base64_url_encode("
Der Logeintrag wurde gelöscht!
");
header("Location: index.php?module=systemlog&action=list&msg=$msg");
exit;
}
*/
/*
function SystemlogDeleteAll()
{
$id = $this->app->Secure->GetGET("id");
$this->app->DB->Delete("DELETE FROM systemlog WHERE id > 0");
$msg = $this->app->erp->base64_url_encode("Alle Logeinträge wurden wurden gelöscht!
");
header("Location: index.php?module=systemlog&action=list&msg=$msg");
exit;
}
*/
/**
* @param Application $app
* @param string $name
* @param array $erlaubtevars
*
* @return array
*/
public function TableSearch($app, $name, $erlaubtevars)
{
// in dieses switch alle lokalen Tabellen (diese Live Tabellen mit Suche etc.) für dieses Modul
switch($name) {
case 'systemlog':
$allowed['systemlog'] = array('list');
// headings
$heading = array('', 'Level', 'Zeit', 'Bearbeiter', 'Module', 'Action', 'Parameter', 'Funktion', 'Meldung', 'Menü');
$width = array('4%', '4%', '15%', '10%', '10%', '10%', '10%', '10%', '40%', '10%', '5%');
$findcols = array('open', 'a.level', 'a.datum', 'a.bearbeiter', 'a.module', 'a.action', 'a.parameter', 'a.funktionsname', 'a.meldung', 'a.id');
$searchsql = array("DATE_FORMAT(a.datum,'%d.%m.%Y %H:%i:%s')", 'a.bearbeiter', 'a.module', 'a.meldung', 'a.action', 'a.parameter', 'a.funktionsname');
$defaultorder = 3;
$defaultorderdesc = 1;
$menucol = 1;
$moreinfo = true;
$menu = "";
// SQL statement
$sql = "SELECT SQL_CALC_FOUND_ROWS a.id, 'app->Conf->WFconf['defaulttheme']}/images/details_open.png class=details>' as open, a.level,DATE_FORMAT(a.datum,'%d.%m.%Y %H:%i:%s'), a.bearbeiter,
a.module, a.action, a.parameter, a.funktionsname,a.meldung,CONCAT('module=',a.module,'&action=',a.action,'&id=',a.parameter) FROM systemlog a";
$count = 'SELECT COUNT(a.id) FROM systemlog a';
break;
}
$erg = [];
foreach($erlaubtevars as $k => $v) {
if(isset($$v)) {
$erg[$v] = $$v;
}
}
return $erg;
}
/**
* @return array
*/
public function testDatabase()
{
$ret = ['html' => [],'deleteformdata' => []];
foreach($this->dataBaseLinkings() as $verknuepfung) {
$verknuepfung[4] = 'delete';
$tabelle = $verknuepfung[0];
$spalte = $verknuepfung[1];
$subtabelle = $verknuepfung[2];
$subspalte = $verknuepfung[3];
$subwhere = '';
if(isset($verknuepfung[5]) && $verknuepfung[5] != '' && isset($verknuepfung[6]) && $verknuepfung[6] != ''){
$subwhere = ' AND s.'.$verknuepfung[5]." = '".$verknuepfung[6]."' ";
}
if(isset($verknuepfung[7])) {
$subwhere .= $verknuepfung[7];
}
$check = $this->app->DB->Select(
"SELECT s.`$subspalte`
FROM `$subtabelle` s
LEFT JOIN `$tabelle` t ON s.`$subspalte` = t.`$spalte`
WHERE isnull(t.`$spalte`) AND s.`$subspalte` <> 0 AND not isnull(s.`$subspalte`) $subwhere
LIMIT 1"
);
if($check) {
$aktion = '';
if(isset($verknuepfung[4]) && $verknuepfung[4] === 'delete') {
$aktion = '';
$warnung = true;
$ret['deleteformdata'][] = [
'tabelle'=>$tabelle,
'spalte' => $spalte,
'subtabelle' => $subtabelle,
'subspalte'=>$subspalte,
];
}
$ret['html'][] = ''.$subtabelle.'.'.$subspalte.' | '.$tabelle.'.'.$spalte.' | - | Einträge mit nicht existierender '.$tabelle.'.'.$spalte.' gefunden | '.$aktion.' |
';
$ret['warning'] = true;
}
else{
if(!$this->app->DB->error()) {
$ret['html'][] = ''.$subtabelle.'.'.$subspalte.' | '.$tabelle.'.'.$spalte.' | OK | | |
';
}
}
}
if(!empty($ret['warning']) && method_exists($this->app->erp, 'setSystemHealth')) {
$this->app->erp->setSystemHealth(
'database',
'sql_integrity',
'warning',
'Einträge mit nicht existierender Verknüpfungen gefunden.'
);
}
else {
if(method_exists($this->app->erp, 'setSystemHealth')) {
$this->app->erp->setSystemHealth(
'database',
'sql_integrity',
'ok',
''
);
}
}
return $ret;
}
/**
* @return array
*/
public function dataBaseLinkings()
{
return array(
array('adresse','id','adresse_accounts','adresse','delete'),
array('adresse','id','adresse_kontakte','adresse','delete'),
array('adresse','id','lieferadressen','adresse','delete'),
array('adresse','id','ansprechpartner','adresse','delete'),
array('adresse','id','abrechnungsartikel','adresse'),
array('artikel','id','abrechnungsartikel','artikel'),
//array('adresse','id','dokumente','adresse_from'),
array('adresse','id','dokumente','adresse_to'),
array('adresse','id','dokumente_send','adresse'),
array('artikel','id','einkaufspreise','artikel'),
array('adresse','id','einkaufspreise','adresse'),
array('artikel','id','verkaufspreise','artikel'),
array('drucker','id','drucker_spooler','drucker'),
array('datei','id','datei_version','datei'),
array('datei','id','datei_stichwoerter','datei'),
array('adresse','id','user','adresse'),
array('projekt','id','arbeitspaket','projekt'),
array('lager','id','lager_platz','lager'),
array('lager_platz','id','lager_platz_inhalt','lager_platz'),
array('artikel','id','lager_reserviert','artikel','delete'),
array('adresse','id','lager_reserviert','adresse'),
array('artikel','id','lager_seriennummern','artikel','delete'),
array('artikel','id','lager_platz_inhalt','artikel','delete'),
array('artikel','id','lager_mindesthaltbarkeitsdatum','artikel'),
array('lager_platz','id','lager_mindesthaltbarkeitsdatum','lager_platz'),
array('artikel','id','artikel','variante_von'),
array('artikel','id','stueckliste','stuecklistevonartikel'),
array('artikel','id','stueckliste','artikel'),
array('rechnung','id','rechnung_position','rechnung','delete'),
array('rechnung','id','rechnung_protokoll','rechnung','delete'),
array('auftrag','id','auftrag_position','auftrag','delete'),
array('auftrag','id','auftrag_protokoll','auftrag','delete'),
array('angebot','id','angebot_position','angebot','delete'),
array('angebot','id','angebot_protokoll','angebot','delete'),
array('gutschrift','id','gutschrift_position','gutschrift','delete'),
array('gutschrift','id','gutschrift_protokoll','gutschrift','delete'),
array('bestellung','id','bestellung_position','bestellung','delete'),
array('bestellung','id','bestellung_protokoll','bestellung','delete'),
array('produktion','id','produktion_position','produktion','delete'),
array('produktion','id','produktion_protokoll','produktion','delete'),
array('inventur','id','inventur_position','inventur','delete'),
array('inventur','id','inventur_protokoll','inventur','delete'),
array('adresse','id','rechnung','adresse'),
array('adresse','id','lieferschein','adresse'),
array('adresse','id','gutschrift','adresse'),
array('adresse','id','auftrag','adresse'),
array('adresse','id','angebot','adresse'),
array('adresse','id','bestellung','adresse'),
array('adresse','id','produktion','adresse'),
array('adresse','id','inventur','adresse'),
array('artikel','id','produktion_position','artikel'),
array('artikel','id','rechnung_position','artikel'),
array('artikel','id','auftrag_position','artikel'),
array('artikel','id','lieferschein_position','artikel'),
array('artikel','id','gutschrift_position','artikel'),
array('artikel','id','bestellung_position','artikel'),
array('artikel','id','angebot_position','artikel'),
array('rechnung','id','pdfarchiv','table_id','delete','table_name','rechnung'),
array('auftrag','id','pdfarchiv','table_id','delete','table_name','auftrag'),
array('angebot','id','pdfarchiv','table_id','delete','table_name','angebot'),
array('gutschrift','id','pdfarchiv','table_id','delete','table_name','gutschrift'),
array('bestellung','id','pdfarchiv','table_id','delete','table_name','bestellung'),
array('lieferschein','id','pdfarchiv','table_id','delete','table_name','lieferschein'),
array('produktion','id','pdfarchiv','table_id','delete','table_name','produktion'),
array('rechnung','id','pdfmirror_md5pool','table_id','delete','table_name','rechnung'),
array('auftrag','id','pdfmirror_md5pool','table_id','delete','table_name','auftrag'),
array('angebot','id','pdfmirror_md5pool','table_id','delete','table_name','angebot'),
array('gutschrift','id','pdfmirror_md5pool','table_id','delete','table_name','gutschrift'),
array('bestellung','id','pdfmirror_md5pool','table_id','delete','table_name','bestellung'),
array('lieferschein','id','pdfmirror_md5pool','table_id','delete','table_name','lieferschein'),
array('produktion','id','pdfmirror_md5pool','table_id','delete','table_name','auftrag'),
array('auftrag','id','beleg_chargesnmhd','doctypeid','delete','doctype','auftrag'),
array('angebot','id','beleg_chargesnmhd','doctypeid','delete','doctype','angebot'),
array('gutschrift','id','beleg_chargesnmhd','doctypeid','delete','doctype','gutschrift'),
array('lieferschein','id','beleg_chargesnmhd','doctypeid','delete','doctype','lieferschein'),
array('rechnung','id','beleg_chargesnmhd','doctypeid','delete','doctype','rechnung'),
array('bestellung','id','beleg_chargesnmhd','doctypeid','delete','doctype','bestellung')
);
}
/**
* @param string $table
* @param string $column
* @param string $subTable
* @param string $subColumn
*
* @return int
*/
public function deleteTableEntries($table, $column, $subTable, $subColumn)
{
$ret = 0;
if(empty($table) || empty($column) || empty($subColumn) || empty($subTable)) {
return 0;
}
$linkinSchemas = $this->dataBaseLinkings();
foreach ($linkinSchemas as $linkinSchema) {
$linkinSchema[4] = 'delete';
if(
$table == $linkinSchema[0]
&& $column == $linkinSchema[1]
&& $subTable == $linkinSchema[2]
&& $subColumn == $linkinSchema[3]
&& !empty($linkinSchema[4])
&& $linkinSchema[4] === 'delete'
) {
$subwhere = '';
if(!empty($linkinSchema[5]) && $linkinSchema[5] != '' && isset($linkinSchema[6]) && $linkinSchema[6] != '') {
$subwhere = ' AND s.' . $linkinSchema[5] . " = '" . $linkinSchema[6] . "' ";
}
if(!empty($linkinSchema[7])){
$subwhere .= $linkinSchema[7];
}
$this->app->DB->Delete(
"DELETE `s`
FROM `$subTable` AS `s`
LEFT JOIN `$table` `t` ON s.`$subColumn` = t.`$column`
WHERE isnull(t.`$column`) AND s.`$subColumn` <> 0 AND not isnull(s.`$subColumn`) $subwhere"
);
$anz = (int)$this->app->DB->affected_rows();
if($anz <= 0) {
continue;
}
$ret += $anz;
}
}
return $ret;
}
public function SystemlogDatenbank()
{
if($this->app->Secure->GetPOST('cleanconfirm') && $this->app->Secure->GetPOST('cleanall')) {
$test = $this->testDatabase();
$message = 'Keine Datenintegrietätsprobleme gefunden
';
if(!empty($test['warning']) && !empty($test['deleteformdata'])) {
$sum = 0;
foreach($test['deleteformdata'] as $formdata) {
$anz = $this->deleteTableEntries(
$formdata['tabelle'], $formdata['spalte'], $formdata['subtabelle'], $formdata['subspalte']
);
if($anz > 0) {
$sum += $anz;
}
}
//$anz = $this->deleteTableEntries($tabelle, $spalte, $subtabelle, $subspalte);
$test = $this->testDatabase();
if(empty($test['warning'])) {
$message = sprintf('Es wurden %d Datensätze gelöscht
', $sum);
}
else {
$message = sprintf('Es wurden %d Datensätze gelöscht.
Es konnten nicht alle Datenintegrietätsprobleme gelöst werden
', $sum);
}
}
$this->app->Location->execute(
'index.php?module=systemlog&action=datenbank&msg='.$this->app->erp->base64_url_encode($message)
);
}
$this->SystemlogMenu();
$this->app->Tpl->Add(
'MESSAGE',
''
);
if($this->app->Secure->GetPOST('delete')) {
$tabelle = $this->app->Secure->GetPOST('tabelle');
$spalte = $this->app->Secure->GetPOST('spalte');
$subtabelle = $this->app->Secure->GetPOST('subtabelle');
$subspalte = $this->app->Secure->GetPOST('subspalte');
$anz = $this->deleteTableEntries($tabelle, $spalte, $subtabelle, $subspalte);
if($anz > 0) {
$this->app->Tpl->Add(
'MESSAGE',
''.$anz.' Einträge gelöscht
'
);
$this->SystemlogShowResultTable();
}
}
if($this->app->Secure->GetPOST('testen')) {
$this->SystemlogShowResultTable();
}
$this->app->Tpl->Parse('PAGE','tabview.tpl');
}
public function SystemlogShowResultTable(){
$test = $this->testDatabase();
$warnung = false;
if(!empty($test)) {
$this->app->Tpl->Add(
'TAB1',
'
Tabelle von | zu | Status | Beschreibung | Aktion |
'
);
foreach($test['html'] as $row) {
$this->app->Tpl->Add('TAB1', $row);
}
$warnung = !empty($test['warning']);
}
if($warnung) {
$this->app->Tpl->Add(
'MESSAGE',
'
Vor dem Löschen ist es dringend empfohlen ein Backup der Datenbank zu machen.
'
);
}
$this->app->Tpl->Add('TAB1','
');
}
public function SystemlogMiniDetail()
{
$id = (int)$this->app->Secure->GetGET('id');
$dump = $id <= 0?null:$this->app->DB->SelectRow(
sprintf(
'SELECT `argumente`, `funktionsname`, `dump` FROM `systemlog` WHERE `id` = %d LIMIT 1',
$id
)
);
if(empty($dump)) {
$this->app->ExitXentral();
}
echo 'Argumente der Funktion '.$dump['funktionsname']
.':
'.base64_decode($dump['argumente'])
.'
';
echo '
Dump:'.$dump['dump'].'
';
$this->app->ExitXentral();
}
public function SystemlogTimeout()
{
$cmd = $this->app->Secure->GetGET('cmd');
if(is_numeric($cmd) && (int)$cmd > 0) {
usleep((int)$cmd * 1000000);
}
echo 'Erfolgreich durchgelaufen!';
$this->app->ExitXentral();
}
/**
* @param string $name
*
* @return bool
*/
public function hasExectuableExtension($name) {
if (!function_exists('exec')) {
throw new Exception('Required Function exec is missing');
}
if (!is_string($name)) {
return false;
}
exec(sprintf('whereis %s',$name), $out);
if (empty($out)) {
return false;
}
$result = $out[0];
$resultExploded = explode(':', $result);
array_shift($resultExploded);
return !empty(trim(implode("",$resultExploded)));
}
/**
* @return bool
*/
public function isTls12Available(): bool
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, self::TLS_TEST_URL);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt ($ch, CURLOPT_SSLVERSION, 6);
curl_exec($ch);
$curlInfo = curl_getinfo($ch);
curl_close($ch);
return (int)$curlInfo['http_code'] !== 0;
}
/**
* @return array
*/
public function getCompatibilities()
{
$ret = [];
$typeToMessage = [];
if(!function_exists('fsockopen')) {
$tmp['status'] = 'error';
$tmp['text'] = 'fsocket nicht installiert!';
$ret[] = $tmp;
}
else {
$tmp['status'] = 'ok';
$tmp['text'] = 'fsocket verfügbar';
$ret[] = $tmp;
}
$typeToMessage['fsocket'] = count($ret) - 1;
if(!function_exists('mysqli_connect')) {
$tmp['status'] = 'error';
$tmp['text'] = 'MYSQLi nicht installiert';
$ret[] = $tmp;
}
else {
$tmp['status'] = 'ok';
$tmp['text'] = 'MYSQLi verfügbar';
$ret[] = $tmp;
}
$typeToMessage['mysqli'] = count($ret) - 1;
if(!extension_loaded('mysqlnd')) {
$tmp['status'] = 'error';
$tmp['text'] = 'Mysqlnd nicht installiert';
$ret[] = $tmp;
}
else {
$tmp['status'] = 'ok';
$tmp['text'] = 'Mysqlnd verfügbar';
$ret[] = $tmp;
}
$typeToMessage['mysqlnd'] = count($ret) - 1;
if(!class_exists('\PDO')) {
$tmp['status'] = 'error';
$tmp['text'] = 'PDO nicht installiert';
$ret[] = $tmp;
}
else {
$tmp['status'] = 'ok';
$tmp['text'] = 'PDO verfügbar';
$ret[] = $tmp;
}
$typeToMessage['pdo'] = count($ret) - 1;
if(!function_exists('curl_init')) {
$tmp['status'] = 'error';
$tmp['text'] = 'cURL nicht installiert';
$ret[] = $tmp;
}
else {
$tmp['status'] = 'ok';
$tmp['text'] = 'cURL verfügbar';
$ret[] = $tmp;
}
$typeToMessage['curl'] = count($ret) - 1;
if(!function_exists('stream_socket_enable_crypto')) {
$tmp['status'] = 'error';
$tmp['text'] = 'stream_socket_enable_crypto nicht installiert';
$ret[] = $tmp;
}
else {
$tmp['status'] = 'ok';
$tmp['text'] = 'stream_socket_enable_crypto verfügbar';
$ret[] = $tmp;
}
$typeToMessage['crypto'] = count($ret) - 1;
if(!function_exists('openssl_error_string')) {
$tmp['status'] = 'warning';
$tmp['text'] = 'OpenSSL nicht installiert';
$ret[] = $tmp;
}
else {
$tmp['status'] = 'ok';
$tmp['text'] = 'OpenSSL verfügbar';
$ret[] = $tmp;
}
$typeToMessage['openssl'] = count($ret) - 1;
if(!function_exists('mb_encode_numericentity')) {
$tmp['status'] = 'error';
$tmp['text'] = 'php-mbstring nicht installiert';
$ret[] = $tmp;
}
else {
$tmp['status'] = 'ok';
$tmp['text'] = 'php-mbstring verfügbar';
$ret[] = $tmp;
}
$typeToMessage['php-mbstring'] = count($ret) - 1;
if(!class_exists('SoapClient')) {
$tmp['status'] = 'warning';
$tmp['text'] = 'php-soap nicht installiert';
$ret[] = $tmp;
}
else {
$tmp['status'] = 'ok';
$tmp['text'] = 'php-soap verfügbar';
$ret[] = $tmp;
}
$typeToMessage['php-soap'] = count($ret) - 1;
if(!function_exists('imap_open')) {
$tmp['status'] = 'error';
$tmp['text'] = 'imap nicht installiert';
$ret[] = $tmp;
}
else {
$tmp['status'] = 'ok';
$tmp['text'] = 'imap verfügbar';
$ret[] = $tmp;
}
$typeToMessage['imap'] = count($ret) - 1;
if(!function_exists('simplexml_load_string')) {
$tmp['status'] = 'error';
$tmp['text'] = 'php-xml nicht installiert';
$ret[] = $tmp;
}
else {
$tmp['status'] = 'ok';
$tmp['text'] = 'php-xml verfügbar';
$ret[] = $tmp;
}
$typeToMessage['php-xml'] = count($ret) - 1;
if(!class_exists('ZipArchive')) {
$tmp['status'] = 'error';
$tmp['text'] = 'php-zip nicht installiert';
$ret[] = $tmp;
}
else {
$tmp['status'] = 'ok';
$tmp['text'] = 'php-zip verfügbar';
$ret[] = $tmp;
}
$typeToMessage['php-zip'] = count($ret) - 1;
try {
$hasZip = $this->hasExectuableExtension('zip');
}
catch(Exception $e) {
$hasZip = false;
}
if(!$hasZip) {
$tmp['status'] = 'warning';
$tmp['text'] = 'Binary Zip-extension für Kommandozeilen nicht installiert';
$ret[] = $tmp;
if(method_exists($this->app->erp, 'setSystemHealth')){
$this->app->erp->setSystemHealth(
'server',
'extension_zip',
'warning',
'nicht installiert. Backups können nicht erstellt werden'
);
}
}
else {
$tmp['status'] = 'ok';
$tmp['text'] = 'Binary Zip-extension für Kommandozeilen verfügbar';
$ret[] = $tmp;
if(!empty($_GET) && method_exists($this->app->erp, 'setSystemHealth')){
$this->app->erp->setSystemHealth(
'server',
'extension_zip',
'ok',
'installiert.'
);
}
}
$typeToMessage['extension-zip'] = count($ret) - 1;
if(!function_exists('imagejpeg')) {
$tmp['status'] = 'warning';
$tmp['text'] = 'PHP GD-Erweiterung nicht installiert';
$ret[] = $tmp;
}
else {
$tmp['status'] = 'ok';
$tmp['text'] = 'PHP GD-Erweiterung verfügbar';
$ret[] = $tmp;
}
$typeToMessage['php-gd'] = count($ret) - 1;
if(!function_exists('ldap_connect')) {
$tmp['status'] = 'warning';
$tmp['text'] = 'PHP LDAP-Erweiterung nicht installiert';
$ret[] = $tmp;
}
else {
$tmp['status'] = 'ok';
$tmp['text'] = 'PHP LDAP-Erweiterung verfügbar';
$ret[] = $tmp;
}
$typeToMessage['php-ldap'] = count($ret) - 1;
if(!function_exists('ssh2_connect')) {
$tmp['status'] = 'warning';
$tmp['text'] = 'PHP SSH2-Erweiterung nicht installiert';
$ret[] = $tmp;
}
else {
$tmp['status'] = 'ok';
$tmp['text'] = 'PHP SSH2-Erweiterung verfügbar';
$ret[] = $tmp;
}
$typeToMessage['tls1-2'] = count($ret) - 1;
if(!$this->isTls12Available()) {
$tmp['status'] = 'warning';
$tmp['text'] = 'TLS 1.2 ist nicht verfügbar';
$ret[] = $tmp;
if(method_exists($this->app->erp, 'setSystemHealth')){
$this->app->erp->setSystemHealth(
'server',
'tls1-2',
'warning',
'TLS 1.2 ist nicht verfügbar'
);
}
}
else {
$tmp['status'] = 'ok';
$tmp['text'] = 'TLS 1.2 ist verfügbar';
$ret[] = $tmp;
if(method_exists($this->app->erp, 'setSystemHealth')){
$this->app->erp->setSystemHealth(
'server',
'tls1-2',
'ok',
'TLS 1.2 ist verfügbar'
);
}
}
$typeToMessage['php-ssh2'] = count($ret) - 1;
if(!function_exists('ioncube_loader_version')) {
$tmp['status'] = 'warning';
$tmp['text'] = 'Ioncube ist nicht installiert (Eine Installation ist trotzdem möglich)';
$ret[] = $tmp;
}
else {
$ioncube_loader_version = ioncube_loader_version();
if($ioncube_loader_version[0]< 5 && $ioncube_loader_version[1] === '.') {
$tmp['status'] = 'warning';
$tmp['text'] = 'Die Ioncubeversion ist zu alt (Eine Installation ist trotzdem möglich)';
$ret[] = $tmp;
}
else{
$tmp['status'] = 'ok';
$tmp['text'] = 'Ioncube verfügbar';
$ret[] = $tmp;
}
}
$typeToMessage['ioncube'] = count($ret) - 1;
$post_max_size = @ini_get('client_max_body_size');
if($post_max_size == ''){
$post_max_size = @ini_get('post_max_size');
}
if(!$post_max_size) {
$tmp['status'] = 'warning';
$tmp['text'] = 'Es war nicht möglich die verfügbare Upload-Kapazität zu ermitteln. Es werden mindestens 8 MB empfohlen';
$ret[] = $tmp;
}
else{
if(strpos($post_max_size, 'M') !== false) {
$post_max_size = str_replace('M','', $post_max_size);
$post_max_size *= 1024*1024;
}
elseif(strpos($post_max_size, 'K') !== false) {
$post_max_size = str_replace('K','', $post_max_size);
$post_max_size *= 1024;
}
if($post_max_size < 8*1024*1024) {
$tmp['status'] = 'warning';
$tmp['text'] = 'Es sind nur '.round($post_max_size/(1024*1024)).' MB Datei-Upload möglich. Empfohlen werden mindestens 8 MB';
$ret[] = $tmp;
if(method_exists($this->app->erp, 'setSystemHealth')){
$this->app->erp->setSystemHealth(
'server',
'max_upload',
'warning',
'Es sind nur '.round($post_max_size/(1024*1024)).' MB Datei-Upload möglich. Empfohlen werden mindestens 8 MB'
);
}
}
else {
$tmp['status'] = 'ok';
$tmp['text'] = 'Ausreichend Upload-Kapazität verfügbar (>=8MB)';
$ret[] = $tmp;
if(method_exists($this->app->erp, 'setSystemHealth')){
$this->app->erp->setSystemHealth(
'server',
'max_upload',
'ok',
'Ausreichend Upload-Kapazität verfügbar (>=8MB)'
);
}
}
}
$typeToMessage['max_post_size'] = $post_max_size;
$max_execution_time = @ini_get('fastcgi_read_timeout');
if($max_execution_time == ''){
$max_execution_time = @ini_get('max_execution_time');
}
if(!$max_execution_time) {
$tmp['status'] = 'warning';
$tmp['text'] = 'Es war nicht möglich die verfügbare die Scriptlauftzeit zu ermitteln. Es werden mindestens 30 Sekunden empfohlen';
$ret[] = $tmp;
}
elseif($max_execution_time < 30) {
$tmp['status'] = 'warning';
$tmp['text'] = 'Es stehen nur '.$max_execution_time.' Sekunden Scriptlauftzeit zur verfügung. Es werden mindestens 30 Sekunden empfohlen';
$ret[] = $tmp;
if(method_exists($this->app->erp, 'setSystemHealth')){
$this->app->erp->setSystemHealth(
'server',
'max_execution_time',
'warning',
$tmp['text']
);
}
}
else {
$tmp['status'] = 'ok';
$tmp['text'] = 'Es steht genügend Scriptlauftzeit zur Verfügung (>= 30 Sekunden).';
$ret[] = $tmp;
if(method_exists($this->app->erp, 'setSystemHealth')){
$this->app->erp->setSystemHealth(
'server',
'max_execution_time',
'ok',
'Es steht genügend Scriptlauftzeit zur Verfügung (>= 30 Sekunden).'
);
}
}
$typeToMessage['max_execution_size'] = $max_execution_time;
$system_cronjob_memory_limit = (string)$this->app->erp->GetKonfiguration('system_cronjob_memory_limit');
$system_cronjob_max_execution_time = (string)$this->app->erp->GetKonfiguration('system_cronjob_max_execution_time');
if($system_cronjob_memory_limit !== '') {
if((int)$system_cronjob_memory_limit <= 0) {
$tmp['status'] = 'ok';
$tmp['text'] = 'Der Prozessstarter hat genügend Speicher zur Verfügung';
$ret[] = $tmp;
}
elseif((int)$system_cronjob_memory_limit < 256 * 1024 * 1024) {
$tmp['status'] = 'warning';
$tmp['text'] = 'Es stehen nur '.round($system_cronjob_memory_limit / 1024 / 1024).' MB Arbeitsspeicher für den Prozessstarter zur Verfügung';
$ret[] = $tmp;
}
else {
$tmp['status'] = 'ok';
$tmp['text'] = 'Der Prozessstarter hat genügend Speicher zur Verfügung';
$ret[] = $tmp;
}
}
if($system_cronjob_max_execution_time !== '') {
if((int)$system_cronjob_max_execution_time <= 0) {
$tmp['status'] = 'ok';
$tmp['text'] = 'Die Prozessstarterlaufzeit ist unbegrenzt';
$ret[] = $tmp;
}
elseif((int)$system_cronjob_max_execution_time < 300) {
$tmp['status'] = 'warning';
$tmp['text'] = 'Die Prozessstarterlaufzeit beträgt nur '.$system_cronjob_max_execution_time.' Sekunden';
$ret[] = $tmp;
}
else{
$tmp['status'] = 'ok';
$tmp['text'] = 'Die Prozessstarterlaufzeit beträgt '.$system_cronjob_max_execution_time.' Sekunden';
$ret[] = $tmp;
}
}
if(PHP_VERSION < 7.2) {
$tmp['status'] = 'warning';
$tmp['text'] = 'Die PHP Version ist unter 7.2. Ab Xentral 20.2 wird mindestens PHP 7.2 benötigt';
$ret[] = $tmp;
}
if($this->app->DB->GetVersion() < 57) {
$tmp['status'] = 'warning';
$tmp['text'] = 'Die MySQL Version ist unter 5.7. Ab Xentral 20.2 wird mindestens Mysql 5.7 benötigt';
$ret[] = $tmp;
}
$fopenUrlEnabled = ini_get('allow_url_fopen');
$fopenUrlEnabled = strtolower($fopenUrlEnabled);
if(!in_array($fopenUrlEnabled, ['1', 'true', 'on'])){
$ret[] = [
'status' => 'warning',
'text' => 'allow_url_fopen ist nicht in der php.ini aktiviert'
];
}
return ['type_to_message' => $typeToMessage ,'messages' => $ret];
}
public function SystemlogList()
{
$this->SystemlogMenu();
$this->app->YUI->TableSearch('TAB1','systemlog','show','','',basename(__FILE__), __CLASS__);
$cli_infos = [];
$system_phpversion_cli = $this->app->erp->GetKonfiguration('system_phpversion_cli');
if(!empty($system_phpversion_cli)){
$cli_infos[] = 'CLI-PHP-Version: '.$system_phpversion_cli;
}
$system_cronjob_memory_limit = (string)$this->app->erp->GetKonfiguration('system_cronjob_memory_limit');
if($system_cronjob_memory_limit === '-1' || $system_cronjob_memory_limit === '0') {
$cli_infos[] = 'Memory-Limit: unbegrenzt';
}
elseif(!empty($system_cronjob_memory_limit)) {
$cli_infos[] = 'Memory-Limit: '.$system_cronjob_memory_limit;
}
$system_cronjob_max_execution_time = (string)$this->app->erp->GetKonfiguration('system_cronjob_max_execution_time');
if($system_cronjob_max_execution_time === '0') {
$cli_infos[] = 'Max-Execution-Time: unbegrenzt';
}
elseif(!empty($system_cronjob_max_execution_time)) {
$cli_infos[] = 'Max-Execution-Time: '.$system_cronjob_max_execution_time;
}
$system_cronjob_php_ini_loaded_file = $this->app->erp->GetKonfiguration('system_cronjob_php_ini_loaded_file');
if(!empty($system_cronjob_php_ini_loaded_file)) {
$cli_infos[] = 'Geladene ini-Datei: '.$system_cronjob_php_ini_loaded_file;
}
$system_cronjob_get_current_user = $this->app->erp->GetKonfiguration('system_cronjob_get_current_user');
if(!empty($system_cronjob_get_current_user)) {
$cli_infos[] = 'CLI-Benutzer: '.$system_cronjob_get_current_user;
}
$cli_infos[] = 'Xentral-Pfad: '.dirname(dirname(__DIR__));
$cli_infos[] = 'Userdata-Pfad: '.$this->app->Conf->WFuserdata;
$size = (int)$this->app->erp->GetKonfiguration('userdatasize');
if($size > 0) {
$cli_infos[] = 'Useredata: '.number_format($size,0,',','.') .' MB';
}
foreach([
'dms',
'pdfarchiv',
'pdfmirror',
'tmp',
'wiki',
'emailbackup',
'uebertragung',
] as $value) {
$size = (int)$this->app->erp->GetKonfiguration('userdata'.$value.'size');
if($size > 0) {
$cli_infos[] = 'Useredata '.$value.': '.number_format($size,0,',','.') .' MB';
}
}
$backupsize = (int)$this->app->erp->GetKonfiguration('backupsize');
if($backupsize > 0) {
$cli_infos[] = 'Backup: '.number_format($backupsize,0,',','.') .' MB';
}
$databasesize = (int)$this->app->erp->GetKonfiguration('databasesize');
if($databasesize > 0) {
$cli_infos[] = 'Datenbank: '.number_format($databasesize,0,',','.') .' MB';
}
$databasesizelog = (int)$this->app->erp->GetKonfiguration('databasesizelog');
if($databasesizelog > 0) {
$cli_infos[] = 'davon Logeinträge: '.number_format($databasesizelog,0,',','.') .' MB';
}
$lastSizeUpdate = $this->app->erp->GetKonfiguration('lastsizeupdate');
if(!empty($lastSizeUpdate) && strtotime($lastSizeUpdate) > 1) {
$cli_infos[] = 'Letzte Speicherprüfung: '.date('d.m.Y H:i:s',strtotime($lastSizeUpdate));
}
/** @var Systemhealth $sytemHealth */
$sytemHealth = $this->app->loadModule('systemhealth');
$memory = method_exists($sytemHealth, 'getMemory')?$sytemHealth->getMemory():[];
if(!empty($memory['memory'])) {
$cli_infos[] = 'Arbeitssteicher: '.number_format($memory['memory']['sum'] / 1024,0,',','.') .' MB ('.
number_format($memory['memory']['free'] / 1024,0,',','.').' MB frei)';
}
if(!empty($memory['swap'])) {
$cli_infos[] = 'Swap: '.number_format($memory['swap']['sum'] / 1024,0,',','.') .' MB ('.
number_format($memory['swap']['free'] / 1024,0,',','.').' MB frei)';
}
if(!empty($cli_infos)) {
$this->app->Tpl->Add('TAB3',''.implode('
',$cli_infos).'
');
}
$system_cronjob_phpinfo = $this->app->erp->GetKonfiguration('system_cronjob_phpinfo');
if(!empty($system_cronjob_phpinfo)) {
$this->app->Tpl->Add('TAB3','');
}
ob_start();
phpinfo();
$phpinfo = ob_get_clean();
$phpinfo = explode('',$phpinfo,2);
$phpinfo = $phpinfo[1];
$phpinfo = explode('', $phpinfo);
$phpinfo = reset($phpinfo);
$this->app->Tpl->Add('TAB2','');
$this->app->YUI->CkEditor('phpinfo','none',array('height'=>'500px'));
$ret = $this->getCompatibilities();
foreach($ret['messages'] as $Message) {
$this->app->Tpl->Add(
'TAB4',
''.$Message['text']."
\r\n"
);
}
$this->app->Tpl->Parse('PAGE','systemlog_list.tpl');
}
public function SystemlogMenu()
{
$this->app->erp->Headlines('Systemlog');
$this->app->erp->MenuEintrag('index.php?module=servicetools&action=list','Zurück zur Übersicht');
$this->app->erp->MenuEintrag('index.php?module=systemlog&action=list','Aktualisieren');
$this->app->erp->MenuEintrag('index.php?module=systemlog&action=datenbank','Datenbank prüfen');
}
public function Install() {
$this->app->erp->CheckTable('systemlog');
$this->app->erp->CheckColumn('id','int(11)','systemlog','NOT NULL AUTO_INCREMENT');
$this->app->erp->CheckColumn('meldung','TEXT','systemlog','DEFAULT \'\' NOT NULL');
$this->app->erp->CheckColumn('dump','TEXT','systemlog','DEFAULT \'\' NOT NULL');
$this->app->erp->CheckColumn('module','VARCHAR(64)','systemlog','DEFAULT \'\' NOT NULL');
$this->app->erp->CheckColumn('action','VARCHAR(64)','systemlog','DEFAULT \'\' NOT NULL');
$this->app->erp->CheckColumn('bearbeiter','VARCHAR(64)','systemlog','DEFAULT \'\' NOT NULL');
$this->app->erp->CheckColumn('funktionsname','VARCHAR(64)','systemlog','DEFAULT \'\' NOT NULL');
$this->app->erp->CheckColumn('datum','DATETIME','systemlog');
$this->app->erp->CheckColumn('parameter','int(11)','systemlog','DEFAULT 0 NOT NULL');
$this->app->erp->CheckColumn('argumente','TEXT','systemlog','DEFAULT \'\' NOT NULL');
$this->app->erp->CheckColumn('level','int(11)','systemlog','DEFAULT 0 NOT NULL');
$this->app->erp->RegisterHook('systemhealth_cronjob', 'systemlog', 'SystemhealthCronjob');
}
public function SystemhealthCronjob()
{
$this->testDatabase();
$this->getCompatibilities();
}
/**
* @param string $meldung
* @param int $level
* @param string $dump
* @param string $module
* @param string $action
* @param string $functionname
*
* @return int|string|null
*/
public function addSystemLog($meldung='',$level=0,$dump='',$module='',$action='',$functionname='')
{
$isSecure = isset($this->app->Secure);
if($module=='' && $isSecure) {
$module = (string)$this->app->Secure->GetGET('module');
}
if($action=='' && $isSecure) {
$action = (string)$this->app->Secure->GetGET('action');
}
$id = 0;
if($isSecure){
$id = $this->app->Secure->GetGET('id');
}
$argumente = '';
if($functionname=='') {
if (strnatcmp(phpversion(),'5.0.0') >= 0) {
$backtrace = debug_backtrace();
$functionname = $backtrace[1]['function'];
if($functionname!=='Run'){
$argumente = base64_encode(print_r($backtrace[1]['args'], true));
}
}
}
$this->app->DB->Insert(
sprintf(
"INSERT INTO `systemlog` (`module`, `action`, `meldung`, `dump`, `datum`, `bearbeiter`,
`funktionsname`, `parameter`, `argumente`, `level`)
VALUES ('%s','%s','%s','%s',NOW(), '%s', '%s',%d,'%s',%d)",
$module,$action, $meldung, $dump, isset($this->app->User)?$this->app->User->GetName():'',
$this->app->DB->real_escape_string($functionname), $id, $argumente, $level
)
);
return $this->app->DB->GetInsertID();
}
}