Should be similar on other switch types.
- Retrieve current settings about tagged/untagged VLAN
- Modify VLAN settings
- Write it back
- Save switch state
Be sure not to cut yourself from switch management 🙂
You should have SNMP enabled and configured on switch (user with permission to read and write). We are using there two functions to decompose and compose HEX-STRING readed from switch. Also SNMP PHP package need to be compiled and enabled.
Full example, we are removing port 10 from VLAN1 and adding port 9 tagged:
<?php
// FUNCTIONS
/**
* Sorry for this ugly thing
* @return string
*/
function fillWithZeroesFromLeftSide($text, $chars)
{
$string = "";
if(strlen($text) < $chars)
{
// How many zeroes to add?
$needTo = $chars-(strlen($text));
// Make string to glue $text with
for($a = 0; $a < $needTo; $a++)
{
$string .= "0";
}
}
return $string.$text;
}
/**
* Returns array with ports which are in VLAN
* @param $hex "FF 7F FE F0 00 00 00 00"
* @return array
*/
function hexToPortArray($hex)
{
$p = array();
// "sanitize"
$hex = str_replace(" ", "", trim($hex));
// For every char in HEX STRING, do decomposition
for($level = 0; $level < strlen($hex); $level++)
{
// Take char
$part = substr($hex, $level, 1);
// Leading "B" is there to have right offset starting with 1
$binary = "B".fillWithZeroesFromLeftSide((string)base_convert($part, 16, 2), 4);
// Decompose
for($a = 1; $a <= 4; $a++)
{
$value = substr($binary, $a, 1);
if($value == "1")
{
$p[($level*4)+$a] = 1;
}
else
{
$p[($level*4)+$a] = 0;
}
}
}
return $p;
}
/**
* Returns back HEX STRING with ports
* @param $pole Array
* @return string
*/
function portArrayToHex($array)
{
$o = "";
// Take element from array
for($i = 1; $i <= count($array); $i++)
{
// Convert it to HEX it with 3 elements that follows
$o .= base_convert($array[$i].$array[$i+1].$array[$i+2].$array[$i+3], 2, 16);
// Skip those 3 elements
$i = $i + 3;
}
return strtoupper($o);
}
// EXAMPLE
// Connect to switch
$snmp = new \snmp(SNMP::VERSION_2C, $IP, "private", "200000" , 1);
// We dont need SNMP type hint in returned value
snmp_set_valueretrieval(SNMP_VALUE_PLAIN);
// VLAN number is the last part of OID
$VLAN1taggedOID = ".1.3.6.1.4.1.171.10.76.20.1.7.6.1.2.1";
$VLAN1untaggedOID = ".1.3.6.1.4.1.171.10.76.20.1.7.6.1.4.1";
// Retrieve and make an array with ports from returned value
$VLAN1tagged = hexToPortArray($snmp->get($VLAN1taggedOID));
$VLAN1untagged = hexToPortArray($snmp->get($VLAN1untaggedOID));
// We got array, where key is port number and value is if VLAN is present
// (1) or not (0) in (un)tagged state
// Now, we want port 10 removed from VLANs and port 9 to have tagged.
// To be sure, we remove both ports from (un)tagged VLANS and
// just add port 9 to tagged VLAN
$VLAN1tagged[9] = 0;
$VLAN1tagged[10] = 0;
$snmp->set($VLAN1taggedOID, "x", portArrayToHex($VLAN1tagged));
$VLAN1untagged[9] = 0;
$VLAN1untagged[10] = 0;
$snmp->set($VLAN1untaggedOID, "x", portArrayToHex($VLAN1untagged));
// Adding port 9 tagged
$VLAN1tagged[9] = 1;
$snmp->set($VLAN1taggedOID, "x", portArrayToHex($VLAN1tagged));
// Save configuration
var_dump($snmp->set(".1.3.6.1.4.1.171.10.76.20.1.1.10.0", "i", "1"));
Napsat komentář