Files

226 lines
12 KiB
C#

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]接受的参数为 <v4tov4/v4tov6/v6tov6/v6tov4> <监听地址> <监听端口> <目标地址> <目标端口>[/]");
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]接受的参数为 <v4tov4/v4tov6/v6tov6/v6tov4> <监听地址> <监听端口>[/]");
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]接受的参数为 <v4tov4/v4tov6/v6tov6/v6tov4> <监听地址> <监听端口> <目标地址> <目标端口>[/]");
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;
}
}
}