Projekt

Obecné

Profil

<?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();
}

}
(51-51/76)