function guifi_device_save($edit, $verbose = TRUE, $notify = TRUE) { global $user; global $bridge; guifi_log(GUIFILOG_TRACE, 'function guifi_device_save()', $edit); $bridge = FALSE; $to_mail = array(); $tomail[] = $user->mail; $log = ""; $to_mail = array(); // device // TODO : corretgir que agafi els midi fid de l'estructura qeu toca dins del edit // amb lo de sota els repliquem per poder-hi accedir directament if (in_array($edit['type'], array('radio', 'switch'))) { $edit['mid'] = $edit['variable']['model_id']; $edit['fid'] = $edit['variable']['firmware_id']; } if ($edit['type'] == 'radio') { if (!$edit['variable']['firmware']) { $firmware = db_fetch_object(db_query("SELECT id, nom as name " . "FROM {guifi_firmware} " . "WHERE id = '%d'", $edit['fid'])); $edit['variable']['firmware'] = $firmware->name; } } // TODO REMOVE EXTRA comprovar que no es serialitzen els camps de mid, fid, etc. if (!empty($edit['variable'])) { $edit['extra'] = serialize($edit['variable']); } // busquem el id de la configuracioUSC per aquests mid i fid $sql = db_query('SELECT id as uscid, enabled FROM {guifi_configuracioUnSolclic} WHERE mid=%d and fid=%d ', $edit['mid'], $edit['fid']); $configuracio = db_fetch_object($sql); $edit['usc_id'] = $configuracio->uscid; $ndevice = _guifi_db_sql('guifi_devices', array('id' => $edit['id']), $edit, $log, $to_mail); guifi_maintainers_save($ndevice['id'], 'device', $edit['maintainers']); guifi_funders_save($ndevice['id'], 'device', $edit['funders']); // Ensure we have all ports filled up to etherdev_max/optodev_max at model_specs $m = guifi_get_model_specs($edit['mid']); guifi_log(GUIFILOG_TRACE, 'function guifi_device_save(m)', $m); $interfaces = array_values($edit['interfaces']); guifi_log(GUIFILOG_TRACE, sprintf('switch %d saved, %d ports:', $ndevice['id'], $m->etherdev_max), $edit); if ($m->ethermax) { for ($port = 1; $port <= $m->ethermax; $port++) { if (!isset($interfaces[$port - 1])) { $ninterface = array('new' => true, 'interface_type' => isset($m->ethernames[$port - 1]) ? $m->ethernames[$port - 1] : $port, 'etherdev_counter' => $port, 'interface_class' => 'ethernet', 'device_id' => $ndevice['id'], 'mac' => _guifi_mac_sum($edit['mac'], $port - 1)); guifi_log(GUIFILOG_TRACE, sprintf('inserting interface at %d:', $ndevice['id']), $ninterface); _guifi_db_sql('guifi_interfaces', null, $ninterface, $log, $to_mail); } } } guifi_log(GUIFILOG_TRACE, sprintf('device saved:'), $ndevice); $movenode = explode('-', $edit['movenode']); // radios $rc = 0; if (is_array($edit['radios'])) { ksort($edit['radios']); } $rc = 0; if ($edit['radios']) { foreach ($edit['radios'] as $radiodev_counter => $radio) { $keys['id'] = $ndevice['id']; $keys['radiodev_counter'] = $radiodev_counter; $radio['id'] = $ndevice['id']; $radio['radiodev_counter'] = $rc; if ($movenode[0]) { $radio['nid'] = $movenode[0]; } $radio['model_id'] = $edit['variable']['model_id']; // check if device id has changed guifi_log(GUIFILOG_TRACE, sprintf('Checking radio (from:%d, to: %d): ', $radio['id'], $radio['to_id']), NULL); if (isset($radio['to_did'])) { // if radio has moved to another device: // -obtain the radiodev_counter of that device // -if has wLan/Lan interface: // -convert to wlan // -don't save it again at cable interfaces section' if ($radio['to_did'] != $radio['id']) { $radiomoved = TRUE; // -obtain the radiodev_counter of that device $radio['id'] = $radio['to_did']; $qry = db_query('SELECT max(radiodev_counter) + 1 rc ' . 'FROM {guifi_radios} ' . 'WHERE id=%d', $radio['to_did']); $nrc = db_fetch_array($qry); if (empty($nrc['rc'])) { $nrc['rc'] = '0'; } $radio['radiodev_counter'] = $nrc['rc']; drupal_set_message(t('Radio# %id has been moved to radio# %id2 at device %dname', array('%id' => $rc, '%id2' => $radio['radiodev_counter'], '%dname' => guifi_get_hostname($radio['to_did'])))); // -if has wLan/Lan interface: // -convert to wlan if is not going a be the main radio // -don't save it again at cable interfaces section' if ($radio['interfaces']) { foreach ($radio['interfaces'] as $iid => $interface) { if ($interface['interface_type'] == 'wLan/Lan') { foreach ($edit['interfaces'] as $ciid => $cinterface) { // unset from cable section if ($cinterface['interface_type'] == 'wLan/Lan') { unset($edit['interfaces'][$ciid]); } } // if not radio#0, set as wLan at the other device if ($nrc['rc']) { $radio['interfaces'][$iid]['interface_type'] = 'wLan'; } } } } $radio['interfaces'][$iid]['related_interfaces'] = $radio['to_did'] . ',' . $nrc['rc']; } } // save the radio $nradio = _guifi_db_sql('guifi_radios', $keys, $radio, $log, $to_mail); if (empty($nradio) or $radio['deleted']) { continue; } // interfaces if ($radio['interfaces']) { foreach ($radio['interfaces'] as $interface_id => $interface) { $interface['device_id'] = $radio['id']; $interface['mac'] = $radio['mac']; $interface['radiodev_counter'] = $nradio['radiodev_counter']; $log .= guifi_device_interface_save($interface, $interface_id, $edit['id'], $ndevice['nid'], $to_mail); } } // foreach interface $rc++; } } // foreach radio // Interfaces if (!empty($edit['interfaces'])) { // Set etherdev_counter (sort the interfaces by it) uasort($edit['interfaces'], 'guifi_interfaces_cmp'); guifi_log(GUIFILOG_TRACE, 'Saving interfaces, interface:', $edit['interfaces']); $m = guifi_get_model_specs($edit['variable']['model_id']); $iCount = 0; // Save the interface foreach ($edit['interfaces'] as $iid => $interface) { $interface['device_id'] = $ndevice['id']; $interface['etherdev_counter'] = $iCount; if (in_array($edit['type'], array('switch'))) { $interface[interface_type] = $m->ethernames[$iCount]; } $interface[interface_class] = 'ethernet'; $iCount++; guifi_log(GUIFILOG_TRACE, sprintf('iid: %d, edit[nid]: %d, ndevice[id]: %d, interface:', $iid, $edit['nid'], $ndevice['nid'], $ndevice['nid']), $interface); if ($iid != 'ifs') { $log .= guifi_device_interface_save($interface, $iid, $edit['id'], $ndevice['nid'], $to_mail); } } } // vlans & aggregations foreach (array('vlans', 'aggregations') as $iClass) { if (!empty($edit[$iClass])) { // Save the interface foreach ($edit[$iClass] as $iid => $interface) { if ($radiomoved == TRUE) { if ($interface['interface_class'] == 'wds/p2p') { continue; } } if (is_array($interface[related_interfaces])) { $interface[related_interfaces] = implode('|', $interface[related_interfaces]); } $interface['device_id'] = $ndevice['id']; $log .= guifi_device_interface_save($interface, $iid, $edit['id'], $ndevice['nid'], $to_mail); } } } // ipv4s if (!empty($edit[ipv4])) { guifi_log(GUIFILOG_TRACE, 'guifi_device_save (ipv4s)', $edit['ipv4']); foreach ($edit['ipv4'] as $k => $ipv4) { if (is_numeric($k)) { guifi_log(GUIFILOG_TRACE, 'guifi_device_save (ipv4)', $ipv4); $iipv4 = db_fetch_array(db_query("SELECT * FROM {guifi_ipv4} WHERE ipv4 = '%s' ", $ipv4['ipv4'])); $countqry = db_query("SELECT COUNT(*) FROM {guifi_ipv4} WHERE interface_id = %d", $iipv4['interface_id']); $count = db_result($countqry, 0); $ipv4_id = $count + 1; // TODO abans del save cal comprovar un id ipv4 disponbile, modificar-lo als links si en te, si es un link sense fils no ha de permtre triar uan interficie etherX,etc.. // db_query("UPDATE {guifi_ipv4} SET id = %d, interface_id = %d WHERE ipv4 = '%s' AND interface_id = %d",$ipv4_id, $ipv4['interface_id'],$iipv4['ipv4'],$iipv4['interface_id']); } } } $to_mail = explode(',', $edit['notification']); if ($edit['new']) { $subject = t('The device %name has been CREATED by %user.', array('%name' => $edit['nick'], '%user' => $user->name)); } else { $subject = t('The device %name has been UPDATED by %user.', array('%name' => $edit['nick'], '%user' => $user->name)); } // drupal_set_message($subject); guifi_notify($to_mail, $subject, $log, $verbose, $notify); guifi_node_set_flag($edit['nid']); guifi_clear_cache($edit['nid']); guifi_clear_cache($edit['id']); variable_set('guifi_refresh_dns', time()); return $ndevice['id']; }
/** guifi_node_update(): Update a node in the database */ function guifi_node_update($node) { global $user; $log = ''; $coord = guifi_coord_dmstod($node->latdeg, $node->latmin, $node->latseg); if ($coord != NULL) { $node->lat = $coord; } $coord = guifi_coord_dmstod($node->londeg, $node->lonmin, $node->lonseg); if ($coord != NULL) { $node->lon = $coord; } if ($node->lat == 0) { $node->lat = NULL; } if ($node->lon == 0) { $node->lon = NULL; } $to_mail = explode(',', $node->notification); // Refresh maps? $pn = db_fetch_object(db_query('SELECT l.* FROM {guifi_location} l WHERE l.id=%d', $node->nid)); if ($pn->lat != $node->lat || $pn->lon != $node->lon || $pn->status_flag != $node->status_flag) { // touch(variable_get('guifi_rebuildmaps','/tmp/ms_tmp/REBUILD')); variable_set('guifi_refresh_cnml', time()); variable_set('guifi_refresh_maps', time()); cache_clear_all(); } $node->lat = (double) $node->lat; $node->lon = (double) $node->lon; guifi_maintainers_save($node->nid, 'location', $node->maintainers); guifi_funders_save($node->nid, 'location', $node->funders); $nnode = _guifi_db_sql('guifi_location', array('id' => $node->nid), (array) $node, $log, $to_mail); guifi_notify($to_mail, t('The node %name has been UPDATED by %user.', array('%name' => $node->title, '%user' => $user->name)), $log); guifi_clear_cache($node->nid); }
function guifi_domain_save($edit, $verbose = TRUE, $notify = TRUE) { global $user; $to_mail = array(); $tomail[] = $user->mail; $log = ""; $to_mail = array(); // domain $ndomain = _guifi_db_sql('guifi_dns_domains', array('id' => $edit['id']), $edit, $log, $to_mail); guifi_log(GUIFILOG_TRACE, sprintf('domain saved:'), $ndomain); // hosts $rc = 0; if (is_array($edit['hosts'])) { ksort($edit['hosts']); } $rc = 0; if ($edit['hosts']) { foreach ($edit['hosts'] as $counter => $host) { $keys['id'] = $ndomain['id']; $keys['counter'] = $counter; $host['id'] = $ndomain['id']; $host['counter'] = $rc; if ($host['aliases']) { foreach ($host['aliases'] as $key => $name) { if (empty($name)) { unset($host['aliases'][$key]); } } $host['aliases'] = serialize($host['aliases']); } else { unset($host['aliases']); } if ($host['host'] == 'ns1' and $host['counter'] == '0') { $host['opt']['options']['NS'] = 'NS'; } $host['opt']['options']['mxprior'] = $host['opt']['mxprior']; $host['options'] = serialize($host['opt']['options']); // save the host $nhost = _guifi_db_sql('guifi_dns_hosts', $keys, $host, $log, $to_mail); if (empty($nhost) or $host['deleted']) { continue; } $rc++; } } // foreach host $to_mail = explode(',', $edit['notification']); if ($edit['new']) { $subject = t('The domain %name has been CREATED by %user.', array('%name' => $edit['name'], '%user' => $user->name)); } else { $subject = t('The domain %name has been UPDATED by %user.', array('%name' => $edit['name'], '%user' => $user->name)); } // drupal_set_message($subject); guifi_notify($to_mail, $subject, $log, $verbose, $notify); variable_set('guifi_refresh_dns', time()); guifi_clear_cache($edit['sid']); guifi_clear_cache($edit['id']); return $ndomain['id']; }
/** guifi_zone_update(): Save zone changes into the database. */ function guifi_zone_update($node) { global $user; $log = ''; // if box changed, maps should be rebuilt $pz = db_fetch_object(db_query('SELECT * FROM {guifi_zone} z WHERE z.id = %d', $node->nid)); if ($pz->maxx != $node->maxx || $pz->maxy != $node->maxy || $pz->minx != $node->minx || $pz->miny != $node->miny) { // touch(variable_get('guifi_rebuildmaps','/tmp/ms_tmp/REBUILD')); variable_set('guifi_refresh_cnml', time()); variable_set('guifi_refresh_maps', time()); cache_clear_all(); } // $node->maintainer=guifi_maintainers_save($node->maintainers); $node->minx = (double) $node->minx; $node->maxx = (double) $node->maxx; $node->miny = (double) $node->miny; $node->maxy = (double) $node->maxy; $to_mail = explode(',', $node->notification); $nzone = _guifi_db_sql('guifi_zone', array('id' => $node->nid), (array) $node, $log, $to_mail); guifi_maintainers_save($node->nid, 'zone', $node->maintainers); guifi_notify(explode(',', $node->notification), t('Zone %nick-%name has been updated', array('%nick' => $node->nick, '%name' => $node->title)), $log); guifi_clear_cache($node->nid); }