function ona_find_subnet_type($search = "") { global $self; // Validate input if ($search == "") { $self['error'] = "ERROR => No search string for subnet-type 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_subnet_type_record(array($field => $search)); // If we got it, return it if ($status == 0 and $rows == 1) { printmsg("DEBUG => ona_find_subnet_type() found device record by {$field}", 2); return array($status, $rows, $record); } } // It's a string - do several sql queries and see if we can get a unique match list($status, $rows, $record) = ona_get_subnet_type_record(array('display_name' => $search)); if ($status == 0 and $rows == 1) { printmsg("DEBUG => ona_find_subnet_type() found subnet_type record by its name", 2); return array(0, $rows, $record); } list($status, $rows, $record) = ona_get_subnet_type_record(array('short_name' => $search)); if ($status == 0 and $rows == 1) { printmsg("DEBUG => ona_find_subnet_type() found subnet_type record by its 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 => Subnet-type not found"; printmsg($self['error'], 2); return array(2, 0, array()); }
function get_subnet_html($subnet_ip) { global $conf, $self, $onadb; global $font_family, $color, $style, $images; $html = $js = ''; $font_color = '#FFFFFF'; $style['content_box'] = <<<EOL margin: 10px 20px; padding: 2px 4px; background-color: #FFFFFF; vertical-align: top; EOL; $style['label_box'] = <<<EOL font-weight: bold; padding: 2px 4px; border: solid 1px {$color['border']}; background-color: {$color['window_content_bg']}; EOL; // Load the subnet record list($status, $rows, $subnet) = ona_find_subnet($subnet_ip); // If we didn't get one, tell them to add a record here if ($rows == 0 or $status) { // Calculate what the end of this block is so we can reccomend the max subnet size // GD: add IPv6 functionnality by imposing GMP use when not ipv4 subnet list($status, $rows, $subnets) = db_get_records($onadb, "subnets", "ip_addr > " . ip_mangle($subnet_ip, 'numeric'), "ip_addr", 1); if (!is_ipv4($subnet_ip)) { if ($rows >= 1) { $subnet_ip_end = gmp_sub(gmp_init($subnets[0]['ip_addr']), 1); $size = gmp_add(gmp_sub($subnet_ip_end, $subnet_ip), 1); if (gmp_mod($size, 2) == 1) { gmp_sub($size, 1); } // GD: very bad way to get the mask ... but gmp_log() does not exist ! for ($mask = 65; $mask > 48; $mask--) { if (gmp_cmp($size, gmp_pow("2", $mask)) > 0) { $mask++; break; } } $subnet['ip_addr'] = ip_mangle(gmp_strval($subnet_ip), 'dotted'); $subnet['ip_addr_end'] = ip_mangle(gmp_strval($subnet_ip_end), 'dotted'); $str_subnet_ip = gmp_strval($subnet_ip); $size = gmp_strval($size); } else { $subnet_ip_end = -1; $size = 0; } } else { if ($rows >= 1) { $subnet_ip_end = $subnets[0]['ip_addr'] - 1; $size = $subnet_ip_end - $subnet_ip + 1; if ($size % 2 == 1) { $size--; } $mask = ceil(32 - log($size) / log(2)); $subnet['ip_addr'] = ip_mangle($subnet_ip, 'dotted'); $subnet['ip_addr_end'] = ip_mangle($subnet_ip_end, 'dotted'); $str_subnet_ip = $subnet_ip; } else { $subnet_ip_end = -1; $size = 0; } } $html .= <<<EOL <!-- NO SUBNET --> <table cellspacing="0" border="0" cellpadding="0"> <!-- LABEL --> <tr><td width=100% colspan="2" nowrap="true" style="{$style['label_box']}"> <a title="Add a new subnet here" class="act" onClick="xajax_window_submit('edit_subnet', 'ip_addr=>{$str_subnet_ip}', 'editor');" >Add a subnet here</a> </td></tr> <tr> <td align="right" nowrap="true" style="color: {$font_color};"><b>IP Range</b> </td> <td class="padding" nowrap="true" align="left" style="color: {$font_color};">{$subnet['ip_addr']} - {$subnet['ip_addr_end']} ({$size} addresses)</td> </tr> EOL; $largest_subnet = array(0, 0, 0); // -- IPv4 if (is_ipv4($subnet_ip)) { $ip = $subnet_ip; while ($ip < $subnet_ip_end) { // find the largest mask for the specified ip $myip = ip_mangle($ip, 'dotted'); $mymask = $mask; while ($mymask <= 30) { $ip1 = ip_mangle($ip, 'binary'); $ip2 = str_pad(substr($ip1, 0, $mymask), 32, '0'); $mysize = pow(2, 32 - $mymask); $myhosts = $mysize - 2; $ip1 = ip_mangle($ip1, 'dotted'); $ip2 = ip_mangle($ip2, 'dotted'); if ($ip1 == $ip2 and $ip + $mysize - 1 <= $subnet_ip_end) { break; } $mymask++; } if ($mymask == 31) { break; } if ($mysize > $largest_subnet[2]) { $largest_subnet = array(ip_mangle($ip, 'dotted'), $mymask, $mysize); } $html .= <<<EOL <!-- <tr> <td align="right" nowrap="true" style="color: {$font_color};"> </td> <td class="padding" align="left" style="color: {$font_color};">{$myip} /{$mymask} ({$myhosts} hosts)</td> </tr> --> EOL; // Increment $ip $ip += $mysize; } // remove 2 for gateway and broadcast $largest_subnet[2] = $largest_subnet[2] - 2; } else { $ip = gmp_init($subnet_ip); // GD: trying to avoid falling into time/memory-trap // Won't enter in the loop if difference between IP and next subnet IP is too big // (more than 5 x /64) if (gmp_cmp(gmp_sub($subnet_ip_end, $ip), gmp_mul("18446744073709551616", "5")) > 0) { $html .= <<<EOL \t<tr> \t<td align="right" nowrap="true" style="color: {$font_color};"> </td> \t<td align="right" nowrap="true" style="color: {$font_color};">Next Subnet too far away</td> \t<tr> EOL; return array($html, $js); } while (gmp_cmp($ip, $subnet_ip_end) < 0) { // find the largest mask for the specified ip $myip = ip_mangle(gmp_strval($ip), 'dotted'); $mymask = $mask; while ($mymask <= 64) { $ip1 = ip_mangle(gmp_strval($ip), 'bin128'); $ip2 = str_pad(substr($ip1, 0, $mymask), 128, '0'); $mysize = gmp_pow("2", 128 - $mymask); $myhosts = gmp_strval(gmp_sub($mysize, 2)); $ip1 = ip_mangle($ip1, 'dotted'); $ip2 = ip_mangle($ip2, 'dotted'); if (strcmp($ip1, $ip2) == 0 and gmp_cmp(gmp_sub(gmp_add($ip, $mysize), 1), $subnet_ip_end) <= 0) { break; } $mymask++; } if ($mymask == 90) { break; } if (gmp_cmp($mysize, $largest_subnet[2]) > 0) { $largest_subnet = array(ip_mangle(gmp_strval($ip), 'dotted'), $mymask, $mysize); } $html .= <<<EOL <!-- <tr> <td align="right" nowrap="true" style="color: {$font_color};"> </td> <td class="padding" align="left" style="color: {$font_color};">{$mask} {$myip} /{$mymask} ({$myhosts} hosts)td> </tr> --> EOL; // Increment $ip $ip = gmp_add($ip, $mysize); } // DON'T remove 2 for gateway and broadcast $largest_subnet[2] = gmp_strval($largest_subnet[2]); } $html .= <<<EOL <tr> <td align="right" nowrap="true" style="color: {$font_color};"><b>Largest block</b> </td> <td class="padding" nowrap="true" align="left" style="color: {$font_color};">{$largest_subnet[0]} /{$largest_subnet[1]} ({$largest_subnet[2]} usable hosts)</td> </tr> </table> EOL; return array($html, $js); } // -- // -- FOUND SUBNET IN DB // -- // Convert IP and Netmask to a presentable format $subnet['ip_addr'] = ip_mangle($subnet['ip_addr'], 'dotted'); $subnet['ip_mask'] = ip_mangle($subnet['ip_mask'], 'dotted'); $subnet['ip_mask_cidr'] = ip_mangle($subnet['ip_mask'], 'cidr'); list($status, $rows, $type) = ona_get_subnet_type_record(array('id' => $subnet['subnet_type_id'])); $subnet['type'] = $type['display_name']; // Calculate the percentage of the subnet that's used (total size - allocated hosts - dhcp pool size) $usage_html = get_subnet_usage_html($subnet['id']); foreach (array_keys((array) $subnet) as $key) { $subnet[$key] = htmlentities($subnet[$key], ENT_QUOTES, $conf['php_charset']); } foreach (array_keys((array) $location) as $key) { $location[$key] = htmlentities($location[$key], ENT_QUOTES, $conf['php_charset']); } $html .= <<<EOL <!-- SUBNET INFORMATION --> <table cellspacing="0" border="0" cellpadding="0"> <!-- LABEL --> <tr><td width=100% colspan="2" nowrap="true" style="{$style['label_box']}"> <a title="View subnet. ID: {$subnet['id']}" class="nav" onClick="xajax_window_submit('work_space', 'xajax_window_submit(\\'display_subnet\\', \\'subnet_id=>{$subnet['id']}\\', \\'display\\')');" >{$subnet['name']}</a> </td></tr> <tr> <td align="right" nowrap="true" style="color: {$font_color};"><b>IP Address</b> </td> <td class="padding" align="left" style="color: {$font_color};">{$subnet['ip_addr']} /{$subnet['ip_mask_cidr']}</td> </tr> <tr> <td align="right" nowrap="true" style="color: {$font_color};"><b>Usage</b> </td> <td class="padding" align="left" style="color: {$font_color};">{$usage_html}</td> </tr> EOL; if ($subnet['type']) { $html .= <<<EOL <tr> <td align="right" nowrap="true" style="color: {$font_color};"><b>Type</b> </td> <td class="padding" align="left" style="color: {$font_color};">{$subnet['type']} </td> </tr> EOL; } $html .= <<<EOL </table> EOL; return array($html, $js); }
function ws_display_list($window_name, $form = '') { global $conf, $self, $onadb; global $images, $color, $style; $html = ''; $js = ''; // If the user supplied an array in a string, build the array and store it in $form $form = parse_options_string($form); // Find the "tab" we're on $tab = $_SESSION['ona'][$form['form_id']]['tab']; // Build js to refresh this list $refresh = "xajax_window_submit('{$window_name}', xajax.getFormValues('{$form['form_id']}'), 'display_list');"; // If it's not a new query, load the previous query from the session // into $form and save the current page and filter in the session. // Also find/set the "page" we're viewing $page = 1; if ($form['page'] and is_numeric($form['page'])) { $form = array_merge($form, (array) $_SESSION['ona'][$form['form_id']][$tab]['q']); $_SESSION['ona'][$form['form_id']][$tab]['page'] = $page = $form['page']; $_SESSION['ona'][$form['form_id']][$tab]['filter'] = $form['filter']; } printmsg("DEBUG => Displaying subnets list page: {$page}", 1); // Calculate the SQL query offset (based on the page being displayed) $offset = $conf['search_results_per_page'] * ($page - 1); if ($offset == 0) { $offset = -1; } // Search results go in here $results = array(); $count = 0; // // *** ADVANCED SUBNET SEARCH *** // FIND RESULT SET // // Start building the "where" clause for the sql query to find the subnets to display $where = ""; $and = ""; // enable or disable wildcards $wildcard = '%'; if ($form['nowildcard']) { $wildcard = ''; } // DISPLAY ALL if ($form['all_flag']) { $where .= $and . "id > 0"; $and = " AND "; } // SUBNET ID if ($form['subnet_id']) { $where .= $and . "id = " . $form['subnet_id']; $and = " AND "; } // VLAN ID if ($form['vlan_id']) { $where .= $and . "vlan_id = " . $onadb->qstr($form['vlan_id']); $and = " AND "; } // SUBNET TYPE if ($form['nettype']) { $where .= $and . "subnet_type_id = " . $onadb->qstr($form['nettype']); $and = " AND "; } // find subnets that are associated with dhcp server if ($form['server_id']) { $where .= $and . "id IN (SELECT subnet_id FROM dhcp_server_subnets WHERE host_id = " . $onadb->qstr($form['server_id']) . ')'; $and = " AND "; } // SUBNET NAME if ($form['subnetname']) { // This field is always upper case $form['subnetname'] = strtoupper($form['subnetname']); $where .= $and . "name LIKE " . $onadb->qstr($wildcard . $form['subnetname'] . $wildcard); $and = " AND "; } // IP ADDRESS if ($form['ip_subnet']) { // Build $ip and $ip_end from $form['ip_subnet'] and $form['ip_subnet_thru'] $ip = ip_complete($form['ip_subnet'], '0'); if ($form['ip_subnet_thru']) { $ip = ip_complete($form['ip_subnet'], '0'); $ip_end = ip_complete($form['ip_subnet_thru'], '255'); // Find out if $ip and $ip_end are valid $ip = ip_mangle($ip, 'numeric'); $ip_end = ip_mangle($ip_end, 'numeric'); if ($ip != -1 and $ip_end != -1) { // Find subnets between the specified ranges $where .= $and . " ip_addr >= " . $ip . " AND ip_addr <= " . $ip_end; $and = " AND "; } } else { list($status, $rows, $record) = ona_find_subnet($ip); if ($rows) { $where .= $and . " id = " . $record['id']; $and = " AND "; } } } // tag if ($form['tag_net']) { $where .= $and . "id in (select reference from tags where type like 'subnet' and name like " . $onadb->qstr($form['tag_net']) . ")"; $and = " AND "; } // custom attribute type if ($form['custom_attribute_type_net']) { $where .= $and . "id in (select table_id_ref from custom_attributes where table_name_ref like 'subnets' and custom_attribute_type_id = (SELECT id FROM custom_attribute_types WHERE name = " . $onadb->qstr($form['custom_attribute_type_net']) . "))"; $and = " AND "; $cavaluetype = "and custom_attribute_type_id = (SELECT id FROM custom_attribute_types WHERE name = " . $onadb->qstr($form['custom_attribute_type_net']) . ")"; } // custom attribute value if ($form['ca_value_net']) { $where .= $and . "id in (select table_id_ref from custom_attributes where table_name_ref like 'subnets' {$cavaluetype} and value like " . $onadb->qstr($wildcard . $form['ca_value_net'] . $wildcard) . ")"; $and = " AND "; } // display a nice message when we dont find all the records if ($where == '' and $form['content_id'] == 'search_results_list') { $js .= "el('search_results_msg').innerHTML = 'Unable to find subnets matching your query, showing all records';"; } // Wild card .. if $where is still empty, add a 'ID > 0' to it so you see everything. if ($where == '') { $where = 'id > 0'; } // Do the SQL Query $filter = ''; if ($form['filter']) { // Subnet namess are always upper case $form['filter'] = strtoupper($form['filter']); $filter = ' AND name LIKE ' . $onadb->qstr('%' . $form['filter'] . '%'); } list($status, $rows, $results) = db_get_records($onadb, 'subnets', $where . $filter, "ip_addr", $conf['search_results_per_page'], $offset); // If we got less than search_results_per_page, add the current offset to it // so that if we're on the last page $rows still has the right number in it. if ($rows > 0 and $rows < $conf['search_results_per_page']) { $rows += $conf['search_results_per_page'] * ($page - 1); } else { if ($rows >= $conf['search_results_per_page']) { list($status, $rows, $records) = db_get_records($onadb, 'subnets', $where . $filter, "", 0); } } $count = $rows; // // *** BUILD HTML LIST *** // $html .= <<<EOL <!-- Subnet Results --> <table id="{$form['form_id']}_subnet_list" class="list-box" cellspacing="0" border="0" cellpadding="0"> <!-- Table Header --> <tr> <td class="list-header" align="center" style="{$style['borderR']};">Name</td> <td class="list-header" align="center" style="{$style['borderR']};">Subnet</td> <td class="list-header" align="center" style="{$style['borderR']};">Usage</td> <td class="list-header" align="center" style="{$style['borderR']};">Type</td> <td class="list-header" align="center"> </td> </tr> EOL; // Loop and display each record foreach ($results as $record) { // Get additional info about eash subnet record // // Convert IP and Netmask to a presentable format $record['ip_addr'] = ip_mangle($record['ip_addr'], 'dotted'); $record['ip_mask'] = ip_mangle($record['ip_mask'], 'dotted'); $record['IP_SUBNET_MASK_CIDR'] = ip_mangle($record['ip_mask'], 'cidr'); list($status, $rows, $type) = ona_get_subnet_type_record(array('id' => $record['subnet_type_id'])); $record['type'] = $type['display_name']; // Calculate the percentage of the subnet that's used (total size - allocated hosts - dhcp pool size) $usage_html = get_subnet_usage_html($record['id']); // Escape data for display in html foreach (array_keys($record) as $key) { $record[$key] = htmlentities($record[$key], ENT_QUOTES, $conf['php_charset']); } $primary_object_js = "xajax_window_submit('work_space', 'xajax_window_submit(\\'display_subnet\\', \\'subnet_id=>{$record['id']}\\', \\'display\\')');"; $html .= <<<EOL <tr onMouseOver="this.className='row-highlight'" onMouseOut="this.className='row-normal'"> <td class="list-row"> <a title="View subnet. ID: {$record['id']}" class="nav" onClick="{$primary_object_js}" >{$record['name']}</a> </td> <td class="list-row" align="left"> {$record['ip_addr']} <span title="{$record['ip_mask']}">/{$record['IP_SUBNET_MASK_CIDR']}</span> </td> <td class="list-row" align="center" style="vertical-align: middle;"> {$usage_html} </td> <td class="list-row" align="left"> {$record['type']} </td> <td class="list-row" align="right"> <form id="{$form['form_id']}_list_subnet_{$record['id']}" ><input type="hidden" name="subnet_id" value="{$record['id']}" ><input type="hidden" name="js" value="{$refresh}" ></form> <a title="Display subnet map" class="act" onClick="xajax_window_submit('work_space', 'xajax_window_submit(\\'display_block_map\\', \\'ip_block_start=>{$record['ip_addr']}\\', \\'display\\');');" ><img src="{$images}/silk/shape_align_left.png" border="0"></a> EOL; if (auth('subnet_modify')) { $html .= <<<EOL <a title="Edit subnet" class="act" onClick="xajax_window_submit('edit_subnet', xajax.getFormValues('{$form['form_id']}_list_subnet_{$record['id']}'), 'editor');" ><img src="{$images}/silk/page_edit.png" border="0"></a> EOL; } if (auth('subnet_del')) { $html .= <<<EOL <a title="Delete subnet" class="act" onClick="var doit=confirm('Are you sure you want to delete this subnet?'); if (doit == true) xajax_window_submit('edit_subnet', xajax.getFormValues('{$form['form_id']}_list_subnet_{$record['id']}'), 'delete');" ><img src="{$images}/silk/delete.png" border="0"></a> EOL; } $html .= <<<EOL </td> </tr> EOL; } $html .= <<<EOL </table> EOL; // Build page links if there are any $html .= get_page_links($page, $conf['search_results_per_page'], $count, $window_name, $form['form_id']); // If there was only 1 result, and we're about to display results in the "Search Results" window, display it. if ($count == 1 and $form['content_id'] == 'search_results_list' and $form['filter'] == '') { $js .= $primary_object_js; } // Insert the new html into the content div specified // Instantiate the xajaxResponse object $response = new xajaxResponse(); $response->addAssign("{$form['form_id']}_{$tab}_count", "innerHTML", "({$count})"); $response->addAssign($form['content_id'], "innerHTML", $html); if ($js) { $response->addScript($js); } return $response->getXML(); }
function ws_display_list($window_name, $form = '') { global $conf, $self, $onadb; global $images, $color, $style; $html = ''; $js = ''; $debug_val = 3; // used in the auth() calls to supress logging // If the user supplied an array in a string, build the array and store it in $form $form = parse_options_string($form); // Find the "tab" we're on $tab = $_SESSION['ona'][$form['form_id']]['tab']; // Build js to refresh this list $refresh = "xajax_window_submit('{$window_name}', xajax.getFormValues('{$form['form_id']}'), 'display_list');"; // If it's not a new query, load the previous query from the session // into $form and save the current page and filter in the session. // Also find/set the "page" we're viewing $page = 1; if ($form['page'] and is_numeric($form['page'])) { $form = array_merge($form, (array) $_SESSION['ona'][$form['form_id']][$tab]['q']); $_SESSION['ona'][$form['form_id']][$tab]['page'] = $page = $form['page']; $_SESSION['ona'][$form['form_id']][$tab]['filter'] = $form['filter']; } // Calculate the SQL query offset (based on the page being displayed) $offset = $conf['search_results_per_page'] * ($page - 1); if ($offset == 0) { $offset = -1; } // Search results go in here $results = array(); $count = 0; // // FIND RESULT SET // // Start building the "where" clause for the sql query to find the subnets to display $where = ""; $and = ""; // SERVER ID if ($form['server_id']) { $where .= $and . 'id IN (SELECT subnet_id FROM dhcp_server_subnets WHERE host_id = ' . $onadb->qstr($form['server_id']) . ' UNION SELECT subnet_id FROM dhcp_pools WHERE dhcp_failover_group_id IN (SELECT id FROM dhcp_failover_groups WHERE primary_server_id = ' . $onadb->qstr($form['server_id']) . ' OR secondary_server_id = ' . $onadb->qstr($form['server_id']) . '))'; $and = " AND "; } // Do the SQL Query $filter = ''; if ($form['filter']) { // Subnet descriptions are always upper case $form['filter'] = strtoupper($form['filter']); $filter = $and . ' name LIKE ' . $onadb->qstr('%' . $form['filter'] . '%'); } list($status, $rows, $results) = db_get_records($onadb, 'subnets', $where . $filter, 'ip_addr', $conf['search_results_per_page'], $offset); // If we got less than serach_results_per_page, add the current offset to it // so that if we're on the last page $rows still has the right number in it. if ($rows > 0 and $rows < $conf['search_results_per_page']) { $rows += $conf['search_results_per_page'] * ($page - 1); } else { if ($rows >= $conf['search_results_per_page']) { list($status, $rows, $records) = db_get_records($onadb, 'subnets', $where . $filter, "", 0); } } $count = $rows; // // *** BUILD HTML LIST *** // $html .= <<<EOL <!-- Subnet Results --> <table id="{$form['form_id']}_dhcp_server_list" class="list-box" cellspacing="0" border="0" cellpadding="0"> <!-- Table Header --> <tr> <td class="list-header" align="center" style="{$style['borderR']};">Name</td> <td class="list-header" align="center" style="{$style['borderR']};">Subnet</td> <td class="list-header" align="center" style="{$style['borderR']};">Usage</td> <td class="list-header" align="center" style="{$style['borderR']};">Type</td> <td class="list-header" align="center"> </td> </tr> EOL; // Loop and display each record foreach ($results as $record) { // Get additional info about eash subnet record // // Convert IP and Netmask to a presentable format $record['ip_addr'] = ip_mangle($record['ip_addr'], 'dotted'); $record['ip_mask'] = ip_mangle($record['ip_mask'], 'dotted'); $record['ip_mask_cidr'] = ip_mangle($record['ip_mask'], 'cidr'); list($status, $rows, $type) = ona_get_subnet_type_record(array('id' => $record['subnet_type_id'])); $record['type'] = $type['display_name']; // Calculate the percentage of the subnet that's used (total size - allocated hosts - dhcp pool size) $usage_html = get_subnet_usage_html($record['id']); // Escape data for display in html foreach (array_keys($record) as $key) { $record[$key] = htmlentities($record[$key], ENT_QUOTES, $conf['php_charset']); } $primary_object_js = "xajax_window_submit('work_space', 'xajax_window_submit(\\'display_subnet\\', \\'subnet_id=>{$record['id']}\\', \\'display\\')');"; $html .= <<<EOL <tr onMouseOver="this.className='row-highlight'" onMouseOut="this.className='row-normal'"> <td class="list-row"> <a title="View subnet. ID: {$record['id']}" class="nav" onClick="{$primary_object_js}" >{$record['name']}</a> </td> <td class="list-row" align="left"> {$record['ip_addr']} <span title="{$record['ip_mask']}">/{$record['ip_mask_cidr']}</span> </td> <td class="list-row" align="center" style="vertical-align: middle;"> {$usage_html} </td> <td class="list-row" align="right"> {$record['type']} </td> <td class="list-row" align="right"> <form id="{$form['form_id']}_list_dhcp_server_{$record['id']}" ><input type="hidden" name="subnet_id" value="{$record['id']}" ><input type="hidden" name="server_id" value="{$form['server_id']}" ><input type="hidden" name="js" value="{$refresh}" ></form> <a title="Display subnet map" class="act" onClick="xajax_window_submit('work_space', 'xajax_window_submit(\\'display_block_map\\', \\'ip_block_start=>{$record['ip_addr']}\\', \\'display\\');');" ><img src="{$images}/silk/shape_align_left.png" border="0"></a> EOL; if (auth('subnet_modify', $debug_val)) { $html .= <<<EOL <a title="Edit subnet" class="act" onClick="xajax_window_submit('edit_subnet', xajax.getFormValues('{$form['form_id']}_list_dhcp_server_{$record['id']}'), 'editor');" ><img src="{$images}/silk/page_edit.png" border="0"></a> EOL; } // check if the subnet listed is from a failover group or an actual dhcp server subnet assignment list($dhcpsubnetstatus, $dhcpsubnetrows, $dhcpserver) = ona_get_dhcp_server_subnet_record(array('subnet_id' => $record['id'], 'host_id' => $form['server_id'])); if (auth('subnet_del', $debug_val) && $dhcpsubnetrows == 1) { $html .= <<<EOL <a title="Remove subnet association with server." class="act" onClick="var doit=confirm('Are you sure you want to remove this subnet from this DHCP server?'); if (doit == true) xajax_window_submit('edit_dhcp_server', xajax.getFormValues('{$form['form_id']}_list_dhcp_server_{$record['id']}'), 'delete');" ><img src="{$images}/silk/page_delete.png" border="0"></a> EOL; } else { $html .= <<<EOL <span title="You must change the failover group assignment on the pool to remove this entry."><img src="{$images}/silk/comment.png" border="0"></span> EOL; } $html .= <<<EOL </td> </tr> EOL; } $html .= <<<EOL </table> EOL; // Build page links if there are any $html .= get_page_links($page, $conf['search_results_per_page'], $count, $window_name, $form['form_id']); // If there was only 1 result, and we're about to display results in the "Search Results" window, display it. if ($count == 1 and $form['content_id'] == 'search_results_list' and $form['filter'] == '') { $js .= $primary_object_js; } // Insert the new html into the content div specified // Instantiate the xajaxResponse object $response = new xajaxResponse(); $response->addAssign("{$form['form_id']}_{$tab}_count", "innerHTML", "({$count})"); $response->addAssign($form['content_id'], "innerHTML", $html); if ($js) { $response->addScript($js); } return $response->getXML(); }
function subnet_display($options = "") { global $conf, $self, $onadb; printmsg('DEBUG => subnet_display(' . $options . ') called', 3); $text_array = array(); // Version - UPDATE on every edit! $version = '1.03'; // Parse incoming options string to an array $options = parse_options($options); // 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_display-v{$version} Displays an subnet record from the database Synopsis: subnet_display [KEY=VALUE] ... Required: subnet=[ID|IP] display subnet by search string Optional: verbose=[yes|no] display additional info (yes) Notes: * An error is returned if search string returns more than one subnet * IP can be in dotted, numeric, or IPv6 format EOM ); } // Sanitize "options[verbose]" (yes is the default) $options['verbose'] = sanitize_YN($options['verbose'], 'Y'); // They provided a subnet ID or IP address // Find a subnet record 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"); } // Gather sizing list($percent, $total_used, $size) = get_subnet_usage($subnet['id']); $subnet['total_allocated_percent'] = $percent; $subnet['total_allocated'] = $total_used; $subnet['total_available'] = $size; // get subnet type name list($status, $rows, $sntype) = ona_get_subnet_type_record(array('id' => $subnet['subnet_type_id'])); $subnet['subnet_type_name'] = $sntype['display_name']; // Convert some data $text_array = $subnet; $text_array['ip_addr_text'] = ip_mangle($subnet['ip_addr'], 'dotted'); $text_array['ip_mask_text'] = ip_mangle($subnet['ip_mask'], 'dotted'); $text_array['ip_mask_cidr'] = ip_mangle($subnet['ip_mask'], 'cidr'); // Build text to return $text = "SUBNET RECORD\n"; $text .= format_array($subnet); // If 'verbose' is enabled, grab some additional info to display if ($options['verbose'] == 'Y') { // Tag records list($status, $rows, $tags) = db_get_records($onadb, 'tags', array('type' => 'subnet', 'reference' => $subnet['id'])); if ($rows) { $text .= "\nASSOCIATED TAG RECORDS\n"; foreach ($tags as $tag) { $text_array['tags'][] = $tag['name']; $text .= " {$tag['name']}\n"; } } // VLAN record list($status, $rows, $vlan) = ona_get_vlan_record(array('id' => $subnet['vlan_id'])); if ($rows) { $text_array['vlan'] = $vlan; $text .= "\nASSOCIATED VLAN RECORD\n"; $text .= format_array($vlan); } } // cleanup some un-used junk unset($text_array['network_role_id']); unset($text_array['vlan_id']); // 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 ws_display($window_name, $form = '') { global $conf, $self, $onadb; global $images, $color, $style; $html = ''; $js = ''; $debug_val = 3; // used in the auth() calls to supress logging // If the user supplied an array in a string, build the array and store it in $form $form = parse_options_string($form); // Load the subnet record if ($form['subnet_id']) { list($status, $rows, $record) = ona_get_subnet_record(array('id' => $form['subnet_id'])); } else { if ($form['ip']) { list($status, $rows, $record) = ona_get_subnet_record("ip_addr like '" . ip_mangle($form['ip'], 'numeric') . "'"); } else { if ($form['subnet']) { list($status, $rows, $record) = ona_get_subnet_record(array('name' => $form['subnet'])); } } } if ($status or !$rows) { array_pop($_SESSION['ona']['work_space']['history']); $html .= "<br><center><font color=\"red\"><b>Subnet doesn't exist!</b></font></center>"; $response = new xajaxResponse(); $response->addAssign("work_space_content", "innerHTML", $html); return $response->getXML(); } // Update History Title $history = array_pop($_SESSION['ona']['work_space']['history']); $js .= "xajax_window_submit('work_space', ' ', 'rewrite_history');"; if ($history['title'] == $window_name) { $history['title'] = $record['name']; array_push($_SESSION['ona']['work_space']['history'], $history); } // Create some javascript to refresh the current page $refresh = htmlentities(str_replace(array("'", '"'), array("\\'", '\\"'), $history['url']), ENT_QUOTES, $conf['php_charset']); $refresh = "xajax_window_submit('work_space', '{$refresh}');"; // is this an ipv6 subnet? if (strlen($record['ip_addr']) > 11) { $extravars['isipv6'] = TRUE; } // Convert IP and Netmask to a presentable format $record['ip_addr'] = ip_mangle($record['ip_addr'], 'dotted'); $record['ip_mask'] = ip_mangle($record['ip_mask'], 'dotted'); $record['ip_subnet_mask_cidr'] = ip_mangle($record['ip_mask'], 'cidr'); list($status, $rows, $type) = ona_get_subnet_type_record(array('id' => $record['subnet_type_id'])); $record['type'] = $type['display_name']; // Vlan Record list($status, $rows, $vlan) = ona_get_vlan_record(array('id' => $record['vlan_id'])); $record['vlan_name'] = $vlan['name']; $record['vlan_campus_id'] = $vlan['vlan_campus_id']; $record['vlan_campus_name'] = $vlan['vlan_campus_name']; // extra stuff to pass to ws_plugins $extravars['refresh'] = $refresh; $extravars['window_name'] = $window_name; // Escape data for display in html foreach (array_keys($record) as $key) { $record[$key] = htmlentities($record[$key], ENT_QUOTES, $conf['php_charset']); } // Create a div for workspace plugins to live $html .= "<div id='wsplugins' style='margin: 10px;'>"; $wspl = workspace_plugin_loader('subnet_detail', $record, $extravars); $html .= $wspl[0]; $js .= $wspl[1]; $wsmenu[] = $wspl[2]; $wspl = workspace_plugin_loader('dhcp_servers', $record, $extravars); $html .= $wspl[0]; $js .= $wspl[1]; $wsmenu[] = $wspl[2]; $wspl = workspace_plugin_loader('dhcp_pools', $record, $extravars); $html .= $wspl[0]; $js .= $wspl[1]; $wsmenu[] = $wspl[2]; $wspl = workspace_plugin_loader('dhcp_entries', $record, $extravars); $html .= $wspl[0]; $js .= $wspl[1]; $wsmenu[] = $wspl[2]; $wspl = workspace_plugin_loader('custom_attributes', $record, $extravars); $html .= $wspl[0]; $js .= $wspl[1]; $wsmenu[] = $wspl[2]; // Display messages $wspl = workspace_plugin_loader('messages', $record, $extravars); $html .= $wspl[0]; $js .= $wspl[1]; $wsmenu[] = $wspl[2]; // Display messages $wspl = workspace_plugin_loader('reports', $record, $extravars); $html .= $wspl[0]; $js .= $wspl[1]; $wsmenu[] = $wspl[2]; // Get all the plugin based worspace items $wspl_list = plugin_list('wspl_item'); // Load all the dynamic plugins foreach ($wspl_list as $p) { $wspl = workspace_plugin_loader($p['path'], $record, $extravars); $html .= $wspl[0]; $js .= $wspl[1]; $wsmenu[] = $wspl[2]; } // Gather our menuitems and build the HTML $wsmenuhtml = build_workspace_menu($wsmenu); $html .= <<<EOL </div> <br style="clear:both;"> <form id="form_subnet_{$record['id']}" ><input type="hidden" name="subnet_id" value="{$record['id']}" ><input type="hidden" name="js" value="{$refresh}" ></form> <div id='wsmenu' style='display:none;'>{$wsmenuhtml}</div> EOL; // HOST LIST $tab = 'hosts'; $submit_window = "list_{$tab}"; $form_id = "{$submit_window}_filter_form"; $_SESSION['ona'][$form_id]['tab'] = $tab; $content_id = "{$window_name}_{$submit_window}"; $html .= <<<EOL <!-- HOST LIST --> <div style="border: 1px solid {$color['border']}; margin: 10px 20px;"> <!-- Tab & Quick Filter --> <table id="{$form_id}_table" cellspacing="0" border="0" cellpadding="0"> <tr> <td id="{$form_id}_{$tab}_tab" class="table-tab-active"> Associated {$tab} <span id="{$form_id}_{$tab}_count"></span> </td> <td id="{$form_id}_quick_filter" class="padding" align="right" width="100%"> <form id="{$form_id}" onSubmit="return false;"> <input id="{$form_id}_page" name="page" value="1" type="hidden"> <input name="content_id" value="{$content_id}" type="hidden"> <input name="form_id" value="{$form_id}" type="hidden"> <input name="subnet_id" value="{$record['id']}" type="hidden"> <div id="{$form_id}_filter_overlay" title="Filter" style="position: relative; display: inline; color: #CACACA; cursor: text;" onClick="this.style.display = 'none'; el('{$form_id}_filter').focus();" >Name</div> <input id="{$form_id}_filter" name="filter" class="filter" type="text" value="" size="10" maxlength="20" alt="Quick Filter" onFocus="el('{$form_id}_filter_overlay').style.display = 'none';" onBlur="if (this.value == '') el('{$form_id}_filter_overlay').style.display = 'inline';" onKeyUp=" if (typeof(timer) != 'undefined') clearTimeout(timer); code = 'if ({$form_id}_last_search != el(\\'{$form_id}_filter\\').value) {' + ' {$form_id}_last_search = el(\\'{$form_id}_filter\\').value;' + ' document.getElementById(\\'{$form_id}_page\\').value = 1;' + ' xajax_window_submit(\\'{$submit_window}\\', xajax.getFormValues(\\'{$form_id}\\'), \\'display_list\\');' + '}'; timer = setTimeout(code, 700);" > </form> </td> </tr> </table> <div id='{$content_id}'>{$conf['loading_icon']}</div> <!-- ADD HOST LINK --> <div class="act-box" style="padding: 2px 4px; border-top: 1px solid {$color['border']}"> <form id="form_host_add_{$record['id']}" ><input type="hidden" name="subnet_id" value="{$record['id']}" ><input type="hidden" name="js" value="{$refresh}" ></form> EOL; if (auth('host_add', $debug_val)) { $html .= <<<EOL <a title="Add host" class="act" onClick="xajax_window_submit('edit_host', xajax.getFormValues('form_host_add_{$record['id']}'), 'editor');" ><img src="{$images}/silk/page_add.png" border="0"></a> <a title="Add host" class="act" onClick="xajax_window_submit('edit_host', xajax.getFormValues('form_host_add_{$record['id']}'), 'editor');" >Add a new host</a> EOL; } if (auth('interface_modify', $debug_val)) { $html .= <<<EOL <a title="Add interface" class="act" onClick="xajax_window_submit('edit_interface', xajax.getFormValues('form_host_add_{$record['id']}'), 'editor');" ><img src="{$images}/silk/page_add.png" border="0"></a> <a title="Add interface" class="act" onClick="xajax_window_submit('edit_interface', xajax.getFormValues('form_host_add_{$record['id']}'), 'editor');" >Add interface to an existing host</a> EOL; } $html .= <<<EOL <!-- List by IP Address LINK --> <a title="List Hosts by IP" class="act" onClick="xajax_window_submit('app_full_list', xajax.getFormValues('{$form_id}'), 'display');" ><img src="{$images}/silk/page_white_go.png" border="0"></a> <a title="List Hosts by IP" class="act" onClick="xajax_window_submit('app_full_list', xajax.getFormValues('{$form_id}'), 'display');" >List Hosts by IP</a> </div> </div> EOL; $js .= <<<EOL /* Setup the quick filter */ el('{$form_id}_filter_overlay').style.left = (el('{$form_id}_filter_overlay').offsetWidth + 10) + 'px'; {$form_id}_last_search = ''; /* Tell the browser to load/display the list */ xajax_window_submit('{$submit_window}', xajax.getFormValues('{$form_id}'), 'display_list'); EOL; // Temp turn OFF of the dhcp lease list.. its not ready yet. $haspool = 0; if ($haspool == 1) { // DHCP Lease LIST $tab = 'dhcp_leases'; $submit_window = "list_{$tab}"; $form_id = "{$submit_window}_filter_form"; $_SESSION['ona'][$form_id]['tab'] = $tab; $content_id = "{$window_name}_{$submit_window}"; $html .= <<<EOL <!-- Lease LIST --> <div style="border: 1px solid {$color['border']}; margin: 10px 20px;"> <!-- Tab & Quick Filter --> <table id="{$form_id}_table" cellspacing="0" border="0" cellpadding="0"> <tr> <td id="{$form_id}_{$tab}_tab" class="table-tab-active"> Associated {$tab} <span id="{$form_id}_{$tab}_count"></span> </td> <td id="{$form_id}_quick_filter" class="padding" align="right" width="100%"> <form id="{$form_id}" onSubmit="return false;"> <input id="{$form_id}_page" name="page" value="1" type="hidden"> <input name="content_id" value="{$content_id}" type="hidden"> <input name="form_id" value="{$form_id}" type="hidden"> <input name="subnet" value="{$record['id']}" type="hidden"> <div id="{$form_id}_filter_overlay" style="position: relative; display: inline; color: #CACACA; cursor: text;" onClick="this.style.display = 'none'; el('{$form_id}_filter').focus();" >Filter</div> <input id="{$form_id}_filter" name="filter" class="filter" type="text" value="" size="10" maxlength="20" alt="Quick Filter" onFocus="el('{$form_id}_filter_overlay').style.display = 'none';" onBlur="if (this.value == '') el('{$form_id}_filter_overlay').style.display = 'inline';" onKeyUp=" if (typeof(timer) != 'undefined') clearTimeout(timer); code = 'if ({$form_id}_last_search != el(\\'{$form_id}_filter\\').value) {' + ' {$form_id}_last_search = el(\\'{$form_id}_filter\\').value;' + ' document.getElementById(\\'{$form_id}_page\\').value = 1;' + ' xajax_window_submit(\\'{$submit_window}\\', xajax.getFormValues(\\'{$form_id}\\'), \\'display_list\\');' + '}'; timer = setTimeout(code, 700);" > </form> </td> </tr> </table> <div id='{$content_id}'> {$conf['loading_icon']} </div> </div> EOL; $js .= <<<EOL /* Setup the quick filter */ el('{$form_id}_filter_overlay').style.left = (el('{$form_id}_filter_overlay').offsetWidth + 10) + 'px'; {$form_id}_last_search = ''; /* Tell the browser to load/display the list */ xajax_window_submit('{$submit_window}', xajax.getFormValues('{$form_id}'), 'display_list'); EOL; } // Insert the new html into the window // Instantiate the xajaxResponse object $response = new xajaxResponse(); $response->addAssign("work_space_content", "innerHTML", $html); if ($js) { $response->addScript($js); } return $response->getXML(); }