function ona_find_custom_attribute($search = "") { global $self; // Validate input if ($search == "") { return array(1, 0, array()); } // If it's numeric, search by record ID if (is_numeric($search)) { $field = 'id'; list($status, $rows, $record) = ona_get_custom_attribute_record(array($field => $search)); // If we got it, return it if ($status == 0 and $rows == 1) { printmsg("DEBUG => ona_find_custom_attribute() found custom attribute record by {$field}", 2); return array(0, $rows, $record); } } // Split the description based on the () enclosed type list($ca_type, $ca_value) = preg_split("/\\(|\\)/", $search); printmsg("DEBUG => ona_find_custom_attribute(): Split is {$ca_type},{$ca_value}", 3); // It's a string - do several sql queries and see if we can get a unique match list($status, $rows, $type) = ona_get_custom_attribute_type_record(array('name' => trim($ca_type))); printmsg("DEBUG => ona_find_custom_attribute(): Found {$rows} custom attribute type record", 3); // Find the ID using the type id and value list($status, $rows, $record) = ona_get_custom_attribute_record(array('value' => $ca_value, 'custom_attribute_type_id' => $type['id'])); // If we got it, return it if ($status == 0 and $rows == 1) { printmsg("DEBUG => ona_find_custom_attribute(): Found custom attribute record by its full name", 2); return array(0, $rows, $record); } // We didn't find it - return and error code, 0 matches, and an empty record. $self['error'] = "NOTICE => couldn't find a unique custom attribute record with specified search criteria"; printmsg($self['error'], 2); return array(2, 0, array()); }
list($status, $rows, $attributes) = db_get_records($onadb, 'custom_attributes', array('table_id_ref' => $record['id'], 'table_name_ref' => $kind . 's'), ''); // create workspace menu items // This is where you list an array of menu items to display for this workspace $modwsmenu[0]['menutitle'] = 'Add Custom Attribute'; $modwsmenu[0]['tooltip'] = "Add Custom Attribute to this {$kind}"; $modwsmenu[0]['authname'] = 'custom_attribute_add'; $modwsmenu[0]['commandjs'] = "xajax_window_submit('edit_custom_attribute', xajax.getFormValues('form_{$kind}_{$record['id']}'), 'editor');"; $modwsmenu[0]['image'] = '/images/silk/tag_blue.png'; // CUSTOM ATTRIBUTES LIST if ($rows) { $modbodyhtml .= <<<EOL <!-- CUSTOM ATTRIBUTES --> <table width=100% cellspacing="0" border="0" cellpadding="0" style="margin-bottom: 8px; margin-top: 0px;"> EOL; foreach ($attributes as $entry) { list($status, $rows, $ca_type) = ona_get_custom_attribute_record(array('id' => $entry['id'])); $modbodyhtml .= <<<EOL <tr onMouseOver="this.className='row-highlight';" onMouseOut="this.className='row-normal';"> <td align="left" nowrap="true" onmouseover="wwTT(this, event, 'id', 'tt_cainfo_{$entry['id']}', 'type', 'velcro', 'styleClass', 'wwTT_ca_info', 'direction', 'south', 'javascript', 'xajax_window_submit(\\'tooltips\\', \\'tooltip=>cainfo,id=>tt_cainfo_{$entry['id']},ca_id=>{$entry['id']}\\');' );" > {$ca_type['name']} </td>
function get_custom_attribute_info_html($form) { global $conf, $self, $onadb; global $font_family, $color, $style, $images; $html = $js = ''; list($status, $rows, $ca) = ona_get_custom_attribute_record(array('id' => $form['ca_id'])); if ($rows == 0 or $status) { return array('', ''); } $html .= <<<EOL <!-- Custom Attribute Info --> <table cellspacing="0" border="0" cellpadding="0"> <tr> <td align="left" nowrap="true" colspan="99"><b><u>Custom Attribute Info</u></b> </td> </tr> <tr> <td align="right" nowrap="true" style="font-weight: bold;"> {$window['edit_type']} </td> <td class="padding" align="left" > {$window['edit_type_value']} </td> </tr> <tr> <td align="right" nowrap="true" style="font-weight: bold;"> Type </td> <td class="padding" align="left" > {$ca['name']} </td> </tr> <tr> <td align="right" nowrap="true" style="font-weight: bold;"> Value </td> <td class="padding" align="left" > <textarea name="value" alt="Value" style="font-family: inherit;background-color: white;" readonly="true" rows="6" cols="40" >{$ca['value']}</textarea> </td> </tr> EOL; $html .= <<<EOL </table> EOL; return array($html, $js); }
function custom_attribute_display($options = "") { // The important globals global $conf, $self, $onadb; $text_array = array(); // Version - UPDATE on every edit! $version = '1.02'; printmsg("DEBUG => custom_attribute_display({$options}) called", 3); // Parse incoming options string to an array $options = parse_options($options); // Return the usage summary if we need to if ($options['help'] or !$options['host'] and !$options['id'] and !$options['subnet'] and !$options['vlan']) { // NOTE: Help message lines should not exceed 80 characters for proper display on a console $self['error'] = 'ERROR => Insufficient parameters'; return array(1, <<<EOM custom_attribute_display-v{$version} Display the custom attribute specified or attributes for a host Synopsis: custom_attribute_display Where: id=ID custom attribute ID OR host=ID or NAME[.DOMAIN] display custom attributes for specified host OR subnet=ID or NAME display custom attributes for specified subnet OR vlan=NAME display custom attributes for specified VLAN Optional: type=ID or NAME If you specify a type and a host or subnet you will only get back a 1 or a 0 indicating that that type is set or not set for the host or subnet EOM ); } // if a type was set, check if it is associated with the host or subnet and return 1 or 0 if ($options['type']) { $field = is_numeric($options['type']) ? 'id' : 'name'; list($status, $rows, $catype) = ona_get_custom_attribute_type_record(array($field => $options['type'])); // error if we cant find the type specified if (!$catype['id']) { $self['error'] = "ERROR => The custom attribute type specified, {$options['type']}, does not exist!"; return array(5, $self['error']); } $where['custom_attribute_type_id'] = $catype['id']; } // Search for the host first if ($options['host']) { list($status, $rows, $host) = ona_find_host($options['host']); // Error if the host doesn't exist if (!$host['id']) { $self['error'] = "ERROR => The host specified, {$options['host']}, does not exist!"; return array(2, $self['error']); } else { $where['table_id_ref'] = $host['id']; $where['table_name_ref'] = 'hosts'; list($status, $rows, $cas) = db_get_records($onadb, 'custom_attributes', $where); } $anchor = 'host'; $desc = $host['fqdn']; } // Search for subnet if ($options['subnet']) { list($status, $rows, $subnet) = ona_find_subnet($options['subnet']); // Error if the record doesn't exist if (!$subnet['id']) { $self['error'] = "ERROR => The subnet specified, {$options['subnet']}, does not exist!"; return array(3, $self['error']); } else { $where['table_id_ref'] = $subnet['id']; $where['table_name_ref'] = 'subnets'; list($status, $rows, $cas) = db_get_records($onadb, 'custom_attributes', $where); } $anchor = 'subnet'; $desc = $subnet['description']; } // Search for vlan if ($options['vlan']) { list($status, $rows, $vlan) = ona_find_vlan($options['vlan']); // Error if the record doesn't exist if (!$vlan['id']) { $self['error'] = "ERROR => The VLAN specified, {$options['vlan']}, does not exist!"; return array(3, $self['error']); } else { $where['table_id_ref'] = $vlan['id']; $where['table_name_ref'] = 'vlans'; list($status, $rows, $cas) = db_get_records($onadb, 'custom_attributes', $where); } $anchor = 'vlan'; $desc = $vlan['description']; } // Now find the ID of the record, returns a specific record only if ($options['id']) { list($status, $rows, $ca) = ona_get_custom_attribute_record(array('id' => $options['id'])); if (!$ca['id']) { $self['error'] = "ERROR => The custom attribute specified, {$options['id']}, is invalid!"; return array(4, $self['error']); } $text_array = $ca; $text .= "CUSTOM ATTRIBUTE ENTRY RECORD ({$ca['id']})\n"; $text .= format_array($ca); } elseif ($options['type']) { // If we requested type, now is the time to return a response if it is found associated. if ($cas[0]) { $text .= '1'; $text_array['has_attribute'] = 'Y'; } else { $text .= '0'; $text_array['has_attribute'] = 'N'; } } else { // Build text to return $text .= strtoupper($anchor) . " CUSTOM ATTRIBUTE RECORDS ({$desc})\n"; // Display the record(s) $i = 0; do { $text .= "\nASSOCIATED CUSTOM ATTRIBUTE ENTRY RECORD ({$i} of {$rows})\n"; $text .= format_array($cas[$i]); list($status, $carows, $ca) = ona_get_custom_attribute_type_record(array('id' => $cas[$i]['custom_attribute_type_id'])); $text_array[$ca['name']] = $cas[$i]['value']; $i++; } while ($i < $rows); } // change the output format if other than default if ($options['format'] == 'json') { $text = $text_array; } if ($options['format'] == 'yaml') { $text = $text_array; } // Return the success notice return array(0, $text); }
function host_del($options = "") { global $conf, $self, $onadb; printmsg("DEBUG => host_del({$options}) called", 3); // Version - UPDATE on every edit! $version = '1.19'; // Parse incoming options string to an array $options = parse_options($options); // Sanitize options[commit] (default is no) $options['commit'] = sanitize_YN($options['commit'], 'N'); // Return the usage summary if we need to if ($options['help'] or !$options['host']) { // NOTE: Help message lines should not exceed 80 characters for proper display on a console $self['error'] = 'ERROR => Insufficient parameters'; return array(1, <<<EOM host_del-v{$version} Deletes a host, and all related records from the database Synopsis: host_del [KEY=VALUE] ... Required: host=NAME[.DOMAIN] or ID Hostname or ID of the host to delete Optional: commit=[yes|no] Commit db transaction (no) Notes: * A host won't be deleted if it has config text records * A host won't be deleted if it's configured as a dns or dhcp server EOM ); } // Find the host (and domain) record from $options['host'] list($status, $rows, $host) = ona_find_host($options['host']); printmsg("DEBUG => host_del() Host: {$host['fqdn']} ({$host['id']})", 3); if (!$host['id']) { printmsg("DEBUG => Unknown host: {$host['fqdn']}", 3); $self['error'] = "ERROR => Unknown host: {$host['fqdn']}"; return array(2, $self['error'] . "\n"); } // Check permissions if (!auth('host_del') or !authlvl($host['LVL'])) { $self['error'] = "Permission denied!"; printmsg($self['error'], 0); return array(10, $self['error'] . "\n"); } // If "commit" is yes, delete the host if ($options['commit'] == 'Y') { $text = ""; $add_to_error = ""; $add_to_status = 0; // SUMMARY: // Don't allow a delete if it is performing server duties // Don't allow a delete if config text entries exist // Delete Interfaces // Delete interface cluster entries // Delete dns records // Delete custom attributes // Delete DHCP entries // Delete device record if it is the last host associated with it. // // IDEA: If it's the last host in a domain (maybe do the same for or a networks & vlans in the interface delete) // It could just print a notice or something. // Check that it is the host is not performing server duties // FIXME: MP mostly fixed..needs testing $serverrow = 0; // check ALL the places server_id is used and remove the entry from server_b if it is not used list($status, $rows, $srecord) = db_get_record($onadb, 'dhcp_server_subnets', array('host_id' => $host['id'])); if ($rows) { $serverrow++; } list($status, $rows, $srecord) = db_get_record($onadb, 'dhcp_failover_groups', array('primary_server_id' => $host['id'])); if ($rows) { $serverrow++; } list($status, $rows, $srecord) = db_get_record($onadb, 'dhcp_failover_groups', array('secondary_server_id' => $host['id'])); if ($rows) { $serverrow++; } if ($serverrow > 0) { printmsg("DEBUG => Host ({$host['fqdn']}) cannot be deleted, it is performing duties as a DHCP server!", 3); $self['error'] = "ERROR => Host ({$host['fqdn']}) cannot be deleted, it is performing duties as a DHCP server!"; return array(5, $self['error'] . "\n"); } // Check if host is a dns server $serverrow = 0; list($status, $rows, $srecord) = db_get_record($onadb, 'dns_server_domains', array('host_id' => $host['id'])); if ($rows) { $serverrow++; } if ($serverrow > 0) { printmsg("DEBUG => Host ({$host['fqdn']}) cannot be deleted, it is performing duties as a DNS server!", 3); $self['error'] = "ERROR => Host ({$host['fqdn']}) cannot be deleted, it is performing duties as a DNS server!"; return array(5, $self['error'] . "\n"); } // Display an error if it has any entries in configurations list($status, $rows, $server) = db_get_record($onadb, 'configurations', array('host_id' => $host['id'])); if ($rows) { printmsg("DEBUG => Host ({$host['fqdn']}) cannot be deleted, it has config archives!", 3); $self['error'] = "ERROR => Host ({$host['fqdn']}) cannot be deleted, it has config archives!"; return array(5, $self['error'] . "\n"); } // Delete interface(s) // get list for logging $clustcount = 0; $dnscount = 0; list($status, $rows, $interfaces) = db_get_records($onadb, 'interfaces', array('host_id' => $host['id'])); // Cant delete if one of the interfaces is primary for a cluster foreach ($interfaces as $int) { list($status, $rows, $records) = db_get_records($onadb, 'interface_clusters', array('interface_id' => $int['id'])); $clustcount = $clustcount + $rows; } if ($clustcount) { $self['error'] = "ERROR => host_del() An interface on this host is primary for some interface shares, delete the share or move the interface first."; printmsg($self['error'], 0); return array(5, $self['error'] . "\n"); } // do the interface_cluster delete. This just removes this host from the cluster, not the whole cluster itself // It will error out as well if this interface is the primary in the cluster list($status, $rows) = db_delete_records($onadb, 'interface_clusters', array('host_id' => $host['id'])); if ($status) { $self['error'] = "ERROR => host_del() interface_cluster delete SQL Query failed: {$self['error']}"; printmsg($self['error'], 0); return array(5, $self['error'] . "\n"); } // log deletions printmsg("INFO => {$rows} Shared interface(s) DELETED from {$host['fqdn']}", 0); $add_to_error .= "INFO => {$rows} Shared interface(s) DELETED from {$host['fqdn']}\n"; // Delete each DNS record associated with this hosts interfaces. // foreach ($interfaces as $int) { // // Loop through each dns record associated with this interface. // list($status, $rows, $records) = db_get_records($onadb, 'dns', array('interface_id' => $int['id'])); // if ($rows) { // foreach($records as $record) { // // Run the module // list($status, $output) = run_module('dns_record_del', array('name' => $record['id'], 'type' => $record['type'], 'commit' => 'Y', 'delete_by_module' => 'Y')); // $add_to_error .= $output; // $add_to_status = $add_to_status + $status; // } // } // } // Delete messages // get list for logging list($status, $rows, $records) = db_get_records($onadb, 'messages', array('table_name_ref' => 'hosts', 'table_id_ref' => $host['id'])); // do the delete list($status, $rows) = db_delete_records($onadb, 'messages', array('table_name_ref' => 'hosts', 'table_id_ref' => $host['id'])); if ($status) { $self['error'] = "ERROR => host_del() message delete SQL Query failed: {$self['error']}"; printmsg($self['error'], 0); return array(5, $self['error'] . "\n"); } // log deletions printmsg("INFO => {$rows} Message(s) DELETED from {$host['fqdn']}", 0); $add_to_error .= "INFO => {$rows} Message(s) DELETED from {$host['fqdn']}\n"; // Delete the interfaces.. this should delete dns names and other things associated with interfaces.. foreach ($interfaces as $record) { // Run the module list($status, $output) = run_module('interface_del', array('interface' => $record['id'], 'commit' => 'on', 'delete_by_module' => 'Y')); $add_to_error .= $output; $add_to_status = $add_to_status + $status; } // Delete device record // Count how many hosts use this same device list($status, $rows, $records) = db_get_records($onadb, 'hosts', array('device_id' => $host['device_id'])); // if device count is just 1 do the delete if ($rows == 1) { list($status, $rows) = db_delete_records($onadb, 'devices', array('id' => $host['device_id'])); if ($status) { $self['error'] = "ERROR => host_del() device delete SQL Query failed: {$self['error']}"; printmsg($self['error'], 0); return array(5, $add_to_error . $self['error'] . "\n"); } // log deletions printmsg("INFO => Device record DELETED: [{$record['id']}] no remaining hosts using this device", 0); } else { printmsg("INFO => Device record NOT DELETED: [{$record['id']}] there are other hosts using this device.", 1); } // Delete tag entries list($status, $rows, $records) = db_get_records($onadb, 'tags', array('type' => 'host', 'reference' => $host['id'])); $log = array(); $i = 0; foreach ($records as $record) { $log[$i] = "INFO => Tag DELETED: {$record['name']} from {$host['fqdn']}"; $i++; } //do the delete list($status, $rows) = db_delete_records($onadb, 'tags', array('type' => 'host', 'reference' => $host['id'])); if ($status) { $self['error'] = "ERROR => host_del() Tag delete SQL Query failed: {$self['error']}"; printmsg($self['error'], 0); return array(5, $add_to_error . $self['error'] . "\n"); } //log deletions foreach ($log as $log_msg) { printmsg($log_msg, 0); $add_to_error .= $log_msg . "\n"; } // Delete custom attribute entries // get list for logging list($status, $rows, $records) = db_get_records($onadb, 'custom_attributes', array('table_name_ref' => 'hosts', 'table_id_ref' => $host['id'])); $log = array(); $i = 0; foreach ($records as $record) { list($status, $rows, $ca) = ona_get_custom_attribute_record(array('id' => $record['id'])); $log[$i] = "INFO => Custom Attribute DELETED: {$ca['name']} ({$ca['value']}) from {$host['fqdn']}"; $i++; } //do the delete list($status, $rows) = db_delete_records($onadb, 'custom_attributes', array('table_name_ref' => 'hosts', 'table_id_ref' => $host['id'])); if ($status) { $self['error'] = "ERROR => host_del() Custom attribute delete SQL Query failed: {$self['error']}"; printmsg($self['error'], 0); return array(5, $add_to_error . $self['error'] . "\n"); } //log deletions foreach ($log as $log_msg) { printmsg($log_msg, 0); $add_to_error .= $log_msg . "\n"; } // Delete DHCP options // get list for logging list($status, $rows, $records) = db_get_records($onadb, 'dhcp_option_entries', array('host_id' => $host['id'])); $log = array(); $i = 0; foreach ($records as $record) { list($status, $rows, $dhcp) = ona_get_dhcp_option_entry_record(array('id' => $record['id'])); $log[$i] = "INFO => DHCP entry DELETED: {$dhcp['display_name']}={$dhcp['value']} from {$host['fqdn']}"; $i++; } // do the delete list($status, $rows) = db_delete_records($onadb, 'dhcp_option_entries', array('host_id' => $host['id'])); if ($status) { $self['error'] = "ERROR => host_del() DHCP option entry delete SQL Query failed: {$self['error']}"; printmsg($self['error'], 0); return array(5, $add_to_error . $self['error'] . "\n"); } // log deletions foreach ($log as $log_msg) { printmsg($log_msg, 0); $add_to_error .= $log_msg . "\n"; } // Delete the host list($status, $rows) = db_delete_records($onadb, 'hosts', array('id' => $host['id'])); if ($status) { $self['error'] = "ERROR => host_del() host delete SQL Query failed: {$self['error']}"; printmsg($self['error'], 0); return array(5, $add_to_error . $self['error'] . "\n"); } // Return the success notice if ($add_to_status == 0) { $self['error'] = "INFO => Host DELETED: {$host['fqdn']}"; } printmsg($self['error'], 0); return array($add_to_status, $add_to_error . $self['error'] . "\n"); } // // We are just displaying records that would have been deleted // // SUMMARY: // Display a warning if it is a server // Display a warning if it has config text entries // Display Interfaces // Display dns records // Display custom attributes // Display DHCP entries // Otherwise just display the host record for the host we would have deleted $text = "Record(s) NOT DELETED (see \"commit\" option)\n" . "Displaying record(s) that would have been deleted:\n"; // Display a warning if host is performing server duties list($status, $rows, $srecord) = db_get_record($onadb, 'dhcp_server_subnets', array('host_id' => $host['id'])); if ($rows) { $text .= "\nWARNING! This host is a DHCP server for {$rows} subnet(s)\n"; } list($status, $rows, $srecord) = db_get_record($onadb, 'dns_server_domains', array('host_id' => $host['id'])); if ($rows) { $text .= "\nWARNING! This host is a DNS server for one or more domains!\n"; } list($status, $rows, $srecord) = db_get_record($onadb, 'dhcp_failover_groups', array('primary_server_id' => $host['id'])); if ($rows) { $text .= "\nWARNING! This host is a server that is primary in a DHCP failover group\n"; } list($status, $rows, $srecord) = db_get_record($onadb, 'dhcp_failover_groups', array('secondary_server_id' => $host['id'])); if ($rows) { $text .= "\nWARNING! This host is a server that is secondary in a DHCP failover group\n"; } // Display a warning if it has any configurations list($status, $rows, $server) = db_get_record($onadb, 'configurations', array('host_id' => $host['id'])); if ($rows) { $text .= "\nWARNING! Host can not be deleted, it has config archives!\n"; } if ($rows) { $text .= "\nWARNING! Host will NOT be deleted, due to previous warnings!\n"; } // Display the Host's complete record list($status, $tmp) = host_display("host={$host['id']}&verbose=N"); $text .= "\n" . $tmp; // Display count of messages list($status, $rows, $records) = db_get_records($onadb, 'messages', array('table_name_ref' => 'hosts', 'table_id_ref' => $host['id'])); if ($rows) { $text .= "\nASSOCIATED MESSAGE RECORDS ({$rows}):\n"; } // Display associated interface(s) list($status, $int_rows, $interfaces) = db_get_records($onadb, 'interfaces', array('host_id' => $host['id'])); // show the dns records associated foreach ($interfaces as $record) { list($status, $rows, $dnsrec) = db_get_records($onadb, 'dns', array('interface_id' => $record['id'])); if ($rows) { $text .= "\nASSOCIATED DNS RECORDS ({$rows}) ON INTERFACE (" . ip_mangle($record['ip_addr'], 'dotted') . "):\n"; foreach ($dnsrec as $rec) { // show AAAA or A type as needed if ($record['ip_addr'] > 4294967295 and $rec['type'] == 'A') { $rec['type'] = 'AAAA'; } $text .= " TYPE: [ID:{$rec['id']}] {$rec['type']}, {$rec['name']} -> " . ip_mangle($record['ip_addr'], 'dotted') . "\n"; } } } if ($int_rows) { $text .= "\nASSOCIATED INTERFACE RECORDS ({$int_rows}):\n"; } foreach ($interfaces as $record) { $text .= " [ID:{$record['id']}] " . ip_mangle($record['ip_addr'], 'dotted') . "\n"; } // Display associated interface_clusters(s) list($status, $clust_rows, $interfaceclusters) = db_get_records($onadb, 'interface_clusters', array('host_id' => $host['id'])); if ($clust_rows) { $text .= "\nASSOCIATED SHARED INTERFACE RECORDS ({$clust_rows}):\n"; } foreach ($interfaceclusters as $record) { list($status, $rows, $int) = ona_get_interface_record(array('id' => $record['interface_id'])); $text .= " [ID:{$int['id']}] {$int['ip_addr_text']}\n"; } // Display associated tags list($status, $rows, $records) = db_get_records($onadb, 'tags', array('type' => 'host', 'reference' => $host['id'])); if ($rows) { $text .= "\nASSOCIATED TAG RECORDS ({$rows}):\n"; } foreach ($records as $record) { $text .= " {$record['name']}\n"; } // Display associated custom attributes list($status, $rows, $records) = db_get_records($onadb, 'custom_attributes', array('table_name_ref' => 'hosts', 'table_id_ref' => $host['id'])); if ($rows) { $text .= "\nASSOCIATED CUSTOM ATTRIBUTE RECORDS ({$rows}):\n"; } foreach ($records as $record) { list($status, $rows, $ca) = ona_get_custom_attribute_record(array('id' => $record['id'])); $text .= " {$ca['name']} => {$ca['value']}\n"; } // Display associated DHCP entries list($status, $rows, $records) = db_get_records($onadb, 'dhcp_option_entries', array('host_id' => $host['id'])); if ($rows) { $text .= "\nASSOCIATED DHCP OPTION RECORDS ({$rows}):\n"; } foreach ($records as $record) { list($status, $rows, $dhcp) = ona_get_dhcp_option_entry_record(array('id' => $record['id'])); $text .= " {$dhcp['display_name']} => {$dhcp['value']}\n"; } return array(7, $text); }
function subnet_del($options = "") { global $conf, $self, $onadb; // Version - UPDATE on every edit! $version = '1.06'; printmsg('DEBUG => subnet_del(' . $options . ') called', 3); // Parse incoming options string to an array $options = parse_options($options); // Sanitize options[commit] (default is no) $options['commit'] = sanitize_YN($options['commit'], 'N'); // Return the usage summary if we need to if ($options['help'] or !$options['subnet']) { // NOTE: Help message lines should not exceed 80 characters for proper display on a console $self['error'] = 'ERROR => Insufficient parameters'; return array(1, <<<EOM subnet_del-v{$version} Deletes a subnet (subnet) from the database Synopsis: subnet_del [KEY=VALUE] ... Required: subnet=IP or ID select subnet by search string Optional: commit=[yes|no] commit db transaction (no) EOM ); } // Find the subnet record we're deleting list($status, $rows, $subnet) = ona_find_subnet($options['subnet']); if ($status or !$rows) { $self['error'] = "ERROR => Subnet not found"; return array(2, $self['error'] . "\n"); } // Check permissions if (!auth('subnet_del') or !authlvl($subnet['lvl'])) { $self['error'] = "Permission denied!"; printmsg($self['error'], 0); return array(3, $self['error'] . "\n"); } // If "commit" is yes, delete the subnet if ($options['commit'] == 'Y') { $text = ""; // FIXME: (add all this) ... // SUMMARY: // Delete assignments to any DHCP servers // Delete any DHCP pools on the current subnet // Delete any DHCP options associated with this subnet // Delete any interfaces belonging to hosts with more than one interface // Delete any hosts (and all their associated info) that have only one interface // Delete subnet Record // Delete custom attributes // // FIXME: display a warning if there are no more subnets that a dhcp server is serving dhcp for? // Delete DHCP server assignments list($status, $rows) = db_delete_records($onadb, 'dhcp_server_subnets', array('subnet_id' => $subnet['id'])); if ($status) { $self['error'] = "ERROR => DHCP server assignment delete failed: {$self['error']}"; return array(5, $self['error'] . "\n"); } // Delete DHCP pools list($status, $rows) = db_delete_records($onadb, 'dhcp_pools', array('subnet_id' => $subnet['id'])); if ($status) { $self['error'] = "ERROR => DHCP pool delete failed: {$self['error']}"; return array(5, $self['error'] . "\n"); } // Delete DHCP options list($status, $rows) = db_delete_records($onadb, 'dhcp_option_entries', array('subnet_id' => $subnet['id'])); if ($status) { $self['error'] = "ERROR => DHCP parameter delete failed: {$self['error']}"; return array(5, $self['error'] . "\n"); } // Delete tag entries list($status, $rows, $records) = db_get_records($onadb, 'tags', array('type' => 'subnet', 'reference' => $subnet['id'])); $log = array(); $i = 0; foreach ($records as $record) { $log[$i] = "INFO => Tag DELETED: {$record['name']} from {$subnet['name']}"; $i++; } //do the delete list($status, $rows) = db_delete_records($onadb, 'tags', array('type' => 'subnet', 'reference' => $subnet['id'])); if ($status) { $self['error'] = "ERROR => subnet_del() Tag delete SQL Query failed: {$self['error']}"; printmsg($self['error'], 0); return array(5, $add_to_error . $self['error'] . "\n"); } //log deletions foreach ($log as $log_msg) { printmsg($log_msg, 0); $add_to_error .= $log_msg . "\n"; } // Delete custom attribute entries // get list for logging list($status, $rows, $records) = db_get_records($onadb, 'custom_attributes', array('table_name_ref' => 'subnets', 'table_id_ref' => $subnet['id'])); $log = array(); $i = 0; foreach ($records as $record) { list($status, $rows, $ca) = ona_get_custom_attribute_record(array('id' => $record['id'])); $log[$i] = "INFO => Custom Attribute DELETED: {$ca['name']} ({$ca['value']}) from {$subnet['name']}"; $i++; } //do the delete list($status, $rows) = db_delete_records($onadb, 'custom_attributes', array('table_name_ref' => 'subnets', 'table_id_ref' => $subnet['id'])); if ($status) { $self['error'] = "ERROR => subnet_del() Custom attribute delete SQL Query failed: {$self['error']}"; printmsg($self['error'], 0); return array(5, $self['error'] . "\n"); } //log deletions foreach ($log as $log_msg) { printmsg($log_msg, 0); //$add_to_error .= $log_msg . "\n"; } // Delete associated host / interface records that need to be deleted // BUSINESS RULE: We delete hosts that have only one interface (and it's on this subnet) // BUSINESS RULE: We delete interfaces from hosts that have multiple interfaces list($status, $rows, $interfaces) = db_get_records($onadb, 'interfaces', array('subnet_id' => $subnet['id'])); $hosts_to_delete = array(); $interfaces_to_delete = array(); foreach ($interfaces as $interface) { // Select all interfaces for the associated host where the subnet ID is not our subnet ID $where = "host_id = {$interface['host_id']} AND subnet_id != {$subnet['id']}"; list($status, $rows, $tmp) = db_get_records($onadb, 'interfaces', $where, '', 0); // We'll delete hosts that have only one interface (i.e. no interfaces on any other subnets) if ($rows == 0) { array_push($hosts_to_delete, $interface['host_id']); } else { array_push($interfaces_to_delete, $interface['id']); } } unset($interfaces); // make sure we only have one reference for each host and interface $interfaces_to_delete = array_unique($interfaces_to_delete); $hosts_to_delete = array_unique($hosts_to_delete); // Delete interfaces we have selected foreach ($interfaces_to_delete as $interface_id) { list($status, $output) = run_module('interface_del', array('interface' => $interface_id, 'commit' => 'Y')); if ($status) { return array(5, $output); } } // Delete hosts we have selected foreach ($hosts_to_delete as $host_id) { list($status, $output) = run_module('host_del', array('host' => $host_id, 'commit' => 'Y')); if ($status) { return array(5, $output); } } // Delete the subnet list($status, $rows) = db_delete_records($onadb, 'subnets', array('id' => $subnet['id'])); if ($status or !$rows) { $self['error'] = "ERROR => Subnet delete failed: {$self['error']}"; return array(5, $self['error'] . "\n"); } // Return the success notice $ip = ip_mangle($subnet['ip_addr'], 'dotted'); $cidr = ip_mangle($subnet['ip_mask'], 'cidr'); $self['error'] = "INFO => Subnet DELETED: {$subnet['name']} IP: {$ip}/{$cidr}"; printmsg($self['error'], 0); return array(0, $self['error'] . "\n"); } // // We are just displaying records that would have been deleted // // SUMMARY: // Display assignments to any DHCP servers // Display any DHCP pools on the current subnet // Display any DHCP parameters associated with this subnet // Display subnet Record // Display Host records (and all their sub-records) // Display custom attributes // Otherwise just display the host record for the host we would have deleted $text = "Record(s) NOT DELETED (see \"commit\" option)\n" . "Displaying record(s) that would have been deleted:\n"; // Display the Subnet's complete record list($status, $tmp) = subnet_display("subnet={$subnet['id']}&verbose=N"); $text .= "\n" . $tmp; // Display assignments to any DHCP servers list($status, $rows, $records) = db_get_records($onadb, 'dhcp_server_subnets', array('subnet_id' => $subnet['id'])); if ($rows) { $text .= "\nASSOCIATED DHCP SERVER ASSIGNMENT RECORDS ({$rows}):\n"; } foreach ($records as $record) { $text .= format_array($record); } // Display any DHCP pools on the current subnet list($status, $rows, $records) = db_get_records($onadb, 'dhcp_pools', array('subnet_id' => $subnet['id'])); if ($rows) { $text .= "\nASSOCIATED DHCP POOL RECORDS ({$rows}):\n"; } foreach ($records as $record) { $text .= format_array($record); } // Display associated DHCP entries list($status, $rows, $records) = db_get_records($onadb, 'dhcp_option_entries', array('subnet_id' => $subnet['id'])); if ($rows) { $text .= "\nASSOCIATED DHCP ENTRY RECORDS ({$rows}):\n"; } foreach ($records as $record) { list($status, $rows, $dhcp) = ona_get_dhcp_option_entry_record(array('id' => $record['id'])); $text .= " {$dhcp['display_name']} => {$dhcp['value']}\n"; } // Display associated tags list($status, $rows, $records) = db_get_records($onadb, 'tags', array('type' => 'subnet', 'reference' => $subnet['id'])); if ($rows) { $text .= "\nASSOCIATED TAG RECORDS ({$rows}):\n"; } foreach ($records as $record) { $text .= " {$record['name']}\n"; } // Display associated custom attributes list($status, $rows, $records) = db_get_records($onadb, 'custom_attributes', array('table_name_ref' => 'subnets', 'table_id_ref' => $subnet['id'])); if ($rows) { $text .= "\nASSOCIATED CUSTOM ATTRIBUTE RECORDS ({$rows}):\n"; } foreach ($records as $record) { list($status, $rows, $ca) = ona_get_custom_attribute_record(array('id' => $record['id'])); $text .= " {$ca['name']} => {$ca['value']}\n"; } // Display associated host / interface records that would be deleted // BUSINESS RULE: We delete hosts that have only one interface (and it's on this subnet) // BUSINESS RULE: We delete interfaces from hosts that have multiple interfaces (including at least one on a different subnet) list($status, $rows, $interfaces) = db_get_records($onadb, 'interfaces', array('subnet_id' => $subnet['id'])); $hosts_to_delete = array(); $interfaces_to_delete = array(); foreach ($interfaces as $interface) { // Select all interfaces for the associated host where the subnet ID is not our subnet ID $where = "host_id = {$interface['host_id']} AND subnet_id != {$subnet['id']}"; list($status, $rows, $tmp) = db_get_records($onadb, 'interfaces', $where, '', 0); // We'll delete hosts that have only one interface (i.e. no interfaces on any other subnets) if ($rows == 0) { array_push($hosts_to_delete, $interface['host_id']); } else { array_push($interfaces_to_delete, $interface['id']); } } unset($interfaces); // make sure we only have one reference for each host and interface $interfaces_to_delete = array_unique($interfaces_to_delete); $hosts_to_delete = array_unique($hosts_to_delete); // Display interfaces we would have deleted $rows = count($interfaces_to_delete); if ($rows) { $text .= "\n----- ASSOCIATED HOST INTERFACE RECORDS ({$rows}) -----\n"; } foreach ($interfaces_to_delete as $interface_id) { list($status, $output) = run_module('interface_del', array('interface' => $interface_id), false); $output = preg_replace('/^(.*)?\\n(.*)?\\n/', '', $output); $text .= $output; } // Display hosts we would have deleted $rows = count($hosts_to_delete); if ($rows) { $text .= "\n-----ASSOCIATED HOSTS ({$rows}) -----\n"; } foreach ($hosts_to_delete as $host_id) { list($status, $output) = run_module('host_del', array('host' => $host_id), false); $output = preg_replace('/^(.*)?\\n(.*)?\\n/', '', $output); $text .= $output; } return array(7, $text); }
function ws_editor($window_name, $form = '') { global $conf, $self, $onadb; global $font_family, $color, $style, $images; $window = array(); // Check permissions if (!auth('custom_attribute_del')) { $response = new xajaxResponse(); $response->addScript("alert('Permission denied!');"); return $response->getXML(); } // If an array in a string was provided, build the array and store it in $form $form = parse_options_string($form); // If $form is a number, it's a record id- so we transform $form into an array if ($form['id']) { list($status, $rows, $ca) = ona_get_custom_attribute_record(array('id' => $form['id'])); $window['title'] = "Edit Custom Attribute"; } else { $window['title'] = "Add Custom Attribute"; } // Load the subnet record and associated info. if (is_numeric($form['subnet_id'])) { list($status, $rows, $subnet) = ona_get_subnet_record(array('id' => $form['subnet_id'])); // Setup a title description for this edit type $window['edit_type'] = "Subnet"; $window['edit_type_value'] = $subnet['name']; } // If they are adding a new CA entry they will usually pass a host_id in if (is_numeric($form['host_id'])) { list($status, $rows, $host) = ona_find_host($form['host_id']); // Setup a title description for this edit type $window['edit_type'] = "Host"; $window['edit_type_value'] = $host['fqdn']; } if (is_numeric($form['vlan_id'])) { list($status, $rows, $vlan) = ona_find_vlan($form['vlan_id']); // Setup a title description for this edit type $window['edit_type'] = "Vlan"; $window['edit_type_value'] = $vlan['name']; } // Escape data for display in html foreach (array_keys((array) $subnet) as $key) { $subnet[$key] = htmlentities($subnet[$key], ENT_QUOTES, $conf['php_charset']); } foreach (array_keys((array) $host) as $key) { $host[$key] = htmlentities($host[$key], ENT_QUOTES, $conf['php_charset']); } // Build dhcp option list list($status, $rows, $catypes) = db_get_records($onadb, 'custom_attribute_types', 'id >= 1', 'name'); $ca_type_list = ''; foreach ($catypes as $record) { $selected = ""; if ($record['id'] == $ca['custom_attribute_type_id']) { $selected = "SELECTED=\"selected\""; } if ($record['id']) { $ca_type_list .= "<option {$selected} value=\"{$record['id']}\">{$record['name']}</option>\n"; } } // Javascript to run after the window is built $window['js'] = <<<EOL /* Put a minimize icon in the title bar */ el('{$window_name}_title_r').innerHTML = ' <a onClick="toggle_window(\\'{$window_name}\\');" title="Minimize window" style="cursor: pointer;"><img src="{$images}/icon_minimize.gif" border="0" /></a>' + el('{$window_name}_title_r').innerHTML; /* Put a help icon in the title bar */ el('{$window_name}_title_r').innerHTML = ' <a href="{$_ENV['help_url']}{$window_name}" target="null" title="Help" style="cursor: pointer;"><img src="{$images}/silk/help.png" border="0" /></a>' + el('{$window_name}_title_r').innerHTML; el('{$window_name}_form').onsubmit = function() { return false; }; EOL; // Define the window's inner html $window['html'] = <<<EOL <!-- Custom Attribute Edit Form --> <form id="{$window_name}_form" onSubmit="return false;"> <input type="hidden" name="host" value="{$host['id']}"> <input type="hidden" name="subnet" value="{$subnet['id']}"> <input type="hidden" name="vlan" value="{$vlan['id']}"> <input type="hidden" name="id" value="{$ca['id']}"> <input type="hidden" name="js" value="{$form['js']}"> <table cellspacing="0" border="0" cellpadding="0" style="background-color: {$color['window_content_bg']}; padding-left: 20px; padding-right: 20px; padding-top: 5px; padding-bottom: 5px;"> <!-- Custom Attribute RECORD --> <tr> <td align="left" nowrap="true"><b><u>CA Record</u></b> </td> <td class="padding" align="left" width="100%"> </td> </tr> <tr> <td align="right" nowrap="true"> {$window['edit_type']}: </td> <td class="padding" align="left" width="100%"> {$window['edit_type_value']} </td> </tr> <tr> <td class="input_required" align="right" nowrap="true"> Type </td> <td class="padding" align="left" width="100%"> <select id="type" name="type" class="edit" accesskey="t"> {$ca_type_list} </select> </td> </tr> <tr> <td class="input_required" align="right" nowrap="true"> Value </td> <td class="padding" align="left" width="100%"> <textarea name="value" alt="Value" class="edit" rows="5" cols="25" >{$ca['value']}</textarea> </td> </tr> <tr> <td align="right" valign="top" nowrap="true"> </td> <td class="padding" align="right" width="100%"> <input type="hidden" name="overwrite" value="{$overwrite}"> <input class="edit" type="button" name="cancel" value="Cancel" onClick="removeElement('{$window_name}');"> <input class="edit" type="button" name="submit" value="Save" accesskey=" " onClick="xajax_window_submit('{$window_name}', xajax.getFormValues('{$window_name}_form'), 'save');" > </td> </tr> </table> </form> EOL; return window_open($window_name, $window); }