meshcentral
Version:
Web based remote computer management server
1 lines • 1.81 kB
JavaScript
function AMTScanner(){require("events").inherits(this).createEvent("found"),this.dgram=require("dgram"),this.buildRmcpPing=function(n){var e=Buffer.from("06000006000011BE80000000","hex");return e[9]=n,e},this.parseRmcpPacket=function(n,e,r,t){var s,i;null==e||e.length<20||(s={},(0==e[12]||0!=e[13]||1!=e[14]||87!=e[15])&&32&e[21]&&(s.servertag=e[9],s.minorVersion=15&e[18],s.majorVersion=e[18]>>4&15,s.provisioningState=3&e[19],i=256*e[16]+e[17],e=0!=(4&e[19]),s.openPorts=[i],s.address=r.address,1==e&&(s.openPorts=[16992,16993]),void 0!==t)&&t(n,s))},this.parseIPv4Range=function(n){if(null==n)return null;var e=n.split("-");if(2==e.length)return{min:this.parseIpv4Addr(e[0]),max:this.parseIpv4Addr(e[1])};if(2!=(e=n.split("/")).length)return null==(e=this.parseIpv4Addr(n))?null:{min:e,max:e};var n=this.parseIpv4Addr(e[0]),r=0;if((t=parseInt(e[1]))<=16||32<t)return null;for(var t=32-t,s=0;s<t;s++)r<<=1,r++;return{min:1+(n&4294967295-r),max:(n&4294967295-r)+r-1}},this.parseIpv4Addr=function(n){n=n.split(".");return 4==n.length?(parseInt(n[0])<<24)+(parseInt(n[1])<<16)+(parseInt(n[2])<<8)+(parseInt(n[3])<<0):null},this.IPv4NumToStr=function(n){return(n>>24&255)+"."+(n>>16&255)+"."+(n>>8&255)+"."+(255&n)},this.scan=function(n,e,r){var t=this.parseIPv4Range(n),s=this.buildRmcpPing(0),i=this.dgram.createSocket({type:"udp4"});i.parent=this,i.scanResults=[],i.on("error",function(n){console.log("Error:"+n)}),i.on("message",function(n,e){4<e.size&&this.parent.parseRmcpPacket(this,n,e,function(n,e){n.scanResults.push(e)})}),i.on("listening",function(){for(var n=t.min;n<=t.max;n++)i.send(s,623,i.parent.IPv4NumToStr(n))}),i.bind({address:"0.0.0.0",port:0,exclusive:!0}),setTimeout(function(){i.close(),r&&r(i.scanResults),i.parent.emit("found",i.scanResults),delete i},e)}}module.exports=AMTScanner