process_accounting_messages.php 4.37 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
#!/usr/local/bin/php
<?php
/**
 *    Copyright (C) 2015 Deciso B.V.
 *
 *    All rights reserved.
 *
 *    Redistribution and use in source and binary forms, with or without
 *    modification, are permitted provided that the following conditions are met:
 *
 *    1. Redistributions of source code must retain the above copyright notice,
 *       this list of conditions and the following disclaimer.
 *
 *    2. Redistributions in binary form must reproduce the above copyright
 *       notice, this list of conditions and the following disclaimer in the
 *       documentation and/or other materials provided with the distribution.
 *
 *    THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
 *    INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
 *    AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
 *    AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
 *    OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 *    SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 *    INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 *    CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 *    ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 *    POSSIBILITY OF SUCH DAMAGE.
 *
 */

require_once('script/load_phalcon.php');

33
use OPNsense\Auth\AuthenticationFactory;
34 35 36 37

// open database
$database_filename = '/var/captiveportal/captiveportal.sqlite';
$db = new SQLite3($database_filename);
38
$db->busyTimeout(2000);
39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56

// query all sessions with client restrictions
$result = $db->query('
    select      c.zoneid
    ,           c.sessionid
    ,           c.username
    ,           c.authenticated_via
    ,           c.deleted
    ,           c.created
    ,           accs.state
    from        cp_clients c
    inner join  session_restrictions sr on sr.zoneid = c.zoneid and sr.sessionid = c.sessionid
    left join   session_info si on c.zoneid = si.zoneid and c.sessionid = si.sessionid
    left join   accounting_state accs on accs.zoneid = c.zoneid and accs.sessionid = c.sessionid
    order by    c.authenticated_via
    ');

// process all sessions
57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
if ($result !== false) {
    while($row = $result->fetchArray(SQLITE3_ASSOC) ){
        $authFactory = new OPNsense\Auth\AuthenticationFactory();
        $authenticator = $authFactory->get($row['authenticated_via']);
        if ($authenticator != null) {
            if ($row['state'] == null) {
                // new accounting state, send start event (if applicable)
                $stmt = $db->prepare('insert into accounting_state(zoneid, sessionid, state)
                                      values (:zoneid, :sessionid, \'RUNNING\')');
                $stmt->bindParam(':zoneid', $row['zoneid']);
                $stmt->bindParam(':sessionid', $row['sessionid']);
                $stmt->execute();
                if (method_exists($authenticator,'startAccounting')) {
                    // send start accounting event
                    $authenticator->startAccounting($row['username'], $row['sessionid']);
                }
            } elseif  ($row['deleted'] == 1 && $row['state'] != 'STOPPED') {
                // stop accounting, send stop event (if applicable)
                $stmt = $db->prepare('update accounting_state
                                      set state = \'STOPPED\'
                                      where zoneid = :zoneid
                                      and   sessionid = :sessionid');
                $stmt->bindParam(':zoneid', $row['zoneid']);
                $stmt->bindParam(':sessionid', $row['sessionid']);
                $stmt->execute();
                if (method_exists($authenticator,'startAccounting')) {
                    $time_spend = time() - $row['created'];
                    $authenticator->stopAccounting($row['username'], $row['sessionid'], $time_spend);
                }
            } elseif ($row['state'] != 'STOPPED') {
                // send interim updates (if applicable)
                if (method_exists($authenticator,'updateAccounting')) {
                    // send interim update event
                    $time_spend = time() - $row['created'];
                    $authenticator->updateAccounting($row['username'], $row['sessionid'], $time_spend);
                }
93 94 95 96
            }
        }
    }
}
97

98
$db->close();