/// <summary> /// Construct the VLan structure for the data /// </summary> /// <param name="line">VLan data</param> /// <param name="vlanIdentifierData">Data from "show vlan" telnet command which contains VLAn numbers information.</param> /// <param name="vlanDetails"><see cref="RouterVirtualLAN"/></param> private static bool GetVLan(string line, string vlanIdentifierData, out RouterVirtualLAN vlanDetails) { Regex ipAddressRegex = new Regex(@"\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b"); bool isIPAddress = false; vlanDetails = new RouterVirtualLAN(); string[] localData; if (line.Contains('|')) { vlanDetails.Name = line.Split('|')[0].Trim(); localData = line.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); for (int j = 0; j < localData.Length; j++) { //IP Config Method if ((localData[j].StartsWith("DHCP", StringComparison.CurrentCulture)) || (localData[j].StartsWith("Manual", StringComparison.CurrentCulture))) { vlanDetails.ConfigMethod = localData[j]; } //IP Address if (!isIPAddress && ipAddressRegex.IsMatch(localData[j])) { vlanDetails.IPv4Address = IPAddress.Parse(localData[j]); isIPAddress = true; continue; } //Subnet mask if (isIPAddress && ipAddressRegex.IsMatch(localData[j])) { vlanDetails.SubnetMask = IPAddress.Parse(localData[j]); } } // Get the Virtual LAN identifier vlanDetails.Identifier = GetVlanIdentifier(vlanIdentifierData, vlanDetails.Name); return(true); } return(false); }
/// <summary> /// Set the Lease time. /// </summary> /// <param name="routerVlanId">The virtual LAN id.</param> /// <param name="validLifeTime"><see cref="LeaseTime"/></param> /// <param name="preferredLifeTime">The lease time.</param> /// <returns>True if the lease time is set, else false.</returns> public bool SetLeaseTime(int routerVlanId, TimeSpan validLifeTime, TimeSpan preferredLifeTime) { RouterVirtualLAN routerVlan = GetVirtualLanDetails(routerVlanId); Collection <RouterIPv6Details> ipv6Details = routerVlan.IPv6Details; string setLifeTime = "ipv6 nd ra prefix {0}/{1} {2} {3}\n"; string clearLifeTime = "no ipv6 nd ra prefix {0}/{1}\n"; string command = string.Empty; if (validLifeTime.TotalSeconds < preferredLifeTime.TotalSeconds) { Logger.LogInfo("Valid life time should be more than preferred life time."); return(false); } foreach (RouterIPv6Details v6Details in ipv6Details) { command += clearLifeTime.FormatWith(v6Details.AddressPrefix, v6Details.PrefixLength); command += setLifeTime.FormatWith(v6Details.AddressPrefix, v6Details.PrefixLength, validLifeTime.TotalSeconds, preferredLifeTime.TotalSeconds); } using (TelnetIpc telnet = new TelnetIpc(_adress.ToString(), 23)) { telnet.Connect(); Thread.Sleep(TimeSpan.FromSeconds(5)); telnet.SendLine(_userName); Thread.Sleep(TimeSpan.FromSeconds(5)); telnet.SendLine(_password); Thread.Sleep(TimeSpan.FromSeconds(5)); telnet.SendLine("en"); telnet.SendLine("conf t"); telnet.SendLine("vlan {0}".FormatWith(routerVlanId)); telnet.SendLine(command); telnet.SendLine("wr mem"); Thread.Sleep(TimeSpan.FromSeconds(10)); } routerVlan = GetVirtualLanDetails(routerVlanId); return(routerVlan.IPv6Details.Any(x => !x.ValidLeaseTime.Equals(validLifeTime.TotalSeconds)) && routerVlan.IPv6Details.Any(x => !x.PreferredLeaseTime.Equals(preferredLifeTime.TotalSeconds))); }
/// <summary> /// Gets the details of a virtual LAN. /// </summary> /// <param name="routerVlanId">The virtual LAN id.</param> /// <returns><see cref="RouterVirtualLAN"/></returns> public RouterVirtualLAN GetVirtualLanDetails(int routerVlanId) { string vlanData = string.Empty; RouterVirtualLAN routerVlan = RouterVlans.Where(x => x.Identifier.Equals(routerVlanId)).FirstOrDefault(); using (TelnetIpc telnet = new TelnetIpc(_adress.ToString(), 23)) { telnet.Connect(); Thread.Sleep(TimeSpan.FromSeconds(5)); telnet.SendLine(_userName); Thread.Sleep(TimeSpan.FromSeconds(5)); telnet.SendLine(_password); Thread.Sleep(TimeSpan.FromSeconds(5)); telnet.SendLine("en"); Thread.Sleep(TimeSpan.FromSeconds(5)); telnet.SendLine("show run vlan {0}".FormatWith(routerVlanId)); Thread.Sleep(TimeSpan.FromSeconds(10)); vlanData = telnet.ReceiveUntilMatch("$"); while (vlanData.Contains("more", StringComparison.CurrentCultureIgnoreCase)) { vlanData = vlanData.Remove(vlanData.IndexOf("-- more", StringComparison.CurrentCultureIgnoreCase)); telnet.SendLine(" "); Thread.Sleep(TimeSpan.FromSeconds(10)); vlanData += telnet.ReceiveUntilMatch("$"); } vlanData = vlanData.Replace(controlCharacters, string.Empty).Replace("/r", string.Empty).Trim(); } GetVlanDetails(vlanData, ref routerVlan); return(routerVlan); }
/// <summary> /// Get the additional details of a VLan /// </summary> /// <param name="vlanData">The data obtained with the command "sh run vlan vlan number".</param> /// <param name="routerVlan"></param> /// <returns><see cref="RouterVirtualLAN"/></returns> private static void GetVlanDetails(string vlanData, ref RouterVirtualLAN routerVlan) { vlanData = vlanData.Replace(controlCharacters, string.Empty).Replace("/r", string.Empty).Trim(); string[] vlanDetails = vlanData.Split(new char[] { '\n' }); // Get all the IPv4 details string ipv4Details = Array.Find(vlanDetails, x => x.Contains("ip address", StringComparison.CurrentCultureIgnoreCase)); if (null != ipv4Details) { routerVlan.IPv4Address = GetIPAddress(ipv4Details); routerVlan.SubnetMask = GetIPAddress(ipv4Details, true); } string ipv6StatusDetails = Array.Find(vlanDetails, x => x.Contains("ipv6 enable", StringComparison.CurrentCultureIgnoreCase)); if (null != ipv6StatusDetails) { routerVlan.IPv6Status = true; } // Get all the IPv6 addresses string[] ipv6Addresses = Array.FindAll(vlanDetails, x => x.Contains("ipv6 address", StringComparison.CurrentCultureIgnoreCase) && !x.Contains("/") && !x.Contains("link-local", StringComparison.CurrentCultureIgnoreCase)); Collection <IPAddress> IPv6AddressList = new Collection <IPAddress>(); if (null != ipv6Addresses && ipv6Addresses.Count() > 0) { foreach (string ipv6Address in ipv6Addresses) { IPv6AddressList.Add(GetIPAddress(ipv6Address)); } } routerVlan.IPv6Details = GetIPv6Details(vlanDetails, IPv6AddressList); // Get the ipv4 helper address string ipv4helperAddressData = Array.Find(vlanDetails, x => x.Contains("ip helper-address", StringComparison.CurrentCultureIgnoreCase)); if (null != ipv4helperAddressData) { routerVlan.IPv4HelperAddress = GetIPAddress(ipv4helperAddressData); } // Get IPv6 helper address string ipv6HelperAddress = Array.Find(vlanDetails, x => x.Contains("ipv6 helper-address", StringComparison.CurrentCultureIgnoreCase)); if (null != ipv6HelperAddress) { routerVlan.IPv6HelperAddress = GetIPAddress(ipv6HelperAddress); } // Get Link Local address string LinkLocalAddress = Array.Find(vlanDetails, x => x.Contains("link-local", StringComparison.CurrentCultureIgnoreCase)); if (null != LinkLocalAddress) { routerVlan.LinkLocalAddress = GetIPAddress(LinkLocalAddress); } }
/// <summary> /// Disable IPv6 for a particular virtual LAN. /// </summary> /// <param name="routerVlanId">The virtual LAN id.</param> /// <returns>True if IPv6 is disabled, else false.</returns> public bool DisableIPv6Address(int routerVlanId) { Logger.LogInfo("Disabling IPv6 addresses in router."); RouterVirtualLAN routerVlan = GetVirtualLanDetails(routerVlanId); Collection <RouterIPv6Details> routerIpv6Details = routerVlan.IPv6Details; SetRouterFlag(routerVlanId, RouterFlags.None); // TODO: Remove hard coded prefix value. string ipData = "no ipv6 address {0}/{1}\n"; string prefixData = "no ipv6 nd ra prefix {0}/{1}\n"; string disableIPv6 = "no ipv6 enable\n"; string reachableTime = "no ipv6 nd reachable-time\n"; string reachableTimera = "no ipv6 nd ra reachable-time\n"; string linklocal = "no ipv6 address {0} link-local\n".FormatWith(routerVlan.LinkLocalAddress); // string ipv6helperAddress = "no ipv6 helper-address unicast {0}\n".FormatWith(routerVlan.IPv6HelperAddress); string command = string.Empty; command += disableIPv6; foreach (RouterIPv6Details ipv6Details in routerIpv6Details) { if (!ipv6Details.IPv6Address.Equals(IPAddress.IPv6None)) { command += ipData.FormatWith(ipv6Details.IPv6Address, ipv6Details.PrefixLength); } command += prefixData.FormatWith(ipv6Details.AddressPrefix, ipv6Details.PrefixLength); } command += reachableTime; command += reachableTimera; command += linklocal; // command += ipv6helperAddress; using (TelnetIpc telnet = new TelnetIpc(_adress.ToString(), 23)) { telnet.Connect(); Thread.Sleep(TimeSpan.FromSeconds(5)); telnet.SendLine(_userName); Thread.Sleep(TimeSpan.FromSeconds(5)); telnet.SendLine(_password); Thread.Sleep(TimeSpan.FromSeconds(5)); telnet.SendLine("en"); telnet.SendLine("conf t"); telnet.SendLine("vlan {0}".FormatWith(routerVlanId)); telnet.SendLine(command); telnet.SendLine("wr mem"); Thread.Sleep(TimeSpan.FromSeconds(10)); } // Validation routerVlan = GetVirtualLanDetails(routerVlanId); if (routerVlan.IPv6Details.Count == 0) { Logger.LogInfo("Successfully disabled IPv6 addresses on VLAN: {0}".FormatWith(routerVlanId)); return(true); } else { Logger.LogInfo("Failed to disable IPv6 addresses on VLAN: {0}".FormatWith(routerVlanId)); return(false); } }
/// <summary> /// Enable IPv6 for a particular virtual LAN. /// </summary> /// <param name="routerVlanId">The virtual LAN id.</param> /// <param name="ipv6Addresses">List of addresses to be added for the virtual LAN.</param> /// <returns>True if IPv6 is enabled, else false.</returns> public bool EnableIPv6Address(int routerVlanId, Collection <IPAddress> ipv6Addresses) { if (null == ipv6Addresses || ipv6Addresses.Count == 0) { Logger.LogInfo("IPv6 addresses can not be empty."); return(false); } Logger.LogInfo("Enabling IPv6 addresses in router."); // TODO: Remove hard coded prefix value. string ipData = "ipv6 address {0}/64\n"; string prefixData = "ipv6 nd ra prefix {0}/{1} {2} {3}\n"; string command = string.Empty; foreach (IPAddress ipv6Address in ipv6Addresses) { command += ipData.FormatWith(ipv6Address.ToString()); //TODO: Get a logic to fetch the address prefix command += prefixData.FormatWith(GetPrefix(ipv6Address), 64, VALID_LIFE_TIME, PREFERRED_LIFE_TIME); } using (TelnetIpc telnet = new TelnetIpc(_adress.ToString(), 23)) { telnet.Connect(); Thread.Sleep(TimeSpan.FromSeconds(5)); telnet.SendLine(_userName); Thread.Sleep(TimeSpan.FromSeconds(5)); telnet.SendLine(_password); Thread.Sleep(TimeSpan.FromSeconds(5)); telnet.SendLine("en"); telnet.SendLine("conf t"); telnet.SendLine("vlan {0}".FormatWith(routerVlanId)); telnet.SendLine(command); telnet.SendLine("wr mem"); Thread.Sleep(TimeSpan.FromSeconds(10)); } // Validation RouterVirtualLAN routerVlan = GetVirtualLanDetails(routerVlanId); bool isv6AddressPresesnt = false; foreach (IPAddress address in ipv6Addresses) { if (null == routerVlan.IPv6Details.Where(x => x.IPv6Address.Equals(address)).FirstOrDefault()) { isv6AddressPresesnt = false; Logger.LogInfo("Failed to enable IPv6 addresses on VLAN: {0}".FormatWith(routerVlanId)); return(false); } else { isv6AddressPresesnt = true; } } if (isv6AddressPresesnt) { Logger.LogInfo("Successfully enabled IPv6 addresses on VLAN: {0}".FormatWith(routerVlanId)); } return(isv6AddressPresesnt); }