|
<?php defined('SYSPATH') or die('No direct script access.');
|
|
/*
|
|
* This file is part of open source system FreeNetIS
|
|
* and it is released under GPLv3 licence.
|
|
*
|
|
* More info about licence can be found:
|
|
* http://www.gnu.org/licenses/gpl-3.0.html
|
|
*
|
|
* More info about project can be found:
|
|
* http://www.freenetis.org/
|
|
*
|
|
*/
|
|
|
|
/**
|
|
* Controller performs specified actions at specified time.
|
|
* This part of system has to be added to CRON.
|
|
*
|
|
* @package Controller
|
|
*/
|
|
class Scheduler_Controller extends Controller
|
|
{
|
|
|
|
/**
|
|
* Redirect to index
|
|
*/
|
|
public function index()
|
|
{
|
|
url::redirect(url::base());
|
|
}
|
|
|
|
/**
|
|
* This function should be regularly launched by scheduler.
|
|
* Scheduler can be bash script run by cron.
|
|
*
|
|
* @author Jiri Svitak
|
|
*/
|
|
public function run()
|
|
{
|
|
// script needs to be run from its server machine
|
|
if (server::remote_addr() != server::server_addr())
|
|
die();
|
|
|
|
$member_model = new Member_Model();
|
|
|
|
// update system lock status every day
|
|
if ((date('H:i') == '00:00'))
|
|
{
|
|
$member_model->update_lock_status();
|
|
}
|
|
|
|
// manage logs
|
|
if ((date('H:i') == '00:00'))
|
|
{
|
|
if (Settings::get('action_logs_active') == '1')
|
|
{
|
|
self::logs_partitions_daily();
|
|
}
|
|
}
|
|
|
|
//send quened SMS
|
|
self::send_quened_sms();
|
|
|
|
//receive SMS
|
|
self::receive_sms();
|
|
|
|
// update ulogd
|
|
|
|
if (Settings::get('ulogd_enabled'))
|
|
self::update_ulogd();
|
|
|
|
// update allowed subnets
|
|
|
|
if (Settings::get('allowed_subnets_enabled'))
|
|
self::update_allowed_subnets();
|
|
|
|
self::send_quened_emails();
|
|
}
|
|
|
|
/**
|
|
* Manage partitions of log table.
|
|
* Add partition for current day and removes 31 days old partition.
|
|
*
|
|
* @see Logs_Controller
|
|
* @author Ondřej Fibich
|
|
*/
|
|
private function logs_partitions_daily()
|
|
{
|
|
$model_log = new Log_Model();
|
|
// add partition for today
|
|
$model_log->add_partition();
|
|
// remove log partition
|
|
try
|
|
{
|
|
$model_log->remove_old_partition();
|
|
}
|
|
catch (Exception $ignore)
|
|
{ // ignore exception - first 30 days do not have older one..
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Function sends SMS messages from db queue.
|
|
*
|
|
* @author Roman Sevcik
|
|
*/
|
|
private function send_quened_sms()
|
|
{
|
|
$model_sms_message = new Sms_message_Model();
|
|
$unsent_messages = $model_sms_message->where(
|
|
'type = ' . Sms_Controller::$SENT .
|
|
' AND state = ' . Sms_Controller::$SENT_UNSENT .
|
|
' AND send_date < CURRENT_TIMESTAMP'
|
|
)->limit(50)->find_all();
|
|
|
|
if (count($unsent_messages) > 0)
|
|
foreach ($unsent_messages as $message)
|
|
{
|
|
switch ($message->driver)
|
|
{
|
|
case Sms::$KLIKNIAVOLEJ:
|
|
|
|
$user = $this->settings->get('sms_user' . Sms::$KLIKNIAVOLEJ);
|
|
$password = $this->settings->get('sms_password' . Sms::$KLIKNIAVOLEJ);
|
|
$test_mode = $this->settings->get('sms_test_mode' . Sms::$KLIKNIAVOLEJ) - 1;
|
|
|
|
$sms = new Sms_Klikniavolej();
|
|
$sms->user($user);
|
|
$sms->password($password);
|
|
$sms->sender($message->sender);
|
|
$sms->recipient($message->receiver);
|
|
if ($test_mode == Sms_Klikniavolej::$TEST_MODE_YES)
|
|
$sms->test(Sms_Klikniavolej::$TEST_MODE_YES);
|
|
$sms->text(htmlspecialchars_decode($message->text));
|
|
if ($sms->send())
|
|
{
|
|
$message->state = Sms_Controller::$SENT_OK;
|
|
$message->message = $sms->get_status();
|
|
}
|
|
else
|
|
{
|
|
$message->state = Sms_Controller::$SENT_FAILED;
|
|
$message->message = $sms->get_error();
|
|
}
|
|
$message->save();
|
|
break;
|
|
case Sms::$NEJLEVNEJSISMS:
|
|
|
|
$user = $this->settings->get('sms_user' . Sms::$NEJLEVNEJSISMS);
|
|
$password = $this->settings->get('sms_password' . Sms::$NEJLEVNEJSISMS);
|
|
|
|
$sms = new Sms_Nejlevnejsisms();
|
|
$sms->user($user);
|
|
$sms->password($password);
|
|
$sms->recipient($message->receiver);
|
|
$sms->text(htmlspecialchars_decode($message->text));
|
|
if ($sms->send())
|
|
{
|
|
$message->state = Sms_Controller::$SENT_OK;
|
|
$message->message = $sms->get_status();
|
|
}
|
|
else
|
|
{
|
|
$message->state = Sms_Controller::$SENT_FAILED;
|
|
$message->message = $sms->get_error();
|
|
}
|
|
$message->save();
|
|
case Sms::$SOUNDWINV100:
|
|
$user = $this->settings->get('sms_user' . Sms::$SOUNDWINV100);
|
|
$password = $this->settings->get('sms_password' . Sms::$SOUNDWINV100);
|
|
$hostname = $this->settings->get('sms_hostname' . Sms::$SOUNDWINV100);
|
|
|
|
|
|
$sms = new Sms_Soudvinv100();
|
|
$sms->user($user);
|
|
$sms->password($password);
|
|
$sms->hostname($hostname);
|
|
$sms->recipient('00' . $message->receiver);
|
|
$sms->text(htmlspecialchars_decode($message->text));
|
|
if ($sms->send())
|
|
{
|
|
$message->state = Sms_Controller::$SENT_OK;
|
|
$message->message = $sms->get_status();
|
|
}
|
|
else
|
|
{
|
|
$message->state = Sms_Controller::$SENT_FAILED;
|
|
$message->message = $sms->get_error();
|
|
}
|
|
$message->save();
|
|
break;
|
|
case Sms::$INACTIVE:
|
|
default:
|
|
$message->state = Sms_Controller::$SENT_FAILED;
|
|
$message->message = 'Neznámý ovladač';
|
|
$message->save();
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Function receive SMS messages from GSM gw.
|
|
*
|
|
* @author Roman Sevcik
|
|
*/
|
|
private function receive_sms()
|
|
{
|
|
if ($this->settings->get('sms_driver_state' . Sms::$SOUNDWINV100) == Sms::$DRIVER_ACTIVE)
|
|
{
|
|
$user = $this->settings->get('sms_user' . Sms::$SOUNDWINV100);
|
|
$password = $this->settings->get('sms_password' . Sms::$SOUNDWINV100);
|
|
$hostname = $this->settings->get('sms_hostname' . Sms::$SOUNDWINV100);
|
|
|
|
$sms = new Sms_Soudvinv100();
|
|
$sms->user($user);
|
|
$sms->password($password);
|
|
$sms->hostname($hostname);
|
|
|
|
if ($sms->receive())
|
|
{
|
|
$messages = $sms->get_messages();
|
|
|
|
//print '<pre>';
|
|
//print_r ($messages);
|
|
//print '</pre>';
|
|
|
|
for ($i = 0; $i < count($messages); $i++)
|
|
{
|
|
if (strtolower($messages[$i]->text) === 'klima')
|
|
{
|
|
print 'Sending answer to ' . $messages[$i]->sender;
|
|
$sms = new Sms_Soudvinv100();
|
|
$sms->user($user);
|
|
$sms->password($password);
|
|
$sms->hostname($hostname);
|
|
$sms->recipient('00' . $messages[$i]->sender);
|
|
$sms->text(htmlspecialchars_decode('Klima je nejlepsi, Klima je super, Klima je nej...! S pozdravem FreeNetIS'));
|
|
$sms->send();
|
|
}
|
|
elseif (strtolower($messages[$i]->text) === 'freenetis stav')
|
|
{
|
|
print 'Sending answer to ' . $messages[$i]->sender;
|
|
$sms = new Sms_Soudvinv100();
|
|
$sms->user($user);
|
|
$sms->password($password);
|
|
$sms->hostname($hostname);
|
|
$sms->recipient('00' . $messages[$i]->sender);
|
|
$sms->text(htmlspecialchars_decode('Vas aktualni kredit je 1240 CZK. S pozdravem FreeNetIS'));
|
|
$sms->send();
|
|
}
|
|
else
|
|
{
|
|
$recipient = $this->settings->get('sms_sim_card_number' . Sms::$SOUNDWINV100);
|
|
if ($recipient == null || $recipient == '')
|
|
$recipient = $this->settings->get('sms_sender_number');
|
|
|
|
$sms = new Sms_message_Model();
|
|
$sms->user_id = 1;
|
|
$sms->stamp = $messages[$i]->date;
|
|
$sms->send_date = $messages[$i]->date;
|
|
$sms->text = htmlspecialchars($messages[$i]->text);
|
|
$sms->sender = $messages[$i]->sender;
|
|
$sms->receiver = $recipient;
|
|
$sms->driver = Sms::$SOUNDWINV100;
|
|
$sms->type = Sms_Controller::$RECEIVED;
|
|
$sms->state = Sms_Controller::$RECEIVED_UNREAD;
|
|
$sms->save();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Update ulogd
|
|
*
|
|
* @author Michal Kliment
|
|
*/
|
|
private function update_ulogd()
|
|
{
|
|
// it's time to update
|
|
if ((
|
|
Settings::get('ulogd_update_last') +
|
|
Settings::get('ulogd_update_interval')
|
|
) < time())
|
|
{
|
|
// traffics of ip addresses
|
|
$ip_addresses_traffic_model = new Ip_addresses_traffic_Model();
|
|
|
|
// cleans traffics of ip addresses
|
|
$ip_addresses_traffic_model->clean_ip_addresses_traffics();
|
|
|
|
// inserts new traffics of ip addresses
|
|
$ip_addresses_traffic_model->insert_ip_addresses_traffics();
|
|
|
|
// updates member's ids of ip addresses
|
|
$ip_addresses_traffic_model->update_member_ids();
|
|
|
|
// cleans ulogd table
|
|
$db = Database::instance();
|
|
$db->query("TRUNCATE ulog2_ct;");
|
|
|
|
// traffics of members
|
|
$members_traffic_model = new Members_traffic_Model();
|
|
|
|
// cleans traffics of members
|
|
$members_traffic_model->clean_members_traffics();
|
|
|
|
// inserts new traffics of members
|
|
$members_traffic_model->insert_members_traffics();
|
|
|
|
// finding of count of active members
|
|
$ulogd_active_count = Settings::get('ulogd_active_count');
|
|
|
|
// count is in percents
|
|
if (substr($ulogd_active_count, -1) == "%")
|
|
{
|
|
// finds total members to ulogd
|
|
$total = ORM::factory('member')->count_all_members_to_ulogd();
|
|
|
|
// calculates count of active members from percents
|
|
$ulogd_active_count = round(
|
|
((int) substr($ulogd_active_count, 0, -1)) / 100 * $total
|
|
);
|
|
}
|
|
|
|
// finding of avarage
|
|
$avg = $members_traffic_model->get_avg_traffic();
|
|
|
|
if (($ulogd_active_min = Settings::get('ulogd_active_min')) != '')
|
|
{
|
|
$min = intval($ulogd_active_min);
|
|
|
|
switch (substr($ulogd_active_min, -2, 1))
|
|
{
|
|
case 'k':
|
|
// do nothing
|
|
break;
|
|
case 'M':
|
|
$min *= 1024;
|
|
break;
|
|
case 'G':
|
|
$min *= 1024 * 1024;
|
|
break;
|
|
case 'T':
|
|
$min *= 1024 * 1024 * 1024;
|
|
break;
|
|
default:
|
|
$min /= 1024;
|
|
break;
|
|
}
|
|
|
|
if ($avg < $min)
|
|
$avg = $min;
|
|
}
|
|
|
|
// updates active members
|
|
$members_traffic_model->update_active_members($avg);
|
|
|
|
// daily traffics of members
|
|
$members_traffics_daily_model = new Members_traffics_daily_Model();
|
|
|
|
// updates daily traffics of members
|
|
$members_traffics_daily_model->updates_members_traffics_by_date(date('Y-m-d'));
|
|
|
|
// inserts new daily traffics of members
|
|
$members_traffics_daily_model->insert_members_traffics_by_date(date('Y-m-d'));
|
|
|
|
// updates variable
|
|
Settings::set('ulogd_update_last', time());
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Updates allowed subnets
|
|
*
|
|
* @author Michal Kliment
|
|
*/
|
|
private function update_allowed_subnets()
|
|
{
|
|
// it's time to update
|
|
if (Settings::get('allowed_subnets_enabled') &&
|
|
(
|
|
Settings::get('allowed_subnets_update_last') +
|
|
Settings::get('allowed_subnets_update_interval')
|
|
) < time())
|
|
{
|
|
ORM::factory('message')
|
|
->activate_unallowed_connecting_place_message(1);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Sent e-mails from queue
|
|
*
|
|
* @author Michal Kliment
|
|
*/
|
|
private static function send_quened_emails()
|
|
{
|
|
$email_queue_model = new Email_queue_Model();
|
|
|
|
$email_queue = $email_queue_model->get_current_queue();
|
|
|
|
$swift = email::connect();
|
|
|
|
foreach ($email_queue as $email)
|
|
{
|
|
// Build recipient lists
|
|
$recipients = new Swift_RecipientList;
|
|
$recipients->addTo($email->to);
|
|
|
|
// Build the HTML message
|
|
$message = new Swift_Message($email->subject, $email->body, "text/html");
|
|
|
|
// Send
|
|
if (Config::get('unit_tester') ||
|
|
$swift->send($message, $recipients, $email->from))
|
|
{
|
|
$email->state = Email_queue_Model::STATE_OK;
|
|
}
|
|
else
|
|
$email->state = Email_queue_Model::STATE_FAIL;
|
|
|
|
$email_queue->access_time = date('Y-m-d H:i:s');
|
|
$email->save();
|
|
}
|
|
|
|
$swift->disconnect();
|
|
}
|
|
|
|
}
|