/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 1 9 , ĠPro jekt ĠDevelopment ĠLLC . Ċ Ġ* Ċ Ġ* ĠSPDX - License - Identifier : ĠApache - 2 . 0 Ċ Ġ*/ Ċ Ċ package Ġprojekt . commons . shell Ċ Ċ import Ġjava . io . BufferedReader Ċ import Ġjava . io . Data OutputStream Ċ import Ġjava . io . InputStream Reader Ċ import Ġjava . util .* Ċ import Ġkotlin . collections . ArrayList Ċ Ċ /** Ċ Ġ* ĠMain Ġclass Ġfor Ġshell Ġhelpers , Ġby Ġdefault Ġnon - root Ġshell Ġwill Ġbe Ġinitialized . Ċ Ġ*/ Ċ object ĠShell Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġproc Ġ= ĠProcess Builder (" sh "). apply Ġ{ Ġredirect Error Stream ( true ) Ġ}. start () ĊĠĠĠ Ġprivate Ġvar Ġwriter Ġ= ĠData OutputStream ( proc . output Stream ) ĊĠĠĠ Ġprivate Ġvar Ġoutput Reader Ġ= ĠBufferedReader ( InputStream Reader ( proc . inputStream )) ĊĠĠĠ Ġprivate Ġvar Ġis Root Ġ= Ġfalse ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRe initialize Ġshell Ġprocess Ġwith Ġroot Ġaccess ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġre initWith Root () Ġ{ ĊĠĠĠĠĠĠĠ Ġproc Ġ= ĠProcess Builder (" su "). apply Ġ{ Ġredirect Error Stream ( true ) Ġ}. start () ĊĠĠĠĠĠĠĠ Ġwriter Ġ= ĠData OutputStream ( proc . output Stream ) ĊĠĠĠĠĠĠĠ Ġoutput Reader Ġ= ĠBufferedReader ( InputStream Reader ( proc . inputStream )) ĊĠĠĠĠĠĠĠ Ġis Root Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCheck Ġif Ġroot Ġaccess Ġis Ġavailable ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġ` true ` Ġif Ġroot Ġaccess Ġis Ġavailable ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġroot Access (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ(! is Root ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexec (" echo Ġre vel "). output [ 0 ] Ġ== Ġ" re vel " ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠExec utes Ġcommand Ġwith Ġinitialized Ġshell Ġprocess ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġcommand Ġthe Ġcommand Ġto Ġbe Ġexecuted ĊĠĠĠĠ Ġ* Ġ@ return Ġ[ Result ] Ġof Ġcommand ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġexec ( command : ĠString ): ĠResult Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġexec ( array Of ( command )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠExec utes Ġcommand Ġwith Ġinitialized Ġshell Ġprocess ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġcommands Ġarray Ġof Ġcommands Ġto Ġbe Ġexecuted Ġin Ġsequence ĊĠĠĠĠ Ġ* Ġ@ return Ġ[ Result ] Ġof Ġcommands ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Synchron ized Ġfun Ġexec ( commands : ĠArray < String >): ĠResult Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġoutput Ġ= Ġarray ListOf < String >() ĊĠĠĠĠĠĠĠ Ġval Ġcallback Ġ= ĠUUID . randomUUID (). toString () ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwriter . run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcommands . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Bytes ("$ it \ n ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġflush () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Bytes (" echo Ġ$ callback \ n ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġflush () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġline Ġ= Ġoutput Reader . readLine () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( line Ġ== Ġcallback ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput . add ( line ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ignored : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġignored . printStackTrace () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠResult ( output ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġresult Ġof Ġexecuted Ġcommand ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġoutput ĠOutput Ġof Ġexecuted Ġcommand ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġdata Ġclass ĠResult ( val Ġoutput : ĠArrayList < String >) Ċ } Ċ