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); }
<?php $title_left_html = ''; // Calculate the percentage of the subnet that's used (total size - allocated hosts - dhcp pool size) $usage_html = get_subnet_usage_html($record['id']); if (auth('subnet_modify', $debug_val)) { $title_left_html .= <<<EOL <a title="Edit subnet. ID: {$record['id']}" class="act" onClick="xajax_window_submit('edit_subnet', xajax.getFormValues('form_subnet_{$record['id']}'), 'editor');" ><img src="{$images}/silk/page_edit.png" border="0"></a> EOL; } if (auth('subnet_del', $debug_val)) { $title_left_html .= <<<EOL <a title="Delete subnet. ID: {$record['id']}" class="act" onClick="xajax_window_submit('tooltips', 'name=>edit_subnet', 'window_progressbar');xajax_window_submit('edit_subnet', xajax.getFormValues('form_subnet_{$record['id']}'), 'delete');" ><img src="{$images}/silk/delete.png" border="0"></a> EOL; } $title_left_html .= <<<EOL <b>{$record['name']}</b> EOL; $title_right_html .= <<<EOL <a href="?work_space={$extravars['window_name']}&subnet={$record['name']}"><img title="Direct link to {$record['name']}" src="{$images}/silk/application_link.png" border="0"></a> EOL; // Define the tag type $tagtype = 'subnet'; // Print tag list $modjs .= <<<EOL
function ws_subnet($window_name, $form = '') { global $conf, $self, $onadb; global $color, $style, $images; $html = $js = ''; // If the user supplied an array in a string, build the array and store it in $form $form = parse_options_string($form); // Set max_results and max_usage_bars if we need to if (!is_numeric($form['max_results'])) { $form['max_results'] = 250; } if (!is_numeric($form['max_usage_bars'])) { $form['max_usage_bars'] = 50; } // // *** QF SUBNET SEARCH *** // // Search results go in here $results = array(); $count = 0; // Start building the "where" clause for the sql query to find the subnets to display $where = ""; $and = ""; // SUBNET TYPE if ($form['nettype']) { $where .= $and . "subnet_type_id = " . $onadb->qstr($form['nettype']); $and = " AND "; } // SUBNET DESCRIPTION if ($form['netdesc']) { // This field is always upper case $form['netdesc'] = strtoupper($form['netdesc']); $where .= $and . "name LIKE " . $onadb->qstr('%' . $form['netdesc'] . '%'); $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_end = ip_complete($form['ip_subnet_thru'], '255'); } else { $ip_end = ip_complete($form['ip_subnet'], '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 .= "ip_addr >= " . $onadb->qstr($ip) . " AND ip_addr <= " . $onadb->qstr($ip_end); } } // 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 ASC", $form['max_results']); // If there were more than $form['max_results'] find out how many records there really are if ($rows >= $form['max_results']) { list($status, $rows, $records) = db_get_records($onadb, 'subnets', $where . $filter, "", 0); } $count = $rows; // // *** BUTILD RESULTS HTML *** // $html .= <<<EOL <table style="cursor: pointer;" width="100%" cellspacing="0" border="0" cellpadding="0"> EOL; if ($count > $form['max_results']) { $html .= <<<EOL <tr><td style="cursor: default; font-size: 12px; background-color: #FFCCCC; color: 000;" colspan="5" align="center">Displaying {$form['max_results']} of {$count} results</td></tr> EOL; } if ($count > $form['max_usage_bars']) { $too_many_bars_message = <<<EOL <tr><td style="cursor: default; font-size: 12px; background-color: #FFCCCC; color: 000;" colspan="5" align="center">Usage graph only displayed for the first {$form['max_usage_bars']} subnets</td></tr> EOL; } $i = 0; foreach ($results as $record) { $record['ip_addr'] = ip_mangle($record['ip_addr'], 'dotted'); // Calculate the percentage of the subnet that's used (total size - allocated hosts - dhcp pool size) if ($i++ <= $form['max_usage_bars']) { $usage_html = get_subnet_usage_html($record['id']); } else { if ($i == $form['max_usage_bars'] + 2) { $html .= $too_many_bars_message; $usage_html = ' '; } else { $usage_html = ' '; } } // The onClick javascript is slightly different if we're looking for a subnet, or a free IP address if ($form['next_action'] == 'free_ip') { $onclick = "el('qf_free_ip_subnet_id').value = '{$record['id']}'; xajax_window_submit('{$window_name}', xajax.getFormValues('{$form['form_id']}'), 'free_ip');"; } else { $onclick = "el('{$form['input_id']}').value = '{$record['name']}'; removeElement('{$form['id']}');"; } $html .= <<<EOL <tr onMouseOver="this.className='row-highlight';" onMouseOut="this.className='row-normal';" onClick="{$onclick}"> <td style="font-size: 10px; padding: 0px 2px;">{$record['ip_addr']}</td> <td style="font-size: 10px; padding: 0px 2px;">{$usage_html}</td> <td style="font-size: 10px; padding: 0px 2px;">{$record['name']}</td> </tr> EOL; } $html .= <<<EOL </table> EOL; $js .= <<<EOL el('{$form['content_id']}').style.display = 'block'; /* Reposition the popup if the new content is displayed off the screen */ wwTT_position('{$form['id']}'); EOL; if ($count == 1) { $html = ""; $js .= "el('qf_free_ip_subnet_id').value = '{$record['id']}'; xajax_window_submit('{$window_name}', xajax.getFormValues('{$form['form_id']}'), 'free_ip');"; } // Insert the new html into the window // Instantiate the xajaxResponse object $response = new xajaxResponse(); $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 = ''; // 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(); }