You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

154 lines
5.9 KiB
Plaintext

<?php
class ffNodeInfo extends WireData implements Module, ConfigurableModule{
protected $cache = false;
protected $cache_node = array();
protected $src, $nodes;
public static function getModuleInfo() {
return array(
'title' => __('FF Node Info'),
'version' => '005',
'author' => 'Kreativmonkey',
'summary' => __('Save node information for Freifunk'),
'singular' => true,
'autoload' => true
);
}
public function ___install() {
// Creating fields and templates for the Node manegemant
}
public function init() {
if (isset ($this->data ['src']))
$this->src = $this->data ['src'];
// run the module every 2 minutes
//$this->addHook('LazyCron::every2Minutes', $this, 'set_nodeinfo');
}
protected function cache_data() {
$htmlcache = file_get_contents($this->src);
$this->cache = json_decode($htmlcache);
$this->gen_nodecache();
}
protected function gen_nodecache() {
foreach($this->cache->nodes as $node) {
$this->cache_node[base64_encode(strtoupper($node->nodeinfo->node_id))] = $node;
}
$this->cache=false;
}
public function set_nodeinfo(HookEvent $e){
$this->cache_data();
$nodes = wire('pages')->find("template=node, key!=''");
foreach($nodes as $node){
$data = $this->get_nodeinfo($node->title);
$node->of(false);
if(!empty($data)){
// Override exist name only if a new one.
if($data['name'] == 'unbekannt' && empty($node->subtitle)){
$node->subtitle = $data['name'];
} elseif($data['name'] != 'unbekannt') {
$node->subtitle = $data['name'];
}
$node->latitude = floatval(str_replace(',', '.', $data['geo']['latitude']));
$node->longitude = floatval(str_replace(',', '.', $data['geo']['longitude']));
$node->lastseen = strtotime($data['lastseen']);
$node->node_hardware = $data['hardware'];
$node->node_firmware = $data['firmware'];
$node->ipv6 = $data['ip'];
$node->online = $data['online'];
if ($node->isChanged('latitude') ||
$node->isChanged('longitude')){
$node->address = $this->get_address(str_replace(',', '.', $node->latitude), str_replace(',','.',$node->longitude));
}
} else {
$node->online = false;
}
if($node->isChanged()){
// Save only if the Page has Changes
$node->save();
}
$node->of(true);
}
return true;
}
public function get_address($latitude, $longitude){
/*if(empty($latitude)) return "";
$osm = json_decode(file_get_contents("https://nominatim.openstreetmap.org/reverse?format=json&lat={$latitude}&lon={$longitude}&zoom=16&addressdetails=1&email=info@freifunk-myk.de"));
if(isset($osm->address->city)) {
$address = $osm->address->city;
} elseif (isset($osm->address->city_district)){
$address = $osm->address->city_district;
}elseif (isset($osm->address->town)) {
$address = $osm->address->town;
} elseif (isset($osm->address->village)) {
$address = $osm->address->village;
} else {
$address = __('no address found');
$this->log->error(sprintf(__('no address found for %s:%s'), $latitude, $longitude));
}
if(isset($osm->address->road) && isset($address)){
$address .= ", ".$osm->address->road;
}*/
return "not working at the moment!";
}
public function get_nodeinfo($mac) {
$mac = strtoupper(str_replace(':', '', $mac));
$data = array();
if(!isset($this->cache_node[base64_encode($mac)])) return $data;
$info = $this->cache_node[base64_encode($mac)];
$ip = '';
if(isset($info->nodeinfo->network->addresses)) {
foreach($info->nodeinfo->network->addresses as $tip) {
if(substr($tip, 0, 4) == '2a01') $ip = $tip;
}
}
$data = array(
'addresses' => (isset($info->nodeinfo->network->addresses) ? $info->nodeinfo->network->addresses : ""),
'hardware' => (isset($info->nodeinfo->hardware->model) ? $info->nodeinfo->hardware->model : "empty"),
'firmware' => (isset($info->nodeinfo->software->firmware->release) ? $info->nodeinfo->software->firmware->release : ""),
'autoupdater_state' => (isset($info->nodeinfo->software->autoupdater->enabled) ? $info->nodeinfo->software->autoupdater->enabled : ""),
'name' => (isset($info->nodeinfo->hostname) ? $info->nodeinfo->hostname : ""),
'lastseen' => (isset($info->lastseen) ? $info->lastseen : ""),
'geo' => array( 'latitude' => (isset($info->nodeinfo->location->latitude) ? $info->nodeinfo->location->latitude : ""),
'longitude' => (isset($info->nodeinfo->location->longitude) ? $info->nodeinfo->location->longitude : ""),
),
'ip' => $ip,
'online' => $info->flags->online
);
return $data;
}
public function hookModuleSave(HookEvent $event) {
$className = $event->arguments [0];
if ($className != get_class($this)) return;
$this->validateConfiguration();
}
static public function getModuleConfigInputfields(array $data) {
$inputfields = new InputfieldWrapper ();
$srcField = wire('modules')->get('InputfieldText');
$srcField->name = 'src';
$srcField->columnWidth = 100;
$srcField->label = __('JSON URL');
$srcField->required = 1;
if (isset ($data ['src']))
$srcField->value = $data ['src'];
$srcField->description = __('The URL to the JSON file with all node data.');
$inputfields->add($srcField);
return $inputfields;
}
}