/// <inheritdoc/> public void Normalize() { Labels = Labels ?? new Dictionary <string, string>(StringComparer.InvariantCultureIgnoreCase); Command = Command ?? new List <string>(); Args = Args ?? new List <string>(); Env = Env ?? new List <string>(); Groups = Groups ?? new List <string>(); Secrets = Secrets ?? new List <ServiceSecret>(); Configs = Configs ?? new List <ServiceConfig>(); Mounts = Mounts ?? new List <ServiceMount>(); HealthCheck = HealthCheck ?? new ServiceHealthCheck(); Hosts = Hosts ?? new List <string>(); Privileges?.Normalize(); HealthCheck?.Normalize(); DNSConfig?.Normalize(); foreach (var item in Secrets) { item?.Normalize(); } foreach (var item in Configs) { item?.Normalize(); } foreach (var item in Mounts) { item?.Normalize(); } }
/// <summary> /// CommandDns /// </summary> /// <param name="arguments">Arguments</param> public override ReturnInfo Execute(List <string> arguments) { try { var dnsClient = new DnsClient(); var tcpClient = new TcpClient(80); //Uri uri = new Uri(arguments[0]); Missing plugs dnsClient.Connect(DNSConfig.Server(0)); dnsClient.SendAsk(arguments[0]); Address address = dnsClient.Receive(); dnsClient.Close(); tcpClient.Connect(address, 80); string httpget = "GET / HTTP/1.1\r\n" + "User-Agent: Wget (CosmosOS)\r\n" + "Accept: */*\r\n" + "Accept-Encoding: identity\r\n" + "Host: " + arguments[0] + "\r\n" + "Connection: Keep-Alive\r\n\r\n"; tcpClient.Send(Encoding.ASCII.GetBytes(httpget)); var ep = new EndPoint(Address.Zero, 0); var data = tcpClient.Receive(ref ep); tcpClient.Close(); string httpresponse = Encoding.ASCII.GetString(data); Kernel.console.WriteLine(httpresponse); } catch (Exception ex) { Kernel.console.WriteLine("Exception: " + ex); } return(new ReturnInfo(this, ReturnCode.OK)); }
/// <summary> /// CommandDns /// </summary> /// <param name="arguments">Arguments</param> public override ReturnInfo Execute(List <string> arguments) { var xClient = new DnsClient(); string domainname; if (arguments.Count < 1 || arguments.Count > 2) { return(new ReturnInfo(this, ReturnCode.ERROR_ARG)); } else if (arguments.Count == 1) { xClient.Connect(DNSConfig.Server(0)); Kernel.console.WriteLine("DNS used : " + DNSConfig.Server(0).ToString()); xClient.SendAsk(arguments[0]); domainname = arguments[0]; } else { xClient.Connect(Address.Parse(arguments[0])); xClient.SendAsk(arguments[1]); domainname = arguments[1]; } Address address = xClient.Receive(); xClient.Close(); if (address == null) { return(new ReturnInfo(this, ReturnCode.ERROR, "Unable to find " + arguments[0])); } else { Kernel.console.WriteLine(domainname + " is " + address.ToString()); } return(new ReturnInfo(this, ReturnCode.OK)); }
/* * Method called to applied the differents options received in the DHCP packet ACK **/ /// <summary> /// Apply the new IP configuration received. /// </summary> /// <param name="Options">DHCPOption class using the packetData from the received dhcp packet.</param> /// <param name="message">Enable/Disable the displaying of messages about DHCP applying and conf. Disabled by default. /// </param> private void Apply(DHCPAck packet, bool message = false) { NetworkStack.RemoveAllConfigIP(); //cf. Roadmap. (have to change this, because some network interfaces are not configured in dhcp mode) [have to be done in 0.5.x] foreach (NetworkDevice networkDevice in NetworkDevice.Devices) { if (packet.Client.ToString() == null || packet.Client.ToString() == null || packet.Client.ToString() == null || packet.Client.ToString() == null) { throw new Exception("Parsing DHCP ACK Packet failed, can't apply network configuration."); } else { if (message) { Global.mDebugger.Send("[DHCP ACK][" + networkDevice.Name + "] Packet received, applying IP configuration..."); Global.mDebugger.Send(" IP Address : " + packet.Client.ToString()); Global.mDebugger.Send(" Subnet mask : " + packet.Subnet.ToString()); Global.mDebugger.Send(" Gateway : " + packet.Server.ToString()); Global.mDebugger.Send(" DNS server : " + packet.DNS.ToString()); } IPConfig.Enable(networkDevice, packet.Client, packet.Subnet, packet.Server); DNSConfig.Add(packet.DNS); if (message) { Global.mDebugger.Send("[DHCP CONFIG][" + networkDevice.Name + "] IP configuration applied."); asked = false; } } } Close(); }
/// <summary> /// CommandEcho /// </summary> /// <param name="arguments">Arguments</param> public override ReturnInfo Execute(List <string> arguments) { int PacketSent = 0; int PacketReceived = 0; int PacketLost = 0; int PercentLoss; Address source; Address destination = Address.Parse(arguments[0]); if (destination != null) { source = IPConfig.FindNetwork(destination); } else //Make a DNS request if it's not an IP { var xClient = new DnsClient(); xClient.Connect(DNSConfig.Server(0)); xClient.SendAsk(arguments[0]); destination = xClient.Receive(); xClient.Close(); if (destination == null) { return(new ReturnInfo(this, ReturnCode.ERROR, "Failed to get DNS response for " + arguments[0])); } source = IPConfig.FindNetwork(destination); } try { Console.WriteLine("Sending ping to " + destination.ToString()); var xClient = new ICMPClient(); xClient.Connect(destination); for (int i = 0; i < 4; i++) { xClient.SendEcho(); PacketSent++; var endpoint = new EndPoint(Address.Zero, 0); int second = xClient.Receive(ref endpoint, 4000); if (second == -1) { Console.WriteLine("Destination host unreachable."); PacketLost++; } else { if (second < 1) { Console.WriteLine("Reply received from " + endpoint.address.ToString() + " time < 1s"); } else if (second >= 1) { Console.WriteLine("Reply received from " + endpoint.address.ToString() + " time " + second + "s"); } PacketReceived++; } } xClient.Close(); } catch { return(new ReturnInfo(this, ReturnCode.ERROR, "Ping process error.")); } PercentLoss = 25 * PacketLost; Console.WriteLine(); Console.WriteLine("Ping statistics for " + destination.ToString() + ":"); Console.WriteLine(" Packets: Sent = " + PacketSent + ", Received = " + PacketReceived + ", Lost = " + PacketLost + " (" + PercentLoss + "% loss)"); return(new ReturnInfo(this, ReturnCode.OK)); }
/// <summary> /// CommandIPConfig /// </summary> /// <param name="arguments">Arguments</param> public override ReturnInfo Execute(List <string> arguments) { var xClient = new DHCPClient(); if (arguments[0] == "/release") { xClient.SendReleasePacket(); } else if (arguments[0] == "/ask") { if (xClient.SendDiscoverPacket() != -1) { Console.WriteLine("Configuration applied! Your local IPv4 Address is " + NetworkConfig.CurrentConfig.Value.IPAddress.ToString() + "."); } else { return(new ReturnInfo(this, ReturnCode.ERROR, "DHCP Discover failed. Can't apply dynamic IPv4 address.")); } } else if (arguments[0] == "/listnic") { foreach (var device in NetworkDevice.Devices) { switch (device.CardType) { case CardType.Ethernet: Console.WriteLine("Ethernet Card - " + device.NameID + " - " + device.Name + " (" + device.MACAddress + ")"); break; case CardType.Wireless: Console.WriteLine("Wireless Card - " + device.NameID + " - " + device.Name + " (" + device.MACAddress + ")"); break; } } } else if (arguments[0] == "/set") { if ((arguments.Count == 3) || (arguments.Count == 4)) // ipconfig /set eth0 192.168.1.2/24 {gw} { string[] adrnetwork = arguments[2].Split('/'); Address ip = Address.Parse(adrnetwork[0]); NetworkDevice nic = NetworkDevice.GetDeviceByName(arguments[1]); Address gw = null; if (arguments.Count == 4) { gw = Address.Parse(arguments[3]); } int cidr; try { cidr = int.Parse(adrnetwork[1]); } catch (Exception ex) { return(new ReturnInfo(this, ReturnCode.ERROR, ex.Message)); } Address subnet = Address.CIDRToAddress(cidr); if (nic == null) { return(new ReturnInfo(this, ReturnCode.ERROR, "Couldn't find network device: " + arguments[1])); } if (ip != null && subnet != null && gw != null) { IPConfig.Enable(nic, ip, subnet, gw); Console.WriteLine("Config OK!"); } else if (ip != null && subnet != null) { IPConfig.Enable(nic, ip, subnet, ip); Console.WriteLine("Config OK!"); } else { return(new ReturnInfo(this, ReturnCode.ERROR, "Can't parse IP addresses (make sure they are well formated).")); } } else { return(new ReturnInfo(this, ReturnCode.ERROR, "Usage : ipconfig /set {device} {IPv4/CIDR} {Gateway|null}")); } } else if (arguments[0] == "/nameserver") { if (arguments[1] == "-add") { DNSConfig.Add(Address.Parse(arguments[2])); Console.WriteLine(arguments[2] + " has been added to nameservers."); } else if (arguments[1] == "-rem") { DNSConfig.Remove(Address.Parse(arguments[2])); Console.WriteLine(arguments[2] + " has been removed from nameservers list."); } else { return(new ReturnInfo(this, ReturnCode.ERROR, "Usage : ipconfig /nameserver {add|remove} {IP}")); } } else { return(new ReturnInfo(this, ReturnCode.ERROR, "Wrong usage, please type: ipconfig /help")); } return(new ReturnInfo(this, ReturnCode.OK)); }
protected override void Run() { NetworkStack.Update(); Console.Write("> "); var input = Console.ReadLine(); if (input.ToLower().StartsWith("sendpkt")) { var x = new UdpClient(128); x.Connect(Address.Zero, 128); x.Send(Encoding.ASCII.GetBytes("Hello from cosmos!")); x.Close(); } else if (input.ToLower().StartsWith("getip")) { Console.WriteLine("Connecting to DNS Server"); xClient.Connect(new Address(8, 8, 4, 4)); Console.WriteLine("Asking IP for github.com"); xClient.SendAsk("github.com"); Console.WriteLine("Waiting for data"); var addr = xClient.Receive(); if (addr == null) { Console.WriteLine("Error: connection timed out"); } else { Console.WriteLine("Got data: " + addr.ToString()); } } else if (input.ToLower().StartsWith("gettime")) { NTPClient client = new NTPClient(); var t = client.GetNetworkTime(); if (t == null) { Console.WriteLine("NTPClient.GetNetworkTime() Returned null!"); } else { Console.WriteLine("NTPClient.GetNetworkTime() Returned " + t); } } else if (input.ToLower().StartsWith("ping")) { string s = input.Replace("ping ", ""); if (input.ToLower() == "ping" | string.IsNullOrEmpty(s)) { Console.WriteLine("Invaild synax. Usage: ping <ip address or site>"); return; } Address dest = Address.Parse(s); if (dest == null) { //make a DNS request xClient.Connect(DNSConfig.Server(0)); xClient.SendAsk(s); dest = xClient.Receive(); xClient.Close(); if (dest == null) { Console.WriteLine("ERROR: Cannot find " + s); return; } } int PacketSent = 0; int PacketReceived = 0; int PacketLost = 0; int PercentLoss; try { Console.WriteLine("Sending ping to " + dest.ToString()); var xClient = new ICMPClient(); xClient.Connect(dest); for (int i = 0; i < 4; i++) { xClient.SendEcho(); PacketSent++; var endpoint = new EndPoint(Address.Zero, 0); int second = xClient.Receive(ref endpoint, 4000); if (second == -1) { Console.WriteLine("Destination host unreachable."); PacketLost++; } else { if (second < 1) { Console.WriteLine("Reply received from " + endpoint.address.ToString() + " time < 1s"); } else if (second >= 1) { Console.WriteLine("Reply received from " + endpoint.address.ToString() + " time " + second + "s"); } PacketReceived++; } } xClient.Close(); } catch (Exception x) { Console.WriteLine("Ping error: " + x.Message); } PercentLoss = 25 * PacketLost; Console.WriteLine(); Console.WriteLine("Ping statistics for " + dest.ToString() + ":"); Console.WriteLine(" Packets: Sent = " + PacketSent + ", Received = " + PacketReceived + ", Lost = " + PacketLost + " (" + PercentLoss + "% loss)"); } else if (input.ToLower().StartsWith("ipconfig")) { ipconfig(); } else if (input.ToLower().StartsWith("help")) { Console.WriteLine("MishaNetworkDemoOS Commands"); Console.WriteLine("ipconfig - Gets current IP config"); Console.WriteLine("getip - Gets IP address of github.com"); Console.WriteLine("sendpkt - Sends a packet"); Console.WriteLine("gettime - Get UTC time from time.windows.com"); } else if (string.IsNullOrEmpty(input)) { } else { Console.WriteLine("Unknown command."); } NetworkStack.Update(); }