Implement support for notification types
- add new flag "-t" for notification types to matrix-host-notification and matrix-service-notification - implement value validation for HostState and ServiceState
This commit is contained in:
parent
902d4cb310
commit
1aeacd0d1b
6 changed files with 81 additions and 10 deletions
|
@ -45,9 +45,10 @@ func parseFlags() *icinga2.HostParameters {
|
||||||
flag.StringVar(&config.LongDateTime, "d", "", "long date time ($icinga.long_date_time$)")
|
flag.StringVar(&config.LongDateTime, "d", "", "long date time ($icinga.long_date_time$)")
|
||||||
flag.StringVar(&config.Hostname, "l", "", "hostname ($host.name$)")
|
flag.StringVar(&config.Hostname, "l", "", "hostname ($host.name$)")
|
||||||
flag.StringVar(&config.HostDisplayName, "n", "", "host display name ($host.display_name$)")
|
flag.StringVar(&config.HostDisplayName, "n", "", "host display name ($host.display_name$)")
|
||||||
|
flag.Var(&config.NotificationType, "t", "notification type ($notification_type$)")
|
||||||
|
|
||||||
flag.StringVar(&config.HostOutput, "o", "", "host output ($host.output$)")
|
flag.StringVar(&config.HostOutput, "o", "", "host output ($host.output$)")
|
||||||
flag.StringVar(&config.HostState, "s", "", "host state ($host.state$)")
|
flag.Var(&config.HostState, "s", "host state ($host.state$)")
|
||||||
|
|
||||||
flag.StringVar(&config.MatrixRoom, "m", "", "matrix room ($notification_matrix_room$)")
|
flag.StringVar(&config.MatrixRoom, "m", "", "matrix room ($notification_matrix_room$)")
|
||||||
flag.Var(&config.MatrixServer, "x", "matrix server ($notification_matrix_server$)")
|
flag.Var(&config.MatrixServer, "x", "matrix server ($notification_matrix_server$)")
|
||||||
|
|
|
@ -13,6 +13,8 @@
|
||||||
//
|
//
|
||||||
// You should have received a copy of the GNU General Public License
|
// You should have received a copy of the GNU General Public License
|
||||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
// The main package for matrix-service-notification
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
@ -45,11 +47,12 @@ func parseFlags() *icinga2.ServiceParameters {
|
||||||
flag.StringVar(¶meters.LongDateTime, "d", "", "long date time ($icinga.long_date_time$)")
|
flag.StringVar(¶meters.LongDateTime, "d", "", "long date time ($icinga.long_date_time$)")
|
||||||
flag.StringVar(¶meters.Hostname, "l", "", "hostname ($host.name$)")
|
flag.StringVar(¶meters.Hostname, "l", "", "hostname ($host.name$)")
|
||||||
flag.StringVar(¶meters.HostDisplayName, "n", "", "host display name ($host.display_name$)")
|
flag.StringVar(¶meters.HostDisplayName, "n", "", "host display name ($host.display_name$)")
|
||||||
|
flag.Var(¶meters.NotificationType, "t", "notification type ($notification_type$)")
|
||||||
|
|
||||||
flag.StringVar(¶meters.ServiceName, "e", "", "service name ($service.name$)")
|
flag.StringVar(¶meters.ServiceName, "e", "", "service name ($service.name$)")
|
||||||
flag.StringVar(¶meters.ServiceDisplayName, "u", "", "service display name ($service.display_name$)")
|
flag.StringVar(¶meters.ServiceDisplayName, "u", "", "service display name ($service.display_name$)")
|
||||||
flag.StringVar(¶meters.ServiceOutput, "o", "", "service output ($service.output$)")
|
flag.StringVar(¶meters.ServiceOutput, "o", "", "service output ($service.output$)")
|
||||||
flag.StringVar(¶meters.ServiceState, "s", "", "service state ($service.state$)")
|
flag.Var(¶meters.ServiceState, "s", "service state ($service.state$)")
|
||||||
|
|
||||||
flag.StringVar(¶meters.MatrixRoom, "m", "", "matrix room ($notification_matrix_room$)")
|
flag.StringVar(¶meters.MatrixRoom, "m", "", "matrix room ($notification_matrix_room$)")
|
||||||
flag.Var(¶meters.MatrixServer, "x", "matrix server ($notification_matrix_server$)")
|
flag.Var(¶meters.MatrixServer, "x", "matrix server ($notification_matrix_server$)")
|
||||||
|
|
|
@ -13,6 +13,7 @@
|
||||||
//
|
//
|
||||||
// You should have received a copy of the GNU General Public License
|
// You should have received a copy of the GNU General Public License
|
||||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
package icinga2
|
package icinga2
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
@ -84,10 +85,11 @@ func BuildHostNotification(p *HostParameters) (string, error) {
|
||||||
|
|
||||||
if _, err := fmt.Fprintf(
|
if _, err := fmt.Fprintf(
|
||||||
message,
|
message,
|
||||||
"%s <strong>HOST:</strong> %s is <strong>%s!</strong><br/>\n"+
|
"%s <strong>[%s] HOST:</strong> %s is <strong>%s!</strong><br/>\n"+
|
||||||
"<strong>When:</strong> %s<br/>\n"+
|
"<strong>When:</strong> %s<br/>\n"+
|
||||||
"<strong>Info:</strong> %s<br/>\n",
|
"<strong>Info:</strong> %s<br/>\n",
|
||||||
getIcon(p.HostState),
|
getIcon(string(p.HostState)),
|
||||||
|
p.NotificationType,
|
||||||
p.HostDisplayName, p.HostState,
|
p.HostDisplayName, p.HostState,
|
||||||
p.LongDateTime, p.HostOutput); err != nil {
|
p.LongDateTime, p.HostOutput); err != nil {
|
||||||
return "", CouldNotWriteToBufferErr{err}
|
return "", CouldNotWriteToBufferErr{err}
|
||||||
|
@ -118,10 +120,11 @@ func BuildServiceNotification(p *ServiceParameters) (string, error) {
|
||||||
|
|
||||||
if _, err := fmt.Fprintf(
|
if _, err := fmt.Fprintf(
|
||||||
message,
|
message,
|
||||||
"%s <strong>Service:</strong> %s on %s is <strong>%s</strong>.<br/>\n"+
|
"%s <strong>[%s] Service:</strong> %s on %s is <strong>%s</strong>.<br/>\n"+
|
||||||
"<strong>When:</strong> %s<br/>\n"+
|
"<strong>When:</strong> %s<br/>\n"+
|
||||||
"<strong>Info:</strong> %s<br/>\n",
|
"<strong>Info:</strong> %s<br/>\n",
|
||||||
getIcon(p.ServiceState), p.ServiceDisplayName, p.HostDisplayName,
|
getIcon(string(p.ServiceState)), p.NotificationType,
|
||||||
|
p.ServiceDisplayName, p.HostDisplayName,
|
||||||
p.ServiceState, p.LongDateTime, p.ServiceOutput,
|
p.ServiceState, p.LongDateTime, p.ServiceOutput,
|
||||||
); err != nil {
|
); err != nil {
|
||||||
return "", CouldNotWriteToBufferErr{err}
|
return "", CouldNotWriteToBufferErr{err}
|
||||||
|
|
|
@ -13,12 +13,14 @@
|
||||||
//
|
//
|
||||||
// You should have received a copy of the GNU General Public License
|
// You should have received a copy of the GNU General Public License
|
||||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
package icinga2
|
package icinga2
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"net/url"
|
"net/url"
|
||||||
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
type URLValue struct {
|
type URLValue struct {
|
||||||
|
@ -44,6 +46,65 @@ func (u *URLValue) String() string {
|
||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type HostStateValue string
|
||||||
|
|
||||||
|
func (v *HostStateValue) Set(value string) error {
|
||||||
|
if strings.EqualFold(value, "Up") || strings.EqualFold(value, "Down") {
|
||||||
|
*v = HostStateValue(strings.ToUpper(value))
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return fmt.Errorf("invalid host state value: %s", value)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (v *HostStateValue) String() string {
|
||||||
|
return string(*v)
|
||||||
|
}
|
||||||
|
|
||||||
|
type ServiceStateValue string
|
||||||
|
|
||||||
|
func (v *ServiceStateValue) Set(value string) error {
|
||||||
|
allowedValues := []string{"OK", "Warning", "Critical", "Unknown"}
|
||||||
|
|
||||||
|
for _, allowed := range allowedValues {
|
||||||
|
if strings.EqualFold(value, allowed) {
|
||||||
|
*v = ServiceStateValue(strings.ToUpper(value))
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return fmt.Errorf("invalid service state value: %s", value)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (v *ServiceStateValue) String() string {
|
||||||
|
return string(*v)
|
||||||
|
}
|
||||||
|
|
||||||
|
type NotificationTypeValue string
|
||||||
|
|
||||||
|
func (v *NotificationTypeValue) Set(value string) error {
|
||||||
|
allowedValues := []string{
|
||||||
|
"DowntimeStart", "DowntimeEnd", "DownTimeRemoved", "Custom", "Acknowledgement", "Problem", "Recovery",
|
||||||
|
"FlappingStart", "FlappingEnd",
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, allowed := range allowedValues {
|
||||||
|
if strings.EqualFold(value, allowed) {
|
||||||
|
*v = NotificationTypeValue(strings.ToUpper(value))
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return fmt.Errorf("invalid notification type value: %s", value)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (v *NotificationTypeValue) String() string {
|
||||||
|
return string(*v)
|
||||||
|
}
|
||||||
|
|
||||||
type MatrixParameters struct {
|
type MatrixParameters struct {
|
||||||
MatrixRoom string
|
MatrixRoom string
|
||||||
MatrixServer URLValue
|
MatrixServer URLValue
|
||||||
|
@ -51,12 +112,13 @@ type MatrixParameters struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *MatrixParameters) HasRequired() bool {
|
func (m *MatrixParameters) HasRequired() bool {
|
||||||
return m.MatrixRoom != "" && m.MatrixServer.URL != nil && m.MatrixToken != ""
|
return !(m.MatrixRoom == "" || m.MatrixServer.URL == nil || m.MatrixToken == "")
|
||||||
}
|
}
|
||||||
|
|
||||||
type BaseParameters struct {
|
type BaseParameters struct {
|
||||||
NotificationAuthorName string
|
NotificationAuthorName string
|
||||||
NotificationComment string
|
NotificationComment string
|
||||||
|
NotificationType NotificationTypeValue
|
||||||
IcingaWeb2URL URLValue
|
IcingaWeb2URL URLValue
|
||||||
LongDateTime string
|
LongDateTime string
|
||||||
Hostname string
|
Hostname string
|
||||||
|
@ -66,12 +128,12 @@ type BaseParameters struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p BaseParameters) HasRequired() bool {
|
func (p BaseParameters) HasRequired() bool {
|
||||||
return p.LongDateTime != "" && p.Hostname != "" && p.HostDisplayName != ""
|
return !(p.LongDateTime == "" || p.Hostname == "" || p.HostDisplayName == "" || p.NotificationType == "")
|
||||||
}
|
}
|
||||||
|
|
||||||
type HostParameters struct {
|
type HostParameters struct {
|
||||||
HostOutput string
|
HostOutput string
|
||||||
HostState string
|
HostState HostStateValue
|
||||||
BaseParameters
|
BaseParameters
|
||||||
MatrixParameters
|
MatrixParameters
|
||||||
}
|
}
|
||||||
|
@ -89,7 +151,7 @@ type ServiceParameters struct {
|
||||||
ServiceName string
|
ServiceName string
|
||||||
ServiceDisplayName string
|
ServiceDisplayName string
|
||||||
ServiceOutput string
|
ServiceOutput string
|
||||||
ServiceState string
|
ServiceState ServiceStateValue
|
||||||
BaseParameters
|
BaseParameters
|
||||||
MatrixParameters
|
MatrixParameters
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,6 +13,7 @@
|
||||||
//
|
//
|
||||||
// You should have received a copy of the GNU General Public License
|
// You should have received a copy of the GNU General Public License
|
||||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
package matrix
|
package matrix
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
|
|
@ -13,6 +13,7 @@
|
||||||
//
|
//
|
||||||
// You should have received a copy of the GNU General Public License
|
// You should have received a copy of the GNU General Public License
|
||||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
package matrix
|
package matrix
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|
Loading…
Reference in a new issue