/* Ċ Ġ* Ġ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 . environment . service . third Party Agent Ċ Ċ import Ġcom . tencent . devops . common . api . pojo . OS Ċ import Ġcom . tencent . devops . common . api . util . Hash Util Ċ import Ġcom . tencent . devops . common . api . util . Security Util Ċ import Ġcom . tencent . devops . common . service . Profile Ċ import Ġcom . tencent . devops . environment . dao . third Party Agent . Third Party Agent Dao Ċ import Ġcom . tencent . devops . environment . model . Agent Arch Type Ċ import Ġcom . tencent . devops . environment . service . Agent Url Service Ċ import Ġcom . tencent . devops . environment . utils . File MD 5 Cache Utils . getFile MD 5 Ċ import Ġcom . tencent . devops . model . environment . tables . records . T Environment Third party Agent Record Ċ import Ġorg . apache . commons . compress . arch ivers . Archive OutputStream Ċ import Ġorg . apache . commons . compress . arch ivers . Archive Stream Factory Ċ import Ġorg . apache . commons . compress . arch ivers . zip . Zip Archive Entry Ċ import Ġorg . apache . commons . compress . utils . IO Utils Ċ import Ġorg . jooq . DSL Context Ċ import Ġorg . slf 4 j . LoggerFactory Ċ import Ġorg . springframework . beans . factory . annotation . Autowired Ċ import Ġorg . springframework . beans . factory . annotation . Value Ċ import Ġorg . springframework . stereotype . Service Ċ import Ġjava . io . ByteArray InputStream Ċ import Ġjava . io . File Ċ import Ġjava . io . FileInputStream Ċ import Ġjava . io . FileNotFoundException Ċ import Ġjava . nio . charset . Charset Ċ import Ġjavax . ws . rs . NotFoundException Ċ import Ġjavax . ws . rs . core . MediaType Ċ import Ġjavax . ws . rs . core . Response Ċ import Ġjavax . ws . rs . core . Streaming Output Ċ Ċ @ Service Ċ @ Suppress (" Too Many Functions ", Ġ" Long Method ") Ċ class ĠDownload Agent Install Service Ġ@ Autowired Ġconstructor ( ĊĠĠĠ Ġprivate Ġval Ġd sl Context : ĠDSL Context , ĊĠĠĠ Ġprivate Ġval Ġthird Party Agent Dao : ĠThird Party Agent Dao , ĊĠĠĠ Ġprivate Ġval Ġagent Url Service : ĠAgent Url Service , ĊĠĠĠ Ġprivate Ġval Ġprofile : ĠProfile Ċ ) Ġ{ ĊĊĠĠĠ Ġ@ Value ("\ ${ environment . agent - package }") ĊĠĠĠ Ġprivate Ġval Ġagent Package Ġ= Ġ"" ĊĊĠĠĠ Ġ@ Value ("\ ${ environment . agent Collector On : false }") ĊĠĠĠ Ġprivate Ġval Ġagent Collector On Ġ= Ġ"" ĊĊĠĠĠ Ġ@ Value ("\ ${ environment . cert FilePath :# { null }} ") ĊĠĠĠ Ġprivate Ġval Ġcert FilePath : ĠString ? Ġ= Ġnull ĊĊĠĠĠ Ġfun Ġdownload Install Script ( agent Id : ĠString ): ĠResponse Ġ{ ĊĠĠĠĠĠĠĠ Ġlogger . info (" Trying Ġto Ġdownload Ġthe Ġagent ($ agent Id ) Ġinstall Ġscript ") ĊĠĠĠĠĠĠĠ Ġval Ġagent Record Ġ= Ġget Agent Record ( agent Id ) ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* Ġagent _ url ĊĠĠĠĠĠĠĠĠ Ġ* Ġj re _ url ĊĠĠĠĠĠĠĠĠ Ġ* ĠprojectId ĊĠĠĠĠĠĠĠĠ Ġ* Ġagent Id ĊĠĠĠĠĠĠĠĠ Ġ* Ġagent SecretKey ĊĠĠĠĠĠĠĠĠ Ġ* Ġgate Way ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġval ĠfileName Ġ= Ġif Ġ( agent Record . os Ġ== ĠOS . WINDOWS . name ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" install . bat " ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" install . sh " ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġscript File Ġ= ĠFile ( agent Package , Ġ" script /${ agent Record . os . toLowerCase () }/ $ fileName ") ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! script File . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . warn (" The Ġinstall Ġscript Ġfile (${ script File . absolute Path }) Ġis Ġnot Ġexist ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠFileNotFoundException (" The Ġinstall Ġscript Ġfile Ġis Ġnot Ġexist ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġmap Ġ= Ġget Agent Replace Properties ( agent Record ) ĊĠĠĠĠĠĠĠ Ġvar Ġresult Ġ= Ġscript File . read Text ( Charset . forName (" UTF - 8 ")) ĊĊĠĠĠĠĠĠĠ Ġmap . forEach Ġ{ Ġ( t , Ġu ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= Ġresult . replace (" ## $ t ## ", Ġu ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠResponse . ok ( Streaming Output Ġ{ Ġoutput Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutput . write ( result . toByteArray ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutput . flush () ĊĠĠĠĠĠĠĠ Ġ}, ĠMediaType . APPLICATION _ OCT ET _ STREAM _ TYPE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. header (" content - dis position ", Ġ" attachment ; Ġfilename Ġ= Ġ$ fileName ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdownload Go Agent ( agent Id : ĠString , Ġrecord : ĠT Environment Third party Agent Record , Ġarch : ĠAgent Arch Type ?): ĠResponse Ġ{ ĊĠĠĠĠĠĠĠ Ġlogger . info (" Trying Ġto Ġdownload Ġthe Ġagent ($ agent Id ) Ġarch ($ arch )") ĊĊĠĠĠĠĠĠĠ Ġval Ġjar Files Ġ= Ġget Go Agent Jar Files ( record . os , Ġarch ) ĊĠĠĠĠĠĠĠ Ġval Ġgo Daemon File Ġ= Ġget Go File ( record . os , Ġ" devops Daemon ", Ġarch ) ĊĠĠĠĠĠĠĠ Ġval Ġgo Agent File Ġ= Ġget Go File ( record . os , Ġ" devops Agent ", Ġarch ) ĊĠĠĠĠĠĠĠ Ġval Ġgo Installer File Ġ= Ġget Go File ( record . os , Ġ" installer ", Ġarch ) ĊĠĠĠĠĠĠĠ Ġval Ġgo Up grader File Ġ= Ġget Go File ( record . os , Ġ" up grader ", Ġarch ) ĊĠĠĠĠĠĠĠ Ġval Ġpackage Files Ġ= Ġget Agent Package Files ( record . os ) ĊĠĠĠĠĠĠĠ Ġval Ġscript Files Ġ= Ġget Go Agent Script Files ( record ) ĊĠĠĠĠĠĠĠ Ġval Ġproperty File Ġ= ĠgetProperty File ( record ) ĊĊĠĠĠĠĠĠĠ Ġlogger . info (" Get Ġthe Ġscript Ġfiles Ġ(${ script Files . keys }) ") ĊĊĠĠĠĠĠĠĠ Ġreturn ĠResponse . ok ( Streaming Output Ġ{ Ġoutput Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġzip Out Ġ= ĠArchive Stream Factory (). create Archive OutputStream ( Archive Stream Factory . ZIP , Ġoutput ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! cert FilePath . isNull Or Blank ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcert File Ġ= ĠFile ( cert FilePath ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cert File . exists () Ġ&& Ġcert File . isFile ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġzip Out . put Archive Entry ( Zip Archive Entry ( cert File , ĠCERT _ FILE _ NAME )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIO Utils . copy ( FileInputStream ( cert File ), Ġzip Out ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġzip Out . close Archive Entry () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġjar Files . plus ( package Files ). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġzip Out . put Archive Entry ( Zip Archive Entry ( it , Ġit . name )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIO Utils . copy ( FileInputStream ( it ), Ġzip Out ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġzip Out . close Archive Entry () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġzip Binary File ( os Ġ= Ġrecord . os , Ġgo Agent File Ġ= Ġgo Agent File , ĠfileName Ġ= Ġ" devops Agent ", Ġzip Out Ġ= Ġzip Out ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġzip Binary File ( os Ġ= Ġrecord . os , Ġgo Agent File Ġ= Ġgo Daemon File , ĠfileName Ġ= Ġ" devops Daemon ", Ġzip Out Ġ= Ġzip Out ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġzip Binary File ( os Ġ= Ġrecord . os , Ġgo Agent File Ġ= Ġgo Installer File , ĠfileName Ġ= Ġ" tmp / installer ", Ġzip Out Ġ= Ġzip Out ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġzip Binary File ( os Ġ= Ġrecord . os , Ġgo Agent File Ġ= Ġgo Up grader File , ĠfileName Ġ= Ġ" tmp / up grader ", Ġzip Out Ġ= Ġzip Out ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġscript Files . forEach Ġ{ Ġ( name , Ġcontent ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġentry Ġ= ĠZip Archive Entry ( name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbytes Ġ= Ġcontent . toByteArray () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġentry . size Ġ= Ġbytes . size . to Long () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġentry . unix Mode Ġ= ĠAG ENT _ FILE _ MODE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġzip Out . put Archive Entry ( entry ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIO Utils . copy ( ByteArray InputStream ( bytes ), Ġzip Out ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġzip Out . close Archive Entry () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġproperty File . forEach Ġ{ Ġ( name , Ġcontent ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġentry Ġ= ĠZip Archive Entry ( name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbytes Ġ= Ġcontent . toByteArray () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġentry . size Ġ= Ġbytes . size . to Long () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġzip Out . put Archive Entry ( entry ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIO Utils . copy ( ByteArray InputStream ( bytes ), Ġzip Out ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġzip Out . close Archive Entry () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġzip Out . close () ĊĠĠĠĠĠĠĠ Ġ}, ĠMediaType . APPLICATION _ OCT ET _ STREAM _ TYPE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. header (" content - dis position ", Ġ" attachment ; Ġfilename Ġ= Ġagent . zip ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġzip Binary File ( os : ĠString , Ġgo Agent File : ĠFile , ĠfileName : ĠString , Ġzip Out : ĠArchive OutputStream ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfinal Filename Ġ= Ġif Ġ( os Ġ== ĠOS . WINDOWS . name ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ fileName . exe " ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠfileName ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġdev ops Agent Entry Ġ= ĠZip Archive Entry ( go Agent File , Ġfinal Filename ) ĊĠĠĠĠĠĠĠ Ġdev ops Agent Entry . unix Mode Ġ= ĠAG ENT _ FILE _ MODE ĊĠĠĠĠĠĠĠ Ġzip Out . put Archive Entry ( devops Agent Entry ) ĊĠĠĠĠĠĠĠ ĠIO Utils . copy ( FileInputStream ( go Agent File ), Ġzip Out ) ĊĠĠĠĠĠĠĠ Ġzip Out . close Archive Entry () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdownload Agent ( agent Id : ĠString , Ġarch : ĠAgent Arch Type ?): ĠResponse Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġagent Record Ġ= Ġget Agent Record ( agent Id ) ĊĠĠĠĠĠĠĠ Ġreturn Ġdownload Go Agent ( agent Id , Ġagent Record , Ġarch ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Agent Package Files ( os : ĠString ) Ġ= ĊĠĠĠĠĠĠĠ ĠFile ( agent Package , Ġ" packages /${ os . toLowerCase () }/ "). list Files () ĊĊĠĠĠ Ġprivate Ġfun Ġget Go Agent Jar Files ( os : ĠString , Ġarch : ĠAgent Arch Type ?): ĠList < File > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġagent Jar Ġ= Ġget Agent Jar File () ĊĠĠĠĠĠĠĠ Ġval Ġj re File Ġ= Ġget J re Zip File ( os , Ġarch ) ĊĠĠĠĠĠĠĠ Ġreturn ĠlistOf ( agent Jar , Ġj re File ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Go File ( os : ĠString , ĠfileName : ĠString , Ġarch : ĠAgent Arch Type ?): ĠFile Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġarch Str Ġ= Ġif Ġ( arch Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"" ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"_ ${ arch . arch }" ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġdaemon FileName Ġ= Ġwhen Ġ( os ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOS . WINDOWS . name Ġ-> Ġ" upgrade /$ fileName . exe " ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOS . MAC OS . name Ġ-> Ġ" upgrade /${ fileName }_ macos $ arch Str " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ" upgrade /${ fileName }_ linux $ arch Str " ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġdaemon File Ġ= ĠFile ( agent Package , Ġdaemon FileName ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! daemon File . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠNotFound Exception (" go Ġ$ fileName Ġfile Ġnot Ġexists ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġdaemon File ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Go Agent Script Files ( agent Record : ĠT Environment Third party Agent Record ): ĠMap < String /* Name */, ĠString > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠFile ( agent Package , Ġ" script /${ agent Record . os . toLowerCase () }") ĊĠĠĠĠĠĠĠ Ġval Ġscripts Ġ= Ġfile . list Files () ĊĠĠĠĠĠĠĠ Ġval Ġmap Ġ= Ġget Agent Replace Properties ( agent Record ) ĊĠĠĠĠĠĠĠ Ġreturn Ġscripts ?. associate Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcontent Ġ= Ġit . read Text ( Charsets . UTF _ 8 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmap . forEach Ġ{ Ġ( key , Ġvalue ) Ġ-> Ġcontent Ġ= Ġcontent . replace (" ## $ key ## ", Ġvalue ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . name Ġto Ġcontent ĊĠĠĠĠĠĠĠ Ġ} Ġ?: Ġempty Map () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠgetProperty File ( agent Record : ĠT Environment Third party Agent Record ): ĠMap < String , ĠString > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠFile ( agent Package , Ġ" config "). list Files () ĊĠĠĠĠĠĠĠ Ġval Ġmap Ġ= Ġget Agent Replace Properties ( agent Record ) ĊĠĠĠĠĠĠĠ Ġreturn Ġfile ?. filter Ġ{ Ġit . isFile Ġ} ?. associate Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcontent Ġ= Ġit . read Text ( Charsets . UTF _ 8 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmap . forEach Ġ{ Ġ( key , Ġvalue ) Ġ-> Ġcontent Ġ= Ġcontent . replace (" ## $ key ## ", Ġvalue ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . name Ġto Ġcontent ĊĠĠĠĠĠĠĠ Ġ} Ġ?: Ġempty Map () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdownload J re ( agent Id : ĠString , Ġe Tag : ĠString ?, Ġarch : ĠAgent Arch Type ?): ĠResponse Ġ{ ĊĠĠĠĠĠĠĠ Ġlogger . info (" download J re , Ġagent Id : Ġ$ agent Id , Ġe Tag : Ġ$ e Tag ") ĊĠĠĠĠĠĠĠ Ġval Ġrecord Ġ= Ġget Agent Record ( agent Id ) ĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= Ġget J re Zip File ( record . os , Ġarch ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! e Tag . isNull Or Blank ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( e Tag Ġ== ĠgetFile MD 5 ( file )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠResponse . status ( Response . Status . NOT _ MODI FIED ). build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠResponse . ok ( file . inputStream (), ĠMediaType . APPLICATION _ OCT ET _ STREAM _ TYPE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. header (" content - dis position ", Ġ" attachment ; Ġfilename Ġ= Ġj re . zip ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Agent Record ( agent Id : ĠString ): ĠT Environment Third party Agent Record Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġid Ġ= ĠHash Util . decode Id To Long ( agent Id ) ĊĠĠĠĠĠĠĠ Ġval Ġagent Record Ġ= Ġthird Party Agent Dao . get Agent ( dsl Context , Ġid ) ĊĠĠĠĠĠĠĠ Ġif Ġ( agent Record Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . warn (" The Ġagent ($ id ) Ġis Ġnot Ġexist ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠNotFound Exception (" The Ġagent Ġis Ġnot Ġexist ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġagent Record ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Agent Replace Properties ( agent Record : ĠT Environment Third party Agent Record ): ĠMap < String , ĠString > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġagent Id Ġ= ĠHash Util . encode Long Id ( agent Record . id ) ĊĠĠĠĠĠĠĠ Ġval Ġagent Url Ġ= Ġagent Url Service . gen Agent Url ( agent Record ) ĊĠĠĠĠĠĠĠ Ġval Ġgate Way Ġ= Ġagent Url Service . gen Gateway ( agent Record ) ĊĠĠĠĠĠĠĠ Ġval Ġfile Gateway Ġ= Ġagent Url Service . gen File Gateway ( agent Record ) ĊĠĠĠĠĠĠĠ Ġreturn Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" agent _ url " Ġto Ġagent Url , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" projectId " Ġto Ġagent Record . projectId , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" agent Id " Ġto Ġagent Id , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" agent SecretKey " Ġto ĠSecurity Util . decrypt ( agent Record . secret Key ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" gate Way " Ġto Ġgate Way , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" file Gateway " Ġto Ġfile Gateway , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" land un . env " Ġto Ġprofile . get Env (). name , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" agent Collector On " Ġto Ġagent Collector On ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Agent Jar File (): ĠFile Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġagent Jar Ġ= ĠFile ( agent Package , Ġ" jar / worker - agent . jar ") ĊĠĠĠĠĠĠĠ Ġif Ġ(! agent Jar . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠNotFound Exception (" The Ġworker - agent . jar Ġis Ġnot Ġexist ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġagent Jar ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget J re Zip File ( os : ĠString , Ġarch : ĠAgent Arch Type ?): ĠFile Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġarch Str Ġ= Ġif Ġ( arch Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"" ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"_ ${ arch . arch }" ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠFile ( agent Package , Ġ"/ jre /${ os . toLowerCase ()} $ arch Str / jre . zip ") ĊĠĠĠĠĠĠĠ Ġif Ġ(! file . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . warn (" The Ġj re Ġfile (${ file . absolute Path }) Ġis Ġnot Ġexist ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠFileNotFoundException (" The Ġj re Ġfile Ġis Ġnot Ġexist ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfile ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Upgrade File ( fileName : ĠString ): ĠFile Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠFile ( agent Package , ĠfileName ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! file . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . warn (" The Ġfile (${ file . absolute Path }) Ġis Ġnot Ġexist ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠFileNotFoundException (" The Ġfile Ġis Ġnot Ġexist ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfile ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġä¸º æĮĩå®ļ [ agent Hash Id ] çļĦ agent çĶŁæĪĲ å¹¶ ä¸ĭè½½ å®īè£ħ è¯¥ åı° agent æīĢ éľĢè¦ģ çļĦ åĬ¨æĢģ èĦļæľ¬ åĴĮ éħįç½® æī¹ æ¬¡ æĸĩä»¶ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġdownload Install Agent Batch File ( agent Hash Id : ĠString ): ĠResponse Ġ{ ĊĠĠĠĠĠĠĠ Ġlogger . info (" Trying Ġto Ġgen Ġthe Ġnew Ġagent Ġbatch . zip Ġfrom ($ agent Hash Id )") ĊĠĠĠĠĠĠĠ Ġval Ġrecord Ġ= Ġget Agent Record ( agent Hash Id ) ĊĊĠĠĠĠĠĠĠ Ġreturn ĠResponse . ok ( Streaming Output Ġ{ Ġoutput Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġzip Out Ġ= ĠArchive Stream Factory (). create Archive OutputStream ( Archive Stream Factory . ZIP , Ġoutput ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! cert FilePath . isNull Or Blank ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcert File Ġ= ĠFile ( cert FilePath ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cert File . exists () Ġ&& Ġcert File . isFile ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġzip Out . put Archive Entry ( Zip Archive Entry ( cert File , ĠCERT _ FILE _ NAME )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIO Utils . copy ( FileInputStream ( cert File ), Ġzip Out ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġzip Out . close Archive Entry () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Go Agent Script Files ( record ). forEach Ġ{ Ġ( name , Ġcontent ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" zip Ġthe Ġscript Ġfiles Ġ($ name )") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġentry Ġ= ĠZip Archive Entry ( name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbytes Ġ= Ġcontent . toByteArray () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġentry . size Ġ= Ġbytes . size . to Long () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġentry . unix Mode Ġ= ĠAG ENT _ FILE _ MODE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġzip Out . put Archive Entry ( entry ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIO Utils . copy ( ByteArray InputStream ( bytes ), Ġzip Out ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġzip Out . close Archive Entry () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠgetProperty File ( record ). forEach Ġ{ Ġ( name , Ġcontent ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" zip Ġthe Ġproperties Ġfiles Ġ($ name )") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġentry Ġ= ĠZip Archive Entry ( name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbytes Ġ= Ġcontent . toByteArray () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġentry . size Ġ= Ġbytes . size . to Long () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġzip Out . put Archive Entry ( entry ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIO Utils . copy ( ByteArray InputStream ( bytes ), Ġzip Out ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġzip Out . close Archive Entry () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġzip Out . close () ĊĠĠĠĠĠĠĠ Ġ}, ĠMediaType . APPLICATION _ OCT ET _ STREAM _ TYPE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. header (" content - dis position ", Ġ" attachment ; Ġfilename Ġ= Ġbatch . zip ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġlogger Ġ= ĠLoggerFactory . getLogger ( Download Agent Install Service :: class . java ) ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠAG ENT _ FILE _ MODE Ġ= Ġ 0 b 1 1 1 1 0 1 1 0 1 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠCERT _ FILE _ NAME Ġ= Ġ". cert " ĊĠĠĠ Ġ} Ċ } Ċ