2018-03-01 08:10:04 +01:00
package healthcheck
2017-11-09 17:08:03 +01:00
import (
"crypto/tls"
2017-11-23 16:10:04 +01:00
"errors"
2017-11-09 17:08:03 +01:00
"fmt"
"net/http"
"os"
"time"
"github.com/containous/flaeg"
2018-03-01 08:10:04 +01:00
"github.com/containous/traefik/cmd"
2017-11-09 17:08:03 +01:00
"github.com/containous/traefik/configuration"
)
2018-03-01 08:10:04 +01:00
// NewCmd builds a new HealthCheck command
func NewCmd ( traefikConfiguration * cmd . TraefikConfiguration , traefikPointersConfiguration * cmd . TraefikConfiguration ) * flaeg . Command {
2017-11-09 17:08:03 +01:00
return & flaeg . Command {
Name : "healthcheck" ,
Description : ` Calls traefik /ping to check health (web provider must be enabled) ` ,
Config : traefikConfiguration ,
DefaultPointersConfig : traefikPointersConfiguration ,
2018-09-07 09:40:03 +02:00
Run : runCmd ( traefikConfiguration ) ,
2017-11-09 17:08:03 +01:00
Metadata : map [ string ] string {
"parseAllSources" : "true" ,
} ,
}
}
2018-03-01 08:10:04 +01:00
func runCmd ( traefikConfiguration * cmd . TraefikConfiguration ) func ( ) error {
2017-11-09 17:08:03 +01:00
return func ( ) error {
traefikConfiguration . GlobalConfiguration . SetEffectiveConfiguration ( traefikConfiguration . ConfigFile )
2018-03-01 08:10:04 +01:00
resp , errPing := Do ( traefikConfiguration . GlobalConfiguration )
2017-11-09 17:08:03 +01:00
if errPing != nil {
fmt . Printf ( "Error calling healthcheck: %s\n" , errPing )
os . Exit ( 1 )
}
if resp . StatusCode != http . StatusOK {
fmt . Printf ( "Bad healthcheck status: %s\n" , resp . Status )
os . Exit ( 1 )
}
fmt . Printf ( "OK: %s\n" , resp . Request . URL )
os . Exit ( 0 )
return nil
}
}
2017-11-23 16:10:04 +01:00
2018-03-01 08:10:04 +01:00
// Do try to do a healthcheck
func Do ( globalConfiguration configuration . GlobalConfiguration ) ( * http . Response , error ) {
2018-02-13 23:42:03 +01:00
if globalConfiguration . Ping == nil {
return nil , errors . New ( "please enable `ping` to use health check" )
}
2017-11-23 16:10:04 +01:00
pingEntryPoint , ok := globalConfiguration . EntryPoints [ globalConfiguration . Ping . EntryPoint ]
if ! ok {
2018-02-13 23:42:03 +01:00
return nil , errors . New ( "missing `ping` entrypoint" )
2017-11-23 16:10:04 +01:00
}
client := & http . Client { Timeout : 5 * time . Second }
protocol := "http"
if pingEntryPoint . TLS != nil {
protocol = "https"
tr := & http . Transport {
TLSClientConfig : & tls . Config { InsecureSkipVerify : true } ,
}
client . Transport = tr
}
2017-12-06 11:20:03 +01:00
path := "/"
if globalConfiguration . Web != nil {
path = globalConfiguration . Web . Path
}
return client . Head ( protocol + "://" + pingEntryPoint . Address + path + "ping" )
2017-11-23 16:10:04 +01:00
}