diff --git a/PortProxyTool.Cli/Program.cs b/PortProxyTool.Cli/Program.cs index 6ddcd4c..17f9306 100644 --- a/PortProxyTool.Cli/Program.cs +++ b/PortProxyTool.Cli/Program.cs @@ -1,9 +1,113 @@ -namespace PortProxyTool.Cli; +using Spectre.Console; + +namespace PortProxyTool.Cli; internal static class Program { private static void Main(string[] args) { - Console.WriteLine("Hello, World!"); + if (args.Length == 0) + AnsiConsole.MarkupLine( + $"[red]用法[/][gray]: [/][white]{Environment.ProcessPath ?? Environment.GetCommandLineArgs()[0]} [red]<命令>[/] [gray][[<参数>]][/][/]"); + else + switch (args[0]) + { + case "get": + switch (args.Length) + { + case 1: + { + var portProxies = PortProxy.GetPortProxies(); + if (portProxies.Length == 0) + { + AnsiConsole.MarkupLine("[red]无端口代理[/]"); + } + else + { + AnsiConsole.MarkupLine("[white]端口代理列表[/][gray]: [/]"); + for (var index = 0; index < portProxies.Length; index++) + { + var portProxy = portProxies[index]; + var type = portProxy.Type switch + { + PortProxyType.V4ToV4 => "[green]IPv4[/] [white]->[/] [green]IPv4[/]", + PortProxyType.V4ToV6 => "[green]IPv4[/] [white]->[/] [blue]IPv6[/]", + PortProxyType.V6ToV6 => "[blue]IPv6[/] [white]->[/] [blue]IPv6[/]", + PortProxyType.V6ToV4 => "[blue]IPv6[/] [white]->[/] [green]IPv4[/]", + _ => throw new ArgumentOutOfRangeException() + }; + var targetPort = portProxy.TargetPort switch + { + null => "[red]未知[/]", + _ => portProxy.TargetPort.ToString() + }; + AnsiConsole.MarkupLine( + $"[gray]{index + 1}.[/] {type} [gray]|[/] [white]{portProxy.ListenAddress}[/][gray]:[/][white]{portProxy.ListenPort}[/][gray] -> [/][white]{portProxy.TargetAddress ?? "[red]未知[/]"}[/][gray]:[/][white]{targetPort}[/]"); + } + } + + break; + } + case 2: + { + PortProxyType type; + switch (args[1]) + { + case "v4tov4": + type = PortProxyType.V4ToV4; + break; + case "v4tov6": + type = PortProxyType.V4ToV6; + break; + case "v6tov6": + type = PortProxyType.V6ToV6; + break; + case "v6tov4": + type = PortProxyType.V6ToV4; + break; + default: + AnsiConsole.MarkupLine( + "[red]参数错误[/][gray]:[/] [white]接受的参数为 v4tov4, v4tov6, v6tov6, v6tov4[/]"); + return; + } + + var portProxies = PortProxy.GetPortProxies().Where(x => x.Type == type).ToArray(); + if (portProxies.Length == 0) + { + AnsiConsole.MarkupLine("[red]无端口代理[/]"); + } + else + { + var typeStr = type switch + { + PortProxyType.V4ToV4 => "[green]IPv4[/] [white]->[/] [green]IPv4[/]", + PortProxyType.V4ToV6 => "[green]IPv4[/] [white]->[/] [blue]IPv6[/]", + PortProxyType.V6ToV6 => "[blue]IPv6[/] [white]->[/] [blue]IPv6[/]", + PortProxyType.V6ToV4 => "[blue]IPv6[/] [white]->[/] [green]IPv4[/]", + _ => throw new ArgumentOutOfRangeException() + }; + AnsiConsole.MarkupLine($"[white]{typeStr} 端口代理列表[/][gray]: [/]"); + for (var index = 0; index < portProxies.Length; index++) + { + var portProxy = portProxies[index]; + var targetPort = portProxy.TargetPort switch + { + null => "[red]未知[/]", + _ => portProxy.TargetPort.ToString() + }; + AnsiConsole.MarkupLine( + $"[gray]{index + 1}.[/] {typeStr} [gray]|[/] [white]{portProxy.ListenAddress}[/][gray]:[/][white]{portProxy.ListenPort}[/][gray] -> [/][white]{portProxy.TargetAddress ?? "[red]未知[/]"}[/][gray]:[/][white]{targetPort}[/]"); + } + } + + break; + } + case 3: + AnsiConsole.MarkupLine("[red]用法错误[/]"); + break; + } + + break; + } } } \ No newline at end of file