Projekt

Obecné

Profil

« Předchozí | Další » 

Revize 863

Přidáno uživatelem Michal Kliment před více než 13 roky(ů)

Napsany dobre optimalizovane SQL prikazy, ktere zpracovavaji data z ulogd. Do Nastaveni pridana sekce Logovani, kde se ulogd nastavuje. Zbyva dopsat gridy pro prihlizeni ziskanych dat.

Zobrazit rozdíly:

freenetis/branches/ulogd/application/i18n/cs_CZ/texts.php
'activated number has not been changed' => 'Aktivované číslo již nelze změnit',
'activation date' => 'Datum aktivace',
'active' => 'Aktivní',
'active members' => 'Aktivní členové',
'active message' => 'Aktivní zpráva',
'active redirections' => 'Aktivní přesměrování',
'actual' => 'Aktuální',
......
'backup informations have been successfully updated' => 'Informace o zálohování byly úspěšně aktualizovány',
'backup name' => 'Jméno zálohy',
'bad entrance date' => 'Chybný datum vstupu.',
'bad format' => 'Špatný formát',
'bad icq format' => 'Špatný formát ICQ.',
'bad phone format' => 'Špatný formát telefonu',
'bad variable symbol format' => 'Špatný formát variabilního symbolu.',
......
'birthday' => 'Datum narození',
'bitrate' => 'Rychlost přenosu',
'before getting started, we need some information on the database' => 'Předtím než začneme, potřebujeme několik informací o databázi.',
'both' => 'obojí',
'but i can\'t set file permission to 660' => 'Ale nemůžu nastavit oprávnění souboru na 660',
'but i can\'t write the configphp file' => 'Ale nemůžu zapisovat do souboru <code>config.php</code>.',
'but i can\'t write the htaccess file' => 'Ale nemůžu zapisovat do souboru <code>.htaccess</code>.',
......
'contractual increase' => 'Smluvní navýšení',
'cookies must be enabled' => 'Musí být zapnuty cookies.',
'count' => 'Počet',
'count of active members' => 'Počet aktivních členů',
'count of address points' => 'Počet adresních bodů',
'count of members' => 'Počet členů',
'counteraccount' => 'Protiúčet',
......
'interfaces' => 'Rozhraní',
'interval is required' => 'Interval je povinný',
'interval of interruption collides with another interruption of this member' => 'Interval přerušení koliduje s jiným přerušením tohoto člena',
'interval of update' => 'Interval aktualizace',
'invalid date' => 'Neplatné datum!',
'invalid ip address' => 'Chybná IP adresa',
'invalid network address' => 'Neplatná adresa sítě !',
......
'july' => 'Červenec',
'language' => 'Jazyk',
'last time login' => 'Poslední čas přihlášení',
'last update' => 'poslední aktualizace',
'leaving date' => 'Datum vystoupení',
'leaving_date' => 'Datum vystoupení',
'length' => 'Délka',
......
'new transfer from account' => 'Nový převod z účtu',
'next' => 'Další',
'next step' => 'Další krok',
'next update' => 'příští aktualizace',
'nineth-degree certified engineers' => 'Certifikování technici devátého stupně',
'no' => 'ne',
'no redirection is possible to set for this ip address' => 'Žádné přesměrování není možné nastavit pro tuto IP adresu.',
......
'type of double-entry account' => 'Typ podvojného účtu',
'type of the recipient' => 'Typ příjemce',
'type of redirection' => 'Typ přesměrování',
'type of traffic' => 'Typ provozu',
'type' => 'Typ',
'types count' => 'Počet typů',
'unconfirmed works' => 'Nepotvrzené práce',
freenetis/branches/ulogd/application/i18n/cs_CZ/help.php
'recalculate_account_balances' => 'Primárním zdrojem o stavu financí v systému jsou převody. Zůstatky na účtech byly dříve pokaždé počítány na požádání z převodů. Nyní si každý účet ukládá svůj zůstatek kvůli vyšší rychlosti. Tuto funkci použijete v případě přechodu na verzi systému, která tuto optimalizaci obsahuje.',
'recalculate_fees' => 'Pro primární strhávání členských příspěvků používejte funkci pro globální strhávání členských příspěvků v Účetním deníku. Tuto funkci používejte opatrně a to jen v případě, že máte správně strženy všechny členské příspěvky pro všechny členy od založení sdružení až po současné datum. Pak můžete tomuto členovi přepočítat stržení členských příspěvků v případě, že u něj došlo k nutnosti je přepočítat, např. chybné datum vstupu, vznikla nutnost přidat přerušení členství apod.',
'recalculate_entrance_fees' => 'Pro primární strhávání vstupních příspěvků používejte funkci pro globální strhávání v účetním deníku. Tuto funkci používejte jen v případě, že došlo k nějakému omylu, například, že měl zaplatit vstupní a pak se ukázalo, že nemusel.',
'ulogd_active' => 'Jedná se o seznam (z pohledu typu provozu) příliš aktivních členů. Tento seznam se používá například pro vyhodnocování QoSu pro členy (členové z tohoto seznamu jsou mírně znevýhodněni oproti ostatním členům), aktualizuje při každé aktualizaci ulogd, viz. Interval aktualizace.',
'ulogd_active_count' => 'Počet (z pohledu typu provozu) příliš aktivních členů. Může být zadán absolutně (číslem) nebo relativně (v procentech). Výchozí hodnota je 10&#37.',
'ulogd_active_type' => 'Typ provozu, podle kterého se mají hledat příliš aktivní členové. Možné hodnoty jsou: upload, download nebo obojí.',
'ulogd_update_interval' => 'Interval aktualizace ulogd v sekundách. Po uplynutí této doby se zaktualizují počítadla provozu členů a najdou se příliš aktivní členové. Výchozí hodnota je 1800 sekund (30 minut).',
'unidentified_transfers' => 'Neidentifikované platby jsou všechny příchozí bankovní platby, které nebyl náš systém schopen z různých důvodů automaticky rozpoznat. Typicky se jedná o platby s chybným variabilním symbolem. Pokud zde svoji platbu najdete, pak kontaktujte hospodáře sdružení pro její správné přiřazení.',
'variable_symbol' => 'Variabilní symbol slouží k jednoznačnému určení příchozí platby člena.'
);
freenetis/branches/ulogd/application/helpers/valid.php
}
/**
* Checks whether a string is valid ulogd active count
*
* @author Michal Kliment
* @param string input string
* @return boolean
*/
public static function ulogd_active_count($str)
{
return preg_match('/^[0-9]+(\.[0-9]+)?%?$/', $str);
}
/**
* Checks whether a string is a valid text.
*
* @param string $str
freenetis/branches/ulogd/application/models/member.php
SET m.locked = 1
WHERE m.id = mi.mid");
}
/**
* Returns count of all non-former members without membership interrupt in that time and without set-up qos rate
*
* @author Michal Kliment
* @return integer
*/
public function count_all_members_to_ulogd()
{
$result = $this->db->query("
SELECT COUNT(m.id) AS total_members_count FROM members m
WHERE m.type <> 15 AND (m.qos_rate IS NULL OR m.qos_rate = 0) AND m.id NOT IN
(
SELECT mi.member_id FROM membership_interrupts mi JOIN members_fees mf ON mi.members_fee_id = mf.id WHERE mf.activation_date <= CURDATE() AND CURDATE() <= mf.deactivation_date
)
");
return ($result && $result->current()) ? $result->current()->total_members_count : 0;
}
}
?>
freenetis/branches/ulogd/application/controllers/web_interface.php
public function active_traffic_members_ip_addresses()
{
$ips = $this->db->query("
SELECT q3.* FROM
SELECT IFNULL(ip.ip_address, vip.ip_address) AS ip_address FROM
(
SELECT IFNULL(ip.ip_address, ip2.ip_address) AS ip_address, q2.name, q2.download FROM
(
SELECT m.*, SUM(q1.download/1073741824) AS download FROM
(
SELECT u.*, IFNULL(i.device_id,i2.device_id) AS device_id FROM
(
SELECT ip2str(orig_ip_saddr) as src, sum(orig_raw_pktlen) as upload, sum(reply_raw_pktlen) as download, (orig_raw_pktlen+reply_raw_pktlen) AS total FROM ulog2_ct u group by orig_ip_saddr ORDER BY download DESC LIMIT 0,200
) AS u
JOIN ip_addresses ip ON u.src = ip.ip_address
LEFT JOIN ifaces i ON ip.iface_id = i.id
LEFT JOIN vlan_ifaces vi ON ip.vlan_iface_id = vi.id
LEFT JOIN ifaces i2 ON vi.iface_id = i2.id
) AS q1
JOIN devices d ON q1.device_id = d.id
JOIN users u ON d.user_id = u.id
JOIN members m ON u.member_id = m.id AND m.id <> 1
GROUP BY m.id
) AS q2
JOIN users u ON q2.id = u.member_id
JOIN devices d ON u.id = d.user_id
JOIN ifaces i ON d.id = i.device_id
LEFT JOIN ip_addresses ip ON i.id = ip.iface_id
LEFT JOIN vlan_ifaces vi ON i.id = vi.iface_id
LEFT JOIN ip_addresses ip2 ON vi.id = ip2.vlan_iface_id
) AS q3
WHERE q3.ip_address IS NOT NULL
ORDER BY download DESC
SELECT member_id FROM members_traffics
WHERE active = 1
) AS t
JOIN users u ON u.member_id = t.member_id
JOIN devices d ON d.user_id = u.id
LEFT JOIN ifaces i ON i.device_id = d.id
LEFT JOIN vlan_ifaces vi ON vi.iface_id = i.id
LEFT JOIN ip_addresses ip ON ip.iface_id = i.id
LEFT JOIN ip_addresses vip ON vip.vlan_iface_id = vi.id
WHERE ip.ip_address IS NOT NULL OR vip.ip_address IS NOT NULL
");
foreach ($ips as $ip)
freenetis/branches/ulogd/application/controllers/scheduler.php
//receive SMS
self::receive_sms();
// cleans ulogd's table
self::clean_ulogd();
// update ulogd
self::update_ulogd();
}
......
}
/**
* Cleans (truncates) ulogd's table
* Update ulogd
* @author Michal Kliment
*/
private static function clean_ulogd()
function update_ulogd()
{
// finds last time of cleaning
$last_clean_ulogd = (Settings::get('last_clean_ulogd')!='') ? Settings::get('last_clean_ulogd') : 0;
// it's time to clean :-)
if ($last_clean_ulogd + Settings::get('clean_ulogd_interval') < time())
// it's time to update
if (Settings::get('ulogd_update_last') + Settings::get('ulogd_update_interval') < time())
{
$db = new Database();
$db->query("TRUNCATE TABLE `ulog2_ct`");
$db->query("TRUNCATE ip_addresses_traffics;");
$db->query("
INSERT INTO ip_addresses_traffics
SELECT ip2str(orig_ip_saddr) AS ip_address, SUM(orig_raw_pktlen/1024) AS upload, SUM(reply_raw_pktlen/1024) AS download
FROM ulog2_ct
GROUP BY orig_ip_saddr;
");
$db->query("TRUNCATE ulog2_ct;");
$db->query("TRUNCATE members_traffics;");
$db->query("
INSERT INTO members_traffics
SELECT u.member_id, SUM(q.upload) AS upload, SUM(q.download) AS download, 0 AS active FROM
(
SELECT t.*, IFNULL(i.device_id,i2.device_id) AS device_id FROM ip_addresses_traffics t
JOIN ip_addresses ip ON t.ip_address = ip.ip_address
LEFT JOIN ifaces i ON ip.iface_id = i.id
LEFT JOIN vlan_ifaces vi ON ip.vlan_iface_id = vi.id
LEFT JOIN ifaces i2 ON vi.iface_id = i2.id
) AS q
JOIN devices d ON q.device_id = d.id
JOIN users u ON d.user_id = u.id
GROUP BY u.member_id;
");
$ulogd_active_count = Settings::get('ulogd_active_count');
if (substr($ulogd_active_count,-1) == "%")
{
$member_model = new Member_Model();
$total = $member_model->count_all_members_to_ulogd();
$ulogd_active_count = round(((int) substr($ulogd_active_count,0,-1)) / 100 * $total);
}
$db->query("
UPDATE members_traffics
SET active = 1
WHERE member_id IN
(
SELECT alias.member_id FROM
(
SELECT t.member_id, (download+upload) AS total FROM members_traffics t
JOIN members m ON t.member_id = m.id AND (m.qos_rate IS NULL OR m.qos_rate = 0)
ORDER BY ".Settings::get('ulogd_active_type')." DESC LIMIT 0,$ulogd_active_count
) alias
)
");
$db->query("
UPDATE members_traffics t, members_traffics_daily d
SET d.upload = d.upload + t.upload, d.download = d.download + t.download
WHERE t.member_id = d.member_id AND d.day = '".date('Y-m-d')."';
");
$db->query("
INSERT INTO members_traffics_daily
SELECT t.member_id, t.upload, t.download, '".date('Y-m-d')."' AS day FROM members_traffics t
LEFT JOIN members_traffics_daily d ON t.member_id = d.member_id AND d.day = '".date('Y-m-d')."'
WHERE d.member_id IS NULL;
");
// updates variable
Settings::set('last_clean_ulogd', time());
Settings::set('ulogd_update_last', time());
}
}
}
freenetis/branches/ulogd/application/controllers/settings.php
if (!$this->acl_check_edit(get_class($this),'system'))
Controller::error(ACCESS);
$additional_info = 'ulogd - '.url_lang::lang('texts.last update').': '.strftime("%Y/%m/%d %T", Settings::get('ulogd_update_last')).', <span';
if (Settings::get('ulogd_update_last')+Settings::get('ulogd_update_interval') < time())
$additional_info .= ' style="color:red"';
$additional_info .= '>'.url_lang::lang('texts.next update').': '.strftime('%Y/%m/%d %T', Settings::get('ulogd_update_last')+Settings::get('ulogd_update_interval')).'</span>';
// creating of new forge
$this->form = new Forge(NULL, '', 'POST', array('id' => 'article_form'));
$this->form->set_attr('class', 'form_class')->set_attr('method', 'post');
$this->form->group('')->label(url_lang::lang('texts.Centralized logging'));
$this->form->dropdown('clog_driver')->label(url_lang::lang('texts.Driver').':')->options(array(NULL => url_lang::lang('texts.Inactive'), 'ulogd' => 'ulogd'))->selected($this->settings->get('clog_driver'));
$this->form->input('clog_hostname')->label(url_lang::lang('texts.Hostname').':')->value($this->settings->get('clog_hostname'));
$this->form->input('clog_username')->label(url_lang::lang('texts.User name').':')->value($this->settings->get('clog_username'));
$this->form->input('clog_password')->label(url_lang::lang('texts.Password').':')->value($this->settings->get('clog_password'));
$this->form->input('clog_database')->label(url_lang::lang('texts.Database name').':')->value($this->settings->get('clog_database'));
$this->form->input('clog_table')->label(url_lang::lang('texts.Table name').':')->value($this->settings->get('clog_table'));
$this->form->group('')->label('ulogd '.help::hint('ulogd'))->message();
$this->form->input('ulogd_update_interval')->label(url_lang::lang('texts.Interval of update').':')->rules('required|valid_numeric')->value($this->settings->get('ulogd_update_interval'))->help(help::hint('ulogd_update_interval'));
$this->form->group('')->label(url_lang::lang('texts.Active members').' '.help::hint('ulogd_active'));
$this->form->input('ulogd_active_count')->label(url_lang::lang('texts.Count of active members').':')->rules('required|valid_ulogd_active_count')->value($this->settings->get('ulogd_active_count'))->help(help::hint('ulogd_active_count'));
$this->form->dropdown('ulogd_active_type')->label(url_lang::lang('texts.Type of traffic').':')->rules('required')->options(array(0 => '----- '.url_lang::lang('texts.Select type').' -----', 'upload' => url_lang::lang('texts.upload'), 'download' => url_lang::lang('texts.download'),'total' => url_lang::lang('texts.both').' ('.url_lang::lang('texts.upload').' + '.url_lang::lang('texts.download').')'))->selected($this->settings->get('ulogd_active_type'))->help(help::hint('ulogd_active_type'));
$this->form->submit('submit')->value(url_lang::lang('texts.Save'));
special::required_forge_style($this->form, ' *', 'required');
// form validate
......
$view->title = url_lang::lang('texts.Settings').' - '.url_lang::lang('texts.logging');
$view->content = new View('settings');
$view->content->additional_info = $additional_info;
$view->content->current = 'logging';
$view->content->content = $this->form->html();
$view->content->headline = url_lang::lang('texts.Logging');
freenetis/branches/ulogd/application/libraries/Settings.php
private static $email_port = 25;
// ulogd settings
private static $clean_ulogd_interval = 1800;
// time of last update of ulogd
private static $ulogd_update_last = 0;
// interval of updating of ulogd (in seconds), default 1800s = 30 minutes
private static $ulogd_update_interval = 1800;
// count of the most traffic-active members to find, default 10% of members
private static $ulogd_active_count = '10%';
// type of traffic of members to find, default download traffic
private static $ulogd_active_type = 'download';
/**
* @author Michal Kliment
* Function to get value from settings by given key
freenetis/branches/ulogd/application/views/main.php
return value.match(/^([a-zA-Z0-9]+)((\-|_|\.)([a-zA-Z0-9]+))*@([a-zA-Z0-9]+)((\-|_)([a-zA-Z0-9]+))*(\.[a-z]+)+$/);
}, '<?php echo url_lang::lang('texts.Bad jabber format.') ?>');
$.validator.addMethod('ulogd_active_count', function(value) {
return value.match(/^[0-9]+(\.[0-9]+)?%?$/);
}, '<?php echo url_lang::lang('texts.Bad format.') ?>');
$('#ip_address').keyup(function(){
// test if ip address is complete and valid
var complete = this.value.match(/^((25[0-5])|(2[0-4][0-9])|(1[0-9][0-9])|([1-9][0-9])|[0-9])\.((25[0-5])|(2[0-4][0-9])|(1[0-9][0-9])|([1-9][0-9])|[0-9])\.((25[0-5])|(2[0-4][0-9])|(1[0-9][0-9])|([1-9][0-9])|[0-9])\.((25[0-5])|(2[0-4][0-9])|(1[0-9][0-9])|([1-9][0-9])|[0-9])$/);
freenetis/branches/ulogd/application/views/settings.php
<h3 class="clear"><?php echo $headline ?></h3>
<br />
<?php echo $content ?>
<?php echo (isset($additional_info) && $additional_info!='') ? '<br /><br /><b>'.$additional_info.'</b>' : '' ?>

Také k dispozici: Unified diff