/* Ċ Ġ* ĠTencent Ġis Ġplease d Ġto Ġsupport Ġthe Ġopen Ġsource Ġcommunity Ġby Ġmaking ĠB K - CI Ġ èĵĿ é² ¸ æĮģ ç»Ń éĽĨ æĪĲ å¹³åı° Ġavailable . Ċ Ġ* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 1 9 ĠTH L ĠA 2 9 ĠLimited , Ġa ĠTencent Ġcompany . Ġ ĠAll Ġrights Ġreserved . Ċ Ġ* Ċ Ġ* ĠB K - CI Ġ èĵĿ é² ¸ æĮģ ç»Ń éĽĨ æĪĲ å¹³åı° Ġis Ġlicensed Ġunder Ġthe ĠMIT Ġlicense . Ċ Ġ* Ċ Ġ* ĠA Ġcopy Ġof Ġthe ĠMIT ĠLicense Ġis Ġincluded Ġin Ġthis Ġfile . Ċ Ġ* Ċ Ġ* Ċ Ġ* ĠTerms Ġof Ġthe ĠMIT ĠLicense : Ċ Ġ* Ġ------------------------------------------------ --- Ċ Ġ* ĠPermission Ġis Ġhereby Ġgranted , Ġfree Ġof Ġcharge , Ġto Ġany Ġperson Ġobtaining Ġa Ġcopy Ġof Ġthis Ġsoftware Ġand Ġassociated Ċ Ġ* Ġdocumentation Ġfiles Ġ( the Ġ" Software "), Ġto Ġdeal Ġin Ġthe ĠSoftware Ġwithout Ġrestriction , Ġincluding Ġwithout Ġlimitation Ġthe Ċ Ġ* Ġrights Ġto Ġuse , Ġcopy , Ġmodify , Ġmerge , Ġpublish , Ġdistribute , Ġsublicense , Ġand / or Ġsell Ġcopies Ġof Ġthe ĠSoftware , Ġand Ġto Ċ Ġ* Ġpermit Ġpersons Ġto Ġwhom Ġthe ĠSoftware Ġis Ġfurnished Ġto Ġdo Ġso , Ġsubject Ġto Ġthe Ġfollowing Ġconditions : Ċ Ġ* Ċ Ġ* ĠThe Ġabove Ġcopyright Ġnotice Ġand Ġthis Ġpermission Ġnotice Ġshall Ġbe Ġincluded Ġin Ġall Ġcopies Ġor Ġsubstantial Ġportions Ġof Ċ Ġ* Ġthe ĠSoftware . Ċ Ġ* Ċ Ġ* ĠTHE ĠSOFTWARE ĠIS ĠPROVIDED Ġ" AS ĠIS ", ĠWITHOUT ĠWARRANTY ĠOF ĠANY ĠKIND , ĠEXPRESS ĠOR ĠIMPLIED , ĠINCLUDING ĠBUT ĠNOT Ċ Ġ* ĠLIMITED ĠTO ĠTHE ĠWARRANTIES ĠOF ĠMERCHANTABILITY , ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE ĠAND ĠNONINFRINGEMENT . ĠIN Ċ Ġ* ĠNO ĠEVENT ĠSHALL ĠTHE ĠAUTHORS ĠOR ĠCOPYRIGHT ĠHOLDERS ĠBE ĠLIABLE ĠFOR ĠANY ĠCLAIM , ĠDAMAGES ĠOR ĠOTHER ĠLIABILITY , Ċ Ġ* ĠWHETHER ĠIN ĠAN ĠACTION ĠOF ĠCONTRACT , ĠTORT ĠOR ĠOTHERWISE , ĠARISING ĠFROM , ĠOUT ĠOF ĠOR ĠIN ĠCONNECTION ĠWITH ĠTHE Ċ Ġ* ĠSOFTWARE ĠOR ĠTHE ĠUSE ĠOR ĠOTHER ĠDEALINGS ĠIN ĠTHE ĠSOFTWARE . Ċ Ġ*/ Ċ Ċ package Ġcom . tencent . devops . build less . utils Ċ Ċ import Ġorg . slf 4 j . LoggerFactory Ċ import Ġorg . springframework . beans . factory . annotation . Value Ċ import Ġjava . net . Data gram Socket Ċ import Ġjava . net . Inet 4 Address Ċ import Ġjava . net . Inet Address Ċ import Ġjava . net . NetworkInterface Ċ import Ġjava . net . Unknown Host Exception Ċ import Ġjava . util . Enumeration Ċ Ċ object ĠCommon Utils Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġlogger Ġ= ĠLoggerFactory . getLogger ( Common Utils :: class . java ) ĊĊĠĠĠ Ġprivate Ġvar Ġhost Ip : ĠString ? Ġ= Ġnull ĊĊĠĠĠ Ġ@ Value ("\ ${ spring . cloud . consul . discovery . tags : prod }") ĊĠĠĠ Ġprivate Ġval Ġcons ul Tag : ĠString Ġ= Ġ" prod " ĊĊĠĠĠ Ġfun Ġformat Container Id ( container Id : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( container Id . length Ġ> Ġ 1 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontainer Id . substring ( 0 , Ġ 1 2 ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontainer Id ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġis G ary (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcons ul Tag . contains (" gray ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Host Ip (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( host Ip . isNull Or Blank ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsynchronized ( this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( host Ip . isNull Or Blank ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhost Ip Ġ= Ġget Inner IP () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( host Ip . isNull Or Blank ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" Empty Ġhost Ġip .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" Get Ġthe ĠHost Ip ($ host Ip )") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġhost Ip !! ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Inner IP ( local Ip : ĠString ? Ġ= Ġ"") : ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( local Ip Ġ!= Ġnull Ġ&& Ġlocal Ip . isNotBlank ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġlocal Ip ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġip By Ni List Ġ= Ġget Local Ip 4 Address From NetworkInterface () ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġip By Ni List . isEmpty () Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Ip By Socket ()?. host Address Ġ?: Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġip By Ni List . size Ġ== Ġ 1 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġip By Ni List [ 0 ]. host Address ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Ip By Socket ()?. host Address Ġ?: Ġip By Ni List [ 0 ]. host Address ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Local Ip 4 Address From NetworkInterface (): ĠList < Inet 4 Address > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġaddresses : ĠMutable List < Inet 4 Address > Ġ= ĠArrayList () ĊĠĠĠĠĠĠĠ Ġval Ġe Ġ= ĠNetwork Interface . get Network Interfaces () Ġ?: Ġreturn Ġaddresses ĊĠĠĠĠĠĠĠ Ġwhile Ġ( e . hasMore Elements ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġn Ġ= Ġe . nextElement () Ġas ĠNetwork Interface ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! isValid Interface ( n )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġee : ĠEnumeration < *> Ġ= Ġn . inet Addresses ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( ee . hasMore Elements ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġi Ġ= Ġee . nextElement () Ġas ĠInet Address ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( isValid Address ( i )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaddresses . add ( i Ġas ĠInet 4 Address ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġaddresses ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ è¿ĩæ»¤ åĽŀ çİ¯ ç½ĳ åį¡ ãĢģ çĤ¹ å¯¹ çĤ¹ ç½ĳ åį¡ ãĢģ éĿŀ æ´»åĬ¨ ç½ĳ åį¡ ãĢģ èĻļæĭŁ ç½ĳ åį¡ å¹¶ è¦ģæ±Ĥ ç½ĳ åį¡ åĲįåŃĹ æĺ¯ eth æĪĸ ens å¼Ģ å¤´ ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġni Ġ ç½ĳ åį¡ ĊĠĠĠĠ Ġ* Ġ@ return Ġå¦Ĥæŀľ æ»¡è¶³ è¦ģæ±Ĥ åĪĻ true ï¼Į åĲ¦åĪĻ false ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun ĠisValid Interface ( ni : ĠNetwork Interface ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ(! ni . is Loop back Ġ&& Ġ! ni . is Point To Point Ġ&& Ġni . is Up Ġ&& Ġ! ni . is Virtual Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( ni . name . startsWith (" eth ") Ġ|| Ġni . name . startsWith (" ens "))) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠåĪ¤æĸŃ æĺ¯åĲ¦ æĺ¯ IPv 4 ï¼Į å¹¶ è¿ĩæ»¤ åĽŀ çİ¯ åľ°åĿĢ . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun ĠisValid Address ( address : ĠInet Address ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġaddress Ġis ĠInet 4 Address Ġ&& Ġ! address . is Loop back Address () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ å»ºç«ĭ ä¸Ģä¸ª socket éĵ¾æİ¥ ï¼Į å½ĵ åŃĺåľ¨ å¤ļ ç½ĳ åį¡ æĹ¶ ä¼ļ è¿ĶåĽŀ åĲĪ éĢĤ çļĦ åĩº åı£ IP ï¼Į 8 . 8 . 8 . 8 æĺ¯ ä¸ª æµĭè¯ķ åľ°åĿĢ Ġnot Ġneeded Ġto Ġbe Ġreachable ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġget Ip By Socket (): ĠInet 4 Address ? Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠData gram Socket (). use Ġ{ Ġsocket Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsocket . connect ( Inet Address . get ByName (" 8 . 8 . 8 . 8 "), Ġ 1 0 0 0 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( socket . local Address Ġis ĠInet 4 Address ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsocket . local Address Ġas ĠInet 4 Address ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠUnknown Host Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} Ċ } Ċ