From 80177aa0ad037ceb83b4d62a6196cbcad77872a3 Mon Sep 17 00:00:00 2001 From: andig Date: Fri, 21 May 2021 19:18:14 +0200 Subject: [PATCH] Restructure device tree and remove soc server (#1060) --- Makefile | 11 +- api/plugin.go | 4 + {soc => api}/proto/auth.proto | 0 {soc => api}/proto/pb/auth.pb.go | 0 {soc => api}/proto/pb/auth_grpc.pb.go | 0 {soc => api}/proto/pb/vehicle.pb.go | 0 {soc => api}/proto/pb/vehicle_grpc.pb.go | 0 {soc => api}/proto/vehicle.proto | 0 {internal/charger => charger}/charger.go | 3 +- {internal/charger => charger}/config.go | 0 {internal/charger => charger}/config_test.go | 0 {internal/charger => charger}/easee.go | 2 +- {internal/charger => charger}/easee/LICENSE | 0 .../charger => charger}/easee/identity.go | 0 .../charger => charger}/easee/message.go | 0 {internal/charger => charger}/evsewifi.go | 2 +- .../evsewifi_decorators.go | 0 .../charger => charger}/evsewifi_test.go | 0 {internal/charger => charger}/fritzdect.go | 2 +- .../charger => charger}/fritzdect/types.go | 0 {internal/charger => charger}/go-e.go | 0 {internal/charger => charger}/go-e_test.go | 0 {internal/charger => charger}/keba.go | 2 +- .../charger => charger}/keba/listener.go | 0 {internal/charger => charger}/keba/reports.go | 0 {internal/charger => charger}/keba/sender.go | 0 {internal/charger => charger}/keba_test.go | 0 {internal/charger => charger}/mcc.go | 0 {internal/charger => charger}/mcc_test.go | 0 {internal/charger => charger}/nrgble.go | 0 .../charger => charger}/nrgble/nrg_linux.go | 0 .../charger => charger}/nrgble/service.go | 0 {internal/charger => charger}/nrgble_linux.go | 2 +- .../charger => charger}/nrgble_linux_test.go | 0 {internal/charger => charger}/nrgconnect.go | 0 .../charger => charger}/nrgconnect_test.go | 0 {internal/charger => charger}/openwb.go | 2 +- .../charger => charger}/openwb/topics.go | 0 {internal/charger => charger}/openwb_test.go | 0 .../charger => charger}/phoenix-em-eth.go | 2 +- .../phoenix-em-eth_decorators.go | 0 .../phoenix-em-eth_test.go | 0 .../charger => charger}/phoenix-ev-eth.go | 2 +- .../phoenix-ev-eth_decorators.go | 0 .../phoenix-ev-eth_test.go | 0 .../charger => charger}/phoenix-ev-ser.go | 0 {internal/charger => charger}/shelly.go | 0 {internal/charger => charger}/simpleevse.go | 0 {internal/charger => charger}/tasmota.go | 2 +- .../charger => charger}/tasmota/types.go | 0 {internal/charger => charger}/tplink.go | 2 +- {internal/charger => charger}/tplink/types.go | 0 .../charger => charger}/tplink/types_test.go | 0 {internal/charger => charger}/wallbe.go | 0 .../charger => charger}/wallbe_decorators.go | 0 {internal/charger => charger}/wallbe_test.go | 0 {internal/charger => charger}/warp.go | 2 +- .../charger => charger}/warp_decorators.go | 0 cmd/config.go | 6 +- cmd/setup.go | 2 +- {soc/client => cmd/soc}/main.go | 2 +- detect/tasks/keba.go | 2 +- detect/tasks/sma.go | 2 +- go.mod | 5 +- go.sum | 5 - internal/const.go | 4 - {internal/meter => meter}/config.go | 0 {internal/meter => meter}/config_test.go | 0 {internal/meter => meter}/discovergy.go | 0 {internal/meter => meter}/meter.go | 5 +- {internal/meter => meter}/meter_decorators.go | 0 {internal/meter => meter}/modbus.go | 2 +- .../meter => meter}/modbus_decorators.go | 0 {internal/meter => meter}/openwb.go | 2 +- .../meter => meter}/powerwall/powerwall.go | 0 {internal/meter => meter}/sma.go | 4 +- {internal/meter => meter}/sma/listener.go | 0 .../meter => meter}/sma/listener_test.go | 0 {internal/meter => meter}/sma_decorators.go | 0 {internal/meter => meter}/sma_test.go | 2 +- {internal/meter => meter}/tesla.go | 4 +- {internal/meter => meter}/tesla_decorators.go | 0 soc/Dockerfile | 35 --- soc/cert/ca/ca-cert.pem | 28 -- soc/cert/ca/cert.go | 14 - soc/cert/create.sh | 31 -- soc/cert/server/cert.go | 33 -- soc/cert/server/server-cert.pem | 29 -- soc/cert/server/server-ext.cnf | 1 - soc/server/auth/auth.go | 88 ------ soc/server/auth/sponsor/sponsor.go | 79 ----- soc/server/main.go | 18 -- soc/server/server/auth.go | 47 --- soc/server/server/init.go | 74 ----- soc/server/server/prom.go | 35 --- soc/server/server/vehicle.go | 149 --------- soc/server/ui/index.html | 131 -------- soc/server/ui/privacy.html | 220 ------------- soc/server/ui/ui.go | 297 ------------------ util/cloud/ca-cert.pem | 28 -- util/cloud/cert.go | 14 - util/cloud/client.go | 29 +- {internal/vehicle => vehicle}/audi.go | 2 +- .../693a33fa-c117-43f2-ae3b-61a02d24f417 | 0 .../99cfff84-f4e2-4be8-a5ed-e5b755eb6581 | 0 {internal/vehicle => vehicle}/bluelink/api.go | 0 .../vehicle => vehicle}/bluelink/identity.go | 0 .../vehicle => vehicle}/bluelink/provider.go | 0 .../vehicle => vehicle}/bluelink/stamps.go | 0 {internal/vehicle => vehicle}/bmw.go | 0 {internal/vehicle => vehicle}/carwings.go | 0 {internal/vehicle => vehicle}/cloud.go | 2 +- {internal/vehicle => vehicle}/config.go | 0 {internal/vehicle => vehicle}/config_test.go | 0 {internal/vehicle => vehicle}/enyaq.go | 4 +- {internal/vehicle => vehicle}/ford.go | 0 {internal/vehicle => vehicle}/helper.go | 0 {internal/vehicle => vehicle}/hyundai.go | 2 +- {internal/vehicle => vehicle}/id.go | 4 +- {internal/vehicle => vehicle}/id/api.go | 0 {internal/vehicle => vehicle}/id/provider.go | 0 {internal/vehicle => vehicle}/id/refresh.go | 0 {internal/vehicle => vehicle}/id/token.go | 0 .../vehicle => vehicle}/id/token_test.go | 0 {internal/vehicle => vehicle}/kamereon/api.go | 0 {internal/vehicle => vehicle}/kia.go | 2 +- {internal/vehicle => vehicle}/nissan.go | 4 +- {internal/vehicle => vehicle}/nissan/api.go | 2 +- .../vehicle => vehicle}/nissan/identity.go | 0 {internal/vehicle => vehicle}/nissan/types.go | 0 {internal/vehicle => vehicle}/niu.go | 2 +- {internal/vehicle => vehicle}/niu/types.go | 0 .../vehicle => vehicle}/niu/types_test.go | 0 {internal/vehicle => vehicle}/porsche.go | 2 +- .../vehicle => vehicle}/porsche/identity.go | 0 .../vehicle => vehicle}/porsche/provider.go | 0 .../porsche/provider_emobility.go | 0 {internal/vehicle => vehicle}/psa.go | 2 +- {internal/vehicle => vehicle}/psa/api.go | 0 {internal/vehicle => vehicle}/psa/duration.go | 0 {internal/vehicle => vehicle}/psa/provider.go | 0 {internal/vehicle => vehicle}/renault.go | 0 {internal/vehicle => vehicle}/seat.go | 2 +- {internal/vehicle => vehicle}/skoda.go | 2 +- {internal/vehicle => vehicle}/skoda/api.go | 0 .../vehicle => vehicle}/skoda/provider.go | 0 .../vehicle => vehicle}/skoda/refresh.go | 0 {internal/vehicle => vehicle}/tesla.go | 0 {internal/vehicle => vehicle}/vehicle.go | 5 +- .../vehicle => vehicle}/vehicle_decorators.go | 0 {internal/vehicle => vehicle}/volvo.go | 0 {internal/vehicle => vehicle}/vw.go | 2 +- {internal/vehicle => vehicle}/vw/api.go | 0 {internal/vehicle => vehicle}/vw/forms.go | 0 {internal/vehicle => vehicle}/vw/functions.go | 0 {internal/vehicle => vehicle}/vw/identity.go | 4 +- {internal/vehicle => vehicle}/vw/provider.go | 0 {internal/vehicle => vehicle}/vw/refresh.go | 0 {internal/vehicle => vehicle}/vw/types.go | 0 .../vehicle => vehicle}/vw/types_test.go | 0 160 files changed, 60 insertions(+), 1450 deletions(-) create mode 100644 api/plugin.go rename {soc => api}/proto/auth.proto (100%) rename {soc => api}/proto/pb/auth.pb.go (100%) rename {soc => api}/proto/pb/auth_grpc.pb.go (100%) rename {soc => api}/proto/pb/vehicle.pb.go (100%) rename {soc => api}/proto/pb/vehicle_grpc.pb.go (100%) rename {soc => api}/proto/vehicle.proto (100%) rename {internal/charger => charger}/charger.go (96%) rename {internal/charger => charger}/config.go (100%) rename {internal/charger => charger}/config_test.go (100%) rename {internal/charger => charger}/easee.go (99%) rename {internal/charger => charger}/easee/LICENSE (100%) rename {internal/charger => charger}/easee/identity.go (100%) rename {internal/charger => charger}/easee/message.go (100%) rename {internal/charger => charger}/evsewifi.go (95%) rename {internal/charger => charger}/evsewifi_decorators.go (100%) rename {internal/charger => charger}/evsewifi_test.go (100%) rename {internal/charger => charger}/fritzdect.go (99%) rename {internal/charger => charger}/fritzdect/types.go (100%) rename {internal/charger => charger}/go-e.go (100%) rename {internal/charger => charger}/go-e_test.go (100%) rename {internal/charger => charger}/keba.go (99%) rename {internal/charger => charger}/keba/listener.go (100%) rename {internal/charger => charger}/keba/reports.go (100%) rename {internal/charger => charger}/keba/sender.go (100%) rename {internal/charger => charger}/keba_test.go (100%) rename {internal/charger => charger}/mcc.go (100%) rename {internal/charger => charger}/mcc_test.go (100%) rename {internal/charger => charger}/nrgble.go (100%) rename {internal/charger => charger}/nrgble/nrg_linux.go (100%) rename {internal/charger => charger}/nrgble/service.go (100%) rename {internal/charger => charger}/nrgble_linux.go (99%) rename {internal/charger => charger}/nrgble_linux_test.go (100%) rename {internal/charger => charger}/nrgconnect.go (100%) rename {internal/charger => charger}/nrgconnect_test.go (100%) rename {internal/charger => charger}/openwb.go (98%) rename {internal/charger => charger}/openwb/topics.go (100%) rename {internal/charger => charger}/openwb_test.go (100%) rename {internal/charger => charger}/phoenix-em-eth.go (93%) rename {internal/charger => charger}/phoenix-em-eth_decorators.go (100%) rename {internal/charger => charger}/phoenix-em-eth_test.go (100%) rename {internal/charger => charger}/phoenix-ev-eth.go (94%) rename {internal/charger => charger}/phoenix-ev-eth_decorators.go (100%) rename {internal/charger => charger}/phoenix-ev-eth_test.go (100%) rename {internal/charger => charger}/phoenix-ev-ser.go (100%) rename {internal/charger => charger}/shelly.go (100%) rename {internal/charger => charger}/simpleevse.go (100%) rename {internal/charger => charger}/tasmota.go (98%) rename {internal/charger => charger}/tasmota/types.go (100%) rename {internal/charger => charger}/tplink.go (98%) rename {internal/charger => charger}/tplink/types.go (100%) rename {internal/charger => charger}/tplink/types_test.go (100%) rename {internal/charger => charger}/wallbe.go (100%) rename {internal/charger => charger}/wallbe_decorators.go (100%) rename {internal/charger => charger}/wallbe_test.go (100%) rename {internal/charger => charger}/warp.go (97%) rename {internal/charger => charger}/warp_decorators.go (100%) rename {soc/client => cmd/soc}/main.go (97%) delete mode 100644 internal/const.go rename {internal/meter => meter}/config.go (100%) rename {internal/meter => meter}/config_test.go (100%) rename {internal/meter => meter}/discovergy.go (100%) rename {internal/meter => meter}/meter.go (91%) rename {internal/meter => meter}/meter_decorators.go (100%) rename {internal/meter => meter}/modbus.go (95%) rename {internal/meter => meter}/modbus_decorators.go (100%) rename {internal/meter => meter}/openwb.go (98%) rename {internal/meter => meter}/powerwall/powerwall.go (100%) rename {internal/meter => meter}/sma.go (95%) rename {internal/meter => meter}/sma/listener.go (100%) rename {internal/meter => meter}/sma/listener_test.go (100%) rename {internal/meter => meter}/sma_decorators.go (100%) rename {internal/meter => meter}/sma_test.go (97%) rename {internal/meter => meter}/tesla.go (93%) rename {internal/meter => meter}/tesla_decorators.go (100%) delete mode 100644 soc/Dockerfile delete mode 100644 soc/cert/ca/ca-cert.pem delete mode 100644 soc/cert/ca/cert.go delete mode 100755 soc/cert/create.sh delete mode 100644 soc/cert/server/cert.go delete mode 100644 soc/cert/server/server-cert.pem delete mode 100644 soc/cert/server/server-ext.cnf delete mode 100644 soc/server/auth/auth.go delete mode 100644 soc/server/auth/sponsor/sponsor.go delete mode 100644 soc/server/main.go delete mode 100644 soc/server/server/auth.go delete mode 100644 soc/server/server/init.go delete mode 100644 soc/server/server/prom.go delete mode 100644 soc/server/server/vehicle.go delete mode 100644 soc/server/ui/index.html delete mode 100644 soc/server/ui/privacy.html delete mode 100644 soc/server/ui/ui.go delete mode 100644 util/cloud/ca-cert.pem delete mode 100644 util/cloud/cert.go rename {internal/vehicle => vehicle}/audi.go (97%) rename {internal/vehicle => vehicle}/bluelink/693a33fa-c117-43f2-ae3b-61a02d24f417 (100%) rename {internal/vehicle => vehicle}/bluelink/99cfff84-f4e2-4be8-a5ed-e5b755eb6581 (100%) rename {internal/vehicle => vehicle}/bluelink/api.go (100%) rename {internal/vehicle => vehicle}/bluelink/identity.go (100%) rename {internal/vehicle => vehicle}/bluelink/provider.go (100%) rename {internal/vehicle => vehicle}/bluelink/stamps.go (100%) rename {internal/vehicle => vehicle}/bmw.go (100%) rename {internal/vehicle => vehicle}/carwings.go (100%) rename {internal/vehicle => vehicle}/cloud.go (98%) rename {internal/vehicle => vehicle}/config.go (100%) rename {internal/vehicle => vehicle}/config_test.go (100%) rename {internal/vehicle => vehicle}/enyaq.go (95%) rename {internal/vehicle => vehicle}/ford.go (100%) rename {internal/vehicle => vehicle}/helper.go (100%) rename {internal/vehicle => vehicle}/hyundai.go (97%) rename {internal/vehicle => vehicle}/id.go (94%) rename {internal/vehicle => vehicle}/id/api.go (100%) rename {internal/vehicle => vehicle}/id/provider.go (100%) rename {internal/vehicle => vehicle}/id/refresh.go (100%) rename {internal/vehicle => vehicle}/id/token.go (100%) rename {internal/vehicle => vehicle}/id/token_test.go (100%) rename {internal/vehicle => vehicle}/kamereon/api.go (100%) rename {internal/vehicle => vehicle}/kia.go (97%) rename {internal/vehicle => vehicle}/nissan.go (93%) rename {internal/vehicle => vehicle}/nissan/api.go (98%) rename {internal/vehicle => vehicle}/nissan/identity.go (100%) rename {internal/vehicle => vehicle}/nissan/types.go (100%) rename {internal/vehicle => vehicle}/niu.go (98%) rename {internal/vehicle => vehicle}/niu/types.go (100%) rename {internal/vehicle => vehicle}/niu/types_test.go (100%) rename {internal/vehicle => vehicle}/porsche.go (96%) rename {internal/vehicle => vehicle}/porsche/identity.go (100%) rename {internal/vehicle => vehicle}/porsche/provider.go (100%) rename {internal/vehicle => vehicle}/porsche/provider_emobility.go (100%) rename {internal/vehicle => vehicle}/psa.go (98%) rename {internal/vehicle => vehicle}/psa/api.go (100%) rename {internal/vehicle => vehicle}/psa/duration.go (100%) rename {internal/vehicle => vehicle}/psa/provider.go (100%) rename {internal/vehicle => vehicle}/renault.go (100%) rename {internal/vehicle => vehicle}/seat.go (97%) rename {internal/vehicle => vehicle}/skoda.go (97%) rename {internal/vehicle => vehicle}/skoda/api.go (100%) rename {internal/vehicle => vehicle}/skoda/provider.go (100%) rename {internal/vehicle => vehicle}/skoda/refresh.go (100%) rename {internal/vehicle => vehicle}/tesla.go (100%) rename {internal/vehicle => vehicle}/vehicle.go (90%) rename {internal/vehicle => vehicle}/vehicle_decorators.go (100%) rename {internal/vehicle => vehicle}/volvo.go (100%) rename {internal/vehicle => vehicle}/vw.go (97%) rename {internal/vehicle => vehicle}/vw/api.go (100%) rename {internal/vehicle => vehicle}/vw/forms.go (100%) rename {internal/vehicle => vehicle}/vw/functions.go (100%) rename {internal/vehicle => vehicle}/vw/identity.go (98%) rename {internal/vehicle => vehicle}/vw/provider.go (100%) rename {internal/vehicle => vehicle}/vw/refresh.go (100%) rename {internal/vehicle => vehicle}/vw/types.go (100%) rename {internal/vehicle => vehicle}/vw/types_test.go (100%) diff --git a/Makefile b/Makefile index 7999e58a0..a01e14c85 100644 --- a/Makefile +++ b/Makefile @@ -102,13 +102,4 @@ image-update: soc: @echo Version: $(VERSION) $(BUILD_DATE) - go build -o evcc-soc $(BUILD_TAGS) $(BUILD_ARGS) github.com/andig/evcc/soc/client - -server: - @echo Version: $(VERSION) $(BUILD_DATE) - go build -o soc-server $(BUILD_TAGS) $(BUILD_ARGS) github.com/andig/evcc/soc/server - -publish-server: - GOOS=linux GOARCH=amd64 go build -o soc-server $(BUILD_TAGS) $(BUILD_ARGS) github.com/andig/evcc/soc/server - docker build -f soc/Dockerfile --platform linux/amd64 -t andig/evcc-cloud . - docker push andig/evcc-cloud + go build -o evcc-soc $(BUILD_TAGS) $(BUILD_ARGS) github.com/andig/evcc/cmd/soc diff --git a/api/plugin.go b/api/plugin.go new file mode 100644 index 000000000..1d0f2667b --- /dev/null +++ b/api/plugin.go @@ -0,0 +1,4 @@ +package api + +// Custom meter/charger/vehicle type +const Custom = "custom" diff --git a/soc/proto/auth.proto b/api/proto/auth.proto similarity index 100% rename from soc/proto/auth.proto rename to api/proto/auth.proto diff --git a/soc/proto/pb/auth.pb.go b/api/proto/pb/auth.pb.go similarity index 100% rename from soc/proto/pb/auth.pb.go rename to api/proto/pb/auth.pb.go diff --git a/soc/proto/pb/auth_grpc.pb.go b/api/proto/pb/auth_grpc.pb.go similarity index 100% rename from soc/proto/pb/auth_grpc.pb.go rename to api/proto/pb/auth_grpc.pb.go diff --git a/soc/proto/pb/vehicle.pb.go b/api/proto/pb/vehicle.pb.go similarity index 100% rename from soc/proto/pb/vehicle.pb.go rename to api/proto/pb/vehicle.pb.go diff --git a/soc/proto/pb/vehicle_grpc.pb.go b/api/proto/pb/vehicle_grpc.pb.go similarity index 100% rename from soc/proto/pb/vehicle_grpc.pb.go rename to api/proto/pb/vehicle_grpc.pb.go diff --git a/soc/proto/vehicle.proto b/api/proto/vehicle.proto similarity index 100% rename from soc/proto/vehicle.proto rename to api/proto/vehicle.proto diff --git a/internal/charger/charger.go b/charger/charger.go similarity index 96% rename from internal/charger/charger.go rename to charger/charger.go index 1137757f2..dc48ca40d 100644 --- a/internal/charger/charger.go +++ b/charger/charger.go @@ -4,7 +4,6 @@ import ( "fmt" "github.com/andig/evcc/api" - "github.com/andig/evcc/internal" "github.com/andig/evcc/provider" "github.com/andig/evcc/util" ) @@ -19,7 +18,7 @@ type Charger struct { func init() { registry.Add("default", NewConfigurableFromConfig) - registry.Add(internal.Custom, NewConfigurableFromConfig) + registry.Add(api.Custom, NewConfigurableFromConfig) } // NewConfigurableFromConfig creates a new configurable charger diff --git a/internal/charger/config.go b/charger/config.go similarity index 100% rename from internal/charger/config.go rename to charger/config.go diff --git a/internal/charger/config_test.go b/charger/config_test.go similarity index 100% rename from internal/charger/config_test.go rename to charger/config_test.go diff --git a/internal/charger/easee.go b/charger/easee.go similarity index 99% rename from internal/charger/easee.go rename to charger/easee.go index 9a03bb7b3..6a3e253e3 100644 --- a/internal/charger/easee.go +++ b/charger/easee.go @@ -7,8 +7,8 @@ import ( "time" "github.com/andig/evcc/api" + "github.com/andig/evcc/charger/easee" "github.com/andig/evcc/core" - "github.com/andig/evcc/internal/charger/easee" "github.com/andig/evcc/util" "github.com/andig/evcc/util/request" "github.com/andig/evcc/util/sponsor" diff --git a/internal/charger/easee/LICENSE b/charger/easee/LICENSE similarity index 100% rename from internal/charger/easee/LICENSE rename to charger/easee/LICENSE diff --git a/internal/charger/easee/identity.go b/charger/easee/identity.go similarity index 100% rename from internal/charger/easee/identity.go rename to charger/easee/identity.go diff --git a/internal/charger/easee/message.go b/charger/easee/message.go similarity index 100% rename from internal/charger/easee/message.go rename to charger/easee/message.go diff --git a/internal/charger/evsewifi.go b/charger/evsewifi.go similarity index 95% rename from internal/charger/evsewifi.go rename to charger/evsewifi.go index 20f6fb628..49c5b8d90 100644 --- a/internal/charger/evsewifi.go +++ b/charger/evsewifi.go @@ -58,7 +58,7 @@ func init() { registry.Add("evsewifi", NewEVSEWifiFromConfig) } -//go:generate go run ../../cmd/tools/decorate.go -f decorateEVSE -b *EVSEWifi -r api.Charger -t "api.Meter,CurrentPower,func() (float64, error)" -t "api.MeterEnergy,TotalEnergy,func() (float64, error)" -t "api.MeterCurrent,Currents,func() (float64, float64, float64, error)" +//go:generate go run ../cmd/tools/decorate.go -f decorateEVSE -b *EVSEWifi -r api.Charger -t "api.Meter,CurrentPower,func() (float64, error)" -t "api.MeterEnergy,TotalEnergy,func() (float64, error)" -t "api.MeterCurrent,Currents,func() (float64, float64, float64, error)" // NewEVSEWifiFromConfig creates a EVSEWifi charger from generic config func NewEVSEWifiFromConfig(other map[string]interface{}) (api.Charger, error) { diff --git a/internal/charger/evsewifi_decorators.go b/charger/evsewifi_decorators.go similarity index 100% rename from internal/charger/evsewifi_decorators.go rename to charger/evsewifi_decorators.go diff --git a/internal/charger/evsewifi_test.go b/charger/evsewifi_test.go similarity index 100% rename from internal/charger/evsewifi_test.go rename to charger/evsewifi_test.go diff --git a/internal/charger/fritzdect.go b/charger/fritzdect.go similarity index 99% rename from internal/charger/fritzdect.go rename to charger/fritzdect.go index abb1be523..ac3c47868 100644 --- a/internal/charger/fritzdect.go +++ b/charger/fritzdect.go @@ -12,7 +12,7 @@ import ( "time" "github.com/andig/evcc/api" - "github.com/andig/evcc/internal/charger/fritzdect" + "github.com/andig/evcc/charger/fritzdect" "github.com/andig/evcc/util" "github.com/andig/evcc/util/request" "golang.org/x/text/encoding/unicode" diff --git a/internal/charger/fritzdect/types.go b/charger/fritzdect/types.go similarity index 100% rename from internal/charger/fritzdect/types.go rename to charger/fritzdect/types.go diff --git a/internal/charger/go-e.go b/charger/go-e.go similarity index 100% rename from internal/charger/go-e.go rename to charger/go-e.go diff --git a/internal/charger/go-e_test.go b/charger/go-e_test.go similarity index 100% rename from internal/charger/go-e_test.go rename to charger/go-e_test.go diff --git a/internal/charger/keba.go b/charger/keba.go similarity index 99% rename from internal/charger/keba.go rename to charger/keba.go index f3db58094..b9ac4150e 100644 --- a/internal/charger/keba.go +++ b/charger/keba.go @@ -8,7 +8,7 @@ import ( "time" "github.com/andig/evcc/api" - "github.com/andig/evcc/internal/charger/keba" + "github.com/andig/evcc/charger/keba" "github.com/andig/evcc/util" ) diff --git a/internal/charger/keba/listener.go b/charger/keba/listener.go similarity index 100% rename from internal/charger/keba/listener.go rename to charger/keba/listener.go diff --git a/internal/charger/keba/reports.go b/charger/keba/reports.go similarity index 100% rename from internal/charger/keba/reports.go rename to charger/keba/reports.go diff --git a/internal/charger/keba/sender.go b/charger/keba/sender.go similarity index 100% rename from internal/charger/keba/sender.go rename to charger/keba/sender.go diff --git a/internal/charger/keba_test.go b/charger/keba_test.go similarity index 100% rename from internal/charger/keba_test.go rename to charger/keba_test.go diff --git a/internal/charger/mcc.go b/charger/mcc.go similarity index 100% rename from internal/charger/mcc.go rename to charger/mcc.go diff --git a/internal/charger/mcc_test.go b/charger/mcc_test.go similarity index 100% rename from internal/charger/mcc_test.go rename to charger/mcc_test.go diff --git a/internal/charger/nrgble.go b/charger/nrgble.go similarity index 100% rename from internal/charger/nrgble.go rename to charger/nrgble.go diff --git a/internal/charger/nrgble/nrg_linux.go b/charger/nrgble/nrg_linux.go similarity index 100% rename from internal/charger/nrgble/nrg_linux.go rename to charger/nrgble/nrg_linux.go diff --git a/internal/charger/nrgble/service.go b/charger/nrgble/service.go similarity index 100% rename from internal/charger/nrgble/service.go rename to charger/nrgble/service.go diff --git a/internal/charger/nrgble_linux.go b/charger/nrgble_linux.go similarity index 99% rename from internal/charger/nrgble_linux.go rename to charger/nrgble_linux.go index 630e25e13..a0d77bc6a 100644 --- a/internal/charger/nrgble_linux.go +++ b/charger/nrgble_linux.go @@ -8,7 +8,7 @@ import ( "time" "github.com/andig/evcc/api" - "github.com/andig/evcc/internal/charger/nrgble" + "github.com/andig/evcc/charger/nrgble" "github.com/andig/evcc/util" "github.com/godbus/dbus/v5" "github.com/lunixbochs/struc" diff --git a/internal/charger/nrgble_linux_test.go b/charger/nrgble_linux_test.go similarity index 100% rename from internal/charger/nrgble_linux_test.go rename to charger/nrgble_linux_test.go diff --git a/internal/charger/nrgconnect.go b/charger/nrgconnect.go similarity index 100% rename from internal/charger/nrgconnect.go rename to charger/nrgconnect.go diff --git a/internal/charger/nrgconnect_test.go b/charger/nrgconnect_test.go similarity index 100% rename from internal/charger/nrgconnect_test.go rename to charger/nrgconnect_test.go diff --git a/internal/charger/openwb.go b/charger/openwb.go similarity index 98% rename from internal/charger/openwb.go rename to charger/openwb.go index a1f8e215c..754e3031d 100644 --- a/internal/charger/openwb.go +++ b/charger/openwb.go @@ -5,7 +5,7 @@ import ( "time" "github.com/andig/evcc/api" - "github.com/andig/evcc/internal/charger/openwb" + "github.com/andig/evcc/charger/openwb" "github.com/andig/evcc/provider" "github.com/andig/evcc/provider/mqtt" "github.com/andig/evcc/util" diff --git a/internal/charger/openwb/topics.go b/charger/openwb/topics.go similarity index 100% rename from internal/charger/openwb/topics.go rename to charger/openwb/topics.go diff --git a/internal/charger/openwb_test.go b/charger/openwb_test.go similarity index 100% rename from internal/charger/openwb_test.go rename to charger/openwb_test.go diff --git a/internal/charger/phoenix-em-eth.go b/charger/phoenix-em-eth.go similarity index 93% rename from internal/charger/phoenix-em-eth.go rename to charger/phoenix-em-eth.go index 7fb385fa4..7a27bb85f 100644 --- a/internal/charger/phoenix-em-eth.go +++ b/charger/phoenix-em-eth.go @@ -32,7 +32,7 @@ func init() { registry.Add("phoenix-em-eth", NewPhoenixEMEthFromConfig) } -//go:generate go run ../../cmd/tools/decorate.go -f decoratePhoenixEMEth -b *PhoenixEMEth -r api.Charger -t "api.Meter,CurrentPower,func() (float64, error)" -t "api.MeterEnergy,TotalEnergy,func() (float64, error)" -t "api.MeterCurrent,Currents,func() (float64, float64, float64, error)" +//go:generate go run ../cmd/tools/decorate.go -f decoratePhoenixEMEth -b *PhoenixEMEth -r api.Charger -t "api.Meter,CurrentPower,func() (float64, error)" -t "api.MeterEnergy,TotalEnergy,func() (float64, error)" -t "api.MeterCurrent,Currents,func() (float64, float64, float64, error)" // NewPhoenixEMEthFromConfig creates a Phoenix charger from generic config func NewPhoenixEMEthFromConfig(other map[string]interface{}) (api.Charger, error) { diff --git a/internal/charger/phoenix-em-eth_decorators.go b/charger/phoenix-em-eth_decorators.go similarity index 100% rename from internal/charger/phoenix-em-eth_decorators.go rename to charger/phoenix-em-eth_decorators.go diff --git a/internal/charger/phoenix-em-eth_test.go b/charger/phoenix-em-eth_test.go similarity index 100% rename from internal/charger/phoenix-em-eth_test.go rename to charger/phoenix-em-eth_test.go diff --git a/internal/charger/phoenix-ev-eth.go b/charger/phoenix-ev-eth.go similarity index 94% rename from internal/charger/phoenix-ev-eth.go rename to charger/phoenix-ev-eth.go index 1bddde75e..4f53d73b3 100644 --- a/internal/charger/phoenix-ev-eth.go +++ b/charger/phoenix-ev-eth.go @@ -33,7 +33,7 @@ func init() { registry.Add("phoenix-ev-eth", NewPhoenixEVEthFromConfig) } -//go:generate go run ../../cmd/tools/decorate.go -f decoratePhoenixEVEth -b *PhoenixEVEth -r api.Charger -t "api.Meter,CurrentPower,func() (float64, error)" -t "api.MeterEnergy,TotalEnergy,func() (float64, error)" -t "api.MeterCurrent,Currents,func() (float64, float64, float64, error)" +//go:generate go run ../cmd/tools/decorate.go -f decoratePhoenixEVEth -b *PhoenixEVEth -r api.Charger -t "api.Meter,CurrentPower,func() (float64, error)" -t "api.MeterEnergy,TotalEnergy,func() (float64, error)" -t "api.MeterCurrent,Currents,func() (float64, float64, float64, error)" // NewPhoenixEVEthFromConfig creates a Phoenix charger from generic config func NewPhoenixEVEthFromConfig(other map[string]interface{}) (api.Charger, error) { diff --git a/internal/charger/phoenix-ev-eth_decorators.go b/charger/phoenix-ev-eth_decorators.go similarity index 100% rename from internal/charger/phoenix-ev-eth_decorators.go rename to charger/phoenix-ev-eth_decorators.go diff --git a/internal/charger/phoenix-ev-eth_test.go b/charger/phoenix-ev-eth_test.go similarity index 100% rename from internal/charger/phoenix-ev-eth_test.go rename to charger/phoenix-ev-eth_test.go diff --git a/internal/charger/phoenix-ev-ser.go b/charger/phoenix-ev-ser.go similarity index 100% rename from internal/charger/phoenix-ev-ser.go rename to charger/phoenix-ev-ser.go diff --git a/internal/charger/shelly.go b/charger/shelly.go similarity index 100% rename from internal/charger/shelly.go rename to charger/shelly.go diff --git a/internal/charger/simpleevse.go b/charger/simpleevse.go similarity index 100% rename from internal/charger/simpleevse.go rename to charger/simpleevse.go diff --git a/internal/charger/tasmota.go b/charger/tasmota.go similarity index 98% rename from internal/charger/tasmota.go rename to charger/tasmota.go index d277c2bcb..c32f86a8a 100644 --- a/internal/charger/tasmota.go +++ b/charger/tasmota.go @@ -7,7 +7,7 @@ import ( "strings" "github.com/andig/evcc/api" - "github.com/andig/evcc/internal/charger/tasmota" + "github.com/andig/evcc/charger/tasmota" "github.com/andig/evcc/util" "github.com/andig/evcc/util/request" ) diff --git a/internal/charger/tasmota/types.go b/charger/tasmota/types.go similarity index 100% rename from internal/charger/tasmota/types.go rename to charger/tasmota/types.go diff --git a/internal/charger/tplink.go b/charger/tplink.go similarity index 98% rename from internal/charger/tplink.go rename to charger/tplink.go index 41c7e562c..940112b8f 100644 --- a/internal/charger/tplink.go +++ b/charger/tplink.go @@ -11,7 +11,7 @@ import ( "time" "github.com/andig/evcc/api" - "github.com/andig/evcc/internal/charger/tplink" + "github.com/andig/evcc/charger/tplink" "github.com/andig/evcc/util" ) diff --git a/internal/charger/tplink/types.go b/charger/tplink/types.go similarity index 100% rename from internal/charger/tplink/types.go rename to charger/tplink/types.go diff --git a/internal/charger/tplink/types_test.go b/charger/tplink/types_test.go similarity index 100% rename from internal/charger/tplink/types_test.go rename to charger/tplink/types_test.go diff --git a/internal/charger/wallbe.go b/charger/wallbe.go similarity index 100% rename from internal/charger/wallbe.go rename to charger/wallbe.go diff --git a/internal/charger/wallbe_decorators.go b/charger/wallbe_decorators.go similarity index 100% rename from internal/charger/wallbe_decorators.go rename to charger/wallbe_decorators.go diff --git a/internal/charger/wallbe_test.go b/charger/wallbe_test.go similarity index 100% rename from internal/charger/wallbe_test.go rename to charger/wallbe_test.go diff --git a/internal/charger/warp.go b/charger/warp.go similarity index 97% rename from internal/charger/warp.go rename to charger/warp.go index 643e87d5b..1211009e4 100644 --- a/internal/charger/warp.go +++ b/charger/warp.go @@ -64,7 +64,7 @@ type Warp struct { enabled bool // cache } -//go:generate go run ../../cmd/tools/decorate.go -f decorateWarp -b *Warp -r api.Charger -t "api.Meter,CurrentPower,func() (float64, error)" -t "api.MeterEnergy,TotalEnergy,func() (float64, error)" +//go:generate go run ../cmd/tools/decorate.go -f decorateWarp -b *Warp -r api.Charger -t "api.Meter,CurrentPower,func() (float64, error)" -t "api.MeterEnergy,TotalEnergy,func() (float64, error)" // NewWarp creates a new configurable charger func NewWarp(mqttconf mqtt.Config, topic string, timeout time.Duration) (*Warp, error) { diff --git a/internal/charger/warp_decorators.go b/charger/warp_decorators.go similarity index 100% rename from internal/charger/warp_decorators.go rename to charger/warp_decorators.go diff --git a/cmd/config.go b/cmd/config.go index 8a9d36187..b8f9da253 100644 --- a/cmd/config.go +++ b/cmd/config.go @@ -5,12 +5,12 @@ import ( "time" "github.com/andig/evcc/api" - "github.com/andig/evcc/internal/charger" - "github.com/andig/evcc/internal/meter" - "github.com/andig/evcc/internal/vehicle" + "github.com/andig/evcc/charger" + "github.com/andig/evcc/meter" "github.com/andig/evcc/provider/mqtt" "github.com/andig/evcc/push" "github.com/andig/evcc/server" + "github.com/andig/evcc/vehicle" ) type config struct { diff --git a/cmd/setup.go b/cmd/setup.go index 61bcd3794..f01894fb7 100644 --- a/cmd/setup.go +++ b/cmd/setup.go @@ -8,13 +8,13 @@ import ( "strconv" "time" + "github.com/andig/evcc/api/proto/pb" "github.com/andig/evcc/core" "github.com/andig/evcc/hems" "github.com/andig/evcc/provider/javascript" "github.com/andig/evcc/provider/mqtt" "github.com/andig/evcc/push" "github.com/andig/evcc/server" - "github.com/andig/evcc/soc/proto/pb" "github.com/andig/evcc/util" "github.com/andig/evcc/util/cloud" "github.com/andig/evcc/util/pipe" diff --git a/soc/client/main.go b/cmd/soc/main.go similarity index 97% rename from soc/client/main.go rename to cmd/soc/main.go index 11eb14580..b3debfec1 100644 --- a/soc/client/main.go +++ b/cmd/soc/main.go @@ -10,8 +10,8 @@ import ( "time" "github.com/andig/evcc/api" - "github.com/andig/evcc/internal/vehicle" "github.com/andig/evcc/util" + "github.com/andig/evcc/vehicle" ) func usage() { diff --git a/detect/tasks/keba.go b/detect/tasks/keba.go index 6ebf2ff18..fbdd72e21 100644 --- a/detect/tasks/keba.go +++ b/detect/tasks/keba.go @@ -4,7 +4,7 @@ import ( "sync" "time" - "github.com/andig/evcc/internal/charger/keba" + "github.com/andig/evcc/charger/keba" "github.com/andig/evcc/util" ) diff --git a/detect/tasks/sma.go b/detect/tasks/sma.go index 721bbd8a7..fb19bed12 100644 --- a/detect/tasks/sma.go +++ b/detect/tasks/sma.go @@ -7,7 +7,7 @@ import ( "sync" "time" - "github.com/andig/evcc/internal/meter/sma" + "github.com/andig/evcc/meter/sma" "github.com/andig/evcc/util" ) diff --git a/go.mod b/go.mod index a2b849cc0..4dfd2b85f 100644 --- a/go.mod +++ b/go.mod @@ -14,7 +14,6 @@ require ( github.com/containrrr/shoutrrr v0.4.4 github.com/deepmap/oapi-codegen v1.6.1 // indirect github.com/denisbrodbeck/machineid v1.0.1 - github.com/dgrijalva/jwt-go v3.2.0+incompatible github.com/dylanmei/iso8601 v0.1.0 github.com/eclipse/paho.mqtt.golang v1.3.4 github.com/fatih/structs v1.1.0 @@ -61,8 +60,6 @@ require ( github.com/prometheus/common v0.23.0 // indirect github.com/rivo/uniseg v0.2.0 // indirect github.com/robertkrimen/otto v0.0.0-20200922221731-ef014fd054ac - github.com/shurcooL/githubv4 v0.0.0-20201206200315-234843c633fa - github.com/shurcooL/graphql v0.0.0-20200928012149-18c5c3165e3a // indirect github.com/sirupsen/logrus v1.8.1 // indirect github.com/spf13/afero v1.6.0 // indirect github.com/spf13/cobra v1.1.3 @@ -72,7 +69,7 @@ require ( github.com/thoas/go-funk v0.8.0 github.com/tv42/httpunix v0.0.0-20191220191345-2ba4b9c3382c github.com/volkszaehler/mbmd v0.0.0-20210117183837-59dcc46d62d4 - golang.org/x/crypto v0.0.0-20210506145944-38f3c27a63bf + golang.org/x/crypto v0.0.0-20210506145944-38f3c27a63bf // indirect golang.org/x/mod v0.4.2 // indirect golang.org/x/net v0.0.0-20210508051633-16afe75a6701 golang.org/x/oauth2 v0.0.0-20210427180440-81ed05c6b58c diff --git a/go.sum b/go.sum index d66b8878e..fcd7fdbef 100644 --- a/go.sum +++ b/go.sum @@ -135,7 +135,6 @@ github.com/deepmap/oapi-codegen v1.6.1 h1:2BvsmRb6pogGNtr8Ann+esAbSKFXx2CZN18VpA github.com/deepmap/oapi-codegen v1.6.1/go.mod h1:ryDa9AgbELGeB+YEXE1dR53yAjHwFvE9iAUlWl9Al3M= github.com/denisbrodbeck/machineid v1.0.1 h1:geKr9qtkB876mXguW2X6TU4ZynleN6ezuMSRhl4D7AQ= github.com/denisbrodbeck/machineid v1.0.1/go.mod h1:dJUwb7PTidGDeYyUBmXZ2GphQBbjJCrnectwCyxcUSI= -github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= @@ -630,10 +629,6 @@ github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQD github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/shurcooL/githubv4 v0.0.0-20201206200315-234843c633fa h1:jozR3igKlnYCj9IVHOVump59bp07oIRoLQ/CcjMYIUA= -github.com/shurcooL/githubv4 v0.0.0-20201206200315-234843c633fa/go.mod h1:hAF0iLZy4td2EX+/8Tw+4nodhlMrwN3HupfaXj3zkGo= -github.com/shurcooL/graphql v0.0.0-20200928012149-18c5c3165e3a h1:KikTa6HtAK8cS1qjvUvvq4QO21QnwC+EfvB+OAuZ/ZU= -github.com/shurcooL/graphql v0.0.0-20200928012149-18c5c3165e3a/go.mod h1:AuYgA5Kyo4c7HfUmvRGs/6rGlMMV/6B1bVnB9JxJEEg= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.0.5/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= diff --git a/internal/const.go b/internal/const.go deleted file mode 100644 index 659a02b7b..000000000 --- a/internal/const.go +++ /dev/null @@ -1,4 +0,0 @@ -package internal - -// Custom plugin type -const Custom = "custom" diff --git a/internal/meter/config.go b/meter/config.go similarity index 100% rename from internal/meter/config.go rename to meter/config.go diff --git a/internal/meter/config_test.go b/meter/config_test.go similarity index 100% rename from internal/meter/config_test.go rename to meter/config_test.go diff --git a/internal/meter/discovergy.go b/meter/discovergy.go similarity index 100% rename from internal/meter/discovergy.go rename to meter/discovergy.go diff --git a/internal/meter/meter.go b/meter/meter.go similarity index 91% rename from internal/meter/meter.go rename to meter/meter.go index fdcfa284f..7a74a6685 100644 --- a/internal/meter/meter.go +++ b/meter/meter.go @@ -5,17 +5,16 @@ import ( "fmt" "github.com/andig/evcc/api" - "github.com/andig/evcc/internal" "github.com/andig/evcc/provider" "github.com/andig/evcc/util" ) func init() { registry.Add("default", NewConfigurableFromConfig) - registry.Add(internal.Custom, NewConfigurableFromConfig) + registry.Add(api.Custom, NewConfigurableFromConfig) } -//go:generate go run ../../cmd/tools/decorate.go -f decorateMeter -b api.Meter -t "api.MeterEnergy,TotalEnergy,func() (float64, error)" -t "api.MeterCurrent,Currents,func() (float64, float64, float64, error)" -t "api.Battery,SoC,func() (float64, error)" +//go:generate go run ../cmd/tools/decorate.go -f decorateMeter -b api.Meter -t "api.MeterEnergy,TotalEnergy,func() (float64, error)" -t "api.MeterCurrent,Currents,func() (float64, float64, float64, error)" -t "api.Battery,SoC,func() (float64, error)" // NewConfigurableFromConfig creates api.Meter from config func NewConfigurableFromConfig(other map[string]interface{}) (api.Meter, error) { diff --git a/internal/meter/meter_decorators.go b/meter/meter_decorators.go similarity index 100% rename from internal/meter/meter_decorators.go rename to meter/meter_decorators.go diff --git a/internal/meter/modbus.go b/meter/modbus.go similarity index 95% rename from internal/meter/modbus.go rename to meter/modbus.go index 043f0f2f9..789d102aa 100644 --- a/internal/meter/modbus.go +++ b/meter/modbus.go @@ -27,7 +27,7 @@ func init() { registry.Add("modbus", NewModbusFromConfig) } -//go:generate go run ../../cmd/tools/decorate.go -f decorateModbus -b api.Meter -t "api.MeterEnergy,TotalEnergy,func() (float64, error)" -t "api.Battery,SoC,func() (float64, error)" +//go:generate go run ../cmd/tools/decorate.go -f decorateModbus -b api.Meter -t "api.MeterEnergy,TotalEnergy,func() (float64, error)" -t "api.Battery,SoC,func() (float64, error)" // NewModbusFromConfig creates api.Meter from config func NewModbusFromConfig(other map[string]interface{}) (api.Meter, error) { diff --git a/internal/meter/modbus_decorators.go b/meter/modbus_decorators.go similarity index 100% rename from internal/meter/modbus_decorators.go rename to meter/modbus_decorators.go diff --git a/internal/meter/openwb.go b/meter/openwb.go similarity index 98% rename from internal/meter/openwb.go rename to meter/openwb.go index aff506605..808c0be4f 100644 --- a/internal/meter/openwb.go +++ b/meter/openwb.go @@ -7,7 +7,7 @@ import ( "time" "github.com/andig/evcc/api" - "github.com/andig/evcc/internal/charger/openwb" + "github.com/andig/evcc/charger/openwb" "github.com/andig/evcc/provider" "github.com/andig/evcc/provider/mqtt" "github.com/andig/evcc/util" diff --git a/internal/meter/powerwall/powerwall.go b/meter/powerwall/powerwall.go similarity index 100% rename from internal/meter/powerwall/powerwall.go rename to meter/powerwall/powerwall.go diff --git a/internal/meter/sma.go b/meter/sma.go similarity index 95% rename from internal/meter/sma.go rename to meter/sma.go index ec206318f..aaa42d38c 100644 --- a/internal/meter/sma.go +++ b/meter/sma.go @@ -6,7 +6,7 @@ import ( "time" "github.com/andig/evcc/api" - "github.com/andig/evcc/internal/meter/sma" + "github.com/andig/evcc/meter/sma" "github.com/andig/evcc/util" ) @@ -37,7 +37,7 @@ func init() { registry.Add("sma", NewSMAFromConfig) } -//go:generate go run ../../cmd/tools/decorate.go -f decorateSMA -b api.Meter -t "api.MeterEnergy,TotalEnergy,func() (float64, error)" +//go:generate go run ../cmd/tools/decorate.go -f decorateSMA -b api.Meter -t "api.MeterEnergy,TotalEnergy,func() (float64, error)" // NewSMAFromConfig creates a SMA Meter from generic config func NewSMAFromConfig(other map[string]interface{}) (api.Meter, error) { diff --git a/internal/meter/sma/listener.go b/meter/sma/listener.go similarity index 100% rename from internal/meter/sma/listener.go rename to meter/sma/listener.go diff --git a/internal/meter/sma/listener_test.go b/meter/sma/listener_test.go similarity index 100% rename from internal/meter/sma/listener_test.go rename to meter/sma/listener_test.go diff --git a/internal/meter/sma_decorators.go b/meter/sma_decorators.go similarity index 100% rename from internal/meter/sma_decorators.go rename to meter/sma_decorators.go diff --git a/internal/meter/sma_test.go b/meter/sma_test.go similarity index 97% rename from internal/meter/sma_test.go rename to meter/sma_test.go index 348f7eb03..6b4e295a3 100644 --- a/internal/meter/sma_test.go +++ b/meter/sma_test.go @@ -3,7 +3,7 @@ package meter import ( "testing" - "github.com/andig/evcc/internal/meter/sma" + "github.com/andig/evcc/meter/sma" "github.com/andig/evcc/util" ) diff --git a/internal/meter/tesla.go b/meter/tesla.go similarity index 93% rename from internal/meter/tesla.go rename to meter/tesla.go index 84846718e..a43f6c057 100644 --- a/internal/meter/tesla.go +++ b/meter/tesla.go @@ -9,7 +9,7 @@ import ( "strings" "github.com/andig/evcc/api" - "github.com/andig/evcc/internal/meter/powerwall" + "github.com/andig/evcc/meter/powerwall" "github.com/andig/evcc/util" "github.com/andig/evcc/util/request" ) @@ -26,7 +26,7 @@ func init() { registry.Add("tesla", NewTeslaFromConfig) } -//go:generate go run ../../cmd/tools/decorate.go -f decorateTesla -b api.Meter -t "api.MeterEnergy,TotalEnergy,func() (float64, error)" -t "api.Battery,SoC,func() (float64, error)" +//go:generate go run ../cmd/tools/decorate.go -f decorateTesla -b api.Meter -t "api.MeterEnergy,TotalEnergy,func() (float64, error)" -t "api.Battery,SoC,func() (float64, error)" // NewTeslaFromConfig creates a Tesla Powerwall Meter from generic config func NewTeslaFromConfig(other map[string]interface{}) (api.Meter, error) { diff --git a/internal/meter/tesla_decorators.go b/meter/tesla_decorators.go similarity index 100% rename from internal/meter/tesla_decorators.go rename to meter/tesla_decorators.go diff --git a/soc/Dockerfile b/soc/Dockerfile deleted file mode 100644 index 51365b5e1..000000000 --- a/soc/Dockerfile +++ /dev/null @@ -1,35 +0,0 @@ -# STEP 1 build executable binary -# FROM golang:1.16-alpine as builder - -# # Install git + SSL ca certificates. -# # Git is required for fetching the dependencies. -# # Ca-certificates is required to call HTTPS endpoints. -# RUN apk update && apk add --no-cache git ca-certificates tzdata alpine-sdk && update-ca-certificates - -# WORKDIR /build - -# # install go tools and cache modules -# COPY Makefile . -# COPY go.mod . -# COPY go.sum . -# RUN make install -# RUN go mod download - -# # build -# COPY . . -# RUN make server - -FROM alpine:3.13 as builder -RUN apk update && apk add --no-cache git ca-certificates tzdata && update-ca-certificates - -# STEP 2 build a small image including module support -FROM alpine:3.13 - -ENV TZ=Europe/Berlin - -# Import from builder -COPY --from=builder /usr/share/zoneinfo /usr/share/zoneinfo -COPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ -COPY soc-server /usr/local/bin/soc-server - -CMD [ "soc-server" ] diff --git a/soc/cert/ca/ca-cert.pem b/soc/cert/ca/ca-cert.pem deleted file mode 100644 index c8bb6225f..000000000 --- a/soc/cert/ca/ca-cert.pem +++ /dev/null @@ -1,28 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIE1DCCArwCCQC/TbpAPhcOQTANBgkqhkiG9w0BAQsFADAsMQswCQYDVQQGEwJE -RTEdMBsGCSqGSIb3DQEJARYOY3B1aWRsZUBnbXguZGUwHhcNMjEwMzMxMDc1ODAz -WhcNMjIwMzMxMDc1ODAzWjAsMQswCQYDVQQGEwJERTEdMBsGCSqGSIb3DQEJARYO -Y3B1aWRsZUBnbXguZGUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC+ -noDTXbidh/5RFfsLlMJbfMn4Vu91oJb4MM41RQM8UOr3SRU/ZzcoLfWJe2ePpEDp -ZL4piobs8EIjFcWU2C/8La0rygbcDDqUJkW/nViH0Drs5ctgJl/uYeiDLnZiSZO+ -PBoOA0trXxqlJPxuEseJbFaLvVE81DsLBnltDPqhJZEUJPEUIjtfStOhQM0f5YoO -Greewk7P5LUkTAuTIz+xk6uKnC1YF89SKmdPMH26Rcy6q1IqhEQG3tjUliJZiKS9 -eQlnp9gskqNGop9gEsmFIMnhlrTUsVU2q38zLDFcmNDbNkRvv4Tf+7jHo4tLs02m -/fMTikdMNCRMOcJKbdobcwXq4Ghvc85xeM4/8wIQHEDFbLzmxi/4ibFfJjOfQOe9 -VpK+TbeSBTxBw42CH9V0TUOz/LELYkMrJ+zfwMCvTV4Eodmc0gjwiy9aIYdpZXKF -ueqGGljhVCq2XqkaSATFu5CsdPZrfUszLiAVqpuVTMjy3VQ9ICzz1Bd5ICBRFt6l -fDsvfB6SgmB9r1bC+yr/tqe/unzUPajL5mZwn7Jev0uOl6mBNmQpcIEne+9cKedf -vPCv/tUQpwpz6blGacEtTxuM+fWDk+CLpPnId/4PEnIQWRFE2aXQ4nrJSwu3O5+k -vuZNWety8MOSkuQr0toH//p3VNHOtT7L4JWSlDfTZQIDAQABMA0GCSqGSIb3DQEB -CwUAA4ICAQANoLbh4Di1A485ggnKfp9ykfVvg+NduGm+eqr27be033N6IJ7fuKmF -7Ki1E+sp0IJDMdyikbqoHdbroHu2chwp/1GzFxhx3Vo7kswS/ehSxWpHjhtrGjAF -tSDUFR9q4C+km2A3k1ZNyd9C1w+R9Lr16j9lBQoGWmUgFsRf8ED16FMMSK/1mCC0 -1VSydYnYhKmPZxMByTozGTV97wihA0XqXtadbkQoyvcnEuarBvEX3mPA3effqcEG -rreeDp1yzYtQRW85ZASaqgF5CYKhe9NekurZ5Jd+2mQPYRWPFpIFsSHoOLqbfcN1 -/S0Si6LZWq0Mi8cbSi/zq+Eh7Q0w+EXP6Goh0A7M4e1dKt+cfGQpeyeg3cF49Cda -RrTkSv2Sl2jbrShqAsG/HNhyBaI/gtLGi9tig9wAoV2zjGw1Ehs0GcwFq2g/f6Zv -W7rdZIBZT1RIQLczuwsEhv6cFrSM5OU2f5fuKnmeI6uvyz0jRqiMncYRjwI6LotB -sWmdTWi6xsctYirJ3Yip5Tqm01asyUuIeiT+eQ6I9CfHLiGBXEzxlK5PrFqfD7gK -LfB1gCN7SAlxKGepmFMwfF+fDrsurL2T2ePxaaNBLjRAzmpSpH0NedMd+eanuHXV -a/iOL2XmVis7iuFyk5M2XtLFfYBff+mxSPA8d9u5kCpoel0tx3iLmw== ------END CERTIFICATE----- diff --git a/soc/cert/ca/cert.go b/soc/cert/ca/cert.go deleted file mode 100644 index eaa9fb94f..000000000 --- a/soc/cert/ca/cert.go +++ /dev/null @@ -1,14 +0,0 @@ -package ca - -import ( - "bytes" - _ "embed" -) - -//go:embed ca-cert.pem -var cert []byte - -func PEM() []byte { - copy := bytes.NewBuffer(cert) - return copy.Bytes() -} diff --git a/soc/cert/create.sh b/soc/cert/create.sh deleted file mode 100755 index 28f6a7754..000000000 --- a/soc/cert/create.sh +++ /dev/null @@ -1,31 +0,0 @@ -#!/bin/sh - -set +ex - -rm *.pem - -# 1. Generate CA's private key and self-signed certificate -openssl req -x509 -newkey rsa:4096 -days 365 -nodes -keyout ca-key.pem -out ca-cert.pem -subj "/C=DE/emailAddress=cpuidle@gmx.de" - -echo "CA's self-signed certificate" -openssl x509 -in ca-cert.pem -noout -text - -# 2. Generate web server's private key and certificate signing request (CSR) -openssl req -newkey rsa:4096 -nodes -keyout server-key.pem -out server-req.pem -subj "/C=DE/emailAddress=cpuidle@gmx.de" - -# 3. Use CA's private key to sign web server's CSR and get back the signed certificate -openssl x509 -req -in server-req.pem -days 60 -CA ca-cert.pem -CAkey ca-key.pem -CAcreateserial -out server-cert.pem -extfile server-ext.cnf - -echo "Server's signed certificate" -openssl x509 -in server-cert.pem -noout -text - -# 4. Generate client's private key and certificate signing request (CSR) -openssl req -newkey rsa:4096 -nodes -keyout client-key.pem -out client-req.pem -subj "/C=DE/emailAddress=cpuidle@gmx.de" - -# 5. Use CA's private key to sign client's CSR and get back the signed certificate -openssl x509 -req -in client-req.pem -days 60 -CA ca-cert.pem -CAkey ca-key.pem -CAcreateserial -out client-cert.pem -extfile client-ext.cnf - -echo "Client's signed certificate" -openssl x509 -in client-cert.pem -noout -text - -rm *-req.pem diff --git a/soc/cert/server/cert.go b/soc/cert/server/cert.go deleted file mode 100644 index bf4c1e258..000000000 --- a/soc/cert/server/cert.go +++ /dev/null @@ -1,33 +0,0 @@ -package server - -import ( - "bytes" - "crypto/tls" - _ "embed" - "encoding/base64" - - "github.com/andig/evcc/util" -) - -//go:embed server-cert.pem -var cert []byte - -//--go:embed server-key.pem -var key []byte - -func init() { - var err error - key, err = base64.StdEncoding.DecodeString(util.Getenv("SERVER_KEY")) - if err != nil { - panic(err) - } -} - -func PEM() []byte { - copy := bytes.NewBuffer(cert) - return copy.Bytes() -} - -func Certificate() (tls.Certificate, error) { - return tls.X509KeyPair(cert, key) -} diff --git a/soc/cert/server/server-cert.pem b/soc/cert/server/server-cert.pem deleted file mode 100644 index 2cb592bdc..000000000 --- a/soc/cert/server/server-cert.pem +++ /dev/null @@ -1,29 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIE+TCCAuGgAwIBAgIJALu7hrWUWtC8MA0GCSqGSIb3DQEBBQUAMCwxCzAJBgNV -BAYTAkRFMR0wGwYJKoZIhvcNAQkBFg5jcHVpZGxlQGdteC5kZTAeFw0yMTAzMzEw -NzU4MDVaFw0yMTA1MzAwNzU4MDVaMCwxCzAJBgNVBAYTAkRFMR0wGwYJKoZIhvcN -AQkBFg5jcHVpZGxlQGdteC5kZTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC -ggIBALzv8oy3yl+sH+7fezx6aDJWf77aCaZmBrQyupXmd8InJazRx8ScmpO+LJ7i -ZtVA1YuHbL2qZaV5SBk15UkRaVRRNqVitQmaRFYDrrAtDMosOhVNGOSorGnrlOqP -eu8LD/bWwZ57NqWE2z7ZTnqNNdgX1urcvzs7jmopKl4i71sKHAJ1jdzEYl+7l7r1 -HdtKU4K6axQ2BBP6dHB9v0wOJQzfER76mSWe+hotCTdIiGnZhaIO5NoW31i3KkPi -277bLse5wGGbD1FvzLPaWf0HyruxARPs49kxuxnYtJ+KUDk5LXpDC6MM2QcUdV/8 -HVkTadONW/gVFKWS7u21NrWH2342K0lz4FyNEwiQGmTCnyT4A9DQmdfWirnXsf4M -Jkag7fWqK/dEFIJK14RHZx+i53UBIoLu6mTT+MrHzdXRNewg9jlSwOYROG80DEMh -WIbTcYqUk9XPSUzzaeg2FuP7ZFEmpbsltsztaEQikd5PO9Dkl+Qzm5eiQMwNxJX5 -bgb6eLQOI+HOtQHSWVTBXeM7Vf0JCfA7RAvKgRk4lK6JGijzGBSLuCLzXAPygiqb -59KgYf2EDaSmjzU+ZCLDR6l81SUDVnQj75obQt/TPBoVgwlCeOfFvLGGXY6tzJrp -8yH59MWpkRB4yQImTzmnoZ5klUjwuShi2bWLFiI0+FmXNuitAgMBAAGjHjAcMBoG -A1UdEQQTMBGCCSouZXZjYy5pb4cEAAAAADANBgkqhkiG9w0BAQUFAAOCAgEAlmh0 -fR34BT1LTZcTZjFgk3a0/MaZ4zK8zdlwtQFHSlOh46t+TL+jps2bmLu9IlZxLF8E -lgSzLu5bWeP8H9HuBgji41RMtwvNUqSFUUMn08Dh/78lFISneqyJZ2CeRzwPYyYs -5xi7DBXitFbvtWj5GP3NQaDhsXAPoXtKXuqab3IE6eSwTJOxm5PJnvVdRTFSRQJW -W3qQFICQxMm6Oif+yCGZLgROj7sJWOOKJecevtAxYebOCWx5nxbXxAvOY3wiRerG -xsS3pT6Q5bVo5OxUjPeRb3Fe969JJEMqGaaGTGGtYP2IVkwarwzKBtcpwgG3NJYv -EYG/MEFkpBl6yYJRRB5D7EyPcBRcDHn53sJqnP+Y8Xq40tjfWhxZ9I+N8VWK9nwS -a9CKUHlwpB6aT/J1GNMiU2RXhQWgDv8qma6Vik7RH5ZmDMmtG18GERHTNdiGKk9b -v5xTphWMHl0NtcGPbPoc8PCrIVkb0frGAX5g6UVCHFfSkiUwLDV1zPhv/tLBa5hX -ZzW0wJzs6nDMj9NleyN1B1UY3mbyNKS2Ti9M9NBNEc+IEUdyj36RNmuvDmVNYTZ+ -eYk28CFfkVT7XQjI1hIpBtu5JqBqic5Kzxg/Xwjmt1izpQBy8C7FFMb0Zs3uvrjo -FHk0eyJ/i830ZKCw8Ovx1fgMElZz8AZb/17aeRY= ------END CERTIFICATE----- diff --git a/soc/cert/server/server-ext.cnf b/soc/cert/server/server-ext.cnf deleted file mode 100644 index ea89676b0..000000000 --- a/soc/cert/server/server-ext.cnf +++ /dev/null @@ -1 +0,0 @@ -subjectAltName=DNS:*.evcc.io,IP:0.0.0.0 \ No newline at end of file diff --git a/soc/server/auth/auth.go b/soc/server/auth/auth.go deleted file mode 100644 index 5fa682066..000000000 --- a/soc/server/auth/auth.go +++ /dev/null @@ -1,88 +0,0 @@ -package auth - -import ( - "context" - "errors" - "sync" - "time" - - "github.com/andig/evcc/soc/server/auth/sponsor" - "github.com/andig/evcc/util" - "github.com/dgrijalva/jwt-go" -) - -var ( - Issuer = "evcc.io" - TokenExpiry = 365 // days - tokenSecret = util.Getenv("JWT_TOKEN_SECRET") -) - -var ( - mux sync.Mutex - updated time.Time - authorized = make(map[string]bool) -) - -const updateInterval = 5 * time.Minute - -type Claims struct { - UsernameDeprecated string `json:"username,omitempty"` - Username string `json:"usr,omitempty"` - SponsorExempt bool `json:"spe,omitempty"` - jwt.StandardClaims -} - -func keyFunc(token *jwt.Token) (interface{}, error) { - return []byte(tokenSecret), nil -} - -func AuthorizedToken(claims Claims) (string, error) { - claims.Issuer = Issuer - claims.IssuedAt = time.Now().Unix() - claims.ExpiresAt = time.Now().Add(24 * time.Hour * time.Duration(TokenExpiry)).Unix() - - token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims) - return token.SignedString([]byte(tokenSecret)) -} - -func ParseToken(token string) (*Claims, error) { - jwt, err := jwt.ParseWithClaims(token, &Claims{}, keyFunc) - if err != nil { - return nil, err - } - - claims, ok := jwt.Claims.(*Claims) - if !ok { - return nil, errors.New("claims invalid") - } - - return claims, nil -} - -func IsSponsor(login string) (bool, error) { - mux.Lock() - defer mux.Unlock() - - if _, ok := authorized[login]; !ok { - if time.Since(updated) < updateInterval { - return false, nil - } - - ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) - defer cancel() - - all, err := sponsor.Get(ctx) - if err != nil { - return false, err - } - - updated = time.Now() - - for _, s := range all { - authorized[s.Login] = true - } - } - - _, ok := authorized[login] - return ok, nil -} diff --git a/soc/server/auth/sponsor/sponsor.go b/soc/server/auth/sponsor/sponsor.go deleted file mode 100644 index be1997da1..000000000 --- a/soc/server/auth/sponsor/sponsor.go +++ /dev/null @@ -1,79 +0,0 @@ -package sponsor - -import ( - "context" - - "github.com/andig/evcc/util" - "github.com/shurcooL/githubv4" - "golang.org/x/oauth2" -) - -var client *githubv4.Client - -func init() { - token := util.Getenv("GITHUB_TOKEN") - - ts := oauth2.StaticTokenSource(&oauth2.Token{AccessToken: token}) - tc := oauth2.NewClient(context.Background(), ts) - - client = githubv4.NewClient(tc) -} - -// Source: https://github.com/tj/sponsors-api/blob/master/server.go - -// Sponsor model -type Sponsor struct { - Name string - Login string - AvatarURL string -} - -// sponsorships query: https://docs.github.com/en/graphql/reference/objects -type sponsorships struct { - Viewer struct { - Login string - SponsorshipsAsMaintainer struct { - PageInfo struct { - EndCursor string - HasNextPage bool - } - - Edges []struct { - Node struct { - Sponsor Sponsor - } - Cursor string - } - } `graphql:"sponsorshipsAsMaintainer(first: 100, after: $cursor, includePrivate: true)"` - } -} - -// Get returns the list of sponsors -func Get(ctx context.Context) ([]Sponsor, error) { - var sponsors []Sponsor - var q sponsorships - var cursor string - - for { - err := client.Query(ctx, &q, map[string]interface{}{ - "cursor": githubv4.String(cursor), - }) - - if err != nil { - return nil, err - } - - for _, edge := range q.Viewer.SponsorshipsAsMaintainer.Edges { - sponsor := edge.Node.Sponsor - sponsors = append(sponsors, sponsor) - } - - if !q.Viewer.SponsorshipsAsMaintainer.PageInfo.HasNextPage { - break - } - - cursor = q.Viewer.SponsorshipsAsMaintainer.PageInfo.EndCursor - } - - return sponsors, nil -} diff --git a/soc/server/main.go b/soc/server/main.go deleted file mode 100644 index 3585b2e71..000000000 --- a/soc/server/main.go +++ /dev/null @@ -1,18 +0,0 @@ -package main - -import ( - "log" - - compile "github.com/andig/evcc/server" - "github.com/andig/evcc/soc/server/server" - "github.com/andig/evcc/soc/server/ui" -) - -func main() { - log.Printf("soc-server %s (%s)", compile.Version, compile.Commit) - - go ui.Run() - go server.Run() - - select {} -} diff --git a/soc/server/server/auth.go b/soc/server/server/auth.go deleted file mode 100644 index 23193f186..000000000 --- a/soc/server/server/auth.go +++ /dev/null @@ -1,47 +0,0 @@ -package server - -import ( - "context" - "log" - - "github.com/andig/evcc/soc/proto/pb" - "github.com/andig/evcc/soc/server/auth" -) - -type AuthServer struct { - pb.UnimplementedAuthServer -} - -func (s *AuthServer) IsAuthorized(ctx context.Context, r *pb.AuthRequest) (*pb.AuthReply, error) { - authorized, _, claims, err := isAuthorized(r) - - // track auth requests - log.Printf(claims.Subject+": %v", authorized) - - res := &pb.AuthReply{Authorized: authorized} - if err == nil { - res.Subject = claims.Subject - } - - return res, err -} - -type tokenizer interface { - GetToken() string -} - -func isAuthorized(r tokenizer) (bool, string, *auth.Claims, error) { - token := r.GetToken() - - claims, err := auth.ParseToken(token) - if err != nil { - return false, token, claims, err - } - - authorized := claims.SponsorExempt - if !authorized { - authorized, err = auth.IsSponsor(claims.Subject) - } - - return authorized, token, claims, err -} diff --git a/soc/server/server/init.go b/soc/server/server/init.go deleted file mode 100644 index f64e848aa..000000000 --- a/soc/server/server/init.go +++ /dev/null @@ -1,74 +0,0 @@ -package server - -import ( - "crypto/tls" - "crypto/x509" - "fmt" - "log" - "net" - - "github.com/andig/evcc/soc/cert/ca" - "github.com/andig/evcc/soc/cert/server" - "github.com/andig/evcc/soc/proto/pb" - "github.com/andig/evcc/util" - "google.golang.org/grpc" - "google.golang.org/grpc/credentials" -) - -var ( - port = util.Getenv("GRPC_PORT", "8080") - tlsConfig *tls.Config -) - -func init() { - var err error - if tlsConfig, err = loadTLSCredentials(); err != nil { - log.Fatalf("cannot load TLS credentials: %v", err) - } - - registerMetrics() -} - -func loadTLSCredentials() (*tls.Config, error) { - certPool := x509.NewCertPool() - if !certPool.AppendCertsFromPEM(ca.PEM()) { - return nil, fmt.Errorf("failed to add client CA's certificate") - } - - // Load server's certificate and private key - serverCert, err := server.Certificate() - if err != nil { - return nil, err - } - - // Create the credentials and return it - config := &tls.Config{ - Certificates: []tls.Certificate{serverCert}, - ClientAuth: tls.VerifyClientCertIfGiven, - ClientCAs: certPool, - } - - return config, nil -} - -func Run() { - log.Println("grpc:", ":"+port) - - listener, err := net.Listen("tcp", ":"+port) - if err != nil { - log.Fatalf("failed to listen: %v", err) - } - - serverOptions := []grpc.ServerOption{} - if tlsConfig != nil { - serverOptions = append(serverOptions, grpc.Creds(credentials.NewTLS(tlsConfig))) - } - grpcServer := grpc.NewServer(serverOptions...) - - pb.RegisterVehicleServer(grpcServer, &VehicleServer{ - registry: make(map[string][]*VehicleContainer), - }) - pb.RegisterAuthServer(grpcServer, &AuthServer{}) - - log.Fatal(grpcServer.Serve(listener)) -} diff --git a/soc/server/server/prom.go b/soc/server/server/prom.go deleted file mode 100644 index 67fdd3e4c..000000000 --- a/soc/server/server/prom.go +++ /dev/null @@ -1,35 +0,0 @@ -package server - -import ( - "log" - - "github.com/prometheus/client_golang/prometheus" -) - -var ( - promActiveVehicles *prometheus.GaugeVec -) - -func registerMetrics() { - promActiveVehicles = prometheus.NewGaugeVec(prometheus.GaugeOpts{ - Namespace: "soc", - Name: "active_vehicles", - }, []string{"token", "brand"}) - - if err := prometheus.Register(promActiveVehicles); err != nil { - log.Fatal(err) - } -} - -func updateActiveVehiclesMetric(token, typ string, delta int) { - g, err := promActiveVehicles.GetMetricWith(prometheus.Labels{ - "token": token, - "brand": typ, - }) - if err != nil { - log.Println("get metrics:", err) - return - } - - g.Add(float64(delta)) -} diff --git a/soc/server/server/vehicle.go b/soc/server/server/vehicle.go deleted file mode 100644 index 88a4e3f77..000000000 --- a/soc/server/server/vehicle.go +++ /dev/null @@ -1,149 +0,0 @@ -package server - -import ( - "bytes" - "context" - "crypto/sha256" - "fmt" - "log" - "sort" - "sync/atomic" - - "github.com/andig/evcc/api" - "github.com/andig/evcc/internal/vehicle" - "github.com/andig/evcc/soc/proto/pb" - "github.com/andig/evcc/util/cloud" -) - -var vehicleID int64 - -type VehicleContainer struct { - id int64 - hash []byte - vehicle api.Vehicle -} - -type VehicleServer struct { - registry map[string][]*VehicleContainer - pb.UnimplementedVehicleServer -} - -type vehicler interface { - tokenizer - GetVehicleId() int64 -} - -func (s *VehicleServer) vehicle(r vehicler) (api.Vehicle, error) { - token := r.GetToken() - vehicles, ok := s.registry[token] - if !ok { - return nil, cloud.ErrVehicleNotAvailable - } - - id := r.GetVehicleId() - for _, c := range vehicles { - if c.id == id { - return c.vehicle, nil - } - } - - return nil, cloud.ErrVehicleNotAvailable -} - -func stringMapToInterface(in map[string]string) map[string]interface{} { - res := make(map[string]interface{}) - - for k, v := range in { - res[k] = v - } - - return res -} - -func (s *VehicleServer) addVehicleToRegistry(token, typ string, config map[string]string, v api.Vehicle) int64 { - id := atomic.AddInt64(&vehicleID, 1) - - // sort config keys - var keys []string - for k := range config { - keys = append(keys, k) - } - sort.Strings(keys) - - // hash config - h := sha256.New() - _, _ = h.Write([]byte(typ)) - for _, k := range keys { - _, _ = h.Write([]byte(k)) - _, _ = h.Write([]byte(config[k])) - } - hash := h.Sum(nil) - - // find vehicle by hash and update it - for _, c := range s.registry[token] { - if bytes.Equal(c.hash, hash) { - c.vehicle = v - c.id = id - return id - } - } - - // register new vehicle - c := VehicleContainer{ - id: id, - hash: hash, - vehicle: v, - } - s.registry[token] = append(s.registry[token], &c) - - h.Reset() - _, _ = h.Write([]byte(token)) - thash := fmt.Sprintf("%x", h.Sum(nil)) - - updateActiveVehiclesMetric(thash, typ, 1) - - return id -} - -func (s *VehicleServer) New(ctx context.Context, r *pb.NewRequest) (*pb.NewReply, error) { - authorized, token, claims, err := isAuthorized(r) - if err != nil { - return nil, err - } - if !authorized { - return nil, cloud.ErrNotAuthorized - } - - typ := r.GetType() - config := r.GetConfig() - - // track vehicle create - log.Println(claims.Subject+":", typ) - - v, err := vehicle.NewFromConfig(typ, stringMapToInterface(config)) - if err != nil { - return nil, err - } - - id := s.addVehicleToRegistry(token, typ, config, v) - - res := pb.NewReply{ - VehicleId: id, - } - - return &res, nil -} - -func (s *VehicleServer) SoC(ctx context.Context, r *pb.SoCRequest) (*pb.SoCReply, error) { - v, err := s.vehicle(r) - if err != nil { - return nil, err - } - - soc, err := v.SoC() - res := pb.SoCReply{ - Soc: soc, - } - - return &res, err -} diff --git a/soc/server/ui/index.html b/soc/server/ui/index.html deleted file mode 100644 index 1483cc42f..000000000 --- a/soc/server/ui/index.html +++ /dev/null @@ -1,131 +0,0 @@ - - - - - - - evcc Sponsorship - - - - - - - - - - -
- -
-
-

evcc Sponsorship

- -
-
- -
- {{if .Content}} - {{.Content}} - {{else}} -

Willkommen

-

- Die Freischaltung der Sonderfunktionen für evcc Sponsoren erfordert eine einmalige Anmeldung um evcc mit dem - Github Konto des evcc Sponsors zu verknüpfen. Mit der Verknüpfung wird das Registrierungstoken erzeugt. -

-

- Das Registrierungstoken gibt Zugang zu den folgenden Funktionen: -

Nutzung des evcc-soc Moduls mit OpenWB

-

Nutzung des evcc Easee Moduls

-

-

- Anmelden -

- {{end}} -
- -
-

Cover template by @mdo.

-
- -
- - - - diff --git a/soc/server/ui/privacy.html b/soc/server/ui/privacy.html deleted file mode 100644 index a1f6f11e9..000000000 --- a/soc/server/ui/privacy.html +++ /dev/null @@ -1,220 +0,0 @@ - - - - - - - Impressum und Datenschutzerklärung - - - -

Impressum

-

Diensteanbieter

-

Andreas Götz

-

Gubiner Str. 15

-

30880 Laatzen

- -

Kontaktmöglichkeiten

-

E-Mail-Adresse: info@evcc.io

- -

Datenschutzerklärung

-

Einleitung

-

Mit der folgenden Datenschutzerklärung möchten wir Sie darüber aufklären, welche Arten Ihrer personenbezogenen - Daten (nachfolgend auch kurz als "Daten“ bezeichnet) wir zu welchen Zwecken und in welchem Umfang verarbeiten. Die - Datenschutzerklärung gilt für alle von uns durchgeführten Verarbeitungen personenbezogener Daten, sowohl im - Rahmen der Erbringung unserer Leistungen als auch insbesondere auf unseren Webseiten, in mobilen Applikationen sowie - innerhalb externer Onlinepräsenzen, wie z.B. unserer Social-Media-Profile (nachfolgend zusammenfassend - bezeichnet als "Onlineangebot“).

-

Die verwendeten Begriffe sind nicht geschlechtsspezifisch.

-

Stand: 26. April 2021

-

Inhaltsübersicht

- -

Verantwortlicher

-

Andreas Götz
Gubiner Str. 15
30880 Laatzen

-

E-Mail-Adresse: info@evcc.io.

-

Übersicht der Verarbeitungen

-

Die nachfolgende Übersicht fasst die Arten der verarbeiteten Daten und die Zwecke ihrer Verarbeitung zusammen und - verweist auf die betroffenen Personen.

-

Arten der verarbeiteten Daten

- -

Kategorien betroffener Personen

- -

Zwecke der Verarbeitung

- -

Maßgebliche Rechtsgrundlagen

-

Im Folgenden erhalten Sie eine Übersicht der Rechtsgrundlagen der DSGVO, auf deren Basis wir personenbezogenen - Daten verarbeiten. Bitte nehmen Sie zur Kenntnis, dass neben den Regelungen der DSGVO nationale Datenschutzvorgaben - in Ihrem bzw. unserem Wohn- oder Sitzland gelten können. Sollten ferner im Einzelfall speziellere Rechtsgrundlagen - maßgeblich sein, teilen wir Ihnen diese in der Datenschutzerklärung mit.

- -

Nationale Datenschutzregelungen in Deutschland: Zusätzlich zu den Datenschutzregelungen der - Datenschutz-Grundverordnung gelten nationale Regelungen zum Datenschutz in Deutschland. Hierzu gehört - insbesondere das Gesetz zum Schutz vor Missbrauch personenbezogener Daten bei der Datenverarbeitung - (Bundesdatenschutzgesetz – BDSG). Das BDSG enthält insbesondere Spezialregelungen zum Recht auf Auskunft, zum Recht - auf Löschung, zum Widerspruchsrecht, zur Verarbeitung besonderer Kategorien personenbezogener Daten, zur - Verarbeitung für andere Zwecke und zur Übermittlung sowie automatisierten Entscheidungsfindung im Einzelfall - einschließlich Profiling. - Des Weiteren regelt es die Datenverarbeitung für Zwecke des Beschäftigungsverhältnisses (§ 26 BDSG), insbesondere im - Hinblick auf die Begründung, Durchführung oder Beendigung von Beschäftigungsverhältnissen sowie die Einwilligung - von Beschäftigten. Ferner können Landesdatenschutzgesetze der einzelnen Bundesländer zur Anwendung gelangen.

-

Sicherheitsmaßnahmen

-

Wir treffen nach Maßgabe der gesetzlichen Vorgaben unter Berücksichtigung des Stands der Technik, der - Implementierungskosten und der Art, des Umfangs, der Umstände und der Zwecke der Verarbeitung sowie der - unterschiedlichen Eintrittswahrscheinlichkeiten und des Ausmaßes der Bedrohung der Rechte und Freiheiten - natürlicher Personen geeignete technische und organisatorische Maßnahmen, um ein dem Risiko angemessenes - Schutzniveau zu gewährleisten.

-

Zu den Maßnahmen gehören insbesondere die Sicherung der Vertraulichkeit, Integrität und Verfügbarkeit von Daten - durch Kontrolle des physischen und elektronischen Zugangs zu den Daten als auch des sie betreffenden Zugriffs, der - Eingabe, der Weitergabe, der Sicherung der Verfügbarkeit und ihrer Trennung. Des Weiteren haben wir Verfahren - eingerichtet, die eine Wahrnehmung von Betroffenenrechten, die Löschung von Daten und Reaktionen auf die - Gefährdung der Daten gewährleisten. Ferner berücksichtigen wir den Schutz personenbezogener Daten bereits bei der - Entwicklung bzw. Auswahl von Hardware, Software sowie Verfahren entsprechend dem Prinzip des Datenschutzes, durch - Technikgestaltung und durch datenschutzfreundliche Voreinstellungen.

-

Übermittlung von personenbezogenen Daten

-

Im Rahmen unserer Verarbeitung von personenbezogenen Daten kommt es vor, dass die Daten an andere Stellen, - Unternehmen, rechtlich selbstständige Organisationseinheiten oder Personen übermittelt oder sie ihnen gegenüber - offengelegt werden. Zu den Empfängern dieser Daten können z.B. mit IT-Aufgaben beauftragte Dienstleister oder - Anbieter von Diensten und Inhalten, die in eine Webseite eingebunden werden, gehören. In solchen Fall beachten - wir die gesetzlichen Vorgaben und schließen insbesondere entsprechende Verträge bzw. Vereinbarungen, die dem Schutz - Ihrer Daten dienen, mit den Empfängern Ihrer Daten ab.

-

Datenverarbeitung in Drittländern

-

Sofern wir Daten in einem Drittland (d.h., außerhalb der Europäischen Union (EU), des Europäischen - Wirtschaftsraums (EWR)) verarbeiten oder die Verarbeitung im Rahmen der Inanspruchnahme von Diensten Dritter oder - der Offenlegung bzw. Übermittlung von Daten an andere Personen, Stellen oder Unternehmen stattfindet, erfolgt dies - nur im Einklang mit den gesetzlichen Vorgaben.

-

Vorbehaltlich ausdrücklicher Einwilligung oder vertraglich oder gesetzlich erforderlicher Übermittlung - verarbeiten oder lassen wir die Daten nur in Drittländern mit einem anerkannten Datenschutzniveau, vertraglichen - Verpflichtung durch sogenannte Standardschutzklauseln der EU-Kommission, beim Vorliegen von Zertifizierungen oder - verbindlicher internen Datenschutzvorschriften verarbeiten (Art. 44 bis 49 DSGVO, Informationsseite der - EU-Kommission: https://ec.europa.eu/info/law/law-topic/data-protection/international-dimension-data-protection_de). -

-

Bereitstellung des Onlineangebotes

-

Das Onlineangebote wird auf Servern von Prospect One (Karmelicka 5/5, Krakow, 31-133, Polen) betrieben. Wir - verweisen - auf die entsprechende Datenschutzerklärung -

-

- Wir verwenden Github für die Bereitstellung der Sponsoring Funktion sowie für die Generierung des Login Tokens. - Wir verweisen auf die entsprechende Datenschutzerklärung -

-

Löschung von Daten

-

Die von uns verarbeiteten Daten werden nach Maßgabe der gesetzlichen Vorgaben gelöscht, sobald deren zur - Verarbeitung erlaubten Einwilligungen widerrufen werden oder sonstige Erlaubnisse entfallen (z.B., wenn der Zweck - der Verarbeitung dieser Daten entfallen ist oder sie für den Zweck nicht erforderlich sind).

-

Sofern die Daten nicht gelöscht werden, weil sie für andere und gesetzlich zulässige Zwecke erforderlich sind, - wird deren Verarbeitung auf diese Zwecke beschränkt. D.h., die Daten werden gesperrt und nicht für andere Zwecke - verarbeitet. Das gilt z.B. für Daten, die aus handels- oder steuerrechtlichen Gründen aufbewahrt werden müssen - oder deren Speicherung zur Geltendmachung, Ausübung oder Verteidigung von Rechtsansprüchen oder zum Schutz der - Rechte einer anderen natürlichen oder juristischen Person erforderlich ist.

-

Unsere Datenschutzhinweise können ferner weitere Angaben zu der Aufbewahrung und Löschung von Daten beinhalten, - die für die jeweiligen Verarbeitungen vorrangig gelten.

-

Änderung und Aktualisierung der Datenschutzerklärung

-

Wir bitten Sie, sich regelmäßig über den Inhalt unserer Datenschutzerklärung zu informieren. Wir passen die - Datenschutzerklärung an, sobald die Änderungen der von uns durchgeführten Datenverarbeitungen dies erforderlich - machen. Wir informieren Sie, sobald durch die Änderungen eine Mitwirkungshandlung Ihrerseits (z.B. Einwilligung) - oder eine sonstige individuelle Benachrichtigung erforderlich wird.

-

Sofern wir in dieser Datenschutzerklärung Adressen und Kontaktinformationen von Unternehmen und Organisationen - angeben, bitten wir zu beachten, dass die Adressen sich über die Zeit ändern können und bitten die Angaben vor - Kontaktaufnahme zu prüfen.

-

Rechte der betroffenen Personen

-

Ihnen stehen als Betroffene nach der DSGVO verschiedene Rechte zu, die sich insbesondere aus Art. 15 bis 21 DSGVO - ergeben:

- -

Begriffsdefinitionen

-

In diesem Abschnitt erhalten Sie eine Übersicht über die in dieser Datenschutzerklärung verwendeten - Begrifflichkeiten. Viele der Begriffe sind dem Gesetz entnommen und vor allem im Art. 4 DSGVO definiert. Die - gesetzlichen Definitionen sind verbindlich. Die nachfolgenden Erläuterungen sollen dagegen vor allem dem - Verständnis dienen. Die Begriffe sind alphabetisch sortiert.

- -

Erstellt mit kostenlosem Datenschutz-Generator.de von Dr. Thomas - Schwenke -

- - - diff --git a/soc/server/ui/ui.go b/soc/server/ui/ui.go deleted file mode 100644 index e8074b87b..000000000 --- a/soc/server/ui/ui.go +++ /dev/null @@ -1,297 +0,0 @@ -package ui - -import ( - "context" - _ "embed" - "encoding/json" - "fmt" - "html/template" - "io" - "log" - "math/rand" - "net/http" - "net/http/pprof" - "os" - "sort" - "strings" - "time" - - "github.com/andig/evcc/internal/vehicle" - "github.com/andig/evcc/soc/server/auth" - "github.com/andig/evcc/util" - "github.com/dgrijalva/jwt-go" - "github.com/prometheus/client_golang/prometheus/promhttp" - "github.com/thoas/go-funk" - "golang.org/x/crypto/acme/autocert" - "golang.org/x/oauth2" - "golang.org/x/oauth2/github" -) - -//go:embed index.html -var indexHtml string - -//go:embed privacy.html -var privacyHtml string - -var ( - // login ui and callback - redirectURL = util.Getenv("REDIRECT_URL") - - // SSL termination - sslCertDir = util.Getenv("SSL_CERT_DIR", "certs") - - // github oauth application - clientID = util.Getenv("GITHUB_CLIENT_ID") - clientSecret = util.Getenv("GITHUB_CLIENT_SECRET") -) - -var ( - indexTpl, privacyTpl *template.Template - - oauthState = randomString() - oauthConfig *oauth2.Config -) - -const ( - ProfileURL = "https://api.github.com/user" - EmailURL = "https://api.github.com/user/emails" -) - -type User struct { - ID int `json:"id"` - Email string `json:"email"` - Bio string `json:"bio"` - Name string `json:"name"` - Login string `json:"login"` - Picture string `json:"avatar_url"` - Location string `json:"location"` -} - -func init() { - clientID = util.Getenv("GITHUB_CLIENT_ID") - clientSecret = util.Getenv("GITHUB_CLIENT_SECRET") - - oauthConfig = &oauth2.Config{ - RedirectURL: redirectURL, - ClientID: clientID, - ClientSecret: clientSecret, - Scopes: []string{}, - Endpoint: github.Endpoint, - } - - indexTpl = template.Must(template.New("index").Parse(indexHtml)) - privacyTpl = template.Must(template.New("privacy").Parse(privacyHtml)) -} - -func randomString() string { - rand.Seed(time.Now().UnixNano()) - chars := []rune("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789") - length := 16 - var b strings.Builder - for i := 0; i < length; i++ { - b.WriteRune(chars[rand.Intn(len(chars))]) - } - return b.String() -} - -func handleMain(w http.ResponseWriter, r *http.Request) { - _ = indexTpl.Execute(w, nil) -} - -func handlePrivacy(w http.ResponseWriter, r *http.Request) { - _ = privacyTpl.Execute(w, nil) -} - -func templateError(w http.ResponseWriter, r *http.Request, err string) { - _ = indexTpl.Execute(w, map[string]interface{}{ - "Content": template.HTML(` -

Fehler

-

` + err + `

`), - }) -} - -func handleLogin(w http.ResponseWriter, r *http.Request) { - url := oauthConfig.AuthCodeURL(oauthState) - http.Redirect(w, r, url, http.StatusTemporaryRedirect) -} - -func handleCallback(w http.ResponseWriter, r *http.Request) { - if r.URL.Query().Get("error") != "" { - err := r.URL.Query().Get("error_description") - templateError(w, r, err) - return - } - - user, err := getUserInfo(r.FormValue("state"), r.FormValue("code")) - if err != nil { - templateError(w, r, err.Error()) - return - } - - authorized, err := auth.IsSponsor(user.Login) - if err != nil { - templateError(w, r, err.Error()) - return - } - - authMap := map[bool]string{false: "rejected", true: "authorized"} - log.Println(user.Login+":", authMap[authorized]) - - if !authorized { - _ = indexTpl.Execute(w, map[string]interface{}{ - "Content": template.HTML(` -

Inaktiv

-

Github Sponsorship für evcc ist inaktiv. Um erweiterte Funktionen zu nutzen, ist es notwendig, evcc zu unterstützen.

-

evcc bei Github unterstützen.

`), - }) - return - } - - claims := auth.Claims{ - Username: user.Name, - StandardClaims: jwt.StandardClaims{ - Subject: user.Login, - }, - } - - jwt, err := auth.AuthorizedToken(claims) - if err != nil { - templateError(w, r, err.Error()) - return - } - - _ = indexTpl.Execute(w, map[string]interface{}{ - "Content": template.HTML(fmt.Sprintf(` -

Aktiv

-

Github Sponsorship für evcc ist aktiv. Das folgende Registrierungstoken kann für den Zugriff auf evcc genutzt werden.

-

Der Code ist %d Tage gültig und kann jederzeit neu erzeugt werden.

-

`+jwt+`

`, auth.TokenExpiry), - )}) -} - -func getUserInfo(state string, code string) (*User, error) { - if state != oauthState { - return nil, fmt.Errorf("invalid oauth state") - } - - ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) - defer cancel() - - token, err := oauthConfig.Exchange(ctx, code) - if err != nil { - return nil, fmt.Errorf("code exchange failed: %s", err.Error()) - } - - var user User - req, err := http.NewRequest("GET", ProfileURL, nil) - if err != nil { - return nil, err - } - - req.Header.Add("Authorization", "Bearer "+token.AccessToken) - response, err := http.DefaultClient.Do(req) - if err != nil { - return nil, err - } - defer response.Body.Close() - - if response.StatusCode != http.StatusOK { - return nil, fmt.Errorf("GitHub API responded with a %d trying to fetch user information", response.StatusCode) - } - - bits, err := io.ReadAll(response.Body) - if err != nil { - return nil, err - } - - err = json.Unmarshal(bits, &user) - if err != nil { - return nil, err - } - - return &user, nil -} - -var typeFilter = []string{"custom", "cloud", "niu", "tesla"} - -var typeMap = map[string]string{ - "bmw": "BMW", - "citroen": "Citroën", - "skoda": "Škoda", - "enyaq": "Škoda Enyaq", - "vw": "VW", - "id": "VW ID", -} - -type typeDesc struct { - ID string `json:"id"` - Name string `json:"name"` -} - -func handleVehicles(w http.ResponseWriter, r *http.Request) { - types := make([]typeDesc, 0) - - for _, id := range vehicle.Types() { - if funk.ContainsString(typeFilter, id) { - continue - } - - vt := typeDesc{ID: id, Name: strings.Title(id)} - if name, ok := typeMap[id]; ok { - vt.Name = name - } - - types = append(types, vt) - } - - sort.Slice(types, func(i, j int) bool { - return strings.Compare(types[i].Name, types[j].Name) < 0 - }) - - w.Header().Set("Content-Type", "application/json; charset=UTF-8") - _ = json.NewEncoder(w).Encode(types) -} - -func Run() { - mux := &http.ServeMux{} - mux.HandleFunc("/", handleMain) - mux.HandleFunc("/privacy", handlePrivacy) - mux.HandleFunc("/login", handleLogin) - mux.HandleFunc("/callback", handleCallback) - mux.HandleFunc("/api/vehicles", handleVehicles) - - mux.Handle("/metrics", promhttp.Handler()) - - mux.HandleFunc("/debug/pprof/", pprof.Index) - mux.HandleFunc("/debug/pprof/profile", pprof.Profile) - // mux.HandleFunc("/debug/pprof/cmdline", pprof.Cmdline) - // mux.HandleFunc("/debug/pprof/symbol", pprof.Symbol) - // mux.HandleFunc("/debug/pprof/trace", pprof.Trace) - - s := &http.Server{ - Addr: ":http", - Handler: mux, - } - - if sslHosts := strings.TrimSpace(os.Getenv("SSL_HOSTS")); sslHosts != "" { - log.Println("sslHosts:", sslHosts) - log.Println("sslCertDir:", sslCertDir) - - certManager := autocert.Manager{ - Prompt: autocert.AcceptTOS, - HostPolicy: autocert.HostWhitelist(strings.Split(sslHosts, " ")...), - Cache: autocert.DirCache(sslCertDir), - } - - go func() { - log.Fatal(http.ListenAndServe(":http", certManager.HTTPHandler(nil))) - }() - - s.Addr = ":https" - s.TLSConfig = certManager.TLSConfig() - - log.Fatal(s.ListenAndServeTLS("", "")) - } else { - log.Fatal(s.ListenAndServe()) - } -} diff --git a/util/cloud/ca-cert.pem b/util/cloud/ca-cert.pem deleted file mode 100644 index c8bb6225f..000000000 --- a/util/cloud/ca-cert.pem +++ /dev/null @@ -1,28 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIE1DCCArwCCQC/TbpAPhcOQTANBgkqhkiG9w0BAQsFADAsMQswCQYDVQQGEwJE -RTEdMBsGCSqGSIb3DQEJARYOY3B1aWRsZUBnbXguZGUwHhcNMjEwMzMxMDc1ODAz -WhcNMjIwMzMxMDc1ODAzWjAsMQswCQYDVQQGEwJERTEdMBsGCSqGSIb3DQEJARYO -Y3B1aWRsZUBnbXguZGUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC+ -noDTXbidh/5RFfsLlMJbfMn4Vu91oJb4MM41RQM8UOr3SRU/ZzcoLfWJe2ePpEDp -ZL4piobs8EIjFcWU2C/8La0rygbcDDqUJkW/nViH0Drs5ctgJl/uYeiDLnZiSZO+ -PBoOA0trXxqlJPxuEseJbFaLvVE81DsLBnltDPqhJZEUJPEUIjtfStOhQM0f5YoO -Greewk7P5LUkTAuTIz+xk6uKnC1YF89SKmdPMH26Rcy6q1IqhEQG3tjUliJZiKS9 -eQlnp9gskqNGop9gEsmFIMnhlrTUsVU2q38zLDFcmNDbNkRvv4Tf+7jHo4tLs02m -/fMTikdMNCRMOcJKbdobcwXq4Ghvc85xeM4/8wIQHEDFbLzmxi/4ibFfJjOfQOe9 -VpK+TbeSBTxBw42CH9V0TUOz/LELYkMrJ+zfwMCvTV4Eodmc0gjwiy9aIYdpZXKF -ueqGGljhVCq2XqkaSATFu5CsdPZrfUszLiAVqpuVTMjy3VQ9ICzz1Bd5ICBRFt6l -fDsvfB6SgmB9r1bC+yr/tqe/unzUPajL5mZwn7Jev0uOl6mBNmQpcIEne+9cKedf -vPCv/tUQpwpz6blGacEtTxuM+fWDk+CLpPnId/4PEnIQWRFE2aXQ4nrJSwu3O5+k -vuZNWety8MOSkuQr0toH//p3VNHOtT7L4JWSlDfTZQIDAQABMA0GCSqGSIb3DQEB -CwUAA4ICAQANoLbh4Di1A485ggnKfp9ykfVvg+NduGm+eqr27be033N6IJ7fuKmF -7Ki1E+sp0IJDMdyikbqoHdbroHu2chwp/1GzFxhx3Vo7kswS/ehSxWpHjhtrGjAF -tSDUFR9q4C+km2A3k1ZNyd9C1w+R9Lr16j9lBQoGWmUgFsRf8ED16FMMSK/1mCC0 -1VSydYnYhKmPZxMByTozGTV97wihA0XqXtadbkQoyvcnEuarBvEX3mPA3effqcEG -rreeDp1yzYtQRW85ZASaqgF5CYKhe9NekurZ5Jd+2mQPYRWPFpIFsSHoOLqbfcN1 -/S0Si6LZWq0Mi8cbSi/zq+Eh7Q0w+EXP6Goh0A7M4e1dKt+cfGQpeyeg3cF49Cda -RrTkSv2Sl2jbrShqAsG/HNhyBaI/gtLGi9tig9wAoV2zjGw1Ehs0GcwFq2g/f6Zv -W7rdZIBZT1RIQLczuwsEhv6cFrSM5OU2f5fuKnmeI6uvyz0jRqiMncYRjwI6LotB -sWmdTWi6xsctYirJ3Yip5Tqm01asyUuIeiT+eQ6I9CfHLiGBXEzxlK5PrFqfD7gK -LfB1gCN7SAlxKGepmFMwfF+fDrsurL2T2ePxaaNBLjRAzmpSpH0NedMd+eanuHXV -a/iOL2XmVis7iuFyk5M2XtLFfYBff+mxSPA8d9u5kCpoel0tx3iLmw== ------END CERTIFICATE----- diff --git a/util/cloud/cert.go b/util/cloud/cert.go deleted file mode 100644 index ec191d251..000000000 --- a/util/cloud/cert.go +++ /dev/null @@ -1,14 +0,0 @@ -package cloud - -import ( - "bytes" - _ "embed" -) - -//go:embed ca-cert.pem -var caCert []byte - -func caPEM() []byte { - copy := bytes.NewBuffer(caCert) - return copy.Bytes() -} diff --git a/util/cloud/client.go b/util/cloud/client.go index 89971b90b..ebea02947 100644 --- a/util/cloud/client.go +++ b/util/cloud/client.go @@ -2,8 +2,7 @@ package cloud import ( "crypto/tls" - "crypto/x509" - "fmt" + "strings" "google.golang.org/grpc" "google.golang.org/grpc/credentials" @@ -15,33 +14,15 @@ var ( conn *grpc.ClientConn ) -func loadTLSCredentials() (*tls.Config, error) { - certPool := x509.NewCertPool() - if !certPool.AppendCertsFromPEM(caPEM()) { - return nil, fmt.Errorf("failed to add CA certificate") - } - - // create the credentials and return it - config := &tls.Config{ - RootCAs: certPool, - } - - return config, nil -} - func Connection(uri string) (*grpc.ClientConn, error) { var err error if conn == nil { - var tlsConfig *tls.Config - if tlsConfig, err = loadTLSCredentials(); err != nil { - return nil, fmt.Errorf("cannot load TLS credentials: %w", err) - } - transportOption := grpc.WithInsecure() - if tlsConfig != nil { - transportOption = grpc.WithTransportCredentials(credentials.NewTLS(tlsConfig)) + if !strings.HasPrefix(uri, "localhost") { + transportOption = grpc.WithTransportCredentials(credentials.NewTLS(&tls.Config{ + InsecureSkipVerify: true, + })) } - conn, err = grpc.Dial(uri, transportOption) } diff --git a/internal/vehicle/audi.go b/vehicle/audi.go similarity index 97% rename from internal/vehicle/audi.go rename to vehicle/audi.go index d84d00e07..a9ccaea14 100644 --- a/internal/vehicle/audi.go +++ b/vehicle/audi.go @@ -7,8 +7,8 @@ import ( "time" "github.com/andig/evcc/api" - "github.com/andig/evcc/internal/vehicle/vw" "github.com/andig/evcc/util" + "github.com/andig/evcc/vehicle/vw" ) // https://github.com/davidgiga1993/AudiAPI diff --git a/internal/vehicle/bluelink/693a33fa-c117-43f2-ae3b-61a02d24f417 b/vehicle/bluelink/693a33fa-c117-43f2-ae3b-61a02d24f417 similarity index 100% rename from internal/vehicle/bluelink/693a33fa-c117-43f2-ae3b-61a02d24f417 rename to vehicle/bluelink/693a33fa-c117-43f2-ae3b-61a02d24f417 diff --git a/internal/vehicle/bluelink/99cfff84-f4e2-4be8-a5ed-e5b755eb6581 b/vehicle/bluelink/99cfff84-f4e2-4be8-a5ed-e5b755eb6581 similarity index 100% rename from internal/vehicle/bluelink/99cfff84-f4e2-4be8-a5ed-e5b755eb6581 rename to vehicle/bluelink/99cfff84-f4e2-4be8-a5ed-e5b755eb6581 diff --git a/internal/vehicle/bluelink/api.go b/vehicle/bluelink/api.go similarity index 100% rename from internal/vehicle/bluelink/api.go rename to vehicle/bluelink/api.go diff --git a/internal/vehicle/bluelink/identity.go b/vehicle/bluelink/identity.go similarity index 100% rename from internal/vehicle/bluelink/identity.go rename to vehicle/bluelink/identity.go diff --git a/internal/vehicle/bluelink/provider.go b/vehicle/bluelink/provider.go similarity index 100% rename from internal/vehicle/bluelink/provider.go rename to vehicle/bluelink/provider.go diff --git a/internal/vehicle/bluelink/stamps.go b/vehicle/bluelink/stamps.go similarity index 100% rename from internal/vehicle/bluelink/stamps.go rename to vehicle/bluelink/stamps.go diff --git a/internal/vehicle/bmw.go b/vehicle/bmw.go similarity index 100% rename from internal/vehicle/bmw.go rename to vehicle/bmw.go diff --git a/internal/vehicle/carwings.go b/vehicle/carwings.go similarity index 100% rename from internal/vehicle/carwings.go rename to vehicle/carwings.go diff --git a/internal/vehicle/cloud.go b/vehicle/cloud.go similarity index 98% rename from internal/vehicle/cloud.go rename to vehicle/cloud.go index 84aee6612..4f2852a5a 100644 --- a/internal/vehicle/cloud.go +++ b/vehicle/cloud.go @@ -7,8 +7,8 @@ import ( "time" "github.com/andig/evcc/api" + "github.com/andig/evcc/api/proto/pb" "github.com/andig/evcc/provider" - "github.com/andig/evcc/soc/proto/pb" "github.com/andig/evcc/util" "github.com/andig/evcc/util/cloud" "github.com/andig/evcc/util/request" diff --git a/internal/vehicle/config.go b/vehicle/config.go similarity index 100% rename from internal/vehicle/config.go rename to vehicle/config.go diff --git a/internal/vehicle/config_test.go b/vehicle/config_test.go similarity index 100% rename from internal/vehicle/config_test.go rename to vehicle/config_test.go diff --git a/internal/vehicle/enyaq.go b/vehicle/enyaq.go similarity index 95% rename from internal/vehicle/enyaq.go rename to vehicle/enyaq.go index 4e1c77a27..977d321e5 100644 --- a/internal/vehicle/enyaq.go +++ b/vehicle/enyaq.go @@ -7,9 +7,9 @@ import ( "time" "github.com/andig/evcc/api" - "github.com/andig/evcc/internal/vehicle/skoda" - "github.com/andig/evcc/internal/vehicle/vw" "github.com/andig/evcc/util" + "github.com/andig/evcc/vehicle/skoda" + "github.com/andig/evcc/vehicle/vw" ) // https://github.com/lendy007/skodaconnect diff --git a/internal/vehicle/ford.go b/vehicle/ford.go similarity index 100% rename from internal/vehicle/ford.go rename to vehicle/ford.go diff --git a/internal/vehicle/helper.go b/vehicle/helper.go similarity index 100% rename from internal/vehicle/helper.go rename to vehicle/helper.go diff --git a/internal/vehicle/hyundai.go b/vehicle/hyundai.go similarity index 97% rename from internal/vehicle/hyundai.go rename to vehicle/hyundai.go index 47b9ba336..8bf7c3f23 100644 --- a/internal/vehicle/hyundai.go +++ b/vehicle/hyundai.go @@ -7,8 +7,8 @@ import ( "time" "github.com/andig/evcc/api" - "github.com/andig/evcc/internal/vehicle/bluelink" "github.com/andig/evcc/util" + "github.com/andig/evcc/vehicle/bluelink" ) // Hyundai is an api.Vehicle implementation diff --git a/internal/vehicle/id.go b/vehicle/id.go similarity index 94% rename from internal/vehicle/id.go rename to vehicle/id.go index bee3faace..39145dc29 100644 --- a/internal/vehicle/id.go +++ b/vehicle/id.go @@ -7,9 +7,9 @@ import ( "time" "github.com/andig/evcc/api" - "github.com/andig/evcc/internal/vehicle/id" - "github.com/andig/evcc/internal/vehicle/vw" "github.com/andig/evcc/util" + "github.com/andig/evcc/vehicle/id" + "github.com/andig/evcc/vehicle/vw" ) // https://github.com/TA2k/ioBroker.vw-connect diff --git a/internal/vehicle/id/api.go b/vehicle/id/api.go similarity index 100% rename from internal/vehicle/id/api.go rename to vehicle/id/api.go diff --git a/internal/vehicle/id/provider.go b/vehicle/id/provider.go similarity index 100% rename from internal/vehicle/id/provider.go rename to vehicle/id/provider.go diff --git a/internal/vehicle/id/refresh.go b/vehicle/id/refresh.go similarity index 100% rename from internal/vehicle/id/refresh.go rename to vehicle/id/refresh.go diff --git a/internal/vehicle/id/token.go b/vehicle/id/token.go similarity index 100% rename from internal/vehicle/id/token.go rename to vehicle/id/token.go diff --git a/internal/vehicle/id/token_test.go b/vehicle/id/token_test.go similarity index 100% rename from internal/vehicle/id/token_test.go rename to vehicle/id/token_test.go diff --git a/internal/vehicle/kamereon/api.go b/vehicle/kamereon/api.go similarity index 100% rename from internal/vehicle/kamereon/api.go rename to vehicle/kamereon/api.go diff --git a/internal/vehicle/kia.go b/vehicle/kia.go similarity index 97% rename from internal/vehicle/kia.go rename to vehicle/kia.go index 8326c58f3..6c28530c4 100644 --- a/internal/vehicle/kia.go +++ b/vehicle/kia.go @@ -7,8 +7,8 @@ import ( "time" "github.com/andig/evcc/api" - "github.com/andig/evcc/internal/vehicle/bluelink" "github.com/andig/evcc/util" + "github.com/andig/evcc/vehicle/bluelink" ) // Kia is an api.Vehicle implementation diff --git a/internal/vehicle/nissan.go b/vehicle/nissan.go similarity index 93% rename from internal/vehicle/nissan.go rename to vehicle/nissan.go index 9b5fbe2cf..6a85e1ece 100644 --- a/internal/vehicle/nissan.go +++ b/vehicle/nissan.go @@ -6,9 +6,9 @@ import ( "time" "github.com/andig/evcc/api" - "github.com/andig/evcc/internal/vehicle/kamereon" - "github.com/andig/evcc/internal/vehicle/nissan" "github.com/andig/evcc/util" + "github.com/andig/evcc/vehicle/kamereon" + "github.com/andig/evcc/vehicle/nissan" ) // Credits to diff --git a/internal/vehicle/nissan/api.go b/vehicle/nissan/api.go similarity index 98% rename from internal/vehicle/nissan/api.go rename to vehicle/nissan/api.go index e955733ff..fcb481c23 100644 --- a/internal/vehicle/nissan/api.go +++ b/vehicle/nissan/api.go @@ -8,9 +8,9 @@ import ( "time" "github.com/andig/evcc/api" - "github.com/andig/evcc/internal/vehicle/kamereon" "github.com/andig/evcc/util" "github.com/andig/evcc/util/request" + "github.com/andig/evcc/vehicle/kamereon" "golang.org/x/oauth2" ) diff --git a/internal/vehicle/nissan/identity.go b/vehicle/nissan/identity.go similarity index 100% rename from internal/vehicle/nissan/identity.go rename to vehicle/nissan/identity.go diff --git a/internal/vehicle/nissan/types.go b/vehicle/nissan/types.go similarity index 100% rename from internal/vehicle/nissan/types.go rename to vehicle/nissan/types.go diff --git a/internal/vehicle/niu.go b/vehicle/niu.go similarity index 98% rename from internal/vehicle/niu.go rename to vehicle/niu.go index 391950256..accaf08a4 100644 --- a/internal/vehicle/niu.go +++ b/vehicle/niu.go @@ -10,10 +10,10 @@ import ( "time" "github.com/andig/evcc/api" - "github.com/andig/evcc/internal/vehicle/niu" "github.com/andig/evcc/provider" "github.com/andig/evcc/util" "github.com/andig/evcc/util/request" + "github.com/andig/evcc/vehicle/niu" ) // Niu is an api.Vehicle implementation for Niu vehicles diff --git a/internal/vehicle/niu/types.go b/vehicle/niu/types.go similarity index 100% rename from internal/vehicle/niu/types.go rename to vehicle/niu/types.go diff --git a/internal/vehicle/niu/types_test.go b/vehicle/niu/types_test.go similarity index 100% rename from internal/vehicle/niu/types_test.go rename to vehicle/niu/types_test.go diff --git a/internal/vehicle/porsche.go b/vehicle/porsche.go similarity index 96% rename from internal/vehicle/porsche.go rename to vehicle/porsche.go index 08335380c..c129db5de 100644 --- a/internal/vehicle/porsche.go +++ b/vehicle/porsche.go @@ -5,8 +5,8 @@ import ( "time" "github.com/andig/evcc/api" - "github.com/andig/evcc/internal/vehicle/porsche" "github.com/andig/evcc/util" + "github.com/andig/evcc/vehicle/porsche" ) type porscheProvider interface { diff --git a/internal/vehicle/porsche/identity.go b/vehicle/porsche/identity.go similarity index 100% rename from internal/vehicle/porsche/identity.go rename to vehicle/porsche/identity.go diff --git a/internal/vehicle/porsche/provider.go b/vehicle/porsche/provider.go similarity index 100% rename from internal/vehicle/porsche/provider.go rename to vehicle/porsche/provider.go diff --git a/internal/vehicle/porsche/provider_emobility.go b/vehicle/porsche/provider_emobility.go similarity index 100% rename from internal/vehicle/porsche/provider_emobility.go rename to vehicle/porsche/provider_emobility.go diff --git a/internal/vehicle/psa.go b/vehicle/psa.go similarity index 98% rename from internal/vehicle/psa.go rename to vehicle/psa.go index 93e30d855..8fa41f948 100644 --- a/internal/vehicle/psa.go +++ b/vehicle/psa.go @@ -7,8 +7,8 @@ import ( "time" "github.com/andig/evcc/api" - "github.com/andig/evcc/internal/vehicle/psa" "github.com/andig/evcc/util" + "github.com/andig/evcc/vehicle/psa" ) // https://github.com/flobz/psa_car_controller diff --git a/internal/vehicle/psa/api.go b/vehicle/psa/api.go similarity index 100% rename from internal/vehicle/psa/api.go rename to vehicle/psa/api.go diff --git a/internal/vehicle/psa/duration.go b/vehicle/psa/duration.go similarity index 100% rename from internal/vehicle/psa/duration.go rename to vehicle/psa/duration.go diff --git a/internal/vehicle/psa/provider.go b/vehicle/psa/provider.go similarity index 100% rename from internal/vehicle/psa/provider.go rename to vehicle/psa/provider.go diff --git a/internal/vehicle/renault.go b/vehicle/renault.go similarity index 100% rename from internal/vehicle/renault.go rename to vehicle/renault.go diff --git a/internal/vehicle/seat.go b/vehicle/seat.go similarity index 97% rename from internal/vehicle/seat.go rename to vehicle/seat.go index 0c824c23e..7d3f9d5e4 100644 --- a/internal/vehicle/seat.go +++ b/vehicle/seat.go @@ -7,8 +7,8 @@ import ( "time" "github.com/andig/evcc/api" - "github.com/andig/evcc/internal/vehicle/vw" "github.com/andig/evcc/util" + "github.com/andig/evcc/vehicle/vw" ) // https://github.com/trocotronic/weconnect diff --git a/internal/vehicle/skoda.go b/vehicle/skoda.go similarity index 97% rename from internal/vehicle/skoda.go rename to vehicle/skoda.go index c92630dbc..4ad207199 100644 --- a/internal/vehicle/skoda.go +++ b/vehicle/skoda.go @@ -7,8 +7,8 @@ import ( "time" "github.com/andig/evcc/api" - "github.com/andig/evcc/internal/vehicle/vw" "github.com/andig/evcc/util" + "github.com/andig/evcc/vehicle/vw" ) // https://github.com/trocotronic/weconnect diff --git a/internal/vehicle/skoda/api.go b/vehicle/skoda/api.go similarity index 100% rename from internal/vehicle/skoda/api.go rename to vehicle/skoda/api.go diff --git a/internal/vehicle/skoda/provider.go b/vehicle/skoda/provider.go similarity index 100% rename from internal/vehicle/skoda/provider.go rename to vehicle/skoda/provider.go diff --git a/internal/vehicle/skoda/refresh.go b/vehicle/skoda/refresh.go similarity index 100% rename from internal/vehicle/skoda/refresh.go rename to vehicle/skoda/refresh.go diff --git a/internal/vehicle/tesla.go b/vehicle/tesla.go similarity index 100% rename from internal/vehicle/tesla.go rename to vehicle/tesla.go diff --git a/internal/vehicle/vehicle.go b/vehicle/vehicle.go similarity index 90% rename from internal/vehicle/vehicle.go rename to vehicle/vehicle.go index ae5b32cbd..2b2e6d9e0 100644 --- a/internal/vehicle/vehicle.go +++ b/vehicle/vehicle.go @@ -5,7 +5,6 @@ import ( "time" "github.com/andig/evcc/api" - "github.com/andig/evcc/internal" "github.com/andig/evcc/provider" "github.com/andig/evcc/util" ) @@ -33,7 +32,7 @@ func (m *embed) Identify() (string, error) { return m.Identifier_, nil } -//go:generate go run ../../cmd/tools/decorate.go -f decorateVehicle -b api.Vehicle -t "api.ChargeState,Status,func() (api.ChargeStatus, error)" -t "api.VehicleRange,Range,func() (int64, error)" +//go:generate go run ../cmd/tools/decorate.go -f decorateVehicle -b api.Vehicle -t "api.ChargeState,Status,func() (api.ChargeStatus, error)" -t "api.VehicleRange,Range,func() (int64, error)" // Vehicle is an api.Vehicle implementation with configurable getters and setters. type Vehicle struct { @@ -45,7 +44,7 @@ type Vehicle struct { func init() { registry.Add("default", NewConfigurableFromConfig) - registry.Add(internal.Custom, NewConfigurableFromConfig) + registry.Add(api.Custom, NewConfigurableFromConfig) } // NewConfigurableFromConfig creates a new Vehicle diff --git a/internal/vehicle/vehicle_decorators.go b/vehicle/vehicle_decorators.go similarity index 100% rename from internal/vehicle/vehicle_decorators.go rename to vehicle/vehicle_decorators.go diff --git a/internal/vehicle/volvo.go b/vehicle/volvo.go similarity index 100% rename from internal/vehicle/volvo.go rename to vehicle/volvo.go diff --git a/internal/vehicle/vw.go b/vehicle/vw.go similarity index 97% rename from internal/vehicle/vw.go rename to vehicle/vw.go index 414c02bc9..08370aed8 100644 --- a/internal/vehicle/vw.go +++ b/vehicle/vw.go @@ -7,8 +7,8 @@ import ( "time" "github.com/andig/evcc/api" - "github.com/andig/evcc/internal/vehicle/vw" "github.com/andig/evcc/util" + "github.com/andig/evcc/vehicle/vw" ) // https://github.com/trocotronic/weconnect diff --git a/internal/vehicle/vw/api.go b/vehicle/vw/api.go similarity index 100% rename from internal/vehicle/vw/api.go rename to vehicle/vw/api.go diff --git a/internal/vehicle/vw/forms.go b/vehicle/vw/forms.go similarity index 100% rename from internal/vehicle/vw/forms.go rename to vehicle/vw/forms.go diff --git a/internal/vehicle/vw/functions.go b/vehicle/vw/functions.go similarity index 100% rename from internal/vehicle/vw/functions.go rename to vehicle/vw/functions.go diff --git a/internal/vehicle/vw/identity.go b/vehicle/vw/identity.go similarity index 98% rename from internal/vehicle/vw/identity.go rename to vehicle/vw/identity.go index 3f8134d23..8c8807caf 100644 --- a/internal/vehicle/vw/identity.go +++ b/vehicle/vw/identity.go @@ -7,11 +7,11 @@ import ( "net/url" "strings" - "github.com/andig/evcc/internal/vehicle/id" - "github.com/andig/evcc/internal/vehicle/skoda" "github.com/andig/evcc/util" "github.com/andig/evcc/util/oauth" "github.com/andig/evcc/util/request" + "github.com/andig/evcc/vehicle/id" + "github.com/andig/evcc/vehicle/skoda" "golang.org/x/net/publicsuffix" "golang.org/x/oauth2" ) diff --git a/internal/vehicle/vw/provider.go b/vehicle/vw/provider.go similarity index 100% rename from internal/vehicle/vw/provider.go rename to vehicle/vw/provider.go diff --git a/internal/vehicle/vw/refresh.go b/vehicle/vw/refresh.go similarity index 100% rename from internal/vehicle/vw/refresh.go rename to vehicle/vw/refresh.go diff --git a/internal/vehicle/vw/types.go b/vehicle/vw/types.go similarity index 100% rename from internal/vehicle/vw/types.go rename to vehicle/vw/types.go diff --git a/internal/vehicle/vw/types_test.go b/vehicle/vw/types_test.go similarity index 100% rename from internal/vehicle/vw/types_test.go rename to vehicle/vw/types_test.go