49 lines
1.4 KiB
Plaintext
49 lines
1.4 KiB
Plaintext
Class Utils.Net Extends %RegisteredObject
|
|
{
|
|
|
|
ClassMethod QueryDNS(pHost As %String, Output ip As %List) As %Status
|
|
{
|
|
// some initialisation
|
|
K ip S ip=""
|
|
|
|
// check host operating system and input parameters
|
|
S OS=$SYSTEM.Version.GetOS()
|
|
I '$LF($LB("Windows","UNIX"), OS) Q $$$ERROR($$$GeneralError, "Not implemented.")
|
|
I OS="Windows" S cmd="nslookup "_pHost
|
|
I OS="UNIX" S cmd="host "_pHost
|
|
I $MATCH(pHost, "^([a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,6}$")=0 {
|
|
Q $$$ERROR($$$GeneralError, "Invalid host name.")
|
|
}
|
|
|
|
// invoke command
|
|
S list=##class(Utils.OS).Call(cmd, 0)
|
|
|
|
// iterate through list
|
|
S ptr=0, skip=1
|
|
WHILE $LISTNEXT(list,ptr,value) {
|
|
I value="" CONTINUE
|
|
I skip, OS="Windows" S skip=$S(value["Name:": 0, 1: 1) CONTINUE
|
|
S ipv4=..GetIPAddr("ipv4", value) I $L(ipv4) S $LI(ip, 4)=ipv4
|
|
S ipv6=..GetIPAddr("ipv6", value) I $L(ipv6) S $LI(ip, 6)=ipv6
|
|
}
|
|
|
|
// finished
|
|
I $LD(ip, 4)=0, $LD(ip, 6)=0 Q $$$ERROR($$$GeneralError, "Lookup failed.")
|
|
QUIT $$$OK
|
|
}
|
|
|
|
ClassMethod GetIPAddr(pType As %String = "", pValue As %String = "") As %String
|
|
{
|
|
I pType="ipv4" {
|
|
S pos=$LOCATE(pValue, "((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.|$)){4}")
|
|
I pos Q $P($E(pValue, pos, *), " ")
|
|
}
|
|
I pType="ipv6" {
|
|
S pos=$LOCATE(pValue, "([0-9A-Fa-f]{0,4}:){2,7}([0-9A-Fa-f]{1,4}$|((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\.|$)){4})")
|
|
I pos Q $P($E(pValue, pos, *), " ")
|
|
}
|
|
QUIT ""
|
|
}
|
|
|
|
}
|