PNG  IHDRX cHRMz&u0`:pQ<bKGD pHYsodtIME MeqIDATxw]Wug^Qd˶ 6`!N:!@xI~)%7%@Bh&`lnjVF29gΨ4E$|>cɚ{gk= %,a KX%,a KX%,a KX%,a KX%,a KX%,a KX%, b` ǟzeאfp]<!SJmɤY޲ڿ,%c ~ع9VH.!Ͳz&QynֺTkRR.BLHi٪:l;@(!MԴ=žI,:o&N'Kù\vRmJ雵֫AWic H@" !: Cé||]k-Ha oݜ:y F())u]aG7*JV@J415p=sZH!=!DRʯvɱh~V\}v/GKY$n]"X"}t@ xS76^[bw4dsce)2dU0 CkMa-U5tvLƀ~mlMwfGE/-]7XAƟ`׮g ewxwC4\[~7@O-Q( a*XGƒ{ ՟}$_y3tĐƤatgvێi|K=uVyrŲlLӪuܿzwk$m87k( `múcE)"@rK( z4$D; 2kW=Xb$V[Ru819קR~qloѱDyįݎ*mxw]y5e4K@ЃI0A D@"BDk_)N\8͜9dz"fK0zɿvM /.:2O{ Nb=M=7>??Zuo32 DLD@D| &+֎C #B8ַ`bOb $D#ͮҪtx]%`ES`Ru[=¾!@Od37LJ0!OIR4m]GZRJu$‡c=%~s@6SKy?CeIh:[vR@Lh | (BhAMy=݃  G"'wzn޺~8ԽSh ~T*A:xR[ܹ?X[uKL_=fDȊ؂p0}7=D$Ekq!/t.*2ʼnDbŞ}DijYaȲ(""6HA;:LzxQ‘(SQQ}*PL*fc\s `/d'QXW, e`#kPGZuŞuO{{wm[&NBTiiI0bukcA9<4@SӊH*؎4U/'2U5.(9JuDfrޱtycU%j(:RUbArLֺN)udA':uGQN"-"Is.*+k@ `Ojs@yU/ H:l;@yyTn}_yw!VkRJ4P)~y#)r,D =ě"Q]ci'%HI4ZL0"MJy 8A{ aN<8D"1#IJi >XjX֔#@>-{vN!8tRݻ^)N_╗FJEk]CT՟ YP:_|H1@ CBk]yKYp|og?*dGvzنzӴzjֺNkC~AbZƷ`.H)=!QͷVTT(| u78y֮}|[8-Vjp%2JPk[}ԉaH8Wpqhwr:vWª<}l77_~{s۴V+RCģ%WRZ\AqHifɤL36: #F:p]Bq/z{0CU6ݳEv_^k7'>sq*+kH%a`0ԣisqにtү04gVgW΂iJiS'3w.w}l6MC2uԯ|>JF5`fV5m`Y**Db1FKNttu]4ccsQNnex/87+}xaUW9y>ͯ骵G{䩓Գ3+vU}~jJ.NFRD7<aJDB1#ҳgSb,+CS?/ VG J?|?,2#M9}B)MiE+G`-wo߫V`fio(}S^4e~V4bHOYb"b#E)dda:'?}׮4繏`{7Z"uny-?ǹ;0MKx{:_pÚmFמ:F " .LFQLG)Q8qN q¯¯3wOvxDb\. BKD9_NN &L:4D{mm o^tֽ:q!ƥ}K+<"m78N< ywsard5+вz~mnG)=}lYݧNj'QJS{S :UYS-952?&O-:W}(!6Mk4+>A>j+i|<<|;ر^߉=HE|V#F)Emm#}/"y GII웻Jі94+v뾧xu~5C95~ūH>c@덉pʃ1/4-A2G%7>m;–Y,cyyaln" ?ƻ!ʪ<{~h~i y.zZB̃/,雋SiC/JFMmBH&&FAbϓO^tubbb_hZ{_QZ-sύodFgO(6]TJA˯#`۶ɟ( %$&+V'~hiYy>922 Wp74Zkq+Ovn錄c>8~GqܲcWꂎz@"1A.}T)uiW4="jJ2W7mU/N0gcqܗOO}?9/wìXžΏ0 >֩(V^Rh32!Hj5`;O28؇2#ݕf3 ?sJd8NJ@7O0 b־?lldщ̡&|9C.8RTWwxWy46ah嘦mh٤&l zCy!PY?: CJyв]dm4ǜҐR޻RլhX{FƯanшQI@x' ao(kUUuxW_Ñ줮[w8 FRJ(8˼)_mQ _!RJhm=!cVmm ?sFOnll6Qk}alY}; "baӌ~M0w,Ggw2W:G/k2%R,_=u`WU R.9T"v,<\Ik޽/2110Ӿxc0gyC&Ny޽JҢrV6N ``یeA16"J³+Rj*;BϜkZPJaÍ<Jyw:NP8/D$ 011z֊Ⱳ3ι֘k1V_"h!JPIΣ'ɜ* aEAd:ݺ>y<}Lp&PlRfTb1]o .2EW\ͮ]38؋rTJsǏP@芎sF\> P^+dYJLbJ C-xϐn> ι$nj,;Ǖa FU *择|h ~izť3ᤓ`K'-f tL7JK+vf2)V'-sFuB4i+m+@My=O҈0"|Yxoj,3]:cо3 $#uŘ%Y"y죯LebqtҢVzq¼X)~>4L׶m~[1_k?kxֺQ`\ |ٛY4Ѯr!)N9{56(iNq}O()Em]=F&u?$HypWUeB\k]JɩSع9 Zqg4ZĊo oMcjZBU]B\TUd34ݝ~:7ڶSUsB0Z3srx 7`:5xcx !qZA!;%͚7&P H<WL!džOb5kF)xor^aujƍ7 Ǡ8/p^(L>ὴ-B,{ۇWzֺ^k]3\EE@7>lYBȝR.oHnXO/}sB|.i@ɥDB4tcm,@ӣgdtJ!lH$_vN166L__'Z)y&kH;:,Y7=J 9cG) V\hjiE;gya~%ks_nC~Er er)muuMg2;֫R)Md) ,¶ 2-wr#F7<-BBn~_(o=KO㭇[Xv eN_SMgSҐ BS헃D%g_N:/pe -wkG*9yYSZS.9cREL !k}<4_Xs#FmҶ:7R$i,fi!~' # !6/S6y@kZkZcX)%5V4P]VGYq%H1!;e1MV<!ϐHO021Dp= HMs~~a)ަu7G^];git!Frl]H/L$=AeUvZE4P\.,xi {-~p?2b#amXAHq)MWǾI_r`S Hz&|{ +ʖ_= (YS(_g0a03M`I&'9vl?MM+m~}*xT۲(fY*V4x@29s{DaY"toGNTO+xCAO~4Ϳ;p`Ѫ:>Ҵ7K 3}+0 387x\)a"/E>qpWB=1 ¨"MP(\xp߫́A3+J] n[ʼnӼaTbZUWb={~2ooKױӰp(CS\S筐R*JغV&&"FA}J>G֐p1ٸbk7 ŘH$JoN <8s^yk_[;gy-;߉DV{c B yce% aJhDȶ 2IdйIB/^n0tNtџdcKj4϶v~- CBcgqx9= PJ) dMsjpYB] GD4RDWX +h{y`,3ꊕ$`zj*N^TP4L:Iz9~6s) Ga:?y*J~?OrMwP\](21sZUD ?ܟQ5Q%ggW6QdO+\@ ̪X'GxN @'4=ˋ+*VwN ne_|(/BDfj5(Dq<*tNt1х!MV.C0 32b#?n0pzj#!38}޴o1KovCJ`8ŗ_"]] rDUy޲@ Ȗ-;xџ'^Y`zEd?0„ DAL18IS]VGq\4o !swV7ˣι%4FѮ~}6)OgS[~Q vcYbL!wG3 7띸*E Pql8=jT\꘿I(z<[6OrR8ºC~ډ]=rNl[g|v TMTղb-o}OrP^Q]<98S¤!k)G(Vkwyqyr޽Nv`N/e p/~NAOk \I:G6]4+K;j$R:Mi #*[AȚT,ʰ,;N{HZTGMoּy) ]%dHء9Պ䠬|<45,\=[bƟ8QXeB3- &dҩ^{>/86bXmZ]]yޚN[(WAHL$YAgDKp=5GHjU&99v簪C0vygln*P)9^͞}lMuiH!̍#DoRBn9l@ xA/_v=ȺT{7Yt2N"4!YN`ae >Q<XMydEB`VU}u]嫇.%e^ánE87Mu\t`cP=AD/G)sI"@MP;)]%fH9'FNsj1pVhY&9=0pfuJ&gޤx+k:!r˭wkl03׼Ku C &ѓYt{.O.zҏ z}/tf_wEp2gvX)GN#I ݭ߽v/ .& и(ZF{e"=V!{zW`, ]+LGz"(UJp|j( #V4, 8B 0 9OkRrlɱl94)'VH9=9W|>PS['G(*I1==C<5"Pg+x'K5EMd؞Af8lG ?D FtoB[je?{k3zQ vZ;%Ɠ,]E>KZ+T/ EJxOZ1i #T<@ I}q9/t'zi(EMqw`mYkU6;[t4DPeckeM;H}_g pMww}k6#H㶏+b8雡Sxp)&C $@'b,fPߑt$RbJ'vznuS ~8='72_`{q纶|Q)Xk}cPz9p7O:'|G~8wx(a 0QCko|0ASD>Ip=4Q, d|F8RcU"/KM opKle M3#i0c%<7׿p&pZq[TR"BpqauIp$ 8~Ĩ!8Սx\ւdT>>Z40ks7 z2IQ}ItԀ<-%S⍤};zIb$I 5K}Q͙D8UguWE$Jh )cu4N tZl+[]M4k8֦Zeq֮M7uIqG 1==tLtR,ƜSrHYt&QP윯Lg' I,3@P'}'R˪e/%-Auv·ñ\> vDJzlӾNv5:|K/Jb6KI9)Zh*ZAi`?S {aiVDԲuy5W7pWeQJk֤#5&V<̺@/GH?^τZL|IJNvI:'P=Ϛt"¨=cud S Q.Ki0 !cJy;LJR;G{BJy޺[^8fK6)=yʊ+(k|&xQ2`L?Ȓ2@Mf 0C`6-%pKpm')c$׻K5[J*U[/#hH!6acB JA _|uMvDyk y)6OPYjœ50VT K}cǻP[ $:]4MEA.y)|B)cf-A?(e|lɉ#P9V)[9t.EiQPDѠ3ϴ;E:+Օ t ȥ~|_N2,ZJLt4! %ա]u {+=p.GhNcŞQI?Nd'yeh n7zi1DB)1S | S#ًZs2|Ɛy$F SxeX{7Vl.Src3E℃Q>b6G ўYCmtկ~=K0f(=LrAS GN'ɹ9<\!a`)֕y[uՍ[09` 9 +57ts6}b4{oqd+J5fa/,97J#6yν99mRWxJyѡyu_TJc`~W>l^q#Ts#2"nD1%fS)FU w{ܯ R{ ˎ󅃏џDsZSQS;LV;7 Od1&1n$ N /.q3~eNɪ]E#oM~}v֯FڦwyZ=<<>Xo稯lfMFV6p02|*=tV!c~]fa5Y^Q_WN|Vs 0ҘދU97OI'N2'8N֭fgg-}V%y]U4 峧p*91#9U kCac_AFңĪy뚇Y_AiuYyTTYЗ-(!JFLt›17uTozc. S;7A&&<ԋ5y;Ro+:' *eYJkWR[@F %SHWP 72k4 qLd'J "zB6{AC0ƁA6U.'F3:Ȅ(9ΜL;D]m8ڥ9}dU "v!;*13Rg^fJyShyy5auA?ɩGHRjo^]׽S)Fm\toy 4WQS@mE#%5ʈfFYDX ~D5Ϡ9tE9So_aU4?Ѽm%&c{n>.KW1Tlb}:j uGi(JgcYj0qn+>) %\!4{LaJso d||u//P_y7iRJ߬nHOy) l+@$($VFIQ9%EeKʈU. ia&FY̒mZ=)+qqoQn >L!qCiDB;Y<%} OgBxB!ØuG)WG9y(Ą{_yesuZmZZey'Wg#C~1Cev@0D $a@˲(.._GimA:uyw֬%;@!JkQVM_Ow:P.s\)ot- ˹"`B,e CRtaEUP<0'}r3[>?G8xU~Nqu;Wm8\RIkբ^5@k+5(By'L&'gBJ3ݶ!/㮻w҅ yqPWUg<e"Qy*167΃sJ\oz]T*UQ<\FԎ`HaNmڜ6DysCask8wP8y9``GJ9lF\G g's Nn͵MLN֪u$| /|7=]O)6s !ĴAKh]q_ap $HH'\1jB^s\|- W1:=6lJBqjY^LsPk""`]w)󭃈,(HC ?䔨Y$Sʣ{4Z+0NvQkhol6C.婧/u]FwiVjZka&%6\F*Ny#8O,22+|Db~d ~Çwc N:FuuCe&oZ(l;@ee-+Wn`44AMK➝2BRՈt7g*1gph9N) *"TF*R(#'88pm=}X]u[i7bEc|\~EMn}P瘊J)K.0i1M6=7'_\kaZ(Th{K*GJyytw"IO-PWJk)..axӝ47"89Cc7ĐBiZx 7m!fy|ϿF9CbȩV 9V-՛^pV̌ɄS#Bv4-@]Vxt-Z, &ֺ*diؠ2^VXbs֔Ìl.jQ]Y[47gj=幽ex)A0ip׳ W2[ᎇhuE^~q흙L} #-b۸oFJ_QP3r6jr+"nfzRJTUqoaۍ /$d8Mx'ݓ= OՃ| )$2mcM*cЙj}f };n YG w0Ia!1Q.oYfr]DyISaP}"dIӗթO67jqR ҊƐƈaɤGG|h;t]䗖oSv|iZqX)oalv;۩meEJ\!8=$4QU4Xo&VEĊ YS^E#d,yX_> ۘ-e\ "Wa6uLĜZi`aD9.% w~mB(02G[6y.773a7 /=o7D)$Z 66 $bY^\CuP. (x'"J60׿Y:Oi;F{w佩b+\Yi`TDWa~|VH)8q/=9!g߆2Y)?ND)%?Ǐ`k/sn:;O299yB=a[Ng 3˲N}vLNy;*?x?~L&=xyӴ~}q{qE*IQ^^ͧvü{Huu=R|>JyUlZV, B~/YF!Y\u_ݼF{_C)LD]m {H 0ihhadd nUkf3oٺCvE\)QJi+֥@tDJkB$1!Đr0XQ|q?d2) Ӣ_}qv-< FŊ߫%roppVBwü~JidY4:}L6M7f٬F "?71<2#?Jyy4뷢<_a7_=Q E=S1И/9{+93֮E{ǂw{))?maÆm(uLE#lïZ  ~d];+]h j?!|$F}*"4(v'8s<ŏUkm7^7no1w2ؗ}TrͿEk>p'8OB7d7R(A 9.*Mi^ͳ; eeUwS+C)uO@ =Sy]` }l8^ZzRXj[^iUɺ$tj))<sbDJfg=Pk_{xaKo1:-uyG0M ԃ\0Lvuy'ȱc2Ji AdyVgVh!{]/&}}ċJ#%d !+87<;qN޼Nفl|1N:8ya  8}k¾+-$4FiZYÔXk*I&'@iI99)HSh4+2G:tGhS^繿 Kتm0 вDk}֚+QT4;sC}rՅE,8CX-e~>G&'9xpW,%Fh,Ry56Y–hW-(v_,? ; qrBk4-V7HQ;ˇ^Gv1JVV%,ik;D_W!))+BoS4QsTM;gt+ndS-~:11Sgv!0qRVh!"Ȋ(̦Yl.]PQWgٳE'`%W1{ndΗBk|Ž7ʒR~,lnoa&:ü$ 3<a[CBݮwt"o\ePJ=Hz"_c^Z.#ˆ*x z̝grY]tdkP*:97YľXyBkD4N.C_[;F9`8& !AMO c `@BA& Ost\-\NX+Xp < !bj3C&QL+*&kAQ=04}cC!9~820G'PC9xa!w&bo_1 Sw"ܱ V )Yl3+ס2KoXOx]"`^WOy :3GO0g;%Yv㐫(R/r (s } u B &FeYZh0y> =2<Ϟc/ -u= c&׭,.0"g"7 6T!vl#sc>{u/Oh Bᾈ)۴74]x7 gMӒ"d]U)}" v4co[ ɡs 5Gg=XR14?5A}D "b{0$L .\4y{_fe:kVS\\O]c^W52LSBDM! C3Dhr̦RtArx4&agaN3Cf<Ԉp4~ B'"1@.b_/xQ} _߃҉/gٓ2Qkqp0շpZ2fԫYz< 4L.Cyυι1t@鎫Fe sYfsF}^ V}N<_`p)alٶ "(XEAVZ<)2},:Ir*#m_YӼ R%a||EƼIJ,,+f"96r/}0jE/)s)cjW#w'Sʯ5<66lj$a~3Kʛy 2:cZ:Yh))+a߭K::N,Q F'qB]={.]h85C9cr=}*rk?vwV렵ٸW Rs%}rNAkDv|uFLBkWY YkX מ|)1!$#3%y?pF<@<Rr0}: }\J [5FRxY<9"SQdE(Q*Qʻ)q1E0B_O24[U'],lOb ]~WjHޏTQ5Syu wq)xnw8~)c 쫬gٲߠ H% k5dƝk> kEj,0% b"vi2Wس_CuK)K{n|>t{P1򨾜j>'kEkƗBg*H%'_aY6Bn!TL&ɌOb{c`'d^{t\i^[uɐ[}q0lM˕G:‚4kb祔c^:?bpg… +37stH:0}en6x˟%/<]BL&* 5&fK9Mq)/iyqtA%kUe[ڛKN]Ě^,"`/ s[EQQm?|XJ߅92m]G.E΃ח U*Cn.j_)Tѧj̿30ڇ!A0=͜ar I3$C^-9#|pk!)?7.x9 @OO;WƝZBFU keZ75F6Tc6"ZȚs2y/1 ʵ:u4xa`C>6Rb/Yм)^=+~uRd`/|_8xbB0?Ft||Z\##|K 0>>zxv8۴吅q 8ĥ)"6>~\8:qM}#͚'ĉ#p\׶ l#bA?)|g g9|8jP(cr,BwV (WliVxxᡁ@0Okn;ɥh$_ckCgriv}>=wGzβ KkBɛ[˪ !J)h&k2%07δt}!d<9;I&0wV/ v 0<H}L&8ob%Hi|޶o&h1L|u֦y~󛱢8fٲUsւ)0oiFx2}X[zVYr_;N(w]_4B@OanC?gĦx>мgx>ΛToZoOMp>40>V Oy V9iq!4 LN,ˢu{jsz]|"R޻&'ƚ{53ўFu(<٪9:΋]B;)B>1::8;~)Yt|0(pw2N%&X,URBK)3\zz&}ax4;ǟ(tLNg{N|Ǽ\G#C9g$^\}p?556]/RP.90 k,U8/u776s ʪ_01چ|\N 0VV*3H鴃J7iI!wG_^ypl}r*jɤSR 5QN@ iZ#1ٰy;_\3\BQQ x:WJv츟ٯ$"@6 S#qe딇(/P( Dy~TOϻ<4:-+F`0||;Xl-"uw$Цi󼕝mKʩorz"mϺ$F:~E'ҐvD\y?Rr8_He@ e~O,T.(ފR*cY^m|cVR[8 JҡSm!ΆԨb)RHG{?MpqrmN>߶Y)\p,d#xۆWY*,l6]v0h15M˙MS8+EdI='LBJIH7_9{Caз*Lq,dt >+~ّeʏ?xԕ4bBAŚjﵫ!'\Ը$WNvKO}ӽmSşذqsOy?\[,d@'73'j%kOe`1.g2"e =YIzS2|zŐƄa\U,dP;jhhhaxǶ?КZ՚.q SE+XrbOu%\GتX(H,N^~]JyEZQKceTQ]VGYqnah;y$cQahT&QPZ*iZ8UQQM.qo/T\7X"u?Mttl2Xq(IoW{R^ ux*SYJ! 4S.Jy~ BROS[V|žKNɛP(L6V^|cR7i7nZW1Fd@ Ara{詑|(T*dN]Ko?s=@ |_EvF]׍kR)eBJc" MUUbY6`~V޴dJKß&~'d3i WWWWWW
Current Directory: /usr/lib/node_modules/pm2/node_modules/systeminformation/lib
Viewing File: /usr/lib/node_modules/pm2/node_modules/systeminformation/lib/osinfo.js
'use strict'; // @ts-check // ================================================================================== // osinfo.js // ---------------------------------------------------------------------------------- // Description: System Information - library // for Node.js // Copyright: (c) 2014 - 2025 // Author: Sebastian Hildebrandt // ---------------------------------------------------------------------------------- // License: MIT // ================================================================================== // 3. Operating System // ---------------------------------------------------------------------------------- const os = require('os'); const fs = require('fs'); const util = require('./util'); const exec = require('child_process').exec; const execSync = require('child_process').execSync; let _platform = process.platform; const _linux = (_platform === 'linux' || _platform === 'android'); const _darwin = (_platform === 'darwin'); const _windows = (_platform === 'win32'); const _freebsd = (_platform === 'freebsd'); const _openbsd = (_platform === 'openbsd'); const _netbsd = (_platform === 'netbsd'); const _sunos = (_platform === 'sunos'); // -------------------------- // Get current time and OS uptime function time() { let t = new Date().toString().split(' '); let timezoneName = ''; try { timezoneName = Intl.DateTimeFormat().resolvedOptions().timeZone; } catch { timezoneName = (t.length >= 7) ? t.slice(6).join(' ').replace(/\(/g, '').replace(/\)/g, '') : ''; } const result = { current: Date.now(), uptime: os.uptime(), timezone: (t.length >= 7) ? t[5] : '', timezoneName }; if (_darwin || _linux) { try { const stdout = execSync('date +%Z && date +%z && ls -l /etc/localtime 2>/dev/null', util.execOptsLinux); const lines = stdout.toString().split(os.EOL); if (lines.length > 3 && !lines[0]) { lines.shift(); } let timezone = lines[0] || ''; if (timezone.startsWith('+') || timezone.startsWith('-')) { timezone = 'GMT'; } return { current: Date.now(), uptime: os.uptime(), timezone: lines[1] ? timezone + lines[1] : timezone, timezoneName: lines[2] && lines[2].indexOf('/zoneinfo/') > 0 ? (lines[2].split('/zoneinfo/')[1] || '') : '' }; } catch (e) { util.noop(); } } return result; } exports.time = time; // -------------------------- // Get logo filename of OS distribution function getLogoFile(distro) { distro = distro || ''; distro = distro.toLowerCase(); let result = _platform; if (_windows) { result = 'windows'; } else if (distro.indexOf('mac os') !== -1 || distro.indexOf('macos') !== -1) { result = 'apple'; } else if (distro.indexOf('arch') !== -1) { result = 'arch'; } else if (distro.indexOf('cachy') !== -1) { result = 'cachy'; } else if (distro.indexOf('centos') !== -1) { result = 'centos'; } else if (distro.indexOf('coreos') !== -1) { result = 'coreos'; } else if (distro.indexOf('debian') !== -1) { result = 'debian'; } else if (distro.indexOf('deepin') !== -1) { result = 'deepin'; } else if (distro.indexOf('elementary') !== -1) { result = 'elementary'; } else if (distro.indexOf('endeavour') !== -1) { result = 'endeavour'; } else if (distro.indexOf('fedora') !== -1) { result = 'fedora'; } else if (distro.indexOf('gentoo') !== -1) { result = 'gentoo'; } else if (distro.indexOf('mageia') !== -1) { result = 'mageia'; } else if (distro.indexOf('mandriva') !== -1) { result = 'mandriva'; } else if (distro.indexOf('manjaro') !== -1) { result = 'manjaro'; } else if (distro.indexOf('mint') !== -1) { result = 'mint'; } else if (distro.indexOf('mx') !== -1) { result = 'mx'; } else if (distro.indexOf('openbsd') !== -1) { result = 'openbsd'; } else if (distro.indexOf('freebsd') !== -1) { result = 'freebsd'; } else if (distro.indexOf('opensuse') !== -1) { result = 'opensuse'; } else if (distro.indexOf('pclinuxos') !== -1) { result = 'pclinuxos'; } else if (distro.indexOf('puppy') !== -1) { result = 'puppy'; } else if (distro.indexOf('popos') !== -1) { result = 'popos'; } else if (distro.indexOf('raspbian') !== -1) { result = 'raspbian'; } else if (distro.indexOf('reactos') !== -1) { result = 'reactos'; } else if (distro.indexOf('redhat') !== -1) { result = 'redhat'; } else if (distro.indexOf('slackware') !== -1) { result = 'slackware'; } else if (distro.indexOf('sugar') !== -1) { result = 'sugar'; } else if (distro.indexOf('steam') !== -1) { result = 'steam'; } else if (distro.indexOf('suse') !== -1) { result = 'suse'; } else if (distro.indexOf('mate') !== -1) { result = 'ubuntu-mate'; } else if (distro.indexOf('lubuntu') !== -1) { result = 'lubuntu'; } else if (distro.indexOf('xubuntu') !== -1) { result = 'xubuntu'; } else if (distro.indexOf('ubuntu') !== -1) { result = 'ubuntu'; } else if (distro.indexOf('solaris') !== -1) { result = 'solaris'; } else if (distro.indexOf('tails') !== -1) { result = 'tails'; } else if (distro.indexOf('feren') !== -1) { result = 'ferenos'; } else if (distro.indexOf('robolinux') !== -1) { result = 'robolinux'; } else if (_linux && distro) { result = distro.toLowerCase().trim().replace(/\s+/g, '-'); } return result; } // -------------------------- // FQDN function getFQDN() { let fqdn = os.hostname; if (_linux || _darwin) { try { const stdout = execSync('hostname -f 2>/dev/null', util.execOptsLinux); fqdn = stdout.toString().split(os.EOL)[0]; } catch (e) { util.noop(); } } if (_freebsd || _openbsd || _netbsd) { try { const stdout = execSync('hostname 2>/dev/null'); fqdn = stdout.toString().split(os.EOL)[0]; } catch (e) { util.noop(); } } if (_windows) { try { const stdout = execSync('echo %COMPUTERNAME%.%USERDNSDOMAIN%', util.execOptsWin); fqdn = stdout.toString().replace('.%USERDNSDOMAIN%', '').split(os.EOL)[0]; } catch (e) { util.noop(); } } return fqdn; } // -------------------------- // OS Information function osInfo(callback) { return new Promise((resolve) => { process.nextTick(() => { let result = { platform: (_platform === 'win32' ? 'Windows' : _platform), distro: 'unknown', release: 'unknown', codename: '', kernel: os.release(), arch: os.arch(), hostname: os.hostname(), fqdn: getFQDN(), codepage: '', logofile: '', serial: '', build: '', servicepack: '', uefi: false }; if (_linux) { exec('cat /etc/*-release; cat /usr/lib/os-release; cat /etc/openwrt_release', function (error, stdout) { /** * @namespace * @property {string} DISTRIB_ID * @property {string} NAME * @property {string} DISTRIB_RELEASE * @property {string} VERSION_ID * @property {string} DISTRIB_CODENAME */ let release = {}; let lines = stdout.toString().split('\n'); lines.forEach(function (line) { if (line.indexOf('=') !== -1) { release[line.split('=')[0].trim().toUpperCase()] = line.split('=')[1].trim(); } }); result.distro = (release.DISTRIB_ID || release.NAME || 'unknown').replace(/"/g, ''); result.logofile = getLogoFile(result.distro); let releaseVersion = (release.VERSION || '').replace(/"/g, ''); let codename = (release.DISTRIB_CODENAME || release.VERSION_CODENAME || '').replace(/"/g, ''); const prettyName = (release.PRETTY_NAME || '').replace(/"/g, ''); if (prettyName.indexOf(result.distro + ' ') === 0) { releaseVersion = prettyName.replace(result.distro + ' ', '').trim(); } if (releaseVersion.indexOf('(') >= 0) { codename = releaseVersion.split('(')[1].replace(/[()]/g, '').trim(); releaseVersion = releaseVersion.split('(')[0].trim(); } result.release = (releaseVersion || release.DISTRIB_RELEASE || release.VERSION_ID || 'unknown').replace(/"/g, ''); result.codename = codename; result.codepage = util.getCodepage(); result.build = (release.BUILD_ID || '').replace(/"/g, '').trim(); isUefiLinux().then(uefi => { result.uefi = uefi; uuid().then((data) => { result.serial = data.os; if (callback) { callback(result); } resolve(result); }); }); }); } if (_freebsd || _openbsd || _netbsd) { exec('sysctl kern.ostype kern.osrelease kern.osrevision kern.hostuuid machdep.bootmethod kern.geom.confxml', function (error, stdout) { let lines = stdout.toString().split('\n'); const distro = util.getValue(lines, 'kern.ostype'); const logofile = getLogoFile(distro); const release = util.getValue(lines, 'kern.osrelease').split('-')[0]; const serial = util.getValue(lines, 'kern.uuid'); const bootmethod = util.getValue(lines, 'machdep.bootmethod'); const uefiConf = stdout.toString().indexOf('<type>efi</type>') >= 0; const uefi = bootmethod ? bootmethod.toLowerCase().indexOf('uefi') >= 0 : (uefiConf ? uefiConf : null); result.distro = distro || result.distro; result.logofile = logofile || result.logofile; result.release = release || result.release; result.serial = serial || result.serial; result.codename = ''; result.codepage = util.getCodepage(); result.uefi = uefi || null; if (callback) { callback(result); } resolve(result); }); } if (_darwin) { exec('sw_vers; sysctl kern.ostype kern.osrelease kern.osrevision kern.uuid', function (error, stdout) { let lines = stdout.toString().split('\n'); result.serial = util.getValue(lines, 'kern.uuid'); result.distro = util.getValue(lines, 'ProductName'); result.release = (util.getValue(lines, 'ProductVersion', ':', true, true) + ' ' + util.getValue(lines, 'ProductVersionExtra', ':', true, true)).trim(); result.build = util.getValue(lines, 'BuildVersion'); result.logofile = getLogoFile(result.distro); result.codename = 'macOS'; result.codename = (result.release.indexOf('10.4') > -1 ? 'OS X Tiger' : result.codename); result.codename = (result.release.indexOf('10.5') > -1 ? 'OS X Leopard' : result.codename); result.codename = (result.release.indexOf('10.6') > -1 ? 'OS X Snow Leopard' : result.codename); result.codename = (result.release.indexOf('10.7') > -1 ? 'OS X Lion' : result.codename); result.codename = (result.release.indexOf('10.8') > -1 ? 'OS X Mountain Lion' : result.codename); result.codename = (result.release.indexOf('10.9') > -1 ? 'OS X Mavericks' : result.codename); result.codename = (result.release.indexOf('10.10') > -1 ? 'OS X Yosemite' : result.codename); result.codename = (result.release.indexOf('10.11') > -1 ? 'OS X El Capitan' : result.codename); result.codename = (result.release.indexOf('10.12') > -1 ? 'Sierra' : result.codename); result.codename = (result.release.indexOf('10.13') > -1 ? 'High Sierra' : result.codename); result.codename = (result.release.indexOf('10.14') > -1 ? 'Mojave' : result.codename); result.codename = (result.release.indexOf('10.15') > -1 ? 'Catalina' : result.codename); result.codename = (result.release.startsWith('11.') ? 'Big Sur' : result.codename); result.codename = (result.release.startsWith('12.') ? 'Monterey' : result.codename); result.codename = (result.release.startsWith('13.') ? 'Ventura' : result.codename); result.codename = (result.release.startsWith('14.') ? 'Sonoma' : result.codename); result.codename = (result.release.startsWith('15.') ? 'Sequoia' : result.codename); result.codename = (result.release.startsWith('16.') ? 'Tahoe' : result.codename); result.codename = (result.release.startsWith('26.') ? 'Tahoe' : result.codename); result.uefi = true; result.codepage = util.getCodepage(); if (callback) { callback(result); } resolve(result); }); } if (_sunos) { result.release = result.kernel; exec('uname -o', function (error, stdout) { let lines = stdout.toString().split('\n'); result.distro = lines[0]; result.logofile = getLogoFile(result.distro); if (callback) { callback(result); } resolve(result); }); } if (_windows) { result.logofile = getLogoFile(); result.release = result.kernel; try { const workload = []; workload.push(util.powerShell('Get-CimInstance Win32_OperatingSystem | select Caption,SerialNumber,BuildNumber,ServicePackMajorVersion,ServicePackMinorVersion | fl')); workload.push(util.powerShell('(Get-CimInstance Win32_ComputerSystem).HypervisorPresent')); workload.push(util.powerShell('Add-Type -AssemblyName System.Windows.Forms; [System.Windows.Forms.SystemInformation]::TerminalServerSession')); util.promiseAll( workload ).then((data) => { let lines = data.results[0] ? data.results[0].toString().split('\r\n') : ['']; result.distro = util.getValue(lines, 'Caption', ':').trim(); result.serial = util.getValue(lines, 'SerialNumber', ':').trim(); result.build = util.getValue(lines, 'BuildNumber', ':').trim(); result.servicepack = util.getValue(lines, 'ServicePackMajorVersion', ':').trim() + '.' + util.getValue(lines, 'ServicePackMinorVersion', ':').trim(); result.codepage = util.getCodepage(); const hyperv = data.results[1] ? data.results[1].toString().toLowerCase() : ''; result.hypervisor = hyperv.indexOf('true') !== -1; const term = data.results[2] ? data.results[2].toString() : ''; result.remoteSession = (term.toString().toLowerCase().indexOf('true') >= 0); isUefiWindows().then(uefi => { result.uefi = uefi; if (callback) { callback(result); } resolve(result); }); }); } catch (e) { if (callback) { callback(result); } resolve(result); } } }); }); } exports.osInfo = osInfo; function isUefiLinux() { return new Promise((resolve) => { process.nextTick(() => { fs.stat('/sys/firmware/efi', function (err) { if (!err) { return resolve(true); } else { exec('dmesg | grep -E "EFI v"', function (error, stdout) { if (!error) { const lines = stdout.toString().split('\n'); return resolve(lines.length > 0); } return resolve(false); }); } }); }); }); } function isUefiWindows() { return new Promise((resolve) => { process.nextTick(() => { try { exec('findstr /C:"Detected boot environment" "%windir%\\Panther\\setupact.log"', util.execOptsWin, function (error, stdout) { if (!error) { const line = stdout.toString().split('\n\r')[0]; return resolve(line.toLowerCase().indexOf('efi') >= 0); } else { exec('echo %firmware_type%', util.execOptsWin, function (error, stdout) { if (!error) { const line = stdout.toString() || ''; return resolve(line.toLowerCase().indexOf('efi') >= 0); } else { return resolve(false); } }); } }); } catch (e) { return resolve(false); } }); }); } function versions(apps, callback) { let versionObject = { kernel: os.release(), apache: '', bash: '', bun: '', deno: '', docker: '', dotnet: '', fish: '', gcc: '', git: '', grunt: '', gulp: '', homebrew: '', java: '', mongodb: '', mysql: '', nginx: '', node: '', //process.versions.node, npm: '', openssl: '', perl: '', php: '', pip3: '', pip: '', pm2: '', postfix: '', postgresql: '', powershell: '', python3: '', python: '', redis: '', systemOpenssl: '', systemOpensslLib: '', tsc: '', v8: process.versions.v8, virtualbox: '', yarn: '', zsh: '' }; function checkVersionParam(apps) { if (apps === '*') { return { versions: versionObject, counter: 34 }; } if (!Array.isArray(apps)) { apps = apps.trim().toLowerCase().replace(/,+/g, '|').replace(/ /g, '|'); apps = apps.split('|'); const result = { versions: {}, counter: 0 }; apps.forEach(el => { if (el) { for (let key in versionObject) { if ({}.hasOwnProperty.call(versionObject, key)) { if (key.toLowerCase() === el.toLowerCase() && !{}.hasOwnProperty.call(result.versions, key)) { result.versions[key] = versionObject[key]; if (key === 'openssl') { result.versions.systemOpenssl = ''; result.versions.systemOpensslLib = ''; } if (!result.versions[key]) { result.counter++; } } } } } }); return result; } } return new Promise((resolve) => { process.nextTick(() => { if (util.isFunction(apps) && !callback) { callback = apps; apps = '*'; } else { apps = apps || '*'; if (typeof apps !== 'string') { if (callback) { callback({}); } return resolve({}); } } const appsObj = checkVersionParam(apps); let totalFunctions = appsObj.counter; let functionProcessed = (function () { return function () { if (--totalFunctions === 0) { if (callback) { callback(appsObj.versions); } resolve(appsObj.versions); } }; })(); let cmd = ''; try { if ({}.hasOwnProperty.call(appsObj.versions, 'openssl')) { appsObj.versions.openssl = process.versions.openssl; exec('openssl version', function (error, stdout) { if (!error) { let openssl_string = stdout.toString().split('\n')[0].trim(); let openssl = openssl_string.split(' '); appsObj.versions.systemOpenssl = openssl.length > 0 ? openssl[1] : openssl[0]; appsObj.versions.systemOpensslLib = openssl.length > 0 ? openssl[0] : 'openssl'; } functionProcessed(); }); } if ({}.hasOwnProperty.call(appsObj.versions, 'npm')) { exec('npm -v', function (error, stdout) { if (!error) { appsObj.versions.npm = stdout.toString().split('\n')[0]; } functionProcessed(); }); } if ({}.hasOwnProperty.call(appsObj.versions, 'pm2')) { cmd = 'pm2'; if (_windows) { cmd += '.cmd'; } exec(`${cmd} -v`, function (error, stdout) { if (!error) { let pm2 = stdout.toString().split('\n')[0].trim(); if (!pm2.startsWith('[PM2]')) { appsObj.versions.pm2 = pm2; } } functionProcessed(); }); } if ({}.hasOwnProperty.call(appsObj.versions, 'yarn')) { exec('yarn --version', function (error, stdout) { if (!error) { appsObj.versions.yarn = stdout.toString().split('\n')[0]; } functionProcessed(); }); } if ({}.hasOwnProperty.call(appsObj.versions, 'gulp')) { cmd = 'gulp'; if (_windows) { cmd += '.cmd'; } exec(`${cmd} --version`, function (error, stdout) { if (!error) { const gulp = stdout.toString().split('\n')[0] || ''; appsObj.versions.gulp = (gulp.toLowerCase().split('version')[1] || '').trim(); } functionProcessed(); }); } if ({}.hasOwnProperty.call(appsObj.versions, 'homebrew')) { cmd = 'brew'; exec(`${cmd} --version`, function (error, stdout) { if (!error) { const brew = stdout.toString().split('\n')[0] || ''; appsObj.versions.homebrew = (brew.toLowerCase().split(' ')[1] || '').trim(); } functionProcessed(); }); } if ({}.hasOwnProperty.call(appsObj.versions, 'tsc')) { cmd = 'tsc'; if (_windows) { cmd += '.cmd'; } exec(`${cmd} --version`, function (error, stdout) { if (!error) { const tsc = stdout.toString().split('\n')[0] || ''; appsObj.versions.tsc = (tsc.toLowerCase().split('version')[1] || '').trim(); } functionProcessed(); }); } if ({}.hasOwnProperty.call(appsObj.versions, 'grunt')) { cmd = 'grunt'; if (_windows) { cmd += '.cmd'; } exec(`${cmd} --version`, function (error, stdout) { if (!error) { const grunt = stdout.toString().split('\n')[0] || ''; appsObj.versions.grunt = (grunt.toLowerCase().split('cli v')[1] || '').trim(); } functionProcessed(); }); } if ({}.hasOwnProperty.call(appsObj.versions, 'git')) { if (_darwin) { const gitHomebrewExists = fs.existsSync('/usr/local/Cellar/git') || fs.existsSync('/opt/homebrew/bin/git'); if (util.darwinXcodeExists() || gitHomebrewExists) { exec('git --version', function (error, stdout) { if (!error) { let git = stdout.toString().split('\n')[0] || ''; git = (git.toLowerCase().split('version')[1] || '').trim(); appsObj.versions.git = (git.split(' ')[0] || '').trim(); } functionProcessed(); }); } else { functionProcessed(); } } else { exec('git --version', function (error, stdout) { if (!error) { let git = stdout.toString().split('\n')[0] || ''; git = (git.toLowerCase().split('version')[1] || '').trim(); appsObj.versions.git = (git.split(' ')[0] || '').trim(); } functionProcessed(); }); } } if ({}.hasOwnProperty.call(appsObj.versions, 'apache')) { exec('apachectl -v 2>&1', function (error, stdout) { if (!error) { const apache = (stdout.toString().split('\n')[0] || '').split(':'); appsObj.versions.apache = (apache.length > 1 ? apache[1].replace('Apache', '').replace('/', '').split('(')[0].trim() : ''); } functionProcessed(); }); } if ({}.hasOwnProperty.call(appsObj.versions, 'nginx')) { exec('nginx -v 2>&1', function (error, stdout) { if (!error) { const nginx = stdout.toString().split('\n')[0] || ''; appsObj.versions.nginx = (nginx.toLowerCase().split('/')[1] || '').trim(); } functionProcessed(); }); } if ({}.hasOwnProperty.call(appsObj.versions, 'mysql')) { exec('mysql -V', function (error, stdout) { if (!error) { let mysql = stdout.toString().split('\n')[0] || ''; mysql = mysql.toLowerCase(); if (mysql.indexOf(',') > -1) { mysql = (mysql.split(',')[0] || '').trim(); const parts = mysql.split(' '); appsObj.versions.mysql = (parts[parts.length - 1] || '').trim(); } else { if (mysql.indexOf(' ver ') > -1) { mysql = mysql.split(' ver ')[1]; appsObj.versions.mysql = mysql.split(' ')[0]; } } } functionProcessed(); }); } if ({}.hasOwnProperty.call(appsObj.versions, 'php')) { exec('php -v', function (error, stdout) { if (!error) { const php = stdout.toString().split('\n')[0] || ''; let parts = php.split('('); if (parts[0].indexOf('-')) { parts = parts[0].split('-'); } appsObj.versions.php = parts[0].replace(/[^0-9.]/g, ''); } functionProcessed(); }); } if ({}.hasOwnProperty.call(appsObj.versions, 'redis')) { exec('redis-server --version', function (error, stdout) { if (!error) { const redis = stdout.toString().split('\n')[0] || ''; const parts = redis.split(' '); appsObj.versions.redis = util.getValue(parts, 'v', '=', true); } functionProcessed(); }); } if ({}.hasOwnProperty.call(appsObj.versions, 'docker')) { exec('docker --version', function (error, stdout) { if (!error) { const docker = stdout.toString().split('\n')[0] || ''; const parts = docker.split(' '); appsObj.versions.docker = parts.length > 2 && parts[2].endsWith(',') ? parts[2].slice(0, -1) : ''; } functionProcessed(); }); } if ({}.hasOwnProperty.call(appsObj.versions, 'postfix')) { exec('postconf -d | grep mail_version', function (error, stdout) { if (!error) { const postfix = stdout.toString().split('\n') || []; appsObj.versions.postfix = util.getValue(postfix, 'mail_version', '=', true); } functionProcessed(); }); } if ({}.hasOwnProperty.call(appsObj.versions, 'mongodb')) { exec('mongod --version', function (error, stdout) { if (!error) { const mongodb = stdout.toString().split('\n')[0] || ''; appsObj.versions.mongodb = (mongodb.toLowerCase().split(',')[0] || '').replace(/[^0-9.]/g, ''); } functionProcessed(); }); } if ({}.hasOwnProperty.call(appsObj.versions, 'postgresql')) { if (_linux) { exec('locate bin/postgres', function (error, stdout) { if (!error) { const postgresqlBin = stdout.toString().split('\n').sort(); if (postgresqlBin.length) { exec(postgresqlBin[postgresqlBin.length - 1] + ' -V', function (error, stdout) { if (!error) { const postgresql = stdout.toString().split('\n')[0].split(' ') || []; appsObj.versions.postgresql = postgresql.length ? postgresql[postgresql.length - 1] : ''; } functionProcessed(); }); } else { functionProcessed(); } } else { exec('psql -V', function (error, stdout) { if (!error) { const postgresql = stdout.toString().split('\n')[0].split(' ') || []; appsObj.versions.postgresql = postgresql.length ? postgresql[postgresql.length - 1] : ''; appsObj.versions.postgresql = appsObj.versions.postgresql.split('-')[0]; } functionProcessed(); }); } }); } else { if (_windows) { util.powerShell('Get-CimInstance Win32_Service | select caption | fl').then((stdout) => { let serviceSections = stdout.split(/\n\s*\n/); serviceSections.forEach((item) => { if (item.trim() !== '') { let lines = item.trim().split('\r\n'); let srvCaption = util.getValue(lines, 'caption', ':', true).toLowerCase(); if (srvCaption.indexOf('postgresql') > -1) { const parts = srvCaption.split(' server '); if (parts.length > 1) { appsObj.versions.postgresql = parts[1]; } } } }); functionProcessed(); }); } else { exec('postgres -V', function (error, stdout) { if (!error) { const postgresql = stdout.toString().split('\n')[0].split(' ') || []; appsObj.versions.postgresql = postgresql.length ? postgresql[postgresql.length - 1] : ''; } else { exec('pg_config --version', function (error, stdout) { if (!error) { const postgresql = stdout.toString().split('\n')[0].split(' ') || []; appsObj.versions.postgresql = postgresql.length ? postgresql[postgresql.length - 1] : ''; } }); } functionProcessed(); }); } } } if ({}.hasOwnProperty.call(appsObj.versions, 'perl')) { exec('perl -v', function (error, stdout) { if (!error) { const perl = stdout.toString().split('\n') || ''; while (perl.length > 0 && perl[0].trim() === '') { perl.shift(); } if (perl.length > 0) { appsObj.versions.perl = perl[0].split('(').pop().split(')')[0].replace('v', ''); } } functionProcessed(); }); } if ({}.hasOwnProperty.call(appsObj.versions, 'python')) { if (_darwin) { try { const stdout = execSync('sw_vers'); const lines = stdout.toString().split('\n'); const osVersion = util.getValue(lines, 'ProductVersion', ':'); const gitHomebrewExists1 = fs.existsSync('/usr/local/Cellar/python'); const gitHomebrewExists2 = fs.existsSync('/opt/homebrew/bin/python'); if ((util.darwinXcodeExists() && util.semverCompare('12.0.1', osVersion) < 0) || gitHomebrewExists1 || gitHomebrewExists2) { const cmd = gitHomebrewExists1 ? '/usr/local/Cellar/python -V 2>&1' : (gitHomebrewExists2 ? '/opt/homebrew/bin/python -V 2>&1' : 'python -V 2>&1'); exec(cmd, function (error, stdout) { if (!error) { const python = stdout.toString().split('\n')[0] || ''; appsObj.versions.python = python.toLowerCase().replace('python', '').trim(); } functionProcessed(); }); } else { functionProcessed(); } } catch (e) { functionProcessed(); } } else { exec('python -V 2>&1', function (error, stdout) { if (!error) { const python = stdout.toString().split('\n')[0] || ''; appsObj.versions.python = python.toLowerCase().replace('python', '').trim(); } functionProcessed(); }); } } if ({}.hasOwnProperty.call(appsObj.versions, 'python3')) { if (_darwin) { const gitHomebrewExists = fs.existsSync('/usr/local/Cellar/python3') || fs.existsSync('/opt/homebrew/bin/python3'); if (util.darwinXcodeExists() || gitHomebrewExists) { exec('python3 -V 2>&1', function (error, stdout) { if (!error) { const python = stdout.toString().split('\n')[0] || ''; appsObj.versions.python3 = python.toLowerCase().replace('python', '').trim(); } functionProcessed(); }); } else { functionProcessed(); } } else { exec('python3 -V 2>&1', function (error, stdout) { if (!error) { const python = stdout.toString().split('\n')[0] || ''; appsObj.versions.python3 = python.toLowerCase().replace('python', '').trim(); } functionProcessed(); }); } } if ({}.hasOwnProperty.call(appsObj.versions, 'pip')) { if (_darwin) { const gitHomebrewExists = fs.existsSync('/usr/local/Cellar/pip') || fs.existsSync('/opt/homebrew/bin/pip'); if (util.darwinXcodeExists() || gitHomebrewExists) { exec('pip -V 2>&1', function (error, stdout) { if (!error) { const pip = stdout.toString().split('\n')[0] || ''; const parts = pip.split(' '); appsObj.versions.pip = parts.length >= 2 ? parts[1] : ''; } functionProcessed(); }); } else { functionProcessed(); } } else { exec('pip -V 2>&1', function (error, stdout) { if (!error) { const pip = stdout.toString().split('\n')[0] || ''; const parts = pip.split(' '); appsObj.versions.pip = parts.length >= 2 ? parts[1] : ''; } functionProcessed(); }); } } if ({}.hasOwnProperty.call(appsObj.versions, 'pip3')) { if (_darwin) { const gitHomebrewExists = fs.existsSync('/usr/local/Cellar/pip3') || fs.existsSync('/opt/homebrew/bin/pip3'); if (util.darwinXcodeExists() || gitHomebrewExists) { exec('pip3 -V 2>&1', function (error, stdout) { if (!error) { const pip = stdout.toString().split('\n')[0] || ''; const parts = pip.split(' '); appsObj.versions.pip3 = parts.length >= 2 ? parts[1] : ''; } functionProcessed(); }); } else { functionProcessed(); } } else { exec('pip3 -V 2>&1', function (error, stdout) { if (!error) { const pip = stdout.toString().split('\n')[0] || ''; const parts = pip.split(' '); appsObj.versions.pip3 = parts.length >= 2 ? parts[1] : ''; } functionProcessed(); }); } } if ({}.hasOwnProperty.call(appsObj.versions, 'java')) { if (_darwin) { // check if any JVM is installed but avoid dialog box that Java needs to be installed exec('/usr/libexec/java_home -V 2>&1', function (error, stdout) { if (!error && stdout.toString().toLowerCase().indexOf('no java runtime') === -1) { // now this can be done savely exec('java -version 2>&1', function (error, stdout) { if (!error) { const java = stdout.toString().split('\n')[0] || ''; const parts = java.split('"'); appsObj.versions.java = parts.length === 3 ? parts[1].trim() : ''; } functionProcessed(); }); } else { functionProcessed(); } }); } else { exec('java -version 2>&1', function (error, stdout) { if (!error) { const java = stdout.toString().split('\n')[0] || ''; const parts = java.split('"'); appsObj.versions.java = parts.length === 3 ? parts[1].trim() : ''; } functionProcessed(); }); } } if ({}.hasOwnProperty.call(appsObj.versions, 'gcc')) { if ((_darwin && util.darwinXcodeExists()) || !_darwin) { exec('gcc -dumpversion', function (error, stdout) { if (!error) { appsObj.versions.gcc = stdout.toString().split('\n')[0].trim() || ''; } if (appsObj.versions.gcc.indexOf('.') > -1) { functionProcessed(); } else { exec('gcc --version', function (error, stdout) { if (!error) { const gcc = stdout.toString().split('\n')[0].trim(); if (gcc.indexOf('gcc') > -1 && gcc.indexOf(')') > -1) { const parts = gcc.split(')'); appsObj.versions.gcc = parts[1].trim() || appsObj.versions.gcc; } } functionProcessed(); }); } }); } else { functionProcessed(); } } if ({}.hasOwnProperty.call(appsObj.versions, 'virtualbox')) { exec(util.getVboxmanage() + ' -v 2>&1', function (error, stdout) { if (!error) { const vbox = stdout.toString().split('\n')[0] || ''; const parts = vbox.split('r'); appsObj.versions.virtualbox = parts[0]; } functionProcessed(); }); } if ({}.hasOwnProperty.call(appsObj.versions, 'bash')) { exec('bash --version', function (error, stdout) { if (!error) { const line = stdout.toString().split('\n')[0]; const parts = line.split(' version '); if (parts.length > 1) { appsObj.versions.bash = parts[1].split(' ')[0].split('(')[0]; } } functionProcessed(); }); } if ({}.hasOwnProperty.call(appsObj.versions, 'zsh')) { exec('zsh --version', function (error, stdout) { if (!error) { const line = stdout.toString().split('\n')[0]; const parts = line.split('zsh '); if (parts.length > 1) { appsObj.versions.zsh = parts[1].split(' ')[0]; } } functionProcessed(); }); } if ({}.hasOwnProperty.call(appsObj.versions, 'fish')) { exec('fish --version', function (error, stdout) { if (!error) { const line = stdout.toString().split('\n')[0]; const parts = line.split(' version '); if (parts.length > 1) { appsObj.versions.fish = parts[1].split(' ')[0]; } } functionProcessed(); }); } if ({}.hasOwnProperty.call(appsObj.versions, 'bun')) { exec('bun -v', function (error, stdout) { if (!error) { const line = stdout.toString().split('\n')[0].trim(); appsObj.versions.bun = line; } functionProcessed(); }); } if ({}.hasOwnProperty.call(appsObj.versions, 'deno')) { exec('deno -v', function (error, stdout) { if (!error) { const line = stdout.toString().split('\n')[0].trim(); const parts = line.split(' '); if (parts.length > 1) { appsObj.versions.deno = parts[1]; } } functionProcessed(); }); } if ({}.hasOwnProperty.call(appsObj.versions, 'node')) { exec('node -v', function (error, stdout) { if (!error) { let line = stdout.toString().split('\n')[0].trim(); if (line.startsWith('v')) { line = line.slice(1); } appsObj.versions.node = line; } functionProcessed(); }); } if ({}.hasOwnProperty.call(appsObj.versions, 'powershell')) { if (_windows) { util.powerShell('$PSVersionTable').then(stdout => { const lines = stdout.toString().toLowerCase().split('\n').map(line => line.replace(/ +/g, ' ').replace(/ +/g, ':')); appsObj.versions.powershell = util.getValue(lines, 'psversion'); functionProcessed(); }); } else { functionProcessed(); } } if ({}.hasOwnProperty.call(appsObj.versions, 'dotnet')) { if (_windows) { util.powerShell('gci "HKLM:\\SOFTWARE\\Microsoft\\NET Framework Setup\\NDP" -recurse | gp -name Version,Release -EA 0 | where { $_.PSChildName -match "^(?!S)\\p{L}"} | select PSChildName, Version, Release').then(stdout => { const lines = stdout.toString().split('\r\n'); let dotnet = ''; lines.forEach(line => { line = line.replace(/ +/g, ' '); const parts = line.split(' '); dotnet = dotnet || (parts[0].toLowerCase().startsWith('client') && parts.length > 2 ? parts[1].trim() : (parts[0].toLowerCase().startsWith('full') && parts.length > 2 ? parts[1].trim() : '')); }); appsObj.versions.dotnet = dotnet.trim(); functionProcessed(); }); } else { functionProcessed(); } } } catch (e) { if (callback) { callback(appsObj.versions); } resolve(appsObj.versions); } }); }); } exports.versions = versions; function shell(callback) { return new Promise((resolve) => { process.nextTick(() => { if (_windows) { try { const result = 'CMD'; util.powerShell(`Get-CimInstance -className win32_process | where-object {$_.ProcessId -eq ${process.ppid} } | select Name`).then(stdout => { let result = 'CMD'; if (stdout) { if (stdout.toString().toLowerCase().indexOf('powershell') >= 0) { result = 'PowerShell'; } } if (callback) { callback(result); } resolve(result); }); } catch { if (callback) { callback(result); } resolve(result); } } else { let result = ''; exec('echo $SHELL', function (error, stdout) { if (!error) { result = stdout.toString().split('\n')[0]; } if (callback) { callback(result); } resolve(result); }); } }); }); } exports.shell = shell; function getUniqueMacAdresses() { let macs = []; try { const ifaces = os.networkInterfaces(); for (let dev in ifaces) { if ({}.hasOwnProperty.call(ifaces, dev)) { ifaces[dev].forEach(function (details) { if (details && details.mac && details.mac !== '00:00:00:00:00:00') { const mac = details.mac.toLowerCase(); if (macs.indexOf(mac) === -1) { macs.push(mac); } } }); } } macs = macs.sort(function (a, b) { if (a < b) { return -1; } if (a > b) { return 1; } return 0; }); } catch (e) { macs.push('00:00:00:00:00:00'); } return macs; } function uuid(callback) { return new Promise((resolve) => { process.nextTick(() => { let result = { os: '', hardware: '', macs: getUniqueMacAdresses() }; let parts; if (_darwin) { exec('system_profiler SPHardwareDataType -json', function (error, stdout) { if (!error) { try { const jsonObj = JSON.parse(stdout.toString()); if (jsonObj.SPHardwareDataType && jsonObj.SPHardwareDataType.length > 0) { const spHardware = jsonObj.SPHardwareDataType[0]; result.os = spHardware.platform_UUID.toLowerCase(); result.hardware = spHardware.serial_number; } } catch (e) { util.noop(); } } if (callback) { callback(result); } resolve(result); }); } if (_linux) { const cmd = `echo -n "os: "; cat /var/lib/dbus/machine-id 2> /dev/null || cat /etc/machine-id 2> /dev/null; echo; echo -n "hardware: "; cat /sys/class/dmi/id/product_uuid 2> /dev/null; echo;`; exec(cmd, function (error, stdout) { const lines = stdout.toString().split('\n'); result.os = util.getValue(lines, 'os').toLowerCase(); result.hardware = util.getValue(lines, 'hardware').toLowerCase(); if (!result.hardware) { const lines = fs.readFileSync('/proc/cpuinfo', { encoding: 'utf8' }).toString().split('\n'); const serial = util.getValue(lines, 'serial'); result.hardware = serial || ''; } if (callback) { callback(result); } resolve(result); }); } if (_freebsd || _openbsd || _netbsd) { exec('sysctl -i kern.hostid kern.hostuuid', function (error, stdout) { const lines = stdout.toString().split('\n'); result.hardware = util.getValue(lines, 'kern.hostid', ':').toLowerCase(); result.os = util.getValue(lines, 'kern.hostuuid', ':').toLowerCase(); if (result.os.indexOf('unknown') >= 0) { result.os = ''; } if (result.hardware.indexOf('unknown') >= 0) { result.hardware = ''; } if (callback) { callback(result); } resolve(result); }); } if (_windows) { let sysdir = '%windir%\\System32'; if (process.arch === 'ia32' && Object.prototype.hasOwnProperty.call(process.env, 'PROCESSOR_ARCHITEW6432')) { sysdir = '%windir%\\sysnative\\cmd.exe /c %windir%\\System32'; } util.powerShell('Get-CimInstance Win32_ComputerSystemProduct | select UUID | fl').then((stdout) => { let lines = stdout.split('\r\n'); result.hardware = util.getValue(lines, 'uuid', ':').toLowerCase(); exec(`${sysdir}\\reg query "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Cryptography" /v MachineGuid`, util.execOptsWin, function (error, stdout) { parts = stdout.toString().split('\n\r')[0].split('REG_SZ'); result.os = parts.length > 1 ? parts[1].replace(/\r+|\n+|\s+/ig, '').toLowerCase() : ''; if (callback) { callback(result); } resolve(result); }); }); } }); }); } exports.uuid = uuid;