2018-01-30 21:23:57 -05:00
/ *
Copyright 2018 Intel Corporation
Licensed under the Apache License , Version 2.0 ( the "License" ) ;
you may not use this file except in compliance with the License .
You may obtain a copy of the License at
http : //www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing , software
distributed under the License is distributed on an "AS IS" BASIS ,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND , either express or implied .
See the License for the specific language governing permissions and
limitations under the License .
* /
/ * *
* @ description MeshCmd , command line tool for Intel AMT and MeshCentral .
* @ author Ylian Saint - Hilaire
* @ version v0 . 2.0
* /
2018-03-06 20:50:44 -05:00
//console.displayFinalizerMessages = 1;
2017-10-31 19:19:58 -04:00
var fs = require ( 'fs' ) ;
var os = require ( 'os' ) ;
var net = require ( 'net' ) ;
var http = require ( 'http' ) ;
var dgram = require ( 'dgram' ) ;
var httpHeaders = require ( 'http-headers' ) ;
var tcpserver = null ;
var broadcastSockets = { } ;
var multicastSockets = { } ;
var discoveryInterval = null ;
var membershipIPv4 = '239.255.255.235' ;
var membershipIPv6 = 'FF02:0:0:0:0:0:0:FE' ;
2017-12-12 19:04:54 -05:00
var settings = null ;
2018-01-30 21:23:57 -05:00
var meshCmdVersion = '***Mesh*Cmd*Version***' ; // Dynamically replaced with MeshCentral version
2017-12-12 19:04:54 -05:00
var amtLms = null , amtMei = null , amtMeiState = null ;
2018-02-07 21:45:14 -05:00
var wsstack = null , amtstack = null ;
var oswsstack = null , osamtstack = null ;
2018-03-06 20:50:44 -05:00
var amtMeiTmpState = null ;
2018-02-07 21:45:14 -05:00
2017-12-12 19:04:54 -05:00
// MeshCommander for Firmware (GZIP'ed, Base64)
var Small _IntelAmtWebApp = " H4sIAAAAAAAEAHq / e7 + Noou / c0hkgCuA0 + psjxSHwX + F7ZVbYCZTYMn13vt9FViAnxibM562PPnvJ4 + ZBMLkWupYVnn1SpbtVaYWl2 / tX681B4FphbysTBwGwROSI7DLtzUaIEXT + Pjnhm / TP / xfP / Q / VnUDhmcCvVxJg9KkD7 / 8 NEVW4kNncis3uDdvbIwkr0C3aNKNKfzVw6HTj52y / 8 uhwd5eQo1poXQNxmdoMDdcyaFXgU2lJKZSUUjB5ZWnUaQPOak89Aw5SnkNJb5pZOlVGov0IQMD8Y0wyaDFxfw1 / + 2 j73 / aBV9 / XqqUPB2JuMwUO3QDNpIa9v5wrbaoC6F2ccUZQ5kUiuAXUHNxiEFzEK + 9 CsUWDc / htdeCbP0WNS + cYsvfYbxuTJIroXScCcivkoz + lFptJIt3FTdIMXXJpW9UEwenhcDC3K40AbJLf4fZFTekuskrPwch1MbEUkm82dpQeIIgMD9tXNminJHX6t05aTsVTgTXgncOGoFqgDEuyzggMWQoOsbbRsCB0lWUrkt9xyVTO9sjg / z94V5yxuGOM1O5QjjfcWUL0k1cVESQsCQld9bHiNcQb3nLDbLOrn2GudJgG82l42weBfPCqtoe + zd6DkovA5jNoii5rsLutvJh2BjXCDvXUpkSbNgLo2pfNPthK4TB7TpTxqg6XpDkuooGEdb / JcBiHGAx8U8VbLq / sZhPLcYdGlmAho0BkqSaSk70bXRLYBvFpUE9PBtEKSTX79npRHqNavmxEAXfI0vcWekPyel09Od2sWz2I0cLWKwXwVAkuETQfqmBcZTmeTi7YFi + 9 npVL3jy + tE8moez3LPN94JwNFqVGts2g3NgXNDzeKI7cIpijbOAXHI5IntOBSepUGU3VM + yDLILtxHeu + MZO8o8o2NpKj + vuGDPFWMvRga4QiyQDIqNEDkKcTaTdbO / ScGV + YZq2rkzEMlZDVz + D2fhxWLq7nT2LSOOOdq3s1X4IHgpY3JKISVs76vD2tVhGM + NEReQhJqhvu1Xr1WCM + 9 UlWm4Ue2W0TJaFH / XSvO + k5zmsZNgARcQuE5y4MPuNONCQhDQr / 2 / ujlelum / P9fHm8NvG8gxlmqnoUnGR8kFikYdNovG5zkYuZzY67ujjERBN7m + SBp2Pa095eENr8TLIbHDtCfU4rAWUXdGOPvPbmb3XQiPVrNVtMymSbWNpokyvPOHt8zEzylFw2vUPbwBrkeQ5YDh1O60QZb1gMblkUXifnRNzO + f4pMXQkjBnYuoG0PcgZbdPW4e5YH9Ii37bgq7PmU70E9M2OtnkIbGBsFe9 / 2 n4d7xbRVvtHg + fGuVvPiL16JYdBQG / sue1uu2PhEkJYVAjXdLKQ + 3 Gk1 / ft13zy8ycxrXH7uW2811m + QxBRBgcQcs3FfXGTl0c9XfnN2ptj + fY6Hyyt7cbvtIFWNd3Z2bXucyedbguA5S1mXhtpiEo8ul0 + koY4TgMzeYggVfzme + 6 Aty1ZTnrOn1bb4LjzsKKqUcL9C6Ss1KYR4z8P2I2L225bjLLBkNKUx1UjlIzX2JKF6ZjLRxZNO21aoIFnyeEtHiAzdwPFAudvjoXM0coz1BTqcTA4cw2pcmc1weLW / aBAnB5kg09yB0Hg99PW7D3PVdIMe3j55893j / QT3OKAGHrLksOGk / O8n53YP8Lw + aqjSf1egAclMm1WLTJOVOsGA5kOzW3eieLyNgwUl2bTM / 7 u5Nq7 / ahTkR1zkcveS4TIkJFdjt21 / WDh7U2rlpgEUDI9yeJvI / udP53frgL + sXMrQOgVVsuFm3SX2HFqae + 2 h4gzrVpI8g9cXSH8Zb3WtivHEH0rOeoZJOryZQGkl0FUQkMNzkVRRGnrC04cqAYzXU44KV1Ftn7gQa0RdZsDJWvWOGszUcQxrgX / lxCgv0iXnnUE8c5 / ZVtGyD3cDYpmYn8N + 0 + Td30jZky1duEbYI / mJsriRnwpZ3vzqSUCzXMNvLANJpOjo6TRpMTUgYg5MO410Z4jlVSZgOYhA2lL5xyhMT4HAQpkxOljhHf7KYuEXn6It6LxVfQSQ / pLtt9Mw2qu82i5Gd34CrtgUEiW3aubSvWvxhmfg6oJr8KhM3gdVOj16BbUOwENAp + 6 W8xgrjkIc4Ki2zQO6yMgvilS6ziqOsOJgfgAC3yKlK60fVIyJxEkdIKjlTb7p9qGMLG3D0RpW8Rzzk4uOKsJUo79c4FuSO3qjBI5lEJnEaC8rBtHWF2x1RKwfhEwqDqYP8CDM2VSm5IIQXEdEdhUwM1dsyFHsnYAAuQE8ybItyPtm0kMpXpi31KehvNGGIi7Zg2SkPZHAL5GZCeBBEiamgM8m6kd6zex + eOTVlYZ + SQNAVmPafmlRfs9ml0ZpyJj / xidwsbYq6ntNJnd4mzwH9sA2OgeRgdplggO31ekdvYDTHc1hs3bzVhbY0BgM40sKpHFlsKRUKhomHxH2ZclES + 1 HoP07vcdvtzI7wbL5lnKzRnGOesqM3 + AVtUIU3kIh3ZJ1wgs4IexQLzWJ6FYiexPsW00AkLQRdxKoBFCZxFntUgT2S2OdPQsfoMnmwGLpVHPUaeULxA8miTCowJhLhmvAPCX1Ec8K52B1bL5X6VMy + Z4SiY98XdsUB0WwRU1JAo4HpbbUdfKnVjTW3Xb1lJiY5y3ZzBedkif1JYPzisFDFCwTLlvJVmeKkmGR8zuwojIVvVU24RSpIxXAyUzJtCT1v0Nyn4Ya3jGa + E97ErMkQzDguEUmsI + MVC8TZF / GCbd4eLWZ3aRwLQM3l6M1CHSZNNYcGajqcWQfLVq7r / NFKrF6j5bdt926WLyeBi10RD4saMupt0bbrHKAljhgBr72Y / QRaqVP4oEjuRcH3q5ChXfj8kqFlSNfyuLJVkkYBWhCUbgLMSXBwhDVtezUZ0aD / S0n7y / hD7yENv + z05isSRb1kQ + LzZwEa46j9JXSK2Tdv3jAi6IR821VutAfEIojkb3DwFAoG2x5mm + d / yXGxeRfX9 + eX3flxV5Q44 + EXEY4fUvxAxAyJu0v6JWgjnW0ighlB / or4j2hFqPAC6QyOZQ / UVGoUblV0063zcEnxmkhQrxZ0F7YdwUEh5Vn1Nf7OwCYZ2 + 8 + azM24BtBaOVaMUP8tEludtJbVglotqcHTBOH3IF9Sgwxr4KYHrbPAlh5uXu3mQ0rmI0qmGWcvk1oZAiZoXEF7UkV7aKrt1hMiiwOK1i4lZq3Q4LFwHOqqA1KqMkKQdnaeAKZhElzXGBUiMnAaUFzpD3P7N6zJlbIK / IOyt7oYcb / CLfw4R3BPKWEnUUP7U42I5NFsBVCwJ9palDyFP1UbU2jj0l5fSM7 / wxH6ySeXYCP + IKSh7fo + Ooe3ZEgpPqSaZNQjhKK3v9whZZKcBQyJFYP + WTwsjP92QGCNSq3gXiCSAwgKOS9mpjiDf5o9d4mHwg9ltL / YzSsTc1EClBhnHC0AVlJIOTPKy9kLCUIKwjkq1y / Z2lQlRaQ5Wgxpo78BQ1P9SvvbY28Tkb2XOnsZCoShW8HP4Oo9V9o3Z + enlbkQpnmpBrIHGzj5VRozewZXSBZeE1bdwnHnKBLsswkTAGVo + 2 uyCe / SCJM6VutnxoSd8C9SEOSoIaEzt1APt + xMjhN7T55eIgIghIHMZ8SEqN1EhAg / Ei2G6iuIKzzlMYq5dAzQfIhzk3opPAdkDJiCcekWMBwu6M1apWt / c1zdYq589Ii9u1EPg9CjqiyxkA5PsQ02MfIbR097Ul3bPeSWMt3usLxA0F8RbTpM7lhyVIOacHX2F + F8e / Rc + tWElduAvTTqvEhNeswlmYcmu / W7p / leDKVbiRI5x2d5QT1wfhJsVQ / StQIEnh6kadJHBOfG3lWfptAbtD5CL0Zjz9t7b61dlKYQzyanYXMV1xJYLl941MAbqw1kXEb6nql2B0w11eURJiHTyJF8HH8hBkQAntD0r1NRwMHqVxyOnB2ng86SKpFhX1zQ22 / HlDBI4mB85rEaVEf6yRlRGokMF + NHtVsutFz6SY3sxbpKczpr7tZ6HclG / x / YInQnFFL + oP
var Medium _IntelAmtWebApp = " H4sIAAAAAAAEAHq / e7 + Noou / c0hkgCuA0 + pekxQF4q / i5uit2lnXuZxzvn9LKZVvEDik0 / rNux802qNjz6WJTcVfRfAqXbOrt / av1 + gjw7RCWlY6DoPgiaEjkKu3NWowglr6 + OeW7tI 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
var Large _IntelAmtWebApp = " H4sIAAAAAAAEAHq / e7 + Noou / c0hkgCuA0 + psjxSHwX + F7ZVbYDosud57v68CC / ATY3PG05Yn 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
2017-10-31 19:19:58 -04:00
// Check the server certificate fingerprint
function onVerifyServer ( clientName , certs ) {
2018-01-26 20:01:38 -05:00
if ( certs == null ) { certs = clientName ; } // Temporary thing until we fix duktape
2017-10-31 19:19:58 -04:00
try { for ( var i in certs ) { if ( certs [ i ] . fingerprint . replace ( /:/g , '' ) == settings . serverHttpsHash ) { return ; } } } catch ( e ) { }
2017-11-09 20:18:30 -05:00
if ( serverhash != null ) { console . log ( 'Error: Failed to verify server certificate.' ) ; throw 'Invalid server certificate' ; }
2017-10-31 19:19:58 -04:00
}
2018-03-06 20:50:44 -05:00
// Various utility functions
2017-10-31 19:19:58 -04:00
function debug ( level , message ) { if ( ( settings . debugLevel != null ) && ( settings . debugLevel >= level ) ) { console . log ( message ) ; } }
2017-12-12 19:04:54 -05:00
function exit ( status ) { if ( status == null ) { status = 0 ; } try { process . exit ( status ) ; } catch ( e ) { } }
2018-03-06 20:50:44 -05:00
function getInstance ( x , y ) { for ( var i in x ) { if ( x [ i ] [ "InstanceID" ] == y ) return x [ i ] ; } return null ; }
function md5hex ( str ) { return require ( 'MD5Stream' ) . create ( ) . syncHash ( str ) . toString ( 'hex' ) ; }
function guidToStr ( g ) { return g . substring ( 6 , 8 ) + g . substring ( 4 , 6 ) + g . substring ( 2 , 4 ) + g . substring ( 0 , 2 ) + "-" + g . substring ( 10 , 12 ) + g . substring ( 8 , 10 ) + "-" + g . substring ( 14 , 16 ) + g . substring ( 12 , 14 ) + "-" + g . substring ( 16 , 20 ) + "-" + g . substring ( 20 ) ; }
function parceArguments ( argv ) { var r = { } ; for ( var i in argv ) { i = parseInt ( i ) ; if ( argv [ i ] . startsWith ( '--' ) == true ) { var key = argv [ i ] . substring ( 2 ) . toLowerCase ( ) , val = true ; if ( ( ( i + 1 ) < argv . length ) && ( argv [ i + 1 ] . startsWith ( '--' ) == false ) ) { val = argv [ i + 1 ] ; } r [ key ] = val ; } } return r ; }
2017-11-02 21:44:27 -04:00
2018-01-30 21:23:57 -05:00
// Parse the incoming arguments
2017-10-31 19:19:58 -04:00
function run ( argv ) {
2017-12-12 19:04:54 -05:00
if ( meshCmdVersion [ 0 ] == '*' ) { meshCmdVersion = '' ; } else { meshCmdVersion = ' v' + meshCmdVersion ; }
2017-11-02 21:44:27 -04:00
var args = parceArguments ( argv ) ;
2018-03-06 20:50:44 -05:00
//console.log('MeshCentral Command' + meshCmdVersion);
2017-12-12 19:04:54 -05:00
//console.log('addedModules = ' + JSON.stringify(addedModules));
2017-10-31 19:19:58 -04:00
var actionpath = 'meshaction.txt' ;
2017-11-02 21:44:27 -04:00
if ( args . actionfile != null ) { actionpath = args . actionfile ; }
2018-03-06 20:50:44 -05:00
var actions = [ 'ROUTE' , 'AMTLMS' , 'AMTLOADWEBAPP' , 'AMTLOADSMALLWEBAPP' , 'AMTLOADLARGEWEBAPP' , 'AMTCLEARWEBAPP' , 'AMTSTORAGESTATE' , 'MEINFO' , 'MEVERSIONS' , 'MEHASHES' , 'AMTSAVESTATE' , 'MESCRIPT' , 'AMTUUID' , 'AMTCCM' , 'AMTDEACTIVATE' ] ;
2017-12-12 19:04:54 -05:00
2017-10-31 19:19:58 -04:00
// Load the action file
var actionfile = null ;
try { actionfile = fs . readFileSync ( actionpath ) ; } catch ( e ) { }
2017-12-12 19:04:54 -05:00
if ( ( actionpath != 'meshaction.txt' ) && ( actionfile == null ) ) { console . log ( 'Unable to load \"' + actionpath + '\". Create this file or specify the location using --actionfile [filename].' ) ; exit ( 1 ) ; return ; }
if ( actionfile != null ) { try { settings = JSON . parse ( actionfile ) ; } catch ( e ) { console . log ( actionpath , e ) ; exit ( 1 ) ; return ; } } else { if ( argv . length >= 2 ) { settings = { action : argv [ 1 ] } } }
2017-12-15 16:43:04 -05:00
if ( settings == null ) { settings = { } ; }
2017-10-31 19:19:58 -04:00
2017-11-02 21:44:27 -04:00
// Set the arguments
2017-12-15 16:43:04 -05:00
if ( ( typeof args . action ) == 'string' ) { settings . action = args . action ; }
2017-11-02 21:44:27 -04:00
if ( ( typeof args . localport ) == 'string' ) { settings . localport = parseInt ( args . localport ) ; }
if ( ( typeof args . remotenodeid ) == 'string' ) { settings . remoteNodeId = args . remotenodeid ; }
if ( ( typeof args . username ) == 'string' ) { settings . username = args . username ; }
if ( ( typeof args . password ) == 'string' ) { settings . password = args . password ; }
if ( ( typeof args . user ) == 'string' ) { settings . username = args . user ; }
if ( ( typeof args . pass ) == 'string' ) { settings . password = args . pass ; }
2017-12-12 19:04:54 -05:00
if ( ( typeof args . host ) == 'string' ) { settings . hostname = args . host ; }
if ( ( typeof args . hostname ) == 'string' ) { settings . hostname = args . hostname ; }
2017-11-02 21:44:27 -04:00
if ( ( typeof args . serverid ) == 'string' ) { settings . serverId = args . serverid ; }
if ( ( typeof args . serverhttpshash ) == 'string' ) { settings . serverHttpsHash = args . serverhttpshash ; }
if ( ( typeof args . remoteport ) == 'string' ) { settings . remotePort = parseInt ( args . remoteport ) ; }
2018-01-25 19:12:53 -05:00
if ( ( typeof args . out ) == 'string' ) { settings . output = args . out ; }
if ( ( typeof args . output ) == 'string' ) { settings . output = args . output ; }
2017-12-12 19:04:54 -05:00
if ( ( typeof args . debug ) == 'string' ) { settings . debugLevel = parseInt ( args . debug ) ; }
2018-02-02 15:46:09 -05:00
if ( ( typeof args . script ) == 'string' ) { settings . script = args . script ; }
2018-01-25 19:28:52 -05:00
if ( args . noconsole ) { settings . noconsole = true ; }
if ( args . nocommander ) { settings . noconsole = true ; }
2018-01-25 19:12:53 -05:00
if ( args . lmsdebug ) { settings . lmsdebug = true ; }
if ( args . tls ) { settings . tls = true ; }
2017-12-15 16:43:04 -05:00
if ( ( argv . length > 1 ) && ( actions . indexOf ( argv [ 1 ] . toUpperCase ( ) ) >= 0 ) ) { settings . action = argv [ 1 ] ; }
2017-11-02 21:44:27 -04:00
2017-10-31 19:19:58 -04:00
// Validate meshaction.txt
2018-03-06 20:50:44 -05:00
if ( settings . action == null ) { console . log ( 'No action specified, valid actions are: ' + actions . join ( ', ' ) + '.' ) ; exit ( 1 ) ; return ; }
2017-10-31 19:19:58 -04:00
settings . action = settings . action . toLowerCase ( ) ;
2017-12-12 19:04:54 -05:00
debug ( 1 , "Settings: " + JSON . stringify ( settings ) ) ;
2018-01-30 21:23:57 -05:00
if ( settings . action == 'route' ) {
// MeshCentral Router, port map local TCP port to a remote computer
2017-12-12 19:04:54 -05:00
if ( ( settings . localPort == null ) || ( typeof settings . localPort != 'number' ) || ( settings . localPort < 0 ) || ( settings . localPort > 65535 ) ) { console . log ( 'No or invalid \"localPort\" specified, use --localport [localport].' ) ; exit ( 1 ) ; return ; }
if ( ( settings . remoteNodeId == null ) || ( typeof settings . remoteNodeId != 'string' ) ) { console . log ( 'No or invalid \"remoteNodeId\" specified.' ) ; exit ( 1 ) ; return ; }
if ( ( settings . username == null ) || ( typeof settings . username != 'string' ) || ( settings . username == '' ) ) { console . log ( 'No or invalid \"username\" specified, use --username [username].' ) ; exit ( 1 ) ; return ; }
if ( ( settings . password == null ) || ( typeof settings . password != 'string' ) || ( settings . password == '' ) ) { console . log ( 'No or invalid \"password\" specified, use --password [password].' ) ; exit ( 1 ) ; return ; }
if ( ( settings . serverId == null ) || ( typeof settings . serverId != 'string' ) || ( settings . serverId . length != 96 ) ) { console . log ( 'No or invalid \"serverId\" specified.' ) ; exit ( 1 ) ; return ; }
if ( ( settings . serverHttpsHash == null ) || ( typeof settings . serverHttpsHash != 'string' ) || ( settings . serverHttpsHash . length != 96 ) ) { console . log ( 'No or invalid \"serverHttpsHash\" specified.' ) ; exit ( 1 ) ; return ; }
if ( ( settings . remotePort == null ) || ( typeof settings . remotePort != 'number' ) || ( settings . remotePort < 0 ) || ( settings . remotePort > 65535 ) ) { console . log ( 'No or invalid \"remotePort\" specified, use --remoteport [remoteport].' ) ; exit ( 1 ) ; return ; }
if ( settings . serverUrl != null ) { startRouter ( ) ; } else { discoverMeshServer ( ) ; } // Start MeshCentral Router
}
2017-12-15 16:43:04 -05:00
else if ( ( settings . action == 'amtloadwebapp' ) || ( settings . action == 'amtloadsmallwebapp' ) || ( settings . action == 'amtloadlargewebapp' ) || ( settings . action == 'amtclearwebapp' ) || ( settings . action == 'amtstoragestate' ) ) { // Intel AMT Web Application Actions
2018-01-30 21:23:57 -05:00
// Intel AMT 11.6+ Load MeshCommander into firmware
2017-12-12 19:04:54 -05:00
if ( ( settings . password == null ) || ( typeof settings . password != 'string' ) || ( settings . password == '' ) ) { console . log ( 'No or invalid \"password\" specified, use --password [password].' ) ; exit ( 1 ) ; return ; }
if ( ( settings . hostname == null ) || ( typeof settings . hostname != 'string' ) || ( settings . hostname == '' ) ) { settings . hostname = '127.0.0.1' ; }
if ( ( settings . username == null ) || ( typeof settings . username != 'string' ) || ( settings . username == '' ) ) { settings . username = 'admin' ; }
settings . protocol = 'http:' ;
settings . localport = 16992 ;
debug ( 1 , "Settings: " + JSON . stringify ( settings ) ) ;
digest = require ( 'http-digest' ) . create ( settings . username , settings . password ) ;
digest . http = require ( 'http' ) ;
2017-12-15 16:43:04 -05:00
if ( settings . action == 'amtstoragestate' ) {
2017-12-12 19:04:54 -05:00
getAmtStorage ( function ( statusCode , data ) { if ( statusCode == 200 ) { console . log ( "Storage State: " + JSON . stringify ( data , null , 2 ) ) ; exit ( ) ; return ; } else { console . log ( "Unable to read storage state." ) ; exit ( ) ; return ; } } ) ;
} else {
2017-12-15 16:43:04 -05:00
if ( settings . action == 'amtloadwebapp' ) { settings . webapp = Medium _IntelAmtWebApp ; }
else if ( settings . action == 'amtloadsmallwebapp' ) { settings . webapp = Small _IntelAmtWebApp ; }
else if ( settings . action == 'amtloadlargewebapp' ) { settings . webapp = Large _IntelAmtWebApp ; }
else if ( settings . action == 'amtclearwebapp' ) { settings . webapp = null ; }
2017-12-12 19:04:54 -05:00
nextStepStorageUpload ( ) ;
}
} else if ( ( settings . action == 'meversion' ) || ( settings . action == 'meversions' ) || ( settings . action == 'mever' ) ) {
2018-01-30 21:23:57 -05:00
// Display Intel AMT versions
var amtMeiModule = require ( 'amt-mei' ) ;
2017-12-12 19:04:54 -05:00
var amtMei = new amtMeiModule ( ) ;
2018-01-25 19:28:52 -05:00
amtMei . on ( 'error' , function ( e ) { console . log ( 'ERROR: ' + e ) ; exit ( 1 ) ; return ; } ) ;
2017-12-12 19:04:54 -05:00
amtMei . on ( 'connect' , function ( ) {
this . 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 ) ; }
exit ( 1 ) ; return ;
} ) ;
} ) ;
} else if ( settings . action == 'mehashes' ) {
2018-01-30 21:23:57 -05:00
// Display Intel AMT list of trusted hashes
var amtMeiModule = require ( 'amt-mei' ) ;
2017-12-12 19:04:54 -05:00
var amtMei = new amtMeiModule ( ) ;
2018-01-25 19:28:52 -05:00
amtMei . on ( 'error' , function ( e ) { console . log ( 'ERROR: ' + e ) ; exit ( 1 ) ; return ; } ) ;
2017-12-12 19:04:54 -05:00
amtMei . on ( 'connect' , function ( ) {
this . getHashHandles ( function ( handles ) {
exitOnCount = handles . length ;
for ( var i = 0 ; i < handles . length ; ++ i ) {
this . getCertHashEntry ( handles [ i ] , function ( result ) {
2018-01-25 19:28:52 -05:00
console . log ( result . name + ', (' + ( result . isDefault ? 'Default' : '' ) + ( result . isActive ? ', Active' : ', Disabled' ) + ')\r\n ' + result . hashAlgorithmStr + ': ' + result . certificateHash ) ;
if ( -- exitOnCount == 0 ) { exit ( 1 ) ; }
2017-12-12 19:04:54 -05:00
} ) ;
}
} ) ;
} ) ;
} else if ( settings . action == 'meinfo' ) {
2018-01-30 21:23:57 -05:00
// Display Intel AMT version and activation state
var amtMeiModule = require ( 'amt-mei' ) ;
2017-12-12 19:04:54 -05:00
var amtMei = new amtMeiModule ( ) ;
2018-01-25 19:28:52 -05:00
amtMei . on ( 'error' , function ( e ) { console . log ( 'ERROR: ' + e ) ; exit ( 1 ) ; return ; } ) ;
2017-12-12 19:04:54 -05:00
amtMei . on ( 'connect' , function ( ) {
mestate = { } ;
this . getVersion ( function ( val ) { for ( var version in val . Versions ) { if ( val . Versions [ version ] . Description == 'AMT' ) { mestate . ver = val . Versions [ version ] . Version ; } } } ) ;
this . getProvisioningState ( function ( result ) { mestate . ProvisioningState = result ; } ) ;
this . getProvisioningMode ( function ( result ) { mestate . ProvisioningMode = result ; } ) ;
this . getEHBCState ( function ( result ) { mestate . ehbc = result ; } ) ;
this . getControlMode ( function ( result ) { mestate . controlmode = result ; } ) ;
this . getMACAddresses ( function ( result ) { mestate . mac = result ; } ) ;
this . getDnsSuffix ( function ( result ) {
mestate . dns = result ;
var str = 'Intel AMT v' + mestate . ver ;
2017-12-15 16:43:04 -05:00
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' ) { if ( mestate . ProvisioningMode . modeStr == 'ENTERPRISE' ) { str += ', activated in ' + [ "none" , "client control mode" , "admin control mode" , "remote assistance mode" ] [ mestate . controlmode . controlMode ] ; } else { str += ', activated in ' + mestate . ProvisioningMode . modeStr ; } }
if ( mestate . ehbc . EHBC == true ) { str += ', EHBC enabled' ; }
2017-12-12 19:04:54 -05:00
console . log ( str + '.' ) ;
exit ( 1 ) ;
} ) ;
} ) ;
2018-01-02 19:52:49 -05:00
} else if ( settings . action == 'amtsavestate' ) {
2018-01-30 21:23:57 -05:00
// Save the entire state of Intel AMT info a JSON file
2018-01-25 19:12:53 -05:00
if ( ( settings . password == null ) || ( typeof settings . password != 'string' ) || ( settings . password == '' ) ) { console . log ( 'No or invalid \"password\" specified, use --password [password].' ) ; exit ( 1 ) ; return ; }
if ( ( settings . hostname == null ) || ( typeof settings . hostname != 'string' ) || ( settings . hostname == '' ) ) { settings . hostname = '127.0.0.1' ; }
if ( ( settings . username == null ) || ( typeof settings . username != 'string' ) || ( settings . username == '' ) ) { settings . username = 'admin' ; }
if ( ( settings . output == null ) || ( typeof settings . output != 'string' ) || ( settings . output == '' ) ) { console . log ( 'No or invalid \"output\" file specified, use --output [filename].' ) ; exit ( 1 ) ; return ; }
settings . protocol = 'http:' ;
settings . localport = 16992 ;
debug ( 1 , "Settings: " + JSON . stringify ( settings ) ) ;
2018-01-02 19:52:49 -05:00
saveEntireAmtState ( ) ;
2017-12-15 16:43:04 -05:00
} else if ( settings . action == 'amtlms' ) {
2018-01-30 21:23:57 -05:00
// Start Intel AMT MicroLMS
startLms ( function ( state ) { console . log ( [ 'MicroLMS did not start. MicroLMS must run as administrator or LMS any already be active.' , 'MicroLMS started.' , 'MicroLMS started, MeshCommander on HTTP/16994.' , 'MEI error' ] [ state ] ) ; if ( state == 0 ) { exit ( 0 ) ; } } ) ;
2018-02-02 15:46:09 -05:00
} else if ( settings . action == 'mescript' ) {
// Start running a MEScript
if ( ( settings . password == null ) || ( typeof settings . password != 'string' ) || ( settings . password == '' ) ) { console . log ( 'No or invalid \"password\" specified, use --password [password].' ) ; exit ( 1 ) ; return ; }
if ( ( settings . hostname == null ) || ( typeof settings . hostname != 'string' ) || ( settings . hostname == '' ) ) { settings . hostname = '127.0.0.1' ; }
if ( ( settings . username == null ) || ( typeof settings . username != 'string' ) || ( settings . username == '' ) ) { settings . username = 'admin' ; }
2018-03-06 20:50:44 -05:00
if ( ( settings . script == null ) || ( typeof settings . script != 'string' ) || ( settings . script == '' ) ) { if ( mescriptJSON != '' ) { settings . scriptJSON = mescriptJSON ; } else { console . log ( 'No or invalid \"script\" file specified, use --script [filename].' ) ; exit ( 1 ) ; return ; } }
2018-02-02 15:46:09 -05:00
startMeScript ( ) ;
2018-03-06 20:50:44 -05:00
} else if ( settings . action == 'amtuuid' ) {
// Start running
if ( ( settings . password == null ) || ( typeof settings . password != 'string' ) || ( settings . password == '' ) ) { console . log ( 'No or invalid \"password\" specified, use --password [password].' ) ; exit ( 1 ) ; return ; }
if ( ( settings . hostname == null ) || ( typeof settings . hostname != 'string' ) || ( settings . hostname == '' ) ) { settings . hostname = '127.0.0.1' ; }
if ( ( settings . username == null ) || ( typeof settings . username != 'string' ) || ( settings . username == '' ) ) { settings . username = 'admin' ; }
settings . protocol = 'http:' ;
settings . localport = 16992 ;
debug ( 1 , "Settings: " + JSON . stringify ( settings ) ) ;
getAmtUuid ( ) ;
} else if ( settings . action == 'amtccm' ) {
// Start activation to CCM
if ( ( settings . password == null ) || ( typeof settings . password != 'string' ) || ( settings . password == '' ) ) { console . log ( 'No or invalid \"password\" specified, use --password [password].' ) ; exit ( 1 ) ; return ; }
settings . protocol = 'http:' ;
settings . localport = 16992 ;
debug ( 1 , "Settings: " + JSON . stringify ( settings ) ) ;
activeToCCM ( ) ;
} else if ( settings . action == 'amtdeactivate' ) {
// Deactivate CCM
debug ( 1 , "Settings: " + JSON . stringify ( settings ) ) ;
deactivateCCM ( ) ;
2017-10-31 19:19:58 -04:00
} else {
2017-12-12 19:04:54 -05:00
console . log ( 'Invalid \"action\" specified.' ) ; exit ( 1 ) ; return ;
2017-10-31 19:19:58 -04:00
}
2017-12-12 19:04:54 -05:00
}
2017-10-31 19:19:58 -04:00
2018-03-06 20:50:44 -05:00
//
// Deactivate Intel AMT CCM
//
// When called, this will use MEI to deactivate Intel AMT when it's in CCM mode. Simply calls "unprovision" on MEI and checks the return code.
function deactivateCCM ( ) {
var amtMeiModule = require ( 'amt-mei' ) ;
var amtMei = new amtMeiModule ( ) ;
amtMei . on ( 'error' , function ( e ) { console . log ( 'ERROR: ' + e ) ; exit ( 1 ) ; return ; } ) ;
amtMei . on ( 'connect' , function ( ) { amtMei . unprovision ( 1 , function ( status ) { if ( status == 0 ) { console . log ( 'Success' ) ; } else { console . log ( 'Error ' + status ) ; } exit ( 1 ) ; } ) ; } ) ;
}
//
// Activate Intel AMT to CCM
//
function activeToCCM ( ) {
// See if MicroLMS needs to be started and setup the $$OsAdmin wsman stack
settings . noconsole = true ;
startLms ( activeToCCMEx ) ; // TODO: Fix this so that it works even if LMS already running.
}
function activeToCCMEx ( state ) {
osamtstack . BatchEnum ( null , [ '*AMT_GeneralSettings' , '*IPS_HostBasedSetupService' ] , activeToCCMEx2 ) ;
}
function activeToCCMEx2 ( stack , name , responses , status ) {
if ( status != 200 ) { console . log ( 'Failed to fetch activation status, status ' + status ) ; exit ( 1 ) ; }
else if ( responses [ 'IPS_HostBasedSetupService' ] . response [ 'AllowedControlModes' ] . length != 2 ) { console . log ( 'Client control mode activation not allowed' ) ; exit ( 1 ) ; }
else { osamtstack . IPS _HostBasedSetupService _Setup ( 2 , md5hex ( 'admin:' + responses [ 'AMT_GeneralSettings' ] . response [ 'DigestRealm' ] + ':' + settings . password ) . substring ( 0 , 32 ) , null , null , null , null , activeToCCMEx3 ) ; }
}
function activeToCCMEx3 ( stack , name , responses , status ) {
if ( status != 200 ) { console . log ( 'Failed to activate, status ' + status ) ; }
else if ( responses . Body . ReturnValue != 0 ) { console . log ( 'Client control mode activation failed: ' + responses . Body . ReturnValueStr ) ; }
else { console . log ( 'Success' ) ; exit ( 0 ) ; }
exit ( 1 ) ;
}
//
// Get AMT UUID
//
// Called to get the UUID of Intel AMT, start by setting up MicroLMS if we are doing the operation on the local computer
function getAmtUuid ( ) {
// See if MicroLMS needs to be started
if ( ( settings . hostname == '127.0.0.1' ) || ( settings . hostname . toLowerCase ( ) == 'localhost' ) ) { settings . noconsole = true ; startLms ( getAmtUuidEx ) ; } else { getAmtUuidEx ( ) } ;
}
// Fetch the computer's UUID by fetching the CIM_ComputerSystemPackage WSMAN object.
function getAmtUuidEx ( ) {
var transport = require ( 'amt-wsman-duk' ) ;
var wsman = require ( 'amt-wsman' ) ;
var amt = require ( 'amt' ) ;
wsstack = new wsman ( transport , settings . hostname , settings . tls ? 16993 : 16992 , settings . username , settings . password , settings . tls ) ;
amtstack = new amt ( wsstack ) ;
amtstack . Get ( "CIM_ComputerSystemPackage" , function ( obj , name , response , xstatus , tag ) {
if ( xstatus == 200 ) { console . log ( "GUID: " + guidToStr ( response . Body . PlatformGUID . toLowerCase ( ) ) ) ; } else { console . log ( "Intel AMT is not available or not activated." ) ; } exit ( 1 ) ;
} ) ;
}
2018-02-02 15:46:09 -05:00
//
// Run MESCRIPT
//
2018-03-06 20:50:44 -05:00
// Run a .mescript targeting local or remote Intel AMT.
2018-02-02 15:46:09 -05:00
function startMeScript ( ) {
// See if MicroLMS needs to be started
if ( ( settings . hostname == '127.0.0.1' ) || ( settings . hostname . toLowerCase ( ) == 'localhost' ) ) { settings . noconsole = true ; startLms ( startMeScriptEx ) ; return ; } else { startMeScriptEx ( ) ; }
}
function startMeScriptEx ( ) {
2018-03-06 20:50:44 -05:00
//console.log('Running script...');
2018-02-02 15:46:09 -05:00
var transport = require ( 'amt-wsman-duk' ) ;
var wsman = require ( 'amt-wsman' ) ;
var amt = require ( 'amt' ) ;
wsstack = new wsman ( transport , settings . hostname , settings . tls ? 16993 : 16992 , settings . username , settings . password , settings . tls ) ;
amtstack = new amt ( wsstack ) ;
2018-02-07 21:45:14 -05:00
//IntelAmtEntireStateProgress = 101;
//amtstack.onProcessChanged = onWsmanProcessChanged;
2018-02-02 15:46:09 -05:00
var scriptData = null ;
2018-03-06 20:50:44 -05:00
if ( settings . script != null ) {
try { scriptData = fs . readFileSync ( settings . script ) ; } catch ( e ) { console . log ( 'Unable to read script file (1): ' + settings . script + '.' ) ; exit ( 1 ) ; return ; }
} else {
scriptData = settings . scriptJSON ;
}
2018-02-02 15:46:09 -05:00
if ( scriptData == null ) { console . log ( 'Unable to read script file (2): ' + settings . script + '.' ) ; exit ( 1 ) ; return ; }
try { scriptData = JSON . parse ( scriptData ) ; } catch ( e ) { console . log ( 'Unable to read script file (3): ' + settings . script + '.' ) ; exit ( 1 ) ; return ; }
if ( scriptData . mescript == null ) { console . log ( 'Unable to read script file (4): ' + settings . script + '.' ) ; exit ( 1 ) ; return ; }
var scriptData = Buffer . from ( scriptData . mescript , 'base64' ) ;
var scriptModule = require ( 'amt-script' ) ;
var script = scriptModule . setup ( scriptData , { } )
script . amtstack = amtstack ;
script . start ( ) ;
2018-03-06 20:50:44 -05:00
script . onCompleted = function ( ) { exit ( 1 ) ; }
2018-02-02 15:46:09 -05:00
}
2018-01-30 21:23:57 -05:00
2018-03-06 20:50:44 -05:00
2018-01-30 21:23:57 -05:00
//
// FETCH ALL INTEL AMT STATE
//
2018-01-02 19:52:49 -05:00
// Save the entire Intel AMT state
function saveEntireAmtState ( ) {
2018-01-25 19:28:52 -05:00
// See if MicroLMS needs to be started
if ( ( settings . hostname == '127.0.0.1' ) || ( settings . hostname . toLowerCase ( ) == 'localhost' ) ) { settings . noconsole = true ; startLms ( ) ; }
2018-01-25 19:12:53 -05:00
console . log ( 'Fetching all Intel AMT state, this may take a few minutes...' ) ;
2018-01-30 21:23:57 -05:00
var transport = require ( 'amt-wsman-duk' ) ;
var wsman = require ( 'amt-wsman' ) ;
var amt = require ( 'amt' ) ;
2018-01-25 19:12:53 -05:00
wsstack = new wsman ( transport , settings . hostname , settings . tls ? 16993 : 16992 , settings . username , settings . password , settings . tls ) ;
2018-01-02 19:52:49 -05:00
amtstack = new amt ( wsstack ) ;
2018-01-25 19:28:52 -05:00
amtstack . onProcessChanged = onWsmanProcessChanged ;
//var AllWsman = "AMT_GeneralSystemDefenseCapabilities".split(',');
2018-01-02 19:52:49 -05:00
var AllWsman = " AMT _8021xCredentialContext , AMT _8021XProfile , AMT _ActiveFilterStatistics , AMT _AgentPresenceCapabilities , AMT _AgentPresenceInterfacePolicy , AMT _AgentPresenceService , AMT _AgentPresenceWatchdog , AMT _AgentPresenceWatchdogAction , AMT _AlarmClockService , IPS _AlarmClockOccurrence , AMT _AssetTable , AMT _AssetTableService , AMT _AuditLog , AMT _AuditPolicyRule , AMT _AuthorizationService , AMT _BootCapabilities , AMT _BootSettingData , AMT _ComplexFilterEntryBase , AMT _CRL , AMT _CryptographicCapabilities , AMT _EACCredentialContext , AMT _EndpointAccessControlService , AMT _EnvironmentDetectionInterfacePolicy , AMT _EnvironmentDetectionSettingData , AMT _EthernetPortSettings , AMT _EventLogEntry , AMT _EventManagerService , AMT _EventSubscriber , AMT _FilterEntryBase , AMT _FilterInSystemDefensePolicy , AMT _GeneralSettings , AMT _GeneralSystemDefenseCapabilities , AMT _Hdr8021Filter , AMT _HeuristicPacketFilterInterfacePolicy , AMT _HeuristicPacketFilterSettings , AMT _HeuristicPacketFilterStatistics , AMT _InterfacePolicy , AMT _IPHeadersFilter , AMT _KerberosSettingData , AMT _ManagementPresenceRemoteSAP , AMT _MessageLog , AMT _MPSUsernamePassword , AMT _NetworkFilter , AMT _NetworkPortDefaultSystemDefensePolicy , AMT _NetworkPortSystemDefenseCapabilities , AMT _NetworkPortSystemDefensePolicy , AMT _PCIDevice , AMT _PETCapabilities , AMT _PETFilterForTarget , AMT _PETFilterSetting , AMT _ProvisioningCertificateHash , AMT _PublicKeyCertificate , AMT _PublicKeyManagementCapabilities , AMT _PublicKeyManagementService , AMT _PublicPrivateKeyPair , AMT _RedirectionService , AMT _RemoteAccessCapabilities , AMT _RemoteAccessCredentialContext , AMT _RemoteAccessPolicyAppliesToMPS , AMT _RemoteAccessPolicyRule , AMT _RemoteAccessService , AMT _SetupAndConfigurationService , AMT _SNMPEventSubscriber , AMT _StateTransitionCondition , AMT _SystemDefensePolicy , AMT _SystemDefensePolicyInService , AMT _SystemDefenseService , AMT _SystemPowerScheme , AMT _ThirdPartyDataStorageAdministrationService , AMT _ThirdPartyDataStorageService , AMT _TimeSynchronizationService , AMT _TLSCredentialContext , AMT _TLSProtocolEndpoint , AMT _TLSProtocolEndpointCollection , AMT _TLSSettingData , AMT _TrapTargetForService , AMT _UserInitiatedConnectionService , AMT _WebUIService , AMT _WiFiPortConfigurationService , CIM _AbstractIndicationSubscription , CIM _Account , CIM _AccountManagementCapabilities , CIM _AccountManagementService , CIM _AccountOnSystem , CIM _AdminDomain , CIM _AlertIndication , CIM _AssignedIdentity , CIM _AssociatedPowerManagementService , CIM _AuthenticationService , CIM _AuthorizationService , CIM _BIOSElement , CIM _BIOSFeature , CIM _BIOSFeatureBIOSElements , CIM _BootConfigSetting , CIM _BootService , CIM _BootSettingData , CIM _BootSourceSetting , CIM _Capabilities , CIM _Card , CIM _Chassis , CIM _Chip , CIM _Collection , CIM _Component , CIM _ComputerSystem , CIM _ComputerSystemPackage , CIM _ConcreteComponent , CIM _ConcreteDependency , CIM _Controller , CIM _CoolingDevice , CIM _Credential , CIM _CredentialContext , CIM _CredentialManagementService , CIM _Dependency , CIM _DeviceSAPImplementation , CIM _ElementCapabilities , CIM _ElementConformsToProfile , CIM _ElementLocation , CIM _ElementSettingData , CIM _ElementSoftwareIdentity , CIM _ElementStatisticalData , CIM _EnabledLogicalElement , CIM _EnabledLogicalElementCapabilities , CIM _EthernetPort , CIM _Fan , CIM _FilterCollection , CIM _FilterCollectionSubscription , CIM _HostedAccessPoint , CIM _HostedDependency , CIM _HostedService , CIM _Identity , CIM _IEEE8021xCapabilities , CIM _IEEE8021xSettings , CIM _Indication , CIM _IndicationService , CIM _InstalledSoftwareIdentity , CIM _KVMRedirectionSAP , CIM _LANEndpoint , CIM _ListenerDestination , CIM _ListenerDestinationWSManagement , CIM _Location , CIM _Log , CIM _LogEntry , CIM _LogicalDevice , CIM _LogicalElement , CIM _LogicalPort , CIM _LogicalPortCapabilities , CIM _LogManagesRecord , CIM _ManagedCredential , CIM _ManagedElement , CIM _ManagedSystemElement , CIM _MediaAccessDevice , CIM _MemberOfCollection , CIM _Memory , CIM _MessageLog , CIM _NetworkPort , CIM _NetworkPortCapabilities , CIM _NetworkPortConfigurationService , CIM _OrderedComponent , CIM _OwningCollectionElement , CIM _OwningJobElement , CIM _PCIController , CIM _PhysicalComponent , CIM _PhysicalElement , CIM _PhysicalElementLocation , CIM _PhysicalFrame , CIM _PhysicalMemory , CIM _PhysicalPackage , CIM _Policy , CIM _PolicyAction , CIM _PolicyCondition , CIM _PolicyInSystem , CIM _PolicyRule , CIM _PolicyR
2018-01-25 19:28:52 -05:00
IntelAmtEntireStateProgress = 101 ;
2018-01-02 19:52:49 -05:00
IntelAmtEntireStateCalls = 3 ;
IntelAmtEntireState = { 'localtime' : Date ( ) , 'utctime' : new Date ( ) . toUTCString ( ) , 'isotime' : new Date ( ) . toISOString ( ) } ;
amtstack . BatchEnum ( null , AllWsman , saveEntireAmtStateOk2 , null , true ) ;
amtstack . GetAuditLog ( saveEntireAmtStateOk3 ) ;
amtstack . GetMessageLog ( saveEntireAmtStateOk4 ) ;
}
2018-01-25 19:28:52 -05:00
function onWsmanProcessChanged ( a , b ) { var x = Math . floor ( ( a * 100 ) / b ) ; if ( x < IntelAmtEntireStateProgress ) { IntelAmtEntireStateProgress = x ; console . log ( ( 100 - x ) + '%' ) ; } }
function saveEntireAmtStateOk2 ( stack , name , responses , status ) { if ( status == 600 ) { console . log ( 'ERROR: Unable to connect to Intel(R) AMT.' ) ; exit ( 2 ) ; } IntelAmtEntireState [ 'wsmanenums' ] = responses ; saveEntireAmtStateDone ( ) ; }
function saveEntireAmtStateOk3 ( stack , messages , status ) { if ( status == 600 ) { console . log ( 'ERROR: Unable to connect to Intel(R) AMT.' ) ; exit ( 2 ) ; } IntelAmtEntireState [ 'auditlog' ] = messages ; saveEntireAmtStateDone ( ) ; }
function saveEntireAmtStateOk4 ( stack , messages , tag , status ) { if ( status == 600 ) { console . log ( 'ERROR: Unable to connect to Intel(R) AMT.' ) ; exit ( 2 ) ; } IntelAmtEntireState [ 'eventlog' ] = messages ; saveEntireAmtStateDone ( ) ; }
2018-01-02 19:52:49 -05:00
2018-01-30 21:23:57 -05:00
// Called when the entire state of Intel AMT is fetched.
2018-01-02 19:52:49 -05:00
function saveEntireAmtStateDone ( ) {
if ( -- IntelAmtEntireStateCalls != 0 ) return ;
2018-01-25 19:12:53 -05:00
var out = fs . openSync ( settings . output , 'w' ) ;
fs . writeSync ( out , new Buffer ( JSON . stringify ( IntelAmtEntireState ) , 'utf8' ) ) ;
fs . closeSync ( out ) ;
console . log ( 'Done, results written to ' + settings . output + '.' ) ;
2018-01-02 19:52:49 -05:00
exit ( 1 ) ;
}
2018-01-30 21:23:57 -05:00
//
// FETCH ALL INTEL AMT MEI STATE
//
2017-12-12 19:04:54 -05:00
// Get Intel AMT information using MEI
2018-03-06 20:50:44 -05:00
// TODO: If this call is called many time at once, it's going to cause issues.
2017-12-12 19:04:54 -05:00
function getAmtInfo ( func , tag ) {
2018-03-06 20:50:44 -05:00
//console.log('getAmtInfo1');
2017-12-12 19:04:54 -05:00
if ( amtMei == null ) { if ( func != null ) { func ( null , tag ) ; } return ; }
2018-03-06 20:50:44 -05:00
amtMeiTmpState = { Flags : 0 , TrustedHashes : [ ] } ; // Flags: 1=EHBC, 2=CCM, 4=ACM
2017-12-12 19:04:54 -05:00
amtMei . getProtocolVersion ( function ( result ) { if ( result != null ) { amtMeiTmpState . MeiVersion = result ; } } ) ;
amtMei . getVersion ( function ( val ) {
amtMeiTmpState . Versions = { } ;
if ( val != null ) {
for ( var version in val . Versions ) { amtMeiTmpState . Versions [ val . Versions [ version ] . Description ] = val . Versions [ version ] . Version ; }
amtMei . getProvisioningMode ( function ( result ) { if ( result != null ) { amtMeiTmpState . ProvisioningMode = result . mode ; } } ) ;
amtMei . getProvisioningState ( function ( result ) { if ( result != null ) { amtMeiTmpState . ProvisioningState = result . state ; } } ) ;
amtMei . getEHBCState ( function ( result ) { if ( ( result != null ) && ( result . EHBC == true ) ) { amtMeiTmpState . Flags += 1 ; } } ) ;
amtMei . getControlMode ( function ( result ) { if ( result != null ) { if ( result . controlMode == 1 ) { amtMeiTmpState . Flags += 2 ; } if ( result . controlMode == 2 ) { amtMeiTmpState . Flags += 4 ; } } } ) ;
//amtMei.getMACAddresses(function (result) { if (result != null) { amtMeiTmpState.mac = result; } });
amtMei . getDnsSuffix ( function ( result ) { if ( result != null ) { amtMeiTmpState . dns = result ; } } ) ;
amtMei . getHashHandles ( function ( handles ) {
exitOnCount = handles . length ;
for ( var i = 0 ; i < handles . length ; ++ i ) {
amtMei . getCertHashEntry ( handles [ i ] , function ( result ) {
amtMeiTmpState . TrustedHashes . push ( { Active : result . isActive , Default : result . isDefault , HashAlgorithm : result . hashAlgorithm , Name : result . name , Hash : result . certificateHash } ) ;
2018-03-06 20:50:44 -05:00
if ( -- exitOnCount == 0 ) {
amtMeiTmpState . Notifications = lmsNotifications ; amtMeiState = amtMeiTmpState ;
//console.log('getAmtInfo2', JSON.stringify(amtMeiState));
if ( func != null ) { func ( amtMeiTmpState , tag ) ; }
amtMeiTmpState = null ;
}
2017-12-12 19:04:54 -05:00
} ) ;
}
} ) ;
} else {
amtMeiState = amtMeiTmpState ;
amtMeiState . ProvisioningMode = - 858993460 ;
amtMeiState . TrustedHashes = { } ;
2018-02-02 15:46:09 -05:00
amtMeiState . Notifications = lmsNotifications ;
2018-03-06 20:50:44 -05:00
//console.log('getAmtInfo3', JSON.stringify(amtMeiState));
2017-12-12 19:04:54 -05:00
if ( func != null ) { func ( amtMeiState , tag ) ; }
}
} ) ;
}
2018-01-30 21:23:57 -05:00
//
// MicroLMS
//
2018-02-02 15:46:09 -05:00
var lmsControlSockets = { } ;
var lmsControlSocketsNextId = 1 ;
var lmsNotifications = [ ] ;
2018-03-06 20:50:44 -05:00
var amtLms = null ;
2018-01-25 19:28:52 -05:00
function startLms ( func ) {
2018-01-30 21:23:57 -05:00
var lme _heci = require ( 'amt-lme' ) ;
2018-03-06 20:50:44 -05:00
//var amtLms = null;
2017-12-12 19:04:54 -05:00
var http = require ( 'http' ) ;
2018-03-06 20:50:44 -05:00
// MeshCommander LMS v0.6.0 with LMS improvements
var _IntelAmtWebApp _etag = "EywwrEJnIclcslSGdOXb" ;
var _IntelAmtWebApp = " H4sIAAAAAAAEAOy9aVvb2JYo / J1foahuE6ssjG2GEAtBG2MSV5gKQ1LVHC6PJtsqbMmRZIYQftn9cH / S + xfetfYgbU22Seqcvv10n + 4 K1h7WWnvNe9DW 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
2018-01-30 21:23:57 -05:00
var amtMeiModule = require ( 'amt-mei' ) ;
2017-12-12 19:04:54 -05:00
amtMei = new amtMeiModule ( ) ;
2018-01-25 19:28:52 -05:00
amtMei . on ( 'error' , function ( e ) { console . log ( 'ERROR: ' + e ) ; exit ( 1 ) ; return ; } ) ;
2017-12-12 19:04:54 -05:00
//console.log('PTHI Connecting...');
amtMei . on ( 'connect' , function ( ) {
//console.log("PTHI Connected.");
2018-01-25 19:12:53 -05:00
amtLms = new lme _heci ( { debug : settings . lmsdebug } ) ;
2018-01-25 19:28:52 -05:00
amtLms . on ( 'error' , function ( e ) {
//console.log('LME connection failed', e);
2018-03-06 20:50:44 -05:00
setupMeiOsAdmin ( func , amtLms . connected == false ? 0 : 3 ) ;
2018-01-30 21:23:57 -05:00
} ) ;
2018-03-06 20:50:44 -05:00
amtLms . on ( 'notify' , function ( data , options , str , code ) {
2018-03-08 20:58:22 -05:00
if ( code == 'iAMT0052-3' ) {
kvmGetData ( true ) ;
} else if ( str != null ) {
2018-03-06 20:50:44 -05:00
var notify = { date : Date . now ( ) , str : str , code : code } ;
2018-02-02 15:46:09 -05:00
lmsNotifications . push ( notify ) ;
while ( lmsNotifications . length > 100 ) { lmsNotifications . shift ( ) ; }
var notifyBuf = Buffer . concat ( [ Buffer . from ( '0900' , 'hex' ) , Buffer . from ( JSON . stringify ( notify ) ) ] ) // Add a notification
for ( var i in lmsControlSockets ) { lmsControlSockets [ i ] . write ( notifyBuf ) ; }
}
2018-01-25 19:28:52 -05:00
} ) ;
2017-12-12 19:04:54 -05:00
//console.log('LME Connecting...');
amtLms . on ( 'connect' , function ( ) {
2018-01-30 21:23:57 -05:00
amtLms . connected = true ;
2018-03-06 20:50:44 -05:00
//console.log("LME Connected.");
2018-01-25 19:28:52 -05:00
if ( settings . noconsole !== true ) {
amtLms . meshCommander = http . createServer ( ) ;
amtLms . meshCommander . listen ( 16994 ) ;
amtLms . meshCommander . on ( 'upgrade' , function ( req , socket , head ) {
//console.log("WebSocket for " + req.url.split('?')[0]);
switch ( req . url . split ( '?' ) [ 0 ] ) {
case '/lms.ashx' : // MeshCommander control channel (PTHI)
socket . ws = socket . upgradeWebSocket ( ) ;
socket . ws . on ( 'data' , processLmsControlData ) ;
2018-02-02 15:46:09 -05:00
socket . ws . on ( 'end' , function ( ) { if ( lmsControlSockets [ this . id ] ) { delete lmsControlSockets [ this . id ] ; /*console.log('removeControl', JSON.stringify(lmsControlSockets));*/ } } ) ;
var id = lmsControlSocketsNextId ++ ;
lmsControlSockets [ id ] = socket . ws ;
socket . ws . id = id ;
//socket.ws.write(Buffer.concat([Buffer.from('0900', 'hex'), Buffer.from(JSON.stringify(lmsNotifications))])); // Send out full list of notifications
//console.log('addControl', JSON.stringify(lmsControlSockets));
2018-01-25 19:28:52 -05:00
break ;
case '/webrelay.ashx' : // MeshCommander data channel (LME)
socket . ws = socket . upgradeWebSocket ( ) ;
amtLms . bindDuplexStream ( socket . ws , 'IPv4' , 16992 ) ;
break ;
default :
socket . end ( ) ;
break ;
}
} ) ;
amtLms . meshCommander . on ( 'request' , function ( req , rsp ) {
//console.log("WebRequest for " + req.url.split('?')[0]);
switch ( req . url . split ( '?' ) [ 0 ] ) {
case '/' : // Serve MeshCommander Web Application for LMS
2018-02-02 15:46:09 -05:00
var lmscommander = null ;
try { lmscommander = fs . readFileSync ( 'lmscommander.htm' ) ; } catch ( e ) { }
if ( lmscommander != null ) {
rsp . writeHead ( 200 , 'OK' , { Server : 'JSLMS' , 'Cache-Control' : 'max-age=0, no-cache' , 'X-Frame-Options' : 'DENY' , 'Content-Type' : 'text/html' , 'Transfer-Encoding' : 'chunked' } ) ;
rsp . end ( lmscommander ) ;
} else {
rsp . writeHead ( 200 , 'OK' , { Server : 'JSLMS' , 'Cache-Control' : 'max-age=0, no-cache' , 'X-Frame-Options' : 'DENY' , 'Content-Type' : 'text/html' , 'Content-Encoding' : 'gzip' , 'Transfer-Encoding' : 'chunked' , ETag : _IntelAmtWebApp _etag } ) ;
rsp . end ( Buffer . from ( _IntelAmtWebApp , 'base64' ) ) ;
}
2018-01-25 19:28:52 -05:00
break ;
default : // Unknown request
rsp . statusCode = 404 ;
rsp . statusMessage = "Not Found" ;
rsp . end ( ) ;
break ;
}
2017-12-12 19:04:54 -05:00
2018-01-25 19:28:52 -05:00
} ) ;
//console.log("LMS started, MeshCommander on HTTP/16994.");
2018-03-06 20:50:44 -05:00
tempTimer = setTimeout ( function ( ) { delete tempTimer ; setupMeiOsAdmin ( func , 2 ) ; } , 100 ) ;
//console.logReferenceCount(tempTimer);
2018-01-25 19:28:52 -05:00
} else {
//console.log("LMS started.");
2018-03-06 20:50:44 -05:00
tempTimer = setTimeout ( function ( ) { delete tempTimer ; setupMeiOsAdmin ( func , 1 ) ; } , 100 ) ;
//console.logReferenceCount(tempTimer);
2018-01-25 19:28:52 -05:00
}
2017-12-12 19:04:54 -05:00
} ) ;
} ) ;
}
2018-03-06 20:50:44 -05:00
function setupMeiOsAdmin ( func , state ) {
amtMei . getLocalSystemAccount ( function ( x ) {
var transport = require ( 'amt-wsman-duk' ) ;
var wsman = require ( 'amt-wsman' ) ;
var amt = require ( 'amt' ) ;
oswsstack = new wsman ( transport , '127.0.0.1' , 16992 , x . user , x . pass , false ) ;
osamtstack = new amt ( oswsstack ) ;
if ( func ) { func ( state ) ; }
//var AllWsman = "CIM_SoftwareIdentity,IPS_SecIOService,IPS_ScreenSettingData,IPS_ProvisioningRecordLog,IPS_HostBasedSetupService,IPS_HostIPSettings,IPS_IPv6PortSettings".split(',');
//osamtstack.BatchEnum(null, AllWsman, startLmsWsmanResponse, null, true);
2018-03-08 20:58:22 -05:00
tempTimer = setInterval ( function ( ) { kvmGetData ( true ) ; } , 2000 ) ;
kvmGetData ( false ) ;
kvmSetData ( JSON . stringify ( { action : 'restart' , ver : 1 } ) ) ;
2018-03-06 20:50:44 -05:00
} ) ;
}
2018-03-08 20:58:22 -05:00
function kvmGetData ( tag ) {
osamtstack . IPS _KVMRedirectionSettingData _DataChannelRead ( kvmDataGetResponse , tag ) ;
}
function kvmDataGetResponse ( stack , name , response , status , tag ) {
if ( ( tag == true ) && ( status == 200 ) && ( response . Body . ReturnValue == 0 ) ) {
var val = null ;
try { val = Buffer . from ( response . Body . DataMessage , 'base64' ) . toString ( ) ; } catch ( e ) { return }
if ( val != null ) kvmProcessData ( response . Body . RealmsBitmap , response . Body . MessageId , val ) ;
}
}
var webRtcDesktop = null ;
function kvmProcessData ( realms , messageId , val ) {
//console.log('kvmProcessData', val);
var data = null ;
try { data = JSON . parse ( val ) } catch ( e ) { }
if ( ( data != null ) && ( data . action ) ) {
if ( data . action == 'present' ) { kvmSetData ( JSON . stringify ( { action : 'present' , ver : 1 } ) ) ; }
if ( data . action == 'offer' ) {
webRtcDesktop = { } ;
var rtc = require ( 'ILibWebRTC' ) ;
webRtcDesktop . webrtc = rtc . createConnection ( ) ;
webRtcDesktop . webrtc . on ( 'connected' , function ( ) { } ) ;
webRtcDesktop . webrtc . on ( 'disconnected' , function ( ) { webRtcCleanUp ( ) ; } ) ;
webRtcDesktop . webrtc . on ( 'dataChannel' , function ( rtcchannel ) {
webRtcDesktop . rtcchannel = rtcchannel ;
var kvmmodule = require ( 'meshDesktop' ) ;
webRtcDesktop . kvm = kvmmodule . getRemoteDesktopStream ( ) ;
webRtcDesktop . kvm . pipe ( webRtcDesktop . rtcchannel , { end : false } ) ;
webRtcDesktop . rtcchannel . pipe ( webRtcDesktop . kvm , { end : false } ) ;
webRtcDesktop . rtcchannel . on ( 'end' , function ( ) { webRtcCleanUp ( ) ; } ) ;
//webRtcDesktop.kvm.on('end', function () { console.log('WebRTC DataChannel closed2'); webRtcCleanUp(); });
//webRtcDesktop.rtcchannel.on('data', function (data) { console.log('WebRTC data: ' + data); });
} ) ;
kvmSetData ( JSON . stringify ( { action : 'answer' , ver : 1 , sdp : webRtcDesktop . webrtc . setOffer ( data . sdp ) } ) ) ;
}
}
}
function webRtcCleanUp ( ) {
if ( webRtcDesktop == null ) return ;
if ( webRtcDesktop . rtcchannel ) {
try { webRtcDesktop . rtcchannel . close ( ) ; } catch ( e ) { }
try { webRtcDesktop . rtcchannel . removeAllListeners ( 'data' ) ; } catch ( e ) { }
try { webRtcDesktop . rtcchannel . removeAllListeners ( 'end' ) ; } catch ( e ) { }
delete webRtcDesktop . rtcchannel ;
}
if ( webRtcDesktop . webrtc ) {
try { webRtcDesktop . webrtc . close ( ) ; } catch ( e ) { }
try { webRtcDesktop . webrtc . removeAllListeners ( 'connected' ) ; } catch ( e ) { }
try { webRtcDesktop . webrtc . removeAllListeners ( 'disconnected' ) ; } catch ( e ) { }
try { webRtcDesktop . webrtc . removeAllListeners ( 'dataChannel' ) ; } catch ( e ) { }
delete webRtcDesktop . webrtc ;
}
if ( webRtcDesktop . kvm ) {
try { webRtcDesktop . kvm . end ( ) ; } catch ( e ) { }
delete webRtcDesktop . kvm ;
}
webRtcDesktop = null ;
}
function kvmSetData ( x ) {
osamtstack . IPS _KVMRedirectionSettingData _DataChannelWrite ( Buffer . from ( x ) . toString ( 'base64' ) , function ( ) { } ) ;
}
2018-02-07 21:45:14 -05:00
function startLmsWsmanResponse ( stack , name , responses , status ) {
if ( status == 600 ) { console . log ( 'ERROR: Unable to connect to Intel(R) AMT.' ) ; }
else if ( status != 200 ) { console . log ( 'ERROR: Unable to get object from Intel(R) AMT, status = ' + status + '.' ) ; }
2018-03-06 20:50:44 -05:00
else {
//console.log(JSON.stringify(responses), status);
var amtlogicalelements = responses [ "CIM_SoftwareIdentity" ] . responses ;
if ( amtlogicalelements . length > 0 ) {
var v = getInstance ( amtlogicalelements , "AMT" ) [ "VersionString" ] ;
amtversion = parseInt ( v . split ( '.' ) [ 0 ] ) ;
amtversionmin = parseInt ( v . split ( '.' ) [ 1 ] ) ;
//console.log(amtversion, amtversionmin);
}
}
2018-02-07 21:45:14 -05:00
}
2018-01-30 21:23:57 -05:00
// Process commands in the LMS control channel
2018-02-02 15:46:09 -05:00
// Command 9 is add a notification.
2017-12-12 19:04:54 -05:00
function processLmsControlData ( data ) {
if ( data . length < 2 ) return ;
var cmdid = data . readUInt16LE ( 0 ) ;
switch ( cmdid ) {
case 1 : // Request basic Intel AMT information (CMD = 1)
2018-01-30 21:23:57 -05:00
{ getAmtInfo ( function ( meinfo , socket ) { meinfo . LoginMode = 2 ; socket . write ( Buffer . concat ( [ Buffer . from ( '0100' , 'hex' ) , Buffer . from ( JSON . stringify ( meinfo ) ) ] ) ) ; } , this ) ; break ; }
2017-12-12 19:04:54 -05:00
case 2 : // Intel AMT MEI Unprovision (CMD = 2)
2018-01-30 21:23:57 -05:00
{ if ( data . length < 6 ) break ; amtMei . unprovision ( data . readUInt32LE ( 2 ) , function ( status , socket ) { var data = new Buffer ( 6 ) ; data . writeUInt16LE ( 2 , 0 ) ; data . writeUInt32LE ( status , 2 ) ; socket . write ( data ) ; } , this ) ; break ; }
2017-12-12 19:04:54 -05:00
case 3 : // Intel AMT MEI GetLocalSystemAccount (CMD = 3)
2018-01-30 21:23:57 -05:00
{ amtMei . getLocalSystemAccount ( function ( account , socket ) { socket . write ( Buffer . concat ( [ Buffer . from ( '030000000000' , 'hex' ) , account . raw ] ) ) ; } , this ) ; break ; }
2017-12-12 19:04:54 -05:00
case 4 : // Instruct Intel AMT to start remote configuration (CMD = 4)
2018-01-30 21:23:57 -05:00
{ amtMei . startConfiguration ( function ( status , socket ) { var data = new Buffer ( 6 ) ; data . writeUInt16LE ( 7 , 0 ) ; data . writeUInt32LE ( status , 2 ) ; socket . write ( data ) ; } , this ) ; break ; }
2017-12-12 19:04:54 -05:00
case 5 : // Instruct Intel AMT to stop remote configuration (CMD = 5)
2018-01-30 21:23:57 -05:00
{ amtMei . stopConfiguration ( function ( status , socket ) { var data = new Buffer ( 6 ) ; data . writeUInt16LE ( 7 , 0 ) ; data . writeUInt32LE ( status , 2 ) ; socket . write ( data ) ; } , this ) ; break ; }
2017-12-12 19:04:54 -05:00
case 6 : // Instruct Intel AMT connect CIRA (CMD = 6)
2018-01-30 21:23:57 -05:00
{ amtMei . openUserInitiatedConnection ( function ( status , socket ) { var data = new Buffer ( 6 ) ; data . writeUInt16LE ( 7 , 0 ) ; data . writeUInt32LE ( status , 2 ) ; socket . write ( data ) ; } , this ) ; break ; }
2017-12-12 19:04:54 -05:00
case 7 : // Instruct Intel AMT disconnect CIRA (CMD = 7)
2018-01-30 21:23:57 -05:00
{ amtMei . closeUserInitiatedConnection ( function ( status , socket ) { var data = new Buffer ( 6 ) ; data . writeUInt16LE ( 7 , 0 ) ; data . writeUInt32LE ( status , 2 ) ; socket . write ( data ) ; } , this ) ; break ; }
2017-12-12 19:04:54 -05:00
case 8 : // Get Intel AMT CIRA State (CMD = 8)
2018-01-30 21:23:57 -05:00
{ amtMei . getRemoteAccessConnectionStatus ( function ( state , socket ) { var data = new Buffer ( 6 ) ; data . writeUInt16LE ( 8 , 0 ) ; data . writeUInt32LE ( state . status , 2 ) ; socket . write ( Buffer . concat ( [ data , state . raw ] ) ) ; } , this ) ; break ; }
2017-12-12 19:04:54 -05:00
}
2017-10-31 19:19:58 -04:00
}
2018-01-30 21:23:57 -05:00
//
// MeshCentral TCP port router
//
2017-10-31 19:19:58 -04:00
function startRouter ( ) {
tcpserver = net . createServer ( OnTcpClientConnected ) ;
2018-03-08 20:58:22 -05:00
tcpserver . on ( 'error' , function ( e ) { console . log ( 'ERROR: ' + JSON . stringify ( e ) ) ; exit ( 0 ) ; return ; } ) ;
2017-10-31 19:19:58 -04:00
tcpserver . listen ( settings . localPort , function ( ) {
// We started listening.
if ( settings . remoteName == null ) {
console . log ( 'Redirecting local port ' + settings . localPort + ' to remote port ' + settings . remotePort + '.' ) ;
} else {
console . log ( 'Redirecting local port ' + settings . localPort + ' to ' + settings . remoteName + ':' + settings . remotePort + '.' ) ;
}
console . log ( 'Press ctrl-c to terminal.' ) ;
// If settings has a "cmd", run it now.
//process.exec("notepad.exe");
} ) ;
}
// Called when a TCP connect is received on the local port. Launch a tunnel.
function OnTcpClientConnected ( c ) {
try {
// 'connection' listener
debug ( 1 , 'Client connected' ) ;
c . on ( 'end' , function ( ) { disconnectTunnel ( this , this . websocket , 'Client closed' ) ; } ) ;
c . pause ( ) ;
try {
options = http . parseUri ( settings . serverUrl + '?user=' + settings . username + '&pass=' + settings . password + '&nodeid=' + settings . remoteNodeId + '&tcpport=' + settings . remotePort ) ;
2017-12-12 19:04:54 -05:00
} catch ( e ) { console . log ( 'Unable to parse \"serverUrl\".' ) ; process . exit ( 1 ) ; return ; }
2017-10-31 19:19:58 -04:00
options . checkServerIdentity = onVerifyServer ;
2018-01-26 20:01:38 -05:00
options . rejectUnauthorized = false ;
2017-10-31 19:19:58 -04:00
c . websocket = http . request ( options ) ;
c . websocket . tcp = c ;
c . websocket . tunneling = false ;
c . websocket . upgrade = OnWebSocket ;
2018-01-26 20:01:38 -05:00
c . websocket . on ( 'error' , function ( e ) { console . log ( 'ERROR: ' + JSON . stringify ( e ) ) ; } ) ;
2017-10-31 19:19:58 -04:00
c . websocket . end ( ) ;
} catch ( e ) { debug ( 2 , e ) ; }
}
// Disconnect both TCP & WebSocket connections and display a message.
function disconnectTunnel ( tcp , ws , msg ) {
if ( ws != null ) { try { ws . end ( ) ; } catch ( e ) { debug ( 2 , e ) ; } }
if ( tcp != null ) { try { tcp . end ( ) ; } catch ( e ) { debug ( 2 , e ) ; } }
debug ( 1 , 'Tunnel disconnected: ' + msg ) ;
}
// Called when the web socket gets connected
function OnWebSocket ( msg , s , head ) {
debug ( 1 , 'Websocket connected' ) ;
s . on ( 'data' , function ( msg ) {
if ( this . parent . tunneling == false ) {
msg = msg . toString ( ) ;
if ( msg == 'c' ) {
this . parent . tunneling = true ; this . pipe ( this . parent . tcp ) ; this . parent . tcp . pipe ( this ) ; debug ( 1 , 'Tunnel active' ) ;
} else if ( ( msg . length > 6 ) && ( msg . substring ( 0 , 6 ) == 'error:' ) ) {
console . log ( msg . substring ( 6 ) ) ;
disconnectTunnel ( this . tcp , this , msg . substring ( 6 ) ) ;
}
}
} ) ;
s . on ( 'error' , function ( msg ) { disconnectTunnel ( this . tcp , this , 'Websocket error' ) ; } ) ;
s . on ( 'close' , function ( msg ) { disconnectTunnel ( this . tcp , this , 'Websocket closed' ) ; } ) ;
s . parent = this ;
}
// Try to discover the location of the mesh server
function discoverMeshServer ( ) { console . log ( 'Looking for server...' ) ; discoveryInterval = setInterval ( discoverMeshServerOnce , 5000 ) ; discoverMeshServerOnce ( ) ; }
// Try to discover the location of the mesh server only once
function discoverMeshServerOnce ( ) {
var interfaces = os . networkInterfaces ( ) ;
for ( var adapter in interfaces ) {
if ( interfaces . hasOwnProperty ( adapter ) ) {
2017-12-12 19:04:54 -05:00
for ( var i = 0 ; i < interfaces [ adapter ] . length ; ++ i ) {
2017-10-31 19:19:58 -04:00
var addr = interfaces [ adapter ] [ i ] ;
multicastSockets [ i ] = dgram . createSocket ( { type : ( addr . family == "IPv4" ? "udp4" : "udp6" ) } ) ;
multicastSockets [ i ] . bind ( { address : addr . address , exclusive : false } ) ;
if ( addr . family == "IPv4" ) {
multicastSockets [ i ] . addMembership ( membershipIPv4 ) ;
//multicastSockets[i].setMulticastLoopback(true);
multicastSockets [ i ] . once ( 'message' , OnMulticastMessage ) ;
multicastSockets [ i ] . send ( settings . serverId , 16989 , membershipIPv4 ) ;
}
}
}
}
}
// Called when a multicast packet is received
function OnMulticastMessage ( msg , rinfo ) {
var m = msg . toString ( ) . split ( '|' ) ;
if ( ( m . length == 3 ) && ( m [ 0 ] == 'MeshCentral2' ) && ( m [ 1 ] == settings . serverId ) ) {
settings . serverUrl = m [ 2 ] . replace ( '%s' , rinfo . address ) . replace ( '/agent.ashx' , '/meshrelay.ashx' ) ;
console . log ( 'Found server at ' + settings . serverUrl + '.' ) ;
if ( discoveryInterval != null ) { clearInterval ( discoveryInterval ) ; discoveryInterval = null ; }
startRouter ( ) ;
}
}
2018-01-30 21:23:57 -05:00
//
// PUSH MESHCOMMANDER INTO FIRMWARE
//
2017-12-12 19:04:54 -05:00
function nextStepStorageUpload ( ) {
debug ( 3 , "nextStepStorageUpload" ) ;
getAmtStorage ( function ( statusCode , data ) {
if ( statusCode == 200 ) {
debug ( 2 , "getAmtStorage: " + JSON . stringify ( data , null , 2 ) ) ;
if ( ( data [ 'content' ] != null ) && ( data [ 'content' ] [ 'index.htm' ] != null ) ) { nextStepStorageUpload3 ( 'index.htm' ) ; }
else if ( ( data [ 'content' ] != null ) && ( data [ 'content' ] [ 'logon.htm' ] != null ) ) { nextStepStorageUpload3 ( 'logon.htm' ) ; }
else if ( ( data [ 'content' ] != null ) && ( data [ 'content' ] [ 'logon.htm' ] != null ) ) { nextStepStorageUpload3 ( 'logon.htm' ) ; }
else { nextStepStorageUpload2 ( 'index.htm' , null ) ; }
} else {
console . log ( "Unable to read storage state." ) ;
exit ( ) ;
return ;
}
} ) ;
}
function nextStepStorageUpload2 ( uploadName , linkName ) {
debug ( 3 , "nextStepStorageUpload2" ) ;
if ( settings . webapp == null ) { console . log ( "Done." ) ; exit ( ) ; return ; } else {
console . log ( "Uploading MeshCommander..." ) ;
pushToStorage ( uploadName , linkName , Buffer . from ( settings . webapp , 'base64' ) , function ( statusCode ) {
if ( statusCode == 500 ) { console . log ( "Error, check that computer is powered on." ) ; exit ( ) ; return ; }
if ( statusCode != 200 ) {
if ( uploadName == 'index.htm' ) {
nextStepStorageUpload2 ( 'mesh/commander/console' , 'MeshCommander' ) ;
} else {
console . log ( "Unable to upload MeshCommander, status = " + statusCode + "." ) ; exit ( ) ; return ;
}
} else {
console . log ( "Verifying MeshCommander..." ) ;
verifyStorage ( uploadName , Buffer . from ( settings . webapp , 'base64' ) , function ( verified ) {
if ( verified == true ) { console . log ( 'Done.' ) ; } else { console . log ( 'MeshCommander verification failed.' ) ; }
exit ( ) ; return ;
} ) ;
}
} ) ;
}
}
function nextStepStorageUpload3 ( deleteName ) {
console . log ( "Deleting " + deleteName + " from storage..." ) ;
deleteStorage ( deleteName , function ( statusCode ) {
if ( statusCode == 500 ) { console . log ( "Error, check that computer is powered on." ) ; exit ( ) ; return ; }
if ( statusCode == 200 ) { nextStepStorageUpload ( ) ; } else { console . log ( "Unable to delete " + deleteName + "." ) ; exit ( ) ; return ; }
} ) ;
}
// Fetch the Intel AMT storage document
function getAmtStorage ( func , noretry ) {
var req = digest . request ( { protocol : settings . protocol , method : "GET" , host : settings . hostname , path : "/amt-storage/" , port : settings . localport } ,
function ( response ) {
if ( response . statusCode != 200 ) { console . log ( "Unable to connect to Intel(R) AMT." ) ; func ( response . statusCode , null ) ; }
response . on ( 'data' , function ( chunk ) { if ( response . acc == null ) { response . acc = chunk ; } else { response . acc += chunk ; } } ) ;
response . on ( 'end' , function ( ) {
var data = response . acc . toString ( ) , len , data2 , amtstorage = null ;
try {
do { len = data . length ; data2 = data ; data = data2 . replace ( '\x00' , '' ) ; } while ( data != data2 ) ; // Remove all zero's, this is needed because firmware sometimes returns garbage we must fix.
do { len = data . length ; data2 = data ; data = data2 . replace ( '\x22\x01\x22' , '\x22\x22' ) ; } while ( data != data2 ) ; // "\x01", this is needed because firmware sometimes returns garbage we must fix.
amtstorage = JSON . parse ( data ) ;
} catch ( e ) { console . log ( "Error: Unable to parse Intel AMT response." ) ; func ( null ) ; }
if ( func != null ) { func ( response . statusCode , amtstorage ) ; }
} ) ;
} ) ;
req . on ( 'error' , function ( e ) { console . log ( "Error occured: " + JSON . stringify ( e ) ) ; if ( noretry == true ) { if ( func != null ) { func ( null ) ; } } else { getAmtStorage ( func , true ) ; } } ) ;
req . end ( ) ;
}
// Fetch the Intel AMT storage document
function pushToStorage ( name , linkname , data , func , ptr ) {
if ( ptr == null ) { ptr = 0 ; }
2018-01-25 19:12:53 -05:00
var req = digest . request ( { protocol : settings . protocol , method : "PUT" , host : settings . hostname , path : ( "/amt-storage/" + name + ( ( ptr != 0 ) ? '?append=' : '' ) ) , port : settings . localport } ) ;
2017-12-12 19:04:54 -05:00
req . on ( 'error' , function ( e ) { console . log ( "Error occured: " + JSON . stringify ( e ) ) ; if ( func != null ) { func ( null ) ; } } ) ;
2018-01-25 19:12:53 -05:00
req . on ( 'response' , function ( response ) {
debug ( 1 , 'Chunk Done' , data . length , ptr ) ;
if ( ( response . statusCode == 200 ) && ( ptr < data . length ) ) { pushToStorage ( name , linkname , data , func , ptr ) ; } else { if ( func != null ) { func ( response . statusCode ) ; } }
} ) ;
2017-12-12 19:04:54 -05:00
var header = ( ptr > 0 ) ? '<metadata></metadata>' : '<metadata><headers><h>Content-Encoding:gzip</h><h>Content-Type:text/html</h></headers>' + ( ( linkname != null ) ? ( '<link>' + linkname + '</link>' ) : '' ) + '</metadata>' ;
var blocklen = ( ( data . length - ptr ) > ( 7000 - header . length ) ) ? ( 7000 - header . length ) : ( data . length - ptr ) ;
req . write ( Buffer . concat ( [ new Buffer ( header ) , data . slice ( ptr , ptr + blocklen ) ] ) ) ;
ptr += blocklen ;
req . end ( ) ;
}
// Fetch the Intel AMT storage document
function verifyStorage ( name , data , func ) {
2018-01-25 19:12:53 -05:00
var req = digest . request ( { protocol : settings . protocol , method : "GET" , host : settings . hostname , path : ( "/amt-storage/" + name ) , port : settings . localport } ) ;
2017-12-12 19:04:54 -05:00
req . on ( 'error' , function ( e ) { console . log ( "Verify error occured: " + JSON . stringify ( e ) ) ; if ( func != null ) { func ( null ) ; } } ) ;
2018-01-25 19:12:53 -05:00
req . on ( 'response' , function ( response ) {
response . ptr = 0 ;
response . ok = true ;
2018-01-26 20:01:38 -05:00
response . on ( 'data' , function ( data2 ) { if ( data2 . toString ( 'hex' ) != data . slice ( response . ptr , response . ptr + data2 . length ) . toString ( 'hex' ) ) { response . ok = false ; console . log ( 'Verifiy failed (' + response . ptr + ', ' + data2 . length + ').' ) ; } response . ptr += data2 . length ; } ) ;
2018-01-25 19:12:53 -05:00
response . on ( 'end' , function ( ) { if ( func != null ) { func ( response . ok ) ; } } ) ;
} ) ;
2017-12-12 19:04:54 -05:00
req . end ( ) ;
}
// Fetch the Intel AMT storage document
function deleteStorage ( name , func , noretry ) {
2018-01-25 19:12:53 -05:00
var req = digest . request ( { protocol : settings . protocol , method : "DELETE" , host : settings . hostname , path : "/amt-storage/" + name , port : settings . localport } ) ;
2017-12-12 19:04:54 -05:00
req . on ( 'error' , function ( e ) { if ( ( e == 'Error: Socket was unexpectedly closed' ) && ( noretry != true ) ) { deleteStorage ( name , func , true ) ; } else { if ( func != null ) { if ( e . statusCode ) { func ( e . statusCode ) ; } else { func ( null ) ; } } } } ) ;
2018-01-25 19:12:53 -05:00
req . on ( 'response' , function ( response ) { if ( func != null ) { func ( response . statusCode ) ; } } ) ;
2017-12-12 19:04:54 -05:00
req . end ( ) ;
}
2018-01-30 21:23:57 -05:00
// Run MeshCmd
2018-01-25 19:28:52 -05:00
try { run ( process . argv ) ; } catch ( e ) { console . log ( 'ERROR: ' + e ) ; }