Technical Forum
Ask questions. Discover Answers.
cancel
Showing results for 
Search instead for 
Did you mean: 

for Send Email via iRule Procedures .

Govind_32899
Nimbostratus
Nimbostratus

I used https://devcentral.f5.com/wiki/iRules.Send-Email-via-iRule-Procedures.ashx . But getting error Some fields below contain errors. Correct them before continuing. while applying irule to the VIP

 

4 REPLIES 4

cjunior
Nacreous
Nacreous

Hello,

I think there is a bit of interpretation missing from this iRule content, and you should be going through a method overload problem.

See this line:

call thisiRule::sendEmail $errorSubject $errorBody

"thisiRule" means the iRule name what you are creating.

and in this other line:

catch {call procLibrary::sendEmail $subject $body "email1@myorg.org email2@myorg.org"}

Indicates that the overload method sendEmail, has to be in another irule e.g. "procLibrary"

So, try creating the methods in different libraries (iRules), e.g.:

"thisiRule" content:


 this Irule sends an email to the F5 admin via the mailserver.myorg.org mailserver. This iRule calls the procedure in the procLibrary iRule.

when HTTP_RESPONSE {
    set error 0
    if {$error} {
        set errorSubject "F5 Email Notification."
        set errorBody "There was an event that happened. Check your F5 local log!"
        call thisiRule::sendEmail $errorSubject $errorBody
    }
    else {
        Do something cool
    }
}   
proc sendEmail {sourceSubject sourceBody} {
        set currentTime [clock format [clock seconds] -format {%H:%M:%S}]
        set todaysDate [clock format [clock seconds] -format {%m-%d:%Y}]
        set subject ${sourceSubject}
        set body "${sourceBody}\r\n\r\n ${currentTime}hrs on ${todaysDate}.\r\n\r\n This is an automated email sent via the this iRule iRule.\r\n\r\nSincerely,\r\nYour F5 Support Team"
        log local0. $body
        catch {call procLibrary::sendEmail $subject $body "email1@myorg.org email2@myorg.org"}
}

"procLibrary" irule content:


 This procedure library procLibrary sends an email using a sideband connection to your organizations email server.
 It has 3 input parameters; subject, body and additional email addresses. The calling procedure needs to seperate the additional 
   emails with a " ". Example "email1@myorg.org email2@myorg.org".

proc sendEmail {sourceSubject sourceEmailBody sourceAddEmailAddress} {
    upvar 1 $sourceSubject n1
    upvar 1 $sourceEmailBody n2
    upvar 1 $sourceAddEmailAddress n3
    set email_debug 0
    set hostName [info hostname]
    set mailFrom "root@$hostname"
    set mailTo "admin@myorg.org"
    set mailServer "xxx.xxx.xxx.xxx:25"
    set subject $sourceSubject
    set emailBody $sourceEmailBody
    set addEmailAddress ""
    if {$sourceAddEmailAddress ne ""} {
        append sourceAddEmailAddress "${mailTo}"
        foreach emailAddress $sourceAddEmailAddress {
            set emailConn [connect -timeout 2000 -idle 10 -status conn_status $mailServer]
            if {$email_debug} {log local0. "connect_status: $conn_status"}
            set emailData "HELO mailserver.myorg.org\r\nMAIL FROM: $mailFrom\r\nRCPT To: ${emailAddress}\r\nDATA\r\nSUBJECT: \r\n\r\n\r\n$emailBody\r\n.\r\n"
            set send_info [send -timeout 2000 -status send_status $emailConn $emailData]
            if {$email_debug} {log local0. "emailData: $emailData"}
            if {$email_debug} {log local0. "send_status: $send_status"}
            set recv_data [recv -timeout 2000 -status recv_status $emailConn]
            if {$email_debug} {log local0. "recv_Data: $recv_data"}
            close $emailConn
            if {$email_debug} {log local0. "EmailTo: $emailAddress"}
        }
    }
    else {
        if {$email_debug} {log local0. "connect_status: $conn_status"}
        set emailData "HELO mailserver.myorg.org\r\nMAIL FROM: $mailFrom\r\nRCPT To: ${emailAddress}\r\nDATA\r\nSUBJECT: \r\n\r\n\r\n$emailBody\r\n.\r\n"
        set send_info [send -timeout 2000 -status send_status $emailConn $emailData]
        if {$email_debug} {log local0. "emailData: $emailData"}
        if {$email_debug} {log local0. "send_status: $send_status"}
        set recv_data [recv -timeout 2000 -status recv_status $emailConn]
        if {$email_debug} {log local0. "recv_Data: $recv_data"}
        close $emailConn
    }   
}

Particulary, I prefer to rewrite all this content to one iRule, if use it to simple thing.

I hope it helps you.

I am trying to do something similar and have created 2 irules, I can see log entries that the "event" is occuring, but I never see that the second irule is called. I am going to attempt to combine into a single one. Has anyone had success using the above?

Hello,

I'm not sure issues you are facing, so did you write the rule library name in front of procedure on the call statement?

e.g.

call procLibrary::sendEmail

Please, check if this short example makes more sense to you:

# Some virtual server
ltm virtual vs_devcentral {
    destination 172.30.30.101:http
    ip-protocol tcp
    mask 255.255.255.255
    profiles {
        http { }
        tcp { }
    }
    rules {
        irule_devcentral
    }
    source 0.0.0.0/0
}
# iRule with events
ltm rule irule_devcentral {
    when HTTP_REQUEST {
           log local0. "This is from irule_devcentral"
           call irule_lib_dc::externalProcedure()
    }
}
 
# Library with procedures
ltm rule irule_lib_dc {
    proc externalProcedure() {
        log local0. "This is from externalProcedure() into irule_lib_dc"
        HTTP::respond 200 content "<html><head></head><body>Voila!</body></html>" Connection close
    }
}

The test:

[root@bigipdelta:Active:Standalone] tmp # curl -v http://172.30.30.101
* Rebuilt URL to: http://172.30.30.101/
*   Trying 172.30.30.101...
* Connected to 172.30.30.101 (172.30.30.101) port 80 (#0)
> GET / HTTP/1.1
> Host: 172.30.30.101
> User-Agent: curl/7.47.1
> Accept: */*
>
* HTTP 1.0, assume close after body
< HTTP/1.0 200 OK
< Server: BigIP
< Connection: close
< Content-Length: 45
<
* Closing connection 0
<html><head></head><body>Voila!</body></html>
 

Log:

[root@bigipdelta:Active:Standalone] tmp # tail /var/log/ltm
Jan 15 14:38:13 bigipdelta info tmm[11153]: Rule /Common/irule_devcentral <HTTP_REQUEST>: This is from irule_devcentral
Jan 15 14:38:13 bigipdelta info tmm[11153]: Rule /Common/irule_devcentral <HTTP_REQUEST>: This is from externalProcedure() into irule_lib_dc

Regards.

I am trying to make the simplest imaginable iRule that sends an email when a VIP gets hit. I do not want to use multiple iRules. How do I write one like that?