RosettaCodeData/Task/DNS-query/Cache-ObjectScript/dns-query-1.cos

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 ""
}
}