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 "add": switch (args.Length) { case 6: var targetType = PortProxyUtil.GetPortProxyTypeByString(args[1]); if (targetType == null) { AnsiConsole.MarkupLine( "[red]参数错误[/][gray]:[/] [white]接受的第一个参数为 v4tov4, v4tov6, v6tov6, v6tov4[/]"); return; } if (!ushort.TryParse(args[3], out var listenPort)) { AnsiConsole.MarkupLine( "[red]参数错误[/][gray]:[/] [white]接受的第三个参数为 0 - 65535[/]"); return; } if (!ushort.TryParse(args[5], out var targetPort)) { AnsiConsole.MarkupLine( "[red]参数错误[/][gray]:[/] [white]接受的第五个参数为 0 - 65535[/]"); return; } var item = new PortProxyItem { Type = (PortProxyType)targetType, ListenAddress = args[2], ListenPort = listenPort, TargetAddress = args[4], TargetPort = targetPort }; var result = PortProxy.Add(item); AnsiConsole.MarkupLine(string.IsNullOrEmpty(result) ? "[green]添加成功[/]" : $"[red]添加失败[/][gray]:[/] [white]{result}[/]"); break; default: AnsiConsole.MarkupLine( "[red]参数错误[/][gray]:[/] [white]接受的参数为 <监听地址> <监听端口> <目标地址> <目标端口>[/]"); break; } return; case "remove": switch (args.Length) { case 4: var targetType = PortProxyUtil.GetPortProxyTypeByString(args[1]); var result = PortProxy.Remove(targetType, args[2], args[3]); AnsiConsole.MarkupLine(string.IsNullOrEmpty(result) ? "[green]删除成功[/]" : $"[red]删除失败[/][gray]:[/] [white]{result}[/]"); break; default: AnsiConsole.MarkupLine( "[red]参数错误[/][gray]:[/] [white]接受的参数为 <监听地址> <监听端口>[/]"); break; } return; case "set": switch (args.Length) { case 6: var targetType = PortProxyUtil.GetPortProxyTypeByString(args[1]); if (targetType == null) { AnsiConsole.MarkupLine( "[red]参数错误[/][gray]:[/] [white]接受的第一个参数为 v4tov4, v4tov6, v6tov6, v6tov4[/]"); return; } if (!ushort.TryParse(args[3], out var listenPort)) { AnsiConsole.MarkupLine( "[red]参数错误[/][gray]:[/] [white]接受的第三个参数为 0 - 65535[/]"); return; } if (!ushort.TryParse(args[5], out var targetPort)) { AnsiConsole.MarkupLine( "[red]参数错误[/][gray]:[/] [white]接受的第五个参数为 0 - 65535[/]"); return; } var item = new PortProxyItem { Type = (PortProxyType)targetType, ListenAddress = args[2], ListenPort = listenPort, TargetAddress = args[4], TargetPort = targetPort }; var result = PortProxy.Set(item); AnsiConsole.MarkupLine(string.IsNullOrEmpty(result) ? "[green]设置成功[/]" : $"[red]设置失败[/][gray]:[/] [white]{result}[/]"); break; default: AnsiConsole.MarkupLine( "[red]参数错误[/][gray]:[/] [white]接受的参数为 <监听地址> <监听端口> <目标地址> <目标端口>[/]"); break; } return; case "list": 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; } default: AnsiConsole.MarkupLine( "[red]用法错误[/][gray]:[/] [white]get [gray][[v4tov4/v4tov6/v6tov6/v6tov4]][/][/]"); break; } return; default: AnsiConsole.MarkupLine("[red]命令没有找到[/][gray]:[/] [white]接受的命令为 add, remove, set, list[/]"); return; } } }