using Spectre.Console; namespace PortProxyTool.Cli; internal static class Program { private static void Main(string[] args) { 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; } } }