diff --git a/cmd/gluetun/main.go b/cmd/gluetun/main.go index 2cde8f56..4876307e 100644 --- a/cmd/gluetun/main.go +++ b/cmd/gluetun/main.go @@ -20,6 +20,7 @@ import ( "github.com/qdm12/gluetun/internal/healthcheck" "github.com/qdm12/gluetun/internal/httpproxy" gluetunLogging "github.com/qdm12/gluetun/internal/logging" + "github.com/qdm12/gluetun/internal/models" "github.com/qdm12/gluetun/internal/openvpn" "github.com/qdm12/gluetun/internal/params" "github.com/qdm12/gluetun/internal/publicip" @@ -37,11 +38,11 @@ import ( ) //nolint:gochecknoglobals -var ( - version = "unknown" - commit = "unknown" - buildDate = "an unknown date" -) +var buildInfo = models.BuildInformation{ + Version: "unknown", + Commit: "unknown", + BuildDate: "an unknown date", +} func main() { ctx := context.Background() @@ -86,7 +87,7 @@ func _main(background context.Context, args []string) int { //nolint:gocognit,go streamMerger := command.NewStreamMerger() paramsReader := params.NewReader(logger, fileManager) - fmt.Println(gluetunLogging.Splash(version, commit, buildDate)) + fmt.Println(gluetunLogging.Splash(buildInfo)) printVersions(ctx, logger, map[string]func(ctx context.Context) (string, error){ "OpenVPN": ovpnConf.Version, @@ -262,7 +263,7 @@ func _main(background context.Context, args []string) int { //nolint:gocognit,go controlServerAddress := fmt.Sprintf("0.0.0.0:%d", allSettings.ControlServer.Port) controlServerLogging := allSettings.ControlServer.Log httpServer := server.New(controlServerAddress, controlServerLogging, - logger, openvpnLooper, unboundLooper, updaterLooper) + logger, buildInfo, openvpnLooper, unboundLooper, updaterLooper) wg.Add(1) go httpServer.Run(ctx, wg) @@ -434,7 +435,7 @@ func routeReadyEvents(ctx context.Context, wg *sync.WaitGroup, tunnelReadyCh, dn if !versionInformation { break } - message, err := versionpkg.GetMessage(ctx, version, commit, httpClient) + message, err := versionpkg.GetMessage(ctx, buildInfo, httpClient) if err != nil { logger.Error(err) break diff --git a/internal/logging/splash.go b/internal/logging/splash.go index 7bf616fe..d286c70b 100644 --- a/internal/logging/splash.go +++ b/internal/logging/splash.go @@ -7,13 +7,15 @@ import ( "github.com/kyokomi/emoji" "github.com/qdm12/gluetun/internal/constants" + "github.com/qdm12/gluetun/internal/models" ) // Splash returns the welcome spash message. -func Splash(version, commit, buildDate string) string { +func Splash(buildInfo models.BuildInformation) string { lines := title() lines = append(lines, "") - lines = append(lines, fmt.Sprintf("Running version %s built on %s (commit %s)", version, buildDate, commit)) + lines = append(lines, fmt.Sprintf("Running version %s built on %s (commit %s)", + buildInfo.Version, buildInfo.BuildDate, buildInfo.Commit)) lines = append(lines, "") lines = append(lines, announcement()...) lines = append(lines, "") diff --git a/internal/models/build.go b/internal/models/build.go new file mode 100644 index 00000000..2034e584 --- /dev/null +++ b/internal/models/build.go @@ -0,0 +1,7 @@ +package models + +type BuildInformation struct { + Version string `json:"version"` + Commit string `json:"commit"` + BuildDate string `json:"buildDate"` +} diff --git a/internal/server/server.go b/internal/server/server.go index 4ad15465..34a228a2 100644 --- a/internal/server/server.go +++ b/internal/server/server.go @@ -3,12 +3,12 @@ package server import ( "context" "fmt" - "net" "net/http" "sync" "time" "github.com/qdm12/gluetun/internal/dns" + "github.com/qdm12/gluetun/internal/models" "github.com/qdm12/gluetun/internal/openvpn" "github.com/qdm12/gluetun/internal/updater" "github.com/qdm12/golibs/logging" @@ -22,22 +22,22 @@ type server struct { address string logging bool logger logging.Logger + buildInfo models.BuildInformation openvpnLooper openvpn.Looper unboundLooper dns.Looper updaterLooper updater.Looper - lookupIP func(host string) ([]net.IP, error) } -func New(address string, logging bool, logger logging.Logger, +func New(address string, logging bool, logger logging.Logger, buildInfo models.BuildInformation, openvpnLooper openvpn.Looper, unboundLooper dns.Looper, updaterLooper updater.Looper) Server { return &server{ address: address, logging: logging, logger: logger.WithPrefix("http server: "), + buildInfo: buildInfo, openvpnLooper: openvpnLooper, unboundLooper: unboundLooper, updaterLooper: updaterLooper, - lookupIP: net.LookupIP, } } @@ -68,6 +68,9 @@ func (s *server) makeHandler() http.HandlerFunc { switch r.Method { case http.MethodGet: switch r.RequestURI { + case "/version": + s.handleGetVersion(w) + w.WriteHeader(http.StatusOK) case "/openvpn/actions/restart": s.openvpnLooper.Restart() w.WriteHeader(http.StatusOK) diff --git a/internal/server/version.go b/internal/server/version.go new file mode 100644 index 00000000..1d81ebed --- /dev/null +++ b/internal/server/version.go @@ -0,0 +1,19 @@ +package server + +import ( + "encoding/json" + "net/http" +) + +func (s *server) handleGetVersion(w http.ResponseWriter) { + data, err := json.Marshal(s.buildInfo) + if err != nil { + s.logger.Warn(err) + w.WriteHeader(http.StatusInternalServerError) + return + } + if _, err := w.Write(data); err != nil { + s.logger.Warn(err) + w.WriteHeader(http.StatusInternalServerError) + } +} diff --git a/internal/version/version.go b/internal/version/version.go index 7ca79f6f..b654774e 100644 --- a/internal/version/version.go +++ b/internal/version/version.go @@ -7,31 +7,33 @@ import ( "time" "github.com/qdm12/gluetun/internal/logging" + "github.com/qdm12/gluetun/internal/models" ) // GetMessage returns a message for the user describing if there is a newer version // available. It should only be called once the tunnel is established. -func GetMessage(ctx context.Context, version, commitShort string, client *http.Client) (message string, err error) { - if version == "latest" { +func GetMessage(ctx context.Context, buildInfo models.BuildInformation, + client *http.Client) (message string, err error) { + if buildInfo.Version == "latest" { // Find # of commits between current commit and latest commit - commitsSince, err := getCommitsSince(ctx, client, commitShort) + commitsSince, err := getCommitsSince(ctx, client, buildInfo.Commit) if err != nil { return "", fmt.Errorf("cannot get version information: %w", err) } else if commitsSince == 0 { - return fmt.Sprintf("You are running on the bleeding edge of %s!", version), nil + return fmt.Sprintf("You are running on the bleeding edge of %s!", buildInfo.Version), nil } commits := "commits" if commitsSince == 1 { commits = "commit" } - return fmt.Sprintf("You are running %d %s behind the most recent %s", commitsSince, commits, version), nil + return fmt.Sprintf("You are running %d %s behind the most recent %s", commitsSince, commits, buildInfo.Version), nil } tagName, name, releaseTime, err := getLatestRelease(ctx, client) if err != nil { return "", fmt.Errorf("cannot get version information: %w", err) } - if tagName == version { - return fmt.Sprintf("You are running the latest release %s", version), nil + if tagName == buildInfo.Version { + return fmt.Sprintf("You are running the latest release %s", buildInfo.Version), nil } timeSinceRelease := logging.FormatDuration(time.Since(releaseTime)) return fmt.Sprintf("There is a new release %s (%s) created %s ago",