Add version checking and show UI hint (#239)

This commit is contained in:
andig 2020-07-22 09:54:33 +02:00
parent 6adb0e9951
commit 5242f5c066
7 changed files with 203 additions and 125 deletions

View file

@ -1,6 +1,6 @@
.PHONY: default clean install lint test assets build binaries publish-images test-release release
TAG_NAME := $(shell git tag -l --contains HEAD)
TAG_NAME := $(shell git describe --abbrev=0 --tags)
SHA := $(shell git rev-parse --short HEAD)
VERSION := $(if $(TAG_NAME),$(TAG_NAME),$(SHA))

View file

@ -46,6 +46,8 @@
<body>
<div id="app">
<version installed="<<.Version>>" id="version-bar"></version>
<nav class="navbar navbar-expand-lg navbar-light bg-light">
<a class="navbar-brand" href="https://github.com/andig/evcc"><i class="text-primary fas fa-leaf mr-2"></i>evcc</a>
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNavAltMarkup"
@ -55,18 +57,34 @@
<div class="collapse navbar-collapse" id="navbarNavAltMarkup">
<div class="navbar-nav">
<router-link class="nav-item nav-link pb-1" to="/">Laden</router-link>
<!-- << range $idx, $link := .Links >> -->
<router-link class="nav-item nav-link pb-1" to="/links/<< $idx >>"><< $link.Title >></router-link>
<!-- << end >> -->
<!-- <<range $idx, $link := .Links>> -->
<router-link class="nav-item nav-link pb-1" to="/links/<<$idx>>"><<$link.Title>></router-link>
<!-- <<end>> -->
<router-link class="nav-item nav-link pb-1" to="/config">Konfiguration</router-link>
<a class="nav-item nav-link pb-1" href="https://github.com/andig/evcc/issues">Support</a>
</div>
</div>
</nav>
<message-toasts></message-toasts>
<router-view></router-view>
</div>
<script type="text/x-template" id="version-template">
<div class="row p-3 bg-warning collapse" ref="bar">
<div class="col-12">
Neue Version verfügbar!
Installiert: {{installed}}.
Verfügbar: {{state.availableVersion}}.
<b><a v-bind:href="'https://github.com/andig/evcc/releases/tag/'+state.availableVersion"
class="text-body pr-2">Download...</a></b>
<button type="button" class="close float-right" style="margin-top: -2px" aria-label="Close" data-toggle="collapse" data-target="#version-bar">
<span aria-hidden="true">&times;</span>
</button>
</div>
</div>
</script>
<script type="text/x-template" id="embed-template">
<div class="container mx-auto text-center">
<h1 class="display-4 pt-3" v-if="title">{{title}}</h1>
@ -351,7 +369,7 @@
<small class="text-muted">&copy; 2020</small>
</div>
<div class="col-6 text-right">
<small class="text-muted"><< .Version>> << if ne .Version .Commit>>(<< .Commit>>)<< end>></small>
<small class="text-muted"><<.Version>> <<if ne .Version .Commit>>(<<.Commit>>)<<end>></small>
</div>
</div>
</div>
@ -360,15 +378,15 @@
<script>
function routerLinks() {
return [
// << range $idx, $link := .Links >>
// <<range $idx, $link := .Links>>
{
title: "<< $link.Title >>",
subtitle: "<< $link.Subtitle >>",
img: "<< $link.Img >>",
iframe: "<< $link.Iframe >>",
link: "<< $link.Link >>"
title: "<<$link.Title>>",
subtitle: "<<$link.Subtitle>>",
img: "<<$link.Img>>",
iframe: "<<$link.Iframe>>",
link: "<<$link.Link>>"
},
// << end >>
// <<end>>
];
}
</script>

View file

@ -81,6 +81,7 @@ let formatter = {
let store = {
state: {
availableVersion: null,
loadpoints: [],
},
update: function(msg) {
@ -163,8 +164,8 @@ const toasts = new Vue({
});
Vue.component('message-toast', {
props: ['item'],
template: '#message-template',
props: ['item'],
mounted: function () {
const id = "#message-id-" + this.item.id;
$(id).toast('show');
@ -174,6 +175,24 @@ Vue.component('message-toast', {
},
});
Vue.component('version', {
template: '#version-template',
props: ['installed'],
data: function () {
return {
state: store.state,
};
},
watch: {
"state.availableVersion": function () {
if (this.installed != "<<.Version>>" && // go template parsed?
this.state.availableVersion != this.installed) {
$(this.$refs.bar).collapse("show");
}
}
}
});
Vue.component('modeswitch', {
template: '#mode-template',
data: function() {

View file

@ -7,11 +7,11 @@ import (
"github.com/andig/evcc/provider"
"github.com/andig/evcc/server"
"github.com/andig/evcc/server/updater"
"github.com/andig/evcc/util"
"github.com/spf13/cobra"
"github.com/spf13/viper"
latest "github.com/tcnksm/go-latest"
)
var (
@ -114,20 +114,6 @@ func Execute() {
}
}
// checkVersion validates if updates are available
func checkVersion() {
githubTag := &latest.GithubTag{
Owner: "andig",
Repository: "evcc",
}
if res, err := latest.Check(githubTag, server.Version); err == nil {
if res.Outdated {
log.INFO.Printf("updates available - please upgrade to %s", res.Current)
}
}
}
func run(cmd *cobra.Command, args []string) {
util.LogLevel(viper.GetString("log"), viper.GetStringMapString("levels"))
log.INFO.Printf("evcc %s (%s)", server.Version, server.Commit)
@ -136,8 +122,6 @@ func run(cmd *cobra.Command, args []string) {
conf := loadConfigFile(cfgFile)
util.LogLevel(viper.GetString("log"), viper.GetStringMapString("levels"))
go checkVersion()
uri := viper.GetString("uri")
log.INFO.Println("listening at", uri)
@ -172,6 +156,9 @@ func run(cmd *cobra.Command, args []string) {
valueChan := make(chan util.Param)
go tee.Run(valueChan)
// version check
go updater.Run(log, valueChan)
// capture log messages for UI
util.CaptureLogs(valueChan)

View file

@ -3561,110 +3561,115 @@ oJE6K0E084u3ea7ne0X73qsc2P2KOB+ngKecxITsMAgTVJfqMwAA//+21HeD5gEAAA==
"/index.html": {
name: "index.html",
local: "../assets/index.html",
size: 13624,
size: 14298,
modtime: 1566640112,
compressed: `
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
`,
},
"/js/app.js": {
name: "app.js",
local: "../assets/js/app.js",
size: 6792,
size: 7225,
modtime: 1566640112,
compressed: `
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
JiAeF0hccFuj/x0AAP//sWHskogaAAA=
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
fwUAAP//HalhmTkcAAA=
`,
},

49
server/updater/updater.go Normal file
View file

@ -0,0 +1,49 @@
package updater
import (
"time"
"github.com/andig/evcc/server"
"github.com/andig/evcc/util"
latest "github.com/tcnksm/go-latest"
)
var instance *updater
type updater struct {
log *util.Logger
cache chan<- util.Param
}
// Run regularly checks version
func Run(log *util.Logger, cache chan<- util.Param) {
instance = &updater{
log: log,
cache: cache,
}
instance.checkVersion()
for range time.NewTicker(24 * time.Hour).C {
instance.checkVersion()
}
}
// checkVersion validates if updates are available
func (u *updater) checkVersion() {
githubTag := &latest.GithubTag{
Owner: "andig",
Repository: "evcc",
}
if res, err := latest.Check(githubTag, server.Version); err == nil {
if res.Outdated {
u.log.INFO.Printf("new version available - please upgrade to %s", res.Current)
}
u.cache <- util.Param{
Key: "availableVersion",
Val: res.Current,
}
} else {
u.log.ERROR.Println("version check failed:", err)
}
}

View file

@ -2,7 +2,7 @@ package server
var (
// Version of executable
Version = "dev"
Version = "0.0.1-alpha"
// Commit of executable
Commit = "HEAD"
)