package Ġcom . bare metal cloud . k mp ssh Ċ Ċ import Ġcom . j craft . js ch . Channel Exec Ċ import Ġjava . io . InputStream Ċ import Ġjava . io . Inter rupted IOException Ċ import Ġjava . nio . Buffer Ċ import Ġjava . nio . ByteBuffer Ċ import Ġjava . nio . charset . Charset Ċ Ċ class ĠInputStream Thread ( ĊĠĠĠ Ġval Ġchannel : ĠChannel Exec , ĊĠĠĠ Ġval Ġinput : ĠInputStream , ĊĠĠĠ Ġval Ġoutput : ĠExec Result . () Ġ-> ĠUnit , ĊĠĠĠ Ġval Ġcharset : ĠCharset Ċ ) Ġ: ĠThread () Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun ĠInstance ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchannel : ĠChannel Exec , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinput : ĠInputStream , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutput : ĠExec Result . () Ġ-> ĠUnit , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcharset : ĠCharset ĊĠĠĠĠĠĠĠ Ġ): ĠInputStream Thread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew thread Ġ= ĠInputStream Thread ( channel , Ġinput , Ġoutput , Ġcharset ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew thread . start () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnew thread ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġrun () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbuf size Ġ= Ġ 1 6 Ġ* Ġ 1 0 2 4 ĊĠĠĠĠĠĠĠ Ġval Ġb input Ġ= Ġinput . buffered () ĊĠĠĠĠĠĠĠ Ġval Ġbytes Ġ= ĠByteArray ( buf size ) ĊĠĠĠĠĠĠĠ Ġval Ġbuffer Ġ= ĠByteBuffer . allocate ( buf size ) ĊĠĠĠĠĠĠĠ Ġval Ġapp ender Ġ= ĠStringBuilder () ĊĠĠĠĠĠĠĠ Ġvar Ġeof re ached Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhow many Ġ= Ġb input . read ( bytes , Ġ 0 , Ġbuf size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( how many Ġ== Ġ- 1 ) Ġeof re ached Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( how many Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer . put ( bytes , Ġ 0 , Ġhow many ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( buffer Ġas ĠBuffer ). flip () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcb Out Ġ= Ġcharset . decode ( buffer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer . compact () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapp ender . append ( cb Out . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġs Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġe : ĠInt ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe Ġ= Ġapp ender . indexOf ("\ n ", Ġs ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( e Ġ>= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠExec Result . Exec Part ( appender . substring ( s , Ġe )). output () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġs Ġ= Ġe Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ( e Ġ!= Ġ- 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapp ender . delete ( 0 , Ġs ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ(! eof re ached ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( appender . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠExec Result . Exec Part ( appender . toString ()). output () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠExec Result . Exec End ( channel . exit Status ). output () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠInter rupted IOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠExec Result . Exec Timeout (). output () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠInterruptedException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠExec Result . Exec Timeout (). output () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ