1
1
package main
2
2
3
3
import (
4
+ "bufio"
5
+ "ehang.io/nps/lib/crypt"
4
6
"flag"
5
7
"fmt"
6
8
"os"
@@ -18,6 +20,7 @@ import (
18
20
"ehang.io/nps/lib/version"
19
21
"github.com/astaxie/beego/logs"
20
22
"github.com/ccding/go-stun/stun"
23
+ "github.com/fatih/color"
21
24
"github.com/kardianos/service"
22
25
)
23
26
@@ -252,6 +255,266 @@ func run() {
252
255
if * configPath == "" {
253
256
* configPath = common .GetConfigPath ()
254
257
}
255
- go client .StartFromFile (* configPath )
258
+
259
+ // 判断路径下是否有配置文件
260
+ if common .FileExists (* configPath ) {
261
+ logs .Info ("配置文件模式启动" )
262
+ go client .StartFromFile (* configPath )
263
+ } else {
264
+ // 无配置文件模式双击运行
265
+ printSlogan ()
266
+ inputCmd ()
267
+ }
268
+ }
269
+ }
270
+
271
+ func printSlogan () {
272
+ green := color .New (color .FgGreen ).SprintFunc ()
273
+ // 第一次输入,如果输入 1,2,3,4 则需要输入秘钥,否则
274
+
275
+ fmt .Printf ("%s" , green ("" ))
276
+
277
+ fmt .Printf ("\033 [32;0m###########################################################\n " )
278
+ fmt .Printf ("\033 [32;0m# \033 [31mNPS内网穿透客户端\033 [0m #\n " )
279
+ fmt .Printf ("\033 [32;0m# #\n " )
280
+ fmt .Printf ("\033 [32;0m#\033 [32m 地址:\033 [31;0mhttps://github.com/yisier/nps\033 [0m #\n " )
281
+ fmt .Printf ("\033 [32;0m#\033 [32m 提示:\033 [32;0m1、涉及到系统服务的需要以管理员身份运行\033 [0m\033 [32;0m #\n " )
282
+ fmt .Printf ("\033 [32;0m#\033 [32m \033 [32;0m2、直接启动或[注册系统服务]需要使用[快捷启动命令]\033 [0m\033 [32;0m #\n " )
283
+ fmt .Printf ("\033 [32;0m#\033 [32m \033 [32;0m3、其他命令如卸载/启动/停止只需要输入[vkey]\033 [0m\033 [32;0m #\n " )
284
+ fmt .Printf ("\033 [32;0m###########################################################\n " )
285
+ fmt .Printf ("\033 [0m" ) // 重置颜色
286
+
287
+ fmt .Printf ("\n " )
288
+
289
+ fmt .Printf ("\u001B [32m输入[1]\u001B [0m - 注册系统服务\n " )
290
+ fmt .Printf ("\u001B [32m输入[2]\u001B [0m - 卸载系统服务\n " )
291
+ fmt .Printf ("---------------------\n " )
292
+ fmt .Printf ("\u001B [32m输入[3]\u001B [0m - 启动系统服务\n " )
293
+ fmt .Printf ("\u001B [32m输入[4]\u001B [0m - 停止系统服务\n " )
294
+ fmt .Printf ("---------------------\n " )
295
+ fmt .Printf ("\u001B [32m输入[0]\u001B [0m - 退出\n " )
296
+ fmt .Printf ("---------------------\n " )
297
+ fmt .Printf ("直接输入[快捷启动命令]则是启动隧道,多个[快捷启动命令]用英文逗号拼接\n " )
298
+ fmt .Printf ("\n " )
299
+ }
300
+
301
+ func inputCmd () {
302
+
303
+ var flag string
304
+ fmt .Printf ("请输入:" )
305
+
306
+ stdin := bufio .NewReader (os .Stdin )
307
+ _ , err := fmt .Fscanln (stdin , & flag )
308
+ if err != nil {
309
+ fmt .Println ("输入有误" )
310
+ } else {
311
+ if flag == "0" {
312
+ os .Exit (0 )
313
+ }
314
+
315
+ flag := strings .Replace (flag , " " , "" , - 1 )
316
+
317
+ // 如果输入不等于 1,2,3,4,则启动隧道
318
+ if flag != "1" && flag != "2" && flag != "3" && flag != "4" {
319
+
320
+ vkeys := strings .Split (flag , `,` )
321
+ var cmdArray []string
322
+
323
+ for _ , key := range vkeys {
324
+ startCmd , err := crypt .Base64Decoding (key )
325
+ if err != nil {
326
+ fmt .Println ("快捷启动命令解析失败" )
327
+ inputCmd ()
328
+ return
329
+ }
330
+
331
+ cmdArray = append (cmdArray , startCmd )
332
+ }
333
+
334
+ for _ , item := range cmdArray {
335
+ startNpcServer (item )
336
+ }
337
+
338
+ } else {
339
+ systemService (flag )
340
+ }
341
+ }
342
+ }
343
+
344
+ func startNpcServer (startCmd string ) {
345
+ var serAddr string
346
+ var vkey string
347
+ array := strings .Fields (startCmd )
348
+ serAddr = array [0 ]
349
+ vkey = array [1 ]
350
+
351
+ go func () {
352
+ for {
353
+ logs .Info ("start cmd:-server=" + serAddr + " -vkey=" + vkey )
354
+ logs .Info ("the version of client is %s, the core version of client is %s" , version .VERSION , version .GetVersion ())
355
+ client .NewRPClient (serAddr , vkey , * connType , * proxyUrl , nil , * disconnectTime ).Start ()
356
+ logs .Info ("Client closed! It will be reconnected in five seconds" )
357
+ time .Sleep (time .Second * 5 )
358
+ }
359
+ }()
360
+ }
361
+
362
+ func systemService (flag string ) {
363
+
364
+ if flag == "1" {
365
+ fmt .Printf ("请输入[快捷启动命令],多个[快捷启动命令]用英文逗号拼接:" )
366
+ } else {
367
+ fmt .Printf ("请输入[VKEY],多个[VKEY]用英文逗号拼接:" )
368
+ }
369
+
370
+ var vkey string
371
+ stdin := bufio .NewReader (os .Stdin )
372
+ _ , err := fmt .Fscanln (stdin , & vkey )
373
+
374
+ if err != nil {
375
+ fmt .Println ("输入错误,请重试" )
376
+ systemService (flag )
377
+ return
378
+ } else {
379
+ if vkey == "0" {
380
+ os .Exit (0 )
381
+ }
382
+ }
383
+
384
+ vkey = strings .Replace (vkey , " " , "" , - 1 )
385
+
386
+ vkeys := strings .Split (vkey , `,` )
387
+
388
+ if flag == "1" {
389
+ var cmdArray []string
390
+ for _ , key := range vkeys {
391
+ startCmd , err := crypt .Base64Decoding (key )
392
+ if err != nil {
393
+ fmt .Println ("快捷启动命令解析失败" )
394
+ systemService (flag )
395
+ return
396
+ }
397
+ cmdArray = append (cmdArray , startCmd )
398
+ }
399
+
400
+ for _ , item := range cmdArray {
401
+ array := strings .Fields (item )
402
+ systemPro (flag , array [0 ], array [1 ])
403
+ }
404
+ } else {
405
+ for _ , key := range vkeys {
406
+ systemPro (flag , "" , key )
407
+ }
408
+
409
+ }
410
+
411
+ inputCmd ()
412
+ return
413
+ }
414
+
415
+ func systemPro (flag string , serAddr string , vkey string ) {
416
+ // init service
417
+ prg := & npc {
418
+ exit : make (chan struct {}),
419
+ }
420
+ options := make (service.KeyValue )
421
+ svcConfig := & service.Config {
422
+ Name : "nps-client-" + vkey ,
423
+ DisplayName : "nps-client-" + vkey ,
424
+ Description : "NPS内网穿透客户端,支持tcp、udp流量转发,支持内网http代理,地址:https://github.com/yisier/nps" ,
425
+ Option : options ,
426
+ }
427
+ s , _ := service .New (prg , svcConfig )
428
+
429
+ switch flag {
430
+ case "1" :
431
+ svcConfig .Arguments = append (svcConfig .Arguments , "-server=" + serAddr )
432
+ svcConfig .Arguments = append (svcConfig .Arguments , "-vkey=" + vkey )
433
+ svcConfig .Arguments = append (svcConfig .Arguments , "-debug=false" )
434
+ install .InstallNpc ()
435
+ err := service .Control (s , "install" )
436
+ if err != nil {
437
+ fmt .Println ("隧道[" + vkey + "]安装到系统服务失败" , err )
438
+ return
439
+ } else {
440
+ fmt .Println ("隧道[" + vkey + "]已经安装到系统" )
441
+ }
442
+ if service .Platform () == "unix-systemv" {
443
+ logs .Info ("unix-systemv service" )
444
+ confPath := "/etc/init.d/" + svcConfig .Name
445
+ os .Symlink (confPath , "/etc/rc.d/S90" + svcConfig .Name )
446
+ os .Symlink (confPath , "/etc/rc.d/K02" + svcConfig .Name )
447
+ }
448
+
449
+ err2 := service .Control (s , "start" )
450
+ if err2 != nil {
451
+ fmt .Println ("隧道[" + vkey + "]启动服务失败" , err2 )
452
+ } else {
453
+ fmt .Println ("隧道[" + vkey + "]服务已启动" )
454
+ }
455
+
456
+ return
457
+ case "2" :
458
+ // 卸载系统服务
459
+ err := service .Control (s , "stop" )
460
+ if err != nil {
461
+ fmt .Println ("隧道[" + vkey + "]服务停止失败" , err )
462
+ } else {
463
+ fmt .Println ("隧道[" + vkey + "]服务已停止" )
464
+ }
465
+
466
+ err = service .Control (s , "uninstall" )
467
+ if err != nil {
468
+ fmt .Println ("隧道[" + vkey + "]服务卸载失败" , err )
469
+ }
470
+ if service .Platform () == "unix-systemv" {
471
+ fmt .Println ("unix-systemv service" )
472
+ os .Remove ("/etc/rc.d/S90" + svcConfig .Name )
473
+ os .Remove ("/etc/rc.d/K02" + svcConfig .Name )
474
+ }
475
+
476
+ if err == nil {
477
+ fmt .Println ("隧道[" + vkey + "]服务已卸载成功" )
478
+ }
479
+
480
+ return
481
+
482
+ case "3" :
483
+ //启动系统服务
484
+ if service .Platform () == "unix-systemv" {
485
+ logs .Info ("unix-systemv service" )
486
+ cmd := exec .Command ("/etc/init.d/" + svcConfig .Name , "start" )
487
+ err := cmd .Run ()
488
+ if err != nil {
489
+ logs .Error (err )
490
+ }
491
+ return
492
+ }
493
+ err := service .Control (s , "start" )
494
+ if err != nil {
495
+ fmt .Println ("隧道[" + vkey + "]服务启动失败" , err )
496
+ } else {
497
+ fmt .Println ("隧道[" + vkey + "]服务启动成功" )
498
+ }
499
+
500
+ return
501
+ case "4" :
502
+ if service .Platform () == "unix-systemv" {
503
+ logs .Info ("unix-systemv service" )
504
+ cmd := exec .Command ("/etc/init.d/" + svcConfig .Name , "stop" )
505
+ err := cmd .Run ()
506
+ if err != nil {
507
+ logs .Error (err )
508
+ }
509
+ return
510
+ }
511
+ err := service .Control (s , "stop" )
512
+ if err != nil {
513
+ fmt .Println ("隧道[" + vkey + "]服务停止失败" , err )
514
+ } else {
515
+ fmt .Println ("隧道[" + vkey + "]服务停止成功" )
516
+ }
517
+
518
+ return
256
519
}
257
520
}
0 commit comments