/// <summary> /// Initializes a new instance of the <see cref="Router"/> class. /// </summary> /// <param name="circuit">The circuit containing the router.</param> internal Router() { this.bandwidth = Bytes.Empty; this.digest = null; this.dirPort = -1; this.flags = RouterFlags.None; this.identity = null; this.ipAddress = null; this.nickname = null; this.orPort = -1; this.publication = DateTime.MinValue; }
/// <summary> /// Dispatches the command to the client control port and produces a <typeparamref name="T" /> response result. /// </summary> /// <param name="connection"></param> /// <returns> /// A <typeparamref name="T" /> object instance containing the response data. /// </returns> protected override GetRouterStatusResponse Dispatch(Connection connection) { if (identity == null) { return(new GetRouterStatusResponse(false, null)); } string request = string.Format("ns/id/{0}", identity); if (connection.Write("getinfo {0}", request)) { ConnectionResponse response = connection.Read(); if (!response.Success || !response.Responses[0].StartsWith(request, StringComparison.CurrentCultureIgnoreCase)) { return(new GetRouterStatusResponse(false, null)); } Router router = null; foreach (string line in response.Responses) { string stripped = line.Trim(); if (string.IsNullOrWhiteSpace(stripped)) { continue; } if (stripped.StartsWith("r")) { string[] values = stripped.Split(' '); if (values.Length < 9) { continue; } DateTime publication = DateTime.MinValue; if (!DateTime.TryParse(string.Format("{0} {1}", values[4], values[5]), out publication)) { publication = DateTime.MinValue; } int orPort = 0; if (!int.TryParse(values[7], out orPort)) { orPort = 0; } int dirPort = 0; if (!int.TryParse(values[8], out dirPort)) { dirPort = 0; } IPAddress ipAddress = null; if (!IPAddress.TryParse(values[6], out ipAddress)) { ipAddress = null; } router = new Router(); router.Digest = values[3]; router.DIRPort = dirPort; router.Identity = values[2]; router.IPAddress = ipAddress; router.Nickname = values[1]; router.ORPort = orPort; router.Publication = publication; continue; } if (stripped.StartsWith("s") && router != null) { string[] values = stripped.Split(' '); for (int i = 1, length = values.Length; i < length; i++) { RouterFlags flag = ReflectionHelper.GetEnumerator <RouterFlags, DescriptionAttribute>(attr => values[i].Equals(attr.Description, StringComparison.CurrentCultureIgnoreCase)); if (flag != RouterFlags.None) { router.Flags |= flag; } } continue; } if (stripped.StartsWith("w") && router != null) { string[] values = stripped.Split(' '); if (values.Length < 2 || !values[1].StartsWith("bandwidth=", StringComparison.CurrentCultureIgnoreCase)) { continue; } string[] value = values[1].Split(new[] { '=' }, 2); if (value.Length < 2) { continue; } int bandwidth; if (int.TryParse(value[1].Trim(), out bandwidth)) { router.Bandwidth = new Bytes((double)bandwidth, Bits.KB).Normalize(); } } } return(new GetRouterStatusResponse(true, router)); } return(new GetRouterStatusResponse(false, null)); }
/// <summary> /// Set the flags for a particular virtual LAN. /// </summary> /// <param name="routerVlanId">The virtual LAN id.</param> /// <param name="routerFlag"><see cref="RouterFlags"/></param> /// <returns>True if the flag is set, else false.</returns> public bool SetRouterFlag(int routerVlanId, RouterFlags routerFlag) { bool result = false; string flagDescription = RouterFlags.None == routerFlag ? "Disabling M and O" : "Setting {0}".FormatWith(routerFlag); Logger.LogInfo("{0} flag on router VLAN : {1}".FormatWith(flagDescription, routerVlanId)); 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)); // TODO: Remove multiple if else if (routerFlag == RouterFlags.Managed) { telnet.SendLine(Enum <RouterFlags> .Value(RouterFlags.Managed)); telnet.SendLine(("no {0}".FormatWith(Enum <RouterFlags> .Value(RouterFlags.Other)))); } else if (routerFlag == RouterFlags.Other) { telnet.SendLine(Enum <RouterFlags> .Value(RouterFlags.Other)); telnet.SendLine(("no {0}".FormatWith(Enum <RouterFlags> .Value(RouterFlags.Managed)))); } else if (routerFlag == RouterFlags.Both) { telnet.SendLine(Enum <RouterFlags> .Value(RouterFlags.Other)); telnet.SendLine(Enum <RouterFlags> .Value(RouterFlags.Managed)); } else { telnet.SendLine(("no {0}".FormatWith(Enum <RouterFlags> .Value(RouterFlags.Managed)))); telnet.SendLine(("no {0}".FormatWith(Enum <RouterFlags> .Value(RouterFlags.Other)))); } telnet.SendLine("wr mem"); Thread.Sleep(TimeSpan.FromSeconds(10)); telnet.SendLine("sh run vlan {0}".FormatWith(routerVlanId)); Thread.Sleep(TimeSpan.FromSeconds(10)); string 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); // TODO: Remove multiple if else's if (routerFlag == RouterFlags.Managed) { result = vlanData.Contains(Enum <RouterFlags> .Value(RouterFlags.Managed)) && !vlanData.Contains(Enum <RouterFlags> .Value(RouterFlags.Other)); } else if (routerFlag == RouterFlags.Other) { result = vlanData.Contains(Enum <RouterFlags> .Value(RouterFlags.Other)) && !vlanData.Contains(Enum <RouterFlags> .Value(RouterFlags.Managed)); } else if (routerFlag == RouterFlags.Both) { result = vlanData.Contains(Enum <RouterFlags> .Value(RouterFlags.Managed)) && vlanData.Contains(Enum <RouterFlags> .Value(RouterFlags.Other)); } else { result = !vlanData.Contains(Enum <RouterFlags> .Value(RouterFlags.Managed)) && !vlanData.Contains(Enum <RouterFlags> .Value(RouterFlags.Other)); } flagDescription = RouterFlags.None == routerFlag ? "disabled M and O" : "set {0}".FormatWith(routerFlag); if (result) { Logger.LogInfo("Successfully {0} flag on router VLAN : {1}".FormatWith(flagDescription, routerVlanId)); } else { Logger.LogInfo("Failed to {0} flag on router VLAN : {1}".FormatWith(flagDescription, routerVlanId)); } return(result); } }