function generateVSSection($vs_parser) { $ret = $vs_parser->expand("\tprotocol %PROTO%\n\t%GLOBAL_VS_CONF%\n\t%RSP_VS_CONF%\n\t%VS_VS_CONF%\n\t%PORT_VS_CONF%\n\t%VIP_VS_CONF%\n\t%SLB_PORT_VS_CONF%\n\t%SLB_VIP_VS_CONF%\n"); $rs_count = 0; $family_length = $vs_parser->expandMacro('IP_VER') == 6 ? 16 : 4; foreach ($vs_parser->getRSList() as $rs) { if ($rs['inservice'] != 'yes') { continue; } $parser = clone $vs_parser; $parser->addMacro('RSIP', $rs['rsip']); if (isset($rs['rsport'])) { $parser->addMacro('RSPORT', $rs['rsport']); } $parser->addMacro('RS_COMMENT', $rs['comment']); $parser->addMacro('RS_RS_CONF', $rs['rsconfig']); // do not add v6 reals into v4 service and vice versa $rsip_bin = ip_checkparse($parser->expandMacro('RSIP')); if ($rsip_bin !== FALSE && strlen($rsip_bin) == $family_length) { foreach (explode(',', $parser->expandMacro('RSPORT')) as $rsp_token) { $port_range = explode('-', $rsp_token); if (count($port_range) < 1) { throw new InvalidArgException('RSPORT', $rsp_token, "invalid RS port range"); } if (count($port_range) < 2) { $port_range[] = $port_range[0]; } if ($port_range[0] > $port_range[1]) { throw new InvalidArgException('RSPORT', $rsp_token, "invalid RS port range"); } for ($rsport = $port_range[0]; $rsport <= $port_range[1]; $rsport++) { $rs_count++; $rs_parser = clone $parser; $rs_parser->addMacro('RSPORT', $rsport); $ret .= $rs_parser->expand("\n\t%RS_PREPEND%\n\treal_server %RS_HEADER% {\n\t\t%GLOBAL_RS_CONF%\n\t\t%VS_RS_CONF%\n\t\t%RSP_RS_CONF%\n\t\t%VIP_RS_CONF%\n\t\t%PORT_RS_CONF%\n\t\t%SLB_VIP_RS_CONF%\n\t\t%SLB_PORT_RS_CONF%\n\t\t%RS_RS_CONF%\n\t}\n"); } } } } return $rs_count ? $ret : ''; }
function addRealServers() { global $sic; assertStringArg('format'); assertStringArg('rawtext'); $ngood = 0; // Keep in mind, that the text will have HTML entities (namely '>') escaped. foreach (explode("\n", dos2unix($sic['rawtext'])) as $line) { if (!strlen($line)) { continue; } $match = array(); switch ($_REQUEST['format']) { case 'ipvs_2': // address and port only if (!preg_match('/^ -> ([0-9\\.]+):([0-9]+) /', $line, $match)) { if (!preg_match('/^ -> \\[([0-9a-fA-F:]+)\\]:([0-9]+) /', $line, $match)) { continue; } } addRStoRSPool(getBypassValue(), ip_parse($match[1]), $match[2], getConfigVar('DEFAULT_IPV4_RS_INSERVICE'), ''); break; case 'ipvs_3': // address, port and weight if (!preg_match('/^ -> ([0-9\\.]+):([0-9]+) +[a-zA-Z]+ +([0-9]+) /', $line, $match)) { if (!preg_match('/^ -> \\[([0-9a-fA-F:]+)\\]:([0-9]+) +[a-zA-Z]+ +([0-9]+) /', $line, $match)) { continue; } } addRStoRSPool(getBypassValue(), ip_parse($match[1]), $match[2], getConfigVar('DEFAULT_IPV4_RS_INSERVICE'), 'weight ' . $match[3]); break; case 'ssv_2': // IP address and port if (!preg_match('/^([0-9\\.a-fA-F:]+) ([0-9]+)$/', $line, $match)) { continue; } addRStoRSPool(getBypassValue(), ip_parse($match[1]), $match[2], getConfigVar('DEFAULT_IPV4_RS_INSERVICE'), ''); break; case 'ssv_1': // IP address if (!($ip_bin = ip_checkparse($line))) { continue; } addRStoRSPool(getBypassValue(), $ip_bin, 0, getConfigVar('DEFAULT_IPV4_RS_INSERVICE'), ''); break; default: showFuncMessage(__FUNCTION__, 'ERR1'); return; } $ngood++; } showFuncMessage(__FUNCTION__, 'OK', array($ngood)); }
function generateSLBConfig($triplet_list) { $ret = ''; global $parser_class; $gl_parser = new $parser_class(); $defaults = getSLBDefaults(TRUE); $gl_parser->addMacro('GLOBAL_VS_CONF', dos2unix($defaults['vsconfig'])); $gl_parser->addMacro('GLOBAL_RS_CONF', dos2unix($defaults['rsconfig'])); $gl_parser->addMacro('RSPORT', '%VPORT%'); $gl_parser->addMacro('VS_PREPEND', "# LB (id == %LB_ID%): %LB_NAME%\n# VS (id == %VS_ID%): %VS_NAME%\n# RS (id == %RSP_ID%): %RSP_NAME%"); // group triplets by object_id, vs_id $grouped = array(); foreach ($triplet_list as $triplet) { $grouped[$triplet->lb['id']][$triplet->vs['id']][] = $triplet; } foreach ($grouped as $object_id => $subarr) { $lb = array_first(array_first($subarr))->lb; $lb_parser = clone $gl_parser; $lb_parser->addMacro('LB_ID', $lb['id']); $lb_parser->addMacro('LB_NAME', $lb['name']); foreach ($subarr as $vs_id => $triplets) { $vs = array_first($triplets)->vs; $vs_parser = clone $lb_parser; $vs_parser->addMacro('VS_ID', $vs['id']); $vs_parser->addMacro('VS_NAME', $vs['name']); $vs_parser->addMacro('VIP', $vs['vip']); $vs_parser->addMacro('VPORT', $vs['vport']); $vs_parser->addMacro('IP_VER', strlen($vs['vip_bin']) == 16 ? 6 : 4); if ($vs['proto'] == 'MARK') { $vs_parser->addMacro('PROTO', 'TCP'); $mark = implode('', unpack('N', substr($vs['vip_bin'], 0, 4))); $vs_parser->addMacro('MARK', $mark); $vs_parser->addMacro('VS_HEADER', "fwmark {$mark}"); } else { $vs_parser->addMacro('VS_HEADER', $vs['vip'] . ' ' . $vs['vport']); $vs_parser->addMacro('PROTO', $vs['proto']); } $vs_parser->addMacro('VS_RS_CONF', dos2unix($vs['rsconfig'])); $vip_bin = ip_checkparse($vs_parser->expandMacro('VIP')); if ($vip_bin === FALSE) { $family_length = 4; } else { $family_length = strlen($vip_bin); } foreach ($triplets as $triplet) { $rsp = $triplet->rs; $rs_parser = clone $vs_parser; $rs_parser->addMacro('RSP_ID', $rsp['id']); $rs_parser->addMacro('RSP_NAME', $rsp['name']); $rs_parser->addMacro('RSP_VS_CONF', dos2unix($rsp['vsconfig'])); $rs_parser->addMacro('RSP_RS_CONF', dos2unix($rsp['rsconfig'])); $rs_parser->addMacro('VS_VS_CONF', dos2unix($vs['vsconfig'])); // VS-driven vsconfig has higher priority than RSP-driven $rs_parser->addMacro('PRIO', $triplet->slb['prio']); $rs_parser->addMacro('SLB_VS_CONF', dos2unix($triplet->slb['vsconfig'])); $rs_parser->addMacro('SLB_RS_CONF', dos2unix($triplet->slb['rsconfig'])); $ret .= $rs_parser->expand("\n%VS_PREPEND%\nvirtual_server %VS_HEADER% {\n\tprotocol %PROTO%\n\t%GLOBAL_VS_CONF%\n\t%RSP_VS_CONF%\n\t%VS_VS_CONF%\n\t%SLB_VS_CONF%\n"); foreach ($rs_parser->getRSList() as $rs_row) { if ($rs_row['inservice'] != 'yes') { continue; } $parser = clone $rs_parser; $parser->addMacro('RS_HEADER', $parser->expandMacro('PROTO') == 'MARK' ? '%RSIP%' : '%RSIP% %RSPORT%'); $parser->addMacro('RSIP', $rs_row['rsip']); if (isset($rs_row['rsport'])) { $parser->addMacro('RSPORT', $rs_row['rsport']); } $parser->addMacro('RS_COMMENT', $rs_row['comment']); $parser->addMacro('RS_RS_CONF', dos2unix($rs_row['rsconfig'])); // do not add v6 reals into v4 service and vice versa $rsip_bin = ip_checkparse($parser->expandMacro('RSIP')); if ($rsip_bin !== FALSE && strlen($rsip_bin) == $family_length) { foreach (explode(',', $parser->expandMacro('RSPORT')) as $rsp_token) { $port_range = explode('-', $rsp_token); if (count($port_range) < 1) { throw new InvalidArgException('RSPORT', $rsp_token, "invalid RS port range"); } if (count($port_range) < 2) { $port_range[] = $port_range[0]; } if ($port_range[0] > $port_range[1]) { throw new InvalidArgException('RSPORT', $rsp_token, "invalid RS port range"); } for ($rsport = $port_range[0]; $rsport <= $port_range[1]; $rsport++) { $r_parser = clone $parser; $r_parser->addMacro('RSPORT', $rsport); $ret .= $r_parser->expand("\n\t%RS_PREPEND%\n\treal_server %RS_HEADER% {\n\t\t%GLOBAL_RS_CONF%\n\t\t%VS_RS_CONF%\n\t\t%RSP_RS_CONF%\n\t\t%SLB_RS_CONF%\n\t\t%RS_RS_CONF%\n\t}\n"); } } } } $ret .= "}\n"; } } } return $ret; }
function snmpgeneric_list($object_id) { global $sg_create_noconnector_ports, $sg_known_sysObjectIDs, $sg_portoifoptions, $sg_ifType_ignore; if (isset($_POST['snmpconfig'])) { $snmpconfig = $_POST; } else { showError("Missing SNMP Config"); return; } // sg_var_dump_html($snmpconfig); echo '<body onload="document.getElementById(\'createbutton\').focus();">'; addJS('function setchecked(classname) { var boxes = document.getElementsByClassName(classname); var value = document.getElementById(classname).checked; for(i=0;i<boxes.length;i++) { if(boxes[i].disabled == false) boxes[i].checked=value; } };', TRUE); $object = spotEntity('object', $object_id); $object['attr'] = getAttrValues($object_id); $snmpdev = new mySNMP($snmpconfig['version'], $snmpconfig['host'], $snmpconfig['community']); if ($snmpconfig['version'] == "v3") { $snmpdev->setSecurity($snmpconfig['sec_level'], $snmpconfig['auth_protocol'], $snmpconfig['auth_passphrase'], $snmpconfig['priv_protocol'], $snmpconfig['priv_passphrase']); } $snmpdev->init(); if ($snmpdev->getErrno()) { showError($snmpdev->getError()); return; } /* SNMP connect successfull */ showSuccess("SNMP " . $snmpconfig['version'] . " connect to {$snmpconfig['host']} successfull"); echo '<form name=CreatePorts method=post action=' . $_SERVER['REQUEST_URI'] . '&module=redirect&op=create>'; echo "<strong>System Informations</strong>"; echo "<table>"; // echo "<tr><th>OID</th><th>Value</th></tr>"; $systemoids = array('sysDescr', 'sysObjectID', 'sysUpTime', 'sysContact', 'sysName', 'sysLocation'); foreach ($systemoids as $shortoid) { $value = $snmpdev->{$shortoid}; if ($shortoid == 'sysUpTime') { /* in hundredths of a second */ $secs = (int) ($value / 100); $days = (int) ($secs / (60 * 60 * 24)); $secs -= $days * 60 * 60 * 24; $hours = (int) ($secs / (60 * 60)); $secs -= $hours * 60 * 60; $mins = (int) ($secs / 60); $secs -= $mins * 60; $value = "{$value} ({$days} {$hours}:{$mins}:{$secs})"; } echo "<tr><td title=\"" . $snmpdev->lastgetoid . "\" align=\"right\">{$shortoid}: </td><td>{$value}</td></tr>"; } unset($shortoid); echo "</table>"; /* sysObjectID Attributes and Ports */ $sysObjectID['object'] =& $object; /* get sysObjectID */ $sysObjectID['raw_value'] = $snmpdev->sysObjectID; //$sysObjectID['raw_value'] = 'NET-SNMP-MIB::netSnmpAgentOIDs.10'; $sysObjectID['value'] = preg_replace('/^.*enterprises\\.([\\.[:digit:]]+)$/', '\\1', $sysObjectID['raw_value']); /* try snmptranslate to numeric */ if (preg_match('/[^\\.0-9]+/', $sysObjectID['value'])) { $numeric_value = $snmpdev->translatetonumeric($sysObjectID['value']); if (!empty($numeric_value)) { showSuccess("sysObjectID: " . $sysObjectID['value'] . " translated to {$numeric_value}"); $sysObjectID['value'] = preg_replace('/^.1.3.6.1.4.1.([\\.[:digit:]]+)$/', '\\1', $numeric_value); } } /* array_merge doesn't work with numeric keys !! */ $sysObjectID['attr'] = array(); $sysObjectID['port'] = array(); $sysobjid = $sysObjectID['value']; $count = 1; while ($count) { if (isset($sg_known_sysObjectIDs[$sysobjid])) { $sysObjectID = $sysObjectID + $sg_known_sysObjectIDs[$sysobjid]; if (isset($sg_known_sysObjectIDs[$sysobjid]['attr'])) { $sysObjectID['attr'] = $sysObjectID['attr'] + $sg_known_sysObjectIDs[$sysobjid]['attr']; } if (isset($sg_known_sysObjectIDs[$sysobjid]['port'])) { $sysObjectID['port'] = $sysObjectID['port'] + $sg_known_sysObjectIDs[$sysobjid]['port']; } if (isset($sg_known_sysObjectIDs[$sysobjid]['text'])) { showSuccess("found sysObjectID ({$sysobjid}) " . $sg_known_sysObjectIDs[$sysobjid]['text']); } } $sysobjid = preg_replace('/\\.[[:digit:]]+$/', '', $sysobjid, 1, $count); /* add default sysobjectid */ if ($count == 0 && $sysobjid != 'default') { $sysobjid = 'default'; $count = 1; } } $sysObjectID['vendor_number'] = $sysobjid; /* device pf */ if (isset($sysObjectID['pf'])) { foreach ($sysObjectID['pf'] as $function) { if (function_exists($function)) { /* call device pf */ $function($snmpdev, $sysObjectID, NULL); } else { showWarning("Missing processor function " . $function . " for device {$sysobjid}"); } } } /* sort attributes maintain numeric keys */ ksort($sysObjectID['attr']); /* DEBUG */ //sg_var_dump_html($sysObjectID['attr'], "Before processing"); /* needs PHP >= 5 foreach call by reference */ /* php 5.1.6 doesn't seem to work */ //foreach($sysObjectID['attr'] as $attr_id => &$attr) foreach ($sysObjectID['attr'] as $attr_id => $value) { $attr =& $sysObjectID['attr'][$attr_id]; if (isset($object['attr'][$attr_id])) { if (array_key_exists('key', $object['attr'][$attr_id])) { $attr['key'] = $object['attr'][$attr_id]['key']; } switch (TRUE) { case isset($attr['pf']): if (function_exists($attr['pf'])) { $attr['pf']($snmpdev, $sysObjectID, $attr_id); } else { showWarning("Missing processor function " . $attr['pf'] . " for attribute {$attr_id}"); } break; case isset($attr['oid']): $attrvalue = $snmpdev->get($attr['oid']); if (isset($attr['regex'])) { $regex = $attr['regex']; if (isset($attr['replacement'])) { $replacement = $attr['replacement']; $attrvalue = preg_replace($regex, $replacement, $attrvalue); } else { if (!preg_match($regex, $attrvalue)) { if (!isset($attr['uncheck'])) { $attr['uncheck'] = "regex doesn't match"; } } else { unset($attr['uncheck']); } } } $attr['value'] = $attrvalue; break; case isset($attr['value']): break; default: showError("Error handling attribute id: {$attr_id}"); } } else { showWarning("Object has no attribute id: {$attr_id}"); unset($sysObjectID['attr'][$attr_id]); } } unset($attr_id); /* sort again in case there where attribs added ,maintain numeric keys */ ksort($sysObjectID['attr']); /* print attributes */ echo '<br>Attributes<br><table>'; echo '<tr><th><input type="checkbox" id="attribute" checked="checked" onclick="setchecked(this.id)"></td>'; echo '<th>Name</th><th>Current Value</th><th>new value</th></tr>'; /* DEBUG */ //sg_var_dump_html($sysObjectID['attr'], "After processing"); foreach ($sysObjectID['attr'] as $attr_id => &$attr) { $attr['id'] = $attr_id; if (isset($object['attr'][$attr_id]) && isset($attr['value'])) { if ($attr['value'] == $object['attr'][$attr_id]['value']) { $attr['uncheck'] = 'Current = new value'; } if (isset($attr['key']) && isset($object['attr'][$attr_id]['key'])) { if ($attr['key'] == $object['attr'][$attr_id]['key']) { $attr['uncheck'] = 'Current = new key'; } } $value = $attr['value']; $val_key = isset($object['attr'][$attr_id]['key']) ? ' (' . $object['attr'][$attr_id]['key'] . ')' : ''; $comment = ''; if (isset($attr['comment'])) { if (!empty($attr['comment'])) { $comment = $attr['comment']; } } if (isset($attr['uncheck'])) { $checked = ''; $comment .= ', ' . $attr['uncheck']; } else { $checked = ' checked="checked"'; } $updateattrcheckbox = '<b style="background-color:#00ff00">' . '<input style="background-color:#00ff00" class="attribute" type="checkbox" name="updateattr[' . $attr_id . ']" value="' . $value . '"' . $checked . '></b>'; $comment = trim($comment, ', '); echo "<tr><td>{$updateattrcheckbox}</td><td title=\"id: {$attr_id}\">" . $object['attr'][$attr_id]['name'] . '</td><td style="background-color:#d8d8d8">' . $object['attr'][$attr_id]['value'] . $val_key . '</td><td>' . $value . '</td>' . '<td style="color:#888888">' . $comment . '</td></tr>'; } } unset($attr_id); echo '</table>'; $object['breed'] = sg_detectDeviceBreedByObject($sysObjectID); if (!empty($object['breed'])) { echo "Found Breed: " . $object['breed'] . "<br>"; } /* ports */ /* get ports */ amplifyCell($object); /* set array key to lowercase port name */ foreach ($object['ports'] as $key => $values) { $object['ports'][strtolower(shortenIfName($values['name'], $object['breed']))] = $values; unset($object['ports'][$key]); } $newporttypeoptions = getNewPortTypeOptions(); // sg_var_dump_html($sysObjectID['port']); if (!empty($sysObjectID['port'])) { echo '<br>Vendor / Device specific ports<br>'; echo '<table><tr><th><input type="checkbox" id="moreport" checked="checked" onclick="setchecked(this.id)"></th><th>ifName</th><th>porttypeid</th></tr>'; foreach ($sysObjectID['port'] as $name => $port) { if (array_key_exists(strtolower($name), $object['ports'])) { $disableport = TRUE; } else { $disableport = FALSE; } $comment = ''; if (isset($port['comment'])) { if (!empty($port['comment'])) { $comment = $port['comment']; } } if (isset($port['uncheck'])) { $checked = ''; $comment .= ', ' . $port['uncheck']; } else { $checked = ' checked="checked"'; } $portcreatecheckbox = '<b style="background-color:' . ($disableport ? '#ff0000' : '#00ff00') . '"><input style="background-color:' . ($disableport ? '#ff0000' : '#00ff00') . '" class="moreport" type="checkbox" name="portcreate[' . $name . ']" value="' . $name . '"' . ($disableport ? ' disabled="disbaled"' : $checked) . '></b>'; $formfield = '<input type="hidden" name="ifName[' . $name . ']" value="' . $name . '">'; echo "<tr>{$formfield}<td>{$portcreatecheckbox}</td><td>{$name}</td>"; if (isset($port['disabled'])) { $disabledselect = array('disabled' => "disabled"); } else { $disabledselect = array(); } foreach ($port as $key => $value) { if ($key == 'uncheck' || $key == 'comment') { continue; } /* TODO iif_name */ if ($key == 'porttypeid') { $displayvalue = getNiftySelect($newporttypeoptions, array('name' => "porttypeid[{$name}]") + $disabledselect, $value); } else { $displayvalue = $value; } $formfield = '<input type="hidden" name="' . $key . '[' . $name . ']" value="' . $value . '">'; echo "{$formfield}<td>{$displayvalue}</td>"; } $comment = trim($comment, ', '); echo "<td style=\"color:#888888\">{$comment}</td></tr>"; } unset($name); unset($port); echo '</table>'; } /* snmp ports */ $ifsnmp = new ifSNMP($snmpdev); // needed for shortenIfName() $ifsnmp->object_breed = $object['breed']; /* ip spaces */ $ipspace = NULL; foreach ($ifsnmp->ipaddress as $ifindex => $ipaddresses) { foreach ($ipaddresses as $ipaddr => $value) { $addrtype = $value['addrtype']; $netaddr = $value['net']; $maskbits = $value['maskbits']; $netid = NULL; $linklocal = FALSE; //echo "<br> - DEBUG: ipspace $ipaddr - $netaddr - $addrtype - $maskbits<br>"; /* check for ip space */ switch ($addrtype) { case 'ipv4': case 'ipv4z': if ($maskbits == 32) { $netid = 'host'; } else { $netid = getIPv4AddressNetworkId(ip_parse($ipaddr)); } break; case 'ipv6': if (ip_checkparse($ipaddr) === false) { /* format ipaddr for ip6_parse */ $ipaddr = preg_replace('/((..):(..))/', '\\2\\3', $ipaddr); $ipaddr = preg_replace('/%.*$/', '', $ipaddr); } if (ip_checkparse($ipaddr) === false) { continue 2; } // 2 because of switch $ip6_bin = ip6_parse($ipaddr); $ip6_addr = ip_format($ip6_bin); $netid = getIPv6AddressNetworkId($ip6_bin); $node = constructIPRange($ip6_bin, $maskbits); $netaddr = $node['ip']; $linklocal = substr($ip6_addr, 0, 5) == "fe80:"; //echo "<br> - DEBUG: ipspace $ipaddr - $addrtype - $maskbits - $netaddr - >$linklocal<<br>"; break; case 'ipv6z': /* link local */ $netid = 'ignore'; break; default: } if (empty($netid) && $netaddr != '::1' && $netaddr != '127.0.0.1' && $netaddr != '127.0.0.0' && $netaddr != '0.0.0.0' && !$linklocal) { $netaddr .= "/{$maskbits}"; $ipspace[$netaddr] = array('addrtype' => $addrtype, 'checked' => $maskbits > 0 ? true : false); } } unset($ipaddr); unset($value); unset($addrtype); } unset($ifindex); unset($ipaddresses); /* print ip spaces table */ if (!empty($ipspace)) { echo '<br><br>Create IP Spaces'; echo '<table><tr><th><input type="checkbox" id="ipspace" onclick="setchecked(this.id)" checked=\\"checked\\"></th>'; echo '<th>Type</th><th>prefix</th><th>name</th><th width=150 title="reserve network and router addresses">reserve network / router addresses</th></tr>'; $i = 1; foreach ($ipspace as $prefix => $ipspace) { $netcreatecheckbox = '<b style="background-color:#00ff00">' . '<input class="ipspace" style="background-color:#00ff00" type="checkbox" name="netcreate[' . $i . ']" value="' . $ipspace['addrtype'] . '"' . ($ipspace['checked'] ? ' checked=\\"checked\\"' : '') . '></b>'; $netprefixfield = '<input type="text" size=50 name="netprefix[' . $i . ']" value="' . $prefix . '">'; $netnamefield = '<input type="text" name="netname[' . $i . ']">'; $netreservecheckbox = '<input type="checkbox" name="netreserve[' . $i . ']" checked="checked">'; echo "<tr><td>{$netcreatecheckbox}</td><td style=\"color:#888888\">{$ipspace['addrtype']}</td><td>{$netprefixfield}</td><td>{$netnamefield}</td><td>{$netreservecheckbox}</td></tr>"; $i++; } unset($prefix); unset($addrtype); unset($i); echo '</table>'; } echo "<br><br>ifNumber: " . $ifsnmp->ifNumber . "<br>indexcount: " . $ifsnmp->indexcount . "<br><table><tbody valign=\"top\">"; $portcompat = getPortInterfaceCompat(); $ipnets = array(); $ifsnmp->printifInfoTableHeader("<th>add ip</th><th>add port</th><th>upd label</th><th title=\"update mac\">upd mac</th><td>upd port type</th><th>porttypeid</th><th>comment</th></tr>"); echo '<tr><td colspan="11"></td> <td><input type="checkbox" id="ipaddr" onclick="setchecked(this.id);" checked="checked">IPv4<br> <input type="checkbox" id="ipv6addr" onclick="setchecked(this.id);" checked="checked">IPv6</td> <td><input type="checkbox" id="ports" onclick="setchecked(this.id)"></td> <td><input type="checkbox" id="label" onclick="setchecked(this.id);" checked="checked"></td> <td><input type="checkbox" id="mac" onclick="setchecked(this.id);" checked="checked"></td> <td><input type="checkbox" id="porttype" onclick="setchecked(this.id);"></td></tr>'; foreach ($ifsnmp as $if) { $createport = TRUE; $disableport = FALSE; $ignoreport = FALSE; $port_info = NULL; $updatelabel = false; $updateporttype = false; $updatemaccheckbox = ''; $hrefs = array(); $comment = ""; if (trim($ifsnmp->ifName($if)) == '') { $comment .= "no ifName"; $createport = FALSE; } else { if (array_key_exists($ifsnmp->ifName($if), $object['ports'])) { $port_info =& $object['ports'][$ifsnmp->ifName($if)]; $comment .= "Name exists"; /* ifalias change */ if ($port_info['label'] != $ifsnmp->ifAlias($if)) { $updatelabel = true; } $createport = FALSE; $disableport = TRUE; } } if ($ifsnmp->ifPhysAddress($if) != '') { $ifPhysAddress = $ifsnmp->ifPhysAddress($if); $l2port = sg_checkL2Address($ifPhysAddress); if (!empty($l2port)) { $l2object_id = key($l2port); $porthref = makeHref(array('page' => 'object', 'tab' => 'ports', 'object_id' => $l2object_id, 'hl_port_id' => $l2port[$l2object_id])); $comment .= ", L2Address exists"; $hrefs['ifPhysAddress'] = $porthref; $createport = FALSE; // $disableport = TRUE; $updatemaccheckbox = ''; } $disablemac = true; if ($disableport) { if ($port_info !== NULL) { if (str_replace(':', '', $port_info['l2address']) != $ifPhysAddress) { $disablemac = false; } else { $disablemac = true; } } } else { /* port create always updates mac */ $updatemaccheckbox = '<b style="background-color:#00ff00">' . '<input style="background-color:' . '#00ff00" type="checkbox"' . ' checked="checked"' . ' disabled=\\"disabled\\"></b>'; } if (!$disablemac) { $updatemaccheckbox = '<b style="background-color:' . ($disablemac ? '#ff0000' : '#00ff00') . '">' . '<input class="mac" style="background-color:' . ($disablemac ? '#ff0000' : '#00ff00') . '" type="checkbox" name="updatemac[' . $if . ']" value="' . $object['ports'][$ifsnmp->ifName($if)]['id'] . '" checked="checked"' . ($disablemac ? ' disabled=\\"disabled\\"' : '') . '></b>'; } } $porttypeid = guessRToif_id($ifsnmp->ifType($if), $ifsnmp->ifDescr($if)); if (in_array($ifsnmp->ifType($if), $sg_ifType_ignore)) { $comment .= ", ignore if type"; $createport = FALSE; $ignoreport = TRUE; } else { if ($port_info) { $ptid = $port_info['iif_id'] . "-" . $port_info['oif_id']; if ($porttypeid != $ptid) { $comment .= ", Update Type {$ptid} -> {$porttypeid}"; $updateporttype = true; } } } /* ignore ports without an Connector */ if (!$sg_create_noconnector_ports && $ifsnmp->ifConnectorPresent($if) == 2) { $comment .= ", no Connector"; $createport = FALSE; } /* Allocate IPs ipv4 and ipv6 */ $ipaddresses = $ifsnmp->ipaddress($if); if (!empty($ipaddresses)) { $ipaddrcell = '<table>'; foreach ($ipaddresses as $ipaddr => $value) { $createipaddr = FALSE; $disableipaddr = FALSE; $ipaddrhref = ''; $linklocal = FALSE; $addrtype = $value['addrtype']; $maskbits = $value['maskbits']; $bcast = $value['bcast']; //echo "<br> - DEBUG: ip $ipaddr - $addrtype - $maskbits - $bcast<br>"; switch ($addrtype) { case 'ipv4z': case 'ipv4': if ($maskbits == 32) { $bcast = "host"; } $inputname = 'ip'; break; case 'ipv6z': $disableipaddr = TRUE; case 'ipv6': $inputname = 'ipv6'; if (ip_checkparse($ipaddr) === false) { /* format ipaddr for ip6_parse */ $ipaddr = preg_replace('/((..):(..))/', '\\2\\3', $ipaddr); $ipaddr = preg_replace('/%.*$/', '', $ipaddr); } if (ip_checkparse($ipaddr) === false) { continue 2; } // 2 because of switch /* ip_parse throws exception on parse errors */ $ip6_bin = ip_parse($ipaddr); $ipaddr = ip_format($ip6_bin); $node = constructIPRange($ip6_bin, $maskbits); $linklocal = $node['ip'] == 'fe80::'; $createipaddr = FALSE; break; } //switch $address = getIPAddress(ip_parse($ipaddr)); /* only if ip not already allocated */ if (empty($address['allocs'])) { if (!$ignoreport) { $createipaddr = TRUE; } } else { $disableipaddr = TRUE; $ipobject_id = $address['allocs'][0]['object_id']; $ipaddrhref = makeHref(array('page' => 'object', 'object_id' => $ipobject_id, 'hl_ipv4_addr' => $ipaddr)); } /* reserved addresses */ if ($address['reserved'] == 'yes') { $comment .= ', ' . $address['ip'] . ' reserved ' . $address['name']; $createipaddr = FALSE; // $disableipaddr = TRUE; } if ($ipaddr == '127.0.0.1' || $ipaddr == '0.0.0.0' || $ipaddr == '::1' || $ipaddr == '::' || $linklocal) { $createipaddr = FALSE; $disableipaddr = TRUE; } if ($ipaddr === $bcast) { $comment .= ", {$ipaddr} broadcast"; $createipaddr = FALSE; $disableipaddr = TRUE; } if (!$disableipaddr) { $ipaddrcheckbox = '<b style="background-color:' . ($disableipaddr ? '#ff0000' : '#00ff00') . '"><input class="' . $inputname . 'addr" style="background-color:' . ($disableipaddr ? '#ff0000' : '#00ff00') . '" type="checkbox" name="' . $inputname . 'addrcreate[' . $ipaddr . ']" value="' . $if . '"' . ($disableipaddr ? ' disabled="disabled"' : '') . ($createipaddr ? ' checked="checked"' : '') . '></b>'; } else { $ipaddrcheckbox = ''; } $ipaddrcell .= "<tr><td>{$ipaddrcheckbox}</td>"; if (!empty($ipaddrhref)) { $ipaddrcell .= "<td><a href={$ipaddrhref}>{$ipaddr}/{$maskbits}</a></td></tr>"; } else { $ipaddrcell .= "<td>{$ipaddr}/{$maskbits}</td></tr>"; } } // foreach unset($ipaddr); unset($value); $ipaddrcell .= '</table>'; // if(!empty($ipaddresses)) } else { $ipaddrcreatecheckbox = ''; $ipaddrcell = ''; } /* checkboxes for add port and add ip */ /* FireFox needs <b style=..>, IE and Opera work with <td style=..> */ if (!$disableport) { $portcreatecheckbox = '<b style="background-color:' . ($disableport ? '#ff0000' : '#00ff00') . '"><input class="ports" style="background-color:' . ($disableport ? '#ff0000' : '#00ff00') . '" type="checkbox" name="portcreate[' . $if . ']" value="' . $if . '"' . ($disableport ? ' disabled="disbaled"' : '') . ($createport ? ' checked="checked"' : '') . '></b>'; } else { $portcreatecheckbox = ''; } /* port type id */ /* add port type to newporttypeoptions if missing */ if (strpos(serialize($newporttypeoptions), $porttypeid) === FALSE) { $portids = explode('-', $porttypeid); $oif_name = $sg_portoifoptions[$portids[1]]; $newporttypeoptions['auto'] = array($porttypeid => "*{$oif_name}"); } $selectoptions = array('name' => "porttypeid[{$if}]"); if ($disableport && !$updateporttype) { $selectoptions['disabled'] = "disabled"; } $updateporttypecheckbox = ""; if ($updateporttype) { $updateporttypecheckbox = '<b style="background-color:#00ff00;">' . '<input class="porttype" style="background-color:#00ff00;" type="checkbox" name="updateporttype[' . $if . ']" value="' . $port_info['id'] . '"></b>'; } $porttypeidselect = getNiftySelect($newporttypeoptions, $selectoptions, $porttypeid); $updatelabelcheckbox = ""; if ($updatelabel) { $updatelabelcheckbox = '<b style="background-color:#00ff00;">' . '<input class="label" style="background-color:#00ff00;" type="checkbox" name="updatelabel[' . $if . ']" value="' . $port_info['id'] . ($updatelabel ? '" checked="checked"' : '') . '></b>'; } $comment = trim($comment, ', '); $ifsnmp->printifInfoTableRow($if, "<td>{$ipaddrcell}</td><td>{$portcreatecheckbox}</td><td>{$updatelabelcheckbox}</td><td>{$updatemaccheckbox}</td><td>{$updateporttypecheckbox}</td><td>{$porttypeidselect}</td><td nowrap=\"nowrap\">{$comment}</td>", $hrefs); } unset($if); /* preserve snmpconfig */ foreach ($_POST as $key => $value) { echo '<input type=hidden name=' . $key . ' value=' . $value . ' />'; } unset($key); unset($value); echo '<tr><td colspan=15 align="right"><p><input id="createbutton" type=submit value="Create Ports and IPs" onclick="return confirm(\'Create selected items?\')"></p></td></tr></tbody></table></form>'; }
public function generateConfig() { $parser = $this->prepareParser(); // return the expanded VS template using prepared $macros array $ret = $parser->expand("\n# LB (id == %LB_ID%): %LB_NAME%\n# VS (id == %VS_ID%): %VS_NAME%\n# RS (id == %RSP_ID%): %RSP_NAME%\nvirtual_server %VS_HEADER% {\n\tprotocol %PROTO%\n\t%GLOBAL_VS_CONF%\n\t%RSP_VS_CONF%\n\t%VS_VS_CONF%\n\t%SLB_VS_CONF%\n"); foreach (getRSListInPool($this->rs['id']) as $rs) { if ($rs['inservice'] != 'yes') { continue; } $parser->pushdefs(); // backup macros $this->prepareParserForRS($parser, $rs); // do not add v6 reals into v4 service and vice versa $rsip_bin = ip_checkparse($parser->expandMacro('RSIP')); if ($rsip_bin !== FALSE && strlen($rsip_bin) == strlen($this->vs['vip_bin'])) { foreach (explode(',', $parser->expandMacro('RSPORT')) as $rsp_token) { $port_range = explode('-', $rsp_token); if (count($port_range) < 1) { throw new InvalidArgException('RSPORT', $rsp_token, "invalid RS port range"); } if (count($port_range) < 2) { $port_range[] = $port_range[0]; } if ($port_range[0] > $port_range[1]) { throw new InvalidArgException('RSPORT', $rsp_token, "invalid RS port range"); } for ($rsport = $port_range[0]; $rsport <= $port_range[1]; $rsport++) { $parser->pushdefs(); $parser->addMacro('RSPORT', $rsport); $ret .= $parser->expand("\n\t%RS_PREPEND%\n\treal_server %RS_HEADER% {\n\t\t%GLOBAL_RS_CONF%\n\t\t%VS_RS_CONF%\n\t\t%RSP_RS_CONF%\n\t\t%SLB_RS_CONF%\n\t\t%RS_RS_CONF%\n\t}\n"); $parser->popdefs(); } } } $parser->popdefs(); // restore original (VS-driven) macros } $ret .= "}\n"; return $ret; }