package Ġnet . w ush il in . k ts Ċ Ċ import Ġjava . io . IOException Ċ Ċ fun ĠZ Pool _ List ( host : Host ): List < Z Pool State > Ġ{ ĊĠĠĠ Ġvar Ġresult Ġ= Ġmutable ListOf < Z Pool State >() ĊĠĠĠ Ġvar Ġlist Result Ġ= Ġhost . execute (" z pool Ġlist Ġ- o Ġname , size , cap , health ") ĊĠĠĠ Ġif ( list Result . is Successful ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġoutputs Ġ= Ġlist Result . outputs () ĊĠĠĠĠĠĠĠ Ġvar Ġsub list Ġ= Ġoutputs . filter { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . isNotBlank () ĊĠĠĠĠĠĠĠ Ġ}. to Mutable List () ĊĠĠĠĠĠĠĠ Ġsub list . remove First () ĊĠĠĠĠĠĠĠ Ġsub list . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġreversed Ġ= Ġit . reversed () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġdeli meter Ġ= Ġ" Ġ\ t " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġ( health R , Ġfirst 3 ) Ġ= Ġnext Token ( reversed , Ġdeli meter ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġ( cap R , Ġfirst 2 ) Ġ= Ġnext Token ( first 3 , Ġdeli meter ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġ( size R , Ġname R ) Ġ= Ġnext Token ( first 2 , Ġdeli meter ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġname Ġ= Ġname R . reversed () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġsize Ġ= Ġsize R . reversed () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcap Ġ= Ġcap R . reversed () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġhealth Ġ= Ġhealth R . reversed () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . add ( Z Pool State ( name , Ġsize , Ġcap . substring ( 0 , Ġcap . length Ġ- Ġ 1 ). toFloat ()/ 1 0 0 , Ġhealth )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠIOException (" Failed Ġto Ġrun Ġz pool Ġlist Ġat Ġtarget ") ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġresult Ċ } Ċ Ċ fun ĠZ Pool _ GetState ( host : Host , Ġpool : String ): Z Pool Status Ġ{ ĊĠĠĠ Ġvar Ġexec Result Ġ= Ġhost . execute (" z pool Ġstatus Ġ'$ pool '") ĊĠĠĠ Ġif (! exec Result . is Successful ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠIOException (" z pool Ġstatus Ġ'$ pool ' Ġdidn 't Ġsucceed , Ġcode :${ exec Result . exit Code }, Ġmsg :${ exec Result . error () }") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġoutputs Ġ= Ġexec Result . outputs () ĊĠĠĠ Ġvar Ġconfig Started Ġ= Ġfalse ĊĠĠĠ Ġvar Ġconfig Ended Ġ= Ġfalse ĊĊĠĠĠ Ġvar Ġstate Ġ= Ġ"" ĊĠĠĠ Ġvar Ġerrors Ġ= Ġ"" ĊĠĠĠ Ġvar Ġdisks Ġ= Ġmutable ListOf < Z Pool Disk Status >() ĊĠĠĠ Ġoutputs . forEach Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġdeli meter Ġ= Ġ" Ġ\ t :" ĊĠĠĠĠĠĠĠ Ġvar Ġline Ġ= Ġit . trim () ĊĠĠĠĠĠĠĠ Ġif (! config Started ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( line Ġ== Ġ"") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ forEach ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġ( key , Ġremaining ) Ġ= Ġnext Token ( line , Ġdeli meter ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( key Ġ== Ġ" state ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate Ġ= Ġremaining ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( key Ġ== Ġ" config ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconfig Started Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ forEach ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġread Ġconfigs ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif (! config Ended ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( line Ġ== Ġ"" Ġ&& Ġdisks . size Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconfig Ended Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ forEach ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( line Ġ== Ġ"") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ forEach ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġ( matched , Ġmatch Result ) Ġ= Ġmatch Whole ( line , Ġ"^ \\ s *( .* ?) \\ s +( \\ S +) \\ s +( \\ d +) \\ s +( \\ d +) \\ s +( \\ d + ). *$ ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! matched ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ forEach ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġdisk Status Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠZ Pool Disk Status ( match Result [ 1 ], Ġmatch Result [ 2 ], Ġmatch Result [ 3 ]. toInt (), Ġmatch Result [ 4 ]. toInt (), Ġmatch Result [ 5 ]. toInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdisks . add ( disk Status ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( line Ġ== Ġ"") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ forEach ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġdeli meter Ġ= Ġ" Ġ\ t :" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġ( name , Ġremaining ) Ġ= Ġnext Token ( line , Ġdeli meter ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerrors Ġ= Ġremaining ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn ĠZ Pool Status ( pool , Ġstate , Ġdisks , Ġerrors ) Ċ } Ċ Ċ fun ĠZ FS _ Snapshot ( host : Host , Ġz fs : String , Ġsnapshot : String ) Ġ{ ĊĠĠĠ Ġvar Ġcreate Result Ġ= Ġhost . execute (" z fs Ġsnapshot Ġ'$ z fs @ $ snapshot '") ĊĠĠĠ Ġif (! create Result . is Successful ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠIOException (" Create Ġsnapshot Ġfailed : Ġ${ create Result . error () }") ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun ĠZ FS _ Send ( src Host : Host , Ġsrc Snapshot : String , Ġparent Snapshot : String , Ġdest Host : Host , Ġremote Z FS : String ) Ġ{ ĊĠĠĠ Ġvar Ġrun Result : ĠProcess Result ĊĠĠĠ Ġvar Ġss ht ag Ġ= Ġ" ssh Ġ${ dest Host . user }@ ${ dest Host . host }" ĊĠĠĠ Ġif ( dest Host . is The Same ( src Host )) Ġ{ ĊĠĠĠĠĠĠĠ Ġss ht ag Ġ= Ġ"" ĊĠĠĠ Ġ} ĊĠĠĠ Ġif ( parent Snapshot Ġ!= Ġ"") Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġcommand Ġ= Ġ" z fs Ġsend Ġ- I Ġ'$ parent Snapshot ' Ġ'$ src Snapshot ' Ġ| Ġ$ ss ht ag Ġz fs Ġrecv Ġ'$ remote Z FS '" ĊĠĠĠĠĠĠĠ Ġrun Result Ġ= Ġsrc Host . execute ( command ) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġcommand Ġ= Ġ" z fs Ġsend Ġ'$ src Snapshot ' Ġ| Ġ$ ss ht ag Ġz fs Ġrecv Ġ'$ remote Z FS '" ĊĠĠĠĠĠĠĠ Ġrun Result Ġ= Ġsrc Host . execute ( command ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġif (! run Result . is Successful ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠIOException (" Z FS ĠSend Ġerror : Ġ${ run Result . error () }") ĊĠĠĠ Ġ} Ċ } Ċ fun ĠZ FS _ Rollback Snapshot ( host : Host , Ġz fs : String , Ġsnapshot : String ) Ġ{ ĊĠĠĠ Ġvar Ġrollback Result Ġ= Ġhost . execute (" z fs Ġrollback Ġ- r Ġ'$ z fs @ $ snapshot '") ĊĠĠĠ Ġif (! rollback Result . is Successful ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠIOException (" Rollback Ġsnapshot Ġfailed : Ġ${ rollback Result . error () }") ĊĠĠĠ Ġ} Ċ } Ċ fun ĠZ FS _ Destroy Snapshot ( host : Host , Ġz fs : String , Ġsnapshot : String ) Ġ{ ĊĠĠĠ Ġvar Ġdelete Result Ġ= Ġhost . execute (" z fs Ġdestroy Ġ'$ z fs @ $ snapshot '") ĊĠĠĠ Ġif (! delete Result . is Successful ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠIOException (" Delete Ġsnapshot Ġfailed : Ġ${ delete Result . error () }") ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun ĠZ FS _ List ( host : ĠHost ): List < Z FS > Ġ{ ĊĠĠĠ Ġvar Ġresult Ġ= Ġmutable ListOf < Z FS >() ĊĠĠĠ Ġvar Ġlist Result Ġ= Ġhost . execute (" z fs Ġlist ") ĊĠĠĠ Ġif (! list Result . is Successful ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠIOException (" z fs Ġlist Ġfailed , Ġ${ list Result . error () }") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġoutputs Ġ= Ġlist Result . outputs (). to Mutable List () ĊĠĠĠ Ġoutputs . remove First () ĊĊĠĠĠ Ġoutputs . forEach Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġ( matched , Ġgroups ) Ġ= Ġmatch Whole ( it , Ġ"^ \\ s *( .* ?) \\ s +( \\ S +) \\ s +( \\ S +) \\ s +( \\ S +) \\ s +( .* ?) \\ s *$ ") ĊĠĠĠĠĠĠĠ Ġif ( matched ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġnew Z fs Ġ= ĠZ FS ( name = groups [ 1 ], Ġused = groups [ 2 ], Ġavailable = groups [ 3 ], Ġrefer = groups [ 4 ], Ġmount Point = groups [ 5 ]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . add ( new Z fs ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġresult Ċ } Ċ Ċ fun ĠZ FS _ Get Snap Shot ( host : ĠHost , Ġname : String ): List < ZF SS nap Shot >{ ĊĠĠĠ Ġvar Ġexec Result Ġ= Ġhost . execute (" z fs Ġlist Ġ- t Ġsnapshot Ġ- r Ġ'$ name '") ĊĠĠĠ Ġif (! exec Result . is Successful ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠIOException (" z fs Ġlist Ġ- t Ġsnapshot Ġfailed : Ġ${ exec Result . error () }") ĊĠĠĠ Ġ} ĊĠĠĠ Ġvar Ġresult Ġ= Ġmutable ListOf < ZF SS nap Shot >() ĊĠĠĠ Ġvar Ġoutputs Ġ= Ġexec Result . outputs (). to Mutable List () ĊĠĠĠ Ġoutputs . remove First () ĊĠĠĠ Ġoutputs . filter Ġ{ ĊĠĠĠĠĠĠĠ Ġit . isNotBlank () ĊĠĠĠ Ġ}. forEach Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġline Ġ= Ġit ĊĠĠĠĠĠĠĠ Ġvar Ġ( matched , Ġgroups ) Ġ= Ġmatch Whole ( line , Ġ"^ \\ s *( .* ?) \\ s +( \\ d \\ S *) \\ s +( \\ S +) \\ s +( \\ d \\ S *) \\ s +( \\ S +) \\ s *$ ") ĊĠĠĠĠĠĠĠ Ġif ( matched ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġsnapshot Name Ġ= Ġgroups [ 1 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( snapshot Name . indexOf ("$ name @ ") Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ forEach ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġused Ġ= Ġgroups [ 2 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġavailable Ġ= Ġgroups [ 3 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġrefer Ġ= Ġgroups [ 4 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġmount Point Ġ= Ġgroups [ 5 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġindex Ġ= Ġsnapshot Name . indexOf ('@ ') ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġz fs Ġ= Ġsnapshot Name . substring ( 0 , Ġindex ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġsnapshot Ġ= Ġsnapshot Name . substring ( index Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . add ( ZF SS nap Shot ( z fs , Ġsnapshot , Ġused , Ġavailable , Ġrefer , Ġmount Point )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġresult Ċ } Ċ Ċ fun ĠZ FS _ GetProperty ( host : Host , Ġname : String ): Map < String , ĠZ FS Property > Ġ{ ĊĠĠĠ Ġval Ġresult Ġ= Ġmutable Map Of < String , ĠZ FS Property >() ĊĠĠĠ Ġval Ġrun Result Ġ= Ġhost . execute (" z fs Ġget Ġall Ġ'$ name '") ĊĠĠĠ Ġif (! run Result . is Successful ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠIOException (" Failed Ġget ĠZ FS Ġproperty : Ġ${ run Result . error () }") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġoutputs Ġ= Ġrun Result . outputs (). to Mutable List () ĊĠĠĠ Ġval Ġfirst Line Ġ= Ġoutputs . remove First () ĊĠĠĠ Ġval Ġstart First Ġ= Ġfirst Line . indexOf (" NAME ") ĊĠĠĠ Ġval Ġstart Second Ġ= Ġfirst Line . indexOf (" PROPERTY ") ĊĠĠĠ Ġval Ġstart Third Ġ= Ġfirst Line . indexOf (" VALUE ") ĊĠĠĠ Ġval Ġstart Last Ġ= Ġfirst Line . indexOf (" SOURCE ") ĊĠĠĠ Ġoutputs . forEach Ġ{ ĊĠĠĠĠĠĠĠ Ġif ( start Last Ġ>= Ġit . length ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ forEach ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġit . substring ( start First , Ġstart Second ). trim () ĊĠĠĠĠĠĠĠ Ġval Ġproperty Ġ= Ġit . substring ( start Second , Ġstart Third ). trim () ĊĠĠĠĠĠĠĠ Ġvar Ġvalue Ġ= Ġit . substring ( start Third , Ġstart Last ). trim () ĊĠĠĠĠĠĠĠ Ġvar Ġsource Ġ= Ġit . substring ( start Last ). trim () ĊĠĠĠĠĠĠĠ Ġif ( source Ġ== Ġ"- ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsource Ġ= Ġ"" ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif ( value Ġ== Ġ"- ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= Ġ"" ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġvar Ġnew Stat Ġ= ĠZ FS Property ( name , Ġproperty , Ġvalue , Ġsource ) ĊĠĠĠĠĠĠĠ Ġresult [ property ] Ġ= Ġnew Stat ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġresult Ċ } Ċ Ċ data Ġclass ĠZ F SS nap Shot ( var Ġz fs : String , Ġvar Ġsnapshot : String , Ġval Ġused : String , Ġval Ġavailable : String , Ġval Ġrefer : String , Ġval Ġmount Point : String ) Ċ data Ġclass ĠZ FS ( val Ġname : String , Ġval Ġused : String , Ġval Ġavailable : String , Ġval Ġrefer : String , Ġval Ġmount Point : String ) Ċ data Ġclass ĠZ Pool State ( val Ġname : String , Ġval Ġsize : String , Ġval Ġcap : Float , Ġval Ġhealth : String ) Ċ data Ġclass ĠZ Pool Status ( val Ġname : String , Ġval Ġstate : String , Ġval Ġdisk Status : List < Z Pool Disk Status >, Ġval Ġerrors : String ) Ċ data Ġclass ĠZ Pool Disk Status ( val Ġname : String , Ġval Ġstate : String , Ġval Ġread Error : Int , Ġval Ġwrite Error : Int , Ġval Ġck sum Error : Int ) Ċ data Ġclass ĠZ FS Property ( val Ġz fs : String , Ġval ĠpropertyName : String , Ġval Ġproperty Value : String , Ġval Ġsource : String ) Ċ