AlternC/bureau/class/m_messages.php

290 lines
9.2 KiB
PHP

<?php
/*
----------------------------------------------------------------------
LICENSE
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License (GPL)
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
To read the license please visit http://www.gnu.org/copyleft/gpl.html
----------------------------------------------------------------------
*/
/**
* Handle messages (error, warning, info, ok) appearing in API calls.
*
* <p>This class handles messages appearing while calling API functions of AlternC
* Those messages are stored as a number (class-id) and a message
* localized messages are available</p>
* <p>This class also handle inserting those messages into the logging
* system in /var/log/alternc/bureau.log
* </p>
*
* @copyright AlternC-Team 2000-2017 https://alternc.com/
*/
class m_messages {
/** Contains the messages and their ID */
var $arrMessages = array();
var $logfile = "/var/log/alternc/bureau.log";
/** List of possible message level */
var $ARRLEVEL = array("ERROR", "ALERT", "INFO");
/** CSS classes for each level */
var $ARRCSS = array(
// emergency critical warning notice debug : currently not used (from PSR-3)
"ERROR" => "alert-danger",
"ALERT" => "alert-warning",
"INFO" => "alert-success",
);
public function __construct() {
$this->init_msgs();
}
/**
* Record a message, insert it into the logfile.
*
* This function records a message, add it to the logfile,
* and make it available for the web panel to print it later.
*
* @param string $cat The category of the msg array to work with
* @param integer $clsid Which class raises this message
* @param mixed $msg The message
* @param array $param Non-mandatory array of string parameter for this message
* @return boolean TRUE if the message got recorded, FALSE if not.
*
*/
function raise($level = "ERROR", $clsid, $msg, $param = "") {
$arrInfos = array();
$level = strtoupper($level);
if (! in_array($level, $this->ARRLEVEL)) {
throw new Exception('Missing or unknown level in a raise() call');
}
$arrInfos['clsid'] = $clsid;
$arrInfos['msg'] = $msg;
$arrInfos['param'] = is_array($param)?$param:(empty($param)?"":array($param));
$this->arrMessages[$level][] = $arrInfos;
$this->logAlternC($level,$arrInfos);
return true;
}
/**
* Reset the stored messages array
*/
function init_msgs() {
// $me=debug_backtrace(); $this->log("messages", "init_msgs from ".$me[1]["class"].".".$me[1]["function"]);
foreach ($this->ARRLEVEL as $v) {
$this->arrMessages[$v] = array();
}
}
/**
* Tell if there are stored messages for a specific level
* or for all levels (if level is empty)
*
* @param string $level The level of the msg array to work with (if empty or not set, use all levels)
* @return boolean TRUE if there is/are msg recorded.
*
*/
function has_msgs($level="") {
$level = strtoupper($level);
if (in_array($level, $this->ARRLEVEL)) {
return (count($this->arrMessages[$level]) > 0);
} else {
foreach ($this->arrMessages as $v) {
if (count($v) > 0)
return true;
}
return false;
}
}
/**
* Return a string of concateneted messages of all recorded messages
* or only the last message
*
* @param string $level The level of the msg array to work with
* @param boolean $all show all the messages or only the last one
*
* @access private
* @return string Message.
*
*/
function msg_str($level = "ERROR", $all = true) {
$str = "";
$level = strtoupper($level);
if (! in_array($level, $this->ARRLEVEL)) {
throw new Exception('Missing or unknown level in a raise() call');
}
if (! $this->has_msgs($level))
return "";
if ($all) {
foreach ($this->arrMessages[$level] as $k => $arrMsg) {
$args = $arrMsg['param'];
if (is_array($args) && count($args) > 0) {
array_unshift($args, $arrMsg['msg']);
$str .= call_user_func_array("sprintf", $args) . "\n";
} else
$str .= $arrMsg['msg'] . "\n";
}
} else {
$i = count($this->arrMessages[$level]) - 1;
if ($i > 0) {
$arr_msg=$this->arrMessages[$level][$i];
$args = $arr_msg['param'];
if (is_array($args) && count($args) > 0) {
array_unshift($args, $arr_msg['msg']);
$str = call_user_func_array("sprintf", $args);
} else
$str = $arr_msg['msgId'];
}
}
return $str;
}
/**
* Return a message in HTML form with associated CSS
*
* @param string $level The level of the msg array to work with
* @param string $sep The separator used to concatenate msgs
* @param boolean $all show all the messages or only the last one
*
* @return string HTML message
*/
function msg_html($level = "ERROR", $all = true) {
$level = strtoupper($level);
if (! in_array($level, $this->ARRLEVEL)) {
throw new Exception('Missing or unknown level in a raise() call');
}
if (count($this->arrMessages[$level]) == 0)
return "";
$str = $this->msg_str($level, $all);
$str = "<div class='alert " . $this->ARRCSS[$level] . "'>" . nl2br($str) . "</div>";
return $str;
}
/**
* Return all the messages of all levels in HTML form with associated CSS
*
* @param string $sep The separator used to concatenate msgs
* @param boolean $all show all the messages or only the last one
*
* @return string HTML message
*/
function msg_html_all($all = true, $init = false) {
$msg="";
$msg.=$this->msg_html("ERROR", $all);
$msg.=$this->msg_html("INFO", $all);
$msg.=$this->msg_html("ALERT", $all);
if ($init)
$this->init_msgs();
return $msg;
}
/**
* Log a message into /var/log/alternc/bureau.log
*
* This function logs the last message in the /var/log/alternc folder
* allowing sysadmins to know what's happened.
* automatically called by raise()
* @param string $level the error level
* @param array $arrMsg the array containing message info.
* @access private
*/
function logAlternC($level = "ERROR", $arrMsg) {
global $mem;
$args = $arrMsg['param'];
if (is_array($args) && count($args) > 0) {
array_unshift($args, $arrMsg['msg']);
$str = call_user_func_array("sprintf", $args);
} else
$str = $arrMsg['msg'];
@file_put_contents(
$this->logfile,
date("d/m/Y H:i:s") . " - " . get_remote_ip() . " - $level - " . $mem->user["login"] . " - " . $str . "\n",
FILE_APPEND
);
}
/**
* Log an API function call into /var/log/alternc/bureau.log
*
* This function logs in /var/log/alternc an API function call of AlternC
*
* @param integer $clsid Number of the class doing the call
* @param string $function Name of the called function
* @param string $param non-mandatory parameters of the API call
* @return boolean TRUE if the log where successfull, FALSE if not
*
*/
function log($clsid, $function, $param = "") {
global $mem;
return @file_put_contents(
$this->logfile,
date("d/m/Y H:i:s") . " - " . get_remote_ip() . " - CALL - " . $mem->user["login"] . " - $clsid - $function - $param\n",
FILE_APPEND
);
}
/**
* Log an API function call into /var/log/alternc/bureau.log
*
* This function logs in /var/log/alternc an API function call of AlternC
*
* @param integer $clsid Number of the class doing the call
* @param string $function Name of the called function
* @param string $param non-mandatory parameters of the API call
* @return boolean TRUE if the log where successfull, FALSE if not
*
*/
function debug($clsid, $function, $param = "") {
global $mem;
if (variable_get("debug_panel", "0", "Set it to 1 to enable panel debug in /var/log/alternc/bureau.log")) {
return @file_put_contents(
$this->logfile,
date("d/m/Y H:i:s") . " - " . get_remote_ip() . " - DEBUG - " . $mem->user["login"] . " - $clsid - $function - $param\n",
FILE_APPEND
);
}
}
} /* Class m_messages */