KMPUTLW ;SP/JML - Manage REST interfaces for VSM Monitors ;11/1/2023
;;4.0;CAPACITY MANAGEMENT;**1,3,4**;3/1/2018;Build 36
;
; Reference to GETENV^%ZOSV in ICR #10097
; Reference to $$SITE^VASITE in ICR #10112
;
POST(KMPJSON,KMPRLOC,KMPFFLAG,KMPMKEY) ;
N KMPAKEY,KMPFILE,KMPFN,KMPFQDN,KMPPORT,KMPRESP,KMPREQ,KMPRJSON,KMPSCODE,KMPSTAGE,KMPSTAT,KMPETIME,KMPSTIME,KMPSTEXT
;
I $G(KMPMKEY)="" S KMPMKEY="VTCM"
I KMPJSON.Site="" D SITE(KMPJSON)
S KMPREQ=##class(%Net.HttpRequest).%New()
S KMPREQ.ContentType="application/json"
D KMPREQ.SetHeader("Accept","application/json")
; Send SSL
I $$GETVAL^KMPVCCFG(KMPMKEY,"ENCRYPT",8969,"I")=1 D
.S KMPREQ.SSLConfiguration="KMPHttpsClient"
.S KMPREQ.Https=1
; Server/Resource/Port/Key
S KMPREQ.Location="vsm"_$$PROD^KMPVCCFG()_KMPRLOC
S KMPFQDN=$$GETVAL^KMPVCCFG(KMPMKEY,"NATIONAL FQDN",8969)
I KMPFQDN="" D
.S KMPREQ.Server=$$GETVAL^KMPVCCFG(KMPMKEY,"NATIONAL IP",8969)
.S KMPREQ.Port=$$GETVAL^KMPVCCFG(KMPMKEY,"NATIONAL PORT",8969)
I KMPFQDN'="" S KMPREQ.Server=KMPFQDN
; only set NATIONAL PORT if other than 80/443
S KMPPORT=$$GETVAL^KMPVCCFG(KMPMKEY,"NATIONAL PORT",8969)
I KMPPORT'="" S KMPREQ.Port=KMPPORT
S KMPAKEY=$$GETVAL^KMPVCCFG(KMPMKEY,"APIKEY",8969)
I KMPAKEY'="" D KMPREQ.SetHeader("x-api-key",KMPAKEY)
; Add JSON String to EntityBody from Object/File and send
I $G(KMPFFLAG)=1 D
.S KMPFN=$$DEFDIR^%ZISH()_$P(KMPRLOC,"/",2)_$J_".txt"
.S KMPFILE=##class(%File).%New(KMPFN)
.D KMPFILE.Open("WSN")
.D KMPJSON.%ToJSON(KMPFILE)
.D KMPFILE.Close()
.D KMPFILE.Open("RS")
.D KMPREQ.EntityBody.CopyFrom(KMPFILE)
.D KMPFILE.Close()
.S KMPSTAT=##class(%File).Delete(KMPFN)
E D KMPREQ.EntityBody.Write(KMPJSON.%ToJSON())
I $D(KMPTEST) W !,KMPJSON.%ToJSON(),!
S KMPSTIME=$P($ZTIMESTAMP,",",2)
S KMPSTAT=KMPREQ.Post(,$G(KMPTEST))
S KMPETIME=$P($ZTIMESTAMP,",",2)
S KMPSCODE=KMPREQ.HttpResponse.StatusCode
S KMPSTEXT=$S(+$G(KMPSCODE)>0:KMPREQ.HttpResponse.Data.Read(),1:"")
I $D(KMPTEST) W !,"Http Response Status Code: ",KMPSCODE,!
K KMPTEST
Q KMPSCODE_"^"_KMPSTEXT_"^"_(KMPETIME-KMPSTIME)
;
INFOMSG(KMPVTEXT) ; Send text POST
N KMPEMAIL,KMPMSG,KMPI,KMPSERV,KMPSTAT
S KMPSINF=$$SITEINFO^KMPVCCFG()
S KMPMSG=##class(%Net.MailMessage).%New()
S KMPMSG.From="VSM@"_$P(KMPSINF,"^",3)
S KMPEMAIL=$$GETVAL^KMPVCCFG("VTCM","NATIONAL SUPPORT EMAIL ADDRESS",8969)
D KMPMSG.To.Insert(KMPEMAIL)
S KMPMSG.Subject=$G(KMPVTEXT("SUBJECT"))
S KMPMSG.IsBinary=0
S KMPMSG.IsHTML=0
D KMPMSG.TextData.WriteLine("Do Not Reply - Informational Only")
D KMPMSG.TextData.Write(" "_$c(13))
S KMPI=0
F S KMPI=$o(KMPVTEXT(KMPI)) q:+KMPI=0 D
.D KMPMSG.TextData.WriteLine(" "_KMPVTEXT(KMPI))
D KMPMSG.TextData.Write(" "_$c(13))
D KMPMSG.TextData.WriteLine("Site Name: "_$P(KMPSINF,"^",1))
D KMPMSG.TextData.WriteLine("Site Number: "_$P(KMPSINF,"^",2))
D KMPMSG.TextData.WriteLine("Site Domain: "_$P(KMPSINF,"^",3))
D KMPMSG.TextData.WriteLine("Prod/Test: "_$P(KMPSINF,"^",4))
D KMPMSG.TextData.WriteLine("Site Code: "_$P(KMPSINF,"^",5))
S KMPSERV=##class(%Net.SMTP).%New()
S KMPSERV.smtpserver="smtp.domain.ext"
S KMPSTAT=KMPSERV.Send(KMPMSG)
Q
;
CANMSG(MTYPE,KMPMKEY,KMPSITE,KMPD) ; Repeatable, configured informational mail messages
N KMPPROD,KMPTEXT
S KMPPROD=$$PROD^KMPVCCFG()
;
I MTYPE="JOBLATE" D
.S KMPTEXT("SUBJECT")="VSM ALERT: "_KMPMKEY_" DAILY JOB NOT RUN: "_$P(KMPSITE,"^",2)
.S KMPTEXT(1)="Daily "_KMPMKEY_" job behind "_KMPD_" days"
.S KMPTEXT(2)=$$SITEINFO^KMPVCCFG()
.D INFOMSG(.KMPTEXT)
I MTYPE="DELETE" D
.S KMPTEXT("SUBJECT")="VSM ALERT: Purging "_KMPMKEY_" data for "_$P(KMPSITE,"^",2)
.S KMPTEXT(1)="Data purged for: "_KMPD
.S KMPTEXT(2)=$$SITEINFO^KMPVCCFG()
.D INFOMSG(.KMPTEXT)
I MTYPE="TRANWARN" D
.S KMPTEXT("SUBJECT")="VSM ALERT: Data transmissions of "_KMPMKEY_" data late for "_$P(KMPSITE,"^",2)
.S KMPTEXT(1)=$$SITEINFO^KMPVCCFG()
.D INFOMSG(.KMPTEXT)
I MTYPE="FAILTRAN" D
.S KMPTEXT("SUBJECT")="VSM ALERT: Failed transmission for "_$P(KMPSITE,"^",2)
.S KMPTEXT(1)="Collection date: "_KMPD
.S KMPTEXT(2)=$$SITEINFO^KMPVCCFG()
.D INFOMSG(.KMPTEXT)
I MTYPE="KILL" D
.S KMPTEXT("SUBJECT")="VSM ALERT: All data deleted at "_$P(KMPSITE,"^",2)_" for "_KMPMKEY
.S KMPTEXT(1)="Username: "_$$USERNAME^KMPVCCFG(DUZ)
.S KMPTEXT(2)=$$SITEINFO^KMPVCCFG()
.D INFOMSG(.KMPTEXT)
Q
;
CFGMSG(KMPRQNAM) ; Send configuration data to update Location Table at National VSM Database
N KMPCFG,KMPJSON,KMPMARR,KMPMKEY,KMPMON,KMPSCODE
I $G(KMPRQNAM)="" S KMPRQNAM=$$USERNAME^KMPVCCFG($G(DUZ))
;
S KMPJSON=##class(%DynamicObject).%New()
S KMPJSON.Function="KMP CFG"
S KMPJSON.Requestor=KMPRQNAM
D SITE(KMPJSON)
I "%All%Manager"[$ROLES D CPF(KMPJSON)
D MON(KMPJSON)
S KMPSCODE=$$POST(KMPJSON,"/configuration")
Q
;
RETRY(KMPMON) ;
N KMPMKEY,KMPVER,ZTDESC,ZTDTH,ZTRTN
I KMPMON.Function'="Retry" Q "Incorrect Function Type"
S KMPMKEY=KMPMON.Monitor
S ZTDTH=$H
I KMPMKEY="VTCM" S ZTRTN="RETRY^KMPTCMRT",ZTDESC="VTCM RETRY"
I KMPMKEY="VSTM" S ZTRTN="RETRY^KMPSTMRT",ZTDESC="VSTM RETRY"
I KMPMKEY="VBEM" S ZTRTN="RETRY^KMPBEMRT",ZTDESC="VBEM RETRY"
I KMPMKEY="VMCM" S ZTRTN="RETRY^KMPMCMRT",ZTDESC="VMCM RETRY"
I KMPMKEY="VHLM" S ZTRTN="RETRY^KMPHLMRT",ZTDESC="VHLM RETRY"
I KMPMKEY="VCSM" S ZTRTN="RETRY^KMPCSMRT",ZTDESC="VCSM RETRY"
I KMPMKEY="VETM" S ZTRTN="RETRY^KMPETMRT",ZTDESC="VETM RETRY"
D ^ZTLOAD
Q "OK"
;
CTMLOG(KMPJSON) ; Return run history recorded in the VSM CACHE TASK LOG file
N KMPD,KMPDATA,KMPIEN,KMPMARR
;
S KMPMARR=##class(%DynamicArray).%New()
S KMPIEN=0
F S KMPIEN=$O(^KMPV(8969.03,KMPIEN)) Q:+KMPIEN=0 D
.S KMPDATA=$G(^KMPV(8969.03,KMPIEN,0))
.S KMPD=##class(%DynamicObject).%New()
.S KMPD.Date=$$SHORTDAT($P(KMPDATA,"^",1),"HOROLOG"),KMPD.Node=$P(KMPDATA,"^",2)
.s KMPD.Time=$$TSTAMP($P(KMPDATA,"^",3),"FILEMAN",1)
.D KMPMARR.%Push(KMPD)
S KMPJSON.Ctm=KMPMARR
Q
;
PACKAGES(KMPJSON) ; Get data from PACKAGE file
N KMPIEN,KMPPACK,KMPPARR,KMPPNAM,KMPPRE
;
S KMPPARR=##class(%DynamicArray).%New()
S KMPPRE=""
F S KMPPRE=$O(^DIC(9.4,"C",KMPPRE)) Q:KMPPRE="" D
.S KMPIEN=""
.F S KMPIEN=$O(^DIC(9.4,"C",KMPPRE,KMPIEN)) Q:KMPIEN="" D
..S KMPPNAM=$P($G(^DIC(9.4,KMPIEN,0)),"^")
..S KMPPACK=##class(%DynamicObject).%New()
..S KMPPACK.Name=KMPPNAM,KMPPACK.Prefix=KMPPRE,KMPPACK.Ien=KMPIEN
..D KMPPARR.%Push(KMPPACK)
S KMPJSON.Packages=KMPPARR
Q
;
SITE(KMPJSON) ;
N KMPINST,KMPNDTYP,KMPNODE,KMPSINF,KMPSITE,KMPSYS,%,Y
D NOW^%DTC
S KMPSITE=$$SITE^VASITE($P(%,".")) ;supported by ICR #10112
S KMPSINF=$$SITEINFO^KMPVCCFG()
S KMPSYS=$$SYSCFG^KMPVCCFG()
S KMPSITE=##class(%DynamicObject).%New()
S KMPSITE.SiteName=$P(KMPSINF,"^"),KMPSITE.SiteNum=$P(KMPSINF,"^",2),KMPSITE.SiteDomain=$P(KMPSINF,"^",3)
S KMPSITE.SiteCode=$P(KMPSINF,"^",5),KMPSITE.Production=$P(KMPSINF,"^",4) ; ,KMPSITE.Date=$P($$TSTAMP($H,"HOROLOG",1),"^")
S KMPSITE.Cache=$P(KMPSYS,"^",1),KMPSITE.OS=$P(KMPSYS,"^",2),KMPSITE.CacheVersion=$P(KMPSYS,"^",3)
D GETENV^%ZOSV S KMPNODE=$P(Y,U,3)_":"_$P($P(Y,U,4),":",2) ;supported by ICR #10097
S KMPINST=$P(KMPNODE,":",2),KMPNDTYP=$$NODETYPE^KMPUTLW(KMPINST)
S KMPSITE.NodeType=KMPNDTYP,KMPSITE.Node=$p(KMPNODE,":")
I KMPNDTYP="BE" S KMPSITE.BackendNode=$P(KMPNODE,":")
S KMPIEN=$O(^KMPV(8969,"B","VTCM",""))
S KMPSITE.StartPerfmon=$$GETVAL^KMPVCCFG("VTCM","START PERFMON",8969)
S KMPJSON.Site=KMPSITE
Q
;
CPF(KMPJSON) ;
N KMPCONFIG,KMPCFG,KMPCPF,KMPMIRROR,KMPPROP,KMPRNS,KMPSTART,KMPTNS
N KMPCSTAT,KMPMSTAT,KMPSSTAT,KMPCPROP,KMPMPROP,KMPSPROP
S KMPCPF=##class(%DynamicObject).%New()
S KMPSTART=##class(%DynamicObject).%New()
S KMPMIRROR=##class(%DynamicObject).%New()
S KMPCONFIG=##class(%DynamicObject).%New()
; get current namespace, switch to %SYS
S KMPRNS=$NAMESPACE,$NAMESPACE="%SYS"
D ##class("Config.Startup").Get(.KMPSPROP)
D ##class("Config.MirrorMember").Get(.KMPMPROP)
D ##class("Config.config").Get(.KMPCPROP)
M KMPCFG("Startup")=KMPSPROP
M KMPCFG("Mirror")=KMPMPROP
M KMPCFG("Config")=KMPCPROP
S $NAMESPACE=KMPRNS
; Record Startup Properties
M KMPSPROP=KMPCFG("Startup")
S KMPPROP=""
F S KMPPROP=$O(KMPSPROP(KMPPROP)) Q:KMPPROP="" D
.D KMPSTART.%Set(KMPPROP,KMPSPROP(KMPPROP))
S KMPCPF.Startup=KMPSTART
; Record MirrorMember Properties
M KMPMPROP=KMPCFG("Mirror")
S KMPPROP=""
F S KMPPROP=$O(KMPMPROP(KMPPROP)) Q:KMPPROP="" D
.D KMPMIRROR.%Set(KMPPROP,KMPMPROP(KMPPROP))
S KMPCPF.MirrorMember=KMPMIRROR
; Record Config Properties
M KMPCPROP=KMPCFG("Config")
S KMPPROP=""
F S KMPPROP=$O(KMPCPROP(KMPPROP)) Q:KMPPROP="" D
.D KMPCONFIG.%Set(KMPPROP,KMPCPROP(KMPPROP))
S KMPCPF.Config=KMPCONFIG
S KMPJSON.CPF=KMPCPF
Q
;
MON(KMPJSON) ;
; Monitor Information
N KMP3,KMP4,KMPFILE,KMPFN
S KMPMARR=##class(%DynamicArray).%New()
S KMPMKEY=""
F S KMPMKEY=$O(^KMPV(8969,"B",KMPMKEY)) Q:KMPMKEY="" D
.S KMPIEN=$O(^KMPV(8969,"B",KMPMKEY,""))
.S KMPMON=##CLASS(%DynamicObject).%New()
.S KMPCFG=$$CFGSTR^KMPVCCFG(KMPMKEY)
.S KMP3=$G(^KMPV(8969,KMPIEN,3))
.S KMP4=$G(^KMPV(8969,KMPIEN,4))
.S KMPMON.AllowTestSystem=$P(KMPCFG,"^",9)
.S KMPMON.ApiKey=$P(KMP4,"^",4)
.S KMPMON.CacheDailyTask=$P(KMPCFG,"^",10)
.S KMPMON.CollectionInterval=$P(KMPCFG,"^",6)
.S KMPMON.DaysToKeepData=$P(KMPCFG,"^",5)
.S KMPMON.Encrypt=$P(KMPCFG,"^",14)
.S KMPMON.Monitor=KMPMKEY
.S KMPMON.NationalDataEmailAddress=$P(KMP3,"^")
.S KMPMON.NationalFqdn=$P(KMP4,"^",2)
.S KMPMON.NationalIpAddress=$P(KMP4,"^")
.S KMPMON.NationalPort=$P(KMP4,"^",3)
.S KMPMON.NationalSupportEmailAddress=$P(KMP3,"^",2)
.S KMPMON.OnOff=$P(KMPCFG,"^",2)
.S KMPMON.Realtime=$P(KMPCFG,"^",12)
.S KMPMON.HttpRequestMaxLength=$P(KMPCFG,"^",7)
.S KMPMON.MonitorStartDelay=$P(KMPCFG,"^",8)
.S KMPMON.StartPerfmon=$P(KMPCFG,"^",13)
.S KMPMON.TaskmanOption=$P(KMPCFG,"^",11)
.S KMPMON.Version=$P(KMPCFG,"^",3)
.S KMPMON.VersionInstallDate=$$SHORTDAT($P(KMPCFG,"^",4),"FILEMAN")
.S KMPMON.VsmCfgEmailAddress=$P(KMP3,"^",3)
.D KMPMARR.%Push(KMPMON)
S KMPJSON.MonCFG=KMPMARR
Q
;
TSTAMP(KMPDAY,KMPFORMAT,KMPTZ) ;
; variables passed must be 1st and 2nd piece in $H format
N KMPRTS,KMPTZONE,KMPUTC,X,%H,%T
I KMPFORMAT="" Q ""
I KMPDAY="" Q ""
S KMPRTS=""
S KMPTZONE=$ZTIMEZONE/60
I KMPFORMAT="FILEMAN" D
.S X=KMPDAY D H^%DTC
.S $P(KMPDAY,",")=%H,$P(KMPDAY,",",2)=%T
I $P(KMPDAY,",",2)>86399 S $P(KMPDAY,",",2)=""
S KMPRTS=$ZDATE(+KMPDAY,3)_" "_$ZTIME($P(KMPDAY,",",2))
S KMPRTS=$ZDATETIME(KMPDAY,3)
I $G(KMPTZ)=1 S KMPRTS=KMPRTS_"Z"_KMPTZONE
S KMPUTC=$SYSTEM.Util.LocalWithZTIMEZONEtoUTC(KMPDAY)
S $P(KMPRTS,"^",2)=$ZDATETIME(KMPUTC,3)
S $P(KMPRTS,"^",3)=(KMPUTC-47117*86400+$P($P(KMPUTC,",",2),"."))
S $P(KMPRTS,"^",4)=$SYSTEM.Util.IsDST()
Q KMPRTS
;
SHORTDAT(KMPDAY,KMPFORMAT) ; convert $h or fileman to external date
; passing $H whole or first piece
N X
I KMPDAY="" Q ""
I KMPFORMAT="HOROLOG" Q $ZDATE(+KMPDAY,3)
I KMPFORMAT="FILEMAN" D Q $ZDATE(%H,3)
.S X=KMPDAY D H^%DTC
Q
;
UTC(KMPZTS) ; Requres $ZTIMSTAMP to convert to Linux Epoch format
S KMPZTS=$G(KMPZTS) I KMPZTS="" S KMPZTS=$ZTIMESTAMP
; get delta from $h start to Epoch start -- then convert to seconds
Q (KMPZTS-47117*86400+$P($P(KMPZTS,",",2),"."))
;
NODETYPE(INSTANCE) ;
; from ZSTU
N X
S X=INSTANCE ;,Y=SSPORT
I $E(X,7,9)="SVR" Q "BE"
I $E(X,7,8)="A0"!($E(X,7,8)="TM") Q "FE"
I $E(X,6,9)="SHMS"!($E(X,6,8)="SSM") Q "MS"
I $E(X,7,9)="LDR"!($E(X,6,8)="SSL") Q "LS"
I $E(X,6,9)="SHDW"!($E(X,6,8)="SS0")!($E(X,6,8)="SS1") Q "VRO"
Q "UK"
--- Routine Detail --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HKMPUTLW 11679 printed Oct 16, 2024@17:42:49 Page 2
KMPUTLW ;SP/JML - Manage REST interfaces for VSM Monitors ;11/1/2023
+1 ;;4.0;CAPACITY MANAGEMENT;**1,3,4**;3/1/2018;Build 36
+2 ;
+3 ; Reference to GETENV^%ZOSV in ICR #10097
+4 ; Reference to $$SITE^VASITE in ICR #10112
+5 ;
POST(KMPJSON,KMPRLOC,KMPFFLAG,KMPMKEY) ;
+1 NEW KMPAKEY,KMPFILE,KMPFN,KMPFQDN,KMPPORT,KMPRESP,KMPREQ,KMPRJSON,KMPSCODE,KMPSTAGE,KMPSTAT,KMPETIME,KMPSTIME,KMPSTEXT
+2 ;
+3 IF $GET(KMPMKEY)=""
SET KMPMKEY="VTCM"
+4 IF KMPJSON.Site=""
DO SITE(KMPJSON)
+5 SET KMPREQ=##class(%Net.HttpRequest).%New()
+6 SET KMPREQ.ContentType="application/json"
+7 DO KMPREQ.SetHeader("Accept","application/json")
+8 ; Send SSL
+9 IF $$GETVAL^KMPVCCFG(KMPMKEY,"ENCRYPT",8969,"I")=1
Begin DoDot:1
+10 SET KMPREQ.SSLConfiguration="KMPHttpsClient"
+11 SET KMPREQ.Https=1
End DoDot:1
+12 ; Server/Resource/Port/Key
+13 SET KMPREQ.Location="vsm"_$$PROD^KMPVCCFG()_KMPRLOC
+14 SET KMPFQDN=$$GETVAL^KMPVCCFG(KMPMKEY,"NATIONAL FQDN",8969)
+15 IF KMPFQDN=""
Begin DoDot:1
+16 SET KMPREQ.Server=$$GETVAL^KMPVCCFG(KMPMKEY,"NATIONAL IP",8969)
+17 SET KMPREQ.Port=$$GETVAL^KMPVCCFG(KMPMKEY,"NATIONAL PORT",8969)
End DoDot:1
+18 IF KMPFQDN'=""
SET KMPREQ.Server=KMPFQDN
+19 ; only set NATIONAL PORT if other than 80/443
+20 SET KMPPORT=$$GETVAL^KMPVCCFG(KMPMKEY,"NATIONAL PORT",8969)
+21 IF KMPPORT'=""
SET KMPREQ.Port=KMPPORT
+22 SET KMPAKEY=$$GETVAL^KMPVCCFG(KMPMKEY,"APIKEY",8969)
+23 IF KMPAKEY'=""
DO KMPREQ.SetHeader("x-api-key",KMPAKEY)
+24 ; Add JSON String to EntityBody from Object/File and send
+25 IF $GET(KMPFFLAG)=1
Begin DoDot:1
+26 SET KMPFN=$$DEFDIR^%ZISH()_$PIECE(KMPRLOC,"/",2)_$JOB_".txt"
+27 SET KMPFILE=##class(%File).%New(KMPFN)
+28 DO KMPFILE.Open("WSN")
+29 DO KMPJSON.%ToJSON(KMPFILE)
+30 DO KMPFILE.Close()
+31 DO KMPFILE.Open("RS")
+32 DO KMPREQ.EntityBody.CopyFrom(KMPFILE)
+33 DO KMPFILE.Close()
+34 SET KMPSTAT=##class(%File).Delete(KMPFN)
End DoDot:1
+35 IF '$TEST
DO KMPREQ.EntityBody.Write(KMPJSON.%ToJSON())
+36 IF $DATA(KMPTEST)
WRITE !,KMPJSON.%ToJSON(),!
+37 SET KMPSTIME=$PIECE($ZTIMESTAMP,",",2)
+38 SET KMPSTAT=KMPREQ.Post(,$GET(KMPTEST))
+39 SET KMPETIME=$PIECE($ZTIMESTAMP,",",2)
+40 SET KMPSCODE=KMPREQ.HttpResponse.StatusCode
+41 SET KMPSTEXT=$SELECT(+$GET(KMPSCODE)>0:KMPREQ.HttpResponse.Data.Read(),1:"")
+42 IF $DATA(KMPTEST)
WRITE !,"Http Response Status Code: ",KMPSCODE,!
+43 KILL KMPTEST
+44 QUIT KMPSCODE_"^"_KMPSTEXT_"^"_(KMPETIME-KMPSTIME)
+45 ;
INFOMSG(KMPVTEXT) ; Send text POST
+1 NEW KMPEMAIL,KMPMSG,KMPI,KMPSERV,KMPSTAT
+2 SET KMPSINF=$$SITEINFO^KMPVCCFG()
+3 SET KMPMSG=##class(%Net.MailMessage).%New()
+4 SET KMPMSG.From="VSM@"_$PIECE(KMPSINF,"^",3)
+5 SET KMPEMAIL=$$GETVAL^KMPVCCFG("VTCM","NATIONAL SUPPORT EMAIL ADDRESS",8969)
+6 DO KMPMSG.To.Insert(KMPEMAIL)
+7 SET KMPMSG.Subject=$GET(KMPVTEXT("SUBJECT"))
+8 SET KMPMSG.IsBinary=0
+9 SET KMPMSG.IsHTML=0
+10 DO KMPMSG.TextData.WriteLine("Do Not Reply - Informational Only")
+11
*** ERROR ***
DO KMPMSG.TextData.Write(" "_$c(13))
+12 SET KMPI=0
+13 FOR