@@ -43,6 +43,7 @@ func root(args []string) error {
4343 flags .StringVar (& conf .CertFile , "c" , "" , "Path to certificate PEM encoded file" )
4444 flags .StringVar (& conf .KeyFile , "k" , "" , "Path to private key PEM encoded file" )
4545 flags .StringVar (& conf .ServerConfPath , "f" , "" , "Path to server configuration file in YAML format" )
46+ daemon := flags .Bool ("D" , false , "Run as a daemon (provide -logfile to see logs)" )
4647 if runtime .GOOS == tproxyOS {
4748 flags .StringVar (& conf .TProxy , "t" , "" , "Address of transparent proxy server (it starts along with HTTP proxy server)" )
4849 flags .StringVar (& conf .TProxyOnly , "T" , "" , "Address of transparent proxy server (no HTTP)" )
@@ -55,14 +56,9 @@ func root(args []string) error {
5556 return nil
5657 })
5758 }
58- flags .BoolFunc ("d" , "Show logs in DEBUG mode" , func (flagValue string ) error {
59- conf .Debug = true
60- return nil
61- })
62- flags .BoolFunc ("j" , "Show logs in JSON format" , func (flagValue string ) error {
63- conf .Json = true
64- return nil
65- })
59+ flags .StringVar (& conf .LogFilePath , "logfile" , "" , "Log file path (Default: stdout)" )
60+ flags .BoolVar (& conf .Debug , "d" , false , "Show logs in DEBUG mode" )
61+ flags .BoolVar (& conf .Json , "j" , false , "Show logs in JSON format" )
6662 flags .BoolFunc ("v" , "print version" , func (flagValue string ) error {
6763 fmt .Println (gohpts .Version )
6864 os .Exit (0 )
@@ -90,7 +86,7 @@ func root(args []string) error {
9086 if seen ["T" ] {
9187 for _ , da := range []string {"U" , "c" , "k" , "l" } {
9288 if seen [da ] {
93- return fmt .Errorf ("-T flag only works with -s, -u, -f, -M, -d and -j flags" )
89+ return fmt .Errorf ("-T flag only works with -s, -u, -f, -M, -d, -D, -logfile and -j flags" )
9490 }
9591 }
9692 if ! seen ["M" ] {
@@ -106,12 +102,17 @@ func root(args []string) error {
106102 for _ , da := range []string {"s" , "u" , "U" , "c" , "k" , "l" } {
107103 if seen [da ] {
108104 if runtime .GOOS == tproxyOS {
109- return fmt .Errorf ("-f flag only works with -t, -T, -M, -d and -j flags" )
105+ return fmt .Errorf ("-f flag only works with -t, -T, -M, -d, -D, -logfile and -j flags" )
110106 }
111- return fmt .Errorf ("-f flag only works with -d and -j flags" )
107+ return fmt .Errorf ("-f flag only works with -d, -D, -logfile and -j flags" )
112108 }
113109 }
114110 }
111+ if seen ["D" ] {
112+ if seen ["u" ] || seen ["U" ] {
113+ return fmt .Errorf ("-u and -U flags do not work in daemon mode" )
114+ }
115+ }
115116 if seen ["u" ] {
116117 fmt .Print ("SOCKS5 Password: " )
117118 bytepw , err := term .ReadPassword (int (os .Stdin .Fd ()))
@@ -131,6 +132,40 @@ func root(args []string) error {
131132 fmt .Print ("\033 [2K\r " )
132133 }
133134
135+ if * daemon {
136+ if os .Getenv ("GOHPTS_DAEMON" ) != "1" {
137+ env := os .Environ ()
138+ files := [3 ]* os.File {}
139+ env = append (env , "GOHPTS_DAEMON=1" )
140+ files [0 ], _ = os .Open (os .DevNull )
141+ files [1 ], _ = os .Open (os .DevNull )
142+ files [2 ], _ = os .Open (os .DevNull )
143+ attr := & os.ProcAttr {
144+ Files : []* os.File {
145+ files [0 ], // stdin
146+ files [1 ], // stdout
147+ files [2 ], // stderr
148+ },
149+ Dir : "." ,
150+ Env : env ,
151+ }
152+ path , err := os .Executable ()
153+ if err != nil {
154+ return err
155+ }
156+ process , err := os .StartProcess (
157+ path ,
158+ os .Args ,
159+ attr ,
160+ )
161+ if err != nil {
162+ return err
163+ }
164+ fmt .Printf ("%s pid: %d\n " , app , process .Pid )
165+ process .Release ()
166+ os .Exit (0 )
167+ }
168+ }
134169 p := gohpts .New (& conf )
135170 p .Run ()
136171 return nil
0 commit comments