2017-12-02 20:26:19 +00:00
#!/usr/bin/env php
< ? php
$init_modules = array ();
require realpath ( __DIR__ . '/..' ) . '/includes/init.php' ;
/** Bill management tool
Todo :
- Actually create a bill
- Option to empty a bill
- Probably tons of bug fixes and safety checks .
Note :
- Current , this cannot create a new bill . To do this , you need to use the GUI .
**/
// Find the correct bill, exit if we get anything other than 1 result.
function list_bills ( $bill_name )
{
$bill = dbFetchRows ( " SELECT `bill_id`,`bill_name` FROM `bills` WHERE `bill_name` LIKE ? " , array ( " $bill_name " ));
if ( count ( $bill ) != 1 ) {
echo ( " Did not find exactly 1 bill, exiting \n " );
echo ( " Query: " . $bill . " \n " );
exit ( 1 );
} else {
echo ( " Found bill { $bill [ 0 ][ 'bill_name' ] } ( { $bill [ 0 ][ 'bill_id' ] } ) \n " );
}
return $bill [ 0 ][ 'bill_id' ];
}
2018-03-29 04:44:32 +01:00
// Create a new bill.
function create_bill ( $bill_name , $bill_type , $bill_cdr , $bill_day )
{
/** create_bill
Note :
- bill_name : can be a duplicate since it ' s unique is is bill_id . We are going to be cowards and refuse to create duplicate bill_name
- bill_type : can be cdr ( Committed data rate , 95 th ) or quota ( total bytes moved )
- bill_cdr : if bill_type is cdr , then this is in bits , if bill_type is quota , then it ' s in bytes ( !! )
- bill_day : day of month billing starts .
**/
echo ( " Creating bill with name : " . $bill_name . " (Type: " . $bill_type . " , Quota: " . $bill_cdr . " ) \n " );
$insert = array (
'bill_name' => $bill_name ,
'bill_type' => $bill_type ,
'bill_cdr' => $bill_cdr ,
'bill_day' => '1' ,
);
$create_bill = dbInsert ( $insert , 'bills' );
echo ( " Created bill ID " . $create_bill . " \n " );
return $create_bill ;
}
2017-12-02 20:26:19 +00:00
// This will get an array of devices we are interested in from the CLI glob
function get_devices ( $host_glob , $nameType )
{
return dbFetchRows ( " SELECT `device_id`,`hostname`,`sysName` FROM `devices` WHERE ` " . $nameType . " ` LIKE ? " , array ( " % $host_glob % " ));
}
// This will flush bill ports if -r is set on cli
function flush_bill ( $id )
{
echo ( " Removing ports from bill ID $id\n " );
return dbDelete ( 'bill_ports' , '`bill_id` = ?' , array ( $id ));
}
function add_ports_to_bill ( $devs , $intf_glob , $id )
{
// Abort mission if no bill id is passed.
if ( empty ( $id )) {
echo ( " No bill ID passed, exiting... \n " );
exit ( 1 );
}
// Expected interface glob:
echo ( " Interface glob: $intf_glob\n " );
$device_ids = array_column ( $devs , " device_id " );
$ids = implode ( " , " , $device_ids );
// Find the devices which match the list of IDS and also the interface glob
$query = " SELECT ports.port_id,ports.ifName,ports.ifAlias FROM ports INNER JOIN devices ON ports.device_id = devices.device_id WHERE ifType = 'ethernetCsmacd' AND ports.ifAlias LIKE '% $intf_glob %' AND ports.device_id in ( $ids ) " ;
echo ( " Query: $query\n " );
foreach ( dbFetchRows ( $query ) as $ports ) {
echo ( " Inserting { $ports [ 'ifName' ] } ( { $ports [ 'ifAlias' ] } ) into bill $id\n " );
$insert = array (
'bill_id' => $id ,
'port_id' => $ports [ 'port_id' ],
'bill_port_autoadded' => '1'
);
dbInsert ( $insert , 'bill_ports' );
}
return true ;
}
2018-03-29 04:44:32 +01:00
function print_help ()
{
echo " Usage: \n " ;
echo " Updating bills \n " ;
echo " -b <bill name glob> Bill name to match \n " ;
echo " -s <sysName glob> sysName to match (Cannot be used with -h) \n " ;
echo " -h <hostname glob> Hostname to match (Cannot be used with -s) \n " ;
echo " -i <Interface description glob> Interface description to match \n " ;
echo " -f Flush all ports from a bill before adding adding ports \n " ;
echo " Creating bills \n " ;
echo " -n Create new bill \n " ;
echo " -t bill type (cdr or quota) \n " ;
echo " -q Quota (In bits for cdr, bytes for quota) \n \n " ;
echo " Update an existing bill called 'Telia - Transit', add interfaces matching \" Telia \" from all devices \n " ;
echo " php manage_bills.php -b 'Telia - Transit' -s all -i Telia \n \n " ;
echo " Create a new bill called 'Transit' with a CDR of 1Gbit \n " ;
echo " php manage_bills.php -n -b 'Transit' -t cdr -q 1000000000 " ;
echo " \n " ;
exit ;
}
2017-12-02 20:26:19 +00:00
/** Setup options :
2018-03-29 04:44:32 +01:00
b - bill_name - bill glob
i - circuit_id - interface glob
2017-12-02 20:26:19 +00:00
s - sysName - device glob
h - hostname - device glob
f - flush - boolean
2018-03-29 04:44:32 +01:00
n - new - create new bill
t - type - bill type
q - quota - bill quota
2017-12-02 20:26:19 +00:00
**/
2018-03-29 04:44:32 +01:00
$options = getopt ( 'b:s:h:i:f:np:t:q:' );
2017-12-02 20:26:19 +00:00
if ( ! empty ( $options [ 's' ])) {
$host_glob = str_replace ( '*' , '%' , mres ( $options [ 's' ]));
$nameType = " sysName " ;
}
if ( ! empty ( $options [ 'h' ])) {
$host_glob = str_replace ( '*' , '%' , mres ( $options [ 'h' ]));
$nameType = " hostname " ;
}
2018-03-29 04:44:32 +01:00
if ( array_key_exists ( 'n' , $options )) {
$create_bill = true ;
2017-12-02 20:26:19 +00:00
}
2018-03-29 04:44:32 +01:00
if ( ! empty ( $options [ 't' ])) {
$bill_type = mres ( $options [ 't' ]);
}
if ( ! empty ( $options [ 'q' ])) {
$bill_cdr = mres ( $options [ 'q' ]);
2017-12-02 20:26:19 +00:00
}
$bill_name = str_replace ( '*' , '%' , mres ( $options [ 'b' ]));
$intf_glob = str_replace ( '*' , '%' , mres ( $options [ 'i' ]));
2018-03-29 04:44:32 +01:00
# Exit if no bill
if ( empty ( $bill_name )) {
echo " Please set -b (bill name) \n " ;
print_help ();
}
if ( $create_bill ) {
create_bill ( $bill_name , $bill_type , $bill_cdr , '1' );
exit ( 1 );
}
# Exit if missing hostname or sysName (or both set
if ( empty ( $options [ 's' ]) && empty ( $options [ 'h' ])) {
echo " Please set -s (sysName) or -h (hosthame) \n " ;
print_help ();
} else if ( ! empty ( $options [ 's' ]) && ! empty ( $options [ 'h' ])) {
echo " Please set either -s or -h, not both \n " ;
print_help ();
}
# Exit if missing hostname or sysName
if ( empty ( $options [ 'i' ])) {
echo " Please set -i (interface glob) \n " ;
print_help ();
2017-12-02 20:26:19 +00:00
}
if ( $bill_name == 'all' ) {
$bill_name = '%' ;
}
if ( $intf_glob == 'all' ) {
$intf_glob = '%' ;
}
if ( $host_glob == 'all' ) {
$host_glob = '%' ;
}
if ( isset ( $options [ 'f' ])) {
$flush = true ;
} else {
$flush = false ;
}
$id = list_bills ( $bill_name );
$devices = get_devices ( $host_glob , $nameType );
if ( empty ( $devices )) {
echo " No devices found \n " ;
exit ( 1 );
}
if ( $flush ) {
$flush_ret = flush_bill ( $id );
}
$ret = add_ports_to_bill ( $devices , $intf_glob , $id );