$id,
'notice' => $notice,
'url' => $url,
'category' => $category,
'priority' => $priority,
);
$queue[$queuekey] = $toqueue;
$queueout = fopen($notice_path, "w");
if(!$queueout) {
log_error(printf(gettext("Could not open %s for writing"), $notice_path));
return;
}
fwrite($queueout, serialize($queue));
fclose($queueout);
log_error("New alert found: $notice");
/* soekris */
if(file_exists("/dev/led/error"))
exec("/bin/echo 1 > /dev/led/error");
/* wrap & alix */
led_normalize();
led_morse(1, 'sos');
notify_via_growl($notice);
notify_via_smtp($notice);
return $queuekey;
}
/****f* notices/get_notices
* NAME
* get_notices
* INPUTS
* $category
* RESULT
* Returns a specific notices text
******/
function get_notices($category = "all") {
global $g;
if(file_exists("{$g['tmp_path']}/notices")) {
$queue = unserialize(file_get_contents("{$g['tmp_path']}/notices"));
if(!$queue) return false;
if($category != 'all') {
foreach($queue as $time => $notice) {
if(strtolower($notice['category']) == strtolower($category))
$toreturn[$time] = $notice;
}
return $toreturn;
} else {
return $queue;
}
} else {
return false;
}
}
/****f* notices/close_notice
* NAME
* close_notice
* INPUTS
* $id
* RESULT
* Removes a notice from the list
******/
function close_notice($id) {
global $notice_path;
require_once("util.inc");
/* soekris */
if(file_exists("/dev/led/error"))
exec("/bin/echo 0 > /dev/led/error");
/* wrap & alix */
led_normalize();
$ids = array();
if(!$notices = get_notices()) return;
if($id == "all") {
unlink_if_exists($notice_path);
return;
}
foreach(array_keys($notices) as $time) {
if($id == $time) {
unset($notices[$id]);
break;
}
}
foreach($notices as $key => $notice) {
$ids[$key] = $notice['id'];
}
foreach($ids as $time => $tocheck) {
if($id == $tocheck) {
unset($notices[$time]);
break;
}
}
if(count($notices) != 0) {
$queueout = fopen($notice_path, "w");
fwrite($queueout, serialize($notices));
fclose($queueout);
} else {
unlink_if_exists($notice_path);
}
return;
}
/****f* notices/dump_xml_notices
* NAME
* dump_xml_notices
* INPUTS
* NONE
* RESULT
* Outputs notices in XML formatted text
******/
function dump_xml_notices() {
if(file_exists("/cf/conf/use_xmlreader"))
require_once("xmlreader.inc");
else
require_once("xmlparse.inc");
global $notice_path, $listtags;
$listtags[] = 'notice';
if(!$notices = get_notices()) return;
foreach($notices as $time => $notice) {
$notice['time'] = $time;
$toput['notice'][] = $notice;
}
$xml = dump_xml_config($toput, 'notices');
return $xml;
}
/****f* notices/print_notices
* NAME
* print_notices
* INPUTS
* $notices, $category
* RESULT
* prints notices to the GUI
******/
function print_notices($notices, $category = "all") {
foreach($notices as $notice) {
if($category != "all") {
if(in_array($notice['category'], $category)) $categories[] = $notice['category'];
} else {
$categories[] = $notice['category'];
}
}
$categories = array_unique($categories);
sort($categories);
foreach($categories as $category) {
$toreturn .= "
- {$category}
";
foreach($notices as $notice) {
if(strtolower($notice['category']) == strtolower($category)) {
if($notice['id'] != "") {
if($notice['url'] != "") {
$toreturn .= "- {$notice['id']} - {$notice['notice']}
";
} else {
$toreturn .= "- {$notice['id']} - {$notice['notice']}
";
}
}
}
}
$toreturn .= "
";
}
return $toreturn;
}
/****f* notices/print_notice_box
* NAME
* print_notice_box
* INPUTS
* $category
* RESULT
* prints an info box to the GUI
******/
function print_notice_box($category = "all") {
$notices = get_notices();
if(!$notices) return;
print_info_box_np(print_notices($notices, $category));
return;
}
/****f* notices/are_notices_pending
* NAME
* are_notices_pending
* INPUTS
* $category to check
* RESULT
* returns true if notices are pending, false if they are not
******/
function are_notices_pending($category = "all") {
global $notice_path;
if(file_exists($notice_path)) {
return true;
}
return false;
}
/****f* notices/notify_via_smtp
* NAME
* notify_via_smtp
* INPUTS
* notification string to send as an email
* RESULT
* returns true if message was sent
******/
function notify_via_smtp($message, $force = false) {
global $config, $g;
if($g['booting'])
return;
if(isset($config['notifications']['smtp']['disable']) && !$force)
return;
/* Do NOT send the same message twice */
if(file_exists("/var/db/notices_lastmsg.txt")) {
$lastmsg = trim(file_get_contents("/var/db/notices_lastmsg.txt"));
if($lastmsg == $message)
return;
}
/* Store last message sent to avoid spamming */
$fd = fopen("/var/db/notices_lastmsg.txt", "w");
fwrite($fd, $message);
fclose($fd);
send_smtp_message($message, "{$config['system']['hostname']}.{$config['system']['domain']} - Notification");
return;
}
function send_smtp_message($message, $subject = "(no subject)") {
global $config, $g;
require_once("sasl.inc");
require_once("smtp.inc");
if(!$config['notifications']['smtp']['ipaddress'])
return;
if(!$config['notifications']['smtp']['notifyemailaddress'])
return;
$smtp = new smtp_class;
$from = "pfsense@{$config['system']['hostname']}.{$config['system']['domain']}";
$to = $config['notifications']['smtp']['notifyemailaddress'];
$smtp->host_name = $config['notifications']['smtp']['ipaddress'];
$smtp->host_port = empty($config['notifications']['smtp']['port']) ? 25 : $config['notifications']['smtp']['port'];
$smtp->direct_delivery = 0;
$smtp->ssl = ($config['notifications']['smtp']['ssl'] == "checked") ? 1 : 0;
$smtp->debug = 0;
$smtp->html_debug = 0;
$smtp->localhost=$config['system']['hostname'].".".$config['system']['domain'];
if($config['notifications']['smtp']['fromaddress'])
$from = $config['notifications']['smtp']['fromaddress'];
// Use SMTP Auth if fields are filled out
if($config['notifications']['smtp']['username'] &&
$config['notifications']['smtp']['password']) {
$smtp->authentication_mechanism = "PLAIN";
$smtp->user = $config['notifications']['smtp']['username'];
$smtp->password = $config['notifications']['smtp']['password'];
}
$headers = array(
"From: {$from}",
"To: {$to}",
"Subject: {$subject}",
"Date: ".date("r")
);
if($smtp->SendMessage($from, preg_split('/\s*,\s*/', trim($to)), $headers, $message)) {
log_error(sprintf(gettext("Message sent to %s OK"), $to));
return;
} else {
log_error(sprintf(gettext('Could not send the message to %1$s -- Error: %2$s'), $to, $smtp->error));
return(sprintf(gettext('Could not send the message to %1$s -- Error: %2$s'), $to, $smtp->error));
}
}
/****f* notices/notify_via_growl
* NAME
* notify_via_growl
* INPUTS
* notification string to send
* RESULT
* returns true if message was sent
******/
function notify_via_growl($message, $force=false) {
require_once("growl.class");
global $config,$g;
if (isset($config['notifications']['growl']['disable']) && !$force)
return;
/* Do NOT send the same message twice */
if(file_exists("/var/db/growlnotices_lastmsg.txt")) {
$lastmsg = trim(file_get_contents("/var/db/growlnotices_lastmsg.txt"));
if($lastmsg == $message)
return;
}
$hostname = $config['system']['hostname'] . "." . $config['system']['domain'];
$growl_ip = $config['notifications']['growl']['ipaddress'];
$growl_password = $config['notifications']['growl']['password'];
$growl_name = $config['notifications']['growl']['name'];
$growl_notification = $config['notifications']['growl']['notification_name'];
if(!empty($growl_ip)) {
$growl = new Growl($growl_ip, $growl_password, $growl_name);
$growl->notify("{$growl_notification}", gettext(sprintf("%s (%s) - Notification", $g['product_name'], $hostname)), "{$message}");
}
/* Store last message sent to avoid spamming */
$fd = fopen("/var/db/growlnotices_lastmsg.txt", "w");
fwrite($fd, $message);
fclose($fd);
}
/****f* notices/register_via_growl
* NAME
* register_via_growl
* INPUTS
* none
* RESULT
* none
******/
function register_via_growl() {
require_once("growl.class");
global $config;
$growl_ip = $config['notifications']['growl']['ipaddress'];
$growl_password = $config['notifications']['growl']['password'];
$growl_name = $config['notifications']['growl']['name'];
$growl_notification = $config['notifications']['growl']['notification_name'];
if($growl_ip) {
$growl = new Growl($growl_ip, $growl_password, $growl_name);
$growl->addNotification($growl_notification);
$growl->register();
}
}
/* Notify via remote methods only - not via GUI. */
function notify_all_remote($msg) {
notify_via_smtp($msg);
notify_via_growl($msg);
}
?>