package Ġd ork box . net Util Ċ Ċ import Ġd ork box . executor . Executor Ċ import Ġjava . io . File Ċ Ċ /** Ċ Ġ* Ċ Ġ*/ Ċ object ĠName Space Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGets Ġthe Ġversion Ġnumber . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġconst Ġval Ġversion Ġ= Ġ" 2 . 8 " ĊĊĠĠĠ Ġobject ĠRoute Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġflush ( name Space : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Common . OS _ LINUX ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun ( name Space , Ġ"/ sbin / ip ", Ġ" route ", Ġ" flush ", Ġ" cache ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" NOT ĠIMP L .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġobject ĠD h cp Ġ{ ĊĠĠĠĠĠĠĠ Ġobject ĠD h cp Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġstart ( name Space : ĠString , Ġid : ĠString , Ġinterface Name : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Common . OS _ LINUX ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstop ( name Space , Ġid , Ġinterface Name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdh cp Pid File Ġ= Ġ"/ var / run / dh client -$ id . pid " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun ( name Space , Ġ"/ sbin / dh client ", Ġ"- pf ", Ġdh cp Pid File , Ġinterface Name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" NOT ĠIMP L .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġstop ( name Space : ĠString , Ġid : ĠString , Ġinterface Name : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Common . OS _ LINUX ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdh cp Pid File Ġ= Ġ"/ var / run / dh client -$ id . pid " ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġclose Ġthe Ġdh client Ġif Ġit Ġwas Ġalready Ġrunning Ġ( based Ġon Ġpid Ġfile ), Ġand Ġdelete Ġthe Ġpid Ġfile ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun ( name Space , Ġ"/ sbin / dh client ", Ġ"- r Ġ- pf ", Ġdh cp Pid File , Ġinterface Name ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġshort Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠThread . sleep ( 5 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠInterruptedException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFile ( dhcp Pid File ). delete () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" NOT ĠIMP L .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġname Space To I if To Ip : ĠMutable Map < String , ĠMutable Map < String , ĠString >> Ġ= ĠHashMap () ĊĊĠĠĠ Ġfun Ġadd ( name Space : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( Common . OS _ LINUX ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠ ĠExecutor . run ("/ sbin / ip ", Ġ" net ns ", Ġ" add ", Ġname Space ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" NOT ĠIMP L .") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdelete ( name Space : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( Common . OS _ LINUX ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠExecutor . run ("/ sbin / ip ", Ġ" net ns ", Ġ" del ", Ġname Space ); ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" NOT ĠIMP L .") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdh cp Start ( name Space : ĠString , Ġid : ĠString , Ġinterface Name : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( Common . OS _ LINUX ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdh cp Stop ( name Space , Ġid , Ġinterface Name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdh cp Pid File Ġ= Ġ"/ var / run / dh client -$ id . pid " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun ( name Space , Ġ"/ sbin / dh client ", Ġ"- pf ", Ġdh cp Pid File , Ġinterface Name ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" NOT ĠIMP L .") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdh cp Stop ( name Space : ĠString , Ġid : ĠString , Ġinterface Name : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( Common . OS _ LINUX ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdh cp Pid File Ġ= Ġ"/ var / run / dh client -$ id . pid " ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġclose Ġthe Ġdh client Ġif Ġit Ġwas Ġalready Ġrunning Ġ( based Ġon Ġpid Ġfile ), Ġand Ġdelete Ġthe Ġpid Ġfile ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun ( name Space , Ġ"/ sbin / dh client ", Ġ"- r Ġ- pf ", Ġdh cp Pid File , Ġinterface Name ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġshort Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠThread . sleep ( 5 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠInterruptedException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFile ( dhcp Pid File ). delete () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" NOT ĠIMP L .") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġrun ( name Space : ĠString , Ġvar arg Ġargs : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( Common . OS _ LINUX ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcommand Ġ= Ġmutable ListOf < String >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcommand . add ("/ sbin / ip ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcommand . add (" net ns ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcommand . add (" exec ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcommand . add ( name Space ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcommand . addAll ( listOf (* args )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠExecutor . run ( command ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" NOT ĠIMP L .") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠOn Ġclient Ġdisconnect , Ġit Ġwill Ġget Ġthe ĠIP Ġaddress Ġfor Ġthe Ġinterface Ġfrom Ġthe Ġcache , Ġinstead Ġof Ġfrom Ġ` if config ` Ġ( since Ġthe ĊĠĠĠĠ Ġ* Ġinterface ĊĠĠĠĠ Ġ* Ġis Ġdown Ġat Ġthis Ġpoint ) ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget Ip From If ( name Space : ĠString , Ġinterface Name : ĠString , Ġis On Client Connect : ĠBoolean ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( Common . OS _ LINUX ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is On Client Connect ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġiface Info Ġ= Ġrun ( name Space , Ġ"/ sbin / if config ", Ġinterface Name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstr Ġ= Ġ" inet Ġaddr :" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġindex Ġ= Ġiface Info . indexOf ( str ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( index Ġ> Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex Ġ+= Ġstr . length ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpossible Addr Ġ= Ġiface Info . substring ( index , Ġiface Info . indexOf (" Ġ", Ġindex )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCommon . logger . debug (" Found Ġon Ġ'{}' Ġpossible Ġaddr Ġ'{}' Ġ: ĠADD ", Ġinterface Name , Ġpossible Addr ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsynchronized ( name Space To I if To Ip ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġif To Ip Ġ= Ġname Space To I if To Ip [ name Space ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( if To Ip Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif To Ip Ġ= ĠHashMap () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Space To I if To Ip [ name Space ] Ġ= Ġif To Ip ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif To Ip . put ( interface Name , Ġpossible Addr ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġpossible Addr ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġpossible Addr : ĠString ? Ġ= Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsynchronized ( name Space To I if To Ip ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġif To Ip Ġ= Ġname Space To I if To Ip [ name Space ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( if To Ip Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpossible Addr Ġ= Ġif To Ip . remove ( interface Name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCommon . logger . debug (" Found Ġon Ġ'{}' Ġpossible Ġaddr Ġ'{}' Ġ: ĠREMOVE ", Ġinterface Name , Ġpossible Addr ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( possible Addr Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġpossible Addr !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ"" ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" NOT ĠIMP L .") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd Loop back ( name Space : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( Common . OS _ LINUX ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun ( name Space , Ġ"/ sbin / ip Ġlink Ġset Ġdev Ġlo Ġup ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun ( name Space , Ġ"/ sbin / ip Ġaddr Ġadd Ġ 1 2 7 . 0 . 0 . 1 Ġdev Ġlo ") ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" NOT ĠIMP L .") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ