2015-08-27 13:18:53 +02:00
< ? php
2017-02-23 22:45:50 +00:00
use LibreNMS\RRD\RrdDefinition ;
2015-09-01 12:22:54 +02:00
/**
* Check if a port on a Proxmox VM exists
* @ param string $p Port name
* @ param string $c Clustername
* @ param integer $i VM ID
* @ return integer | boolean The port - ID if the port exists , false if it doesn ' t exist
*/
2016-08-28 12:32:58 -05:00
function proxmox_port_exists ( $i , $c , $p )
{
2015-08-27 13:18:53 +02:00
if ( $row = dbFetchRow ( " SELECT pmp.id FROM proxmox_ports pmp, proxmox pm WHERE pm.id = pmp.vm_id AND pmp.port = ? AND pm.cluster = ? AND pm.vmid = ? " , array ( $p , $c , $i ))) {
return $row [ 'id' ];
}
return false ;
}
2015-09-01 12:22:54 +02:00
/**
* Check if a Proxmox VM exists
* @ param integer $i VM ID
* @ param string $c Clustername
* @ param array $pmxcache Reference to the Proxmox VM Cache
* @ return boolean true if the VM exists , false if it doesn ' t
*/
2016-08-28 12:32:58 -05:00
function proxmox_vm_exists ( $i , $c , & $pmxcache )
{
2015-08-27 13:18:53 +02:00
if ( isset ( $pmxcache [ $c ][ $i ]) && $pmxcache [ $c ][ $i ] > 0 ) {
return true ;
}
if ( $row = dbFetchRow ( " SELECT id FROM proxmox WHERE vmid = ? AND cluster = ? " , array ( $i , $c ))) {
$pmxcache [ $c ][ $i ] = ( integer ) $row [ 'id' ];
return true ;
}
return false ;
}
2016-08-12 11:05:58 -05:00
$name = 'proxmox' ;
$app_id = $app [ 'app_id' ];
2015-08-28 11:35:34 +02:00
2016-08-12 11:05:58 -05:00
if ( isset ( $config [ 'enable_proxmox' ]) && $config [ 'enable_proxmox' ] && ! empty ( $agent_data [ 'app' ][ $name ])) {
$proxmox = $agent_data [ 'app' ][ $name ];
2016-08-17 21:48:32 +02:00
} elseif ( isset ( $config [ 'enable_proxmox' ]) && $config [ 'enable_proxmox' ]) {
$options = '-O qv' ;
$oid = '.1.3.6.1.4.1.8072.1.3.2.3.1.2.7.112.114.111.120.109.111.120' ;
$proxmox = snmp_get ( $device , $oid , $options );
$proxmox = preg_replace ( '/^.+\n/' , '' , $proxmox );
$proxmox = str_replace ( " <<<app-proxmox>>> \n " , '' , $proxmox );
}
if ( $proxmox ) {
2017-03-11 14:39:32 +00:00
update_application ( $app , $proxmox );
2016-08-12 11:05:58 -05:00
$pmxlines = explode ( " \n " , $proxmox );
$pmxcluster = array_shift ( $pmxlines );
2016-08-28 12:32:58 -05:00
dbUpdate (
array ( 'device_id' => $device [ 'device_id' ], 'app_type' => $name , 'app_instance' => $pmxcluster ),
'applications' ,
'`device_id` = ? AND `app_type` = ?' ,
array ( $device [ 'device_id' ], $name )
);
2016-08-12 11:05:58 -05:00
if ( count ( $pmxlines ) > 0 ) {
$pmxcache = array ();
foreach ( $pmxlines as $vm ) {
2016-11-21 14:05:22 +00:00
$vm = str_replace ( '"' , '' , $vm );
2016-08-12 11:05:58 -05:00
list ( $vmid , $vmport , $vmpin , $vmpout , $vmdesc ) = explode ( '/' , $vm , 5 );
print " Proxmox ( $pmxcluster ): $vmdesc : $vmpin / $vmpout / $vmport\n " ;
$rrd_proxmox_name = array (
'pmxcluster' => $pmxcluster ,
'vmid' => $vmid ,
'vmport' => $vmport
);
2017-02-23 22:45:50 +00:00
$rrd_def = RrdDefinition :: make ()
-> addDataset ( 'INOCTETS' , 'DERIVE' , 0 , 12500000000 )
-> addDataset ( 'OUTOCTETS' , 'DERIVE' , 0 , 12500000000 );
2016-08-12 11:05:58 -05:00
$fields = array (
'INOCTETS' => $vmpin ,
'OUTOCTETS' => $vmpout
);
$tags = compact ( 'name' , 'app_id' , 'pmxcluster' , 'vmid' , 'vmport' , 'rrd_proxmox_name' , 'rrd_def' );
data_update ( $device , 'app' , $tags , $fields );
if ( proxmox_vm_exists ( $vmid , $pmxcluster , $pmxcache ) === true ) {
dbUpdate ( array (
'device_id' => $device [ 'device_id' ],
'last_seen' => array ( 'NOW()' ),
'description' => $vmdesc
), $name , '`vmid` = ? AND `cluster` = ?' , array ( $vmid , $pmxcluster ));
} else {
$pmxcache [ $pmxcluster ][ $vmid ] = dbInsert ( array (
'cluster' => $pmxcluster ,
'vmid' => $vmid ,
'description' => $vmdesc ,
'device_id' => $device [ 'device_id' ]
), $name );
}
if ( $portid = proxmox_port_exists ( $vmid , $pmxcluster , $vmport ) !== false ) {
2016-08-28 12:32:58 -05:00
dbUpdate (
array ( 'last_seen' => array ( 'NOW()' )),
'proxmox_ports' ,
'`vm_id` = ? AND `port` = ?' ,
array ( $pmxcache [ $pmxcluster ][ $vmid ], $vmport )
);
2016-08-12 11:05:58 -05:00
} else {
dbInsert ( array ( 'vm_id' => $pmxcache [ $pmxcluster ][ $vmid ], 'port' => $vmport ), 'proxmox_ports' );
}
2015-08-28 11:35:34 +02:00
}
2015-08-27 13:18:53 +02:00
}
}
2015-12-03 15:07:27 +01:00
2016-08-12 11:05:58 -05:00
unset ( $pmxlines , $pmxcluster , $pmxcdir , $proxmox , $pmxcache );