diff --git a/.golangci.yml b/.golangci.yml index 23e2762..dd8a079 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -23,6 +23,9 @@ linters: - linters: - errcheck path: _test.go + - linters: + - forbidigo + path: cmd/main.go - linters: - gochecknoinits path: internal/logging/sse.go diff --git a/cmd/main.go b/cmd/main.go index ab44ac9..2292bd9 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -1,9 +1,27 @@ package main import ( + "flag" + "fmt" + "os" + "github.com/jetkvm/kvm" ) func main() { + versionPtr := flag.Bool("version", false, "print version and exit") + versionJsonPtr := flag.Bool("version-json", false, "print version as json and exit") + flag.Parse() + + if *versionPtr || *versionJsonPtr { + versionData, err := kvm.GetVersionData(*versionJsonPtr) + if err != nil { + fmt.Printf("failed to get version data: %v\n", err) + os.Exit(1) + } + fmt.Println(string(versionData)) + return + } + kvm.Main() } diff --git a/dev_deploy.sh b/dev_deploy.sh index 059e416..90ced64 100755 --- a/dev_deploy.sh +++ b/dev_deploy.sh @@ -174,7 +174,7 @@ cd "${REMOTE_PATH}" chmod +x jetkvm_app_debug # Run the application in the background -PION_LOG_TRACE=${LOG_TRACE_SCOPES} GODEBUG=netdns=1 ./jetkvm_app_debug +PION_LOG_TRACE=${LOG_TRACE_SCOPES} ./jetkvm_app_debug | tee -a /tmp/jetkvm_app_debug.log EOF echo "Deployment complete." \ No newline at end of file diff --git a/native.go b/native.go index 92bb3a1..9807206 100644 --- a/native.go +++ b/native.go @@ -9,6 +9,7 @@ import ( "net" "os" "os/exec" + "strings" "sync" "time" @@ -366,6 +367,22 @@ func shouldOverwrite(destPath string, srcHash []byte) bool { return !bytes.Equal(srcHash, dstHash) } +func getNativeSha256() ([]byte, error) { + version, err := resource.ResourceFS.ReadFile("jetkvm_native.sha256") + if err != nil { + return nil, err + } + return version, nil +} + +func GetNativeVersion() (string, error) { + version, err := getNativeSha256() + if err != nil { + return "", err + } + return strings.TrimSpace(string(version)), nil +} + func ensureBinaryUpdated(destPath string) error { srcFile, err := resource.ResourceFS.Open("jetkvm_native") if err != nil { @@ -373,7 +390,7 @@ func ensureBinaryUpdated(destPath string) error { } defer srcFile.Close() - srcHash, err := resource.ResourceFS.ReadFile("jetkvm_native.sha256") + srcHash, err := getNativeSha256() if err != nil { nativeLogger.Debug().Msg("error reading embedded jetkvm_native.sha256, proceeding with update") srcHash = nil diff --git a/ota.go b/ota.go index cf97cc0..45603f0 100644 --- a/ota.go +++ b/ota.go @@ -50,6 +50,10 @@ const UpdateMetadataUrl = "https://api.jetkvm.com/releases" var builtAppVersion = "0.1.0+dev" +func GetBuiltAppVersion() string { + return builtAppVersion +} + func GetLocalVersion() (systemVersion *semver.Version, appVersion *semver.Version, err error) { appVersion, err = semver.NewVersion(builtAppVersion) if err != nil { diff --git a/version.go b/version.go new file mode 100644 index 0000000..ad774b6 --- /dev/null +++ b/version.go @@ -0,0 +1,56 @@ +package kvm + +import ( + "bytes" + "encoding/json" + "html/template" + "runtime" + + "github.com/prometheus/common/version" +) + +var versionInfoTmpl = ` +JetKVM Application, version {{.version}} (branch: {{.branch}}, revision: {{.revision}}) + build date: {{.buildDate}} + go version: {{.goVersion}} + platform: {{.platform}} + +{{if .nativeVersion}} +JetKVM Native, version {{.nativeVersion}} +{{end}} +` + +func GetVersionData(isJson bool) ([]byte, error) { + version.Version = GetBuiltAppVersion() + + m := map[string]string{ + "version": version.Version, + "revision": version.GetRevision(), + "branch": version.Branch, + "buildDate": version.BuildDate, + "goVersion": version.GoVersion, + "platform": runtime.GOOS + "/" + runtime.GOARCH, + } + + nativeVersion, err := GetNativeVersion() + if err == nil { + m["nativeVersion"] = nativeVersion + } + + if isJson { + jsonData, err := json.Marshal(m) + if err != nil { + return nil, err + } + return jsonData, nil + } + + t := template.Must(template.New("version").Parse(versionInfoTmpl)) + + var buf bytes.Buffer + if err := t.ExecuteTemplate(&buf, "version", m); err != nil { + return nil, err + } + + return buf.Bytes(), nil +}