From 414494421b5829c7f197b30302ac03d9f2dfa9f5 Mon Sep 17 00:00:00 2001 From: Ylian Saint-Hilaire Date: Tue, 1 Oct 2019 14:54:38 -0700 Subject: [PATCH] Added Intel Standard Manageability (ISM) support, improved MeshCMD activation. --- agents/MeshCmd-signed.exe | Bin 4462656 -> 4486216 bytes agents/MeshCmd64-signed.exe | Bin 4077632 -> 4101192 bytes agents/meshcmd.js | 30 ++++++++++++++++++++++------ agents/meshcmd.min.js | 30 ++++++++++++++++++++++------ agents/meshcore.js | 19 +++++------------- agents/meshcore.min.js | 11 ++++++++-- meshagent.js | 21 +++++++++---------- package.json | 2 +- views/default-min.handlebars | 2 +- views/default-mobile-min.handlebars | 2 +- views/default-mobile.handlebars | 26 +++++++++++++++++++++--- views/default.handlebars | 29 ++++++++++++++++++++++++--- webserver.js | 19 ++++++++++-------- 13 files changed, 136 insertions(+), 55 deletions(-) diff --git a/agents/MeshCmd-signed.exe b/agents/MeshCmd-signed.exe index 8b7d296db1f6fe95c516837c4ea3f718cb73b752..d9271f25a136a850525df7ee35077c8706511a8d 100644 GIT binary patch delta 36144 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 Y^S-P-XXeG9rOdr%d&Yae``z#U5Ala12><{9 delta 14300 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 Zs%tlVk@Wf8uOfFJiYs|%{#$Ro^*^L{(tiK| diff --git a/agents/MeshCmd64-signed.exe b/agents/MeshCmd64-signed.exe index 22d6a6dc17a968ee497f70507a3dcdefdcfa5593..c0c56744215e65f9c831bc58617a4b7f7a79cbca 100644 GIT binary patch delta 36071 zcmd^ocYIXE`u7b|1EKf2gtnW0QV3*c0wD}k5>rLeUxh4HHcuJdqp#MKE`XIx!yb;Z>US2(Wj zxO(7HG^}*E_S3g|+aSgyV5Z54FgK-VPH5At{T*GmVz%>%rC|m|yqj5#z z8iQ*ru5q}=7Im^HI}dR|F+ZbAMGnwT=ttS`(eD4mv@O;eOaQSA1(Y8_rX_1Np` z9Ui-Jexxj6e~eMau@fmuM`jwU7<$aei(6v%IPEn_iIkm)RtELgUgK;vHS;4)X5NCW z8m9~%S>vj()a2P~U7qE|K8vs3o86!`aNDY7Z$F-N9r;_P$8Pc2^X$HAmknqX+Nv{b zwrporjl)}=>8f}7?4FDum^PYc*0{X(+4XkM@^d$H)zsMiR-b5@W${_g*?NZEH{Io_ zwfKB?n~KF8OHIA~?{>=Ycr43<`1{+MZ-LwH6j%k@wbiT$lwE39kpUh}mGw@m&*5?! zmN}d@*D`Op)m>lebJRFiSa`9~)W`*(f;#QX3@X1_*_xy!ys^!R7XoA_{ zuQVDhyai`J_#K?TF(D=)2E)7SO>rQ%X*5kRHCAve7aJ`mv&ZhM_c)szE&8{X7o&g? zmu2_ZD~+a@7SmuS<|-Zik@N9ip~q#ld%Z4?G0Mc>#~A`8h7w0DXSartnAhJyE0YVH zPToS1njk>&3AQmqOxcIgUG+Z7UMr^k{Kh4cnYFYL#POz;Eoc&IYzq=Pz@lW6s9M~9 zl{Ka&rdl+rG;?BB>X^|A>m^`^zh0xI4(lb7FO?yD(SvG3hom|fIm~)NPz`R3X1t`G zim}Bkj!BTzrZjeRqLQ4NJV}|DJkiu>ZDV3K_P{h{n7_$h(`H|&2Sfxudl7(A{8(CN@Wdp{%d_rQDCB83WJDcy8KRWeXZT5VJAoM)>j0PHR-VZYXklr zWc@8?+7`AN)2WUMK9^KYvEr$8mGzw3AYGtZE?6P5TjOxnH;9#bOsl23s+DzT7nv1< zAB(p&-V2ustP#>^r#9U%ab7nh3Jjb-->J2*h;~b2YQ()d#u~HOtQn>XgTraCn;I?D zURJRn(A&WK!t#u^lqI0lXYu&Fa~-~FBLo#zgNsFD1+;TX(-N8xQw{63tl9yWz)}_+ zy<`EmQ)trI#7C*2OUyOI5?5n)R{5%7`)XkOqG`bFSjuV^n3}Bmf+WB&nHN(dBqr8q zw8mFUc0hVaz=#R-sxWo97^X(`fi9M|txDLoIM}yp<6=`&6Ia_x$_m#+4XCJ%ap*ms zTAjz^fX7oQ93f*>z}i&mtc~PYZCkd+N*m=mTtRi5LR0RRgBpLrBwK(b7S56iQ=^Sm zlv!G^#JkMlvsN2z;0hK$ix*CbCY7)yX;w)NK})|d>b5eQO8MAC&{Xiu9Ox*ljp$d& zZ9{-3ZS`tuvbHcJR#-Z_JzgEOrN;P8=0Jx`S3tjwYV%mx+tgn70Qs#t^4D6du6A5o zo8GlG!X0MiYoa=jt&YJ`tGTpZTCHPt6__o|IXgK;G54#0nA_lG;pP$YYp!6kdnqFv z8UU0>Q!ZzkN~6E%@k`Ls`?b7 zdNIt80BEp#JT4E0YEq4#trag@sZuXKQJbbqcB!-f18iLUzt6_P>gC@5>wL8F)mp5F zLG=`@l&lMIlv`|W6~G~MnC|iG^;xjA{SKl2feHYc9UQx*a`R!-UV7aQc8JXnfH9pD zPEaz0zwWE{xRx0pK!w~bHDqf7#CDBTCe47f>72Z@;QAR{K4U^9N^KKb$Oev5#?NX2 ztnI+LB{;2B3xKtwlnMS80NXNFEy2k)p}^p=iIvq1Ee_XZc%9kMoDS0I-(*ci8+*K z7UUNc7vyI1hy3i!68H|%2C9{!E-R-vP@Nd8F3Qd;DADyyl2xovq%y!yjcN?d0coVl zEtmlk8&iTX^fl9`QzKF%oc^JmGG|d^YU_&9{M-UwHK}z~5nCInL;#7&t?M$2vNKAu zxs%kot|YrCFDGACtAv%#KFY!v60WX#Ae z2VpXD@^kX%%?LIF0X13{=4M=2UJQn0n*-^mQV40WDx*j`$(6UDVlk2*Iayd%LxgyK zq!~nx@9)oEitr@67NL;c6KA#5)EIfk7@w!!Zi=%)8+>-r1a`q%ZE;rFZLoGNDr#KT zC2f`0I|DUx@wX#PvwHxN9|QoD!xR4;?)sxWbvhq~b_c;d>-fxN8-Ewugyml6HTd6m{11x;q3XSt+ZX1&J) z+8A}6;VfIY6If?zl>OuwcyIE=VckV@%E_mu$c!EnQ+&!0mfxWC>W?Weby)2)T`mxd zR$7oFF|)Z1iqcgJec4qF%H%MS#x?fP&?sN#^YV%@{<%J{#qCH+)H1h{!>DeVjfLoE zYn0X`LL@cM)kCB{)z&%in|an1tO@q>b4=P8s>ojD@IrdjzWFYnqtXF7p)*89be_m_b3aFN2JuCcoTbIK6x0%wV+&_01Gdp-VZ}lcYq^aj1L_CAeC@eylRsprK#rTE+?B^C4BFCji?!Rv9)^1=*5zrB07Z zy7syU>F0426em&L3VyxAHXR8O=`;r!SuR`4;u2RWtW!`coJN=Qc-_<) zSC7*VqhBm(O5zIibxy0~~)))ZlX&IF_8vP*9mM=TuOWb8-&ARw`d>bL;2!R#d`= zZq*T{Eyb2(pKM8)9BZGPl@gm=f#BCNvBDNxS(%hvS(&0tOi7-^nek`ldPduW_<=k| zv7}mTlM<4Z*ox#7OKh^$Vvn7aYDtQ<+pQH9$rC48Cfk+3C~aE%w!us26D#c#C#R%L zj7?2Q2J}=*LhPi<#N=3O;v~Oqa?->~n@$;G4R&gM#8}3-&ogU6#WOR_Pk&z{ZN2Ty7JbU><+-M;6(=cH~XaJIl2Ub^#AL zPK0EU3nV|e#mTI(c)hd{n$4>mmKtmVRCz45X$dhX%Wxxrl4d2}Qfp6Bc;Q@^X9>p0 z!rmD-_RG@}d1*m*UXCp-i9gC|`ki=B=I?yr5#3WncZZV`0G3LWP2^=+u3C#jzNhkc zl^B9hX_G`rjRS^$TD_yjCbM&ClY_+)H-T}cXvcBGD#wvi1kSP;bF8zTz9CDDRh?x}B`>L>;q?RR$$!P7SgCS^`D5jz{)CzSo z;S5bnRC(YRp0g|xQ_!t5*$rulatbbIrK3tV5~#ymIBbGDvQXf!_Eae{Cpj%qPQ%MH z-#)uqot8LRH53kSk;~QJ7c_87R9C~poEIr0JHn26SpI(^2eYPGN|&x~Rm0dd6;Xo+ zaKFQ)F4eGh(( ziEktO5651cTT8sh)CKl+8Zlg**t4h+z+9AjWKB)_wJnY>fW;1*F#te|_6;s|_EmPD zMlc^tX+^!y9;C!#qcLi4r z4}_E=m^5(r5@N+&^LC)5A(oDosBovq&o{i|uz{6p@%jV|u^%aNity|-x~a>6&egyO zLGM6EpP*x=5=eFOf<&p**1virLL!9oEq%JUav>9)I9uI9cG{v&YrjiurYbSqTMaCL z?bD@o{}v?CQH1??q0+OLmQJoi+*wE5LT3EP^}whh#4PEhsF3VZoz(H<+EwfnTZlf$&3 zJiMa}v2tt@O>UaR!o_t%TU|`RSFR(iAXRC4_$Q!(%aEz5zDzgl0_s(*fU1x>K@YIn zWM&)AMh^7XW1S5w?2rc>ok;UmyOzna0%y%~W4#Fh5=a6|;NmZ;bA~6u-Wpv*h73$B zjK9}XWsh~&*SZ7FM7dhZ3q_b#V{EK+)cA7jp0u_y9T-s+0tt=x3yGgv)w1KOke~&Q zqDF>VaUvk$WItCJA%$J-QN7HGL}**1AKhP^<^)EM&01w)GyRN>Kw2*JJ_dQ3ZMBU4ilX1xed;zUBhKNDt9BZpd{4c1;% z(PG5b?lSk5vF&ee1(_!*%0oumZYZz+Aaf^EVWwGkc?L5tTert*|pf6n-ecT zK2U9UYI%=-PGl9h$a%`@;%WrU1*}&p(q&q%B}P|+cuBwW6p|E^xv#%IavKBd)q@R7 zRl1E2rhLwY2Fr_A2K9qpgrxPRPfufgQk8z}KGYidP8la@XeP8ZJz2u3_<{ab4Gm?b z`Lps1=H?qD;TMQ?v@T9%gKj&{5SlX89RYCjs6MvVg=j?VrNm)Jk#F#NaiEUJLAlx4 zh1>>KAmwjaBKGz)U@h{ge;ugoSe{>yU!IeXtYAiFNzR;XIZE4u@O-Wxx!%7$#-GA( zmG*6Si1U#XREZPJ61Jpq>%?`MaHixMsTncuWerT1hd9J}4x=XL<<<5EkRAVm95V6h z3OIp?QZ#>1uJps>aHdPTBjQYsS=B_XRYDAM7`l2^_f=d!zu4I|v~3bq_oZdW;I^cO zn0D;~uTxAt%;Sf4wWoCz{1m8Xd9Hn_y#|D7OG?^GlRigY=I^R!h_{G{P>ah>2`A?#3F3*S~uO2*(Rmq!R zlbvVE=SRjv$KyTq&iHzt-ec7FMdr@#DfddpT37?&V!7hVLs|(JO_~?bGw7rR_5t)@ zG$9U}qk!ATn~BW_x%XgG69O)I7{S%*FoH`QM)3R8)ebqyXzB}UJ@*wvr{H0PNXxP% zhS=#?awZtZCK=MHA;Dy5bR(DPt2E$zYved@+Bh#i>FVTfF@~`UuB4{<6AbZopEcf% zMA$MLYPDkvAbEdR%X15E>JsM`*i%!LZi_vLS7W?^qbzm&C<~lZFLjsI1rHVQg9{=6 z;v3eDo-!})h$wLGph@%mJ$w^HSz{xRw%%9Ufn=g4T5hT@VJ{>%(fD8wBqo_w^gKjTND`5xxin6f6;f#0ifCcGW zai1Rie2R|7Y`ZJLlBHE1aOkaC{R zs<2p>fB|Y~?ZQx^zK^Kq)YmFEQ)LA64^+BYU=r)So_NkYB)oZ29PCq{z`#lrw6dBw zrpLoEm7#@lr_miO333pP1Ur({{7=2~u6TpMffd~W#SB^|Pcda--s~Hi(BEHQ=7VYA zVmgf?1yX|TN~hN-N<~Is1#RRM;dzp@X)qr#fs6=VVMn-mnO2sxAkN{m*3{eVUhXmD zlt_)C##M#=V;Cl|*3`H{B!}#}6pYvo@}q*M`(%oOa!5@X@;KoNgfn<_xz&SPnVeS~ z(dB#=S|ZHHEnkL+kuorqKvHKkM)KGzTrQB@)ReZP=B$9DRN^=H5;OBo73!IiMr_? zYG*hK>}|hdT-1)midnkgf6``653yO(&tbE8%fDi?W~dPVrp-dCq+M&sY36U!X3dl~ zYq=EqWu~TvIDRf;d1xZQY0Q>fo6faB6MipeCn~0wWtVvuz!Gw2hqG+~l?8A?ctH(5 zE~<5>*4VMjm*J`6Zh$y4%(Y3t$l@vj2r$HSdYO0(C`6Nx==py`qPgh`$g%E4O0S#C zY*WyqgV6nLozVg1`M1Du`Vm5msJb#qr9l`eZEMh^qMnuZQbfWhL?OjOSQjc(>iQzi zkI3z5JDg(c6706Y;^jCw>2$7?1wMj+dCpXi*ox<$X}RL0;n1B))vN^M3wx2Oqg>8Y zK;^>mwtGekt2KVS7^nSaoWY~1HUh+e7vKc6or{J+mC<$wk(ucBp$mgjWrW)B@4Mpc z&ZTh|WX&kgEG;U+L8tPp?BZD^1%*5fUy39Pz8su_V@9spxcUlwaabQ$>h}8lH~^ne zj*kT3y1G17aaB%Ntv#+7N0aQ%Vhc_QV7+XKzO+Z}qt!a#P;;nlbo7T%HBJN}UVLz3 zslmX3AOvQftB$(g$CXZtXE15~p(iX|b#byk|N0S|BG}^Or%F+*&+|F?=_H=ANJ11P zco^)YrV;p#V46Hoj#YLE4nW6p0RW{$8ZAAL5Ok~ZgHb}Vf#M8O3kWiSr@`>+@_DVH zAi0SD#TkyjDvx@}g7Ir#usCe9Zx&Z3UEIgrDM1YQ#H|%fTSMBaGm4mY1iQLU2_G&& za4rRvQXkzIOEnM8=CyJ@!$VV_=10cioqs$eTsL@XLbpX3WVo*0&d;fU&h5pKBQ*cF z%{Y?n^C&}GhkAATP|uHOLAX8GdXtvljlDlNL7q(e&;zpLp><{MVBn{HR^s78(C97W z_XX60-80!KRu=(!H8;5&w&4F`3h8LWNu`VZf)sMtO86JKf%s2|Q4fz{spgxCw1P28 z6DWPWb`B{?Sgx)RLQ0m0t~RYQ0X|hc#1{;}GvMh9u4}%5loDTvlyIZfKz({ifiafJ z)n&9n|2+bP9_3{XLU3BT9Lt3L^W&7}GVV2KA3MPHm#`2Gqo0u4dOY&a9O^4DH=b`x zz*YeYG&zKuBR-AL#wx2{KHAXTwc6I3;xQ-W+z4>s^!d@-uFiLdfYjUe1S z=VQcj&~`iq2Dw|MgWMu8PFSjE(9%!_xm%`ckcH8GVxlp`1GV)KuR8Pb&T(3_ z!(uQHX+G{Uw2dRaT+$BAHt~hRZ*Rm((GJcs9^_$~HkL{fZRV|`$N++-_6QLgWOhal z1~HrPE~os>&GBHQ6@#n-fIO9gqrKbwN|z2RSF%1yN`JAqjF5|qHzX-k5wf}{n!M?a z0n|%P-n6%J@V#c~3GfW0J5=OCY=Y*FYQcvdqDj*kaWbmK!6>z3a0*5fKgc5!f};>K zIC0L}UW%AN^Lz|;ZE7??gRa@ajT3F*Nf<-?Kfa5L)9a=wdZ$n=glwfHXeLAGrnz5x z3OKu7PmTIeYKTs{eC)DnS7@|4L>86Dz(|qmvZw*G>cQt69-=d; zQe}O5MGl^K)!3nPKa8d_A2+Dr3P0SXeu3k6x++|@<-vpr4#29k2X)XgK>ZenIq-uL z+@e=#SslA({wlSS79TsJ0~FHAzjhQBL7s^5%cG$DClSPVoV*_29Z}g(9!;5|e~IQF zXYo|F2`t3F(E=j(jCkzHa~h-VWj2^B{x7xh8K|GOy($zp0k=8au@HnN|; z0xH3MG!6n=3R;q_vMG?ytI&Pa7EDzkeBnf}Xj87hN9ST1wva`~Sb@)X@sl0)hJs40 zQ=F&xPyL$KRu=7#t`MKo@`}c$Hb7Lw2oS-Atisd+UUWqW#J>m7kEQW%LFALRVoo6l zscWf77vV)C`hG~61mRdR59_F7Tc^*Uu#L_~O0JOBY| zlp%s8TqhbVzfKt$g&Ms zB@ef{O-j*74l^R0lc3UTpav}?H=)vtPd+2q(M`(W4iVw(>vB2-U3zU+hT|5!Ss962 z&SoWguXWAI>0qeZ~BX7at!8?nMOKC*d61tQY~V zGgD#)$qqR5%s&a>4OM6}n6e0M?qbSB+>SD39Bv)1S4_A?U#|=sCOa1AO>?-s!nM?O zF27!h=`0(tTmGO!*xlDFR|~pNzClUF?<=`)P;e#UN@{lBko?FtKpj6hB~I&frhC$0 zRyR3ipjO~tlx$eLb8-r2-;vqAqf7v0k ziAzVulcXQJ{*YNg*^7tF6L33o$eal@lU_65Ezvysx|xg4&##+@;nx2RGne-Z-Y~z7 zTil!G{kZ+`ra2b3F>jfD5S)l`1OAJTH{kmaBvkAMi>C@10jJL!!5(CJ9yX_G&n1V0eQ!K0$R*%>tb118 z4VJHbHwgb==yPXgJYvq(0Ixd|MEuJm!9kMWGeZs~;upWiNhhC=yce8Y+WVqS-TT3! z*WNcLYfXn84T7jX8Z3YCXmE}{92I0wJ0_;;J7&&cH#6FqJ$6h8$QQ@VlL2nraWS)b z#|1mq9ydp$@WJEeB|;KLo)8jdA!Ina@PxULJ#Zfx#P*&rC(5TTC(TCrlzq}XLOwN| zG-t}E-91T1w*Mn@kM7(ThF_EhJ0q()oHEarPmWXOQu*}eDf9XAY3hgOPHgfA=Bc{Z z>pn22v6p@|hqK4;BN0qA`RoHsN}z<-?7&kew*5o%6y57DADZ)YuN5DebLFds;b{5# z$47uy7CJ`R$L17W-+MncE4tSoLtisL(dG_>I(H zV3*I#wB@ABKQqVcy50SmIbHYK;k0?8?zQ-|d9r*JQ@!)Fd4hcX;Iw%tIPITIxT=G} zBUsw!<{9jvv1Ay#@pH2kr4Lk*0c^u$(vyw&jC9}p2e=vk1vfIyMPHcrbdYWDI|Ih| zk0PVk?nE^I{R~LGI2{~%^=tEUZ8d2|la-y>o8vGLkQymFAN&ylA<7brq!XL+lR1*V zj%aTB$^3hmY;*lDV6xV)Bm4Ci2!j~;(zE8l&E{Xt|LG8@R>7j?{AO@;ZWtq%U?QJ{ zk&*u@AS2IX1474N)QikeF&RZt*wSP&s=2Wv*&Egp;)c#-j%?UQ7iJhu^4Lw^oAFb5 zd89YX=}HDRo4b+~tq}WDFlEf&m2_?1(u4f=_i-p=+qz=5AB7P^^DVu}5C07W>I4%x zy_&c6CzrH>0B)zUT?5Hr7Og;LM@Dg3`7_#-v6{hTZ%dN4LCEIGL&-C(#w;36h@|~r z7-{7u(v6Xko`Ga?2^qx#xHW^dF)BtO zum-Rv#*nUTZ={ABpblVhV*npg)Cx2JiXJI)BtRX&3X@58vtul|@4Pl}{hxxL6h*8Z z*!buWwfiE5CqOftiKAT8DNTA zK?w3Oz@z|2M{!LQ!w+DaQpx#zBm+B}N^<0w_DN)|G)@b*f_XhBlRCD3Kzca4Y%&=H z)3#IPMxi3e3My)y!4G@KnQCEeQr zL|Kn1=&Ur+A#{Q$RHm`)Hi$x(_YY@hO;ei zn|rdirjdWPtk~T^=CcEt#M-iAyAuj6ND+i`Jezc8W3tH|ZB)F_vh2y}i zl1oa%*axTSAa)`jE)bCE%U;SO{aFrw4OU#4PiWwkhk=FyvJ zC57U~ANe&CJBK-W z`HJ>uQ%fOIx6CGyT`7<%UQ$1S)%^mYJT#wn?BN8W*w+$gpxE}=oSxaVON1%L(14n< z1-Lh`g}-Bl?u7tzvmGLFrkHfkS7)ZCG|dJ_bTkeP8XT1dqtR&?k8UQzXnB&*&>#~U zYL_wxvNMJzw7>}XhY*9pEQf&+$274)1!+hZ#}ExcdK!!q4AB6#7+-rD`Fu@yonXRr zD#882MUbf7-;*AEt~uRMC3~`K&d_1(u_{yu2P!24x=o89PCdVa*CO=!L;>Wox`+%6 z`%_`Kx|q!3ERSSUbEuJ(Uqd@>J_`FL$RmbdQ9>SI=N+JZMOiZ@F=e35K(Jg&2hg!^O*OzHfW{18`XdbnY%LfYlx#t6q{rJwK=;wOGGR!({3YI1v9u+T_#e`+r#v+%a(Vp7nu z%Z@rBvcIn;JO}s9C1g-Xpcv@6?GjQX%ZIi{-*EQRrDTr|0pVwABnoHeuYo@bXRRj_ zp5JY2$oL>;9oLddye(c!c!Kh>wd6wFPOe2Z>e7pek@3KSC0r&_80TihcbAhWbRD^l zxNt+;Tt4PI?V~koJ!}c|VQj#qJfFM2BiN)X$@G@pT6?0c1opS9h)a@a_0?pFd_q}o z)_()JLBe}v16lRgko$Hc1pkdHP$21AGV`zXN!^6yRP;e$oYLOZ#&d`T!RC{KuqrFjrPx*JgWrrUhF~Kl0j=_|>wsN}Y4u)%_$`$P_U-kAr^big zART*otCqK`Zx9ytDcpJn0r8y|sb$@_klyG!Yzvu$Tk#fQJTKoO0)}U|5S~2!eG5s$ zE%ipiEv@rLa<8OZKwlXP#n2%D(ZitA_0HP1BB<}_YQ#t-*XC%NWsmdoHu=X zCou>(hi(>h{PJdU4H{mwjcgIcz3w0*yL;51Q?lD4?!tK3USJuw5Q1CNE%0^@?I43U z-$^+TN1v-zLzAPLPc-inwOFDLIJiQodC4)&dJ3ejLO@Za#q z*Y8d|d$CUhUWr-0dOQ5G3vVYw&t!Z~=xr1ERCOVBeOxAJ$ zQ`p^iOTz$cG(wJMDLcqqw*C&7!CgD}1e<~RAPwnkjj9Q;)fO;dGF>I^dgHSBvM|us5xtHXLu~*zH*3+#I2!j)`lkg}nekZvS zweLV%-u|SVJ8t>#DCcK)_S2Nf?d;0B75@^PBV>_tj`6sUxZ+wut|s> z*)@CMz<=9Jwm!Xw4Cn%jBX&0N!nfg0>=CA6 z_gth_&dj6SHSA-h>1@lR@aYaU(}C>hqfjFmqb;Icx-8@I`Z6!O<`0Y=`xqI=HvR#R z-TIgipjRFv!v*2{tUgITgq{$|D9l#DeMRtZZxh?dy51YFW0gx6Sh%q{|>-Is- zf&(4irwxRdp*!pLG`X2od<6oFAzyi#JgEbE^S?=3V+>>AUDA87p=&Vb&CkHSLJZQE zJ^l=mSz-zRHIO~?3^?=fv#L}~S;*tHm*D#~yhwU*3%O_!9n=xOm2YHW2M`PvE=1Ie z2K~YMqUVI;B&1>Mb3$k!4ONnd)1Jo!1hZGYh_I&idAJlS9@8SR{m+y4gA>@ipLA?~ z@&&9up=B(u61kz_FCtzNL7Xdq~HGhblxvz~>2U-A;1Uh(?UPCB@cYJ#L%LGQ9y-Rq=(IQI*srm^#1N0dGKWx_Y9 z6W#!ESH3K~y1GKz1iEc@U<*ZLx>CN!ig&#k;a}gV*L@%H$uWIg9s-4QT#;X$$y zc%3;&j%zKhVE6Y1P3n(8M{anHr=Nl3|nfoh5)_)vEN>vC>^t*_= zkhE~Gh4^=X`95@%nD_*n zx4j2vfzRf6F`3GKeV?2K4+9Jx$_5=HgR$=)YM2f3$YhBNR5Y?hJ210*v-Q&{0_LA6}(T8h}E*%0)05=Ad_3=hmBBDd3#CR?qN0G`!)GKjK%zi^y&io^B*~4=5NS^ z0ci%F+_Ki%w4Zw^K^l}@^DPj4@QZ zygq)KEiHIH$%XStaauXnZ82X?a{j=MhS4E{Tt9}<*Vxq^VbH}^%--9;C-NFXwod2K zdvq0sA4$*VH_oF~oT%S)f_M~mqT|`)KSMV-2iTL{s9jd^MSNB`oy+Pv)17QzcWPjy z3mw6!71o6g#|8oI+%wcQYhK%he)yLlHv{r^$>}e;(*_J>>p`yomA~#mZ6f^d$re5Z ze73!VWJhBk_!aAVQU?z)dOp&N?(HBBba54e8sZ1w4BUa`zX7W16?>--T@I*)eJO;v z-JOPJB!{Xc8r=raQrV$D^9-P32dq64#cA+B@AQGqI|tHUVIl~S;{utYdMD4jWESNV zmT1VlIf(K&s>fi;-6_p2wXz-k5yHGXn5GFH_8&rpEQ(V`bBAD2b^Rnubai#Npu!xz_thB z%6~tJ4nlp8$uvb<1G6Smo($xObPA1B)}nY)8s&$=YH<^@zAcSDEL)Fc^=7(XKEJOO zrBeEgX!k3nlV#y>R+vtC=({dm*o?>1X^u*%N^hK%|Czhu=c?j zRFX1OUDQQk=@dFTu*%;!h4Ov4e@~$Wxb>MzxjTc~AU0zvMQZCkD5_;DU4+u7r_zO- z5UBe%O#mYsHXEj8cNXQ@iUV2n9u8?y4g?8lV3+Tq4&URS6DzP@U`Hrc z^$oRDIF8((Piv%4EXsl@^og_RYUZs(E~p@vC+DZZ7ZAR)XxAebhEVvwcnP@1|Tn=@jAZW1gAcH-SlAYn z&SQN`U?IeLgVYisMI|Nl6Ch(QrO{kAlx2wdR+LhnmwBX=ULv;l+3Y#Agx3n=_~;zk zAGHVO(2Ll-4TsTx!O1TWHs_ zRs66Q(2ig~UVuI3hr+Ojc;*Leuc53bpCwO?iK*OmA??HF7ejek^!erw+OH#Dp*PQ? z13=o)0DN#K2u8s?^kt)J3H*c4|0NFM1I&T5p1S~|vedwQ< ze6NKxLG})YS3f_8AZ77Fn$#MX&0iv#JG~GDgLn*NL(1s{8Mc;|(_CFpi;6z%g>vv% z?tHZoJp(grcP^rd5&&M;1QfF?6L@2Ovslw%IPSvzM_C`X)y^wQw+wTZN zhC9GcVeFo%68c*1pwB>3A{W!SxGi5y<*A?h@uw_>Sn$O_oZuL_gc@~}nZJZyrK8Lr zOX!V~!MkeceEDRkMLJRW0U~Vn%Q)}LYQIv1TI z0xZ~5X1EEyLuWVT(RZF(tj`y@DNoZy*NH+;9gStP>!2N1Z-xBts{?z3ufNt|=-_L* zhfZWOEl{uWI(nFhcXU#r3S(Y``Bhk^Po|efTcwNL^JBsl2hkCjSP6c0Ju-j0x96zU8 zgCN6KEe>l$uq&5RGv~(ckHNy@OKChv&~q7GrOSiewu~;9;uhOL#|C4vc@32BI5jlT z34-R^8z|p9eY-(8$kEH`1$et;Ih_I@oV%U;Kfad9vkSq+j2&A}H=rrhW)S=53ZX(f zR?v;?-=9N5a7^M7w(l&+@Akuhe&2`#3$=H`mdCCXYekv7UA~gW>h?O?8V8mXBN^C# zR>CYIl?2~>1;`}Qf&M1iASo&Agh)B{xrkW7e8;wU6`haUu2o_wd36SRa){Ci64wJhPJUw_Frqz43=1&MrX04`n z_Vg#%ywY;Tz2uM>iI3leEb3}1G6*dE5)rj5xr8##!>!-oJmvUHX-|xqd?_8v%cgF` z5E!RByXaEd4HX&du_wZp)e+)11SiyZC#3OZhQrqWae1mW)t(Um3{3m3z z>NJcP%)TnEk!xrP8ZBKz6?O_Al62z`#D_WTxivx>eq94W7giy2Elt%h8ljO7OCMxY z8<*et*t^zJe#HLBT59Ga!Uf~jKk70XBZ*ganYK7>xeR(Nj4D6x!}ec>$?;c_o<(A$ z8|!sBdR=>l4(Y<71GgXrdP@q_F0na0f(Y!Y%f;H?e7Rs|fK(B(p{G{1>bVXe`C&p< zw2odNQ4$ifZylW}Pg9(~9{wJuav!y;oyY64`;;q$>t1;Uor+1`i5nYz1_{8QuR!mg z*Fi4w*JCvju21!P%Fp1fST6{2$9g)3lW^PBbTm7?o|~lJP?7gmApm~=DtM_;SJGut zb3u+i?3pX6i951=nLw|@RrCp+UTfW+l2CSCO?OD-7j2;9`7jFiu(oV~Z4(q0O!#O6 zrY*f+&Xa!EfJNdJ1CEdyd(AaSC5TKIgnSm47pUJ6xc^dZl zo=qT2$QWbTxXrM(;vh@_)n1ZyR+oFZM0E9LOjhvyt<9Rb5IS4IFwZtS^S|*eJD+0h zbpH4CbYY9m-E8(s3(j|?AyB)4@=bY&;*c&#Ux^GByMbn+?B=bom&ZM@W53=YeTi_k z;zsD_t}QTdjayJFtejSsB45AUBE(PhzM3ym%8igft>vu1Q#||qM$J$HL_90m3TlgX zja!A028dEw@Y_}qK@Pu(ju1;h+D&wWczF3H%2WmCzwg0%y#^C?)y*^)AMkN~3HSEW z+r{uG8q7}LPIsVs;~g|lw%Uu^&397%1(oRY&7JfiJl}qoP-s!~%UvQWynlx)K>-gvw&EUSmu29y%%z@fY1g`8kr?@1cw3#z4P&;rZ^}5B}%hD}p~BvNW%} z7da$pJVc6*Z$}7Le6UkQ5&iC?6I$g&r{5>$cI|y)Nqzc0n3rvbV8MR4Pne&s_tSDU zrOcUzKMHEW2emw+YhH0bpvoQnhjxh-Zs@)7z^F&HoG zZgAlj?eUM*E~+`%lbVq@z4j}tMKO=UDjN4dklak3pJt z+ptlv{81>6Xe;suqQhH{!mhO_8~+%+Lg4V=V}cDQ9uo{te4IWlzeno!geXsa0%=)D z;1hJTF1z;Z6Lf4qR=#*b=Du#qCGo84N#r@i68zzlw3gl3J$(>6{Zz}Re$26#HtGaa zs3+f1X9-=9I^-+0us(o2ie>Jj(}2T2_t7=Db$^;3W3K06OBQ_qMi~Bse}=z9!XNoJ zk~VUhTb`kZ`Ox51B@tUIo!I(kX||ZK0Qt?cv=Fc|o};%1V0C4`JPp@n)sryxou8+2 zyXyW|MI3zl^K>8D+g_lz;nrn8PYbh+`*BoUtO#RY)Hs9{;awRvOnn(X^v;*4Kk)i* z`6QOMVXvTv$n(%;aQRoiLi1(qN3S5-2rfd%<#4a=m!uWY6`~a**BNfHB zU!@D!eQzKMwEQ4lDf`T4o2J515(lkCZhrS+8oT)|XmReX@M<4ABs|C0579knzwR}9 z61OFv#C5u;@LHiM-SK$3(jA(qr^x0j%&iT`L|AAEy_g%bXLmQN*15pv7A!==gw! z;t)@N7JCYEJ^Up7P4v-lFl)niEYRZrFY!HknFaL>7;S!+RQD~Wz7Z}|0Gj#>JHlypz{yLk~*fTwt zu@=*d*@|%e>7MDzp8!A6E1e(U>eM@Z6uY-~dOtR?clxowKn!5IHz)T=?G9> zd=?S>DWeJFdG?Si9&^8lQ#Nl5Okb?7l3I|c*@J>X={%w99+b{w;{Ait<)*^fLFw~T zwJ-d|UvwyX5x}2&EN~aQ?Nz2NaxZ0;Zf1!szLkvIl=0|Y+a{H)*^x56>xJ9)f3ooT=q2%G9e#apL*c51 zf9!d8WOSc0c2#ovCH|FnfB)Ujmz`-=TzBsNu<`4CYac2!Jy`zLtM|R(+1vHgh>!QZ zl=JIJd*p+)pPqgv;aNwwk{6Q8e(-dBbAYFE-yfG}9gltW@Ye5U%}N~l%R_ti{yz4y z!vhz6@zeWXm3{X7jc>iuYxTw#zJB2Q50-x2eZZnKmfN51w5jv@)mu70`0FqKcGbML zw*OiGo)NFDTllj5#NY(`+3pz&-cp{pBifi?3Mo-OTGO!#_H+Ew7^Lkw>P#YdQ6CbyJ6jXR$sL(?9bo z2?-V0y;b^EfBx8Hi=>$fj{ z^OawZjkM0$*#D06Ms(T!?8wWfWPJSITN|e>G5gIIU%I-(?|lY+e8B^U>80Nvy*h2& zhK>Fw#@!v2SN)%V?(5d^o!sKY=4nIvRIH4A`s&|~KH2kMpPpDv9v(RMY*PHMr|wcl zZqV ALI3~& delta 14312 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 AHUIzs diff --git a/agents/meshcmd.js b/agents/meshcmd.js index 518ecdb0..daae5007 100644 --- a/agents/meshcmd.js +++ b/agents/meshcmd.js @@ -438,13 +438,21 @@ function run(argv) { nextStepStorageUpload(); } } else if ((settings.action == 'amtversion') || (settings.action == 'amtversions') || (settings.action == 'amtver')) { - // Display Intel AMT versions + // Display Intel ME versions var amtMeiModule, amtMei; try { amtMeiModule = require('amt-mei'); amtMei = new amtMeiModule(); } catch (ex) { console.log(ex); exit(1); return; } amtMei.on('error', function (e) { console.log('ERROR: ' + e); exit(1); return; }); amtMei.getVersion(function (val) { - console.log("MEI Version = " + val.BiosVersion.toString()); - for (var version in val.Versions) { console.log(val.Versions[version].Description + " = " + val.Versions[version].Version); } + console.log("BIOS Version = " + val.BiosVersion.toString()); + for (var version in val.Versions) { + var extras = '', skuBits = ['', 'iQST', 'ASF', 'AMT', 'ISM', 'TPM', '', '', 'HomeIT', '', 'WOX', '', '', 'AT-p', 'Corporate', 'L3 Mgt Upgrade']; + if (val.Versions[version].Description == 'Sku') { + var n = parseInt(val.Versions[version].Version), x = [], xx = 1; + for (var i = 0; i < skuBits.length; i++) { if ((n & xx) != 0) { x.push(skuBits[i]); } xx = xx << 1; } + if (x.length > 0) { extras = ' (' + x.join(', ') + ')' } + } + console.log(val.Versions[version].Description + " = " + val.Versions[version].Version + extras); + } exit(1); return; }); } else if (settings.action == 'amthashes') { @@ -472,7 +480,14 @@ function run(argv) { var amtMeiModule, amtMei; try { amtMeiModule = require('amt-mei'); amtMei = new amtMeiModule(); } catch (ex) { console.log(ex); exit(1); return; } amtMei.on('error', function (e) { console.log('ERROR: ' + e); exit(1); return; }); - amtMei.getVersion(function (result) { if (result) { for (var version in result.Versions) { if (result.Versions[version].Description == 'AMT') { mestate.ver = result.Versions[version].Version; } } } }); + amtMei.getVersion(function (result) { + if (result) { + for (var version in result.Versions) { + if (result.Versions[version].Description == 'AMT') { mestate.ver = result.Versions[version].Version; } + if (result.Versions[version].Description == 'Sku') { mestate.sku = parseInt(result.Versions[version].Version); } + } + } + }); amtMei.getProvisioningState(function (result) { if (result) { mestate.ProvisioningState = result; } }); amtMei.getProvisioningMode(function (result) { if (result) { mestate.ProvisioningMode = result; } }); amtMei.getEHBCState(function (result) { if (result) { mestate.ehbc = result; } }); @@ -484,7 +499,9 @@ function run(argv) { amtMei.getDnsSuffix(function (result) { if (result) { mestate.dns = result; } if (mestate.ver && mestate.ProvisioningState && mestate.ProvisioningMode) { - var str = 'Intel AMT v' + mestate.ver; + var str = 'Intel ME v' + mestate.ver; + if (mestate.sku & 8) { str = 'Intel AMT v' + mestate.ver } + else if (mestate.sku & 16) { str = 'Intel SM v' + mestate.ver } if (mestate.ProvisioningState.stateStr == 'PRE') { str += ', pre-provisioning state'; } else if (mestate.ProvisioningState.stateStr == 'IN') { str += ', in-provisioning state'; } else if (mestate.ProvisioningState.stateStr == 'POST') { @@ -1138,6 +1155,7 @@ function activeToACMEx(fwNonce, dnsSuffix, digestRealm, uuid, allowedModes) { try { cmd = JSON.parse(data); } catch (ex) { console.log('Unable to parse server response: ' + data); exit(100); return; } if (typeof cmd != 'object') { console.log('Invalid server response: ' + cmd); exit(100); return; } if (typeof cmd.errorText == 'string') { console.log('Server error: ' + cmd.errorText); exit(100); return; } + if (typeof cmd.messageText == 'string') { console.log('Server: ' + cmd.messageText); return; } switch (cmd.action) { case 'acmactivate': { // Server responded with ACM activation response @@ -1204,7 +1222,7 @@ function activeToACMEx(fwNonce, dnsSuffix, digestRealm, uuid, allowedModes) { var action = 'acmactivate'; if (settings.action == 'amtccm') { action = 'ccmactivate'; } if (settings.action == 'amtdiscover') { action = 'amtdiscover'; } - socket.write({ client: 'meshcmd', version: 1, action: action, fqdn: dnsSuffix, realm: digestRealm, nonce: fwNonce, uuid: uuid, profile: settings.profile, hashes: trustedHashes, tag: settings.tag, name: settings.name, ver: mestate.vers['AMT'], build: mestate.vers['Build Number'], modes: allowedModes, currentMode: mestate.controlMode }); + socket.write({ client: 'meshcmd', version: 1, action: action, fqdn: dnsSuffix, realm: digestRealm, nonce: fwNonce, uuid: uuid, profile: settings.profile, hashes: trustedHashes, tag: settings.tag, name: settings.name, ver: mestate.vers['AMT'], build: mestate.vers['Build Number'], sku: parseInt(mestate.vers['Sku']), modes: allowedModes, currentMode: mestate.controlMode, hostname: require('os').hostname() }); }); connection.end(); } diff --git a/agents/meshcmd.min.js b/agents/meshcmd.min.js index 518ecdb0..daae5007 100644 --- a/agents/meshcmd.min.js +++ b/agents/meshcmd.min.js @@ -438,13 +438,21 @@ function run(argv) { nextStepStorageUpload(); } } else if ((settings.action == 'amtversion') || (settings.action == 'amtversions') || (settings.action == 'amtver')) { - // Display Intel AMT versions + // Display Intel ME versions var amtMeiModule, amtMei; try { amtMeiModule = require('amt-mei'); amtMei = new amtMeiModule(); } catch (ex) { console.log(ex); exit(1); return; } amtMei.on('error', function (e) { console.log('ERROR: ' + e); exit(1); return; }); amtMei.getVersion(function (val) { - console.log("MEI Version = " + val.BiosVersion.toString()); - for (var version in val.Versions) { console.log(val.Versions[version].Description + " = " + val.Versions[version].Version); } + console.log("BIOS Version = " + val.BiosVersion.toString()); + for (var version in val.Versions) { + var extras = '', skuBits = ['', 'iQST', 'ASF', 'AMT', 'ISM', 'TPM', '', '', 'HomeIT', '', 'WOX', '', '', 'AT-p', 'Corporate', 'L3 Mgt Upgrade']; + if (val.Versions[version].Description == 'Sku') { + var n = parseInt(val.Versions[version].Version), x = [], xx = 1; + for (var i = 0; i < skuBits.length; i++) { if ((n & xx) != 0) { x.push(skuBits[i]); } xx = xx << 1; } + if (x.length > 0) { extras = ' (' + x.join(', ') + ')' } + } + console.log(val.Versions[version].Description + " = " + val.Versions[version].Version + extras); + } exit(1); return; }); } else if (settings.action == 'amthashes') { @@ -472,7 +480,14 @@ function run(argv) { var amtMeiModule, amtMei; try { amtMeiModule = require('amt-mei'); amtMei = new amtMeiModule(); } catch (ex) { console.log(ex); exit(1); return; } amtMei.on('error', function (e) { console.log('ERROR: ' + e); exit(1); return; }); - amtMei.getVersion(function (result) { if (result) { for (var version in result.Versions) { if (result.Versions[version].Description == 'AMT') { mestate.ver = result.Versions[version].Version; } } } }); + amtMei.getVersion(function (result) { + if (result) { + for (var version in result.Versions) { + if (result.Versions[version].Description == 'AMT') { mestate.ver = result.Versions[version].Version; } + if (result.Versions[version].Description == 'Sku') { mestate.sku = parseInt(result.Versions[version].Version); } + } + } + }); amtMei.getProvisioningState(function (result) { if (result) { mestate.ProvisioningState = result; } }); amtMei.getProvisioningMode(function (result) { if (result) { mestate.ProvisioningMode = result; } }); amtMei.getEHBCState(function (result) { if (result) { mestate.ehbc = result; } }); @@ -484,7 +499,9 @@ function run(argv) { amtMei.getDnsSuffix(function (result) { if (result) { mestate.dns = result; } if (mestate.ver && mestate.ProvisioningState && mestate.ProvisioningMode) { - var str = 'Intel AMT v' + mestate.ver; + var str = 'Intel ME v' + mestate.ver; + if (mestate.sku & 8) { str = 'Intel AMT v' + mestate.ver } + else if (mestate.sku & 16) { str = 'Intel SM v' + mestate.ver } if (mestate.ProvisioningState.stateStr == 'PRE') { str += ', pre-provisioning state'; } else if (mestate.ProvisioningState.stateStr == 'IN') { str += ', in-provisioning state'; } else if (mestate.ProvisioningState.stateStr == 'POST') { @@ -1138,6 +1155,7 @@ function activeToACMEx(fwNonce, dnsSuffix, digestRealm, uuid, allowedModes) { try { cmd = JSON.parse(data); } catch (ex) { console.log('Unable to parse server response: ' + data); exit(100); return; } if (typeof cmd != 'object') { console.log('Invalid server response: ' + cmd); exit(100); return; } if (typeof cmd.errorText == 'string') { console.log('Server error: ' + cmd.errorText); exit(100); return; } + if (typeof cmd.messageText == 'string') { console.log('Server: ' + cmd.messageText); return; } switch (cmd.action) { case 'acmactivate': { // Server responded with ACM activation response @@ -1204,7 +1222,7 @@ function activeToACMEx(fwNonce, dnsSuffix, digestRealm, uuid, allowedModes) { var action = 'acmactivate'; if (settings.action == 'amtccm') { action = 'ccmactivate'; } if (settings.action == 'amtdiscover') { action = 'amtdiscover'; } - socket.write({ client: 'meshcmd', version: 1, action: action, fqdn: dnsSuffix, realm: digestRealm, nonce: fwNonce, uuid: uuid, profile: settings.profile, hashes: trustedHashes, tag: settings.tag, name: settings.name, ver: mestate.vers['AMT'], build: mestate.vers['Build Number'], modes: allowedModes, currentMode: mestate.controlMode }); + socket.write({ client: 'meshcmd', version: 1, action: action, fqdn: dnsSuffix, realm: digestRealm, nonce: fwNonce, uuid: uuid, profile: settings.profile, hashes: trustedHashes, tag: settings.tag, name: settings.name, ver: mestate.vers['AMT'], build: mestate.vers['Build Number'], sku: parseInt(mestate.vers['Sku']), modes: allowedModes, currentMode: mestate.controlMode, hostname: require('os').hostname() }); }); connection.end(); } diff --git a/agents/meshcore.js b/agents/meshcore.js index 79196cf7..d6c15a1a 100644 --- a/agents/meshcore.js +++ b/agents/meshcore.js @@ -1683,19 +1683,10 @@ function createMeshCore(agent) var response = null; switch (cmd) { case 'help': { // Displays available commands - var fin = ''; - var f = ''; - var availcommands = 'help, info, osinfo, args, print, type, dbget, dbset, dbcompact, eval, parseuri, httpget, nwslist, wsconnect, wssend, wsclose, notify, ls, ps, kill, amt, netinfo, location, power, wakeonlan, scanwifi, scanamt, setdebug, smbios, rawsmbios, toast, lock, users, sendcaps, openurl, amtreset, amtccm, amtacm, amtdeactivate, amtpolicy, getscript, getclip, setclip, log, av, cpuinfo, sysinfo, apf'; - availcommands = availcommands.split(','); - for (f in availcommands) { availcommands[f] = availcommands[f].trim(); } - availcommands = availcommands.sort(); f = ''; - while (availcommands.length > 0) - { - if (f.length > 100) - { - fin += (f + ',\r\n'); - f = ''; - } + var fin = '', f = '', availcommands = 'help,info,osinfo,args,print,type,dbget,dbset,dbcompact,eval,parseuri,httpget,nwslist,wsconnect,wssend,wsclose,notify,ls,ps,kill,amt,netinfo,location,power,wakeonlan,setdebug,smbios,rawsmbios,toast,lock,users,sendcaps,openurl,amtreset,amtccm,amtacm,amtdeactivate,amtpolicy,getscript,getclip,setclip,log,av,cpuinfo,sysinfo,apf,scanwifi,scanamt'; + availcommands = availcommands.split(',').sort(); + while (availcommands.length > 0) { + if (f.length > 100) { fin += (f + ',\r\n'); f = ''; } f += (((f != '') ? ', ' : ' ') + availcommands.shift()); } if (f != '') { fin += f; } @@ -2417,7 +2408,7 @@ function createMeshCore(agent) try { if (meinfo == null) return; var intelamt = {}, p = false; - if ((meinfo.Versions != null) && (meinfo.Versions.AMT != null)) { intelamt.ver = meinfo.Versions.AMT; p = true; } + if ((meinfo.Versions != null) && (meinfo.Versions.AMT != null)) { intelamt.ver = meinfo.Versions.AMT; p = true; if (meinfo.Versions.Sku != null) { intelamt.sku = parseInt(meinfo.Versions.Sku); } } if (meinfo.ProvisioningState != null) { intelamt.state = meinfo.ProvisioningState; p = true; } if (meinfo.Flags != null) { intelamt.flags = meinfo.Flags; p = true; } if (meinfo.OsHostname != null) { intelamt.host = meinfo.OsHostname; p = true; } diff --git a/agents/meshcore.min.js b/agents/meshcore.min.js index 8d3382c5..d6c15a1a 100644 --- a/agents/meshcore.min.js +++ b/agents/meshcore.min.js @@ -1683,7 +1683,14 @@ function createMeshCore(agent) var response = null; switch (cmd) { case 'help': { // Displays available commands - response = 'Available commands: help, info, osinfo, args, print, type, dbget, dbset, dbcompact, eval, parseuri, httpget,\r\nwslist, wsconnect, wssend, wsclose, notify, ls, ps, kill, amt, netinfo, location, power, wakeonlan, scanwifi,\r\nscanamt, setdebug, smbios, rawsmbios, toast, lock, users, sendcaps, openurl, amtreset, amtccm, amtacm,\r\namtdeactivate, amtpolicy, getscript, getclip, setclip, log, av, cpuinfo, sysinfo, apf.'; + var fin = '', f = '', availcommands = 'help,info,osinfo,args,print,type,dbget,dbset,dbcompact,eval,parseuri,httpget,nwslist,wsconnect,wssend,wsclose,notify,ls,ps,kill,amt,netinfo,location,power,wakeonlan,setdebug,smbios,rawsmbios,toast,lock,users,sendcaps,openurl,amtreset,amtccm,amtacm,amtdeactivate,amtpolicy,getscript,getclip,setclip,log,av,cpuinfo,sysinfo,apf,scanwifi,scanamt'; + availcommands = availcommands.split(',').sort(); + while (availcommands.length > 0) { + if (f.length > 100) { fin += (f + ',\r\n'); f = ''; } + f += (((f != '') ? ', ' : ' ') + availcommands.shift()); + } + if (f != '') { fin += f; } + response = 'Available commands: \r\n' + fin + '.'; break; } /* @@ -2401,7 +2408,7 @@ function createMeshCore(agent) try { if (meinfo == null) return; var intelamt = {}, p = false; - if ((meinfo.Versions != null) && (meinfo.Versions.AMT != null)) { intelamt.ver = meinfo.Versions.AMT; p = true; } + if ((meinfo.Versions != null) && (meinfo.Versions.AMT != null)) { intelamt.ver = meinfo.Versions.AMT; p = true; if (meinfo.Versions.Sku != null) { intelamt.sku = parseInt(meinfo.Versions.Sku); } } if (meinfo.ProvisioningState != null) { intelamt.state = meinfo.ProvisioningState; p = true; } if (meinfo.Flags != null) { intelamt.flags = meinfo.Flags; p = true; } if (meinfo.OsHostname != null) { intelamt.host = meinfo.OsHostname; p = true; } diff --git a/meshagent.js b/meshagent.js index 74009a0c..6949ff05 100644 --- a/meshagent.js +++ b/meshagent.js @@ -1355,24 +1355,25 @@ module.exports.CreateMeshAgent = function (parent, db, ws, req, args, domain) { //if (command.users) { console.log(command.users); } // Check if anything changes - if (command.name && (command.name != device.name)) { change = 1; log = 1; device.name = command.name; changes.push('name'); } + if (command.name && (typeof command.name == 'string') && (command.name != device.name)) { change = 1; log = 1; device.name = command.name; changes.push('name'); } if ((command.caps != null) && (device.agent.core != command.value)) { if ((command.value == null) && (device.agent.core != null)) { delete device.agent.core; } else { device.agent.core = command.value; } change = 1; } // Don't save this as an event to the db. if ((command.caps != null) && ((device.agent.caps & 0xFFFFFFE7) != (command.caps & 0xFFFFFFE7))) { device.agent.caps = ((device.agent.caps & 24) + (command.caps & 0xFFFFFFE7)); change = 1; } // Allow Javascript on the agent to change all capabilities except console and javascript support, Don't save this as an event to the db. - if ((command.osdesc != null) && (device.osdesc != command.osdesc)) { device.osdesc = command.osdesc; change = 1; changes.push('os desc'); } // Don't save this as an event to the db. + if ((command.osdesc != null) && (typeof command.osdesc == 'string') && (device.osdesc != command.osdesc)) { device.osdesc = command.osdesc; change = 1; changes.push('os desc'); } // Don't save this as an event to the db. if (device.ip != obj.remoteaddr) { device.ip = obj.remoteaddr; change = 1; } if (command.intelamt) { if (!device.intelamt) { device.intelamt = {}; } - if ((command.intelamt.ver != null) && (device.intelamt.ver != command.intelamt.ver)) { changes.push('AMT version'); device.intelamt.ver = command.intelamt.ver; change = 1; log = 1; } - if ((command.intelamt.state != null) && (device.intelamt.state != command.intelamt.state)) { changes.push('AMT state'); device.intelamt.state = command.intelamt.state; change = 1; log = 1; } - if ((command.intelamt.flags != null) && (device.intelamt.flags != command.intelamt.flags)) { + if ((command.intelamt.ver != null) && (typeof command.intelamt.ver == 'string') && (command.intelamt.ver.length < 12) && (device.intelamt.ver != command.intelamt.ver)) { changes.push('AMT version'); device.intelamt.ver = command.intelamt.ver; change = 1; log = 1; } + if ((command.intelamt.sku != null) && (typeof command.intelamt.sku == 'number') && (device.intelamt.sku !== command.intelamt.sku)) { changes.push('AMT SKU'); device.intelamt.sku = command.intelamt.sku; change = 1; log = 1; } + if ((command.intelamt.state != null) && (typeof command.intelamt.state == 'number') && (device.intelamt.state != command.intelamt.state)) { changes.push('AMT state'); device.intelamt.state = command.intelamt.state; change = 1; log = 1; } + if ((command.intelamt.flags != null) && (typeof command.intelamt.flags == 'number') && (device.intelamt.flags != command.intelamt.flags)) { if (device.intelamt.flags) { changes.push('AMT flags (' + device.intelamt.flags + ' --> ' + command.intelamt.flags + ')'); } else { changes.push('AMT flags (' + command.intelamt.flags + ')'); } device.intelamt.flags = command.intelamt.flags; change = 1; log = 1; } - if ((command.intelamt.realm != null) && (device.intelamt.realm != command.intelamt.realm)) { changes.push('AMT realm'); device.intelamt.realm = command.intelamt.realm; change = 1; log = 1; } - if ((command.intelamt.host != null) && (device.intelamt.host != command.intelamt.host)) { changes.push('AMT host'); device.intelamt.host = command.intelamt.host; change = 1; log = 1; } - if ((command.intelamt.uuid != null) && (device.intelamt.uuid != command.intelamt.uuid)) { changes.push('AMT uuid'); device.intelamt.uuid = command.intelamt.uuid; change = 1; log = 1; } - if ((command.intelamt.user != null) && (device.intelamt.user != command.intelamt.user)) { changes.push('AMT user'); device.intelamt.user = command.intelamt.user; change = 1; log = 1; } - if ((command.intelamt.pass != null) && (device.intelamt.pass != command.intelamt.pass)) { changes.push('AMT pass'); device.intelamt.pass = command.intelamt.pass; change = 1; log = 1; } + if ((command.intelamt.realm != null) && (typeof command.intelamt.realm == 'string') && (device.intelamt.realm != command.intelamt.realm)) { changes.push('AMT realm'); device.intelamt.realm = command.intelamt.realm; change = 1; log = 1; } + if ((command.intelamt.host != null) && (typeof command.intelamt.host == 'string') && (device.intelamt.host != command.intelamt.host)) { changes.push('AMT host'); device.intelamt.host = command.intelamt.host; change = 1; log = 1; } + if ((command.intelamt.uuid != null) && (typeof command.intelamt.uuid == 'string') && (device.intelamt.uuid != command.intelamt.uuid)) { changes.push('AMT uuid'); device.intelamt.uuid = command.intelamt.uuid; change = 1; log = 1; } + if ((command.intelamt.user != null) && (typeof command.intelamt.user == 'string') && (device.intelamt.user != command.intelamt.user)) { changes.push('AMT user'); device.intelamt.user = command.intelamt.user; change = 1; log = 1; } + if ((command.intelamt.pass != null) && (typeof command.intelamt.pass == 'string') && (device.intelamt.pass != command.intelamt.pass)) { changes.push('AMT pass'); device.intelamt.pass = command.intelamt.pass; change = 1; log = 1; } } if (command.av) { if (!device.av) { device.av = []; } diff --git a/package.json b/package.json index aaaca8a4..b59a4c2c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "meshcentral", - "version": "0.4.1-n", + "version": "0.4.1-o", "keywords": [ "Remote Management", "Intel AMT", diff --git a/views/default-min.handlebars b/views/default-min.handlebars index a2c26801..dbb65a9b 100644 --- a/views/default-min.handlebars +++ b/views/default-min.handlebars @@ -1 +1 @@ - {{{title}}}
{{{title}}}
{{{title2}}}

{{{logoutControl}}}

 

\ No newline at end of file + {{{title}}}
{{{title}}}
{{{title2}}}

{{{logoutControl}}}

 

\ No newline at end of file diff --git a/views/default-mobile-min.handlebars b/views/default-mobile-min.handlebars index 912630bb..4d32392f 100644 --- a/views/default-mobile-min.handlebars +++ b/views/default-mobile-min.handlebars @@ -1 +1 @@ - {{{title}}}
{{{title}}}
{{{title2}}}
\ No newline at end of file + {{{title}}}
{{{title}}}
{{{title2}}}
\ No newline at end of file diff --git a/views/default-mobile.handlebars b/views/default-mobile.handlebars index ce9e0fa5..fd6c07ec 100644 --- a/views/default-mobile.handlebars +++ b/views/default-mobile.handlebars @@ -1918,7 +1918,13 @@ str += ''; } } - x += addDeviceAttribute('Intel® AMT', str); + + var meName = 'Intel® ME'; + if (typeof node.intelamt.sku == 'number') { + if ((node.intelamt.sku & 8) != 0) { meName = 'Intel® AMT'; } + else if ((node.intelamt.sku & 16) != 0) { meName = 'Intel® SM'; } + } + x += addDeviceAttribute(meName, str); } // Attribute: Mesh Agent Tag @@ -2012,7 +2018,11 @@ QV('p10files', currentDevicePanel == 2); var menus = []; if (currentDevicePanel != 0) { menus.push({ n: 'General', f: 'setupDeviceMenu(0)' }); } - if ((currentDevicePanel != 1) && (currentNode != null) && ((meshrights & 8) || (meshrights & 256)) && ((currentNode.mtype == 1) || (currentNode.agent.caps & 1))) { menus.push({ n: 'Desktop', f: 'setupDeviceMenu(1)' }); } + if ((currentDevicePanel != 1) && + (currentNode != null) && + ((meshrights & 8) || (meshrights & 256)) && + (((meshes[currentNode.meshid].mtype == 1) && ((typeof currentNode.intelamt.sku !== 'number') || ((currentNode.intelamt.sku & 8) != 0))) || (currentNode.agent && (currentNode.agent.caps & 1))) + ) { menus.push({ n: 'Desktop', f: 'setupDeviceMenu(1)' }); } if ((currentDevicePanel != 2) && (currentNode != null) && (meshrights & 8) && ((meshrights == 0xFFFFFFFF) || ((meshrights & 1024) == 0)) && ((currentNode.mtype == 2) && (currentNode.agent.caps & 4))) { menus.push({ n: 'Files', f: 'setupDeviceMenu(2)' }); } updateFooterMenu(menus); } @@ -2245,7 +2255,17 @@ // Show the right buttons QV('disconnectbutton1', (deskState != 0)); QV('connectbutton1', (deskState == 0) && (mesh.mtype == 2) && ((meshrights & 8) || (meshrights & 256))); - QV('connectbutton1h', (deskState == 0) && ((currentNode.intelamt != null) && (meshrights & 8) && (mesh.mtype == 1 || currentNode.intelamt.state == 2) && ((currentNode.intelamt.ver != null) || (mesh.mtype == 1)))); + QV('connectbutton1h', + (deskState == 0) && + (meshrights & 8) && + ((mesh.mtype == 1) || + ((currentNode.intelamt.state == 2) && + (currentNode.intelamt.ver != null) && + (currentNode.intelamt != null) && + (typeof currentNode.intelamt.sku == 'number') && + ((currentNode.intelamt.sku & 8) != 0)) + ) + ); // Show the right settings QV('d7amtkvm', (currentNode.intelamt != null && ((currentNode.intelamt.ver != null) || (mesh.mtype == 1))) && ((deskState == 0) || (desktop.contype == 2))); diff --git a/views/default.handlebars b/views/default.handlebars index f11c396e..2965950c 100644 --- a/views/default.handlebars +++ b/views/default.handlebars @@ -4174,7 +4174,13 @@ str += ''; } } - x += addDeviceAttribute('Intel® AMT', str); + + var meName = 'Intel® ME'; + if (typeof node.intelamt.sku == 'number') { + if ((node.intelamt.sku & 8) != 0) { meName = 'Intel® AMT'; } + else if ((node.intelamt.sku & 16) != 0) { meName = 'Intel® SM'; } + } + x += addDeviceAttribute(meName, str); } if (mesh.mtype == 2) { @@ -4298,7 +4304,10 @@ // Show or hide the tabs // mesh.mtype: 1 = Intel AMT only, 2 = Mesh Agent // node.agent.caps (bitmask): 1 = Desktop, 2 = Terminal, 4 = Files, 8 = Console - QV('MainDevDesktop', ((mesh.mtype == 1) || (node.agent == null) || (node.agent.caps == null) || ((node.agent.caps & 1) != 0) || (node.intelamt && (node.intelamt.state == 2))) && ((meshrights & 8) || (meshrights & 256))); + QV('MainDevDesktop', (((mesh.mtype == 1) && ((typeof node.intelamt.sku !== 'number') || ((node.intelamt.sku & 8) != 0))) + || ((mesh.mtype == 2) && ((node.agent == null) || (node.agent.caps == null) || ((node.agent.caps & 1) != 0) || (node.intelamt && (node.intelamt.state == 2))))) + && ((meshrights & 8) || (meshrights & 256)) + ); QV('MainDevTerminal', ((mesh.mtype == 1) || (node.agent == null) || (node.agent.caps == null) || ((node.agent.caps & 2) != 0) || (node.intelamt && (node.intelamt.state == 2))) && (meshrights & 8) && terminalAccess); QV('MainDevFiles', ((mesh.mtype == 2) && ((node.agent == null) || (node.agent.caps == null) || ((node.agent.caps & 4) != 0))) && (meshrights & 8) && fileAccess); QV('MainDevAmt', (node.intelamt != null) && ((node.intelamt.state == 2) || (node.conn & 2)) && (meshrights & 8) && amtAccess); @@ -4788,7 +4797,17 @@ // Show the right buttons QV('disconnectbutton1span', (deskState != 0)); QV('connectbutton1span', (deskState == 0) && ((meshrights & 8) || (meshrights & 256)) && (mesh.mtype == 2) && (currentNode.agent.caps & 1)); - QV('connectbutton1hspan', (deskState == 0) && (meshrights & 8) && ((currentNode.intelamt != null) && (mesh.mtype == 1 || currentNode.intelamt.state == 2) && ((currentNode.intelamt.ver != null) || (mesh.mtype == 1)))); + QV('connectbutton1hspan', + (deskState == 0) && + (meshrights & 8) && + ((mesh.mtype == 1) || + ((currentNode.intelamt != null) && + (currentNode.intelamt.state == 2) && + (currentNode.intelamt.ver != null) && + (typeof currentNode.intelamt.sku == 'number') && + ((currentNode.intelamt.sku & 8) != 0)) + ) + ); // Show the right settings QV('d7amtkvm', (currentNode.intelamt != null && ((currentNode.intelamt.ver != null) || (mesh.mtype == 1))) && ((deskState == 0) || (desktop.contype == 2))); @@ -5423,7 +5442,11 @@ if (services != null) { for (var i in services) { if (services[i].status) { + // Windows s.push({ p: capitalizeFirstLetter(services[i].status.state.toLowerCase()), d: services[i].displayName, i: i }); + } else if (services[i].serviceType) { + // Linux (TODO: This the service status is not displayed, not sure start/stop/restart will work). + s.push({ p: services[i].serviceType, d: services[i].name, i: i }); } } if (deskTools.ssort == 0) { s.sort(sortProcessPid); } else if (deskTools.ssort == 1) { s.sort(sortProcessName); } diff --git a/webserver.js b/webserver.js index 941a2adc..24a28c25 100644 --- a/webserver.js +++ b/webserver.js @@ -2488,11 +2488,12 @@ module.exports.CreateWebServer = function (parent, db, args, certificates) { if (cmd.version != 1) { ws.send(JSON.stringify({ errorText: 'Unsupported version' })); ws.close(); return; } if (obj.common.validateString(cmd.realm, 16, 256) == false) { ws.send(JSON.stringify({ errorText: 'Invalid realm argument' })); ws.close(); return; } if (obj.common.validateString(cmd.uuid, 36, 36) == false) { ws.send(JSON.stringify({ errorText: 'Invalid UUID argument' })); ws.close(); return; } - if (typeof cmd.hashes != 'object') { ws.send(JSON.stringify({ errorText: 'Invalid hashes' })); ws.close(); return; } - if (typeof cmd.fqdn != 'string') { ws.send(JSON.stringify({ errorText: 'Invalid FQDN' })); ws.close(); return; } + if (typeof cmd.hashes !== 'object') { ws.send(JSON.stringify({ errorText: 'Invalid hashes' })); ws.close(); return; } + if (typeof cmd.fqdn !== 'string') { ws.send(JSON.stringify({ errorText: 'Invalid FQDN' })); ws.close(); return; } if ((obj.common.validateString(cmd.ver, 5, 16) == false) || (cmd.ver.split('.').length != 3)) { ws.send(JSON.stringify({ errorText: 'Invalid Intel AMT version' })); ws.close(); return; } if (obj.common.validateArray(cmd.modes, 1, 2) == false) { ws.send(JSON.stringify({ errorText: 'Invalid activation modes' })); ws.close(); return; } if (obj.common.validateInt(cmd.currentMode, 0, 2) == false) { ws.send(JSON.stringify({ errorText: 'Invalid current mode' })); ws.close(); return; } + if (typeof cmd.sku !== 'number') { ws.send(JSON.stringify({ errorText: 'Invalid SKU number' })); ws.close(); return; } // Get the current Intel AMT policy var mesh = obj.meshes[ws.meshid], activationMode = 4; // activationMode: 2 = CCM, 4 = ACM @@ -2518,21 +2519,21 @@ module.exports.CreateWebServer = function (parent, db, args, certificates) { } } // If no cert match or wildcard match which is not yet supported, do CCM activation. - if ((matchingHash == null) || (matchingCN == '*')) { activationMode = 2; } else { cmd.hash = matchingHash; } + if ((matchingHash == null) || (matchingCN == '*')) { ws.send(JSON.stringify({ messageText: 'No matching ACM activation certificates, activating in CCM instead...' })); activationMode = 2; } else { cmd.hash = matchingHash; } } // Check if we are going to activate in an allowed mode. cmd.modes: 1 = CCM, 2 = ACM - if ((activationMode == 4) && (cmd.modes.indexOf(2) == -1)) { activationMode = 2; } // We want to do ACM, but mode is not allowed. Change to CCM. + if ((activationMode == 4) && (cmd.modes.indexOf(2) == -1)) { ws.send(JSON.stringify({ messageText: 'ACM not allowed on this machine, activating in CCM instead...' })); activationMode = 2; } // We want to do ACM, but mode is not allowed. Change to CCM. // If we want to do CCM, but mode is not allowed. Error out. - if ((activationMode == 2) && (cmd.modes.indexOf(1) == -1)) { ws.send(JSON.stringify({ errorText: 'Unsupported activation mode' })); ws.close(); return; } + if ((activationMode == 2) && (cmd.modes.indexOf(1) == -1)) { ws.send(JSON.stringify({ errorText: 'CCM is not an allowed activation mode' })); ws.close(); return; } // Get the Intel AMT admin password, randomize if needed. var amtpassword = ((mesh.amt.password == '') ? getRandomAmtPassword() : mesh.amt.password); if (checkAmtPassword(amtpassword) == false) { ws.send(JSON.stringify({ errorText: 'Invalid Intel AMT password' })); ws.close(); return; } // Invalid Intel AMT password, this should never happen. // Save some state, if activation is succesful, we need this to add the device - ws.xxstate = { uuid: cmd.uuid, realm: cmd.realm, tag: cmd.tag, name: cmd.name, pass: amtpassword, flags: activationMode, ver: cmd.ver }; // Flags: 2 = CCM, 4 = ACM + ws.xxstate = { uuid: cmd.uuid, realm: cmd.realm, tag: cmd.tag, name: cmd.name, hostname: cmd.hostname, pass: amtpassword, flags: activationMode, ver: cmd.ver, sku: cmd.sku }; // Flags: 2 = CCM, 4 = ACM if (activationMode == 4) { // ACM: Agent is asking the server to sign an Intel AMT ACM activation request @@ -2567,7 +2568,7 @@ module.exports.CreateWebServer = function (parent, db, args, certificates) { if (obj.common.validateArray(cmd.modes, 1, 2) == false) { ws.send(JSON.stringify({ errorText: 'Invalid activation modes' })); ws.close(); return; } if (obj.common.validateInt(cmd.currentMode, 0, 2) == false) { ws.send(JSON.stringify({ errorText: 'Invalid current mode' })); ws.close(); return; } var activationMode = 0; if (cmd.currentMode == 1) { activationMode = 2; } else if (cmd.currentMode == 2) { activationMode = 4; } - ws.xxstate = { uuid: cmd.uuid, realm: cmd.realm, tag: cmd.tag, name: cmd.name, flags: activationMode, ver: cmd.ver }; // Flags: 2 = CCM, 4 = ACM + ws.xxstate = { uuid: cmd.uuid, realm: cmd.realm, tag: cmd.tag, name: cmd.name, hostname: cmd.hostname, flags: activationMode, ver: cmd.ver, sku: cmd.sku }; // Flags: 2 = CCM, 4 = ACM } else { // If this is an activation success, check that state was set already. if (ws.xxstate == null) { ws.send(JSON.stringify({ errorText: 'Invalid command' })); ws.close(); return; } @@ -2581,6 +2582,7 @@ module.exports.CreateWebServer = function (parent, db, args, certificates) { if (mesh == null) { ws.send(JSON.stringify({ errorText: 'Unknown device group' })); ws.close(); return; } // Fix the computer name if needed + if ((ws.xxstate.name == null) || (ws.xxstate.name.length == 0)) { ws.xxstate.name = ws.xxstate.hostname; } if ((ws.xxstate.name == null) || (ws.xxstate.name.length == 0)) { ws.xxstate.name = ws.xxstate.uuid; } db.getAmtUuidNode(ws.meshid, ws.xxstate.uuid, function (err, nodes) { @@ -2589,7 +2591,7 @@ module.exports.CreateWebServer = function (parent, db, args, certificates) { parent.crypto.randomBytes(48, function (err, buf) { // Create the new node var xxnodeid = 'node/' + domain.id + '/' + buf.toString('base64').replace(/\+/g, '@').replace(/\//g, '$'); - var device = { type: 'node', _id: xxnodeid, meshid: ws.meshid, name: ws.xxstate.name, rname: ws.xxstate.name, host: ws.remoteaddr, domain: domain.id, intelamt: { state: 2, flags: ws.xxstate.flags, tls: 0, uuid: ws.xxstate.uuid, realm: ws.xxstate.realm, tag: ws.xxstate.tag, ver: ws.xxstate.ver } }; + var device = { type: 'node', _id: xxnodeid, meshid: ws.meshid, name: ws.xxstate.name, rname: ws.xxstate.name, host: ws.remoteaddr, domain: domain.id, intelamt: { state: 2, flags: ws.xxstate.flags, tls: 0, uuid: ws.xxstate.uuid, realm: ws.xxstate.realm, tag: ws.xxstate.tag, ver: ws.xxstate.ver, sku: ws.xxstate.sku } }; if (ws.xxstate.pass != null) { device.intelamt.user = 'admin'; device.intelamt.pass = ws.xxstate.pass; } if (device.intelamt.flags != 0) { device.intelamt.state = 2; } else { device.intelamt.state = 0; } db.Set(device); @@ -2616,6 +2618,7 @@ module.exports.CreateWebServer = function (parent, db, args, certificates) { if (ws.xxstate.realm == null) { delete device.intelamt.tag; } else if (device.intelamt.tag != ws.xxstate.tag) { device.intelamt.tag = ws.xxstate.tag; } if (device.intelamt.ver != ws.xxstate.ver) { device.intelamt.ver = ws.xxstate.ver; } + if (device.intelamt.sku != ws.xxstate.sku) { device.intelamt.sku = ws.xxstate.sku; } db.Set(device); // Event the new node