@@ -43,6 +43,7 @@ const (
4343	FORMAT_FILTER_SPORT  =  "( sport = :%d )" 
4444
4545	HTTP_SERVER_CONTAINER_NAME  =  "curveadm-precheck-nginx" 
46+ 	CHECK_PORT_CONTAINER_NAME   =  "curveadm-precheck-port" 
4647)
4748
4849// TASK: check port in use 
@@ -71,6 +72,53 @@ func joinPorts(dc *topology.DeployConfig, addresses []Address) string {
7172	return  strings .Join (ports , "," )
7273}
7374
75+ func  getCheckPortContainerName (curveadm  * cli.CurveAdm , dc  * topology.DeployConfig ) string  {
76+ 	return  fmt .Sprintf ("%s-%s-%s" ,
77+ 		CHECK_PORT_CONTAINER_NAME ,
78+ 		dc .GetRole (),
79+ 		curveadm .GetServiceId (dc .GetId ()))
80+ }
81+ 
82+ type  step2CheckPortStatus  struct  {
83+ 	containerId  * string 
84+ 	success      * bool 
85+ 	dc           * topology.DeployConfig 
86+ 	curveadm     * cli.CurveAdm 
87+ 	port         int 
88+ }
89+ 
90+ // execute the "ss" command within a temporary container 
91+ func  (s  * step2CheckPortStatus ) Execute (ctx  * context.Context ) error  {
92+ 	filter  :=  fmt .Sprintf (FORMAT_FILTER_SPORT , s .port )
93+ 	cli  :=  ctx .Module ().Shell ().SocketStatistics (filter )
94+ 	cli .AddOption ("--no-header" )
95+ 	cli .AddOption ("--listening" )
96+ 	command , err  :=  cli .String ()
97+ 	if  err  !=  nil  {
98+ 		return  err 
99+ 	}
100+ 
101+ 	var  out  string 
102+ 	steps  :=  []task.Step {}
103+ 	steps  =  append (steps , & step.ContainerExec {
104+ 		ContainerId : s .containerId ,
105+ 		Command :     command ,
106+ 		Out :         & out ,
107+ 		ExecOptions : s .curveadm .ExecOptions (),
108+ 	})
109+ 	steps  =  append (steps , & step.Lambda {
110+ 		Lambda : checkPortInUse (s .success , & out , s .dc .GetHost (), s .port ),
111+ 	})
112+ 
113+ 	for  _ , step  :=  range  steps  {
114+ 		err  :=  step .Execute (ctx )
115+ 		if  err  !=  nil  {
116+ 			return  err 
117+ 		}
118+ 	}
119+ 	return  nil 
120+ }
121+ 
74122func  NewCheckPortInUseTask (curveadm  * cli.CurveAdm , dc  * topology.DeployConfig ) (* task.Task , error ) {
75123	hc , err  :=  curveadm .GetHost (dc .GetHost ())
76124	if  err  !=  nil  {
@@ -82,19 +130,35 @@ func NewCheckPortInUseTask(curveadm *cli.CurveAdm, dc *topology.DeployConfig) (*
82130		dc .GetHost (), dc .GetRole (), joinPorts (dc , addresses ))
83131	t  :=  task .NewTask ("Check Port In Use <network>" , subname , hc .GetSSHConfig ())
84132
85- 	var  out  string 
133+ 	var  containerId ,  out  string 
86134	var  success  bool 
135+ 	t .AddStep (& step.PullImage {
136+ 		Image :       dc .GetContainerImage (),
137+ 		ExecOptions : curveadm .ExecOptions (),
138+ 	})
139+ 	t .AddStep (& step.CreateContainer {
140+ 		Image :       dc .GetContainerImage (),
141+ 		Command :     "-c 'sleep infinity'" , // keep the container running 
142+ 		Entrypoint :  "/bin/bash" ,
143+ 		Name :        getCheckPortContainerName (curveadm , dc ),
144+ 		Remove :      true ,
145+ 		Out :         & containerId ,
146+ 		ExecOptions : curveadm .ExecOptions (),
147+ 	})
148+ 	t .AddStep (& step.StartContainer {
149+ 		ContainerId : & containerId ,
150+ 		Success :     & success ,
151+ 		Out :         & out ,
152+ 		ExecOptions : curveadm .ExecOptions (),
153+ 	})
154+ 
87155	for  _ , address  :=  range  addresses  {
88- 		t .AddStep (& step.SocketStatistics {
89- 			Filter :      fmt .Sprintf (FORMAT_FILTER_SPORT , address .Port ),
90- 			Listening :   true ,
91- 			NoHeader :    true ,
92- 			Success :     & success ,
93- 			Out :         & out ,
94- 			ExecOptions : curveadm .ExecOptions (),
95- 		})
96- 		t .AddStep (& step.Lambda {
97- 			Lambda : checkPortInUse (& success , & out , dc .GetHost (), address .Port ),
156+ 		t .AddStep (& step2CheckPortStatus {
157+ 			containerId : & containerId ,
158+ 			success :     & success ,
159+ 			dc :          dc ,
160+ 			curveadm :    curveadm ,
161+ 			port :        address .Port ,
98162		})
99163	}
100164
@@ -164,7 +228,7 @@ func getNginxListens(dc *topology.DeployConfig) string {
164228	return  strings .Join (listens , " " )
165229}
166230
167- func  getContainerName (curveadm  * cli.CurveAdm , dc  * topology.DeployConfig ) string  {
231+ func  getHTTPServerContainerName (curveadm  * cli.CurveAdm , dc  * topology.DeployConfig ) string  {
168232	return  fmt .Sprintf ("%s-%s-%s" ,
169233		HTTP_SERVER_CONTAINER_NAME ,
170234		dc .GetRole (),
@@ -204,7 +268,7 @@ func NewStartHTTPServerTask(curveadm *cli.CurveAdm, dc *topology.DeployConfig) (
204268		Image :       dc .GetContainerImage (),
205269		Command :     command ,
206270		Entrypoint :  "/bin/bash" ,
207- 		Name :        getContainerName (curveadm , dc ),
271+ 		Name :        getHTTPServerContainerName (curveadm , dc ),
208272		Remove :      true ,
209273		Out :         & containerId ,
210274		ExecOptions : curveadm .ExecOptions (),
@@ -283,7 +347,7 @@ func NewCheckNetworkFirewallTask(curveadm *cli.CurveAdm, dc *topology.DeployConf
283347	return  t , nil 
284348}
285349
286- // TASK: stop http server  
350+ // TASK: stop container  
287351type  step2StopContainer  struct  {
288352	containerId  * string 
289353	dc           * topology.DeployConfig 
@@ -332,7 +396,19 @@ func NewCleanEnvironmentTask(curveadm *cli.CurveAdm, dc *topology.DeployConfig)
332396	t .AddStep (& step.ListContainers {
333397		ShowAll :     true ,
334398		Format :      `"{{.ID}}"` ,
335- 		Filter :      fmt .Sprintf ("name=%s" , getContainerName (curveadm , dc )),
399+ 		Filter :      fmt .Sprintf ("name=%s" , getCheckPortContainerName (curveadm , dc )),
400+ 		Out :         & out ,
401+ 		ExecOptions : curveadm .ExecOptions (),
402+ 	})
403+ 	t .AddStep (& step2StopContainer {
404+ 		containerId : & out ,
405+ 		dc :          dc ,
406+ 		curveadm :    curveadm ,
407+ 	})
408+ 	t .AddStep (& step.ListContainers {
409+ 		ShowAll :     true ,
410+ 		Format :      `"{{.ID}}"` ,
411+ 		Filter :      fmt .Sprintf ("name=%s" , getHTTPServerContainerName (curveadm , dc )),
336412		Out :         & out ,
337413		ExecOptions : curveadm .ExecOptions (),
338414	})
0 commit comments