package Ġcom . github . nik it av bv . servic emon itor . agent Ċ Ċ import Ġkotlinx . c interop . Byte Var Ċ import Ġkotlinx . c interop . alloc Ċ import Ġkotlinx . c interop . alloc Array Ċ import Ġkotlinx . c interop . convert Ċ import Ġkotlinx . c interop . mem Scoped Ċ import Ġkotlinx . c interop . native Heap Ċ import Ġkotlinx . c interop . ptr Ċ import Ġkotlinx . c interop . to K String Ċ import Ġplatform . posix . SEEK _ END Ċ import Ġplatform . posix . errno Ċ import Ġplatform . posix . exit Ċ import Ġplatform . posix . f gets Ċ import Ġplatform . posix . fopen Ċ import Ġplatform . posix . f read Ċ import Ġplatform . posix . f seek Ċ import Ġplatform . posix . ft ell Ċ import Ġplatform . posix . pc lose Ċ import Ġplatform . posix . per ror Ċ import Ġplatform . posix . p open Ċ import Ġplatform . posix . rewind Ċ import Ġplatform . posix . stat Ċ import Ġplatform . posix . str error Ċ Ċ val ĠIP _ V 4 _ TO _ IGNORE Ġ= ĠlistOf (" 1 2 7 . 0 . 0 . 1 ") Ċ val ĠIP _ V 6 _ TO _ IGNORE Ġ= Ġempty List < String >() Ċ Ċ fun Ġfile Exists ( fileName : ĠString ): ĠBoolean Ġ{ ĊĠĠĠ Ġval Ġstat Buf Ġ= Ġnative Heap . alloc < stat >() ĊĠĠĠ Ġreturn Ġstat ( fileName , Ġstat Buf . ptr ) Ġ== Ġ 0 Ċ } Ċ Ċ fun Ġrun Command ( cmd : ĠString ): ĠString Ġ{ ĊĠĠĠ Ġvar Ġresult : ĠString Ġ= Ġ"" ĊĠĠĠ Ġmem Scoped Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbuffer Length Ġ= Ġ 1 2 8 ĊĠĠĠĠĠĠĠ Ġval Ġbuffer Ġ= Ġalloc Array < Byte Var >( buffer Length ) ĊĠĠĠĠĠĠĠ Ġval Ġpipe Ġ= Ġp open ( cmd , Ġ" r ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠRuntimeException (" Failed Ġto Ġrun Ġ$ cmd : Ġp open () Ġfailed : Ġ${ str error ( errno )?. to K String () }") ĊĠĠĠĠĠĠĠ Ġwhile Ġ( f gets ( buffer , Ġbuffer Length , Ġpipe ) Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ+= Ġbuffer . to K String () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġp close ( pipe ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġresult Ċ } Ċ Ċ @ Experimental Unsigned Types Ċ fun ĠreadFile ( fileName : ĠString ): ĠString Ġ{ ĊĠĠĠ Ġval Ġfile Ġ= Ġfopen ( fileName , Ġ" r ") ĊĠĠĠ Ġif Ġ( file Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġperror (" Cannot Ġopen Ġfile Ġ$ fileName ") ĊĠĠĠĠĠĠĠ Ġexit (- 1 ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġf seek ( file , Ġ 0 , ĠSEEK _ END ) ĊĠĠĠ Ġval ĠfileSize Ġ= Ġft ell ( file ) ĊĠĠĠ Ġre wind ( file ) ĊĠĠĠ Ġreturn Ġmem Scoped Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbuffer Ġ= Ġalloc Array < Byte Var >( file Size ) ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġf read ( buffer , Ġ 1 , ĠfileSize . convert (), Ġfile ) ĊĠĠĠĠĠĠĠ Ġif Ġ( file Size Ġ!= Ġresult . to Long ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġperror (" File Ġread Ġerror : Ġread Ġless Ġbytes Ġthan Ġexpected Ġfrom Ġ$ fileName ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexit (- 1 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġbuffer . to K String () ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun ĠString . fields (): ĠList < String > Ġ{ ĊĠĠĠ Ġreturn Ġthis . split (" Ġ"). map Ġ{ Ġit . trim () Ġ} Ċ } Ċ Ċ fun Ġget OS Name And Version (): ĠString Ġ{ ĊĠĠĠ Ġval Ġl sb Output Ġ= Ġrun Command (" lsb _ release Ġ- d ") ĊĠĠĠ Ġreturn Ġl sb Output . replace (" Description :", Ġ""). trim () Ċ } Ċ Ċ fun Ġget IPv 4 (): ĠList < String > Ġ{ ĊĠĠĠ Ġreturn Ġrun Command (" ip Ġaddr "). lines (). map Ġ{ Ġit . trim () Ġ} ĊĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . startsWith (" inet Ġ") Ġ} ĊĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . split (" Ġ" )[ 1 ]. split ('/ ')[ 0 ] Ġ} ĊĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġ! IP _ V 4 _ TO _ IGNORE . contains ( it ) Ġ} Ċ } Ċ Ċ fun Ġget IPv 6 (): ĠList < String > Ġ{ ĊĠĠĠ Ġreturn Ġrun Command (" ip Ġ- 6 Ġaddr "). lines (). map Ġ{ Ġit . trim () Ġ} ĊĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . startsWith (" inet 6 Ġ") Ġ} ĊĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . split (" Ġ" )[ 1 ]. split ('/ ')[ 0 ] Ġ} ĊĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġ! IP _ V 6 _ TO _ IGNORE . contains ( it ) Ġ} Ċ } Ċ Ċ fun Ġgenerate Agent Name () Ġ= Ġget OS Name And Version () Ċ