87 lines
2.5 KiB
Go
87 lines
2.5 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"net"
|
|
"os"
|
|
"os/exec"
|
|
"strings"
|
|
)
|
|
|
|
func main() {
|
|
hostnames := os.Getenv("HOST_CHECK_HOSTNAMES")
|
|
if hostnames == "" {
|
|
fmt.Println("Error: Environment variable HOST_CHECK_HOSTNAMES not set or empty.")
|
|
return
|
|
}
|
|
hosts := strings.Split(hostnames, ",")
|
|
|
|
failOnError := os.Getenv("HOST_CHECK_FAIL_ON_ERROR") == "true"
|
|
hostCheckCommand := os.Getenv("HOST_CHECK_COMMAND")
|
|
errorCommandStr := os.Getenv("HOST_CHECK_ERROR_COMMAND")
|
|
|
|
allHostsSuccessful := true
|
|
|
|
for _, host := range hosts {
|
|
host = strings.TrimSpace(host)
|
|
fmt.Println("\n---", host, "---")
|
|
|
|
ip, err := net.LookupIP(host)
|
|
if err != nil {
|
|
fmt.Println("DNS Resolution Failed:", err)
|
|
allHostsSuccessful = false
|
|
executeCommand(strings.Replace(errorCommandStr, "<hostname>", host, -1)) // Execute error command immediately
|
|
if failOnError {
|
|
os.Exit(1)
|
|
}
|
|
continue
|
|
}
|
|
fmt.Println("Resolved IPs:", ip)
|
|
|
|
err = executePing(host)
|
|
if err != nil {
|
|
fmt.Println("Ping Failed:", err)
|
|
allHostsSuccessful = false
|
|
executeCommand(strings.Replace(errorCommandStr, "<hostname>", host, -1)) // Execute error command immediately
|
|
if failOnError {
|
|
os.Exit(1)
|
|
}
|
|
continue
|
|
}
|
|
|
|
fmt.Println("Ping Successful")
|
|
}
|
|
|
|
if !failOnError && allHostsSuccessful && hostCheckCommand != "" {
|
|
fmt.Println("Executing HOST_CHECK_COMMAND as all hosts were successful.")
|
|
executeCommand(hostCheckCommand)
|
|
}
|
|
}
|
|
|
|
func executeCommand(commandStr string) {
|
|
if commandStr == "" {
|
|
return
|
|
}
|
|
commandStr = strings.Replace(commandStr, "<hostname>", "the host", -1) // Ensure no placeholder remains
|
|
cmdParts := strings.Fields(commandStr)
|
|
cmd := exec.Command(cmdParts[0], cmdParts[1:]...)
|
|
cmdOutput, err := cmd.CombinedOutput()
|
|
if err != nil {
|
|
fmt.Printf("Command Execution Failed: %s, %v\n", commandStr, err)
|
|
} else {
|
|
fmt.Printf("Command Output:\n%s\n", string(cmdOutput))
|
|
}
|
|
}
|
|
|
|
func executePing(host string) error {
|
|
cmd := exec.Command("ping", "-c", "3", host)
|
|
cmdOutput, err := cmd.CombinedOutput()
|
|
if err != nil {
|
|
fmt.Printf("Ping Command Output: %s\n", string(cmdOutput))
|
|
return err
|
|
}
|
|
fmt.Printf("Ping Command Output: %s\n", string(cmdOutput))
|
|
return nil
|
|
}
|
|
|