Exemplo n.º 1
0
 /// <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;
 }
Exemplo n.º 2
0
        /// <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));
        }
Exemplo n.º 3
0
        /// <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);
            }
        }