diff --git a/agent/go.mod b/agent/go.mod index 551dcaa..98872ec 100644 --- a/agent/go.mod +++ b/agent/go.mod @@ -5,6 +5,7 @@ go 1.24.1 require ( github.com/jackc/pgx/v4 v4.18.3 github.com/joho/godotenv v1.5.1 + gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df ) require ( @@ -15,8 +16,7 @@ require ( github.com/jackc/pgproto3/v2 v2.3.3 // indirect github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a // indirect github.com/jackc/pgtype v1.14.0 // indirect - golang.org/x/crypto v0.20.0 // indirect - golang.org/x/text v0.14.0 // indirect + golang.org/x/crypto v0.31.0 // indirect + golang.org/x/text v0.21.0 // indirect gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect - gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df // indirect ) diff --git a/agent/go.sum b/agent/go.sum index b2a3b40..cec31da 100644 --- a/agent/go.sum +++ b/agent/go.sum @@ -126,8 +126,8 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20201203163018-be400aefbc4c/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.20.0 h1:jmAMJJZXr5KiCw05dfYK9QnqaqKLYXijU23lsEdcQqg= -golang.org/x/crypto v0.20.0/go.mod h1:Xwo95rrVNIoSMx9wa1JroENMToLWn3RNVrTBpLHgZPQ= +golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U= +golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= @@ -156,8 +156,8 @@ golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190425163242-31fd60d6bfdc/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= diff --git a/agent/main.go b/agent/main.go index 3316dfb..391c158 100644 --- a/agent/main.go +++ b/agent/main.go @@ -319,66 +319,45 @@ func checkAndUpdateStatus(db *sql.DB, client *http.Client, apps []Application) { } hostIsIP := isIPAddress(parsedURL.Hostname()) + var isOnline bool - httpCtx, httpCancel := context.WithTimeout(context.Background(), 4*time.Second) - req, err := http.NewRequestWithContext(httpCtx, "HEAD", app.PublicURL, nil) + ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) + defer cancel() + + req, err := http.NewRequestWithContext(ctx, "GET", app.PublicURL, nil) if err != nil { fmt.Printf("%s Request creation failed: %v\n", logPrefix, err) - httpCancel() continue } resp, err := client.Do(req) - - if err != nil || (resp != nil && (resp.StatusCode == http.StatusMethodNotAllowed || resp.StatusCode == http.StatusNotImplemented)) { - if resp != nil && resp.Body != nil { - resp.Body.Close() - } - fmt.Printf("%s HEAD failed, trying GET...\n", logPrefix) - - req.Method = "GET" - resp, err = client.Do(req) - } - - var isOnline bool - if err == nil && resp != nil { - isOnline = (resp.StatusCode >= 200 && resp.StatusCode < 300) || - resp.StatusCode == 405 || - resp.StatusCode == 302 || - resp.StatusCode == 301 || - resp.StatusCode == 303 || - resp.StatusCode == 307 || - resp.StatusCode == 308 - resp.Body.Close() + if err == nil { + defer resp.Body.Close() + isOnline = resp.StatusCode >= 200 && resp.StatusCode < 400 + fmt.Printf("%s Response status: %d\n", logPrefix, resp.StatusCode) } else { - if err != nil { - fmt.Printf("%s HTTP error: %v\n", logPrefix, err) + fmt.Printf("%s Connection error: %v\n", logPrefix, err) - // Sonderbehandlung für IP-Adressen + TLS-Zertifikatfehler - if hostIsIP { - var urlErr *url.Error - if errors.As(err, &urlErr) { - var certErr x509.HostnameError - var unknownAuthErr x509.UnknownAuthorityError - if errors.As(urlErr.Err, &certErr) || errors.As(urlErr.Err, &unknownAuthErr) { - fmt.Printf("%s Ignoring TLS error for IP, marking as online.\n", logPrefix) - isOnline = true - } + if hostIsIP { + var urlErr *url.Error + if errors.As(err, &urlErr) { + var certErr x509.HostnameError + var unknownAuthErr x509.UnknownAuthorityError + if errors.As(urlErr.Err, &certErr) || errors.As(urlErr.Err, &unknownAuthErr) { + fmt.Printf("%s Ignoring TLS error for IP, marking as online\n", logPrefix) + isOnline = true } } } } - httpCancel() - if isOnline != app.Online { status := "offline" if isOnline { status = "online" } - message := notificationTemplate - message = strings.ReplaceAll(message, "!name", app.Name) + message := strings.ReplaceAll(notificationTemplate, "!name", app.Name) message = strings.ReplaceAll(message, "!url", app.PublicURL) message = strings.ReplaceAll(message, "!status", status) @@ -401,7 +380,7 @@ func checkAndUpdateStatus(db *sql.DB, client *http.Client, apps []Application) { app.ID, isOnline, ) if err != nil { - fmt.Printf("%s Insert into history failed: %v\n", logPrefix, err) + fmt.Printf("%s History insert failed: %v\n", logPrefix, err) } dbCancel2() }