-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathmain.go
184 lines (162 loc) · 4.7 KB
/
main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
package main
import (
"fmt"
"os"
"strconv"
"net/url"
"github.com/WhatTheSlime/NetGo/pkg"
"github.com/spf13/pflag"
)
var (
Command string
Hostname string
KeepOpen bool
Listen bool
MaxConns int
Port int
Proxy string
ProxyUrl url.URL
RecvOnly bool
SendOnly bool
TLS bool
TLSCert string
TLSKey string
Verbose bool
Version bool
UDP bool
)
const DefaulPort = 31337
// Check port validity.
func checkPort(port string) (int, error) {
intPort, err := strconv.Atoi(port)
if err != nil || intPort < 1 || intPort > 65536 {
return intPort, fmt.Errorf("Invalid port number \"%d\".", Port)
}
return intPort, nil
}
// Check arguments validity.
func checkArgs(args []string) error {
// Check for displaying version only
if Version {
return fmt.Errorf("NetGo Version %s (%s)", netgo.VERSION, netgo.GITHUB)
}
// Check host and ports arguments
switch {
case len(args) == 2:
Hostname = args[0]
intPort, err := checkPort(args[1]);
if err != nil {return err} else {Port = intPort}
case len(args) == 1 && Listen:
intPort, err := checkPort(args[0]);
if err != nil {
Hostname = args[0]
Port = DefaulPort
} else {
Hostname = "0.0.0.0"
Port = intPort
}
case len(args) == 1:
Hostname = args[0]
Port = DefaulPort
case len(args) == 0 && Listen:
Hostname = "0.0.0.0"
Port = DefaulPort
case len(args) == 0:
return fmt.Errorf("You must specify a host to connect to.")
default:
return fmt.Errorf("Too many arguments.")
}
// Check non listening options
if ! Listen {
if KeepOpen {
return fmt.Errorf("--listen option is mandatory for --keep-open.")
}
if Proxy != "" {
url, err := url.Parse(Proxy); if err != nil {
return fmt.Errorf("Proxy bad format: %s\n", err)
}
ProxyUrl = *url
}
} else {
if Proxy != "" {
return fmt.Errorf("--listen cannot be used with --proxy.")
}
}
// Check TLS args
if (len(TLSCert) > 0) != (len(TLSKey) > 0) {
return fmt.Errorf(
"The --tls-key and --tls-cert options must be used together.")
}
return nil
}
// Add persistent flags
func initFlags() {
pflag.StringVarP(
&Command, "exec", "e", "", "Executes the given command")
pflag.BoolVarP(
&KeepOpen, "keep-open", "k", false,
"Accept multiple connections in listen mode")
pflag.BoolVarP(
&Listen, "listen", "l", false,
"Bind and listen for incoming connections")
pflag.IntVarP(
&MaxConns, "max-conns", "m", 50,
"Maximum simultaneous connections (default: 50)")
pflag.StringVarP(
&Proxy, "proxy", "x", "",
"Specify url of host proxy through " +
"http://<username>:<password>@<host>:<port>")
pflag.BoolVarP(
&RecvOnly, "recv", "", false,
"Only receive data, never send anything")
pflag.BoolVarP(
&SendOnly, "send", "", false,
"Only send data, ignoring received; quit on EOF")
pflag.BoolVar(
&TLS, "ssl", false, "Connect or listen with SSL/TLS")
pflag.StringVar(
&TLSCert, "ssl-cert", "", "Load SSL Certificate")
pflag.StringVar(
&TLSKey, "ssl-key", "", "Load SSL key")
pflag.BoolVarP(
&Verbose, "verbose", "v", false, "Set verbose output")
pflag.BoolVar(
&Version, "version", false, "Display version information and exit")
// pflag.BoolVarP(
// &UDP, "udp", "u", false, "Use UDP instead of default TCP")
}
// Program entry point.
func main() {
initFlags()
pflag.ErrHelp = nil
pflag.Usage = func() {
fmt.Fprintf(os.Stderr, "Usage: netgo [options] [hostname] [port]\n\n")
pflag.PrintDefaults()
fmt.Fprintf(os.Stderr, "\n")
os.Exit(1)
}
pflag.Parse()
err := checkArgs(pflag.Args());
if err != nil {
fmt.Println(err)
os.Exit(1)
} else {
protocol := "tcp"
if UDP {
protocol = "udp"
}
nObj := netgo.NetObject{
Type: protocol,
Service: fmt.Sprintf("%s:%d", Hostname, Port),
}
if Listen {
nObj.RunServer(
Command, KeepOpen, MaxConns, RecvOnly, SendOnly,
TLS, TLSCert, TLSKey)
} else {
nObj.RunClient(
Command, RecvOnly, SendOnly, ProxyUrl,
TLS, TLSCert, TLSKey)
}
}
}