From fc371bf068bc9aac7faa6a6b2909aad5817a717f Mon Sep 17 00:00:00 2001 From: Ns2Kracy <89824014+Ns2Kracy@users.noreply.github.com> Date: Tue, 29 Nov 2022 23:44:45 +0800 Subject: [PATCH 1/2] add arch support (#707) --- README.md | 1 + .../service.d/casaos/arch/setup-casaos.sh | 40 ++++ .../service.d/casaos/arch/cleanup-casaos.sh | 204 ++++++++++++++++++ 3 files changed, 245 insertions(+) create mode 100644 build/scripts/setup/service.d/casaos/arch/setup-casaos.sh create mode 100644 build/sysroot/usr/share/casaos/cleanup/service.d/casaos/arch/cleanup-casaos.sh diff --git a/README.md b/README.md index e48934b..dd8da80 100644 --- a/README.md +++ b/README.md @@ -114,6 +114,7 @@ Community Support - Armbian 22.04 (✅ Tested) - Alpine (🚧 Not Fully Tested Yet) - OpenWrt (🚧 Not Fully Tested Yet) +- ArchLinux (🚧 Not Fully Tested Yet) ### Quick Setup CasaOS diff --git a/build/scripts/setup/service.d/casaos/arch/setup-casaos.sh b/build/scripts/setup/service.d/casaos/arch/setup-casaos.sh new file mode 100644 index 0000000..50c8d91 --- /dev/null +++ b/build/scripts/setup/service.d/casaos/arch/setup-casaos.sh @@ -0,0 +1,40 @@ +#!/bin/bash +### +# @Author: LinkLeong link@icewhale.org +# @Date: 2022-08-25 11:41:22 + # @LastEditors: LinkLeong + # @LastEditTime: 2022-08-31 17:54:17 + # @FilePath: /CasaOS/build/scripts/setup/service.d/casaos/debian/setup-casaos.sh +# @Description: + +# @Website: https://www.casaos.io +# Copyright (c) 2022 by icewhale, All Rights Reserved. +### + +set -e + +APP_NAME="casaos" + +# copy config files +CONF_PATH=/etc/casaos +OLD_CONF_PATH=/etc/casaos.conf +CONF_FILE=${CONF_PATH}/${APP_NAME}.conf +CONF_FILE_SAMPLE=${CONF_PATH}/${APP_NAME}.conf.sample + + +if [ -f "${OLD_CONF_PATH}" ]; then + echo "copy old conf" + cp "${OLD_CONF_PATH}" "${CONF_FILE}" +fi +if [ ! -f "${CONF_FILE}" ]; then + echo "Initializing config file..." + cp -v "${CONF_FILE_SAMPLE}" "${CONF_FILE}" +fi + +rm -rf /etc/systemd/system/casaos.service # remove old service file + +systemctl daemon-reload + +# enable service (without starting) +echo "Enabling service..." +systemctl enable --force --no-ask-password "${APP_NAME}.service" diff --git a/build/sysroot/usr/share/casaos/cleanup/service.d/casaos/arch/cleanup-casaos.sh b/build/sysroot/usr/share/casaos/cleanup/service.d/casaos/arch/cleanup-casaos.sh new file mode 100644 index 0000000..989ea55 --- /dev/null +++ b/build/sysroot/usr/share/casaos/cleanup/service.d/casaos/arch/cleanup-casaos.sh @@ -0,0 +1,204 @@ +#!/bin/bash + +set -e + +readonly CASA_SERVICES=( + "casaos.service" + "devmon@devmon.service" +) + +readonly CASA_EXEC=casaos +readonly CASA_CONF=/etc/casaos/casaos.conf +readonly CASA_URL=/var/run/casaos/casaos.url +readonly CASA_SERVICE_USR=/usr/lib/systemd/system/casaos.service +readonly CASA_SERVICE_LIB=/lib/systemd/system/casaos.service +readonly CASA_SERVICE_ETC=/etc/systemd/system/casaos.service + +# Old Casa Files +readonly CASA_PATH=/casaOS +readonly CASA_CONF_PATH_OLD=/etc/casaos.conf + +readonly aCOLOUR=( + '\e[38;5;154m' # green | Lines, bullets and separators + '\e[1m' # Bold white | Main descriptions + '\e[90m' # Grey | Credits + '\e[91m' # Red | Update notifications Alert + '\e[33m' # Yellow | Emphasis +) + +Show() { + # OK + if (($1 == 0)); then + echo -e "${aCOLOUR[2]}[$COLOUR_RESET${aCOLOUR[0]} OK $COLOUR_RESET${aCOLOUR[2]}]$COLOUR_RESET $2" + # FAILED + elif (($1 == 1)); then + echo -e "${aCOLOUR[2]}[$COLOUR_RESET${aCOLOUR[3]}FAILED$COLOUR_RESET${aCOLOUR[2]}]$COLOUR_RESET $2" + # INFO + elif (($1 == 2)); then + echo -e "${aCOLOUR[2]}[$COLOUR_RESET${aCOLOUR[0]} INFO $COLOUR_RESET${aCOLOUR[2]}]$COLOUR_RESET $2" + # NOTICE + elif (($1 == 3)); then + echo -e "${aCOLOUR[2]}[$COLOUR_RESET${aCOLOUR[4]}NOTICE$COLOUR_RESET${aCOLOUR[2]}]$COLOUR_RESET $2" + fi +} + +Warn() { + echo -e "${aCOLOUR[3]}$1$COLOUR_RESET" +} + +trap 'onCtrlC' INT +onCtrlC() { + echo -e "${COLOUR_RESET}" + exit 1 +} + +Detecting_CasaOS() { + if [[ ! -x "$(command -v ${CASA_EXEC})" ]]; then + Show 2 "CasaOS is not detected, exit the script." + exit 1 + else + Show 0 "This script will delete the containers you no longer use, and the CasaOS configuration files." + fi +} + +Uninstall_Container() { + if [[ ${UNINSTALL_ALL_CONTAINER} == true && "$(docker ps -aq)" != "" ]]; then + Show 2 "Start deleting containers." + docker stop "$(docker ps -aq)" || Show 1 "Failed to stop all containers." + docker rm "$(docker ps -aq)" || Show 1 "Failed to delete all containers." + fi +} + +Remove_Images() { + if [[ ${REMOVE_IMAGES} == "all" && "$(docker images -q)" != "" ]]; then + Show 2 "Start deleting all images." + docker rmi "$(docker images -q)" || Show 1 "Failed to delete all images." + elif [[ ${REMOVE_IMAGES} == "unuse" && "$(docker images -q)" != "" ]]; then + Show 2 "Start deleting unuse images." + docker image prune -af || Show 1 "Failed to delete unuse images." + fi +} + + +Uninstall_Casaos() { + + for SERVICE in "${CASA_SERVICES[@]}"; do + Show 2 "Stopping ${SERVICE}..." + systemctl disable --now "${SERVICE}" || Show 3 "Failed to disable ${SERVICE}" + done + + # Remove Service file + if [[ -f ${CASA_SERVICE_USR} ]]; then + rm -rvf ${CASA_SERVICE_USR} + fi + + if [[ -f ${CASA_SERVICE_LIB} ]]; then + rm -rvf ${CASA_SERVICE_LIB} + fi + + if [[ -f ${CASA_SERVICE_ETC} ]]; then + rm -rvf ${CASA_SERVICE_ETC} + fi + + # Old Casa Files + if [[ -d ${CASA_PATH} ]]; then + rm -rvf ${CASA_PATH} || Show 1 "Failed to delete legacy CasaOS files." + fi + + if [[ -f ${CASA_CONF_PATH_OLD} ]]; then + rm -rvf ${CASA_CONF_PATH_OLD} + fi + + # New Casa Files + if [[ ${REMOVE_APP_DATA} = true ]]; then + rm -rvf /DATA/AppData || Show 1 "Failed to delete AppData." + fi + + rm -rvf "$(which ${CASA_EXEC})" || Show 3 "Failed to remove ${CASA_EXEC}" + rm -rvf ${CASA_CONF} || Show 3 "Failed to remove ${CASA_CONF}" + rm -rvf ${CASA_URL} || Show 3 "Failed to remove ${CASA_URL}" + + rm -rvf /var/lib/casaos/app_category.json + rm -rvf /var/lib/casaos/app_list.json + rm -rvf /var/lib/casaos/docker_root +} + +Detecting_CasaOS + +while true; do + echo -n -e " ${aCOLOUR[4]}Do you want delete all containers? Y/n :${COLOUR_RESET}" + read -r input + case $input in + [yY][eE][sS] | [yY]) + UNINSTALL_ALL_CONTAINER=true + break + ;; + [nN][oO] | [nN]) + UNINSTALL_ALL_CONTAINER=false + break + ;; + *) + Warn " Invalid input..." + ;; + esac +done + +if [[ ${UNINSTALL_ALL_CONTAINER} == true ]]; then + while true; do + echo -n -e " ${aCOLOUR[4]}Do you want delete all images? Y/n :${COLOUR_RESET}" + read -r input + case $input in + [yY][eE][sS] | [yY]) + REMOVE_IMAGES="all" + break + ;; + [nN][oO] | [nN]) + REMOVE_IMAGES="none" + break + ;; + *) + Warn " Invalid input..." + ;; + esac + done + + while true; do + echo -n -e " ${aCOLOUR[4]}Do you want delete all AppData of CasaOS? Y/n :${COLOUR_RESET}" + read -r input + case $input in + [yY][eE][sS] | [yY]) + REMOVE_APP_DATA=true + break + ;; + [nN][oO] | [nN]) + REMOVE_APP_DATA=false + break + ;; + *) + Warn " Invalid input..." + ;; + esac + done +else + while true; do + echo -n -e " ${aCOLOUR[4]}Do you want to delete all images that are not used by the container? Y/n :${COLOUR_RESET}" + read -r input + case $input in + [yY][eE][sS] | [yY]) + REMOVE_IMAGES="unuse" + break + ;; + [nN][oO] | [nN]) + REMOVE_IMAGES="none" + break + ;; + *) + Warn " Invalid input..." + ;; + esac + done +fi + +Uninstall_Container +Remove_Images +Uninstall_Casaos From 536eac788da4e1b40e223435b94567f192361b6d Mon Sep 17 00:00:00 2001 From: Tiger Wang Date: Tue, 29 Nov 2022 12:17:14 -0500 Subject: [PATCH 2/2] move app domain to its own module (0.4.x) (#689) --- common/notify.go | 89 --- common/notify_test.go | 29 - common/share.go | 78 -- common/share_test.go | 14 - go.mod | 18 +- go.sum | 516 +------------ main.go | 24 +- model/app.go | 128 ---- model/category.go | 23 - model/docker.go | 24 - model/manifest.go | 133 ---- model/notify/application.go | 21 - model/sys_common.go | 6 +- pkg/config/init.go | 13 +- pkg/docker/emum.go | 3 - pkg/docker/helper.go | 402 ---------- pkg/docker/volumes.go | 11 - pkg/docker/volumes_test.go | 10 - pkg/sqlite/db.go | 13 +- pkg/utils/env_helper/env.go | 26 - pkg/utils/httper/httper.go | 50 +- pkg/utils/loger/log.go | 92 --- pkg/utils/port/port.go | 68 -- pkg/utils/port/port_test.go | 18 - pkg/utils/random/random.go | 24 - pkg/utils/random/random_test.go | 10 - route/init.go | 10 +- route/periodical.go | 6 +- route/route.go | 65 +- route/socket.go | 8 +- route/v1/app.go | 355 --------- route/v1/docker.go | 1267 ------------------------------- route/v1/file.go | 37 +- route/v1/notify.go | 56 ++ route/v1/notiry.go | 23 - route/v1/ssh.go | 96 +++ route/v1/system.go | 81 +- service/app.go | 480 ------------ service/casa.go | 248 +----- service/docker.go | 962 ----------------------- service/docker_base/common.go | 24 - service/docker_base/model.go | 9 - service/docker_base/mysql.go | 93 --- service/docker_test.go | 50 -- service/file.go | 10 +- service/model/o_container.go | 78 -- service/model/o_rely.go | 30 +- service/notify.go | 33 +- service/service.go | 28 +- service/system.go | 17 +- types/system.go | 2 +- 51 files changed, 319 insertions(+), 5592 deletions(-) delete mode 100644 common/notify.go delete mode 100644 common/notify_test.go delete mode 100644 common/share.go delete mode 100644 common/share_test.go delete mode 100644 model/app.go delete mode 100644 model/category.go delete mode 100644 model/docker.go delete mode 100644 model/manifest.go delete mode 100644 model/notify/application.go delete mode 100644 pkg/docker/emum.go delete mode 100644 pkg/docker/helper.go delete mode 100644 pkg/docker/volumes.go delete mode 100644 pkg/docker/volumes_test.go delete mode 100644 pkg/utils/env_helper/env.go delete mode 100644 pkg/utils/loger/log.go delete mode 100644 pkg/utils/port/port.go delete mode 100644 pkg/utils/port/port_test.go delete mode 100644 pkg/utils/random/random.go delete mode 100644 pkg/utils/random/random_test.go delete mode 100644 route/v1/app.go delete mode 100644 route/v1/docker.go create mode 100644 route/v1/notify.go delete mode 100644 route/v1/notiry.go create mode 100644 route/v1/ssh.go delete mode 100644 service/app.go delete mode 100644 service/docker.go delete mode 100644 service/docker_base/common.go delete mode 100644 service/docker_base/model.go delete mode 100644 service/docker_base/mysql.go delete mode 100644 service/docker_test.go delete mode 100644 service/model/o_container.go diff --git a/common/notify.go b/common/notify.go deleted file mode 100644 index a5cee48..0000000 --- a/common/notify.go +++ /dev/null @@ -1,89 +0,0 @@ -package common - -import ( - "bytes" - "encoding/json" - "errors" - "fmt" - "net/http" - "os" - "path/filepath" - "strings" -) - -const ( - CasaOSURLFilename = "casaos.url" - APICasaOSNotify = "/v1/notify" -) - -type NotifyService interface { - SendNotify(path string, message map[string]interface{}) error - SendSystemStatusNotify(message map[string]interface{}) error -} -type notifyService struct { - address string -} - -func (n *notifyService) SendNotify(path string, message map[string]interface{}) error { - - url := strings.TrimSuffix(n.address, "/") + APICasaOSNotify + "/" + path - body, err := json.Marshal(message) - if err != nil { - return err - } - response, err := http.Post(url, "application/json", bytes.NewBuffer(body)) - if err != nil { - return err - } - - if response.StatusCode != http.StatusOK { - return errors.New("failed to send notify (status code: " + fmt.Sprint(response.StatusCode) + ")") - } - return nil - -} - -// disk: "sys_disk":{"size":56866869248,"avail":5855485952,"health":true,"used":48099700736} -// usb: "sys_usb":[{"name": "sdc","size": 7747397632,"model": "DataTraveler_2.0","avail": 7714418688,"children": null}] -func (n *notifyService) SendSystemStatusNotify(message map[string]interface{}) error { - - url := strings.TrimSuffix(n.address, "/") + APICasaOSNotify + "/system_status" - fmt.Println(url) - body, err := json.Marshal(message) - if err != nil { - return err - } - response, err := http.Post(url, "application/json", bytes.NewBuffer(body)) - if err != nil { - return err - } - - if response.StatusCode != http.StatusOK { - return errors.New("failed to send notify (status code: " + fmt.Sprint(response.StatusCode) + ")") - } - return nil - -} -func NewNotifyService(runtimePath string) (NotifyService, error) { - casaosAddressFile := filepath.Join(runtimePath, CasaOSURLFilename) - - buf, err := os.ReadFile(casaosAddressFile) - if err != nil { - return nil, err - } - - address := string(buf) - - response, err := http.Get(address + "/ping") - if err != nil { - return nil, err - } - - if response.StatusCode != 200 { - return nil, errors.New("failed to ping casaos service") - } - - return ¬ifyService{ - address: address, - }, nil -} diff --git a/common/notify_test.go b/common/notify_test.go deleted file mode 100644 index 1e9c543..0000000 --- a/common/notify_test.go +++ /dev/null @@ -1,29 +0,0 @@ -package common - -import "testing" - -func TestSendNotify(t *testing.T) { - notify, err := NewNotifyService("/var/run/casaos") - if err != nil { - t.Fatal(err) - } - err = notify.SendNotify("test", map[string]interface{}{ - "test": "test", - }) - if err != nil { - t.Fatal(err) - } -} - -func TestSendSystemStatusNotify(t *testing.T) { - notify, err := NewNotifyService("/var/run/casaos") - if err != nil { - t.Fatal(err) - } - err = notify.SendSystemStatusNotify(map[string]interface{}{ - "sys_usb": `[{"name": "sdc","size": 7747397632,"model": "DataTraveler_2.0","avail": 7714418688,"children": null}]`, - }) - if err != nil { - t.Fatal(err) - } -} diff --git a/common/share.go b/common/share.go deleted file mode 100644 index a0da4b2..0000000 --- a/common/share.go +++ /dev/null @@ -1,78 +0,0 @@ -package common - -import ( - "bytes" - "encoding/json" - "errors" - "fmt" - "net/http" - "os" - "path/filepath" - "strings" -) - -const ( - APICasaOSShare = "/v1/samba/shares" -) - -type ShareService interface { - DeleteShare(id string) error -} -type shareService struct { - address string -} - -func (n *shareService) DeleteShare(id string) error { - url := strings.TrimSuffix(n.address, "/") + APICasaOSShare + "/" + id - fmt.Println(url) - message := "{}" - body, err := json.Marshal(message) - if err != nil { - return err - } - - client := &http.Client{} - - // Create request - req, err := http.NewRequest("DELETE", url, bytes.NewBuffer(body)) - if err != nil { - return err - } - - // Fetch Request - response, err := client.Do(req) - if err != nil { - return err - } - defer response.Body.Close() - - if response.StatusCode != http.StatusOK { - return errors.New("failed to send share (status code: " + fmt.Sprint(response.StatusCode) + ")") - } - return nil - -} - -func NewShareService(runtimePath string) (ShareService, error) { - casaosAddressFile := filepath.Join(runtimePath, CasaOSURLFilename) - - buf, err := os.ReadFile(casaosAddressFile) - if err != nil { - return nil, err - } - - address := string(buf) - - response, err := http.Get(address + "/ping") - if err != nil { - return nil, err - } - - if response.StatusCode != 200 { - return nil, errors.New("failed to ping casaos service") - } - - return &shareService{ - address: address, - }, nil -} diff --git a/common/share_test.go b/common/share_test.go deleted file mode 100644 index ce79e03..0000000 --- a/common/share_test.go +++ /dev/null @@ -1,14 +0,0 @@ -package common - -import "testing" - -func TestDeleteShare(t *testing.T) { - share, err := NewShareService("/var/run/casaos") - if err != nil { - t.Fatal(err) - } - err = share.DeleteShare("1") - if err != nil { - t.Fatal(err) - } -} diff --git a/go.mod b/go.mod index b6ca74b..231a1da 100644 --- a/go.mod +++ b/go.mod @@ -4,18 +4,13 @@ go 1.16 require ( github.com/Curtis-Milo/nat-type-identifier-go v0.0.0-20220215191915-18d42168c63d - github.com/IceWhaleTech/CasaOS-Common v0.3.7-5 + github.com/IceWhaleTech/CasaOS-Common v0.4.0-alpha1 github.com/IceWhaleTech/CasaOS-Gateway v0.3.6 - github.com/Microsoft/go-winio v0.5.0 // indirect github.com/ambelovsky/go-structs v1.1.0 // indirect github.com/ambelovsky/gosf v0.0.0-20201109201340-237aea4d6109 github.com/ambelovsky/gosf-socketio v0.0.0-20201109193639-add9d32f8b19 // indirect - github.com/containerd/containerd v1.5.7 // indirect github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e github.com/disintegration/imaging v1.6.2 - github.com/docker/distribution v2.8.0+incompatible // indirect - github.com/docker/docker v20.10.7+incompatible - github.com/docker/go-connections v0.4.0 github.com/dsoprea/go-exif/v3 v3.0.0-20210625224831-a6301f85c82b github.com/dsoprea/go-logging v0.0.0-20200710184922-b02d349568dd // indirect github.com/gin-contrib/gzip v0.0.6 @@ -25,21 +20,14 @@ require ( github.com/gomodule/redigo v1.8.5 github.com/google/go-github/v36 v36.0.0 github.com/googollee/go-socket.io v1.6.2 - github.com/gorilla/mux v1.8.0 // indirect - github.com/gorilla/websocket v1.4.2 + github.com/gorilla/websocket v1.5.0 github.com/hirochachacha/go-smb2 v1.1.0 - github.com/jinzhu/copier v0.3.2 github.com/lucas-clemente/quic-go v0.25.0 github.com/mholt/archiver/v3 v3.5.1 - github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6 // indirect - github.com/morikuni/aec v1.0.0 // indirect - github.com/opencontainers/image-spec v1.0.2 // indirect github.com/patrickmn/go-cache v2.1.0+incompatible - github.com/pkg/errors v0.9.1 github.com/robfig/cron v1.2.0 github.com/satori/go.uuid v1.2.0 github.com/shirou/gopsutil/v3 v3.22.7 - github.com/sirupsen/logrus v1.8.1 github.com/smartystreets/assertions v1.2.0 // indirect github.com/smartystreets/goconvey v1.6.4 // indirect github.com/stretchr/testify v1.8.0 @@ -48,9 +36,7 @@ require ( golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4 golang.org/x/mod v0.5.0 // indirect golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5 - golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac // indirect golang.org/x/tools v0.1.7 // indirect - gopkg.in/natefinch/lumberjack.v2 v2.0.0 gorm.io/driver/sqlite v1.2.6 gorm.io/gorm v1.22.5 ) diff --git a/go.sum b/go.sum index 2443326..9e43f8a 100644 --- a/go.sum +++ b/go.sum @@ -1,4 +1,3 @@ -bazil.org/fuse v0.0.0-20160811212531-371fbbdaa898/go.mod h1:Xbm+BRKSBEpa4q4hTSxohYNQpsxXPbPry4JJWOB3LB8= cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.31.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= @@ -62,20 +61,6 @@ dmitri.shuralyov.com/html/belt v0.0.0-20180602232347-f7d459c86be0/go.mod h1:JLBr dmitri.shuralyov.com/service/change v0.0.0-20181023043359-a85b471d5412/go.mod h1:a1inKt/atXimZ4Mv927x+r7UpyzRUf4emIoiiSC2TN4= dmitri.shuralyov.com/state v0.0.0-20180228185332-28bcc343414c/go.mod h1:0PRwlb0D6DFvNNtx+9ybjezNCa8XF0xaYcETyp6rHWU= git.apache.org/thrift.git v0.0.0-20180902110319-2566ecd5d999/go.mod h1:fPE2ZNJGynbRyZ4dJvy6G277gSllfV2HJqblrnkyeyg= -github.com/Azure/azure-sdk-for-go v16.2.1+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= -github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8= -github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= -github.com/Azure/go-autorest v10.8.1+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest/autorest v0.11.1/go.mod h1:JFgpikqFJ/MleTTxwepExTKnFUKKszPS8UavbQYUMuw= -github.com/Azure/go-autorest/autorest/adal v0.9.0/go.mod h1:/c022QCutn2P7uY+/oQWWNcK9YU+MH96NgK+jErpbcg= -github.com/Azure/go-autorest/autorest/adal v0.9.5/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= -github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= -github.com/Azure/go-autorest/autorest/mocks v0.4.0/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= -github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= -github.com/Azure/go-autorest/logger v0.2.0/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= -github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/toml v1.2.0 h1:Rt8g24XnyGTyglgET/PRUNlrUeu9F5L+7FilkXfZgs0= github.com/BurntSushi/toml v1.2.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= @@ -84,41 +69,16 @@ github.com/Curtis-Milo/nat-type-identifier-go v0.0.0-20220215191915-18d42168c63d github.com/Curtis-Milo/nat-type-identifier-go v0.0.0-20220215191915-18d42168c63d/go.mod h1:lW9x+yEjqKdPbE3+cf2fGPJXCw/hChX3Omi9QHTLFsQ= github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= github.com/IceWhaleTech/CasaOS-Common v0.0.0-20220901034123-ca130f6b5ce9/go.mod h1:2MiivEMzvh41codhEKUcn46WK3Ffesop/04qa9jsvQk= -github.com/IceWhaleTech/CasaOS-Common v0.3.7-5 h1:CLPeUaFoGCA3WNnOWxtdFbBmLIg7odCQglZJ/c878uU= -github.com/IceWhaleTech/CasaOS-Common v0.3.7-5/go.mod h1:2MiivEMzvh41codhEKUcn46WK3Ffesop/04qa9jsvQk= +github.com/IceWhaleTech/CasaOS-Common v0.4.0-alpha1 h1:JeHZAwIriXKGVbaA65FQu/L80nwxb8oF/de5vZp5eHQ= +github.com/IceWhaleTech/CasaOS-Common v0.4.0-alpha1/go.mod h1:xcemiRsXcs1zrmQxYMyExDjZ7UHYwkJqYE71IDIV0xA= github.com/IceWhaleTech/CasaOS-Gateway v0.3.6 h1:2tQQo85+jzbbjqIsKKn77QlAA73bc7vZsVCFvWnK4mg= github.com/IceWhaleTech/CasaOS-Gateway v0.3.6/go.mod h1:hnZwGUzcOyiufMpVO7l3gu2gAm6Ws4TY4Nlj3kMshXA= -github.com/Microsoft/go-winio v0.4.11/go.mod h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcyvVC4A4RozmA= -github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= -github.com/Microsoft/go-winio v0.4.15-0.20190919025122-fc70bd9a86b5/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw= -github.com/Microsoft/go-winio v0.4.16-0.20201130162521-d1ffc52c7331/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0= -github.com/Microsoft/go-winio v0.4.16/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0= -github.com/Microsoft/go-winio v0.4.17-0.20210211115548-6eac466e5fa3/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= -github.com/Microsoft/go-winio v0.4.17-0.20210324224401-5516f17a5958/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= -github.com/Microsoft/go-winio v0.4.17/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= -github.com/Microsoft/go-winio v0.5.0 h1:Elr9Wn+sGKPlkaBvwu4mTrxtmOp3F3yV9qhaHbXGjwU= -github.com/Microsoft/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= -github.com/Microsoft/hcsshim v0.8.6/go.mod h1:Op3hHsoHPAvb6lceZHDtd9OkTew38wNoXnJs8iY7rUg= -github.com/Microsoft/hcsshim v0.8.7-0.20190325164909-8abdbb8205e4/go.mod h1:Op3hHsoHPAvb6lceZHDtd9OkTew38wNoXnJs8iY7rUg= -github.com/Microsoft/hcsshim v0.8.7/go.mod h1:OHd7sQqRFrYd3RmSgbgji+ctCwkbq2wbEYNSzOYtcBQ= -github.com/Microsoft/hcsshim v0.8.9/go.mod h1:5692vkUqntj1idxauYlpoINNKeqCiG6Sg38RRsjT5y8= -github.com/Microsoft/hcsshim v0.8.14/go.mod h1:NtVKoYxQuTLx6gEq0L96c9Ju4JbRJ4nY2ow3VK6a9Lg= -github.com/Microsoft/hcsshim v0.8.15/go.mod h1:x38A4YbHbdxJtc0sF6oIz+RG0npwSCAvn69iY6URG00= -github.com/Microsoft/hcsshim v0.8.16/go.mod h1:o5/SZqmR7x9JNKsW3pu+nqHm0MF8vbA+VxGOoXdC600= -github.com/Microsoft/hcsshim v0.8.21/go.mod h1:+w2gRZ5ReXQhFOrvSQeNfhrYB/dg3oDwTOcER2fw4I4= -github.com/Microsoft/hcsshim/test v0.0.0-20201218223536-d3e5debf77da/go.mod h1:5hlzMzRKMLyo42nCZ9oml8AdTlq/0cvIaBv6tK1RehU= -github.com/Microsoft/hcsshim/test v0.0.0-20210227013316-43a75bb4edd3/go.mod h1:mw7qgWloBUl75W/gVH3cQszUg1+gUITj7D6NY7ywVnY= -github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d/go.mod h1:HI8ITrYtUY+O+ZhtlqUnD8+KwNPOyugEhfP9fdUIaEQ= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= -github.com/alexflint/go-filemutex v0.0.0-20171022225611-72bdc8eae2ae/go.mod h1:CgnQgUtFrFz9mxFNtED3jI5tLDjKlOM+oUF/sTk6ps0= github.com/ambelovsky/go-structs v1.1.0 h1:LXj4/mHnYw0qhXQhOo96+ULGQ88H8qMcZd5SHef8boY= github.com/ambelovsky/go-structs v1.1.0/go.mod h1:zN3RBXQvxgjjq/Q/WZS7p5AEK+qC9mNg7ycnvoQ63Ak= github.com/ambelovsky/gosf v0.0.0-20201109201340-237aea4d6109 h1:Tp8GVfUOEmJftBqi4+/aXTwJzm24POo6wIHeuTqaT+Y= @@ -130,48 +90,27 @@ github.com/andybalholm/brotli v1.0.1/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= -github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= github.com/armon/go-metrics v0.3.10/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= -github.com/aws/aws-sdk-go v1.15.11/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/benbjohnson/clock v1.3.0 h1:ip6w0uFQkncKQ979AypyG0ER7mqUSBdKLOgAle/AT8A= github.com/benbjohnson/clock v1.3.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= -github.com/beorn7/perks v0.0.0-20160804104726-4c0e84591b9a/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/bitly/go-simplejson v0.5.0/go.mod h1:cXHtHw4XUPsvGaxgjIAn8PhEWG9NfngEKAMDJEczWVA= -github.com/bits-and-blooms/bitset v1.2.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= -github.com/blang/semver v3.1.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= -github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= -github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= github.com/bradfitz/go-smtpd v0.0.0-20170404230938-deb6d6237625/go.mod h1:HYsPBTaaSFSlLx/70C2HPIMNZpVV8+vt/A+FMnYP11g= -github.com/bshuster-repo/logrus-logstash-hook v0.4.1/go.mod h1:zsTqEiSzDgAa/8GZR7E1qaXrhYNDKBYy5/dWPTIflbk= -github.com/buger/jsonparser v0.0.0-20180808090653-f4dd9f5a6b44/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s= github.com/buger/jsonparser v0.0.0-20181115193947-bf1c66bbce23/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s= -github.com/bugsnag/bugsnag-go v0.0.0-20141110184014-b1d153021fcd/go.mod h1:2oa8nejYd4cQ/b0hMIopN0lCRxU0bueqREvZLWFrtK8= -github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b/go.mod h1:obH5gd0BsqsP2LwDJ9aOkm/6J86V6lyAXCoQWGw3K50= -github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0/go.mod h1:D/8v3kj0zr8ZAKg1AQ6crr+5VwKN5eIywRkfhyM/+dE= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/checkpoint-restore/go-criu/v4 v4.1.0/go.mod h1:xUQBLp4RLc5zJtWY++yjOoMoB5lihDt7fai+75m+rGw= -github.com/checkpoint-restore/go-criu/v5 v5.0.0/go.mod h1:cfwC0EG7HMUenopBsUf9d89JlCLQIfgVcNsNN0t6T2M= github.com/cheekybits/genny v1.0.0 h1:uGGa4nei+j20rOSeDeP5Of12XVm7TGUd4dJA9RDitfE= github.com/cheekybits/genny v1.0.0/go.mod h1:+tQajlRqAUrPI7DOSpB0XAqZYtQakVtB7wXkRAgjxjQ= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/cilium/ebpf v0.0.0-20200110133405-4032b1d8aae3/go.mod h1:MA5e5Lr8slmEg9bt0VpxxWqJlO4iwu3FBdHUzV7wQVg= -github.com/cilium/ebpf v0.0.0-20200702112145-1c8d4c9ef775/go.mod h1:7cR51M8ViRLIdUjrmSXlK9pkrsDlLHbO8jiB8X8JnOc= -github.com/cilium/ebpf v0.2.0/go.mod h1:To2CFviqOWL/M0gIMsvSMlqe7em/l1ALkX1PyjrX2Qs= -github.com/cilium/ebpf v0.4.0/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs= -github.com/cilium/ebpf v0.6.2/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs= github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= @@ -184,146 +123,18 @@ github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWH github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= -github.com/containerd/aufs v0.0.0-20200908144142-dab0cbea06f4/go.mod h1:nukgQABAEopAHvB6j7cnP5zJ+/3aVcE7hCYqvIwAHyE= -github.com/containerd/aufs v0.0.0-20201003224125-76a6863f2989/go.mod h1:AkGGQs9NM2vtYHaUen+NljV0/baGCAPELGm2q9ZXpWU= -github.com/containerd/aufs v0.0.0-20210316121734-20793ff83c97/go.mod h1:kL5kd6KM5TzQjR79jljyi4olc1Vrx6XBlcyj3gNv2PU= -github.com/containerd/aufs v1.0.0/go.mod h1:kL5kd6KM5TzQjR79jljyi4olc1Vrx6XBlcyj3gNv2PU= -github.com/containerd/btrfs v0.0.0-20201111183144-404b9149801e/go.mod h1:jg2QkJcsabfHugurUvvPhS3E08Oxiuh5W/g1ybB4e0E= -github.com/containerd/btrfs v0.0.0-20210316141732-918d888fb676/go.mod h1:zMcX3qkXTAi9GI50+0HOeuV8LU2ryCE/V2vG/ZBiTss= -github.com/containerd/btrfs v1.0.0/go.mod h1:zMcX3qkXTAi9GI50+0HOeuV8LU2ryCE/V2vG/ZBiTss= -github.com/containerd/cgroups v0.0.0-20190717030353-c4b9ac5c7601/go.mod h1:X9rLEHIqSf/wfK8NsPqxJmeZgW4pcfzdXITDrUSJ6uI= -github.com/containerd/cgroups v0.0.0-20190919134610-bf292b21730f/go.mod h1:OApqhQ4XNSNC13gXIwDjhOQxjWa/NxkwZXJ1EvqT0ko= -github.com/containerd/cgroups v0.0.0-20200531161412-0dbf7f05ba59/go.mod h1:pA0z1pT8KYB3TCXK/ocprsh7MAkoW8bZVzPdih9snmM= -github.com/containerd/cgroups v0.0.0-20200710171044-318312a37340/go.mod h1:s5q4SojHctfxANBDvMeIaIovkq29IP48TKAxnhYRxvo= -github.com/containerd/cgroups v0.0.0-20200824123100-0b889c03f102/go.mod h1:s5q4SojHctfxANBDvMeIaIovkq29IP48TKAxnhYRxvo= -github.com/containerd/cgroups v0.0.0-20210114181951-8a68de567b68/go.mod h1:ZJeTFisyysqgcCdecO57Dj79RfL0LNeGiFUqLYQRYLE= -github.com/containerd/cgroups v1.0.1/go.mod h1:0SJrPIenamHDcZhEcJMNBB85rHcUsw4f25ZfBiPYRkU= -github.com/containerd/console v0.0.0-20180822173158-c12b1e7919c1/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw= -github.com/containerd/console v0.0.0-20181022165439-0650fd9eeb50/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw= -github.com/containerd/console v0.0.0-20191206165004-02ecf6a7291e/go.mod h1:8Pf4gM6VEbTNRIT26AyyU7hxdQU3MvAvxVI0sc00XBE= -github.com/containerd/console v1.0.1/go.mod h1:XUsP6YE/mKtz6bxc+I8UiKKTP04qjQL4qcS3XoQ5xkw= -github.com/containerd/console v1.0.2/go.mod h1:ytZPjGgY2oeTkAONYafi2kSj0aYggsf8acV1PGKCbzQ= -github.com/containerd/containerd v1.2.10/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.3.0-beta.2.0.20190828155532-0293cbd26c69/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.3.0/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.3.1-0.20191213020239-082f7e3aed57/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.3.2/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.4.0-beta.2.0.20200729163537-40b22ef07410/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.4.1/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.4.3/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.5.0-beta.1/go.mod h1:5HfvG1V2FsKesEGQ17k5/T7V960Tmcumvqn8Mc+pCYQ= -github.com/containerd/containerd v1.5.0-beta.3/go.mod h1:/wr9AVtEM7x9c+n0+stptlo/uBBoBORwEx6ardVcmKU= -github.com/containerd/containerd v1.5.0-beta.4/go.mod h1:GmdgZd2zA2GYIBZ0w09ZvgqEq8EfBp/m3lcVZIvPHhI= -github.com/containerd/containerd v1.5.0-rc.0/go.mod h1:V/IXoMqNGgBlabz3tHD2TWDoTJseu1FGOKuoA4nNb2s= -github.com/containerd/containerd v1.5.1/go.mod h1:0DOxVqwDy2iZvrZp2JUx/E+hS0UNTVn7dJnIOwtYR4g= -github.com/containerd/containerd v1.5.7 h1:rQyoYtj4KddB3bxG6SAqd4+08gePNyJjRqvOIfV3rkM= -github.com/containerd/containerd v1.5.7/go.mod h1:gyvv6+ugqY25TiXxcZC3L5yOeYgEw0QMhscqVp1AR9c= -github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= -github.com/containerd/continuity v0.0.0-20190815185530-f2a389ac0a02/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= -github.com/containerd/continuity v0.0.0-20191127005431-f65d91d395eb/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= -github.com/containerd/continuity v0.0.0-20200710164510-efbc4488d8fe/go.mod h1:cECdGN1O8G9bgKTlLhuPJimka6Xb/Gg7vYzCTNVxhvo= -github.com/containerd/continuity v0.0.0-20201208142359-180525291bb7/go.mod h1:kR3BEg7bDFaEddKm54WSmrol1fKWDU1nKYkgrcgZT7Y= -github.com/containerd/continuity v0.0.0-20210208174643-50096c924a4e/go.mod h1:EXlVlkqNba9rJe3j7w3Xa924itAMLgZH4UD/Q4PExuQ= -github.com/containerd/continuity v0.1.0/go.mod h1:ICJu0PwR54nI0yPEnJ6jcS+J7CZAUXrLh8lPo2knzsM= -github.com/containerd/fifo v0.0.0-20180307165137-3d5202aec260/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI= -github.com/containerd/fifo v0.0.0-20190226154929-a9fb20d87448/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI= -github.com/containerd/fifo v0.0.0-20200410184934-f15a3290365b/go.mod h1:jPQ2IAeZRCYxpS/Cm1495vGFww6ecHmMk1YJH2Q5ln0= -github.com/containerd/fifo v0.0.0-20201026212402-0724c46b320c/go.mod h1:jPQ2IAeZRCYxpS/Cm1495vGFww6ecHmMk1YJH2Q5ln0= -github.com/containerd/fifo v0.0.0-20210316144830-115abcc95a1d/go.mod h1:ocF/ME1SX5b1AOlWi9r677YJmCPSwwWnQ9O123vzpE4= -github.com/containerd/fifo v1.0.0/go.mod h1:ocF/ME1SX5b1AOlWi9r677YJmCPSwwWnQ9O123vzpE4= -github.com/containerd/go-cni v1.0.1/go.mod h1:+vUpYxKvAF72G9i1WoDOiPGRtQpqsNW/ZHtSlv++smU= -github.com/containerd/go-cni v1.0.2/go.mod h1:nrNABBHzu0ZwCug9Ije8hL2xBCYh/pjfMb1aZGrrohk= -github.com/containerd/go-runc v0.0.0-20180907222934-5a6d9f37cfa3/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0= -github.com/containerd/go-runc v0.0.0-20190911050354-e029b79d8cda/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0= -github.com/containerd/go-runc v0.0.0-20200220073739-7016d3ce2328/go.mod h1:PpyHrqVs8FTi9vpyHwPwiNEGaACDxT/N/pLcvMSRA9g= -github.com/containerd/go-runc v0.0.0-20201020171139-16b287bc67d0/go.mod h1:cNU0ZbCgCQVZK4lgG3P+9tn9/PaJNmoDXPpoJhDR+Ok= -github.com/containerd/go-runc v1.0.0/go.mod h1:cNU0ZbCgCQVZK4lgG3P+9tn9/PaJNmoDXPpoJhDR+Ok= -github.com/containerd/imgcrypt v1.0.1/go.mod h1:mdd8cEPW7TPgNG4FpuP3sGBiQ7Yi/zak9TYCG3juvb0= -github.com/containerd/imgcrypt v1.0.4-0.20210301171431-0ae5c75f59ba/go.mod h1:6TNsg0ctmizkrOgXRNQjAPFWpMYRWuiB6dSF4Pfa5SA= -github.com/containerd/imgcrypt v1.1.1-0.20210312161619-7ed62a527887/go.mod h1:5AZJNI6sLHJljKuI9IHnw1pWqo/F0nGDOuR9zgTs7ow= -github.com/containerd/imgcrypt v1.1.1/go.mod h1:xpLnwiQmEUJPvQoAapeb2SNCxz7Xr6PJrXQb0Dpc4ms= -github.com/containerd/nri v0.0.0-20201007170849-eb1350a75164/go.mod h1:+2wGSDGFYfE5+So4M5syatU0N0f0LbWpuqyMi4/BE8c= -github.com/containerd/nri v0.0.0-20210316161719-dbaa18c31c14/go.mod h1:lmxnXF6oMkbqs39FiCt1s0R2HSMhcLel9vNL3m4AaeY= -github.com/containerd/nri v0.1.0/go.mod h1:lmxnXF6oMkbqs39FiCt1s0R2HSMhcLel9vNL3m4AaeY= -github.com/containerd/ttrpc v0.0.0-20190828154514-0e0f228740de/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o= -github.com/containerd/ttrpc v0.0.0-20190828172938-92c8520ef9f8/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o= -github.com/containerd/ttrpc v0.0.0-20191028202541-4f1b8fe65a5c/go.mod h1:LPm1u0xBw8r8NOKoOdNMeVHSawSsltak+Ihv+etqsE8= -github.com/containerd/ttrpc v1.0.1/go.mod h1:UAxOpgT9ziI0gJrmKvgcZivgxOp8iFPSk8httJEt98Y= -github.com/containerd/ttrpc v1.0.2/go.mod h1:UAxOpgT9ziI0gJrmKvgcZivgxOp8iFPSk8httJEt98Y= -github.com/containerd/typeurl v0.0.0-20180627222232-a93fcdb778cd/go.mod h1:Cm3kwCdlkCfMSHURc+r6fwoGH6/F1hH3S4sg0rLFWPc= -github.com/containerd/typeurl v0.0.0-20190911142611-5eb25027c9fd/go.mod h1:GeKYzf2pQcqv7tJ0AoCuuhtnqhva5LNU3U+OyKxxJpk= -github.com/containerd/typeurl v1.0.1/go.mod h1:TB1hUtrpaiO88KEK56ijojHS1+NeF0izUACaJW2mdXg= -github.com/containerd/typeurl v1.0.2/go.mod h1:9trJWW2sRlGub4wZJRTW83VtbOLS6hwcDZXTn6oPz9s= -github.com/containerd/zfs v0.0.0-20200918131355-0a33824f23a2/go.mod h1:8IgZOBdv8fAgXddBT4dBXJPtxyRsejFIpXoklgxgEjw= -github.com/containerd/zfs v0.0.0-20210301145711-11e8f1707f62/go.mod h1:A9zfAbMlQwE+/is6hi0Xw8ktpL+6glmqZYtevJgaB8Y= -github.com/containerd/zfs v0.0.0-20210315114300-dde8f0fda960/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY= -github.com/containerd/zfs v0.0.0-20210324211415-d5c4544f0433/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY= -github.com/containerd/zfs v1.0.0/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY= -github.com/containernetworking/cni v0.7.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= -github.com/containernetworking/cni v0.8.0/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= -github.com/containernetworking/cni v0.8.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= -github.com/containernetworking/plugins v0.8.6/go.mod h1:qnw5mN19D8fIwkqW7oHHYDHVlzhJpcY6TQxn/fUyDDM= -github.com/containernetworking/plugins v0.9.1/go.mod h1:xP/idU2ldlzN6m4p5LmGiwRDjeJr6FLK6vuiUwoH7P8= -github.com/containers/ocicrypt v1.0.1/go.mod h1:MeJDzk1RJHv89LjsH0Sp5KTY3ZYkjXO/C+bKAeWFIrc= -github.com/containers/ocicrypt v1.1.0/go.mod h1:b8AOe0YR67uU8OqfVNcznfFpAzu3rdgUV4GP9qXPfu4= -github.com/containers/ocicrypt v1.1.1/go.mod h1:Dm55fwWm1YZAjYRaJ94z2mfZikIyIN4B0oB3dj3jFxY= -github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= -github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/go-iptables v0.4.5/go.mod h1:/mVI274lEDI2ns62jHCDnCyBF9Iwsmekav8Dbxlm1MU= -github.com/coreos/go-iptables v0.5.0/go.mod h1:/mVI274lEDI2ns62jHCDnCyBF9Iwsmekav8Dbxlm1MU= -github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= -github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-systemd v0.0.0-20161114122254-48702e0da86b/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20181012123002-c6f51f82210d/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e h1:Wf6HqHfScWJN9/ZjdUKyjop4mf3Qdd+1TvvltAvM3m8= github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd/v22 v22.0.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= -github.com/coreos/go-systemd/v22 v22.1.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= github.com/coreos/go-systemd/v22 v22.3.2 h1:D9/bQk5vlXQFZ6Kwuu6zaiXJ9oTPe68++AzAJc1DzSI= github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/cyphar/filepath-securejoin v0.2.2/go.mod h1:FpkQEhXnPnOthhzymB7CGsFk2G9VLXONKD9G7QGMM+4= -github.com/d2g/dhcp4 v0.0.0-20170904100407-a1d1b6c41b1c/go.mod h1:Ct2BUK8SB0YC1SMSibvLzxjeJLnrYEVLULFNiHY9YfQ= -github.com/d2g/dhcp4client v1.0.0/go.mod h1:j0hNfjhrt2SxUOw55nL0ATM/z4Yt3t2Kd1mW34z5W5s= -github.com/d2g/dhcp4server v0.0.0-20181031114812-7d4a0a7f59a5/go.mod h1:Eo87+Kg/IX2hfWJfwxMzLyuSZyxSoAug2nGa1G2QAi8= -github.com/d2g/hardwareaddr v0.0.0-20190221164911-e7d9fbe030e4/go.mod h1:bMl4RjIciD2oAxI7DmWRx6gbeqrkoLqv3MV0vzNad+I= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/denverdino/aliyungo v0.0.0-20190125010748-a747050bb1ba/go.mod h1:dV8lFg6daOBZbT6/BDGIz6Y3WFGn8juu6G+CQ6LHtl0= -github.com/dgrijalva/jwt-go v0.0.0-20170104182250-a601269ab70c/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -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/disintegration/imaging v1.6.2 h1:w1LecBlG2Lnp8B3jk5zSuNqd7b4DXhcjwek1ei82L+c= github.com/disintegration/imaging v1.6.2/go.mod h1:44/5580QXChDfwIclfc/PCwrr44amcmDAg8hxG0Ewe4= -github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E= -github.com/docker/distribution v0.0.0-20190905152932-14b96e55d84c/go.mod h1:0+TTO4EOBfRPhZXAeF1Vu+W3hHZ8eLp8PgKVZlcvtFY= -github.com/docker/distribution v2.7.1-0.20190205005809-0d3efadf0154+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/distribution v2.8.0+incompatible h1:l9EaZDICImO1ngI+uTifW+ZYvvz7fKISBAKpg+MbWbY= -github.com/docker/distribution v2.8.0+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/docker v20.10.7+incompatible h1:Z6O9Nhsjv+ayUEeI1IojKbYcsGdgYSNqxe1s2MYzUhQ= -github.com/docker/docker v20.10.7+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= -github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= -github.com/docker/go-events v0.0.0-20170721190031-9461782956ad/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA= -github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA= -github.com/docker/go-metrics v0.0.0-20180209012529-399ea8c73916/go.mod h1:/u0gXw0Gay3ceNrsHubL3BtdOL2fHf93USgMTe0W5dI= -github.com/docker/go-metrics v0.0.1/go.mod h1:cG1hvH2utMXtqgqqYE9plW6lDxS3/5ayHzueweSI3Vw= -github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw= -github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= -github.com/docker/libtrust v0.0.0-20150114040149-fa567046d9b1/go.mod h1:cyGadeNEkKy96OOhEzfZl+yxihPEzKnqJwvfuSUqbZE= -github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= -github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= github.com/dsnet/compress v0.0.2-0.20210315054119-f66993602bf5 h1:iFaUwBSo5Svw6L7HYpRu/0lE3e0BaElwnNO1qkNQxBY= github.com/dsnet/compress v0.0.2-0.20210315054119-f66993602bf5/go.mod h1:qssHWj60/X5sZFNxpG4HBPDHVqxNm4DfnCKgrbZOT+s= github.com/dsnet/golib v0.0.0-20171103203638-1ea166775780/go.mod h1:Lj+Z9rebOhdfkVLjJ8T6VcRQv3SXugXy999NBtR9aFY= @@ -339,11 +150,7 @@ github.com/dsoprea/go-utility v0.0.0-20200711062821-fab8125e9bdf h1:/w4QxepU4AHh github.com/dsoprea/go-utility v0.0.0-20200711062821-fab8125e9bdf/go.mod h1:95+K3z2L0mqsVYd6yveIv1lmtT3tcQQ3dVakPySffW8= github.com/dsoprea/go-utility/v2 v2.0.0-20200717064901-2fccff4aa15e h1:IxIbA7VbCNrwumIYjDoMOdf4KOSkMC6NJE4s8oRbE7E= github.com/dsoprea/go-utility/v2 v2.0.0-20200717064901-2fccff4aa15e/go.mod h1:uAzdkPTub5Y9yQwXe8W4m2XuP0tK4a9Q/dantD0+uaU= -github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= -github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= @@ -354,25 +161,19 @@ github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.m github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= -github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= github.com/francoispqt/gojay v1.2.13/go.mod h1:ehT5mTG4ua4581f1++1WLG0vPdaA9HaiDsoyrBGkyDY= -github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= github.com/frankban/quicktest v1.14.3/go.mod h1:mgiwOwqx65TmIk1wJ6Q7wvnVMocbUorkibMOrVTHZps= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI= github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= -github.com/fullsailor/pkcs7 v0.0.0-20190404230743-d7302db945fa/go.mod h1:KnogPXtdwXqoenmZCw6S+25EAm2MkxbG0deNDu4cbSA= -github.com/garyburd/redigo v0.0.0-20150301180006-535138d7bcd7/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY= github.com/geoffgarside/ber v1.1.0 h1:qTmFG4jJbwiSzSXoNJeHcOprVzZ8Ulde2Rrrifu5U9w= github.com/geoffgarside/ber v1.1.0/go.mod h1:jVPKeCbj6MvQZhwLYsGwaGI52oUorHoHKNecGT85ZCc= -github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/gin-contrib/gzip v0.0.6 h1:NjcunTcGAj5CO1gn4N8jHOSIeRFHIbn51z6K+xaN4d4= github.com/gin-contrib/gzip v0.0.6/go.mod h1:QOJlmV2xmayAjkNS2Y8NQsMneuRShOU/kjovCXNuzzk= @@ -388,7 +189,6 @@ github.com/go-errors/errors v1.1.1/go.mod h1:psDX2osz5VnTOnFWbDeWwS7yejl+uV3FEWE github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-ini/ini v1.25.4/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= github.com/go-ini/ini v1.62.0 h1:7VJT/ZXjzqSrvtraFp4ONq80hTcRQth1c9ZnQ3uNQvU= github.com/go-ini/ini v1.62.0/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= @@ -397,17 +197,8 @@ github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vb github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= -github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= -github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= -github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= -github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= -github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= -github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= -github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-playground/assert/v2 v2.0.1 h1:MsBgLAaY856+nPRTKrp3/OZK38U/wa0CcBYNjji3q3A= github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/go-playground/locales v0.14.0 h1:u50s323jtVGugKlcYeyzC0etD1HifMjqmJqb8WugfUU= @@ -421,23 +212,11 @@ github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0 h1:p104kn46Q8Wd github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= github.com/goccy/go-json v0.9.7 h1:IcB+Aqpx/iMHu5Yooh7jEzJk1JZ7Pjtmys2ukPr7EeM= github.com/goccy/go-json v0.9.7/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= -github.com/godbus/dbus v0.0.0-20151105175453-c7fdd8b5cd55/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= -github.com/godbus/dbus v0.0.0-20180201030542-885f9cc04c9c/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= -github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e h1:BWhy2j3IXJhjCbC68FptL43tDKIq8FladmaTs3Xs7Z8= -github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= -github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/godbus/dbus/v5 v5.0.4 h1:9349emZab16e7zQvpmsbtjc18ykshndd8y2PG3sgJbA= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gofrs/uuid v4.0.0+incompatible h1:1SD/1F5pU8p29ybwgQSwpQk+mwdRrXCYuPhW6m+TnJw= github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= -github.com/gogo/googleapis v1.2.0/go.mod h1:Njal3psf3qN6dwBtQfUmBZh2ybovJ0tlu3o/AC7HYjU= -github.com/gogo/googleapis v1.4.0/go.mod h1:5YRNX2z1oM5gXdAkurHa942MDgEJyk02w4OecKY87+c= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= -github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/gogo/protobuf v1.3.0/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang-jwt/jwt/v4 v4.4.2 h1:rcc4lwaZgFMCZ5jxF9ABolDcIHdBytAFgqFPbSJQAYs= github.com/golang-jwt/jwt/v4 v4.4.2/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= @@ -445,8 +224,6 @@ github.com/golang/geo v0.0.0-20190916061304-5b978397cfec/go.mod h1:QZ0nwyI2jOfgR github.com/golang/geo v0.0.0-20200319012246-673a6f80352d h1:C/hKUcHT483btRbeGkrRjJz+Zbcj8audldIi9tRJDCc= github.com/golang/geo v0.0.0-20200319012246-673a6f80352d/go.mod h1:QZ0nwyI2jOfgRAoBvP+ab5aRr7c9x7lhGEJrKvBwjWI= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -510,7 +287,6 @@ github.com/google/go-github/v36 v36.0.0/go.mod h1:LFlKC047IOqiglRGNqNb9s/iAPTnnj github.com/google/go-querystring v1.0.0 h1:Xkwi/a1rcvNg1PPYe5vI8GbeBY/jrVuDX5ASuANWTrk= github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= @@ -531,10 +307,7 @@ github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLe github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go v2.0.0+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY= github.com/googleapis/gax-go/v2 v2.0.3/go.mod h1:LLvjysVCY1JZeum8Z6l8qUty8fiNwE08qbEPm1M08qg= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= @@ -544,31 +317,20 @@ github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0 github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99EXz9pXxye9YM= github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c= -github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= github.com/googollee/go-socket.io v1.6.2 h1:olKLLHJtHz1IkL/OrTyNriZZvVQYEORNkJAqsOwPask= github.com/googollee/go-socket.io v1.6.2/go.mod h1:0vGP8/dXR9SZUMMD4+xxaGo/lohOw3YWMh2WRiWeKxg= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gorilla/handlers v0.0.0-20150720190736-60c7bfde3e33/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= -github.com/gorilla/mux v1.7.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= -github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= -github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= -github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= +github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/grpc-gateway v1.5.0/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw= -github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= github.com/hashicorp/consul/api v1.12.0/go.mod h1:6pVBMo0ebnYdt2S3H87XhekM/HHrUoTD2XXb/VrZVy0= github.com/hashicorp/consul/sdk v0.8.0/go.mod h1:GBvyrGALthsZObzUGsfgHZQDXjg4lOjagTIwIR1vPms= -github.com/hashicorp/errwrap v0.0.0-20141028054710-7554cd9344ce/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= @@ -578,7 +340,6 @@ github.com/hashicorp/go-hclog v1.2.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39E github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= -github.com/hashicorp/go-multierror v0.0.0-20161216184304-ed905158d874/go.mod h1:JMRHfdO9jKNzS/+BTlxCjKNQHg/jZAft8U7LloJvN7I= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= @@ -602,28 +363,15 @@ github.com/hirochachacha/go-smb2 v1.1.0/go.mod h1:8F1A4d5EZzrGu5R7PU163UcMRDJQl4 github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imdario/mergo v0.3.10/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= -github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= -github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/j-keck/arping v0.0.0-20160618110441-2cf9dc699c56/go.mod h1:ymszkNOg6tORTn+6F6j+Jc8TOr5osrynvN6ivFWZ2GA= github.com/jellevandenhooff/dkim v0.0.0-20150330215556-f50fe3d243e1/go.mod h1:E0B/fFc00Y+Rasa88328GlI/XbtyysCtTHZS8h7IrBU= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= -github.com/jinzhu/copier v0.3.2 h1:QdBOCbaouLDYaIPFfi1bKv5F5tPpeTwXe4sD0jqtz5w= -github.com/jinzhu/copier v0.3.2/go.mod h1:24xnZezI2Yqac9J61UC6/dG/k76ttpq0DdJI3QmUvro= github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= github.com/jinzhu/now v1.1.2/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= github.com/jinzhu/now v1.1.4 h1:tHnRBy1i5F2Dh8BAFxqFzxKqqvezXrL2OW1TnX+Mlas= github.com/jinzhu/now v1.1.4/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= -github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= -github.com/jmespath/go-jmespath v0.0.0-20160803190731-bd40a432e4c7/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= -github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= @@ -635,21 +383,16 @@ github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7 github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= -github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= -github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/compress v1.4.1/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/klauspost/compress v1.11.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.11.4/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= -github.com/klauspost/compress v1.11.13/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.13.6 h1:P76CopJELS0TiO2mebmnzgWaajssP/EszplttgQxcgc= github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= github.com/klauspost/cpuid v1.2.0/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= github.com/klauspost/pgzip v1.2.5 h1:qnWYvvKqedOF2ulHpMG72XQol4ILEJ8k2wwRl/Km8oE= github.com/klauspost/pgzip v1.2.5/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= @@ -660,7 +403,6 @@ github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.3/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= @@ -671,14 +413,9 @@ github.com/lucas-clemente/quic-go v0.25.0/go.mod h1:YtzP8bxRVCBlO77yRanE264+fY/T github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ81pIr0yLvtUWk2if982qA3F3QD6H4= github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= github.com/lunixbochs/vtclean v1.0.0/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI= -github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.6 h1:5ibWZ6iY0NctNGWo87LalDlEZ6R41TqbbDamhfG/Qzo= github.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= -github.com/marstr/guid v1.1.0/go.mod h1:74gB1z2wpxxInTG6yaqA7KrtM0NZ+RbrcqDvYHefzho= github.com/marten-seemann/qpack v0.2.1/go.mod h1:F7Gl5L1jIgN1D11ucXefiuJS9UMVP2opoCp2jDKb7wc= github.com/marten-seemann/qtls-go1-15 v0.1.4/go.mod h1:GyFwywLKkRt+6mfU99csTEY1joMZz5vmB1WNZH3P81I= github.com/marten-seemann/qtls-go1-16 v0.1.4 h1:xbHbOGGhrenVtII6Co8akhLEdrawwB2iHl5yhJRpnco= @@ -693,27 +430,21 @@ github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= -github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= -github.com/mattn/go-shellwords v1.0.3/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o= github.com/mattn/go-sqlite3 v1.14.9/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= github.com/mattn/go-sqlite3 v1.14.14 h1:qZgc/Rwetq+MtyE18WhzjokPD93dNqLGNT3QJuLvBGw= github.com/mattn/go-sqlite3 v1.14.14/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= github.com/mholt/archiver/v3 v3.5.1 h1:rDjOBX9JSF5BvoJGvjqK479aL70qh9DIpZCl+k7Clwo= github.com/mholt/archiver/v3 v3.5.1/go.mod h1:e3dqJ7H78uzsRSEACH1joayhuSyhnonssnDhppzS1L4= github.com/microcosm-cc/bluemonday v1.0.1/go.mod h1:hsXNsILzKxV+sX77C5b8FSuKF00vh2OMYv+xgHpAMF4= github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= -github.com/miekg/pkcs11 v1.0.3/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= -github.com/mistifyio/go-zfs v2.1.2-0.20190413222219-f784269be439+incompatible/go.mod h1:8AuVvqP/mXw1px98n46wfvcGfQ4ci2FwoAjKYxuo3Z4= github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= @@ -722,14 +453,6 @@ github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/osext v0.0.0-20151018003038-5e2d6d41470f/go.mod h1:OkQIRizQZAeMln+1tSwduZz7+Af5oFlKirV/MSYes2A= -github.com/moby/locker v1.0.1/go.mod h1:S7SDdo5zpBK84bzzVlKr2V0hz+7x9hWbYC/kq7oQppc= -github.com/moby/sys/mountinfo v0.4.0/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A= -github.com/moby/sys/mountinfo v0.4.1/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A= -github.com/moby/sys/symlink v0.1.0/go.mod h1:GGDODQmbFOjFsXvfLVn3+ZRxkch54RkSiGqsZeMYowQ= -github.com/moby/term v0.0.0-20200312100748-672ec06f55cd/go.mod h1:DdlQx2hp0Ss5/fLikoLlEeIYiATotOjgB//nb973jeo= -github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6 h1:dcztxKSvZ4Id8iPpHERQBbIJfabdt4wUm5qy3wOL2Zc= -github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6/go.mod h1:E2VnQOmVuvZB6UYnnDB0qG5Nq/1tD9acaOpo6xmt0Kw= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -737,15 +460,8 @@ github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lN github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= -github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= -github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= -github.com/mrunalp/fileutils v0.5.0/go.mod h1:M1WthSahJixYnrXQl/DFQuteStB1weuxD2QJNHXfbSQ= -github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= -github.com/ncw/swift v1.0.47/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= github.com/neelance/astrewrite v0.0.0-20160511093645-99348263ae86/go.mod h1:kHJEU3ofeGjhHklVoIGuVj85JJwZ6kWPaJwCIxgnFmo= github.com/neelance/sourcemap v0.0.0-20151028013722-8c68805598ab/go.mod h1:Qr6/a/Q4r9LP1IltGz7tA7iOK1WonHEYhu1HRBA7ZiM= github.com/nwaples/rardecode v1.1.0 h1:vSxaY8vQhOcVr4mm5e8XllHWTiM4JF507A0Katqw7MQ= @@ -753,70 +469,29 @@ github.com/nwaples/rardecode v1.1.0/go.mod h1:5DzqNKiOdpKKBH87u8VlvAnPZMXcGRhxWk github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= -github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= -github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= -github.com/onsi/ginkgo v0.0.0-20151202141238-7f8ab55aaf3b/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= github.com/onsi/ginkgo v1.16.2/go.mod h1:CObGmKUOKaSC0RjmoAK7tKyn4Azo5P2IWuoMnvwxz1E= github.com/onsi/ginkgo v1.16.4 h1:29JGrr5oVBm5ulCWet69zQkzWipVXIol6ygQUe/EzNc= github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= -github.com/onsi/gomega v0.0.0-20151007035656-2152b45fa28a/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.10.3/go.mod h1:V9xEwhxec5O8UDM77eCW8vLymOMltsqPVYWrpDsH8xc= github.com/onsi/gomega v1.13.0 h1:7lLHu94wT9Ij0o6EWWclhu0aOh32VxhkwEJvzuWPeak= github.com/onsi/gomega v1.13.0/go.mod h1:lRk9szgn8TxENtWd0Tp4c3wjlRfMTMH27I+3Je41yGY= -github.com/opencontainers/go-digest v0.0.0-20170106003457-a6d0ee40d420/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= -github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= -github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= -github.com/opencontainers/go-digest v1.0.0-rc1.0.20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= -github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= -github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= -github.com/opencontainers/image-spec v1.0.0/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= -github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= -github.com/opencontainers/image-spec v1.0.2 h1:9yCKha/T5XdGtO0q9Q9a6T5NUCsTn/DrBg0D7ufOcFM= -github.com/opencontainers/image-spec v1.0.2/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= -github.com/opencontainers/runc v0.0.0-20190115041553-12f6a991201f/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= -github.com/opencontainers/runc v0.1.1/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= -github.com/opencontainers/runc v1.0.0-rc8.0.20190926000215-3e425f80a8c9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= -github.com/opencontainers/runc v1.0.0-rc9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= -github.com/opencontainers/runc v1.0.0-rc93/go.mod h1:3NOsor4w32B2tC0Zbl8Knk4Wg84SM2ImC1fxBuqJ/H0= -github.com/opencontainers/runc v1.0.2/go.mod h1:aTaHFFwQXuA71CiyxOdFFIorAoemI04suvGRQFzWTD0= -github.com/opencontainers/runtime-spec v0.1.2-0.20190507144316-5b71a03e2700/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-spec v1.0.1/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-spec v1.0.2-0.20190207185410-29686dbc5559/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-spec v1.0.3-0.20200929063507-e6143ca7d51d/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-tools v0.0.0-20181011054405-1d69bd0f9c39/go.mod h1:r3f7wjNzSs2extwzU3Y+6pKfobzPh+kKFJ3ofN+3nfs= -github.com/opencontainers/selinux v1.6.0/go.mod h1:VVGKuOLlE7v4PJyT6h7mNWvq1rzqiriPsEqVhc+svHE= -github.com/opencontainers/selinux v1.8.0/go.mod h1:RScLhm78qiWa2gbVCcGkC7tCGdgk3ogry1nUQF8Evvo= -github.com/opencontainers/selinux v1.8.2/go.mod h1:MUIHuUEvKB1wtJjQdOyYRgOnLD2xAPP8dBsCoU0KuF8= github.com/openzipkin/zipkin-go v0.1.1/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTmOf0Erfk+hxe8= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/patrickmn/go-cache v2.1.0+incompatible h1:HRMgzkcYKYpi3C8ajMPV8OFXaaRUnok+kx1WdO15EQc= github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ= -github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/pelletier/go-toml v1.8.1/go.mod h1:T2/BmBdy8dvIRq1a/8aqjN41wvWlN4lrapLU/GW4pbc= github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= github.com/pelletier/go-toml/v2 v2.0.1 h1:8e3L2cCQzLFi2CR4g7vGFuFxX7Jl1kKX8gW+iV0GUKU= github.com/pelletier/go-toml/v2 v2.0.1/go.mod h1:r9LEWfGN8R5k0VXJ+0BkIe7MYkRdwZOjgMj2KwnJFUo= -github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= github.com/pierrec/lz4/v4 v4.1.2 h1:qvY3YFXRQE/XB8MlLzJH7mSzBs74eA2gg52YTk6jUPM= github.com/pierrec/lz4/v4 v4.1.2/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1-0.20171018195549-f15c970de5b7/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= @@ -827,60 +502,40 @@ github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndr github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw= github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= -github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= -github.com/prometheus/client_golang v0.0.0-20180209125602-c332b6f63c06/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.8.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g= github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= github.com/prometheus/client_golang v1.11.1/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_model v0.0.0-20171117100541-99fa1f4be8e5/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/common v0.0.0-20180110214958-89604d197083/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.0.0-20180801064454-c7de2306084e/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc= github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= -github.com/prometheus/procfs v0.0.0-20180125133057-cb4147076ac7/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20180725123919-05ee40e3a273/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.0-20190522114515-bc1a522cf7b1/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= -github.com/prometheus/procfs v0.0.5/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= github.com/robfig/cron v1.2.0 h1:ZjScXvvxeQ63Dbyxy76Fj3AT3Ut0aKsyd2/tl3DTMuQ= github.com/robfig/cron v1.2.0/go.mod h1:JGuDeoQd7Z6yL4zQhZ3OPEVHB7fL6Ka6skscFHfmt2k= -github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rogpeppe/go-internal v1.8.0 h1:FCbCCtXNOY3UtUuHUYaghJg4y7Fd14rXifAYUAtL9R8= github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= -github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/safchain/ethtool v0.0.0-20190326074333-42ed695e3de8/go.mod h1:Z0q5wiBQGYcxhMZ6gUqHn6pYNLypFAvaL3UvgZLR0U4= github.com/sagikazarmark/crypt v0.6.0/go.mod h1:U8+INwJo3nBv1m6A/8OBXAq7Jnpspk5AxSgDyEQcea8= github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/seccomp/libseccomp-golang v0.9.1/go.mod h1:GbW5+tmTXfcxTToHLXlScSlAvWlF4P2Ca7zGrPiEpWo= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= github.com/shirou/gopsutil/v3 v3.22.7 h1:flKnuCMfUUrO+oAvwAd6GKZgnPzr098VA/UJ14nhJd4= github.com/shirou/gopsutil/v3 v3.22.7/go.mod h1:s648gW4IywYzUfE/KjXxUsqrqx/T2xO5VqOXxONeRfI= @@ -904,57 +559,35 @@ github.com/shurcooL/notifications v0.0.0-20181007000457-627ab5aea122/go.mod h1:b github.com/shurcooL/octicon v0.0.0-20181028054416-fa4f57f9efb2/go.mod h1:eWdoE5JD4R5UVWDucdOPg1g2fqQRq78IQa9zlOV1vpQ= github.com/shurcooL/reactions v0.0.0-20181006231557-f2e0b4ca5b82/go.mod h1:TCR1lToEk4d2s07G3XGfz2QrgHXg4RJBvjrOozvoWfk= github.com/shurcooL/sanitized_anchor_name v0.0.0-20170918181015-86672fcb3f95/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/shurcooL/users v0.0.0-20180125191416-49c67e49c537/go.mod h1:QJTqeLYEDaXHZDBsXlPCDqdhQuJkuw4NOtaxYe3xii4= github.com/shurcooL/webdavfs v0.0.0-20170829043945-18c3829fa133/go.mod h1:hKmq5kWdCj2z2KEozexVbfEZIWiTjhE0+UjmZgPqehw= -github.com/sirupsen/logrus v1.0.4-0.20170822132746-89742aefa4b2/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= -github.com/sirupsen/logrus v1.0.6/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= -github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= -github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0= +github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/assertions v1.2.0 h1:42S6lae5dvLc7BrLu/0ugRtcFVjoJNMC/N3yZFZkDFs= github.com/smartystreets/assertions v1.2.0/go.mod h1:tcbTF8ujkAEcZ8TElKY+i30BzYlVhC/LOxJk7iOWnoo= -github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= github.com/sourcegraph/annotate v0.0.0-20160123013949-f4cad6c6324d/go.mod h1:UdhH50NIW0fCiwBSr0co2m7BnFLdv4fQTgdqdJTHFeE= github.com/sourcegraph/syntaxhighlight v0.0.0-20170531221838-bd320f5d308e/go.mod h1:HuIsMU8RRBOtsCgI77wP899iHVBQpCmg4ErYMZB+2IA= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= github.com/spf13/afero v1.8.2 h1:xehSyVa0YnHWsJ49JFljMpg1HX19V6NDZ1fkm1Xznbo= github.com/spf13/afero v1.8.2/go.mod h1:CtAatgMJh6bJEIs48Ay/FOnkljP3WeGUG0MC1RfAqwo= -github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= -github.com/spf13/cobra v0.0.2-0.20171109065643-2da4a54c5cee/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= -github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= -github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= -github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= -github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.1-0.20171106142849-4c012f6dcd95/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= github.com/spf13/viper v1.12.0 h1:CZ7eSOd3kZoaYDLbXnmzgQI5RlciuXBMA+18HwHRfZQ= github.com/spf13/viper v1.12.0/go.mod h1:b6COn30jlNxbm/V2IqWiNWkJ+vZNiMNksliPCiuKtSI= -github.com/stefanberger/go-pkcs11uri v0.0.0-20201008174630-78d3cae3a980/go.mod h1:AO3tvPzVZ/ayst6UlUKUv6rcPQInYe3IknH3jYhAKu8= -github.com/stretchr/objx v0.0.0-20180129172003-8a3f7159479f/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/testify v0.0.0-20180303142811-b89eecf5ca5d/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= @@ -966,11 +599,7 @@ github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PK github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/subosito/gotenv v1.3.0 h1:mjC+YW8QpAdXibNi+vNWgzmgBH4+5l5dCXv8cNysBLI= github.com/subosito/gotenv v1.3.0/go.mod h1:YzJjq/33h7nrwdY+iHMhEOEEbW0ovIz0tB6t6PwAXzs= -github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= -github.com/syndtr/gocapability v0.0.0-20180916011248-d98352740cb2/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= -github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07/go.mod h1:kDXzergiv9cbyO7IOYJZWg1U88JhDg3PB6klq9Hg2pA= -github.com/tchap/go-patricia v2.2.6+incompatible/go.mod h1:bmLyhP68RS6kStMGxByiQ23RP/odRBOTVjwp2cDyi6I= github.com/tidwall/gjson v1.10.2 h1:APbLGOM0rrEkd8WBw9C24nllro4ajFuJu0Sc9hRz8Bo= github.com/tidwall/gjson v1.10.2/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= @@ -981,10 +610,7 @@ github.com/tklauser/go-sysconf v0.3.10 h1:IJ1AZGZRWbY8T5Vfk04D9WOA5WSejdflXxP03O github.com/tklauser/go-sysconf v0.3.10/go.mod h1:C8XykCvCb+Gn0oNCWPIlcb0RuglQTYaQ2hGm7jmxEFk= github.com/tklauser/numcpus v0.4.0 h1:E53Dm1HjH1/R2/aoCtXtPgzmElmn51aOkhCFSuZq//o= github.com/tklauser/numcpus v0.4.0/go.mod h1:1+UI3pD8NW14VMwdgJNJ1ESk2UnwhAnz5hMwiKKqXCQ= -github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= -github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= github.com/ugorji/go v1.2.7 h1:qYhyWUUd6WbiM+C6JZAUkIJt/1WrjzNHY9+KCIjVqTo= github.com/ugorji/go v1.2.7/go.mod h1:nF9osbDWLy6bDVv/Rtoh6QgnvNDpmCalQV5urGCCS6M= github.com/ugorji/go/codec v1.2.7 h1:YPXUKf7fYbp/y8xloBqZOw2qaVggbfwMlI8WM3wZUJ0= @@ -992,27 +618,10 @@ github.com/ugorji/go/codec v1.2.7/go.mod h1:WGN1fab3R1fzQlVQTkfxVtIBhWDRqOviHU95 github.com/ulikunitz/xz v0.5.8/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= github.com/ulikunitz/xz v0.5.9 h1:RsKRIA2MO8x56wkkcd3LbtcE/uMszhb6DpRf+3uwa3I= github.com/ulikunitz/xz v0.5.9/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= -github.com/urfave/cli v0.0.0-20171014202726-7bc6a0acffa5/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= -github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= -github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/viant/assertly v0.4.8/go.mod h1:aGifi++jvCrUaklKEKT0BU95igDNaqkvz+49uaYMPRU= github.com/viant/toolbox v0.24.0/go.mod h1:OxMCG57V0PXuIP2HNQrtJf2CjqdmbrOx5EkMILuUhzM= -github.com/vishvananda/netlink v0.0.0-20181108222139-023a6dafdcdf/go.mod h1:+SR5DhBJrl6ZM7CoCKvpw5BKroDKQ+PJqOg65H/2ktk= -github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= -github.com/vishvananda/netlink v1.1.1-0.20201029203352-d40f9887b852/go.mod h1:twkDnbuQxJYemMlGd4JFIcuhgX83tXhKS2B/PRMpOho= -github.com/vishvananda/netns v0.0.0-20180720170159-13995c7128cc/go.mod h1:ZjcWmFBXmLKZu9Nxj3WKYEafiSqer2rnvPr0en9UNpI= -github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU= -github.com/vishvananda/netns v0.0.0-20200728191858-db3c7e526aae/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= -github.com/willf/bitset v1.1.11-0.20200630133818-d5bec3311243/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4= -github.com/willf/bitset v1.1.11/go.mod h1:83CECat5yLh5zVOf4P1ErAgKA5UDvKtgyUABdr3+MjI= -github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= -github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= -github.com/xeipuuv/gojsonschema v0.0.0-20180618132009-1d523034197f/go.mod h1:5yf86TLmAcydyeJq5YvxkGPE2fm/u4myDekKRoLuqhs= github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8 h1:nIPpBwaJSVYIxUFsDv3M8ofmx9yWTog9BfvIu0q41lo= github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8/go.mod h1:HUYIGzjTL3rfEspMxjDjgmT5uz5wzYJKVo23qUhYTos= -github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= -github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= @@ -1021,18 +630,10 @@ github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1 github.com/yuin/goldmark v1.4.0/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yusufpapurcu/wmi v1.2.2 h1:KBNDSne4vP5mbSWnJbO+51IMOXJB67QiYCSBrubbPRg= github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= -github.com/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43/go.mod h1:aX5oPXxHm3bOH+xeAttToC8pqch2ScQN/JoXYupl6xs= -github.com/yvasiyarov/gorelic v0.0.0-20141212073537-a9bba5b9ab50/go.mod h1:NUSPSUX/bi6SeDMUh6brw0nXpxHnc96TguQh0+r/ssA= -github.com/yvasiyarov/newrelic_platform_go v0.0.0-20140908184405-b21fdbd4370f/go.mod h1:GlGEuHIJweS1mbCqG+7vt2nvWLzLLnRHbXz5JKd/Qbg= -go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/bbolt v1.3.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= -go.etcd.io/etcd v0.5.0-alpha.5.0.20200910180754-dd1b699fc489/go.mod h1:yVHk9ub3CSBatqGNg7GRmsnfLWtoW60w4eDYfh7vHDg= go.etcd.io/etcd/api/v3 v3.5.4/go.mod h1:5GB2vv4A4AOn3yk7MftYGHkUfGtDHnEraIjym4dYz5A= go.etcd.io/etcd/client/pkg/v3 v3.5.4/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= go.etcd.io/etcd/client/v2 v2.305.4/go.mod h1:Ud+VUwIi9/uQHOMA+4ekToJ12lTxlv0zB/+DHwTGEbU= go.etcd.io/etcd/client/v3 v3.5.4/go.mod h1:ZaRkVgBZC+L+dLCjTcF1hRXpgZXQPOvnA/Ak/gq3kiY= -go.mozilla.org/pkcs7 v0.0.0-20200128120323-432b2356ecb1/go.mod h1:SNgMg+EgDFwmvSmLRTNKC5fegJjB7v23qTQ0XLGUNHk= go.opencensus.io v0.18.0/go.mod h1:vKdFvxhtzZ9onBp9VKHK8z/sRpBMnKAsufL7wlDrCOA= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= @@ -1042,8 +643,6 @@ go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= @@ -1051,35 +650,27 @@ go.uber.org/dig v1.14.0/go.mod h1:jHAn/z1Ld1luVVyGKOAIFYz/uBFqKjjEEdIqVAqfQ2o= go.uber.org/fx v1.17.1/go.mod h1:yO7KN5rhlARljyo4LR047AjaV6J+KFzd/Z7rnTbEn0A= go.uber.org/goleak v1.1.11 h1:wy28qYRKZgnJTxGxvye5/wgWr1EKjmUDGYox5mGlRlI= go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= -go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= -go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.16.0/go.mod h1:MA8QOfq0BHJwdXa996Y4dYkAqRKB8/1K1QMMZVaNZjQ= go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= go.uber.org/zap v1.21.0 h1:WefMeulhovoZ2sYXz7st6K0sLj7bBhpiFaud4r4zST8= go.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= go4.org v0.0.0-20180809161055-417644f6feb5/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1yOyC1qaOBpL57BhE= golang.org/x/build v0.0.0-20190111050920-041ab4dc3f9d/go.mod h1:OWs+y06UdEOHN4y+MfF/py+xQ/tYqIWW03b70/CG9Rw= -golang.org/x/crypto v0.0.0-20171113213409-9f005a07e0d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181009213950-7c1a557ab941/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181030102418-4d3f4d9ffa16/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190313024323-a1f597ede03a/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200221231518-2aa609cf4a9d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= @@ -1128,11 +719,9 @@ golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181011144130-49bb7cea24b1/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181029044818-c44066c5c816/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181106065722-10aee1819953/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= @@ -1140,17 +729,12 @@ golang.org/x/net v0.0.0-20190313220215-9f648a60d977/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190619014844-b5b0513f8c1b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -1167,7 +751,6 @@ golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/ golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20201006153459-a7d1128ccaa0/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= @@ -1230,7 +813,6 @@ golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181029174526-d69651ed3497/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1240,17 +822,9 @@ golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190514135907-3a4b5fb9f71f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190522044717-8097e1b27ff5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190602015325-4c4f7f33c9ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606203320-7fc4e5ec1444/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190812073006-9eafafc0a87e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1258,22 +832,17 @@ golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191022100944-742c48ecaeb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191115151921-52ab43148777/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191210023423-ac6580df4449/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200120151820-655fe14d7479/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200217220822-9197077df867/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1284,21 +853,12 @@ golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200728102440-3e129f6d46b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200817155316-9781c653f443/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200909081042-eff7692f9009/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200916030750-2334cc1a136f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200922070232-aee5d888a860/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201112073958-5cba982894dd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201117170446-d9b008d0a637/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201202213521-69691e467435/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1310,12 +870,10 @@ golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210426230700-d19ff857e887/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -1339,8 +897,9 @@ golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a h1:dGzPydgVsqGcTRVwiLJ1jVbufYwmzD3LfVPLKsKg+0k= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8 h1:0A+M6Uqn+Eje4kHMK80dtF3JCXC4ykBgQG4Fe06QRhQ= +golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 h1:JGgROgKl9N8DuW20oFS5gxc+lE67/N3FcwmBPMe7ArY= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= @@ -1358,14 +917,9 @@ golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxb golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac h1:7zkz7BUtwNFFqcowJ+RIgu2MaV/MapERkDIy+mwPyjs= -golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181030000716-a0a13e073c7b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= @@ -1376,9 +930,7 @@ golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBn golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -1435,7 +987,6 @@ golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df h1:5Pf6pFKu98ODmgnpvkJ3kFUOQGGLIzLIkbzUHp47618= golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -google.golang.org/api v0.0.0-20160322025152-9bf6e6e569ff/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= google.golang.org/api v0.0.0-20180910000450-7ca32eb868bf/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= google.golang.org/api v0.0.0-20181030000543-1d582fd0359e/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= google.golang.org/api v0.1.0/go.mod h1:UGEZY7KEX120AnNLIHFMKIo4obdJhkp2tPbaPlQx13Y= @@ -1488,7 +1039,6 @@ google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCID google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/cloud v0.0.0-20151119220103-975617b05ea8/go.mod h1:0H1ncTHf11KCFhTc/+EFRbzSCOZx+VUbRMk55Yv5MYk= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20181029155118-b69ba1387ce2/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= @@ -1498,7 +1048,6 @@ google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRn google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190522204451-c2c4e71fbf69/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= @@ -1507,7 +1056,6 @@ google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvx google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200117163144-32f20d992d24/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= @@ -1527,7 +1075,6 @@ google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201110150050-8816d57aaa9a/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= @@ -1573,19 +1120,14 @@ google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4/go.mod h1:8w6bsBMX google.golang.org/genproto v0.0.0-20220421151946-72621c1f0bd3/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= google.golang.org/genproto v0.0.0-20220429170224-98d788798c3e/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= google.golang.org/genproto v0.0.0-20220505152158-f39f71e6c8f3/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220519153652-3a47de7e79bd h1:e0TwkXOdbnH/1x5rc5MZ/VYyiZ4v+RdVfrGMqEwT68I= google.golang.org/genproto v0.0.0-20220519153652-3a47de7e79bd/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/grpc v0.0.0-20160317175043-d3ddb4469d5a/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.16.0/go.mod h1:0JHn/cJsOMiMfNA9+DeHDlAU7KAAB5GDlYFpa9MZMio= google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= @@ -1611,7 +1153,6 @@ google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9K google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.46.2 h1:u+MLGgVf7vRdjEYZ8wDFhAVNmhkbJ5hmrA1LMWK1CAQ= google.golang.org/grpc v1.46.2/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= @@ -1629,31 +1170,22 @@ google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQ google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw= google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20141024133853-64131543e789/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/ini.v1 v1.66.4/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8= gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= -gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= -gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= -gopkg.in/square/go-jose.v2 v2.3.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= -gopkg.in/square/go-jose.v2 v2.5.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -1676,8 +1208,6 @@ gorm.io/gorm v1.22.5 h1:lYREBgc02Be/5lSCTuysZZDb6ffL2qrat6fg9CFbvXU= gorm.io/gorm v1.22.5/go.mod h1:l2lP/RyAtc1ynaTjFksBde/O8v9oOGIApu2/xRitmZk= gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= -gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= -gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8= gotest.tools/v3 v3.3.0 h1:MfDY1b1/0xN1CyMlQDac0ziEy9zJQd9CXBRRDHw2jJo= gotest.tools/v3 v3.3.0/go.mod h1:Mcr9QNxkg0uMvy/YElmo4SpXgJKWgQvYrT7Kw5RzJ1A= grpc.go4.org v0.0.0-20170609214715-11d0a25b4919/go.mod h1:77eQGdRu53HpSqPFJFmuJdjuHRquDANNeA4x7B8WQ9o= @@ -1689,39 +1219,9 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -k8s.io/api v0.20.1/go.mod h1:KqwcCVogGxQY3nBlRpwt+wpAMF/KjaCc7RpywacvqUo= -k8s.io/api v0.20.4/go.mod h1:++lNL1AJMkDymriNniQsWRkMDzRaX2Y/POTUi8yvqYQ= -k8s.io/api v0.20.6/go.mod h1:X9e8Qag6JV/bL5G6bU8sdVRltWKmdHsFUGS3eVndqE8= -k8s.io/apimachinery v0.20.1/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= -k8s.io/apimachinery v0.20.4/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= -k8s.io/apimachinery v0.20.6/go.mod h1:ejZXtW1Ra6V1O5H8xPBGz+T3+4gfkTCeExAHKU57MAc= -k8s.io/apiserver v0.20.1/go.mod h1:ro5QHeQkgMS7ZGpvf4tSMx6bBOgPfE+f52KwvXfScaU= -k8s.io/apiserver v0.20.4/go.mod h1:Mc80thBKOyy7tbvFtB4kJv1kbdD0eIH8k8vianJcbFM= -k8s.io/apiserver v0.20.6/go.mod h1:QIJXNt6i6JB+0YQRNcS0hdRHJlMhflFmsBDeSgT1r8Q= -k8s.io/client-go v0.20.1/go.mod h1:/zcHdt1TeWSd5HoUe6elJmHSQ6uLLgp4bIJHVEuy+/Y= -k8s.io/client-go v0.20.4/go.mod h1:LiMv25ND1gLUdBeYxBIwKpkSC5IsozMMmOOeSJboP+k= -k8s.io/client-go v0.20.6/go.mod h1:nNQMnOvEUEsOzRRFIIkdmYOjAZrC8bgq0ExboWSU1I0= -k8s.io/component-base v0.20.1/go.mod h1:guxkoJnNoh8LNrbtiQOlyp2Y2XFCZQmrcg2n/DeYNLk= -k8s.io/component-base v0.20.4/go.mod h1:t4p9EdiagbVCJKrQ1RsA5/V4rFQNDfRlevJajlGwgjI= -k8s.io/component-base v0.20.6/go.mod h1:6f1MPBAeI+mvuts3sIdtpjljHWBQ2cIy38oBIWMYnrM= -k8s.io/cri-api v0.17.3/go.mod h1:X1sbHmuXhwaHs9xxYffLqJogVsnI+f6cPRcgPel7ywM= -k8s.io/cri-api v0.20.1/go.mod h1:2JRbKt+BFLTjtrILYVqQK5jqhI+XNdF6UiGMgczeBCI= -k8s.io/cri-api v0.20.4/go.mod h1:2JRbKt+BFLTjtrILYVqQK5jqhI+XNdF6UiGMgczeBCI= -k8s.io/cri-api v0.20.6/go.mod h1:ew44AjNXwyn1s0U4xCKGodU7J1HzBeZ1MpGrpa5r8Yc= -k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= -k8s.io/klog/v2 v2.4.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= -k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd/go.mod h1:WOJ3KddDSol4tAGcJo0Tvi+dK12EcqSLqcWsryKMpfM= -k8s.io/kubernetes v1.13.0/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk= -k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.14/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.15/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= -sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.0.3/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= sourcegraph.com/sourcegraph/go-diff v0.5.0/go.mod h1:kuch7UrkMzY0X+p9CRK03kfuPQ2zzQcaEFbx8wA8rck= sourcegraph.com/sqs/pbtypes v0.0.0-20180604144634-d3ebe8f20ae4/go.mod h1:ketZ/q3QxT9HOBeFhu6RdvsftgpsbFHBF5Cas6cDKZ0= diff --git a/main.go b/main.go index a7b1b36..7f747c7 100644 --- a/main.go +++ b/main.go @@ -9,12 +9,12 @@ import ( "time" "github.com/IceWhaleTech/CasaOS-Common/model" + "github.com/IceWhaleTech/CasaOS-Common/utils/logger" "github.com/IceWhaleTech/CasaOS/model/notify" "github.com/IceWhaleTech/CasaOS/pkg/cache" "github.com/IceWhaleTech/CasaOS/pkg/config" "github.com/IceWhaleTech/CasaOS/pkg/sqlite" "github.com/IceWhaleTech/CasaOS/pkg/utils/file" - "github.com/IceWhaleTech/CasaOS/pkg/utils/loger" "github.com/IceWhaleTech/CasaOS/route" "github.com/IceWhaleTech/CasaOS/service" "github.com/IceWhaleTech/CasaOS/types" @@ -43,7 +43,7 @@ func init() { } config.InitSetup(*configFlag) - loger.LogInit() + logger.LogInit(config.AppInfo.LogPath, config.AppInfo.LogSaveName, config.AppInfo.LogFileExt) if len(*dbFlag) == 0 { *dbFlag = config.AppInfo.DBPath + "/db" } @@ -55,14 +55,9 @@ func init() { service.Cache = cache.Init() - service.GetToken() service.GetCPUThermalZone() - service.NewVersionApp = make(map[string]string) route.InitFunction() - - // go service.LoopFriend() - // go service.MyService.App().CheckNewImage() } // @title casaOS API @@ -111,7 +106,7 @@ func main() { if err != nil { panic(err) } - routers := []string{"sys", "apps", "container", "app-categories", "port", "file", "folder", "batch", "image", "samba", "notify"} + routers := []string{"sys", "port", "file", "folder", "batch", "image", "samba", "notify"} for _, v := range routers { err = service.MyService.Gateway().CreateRoute(&model.Route{ Path: "/v1/" + v, @@ -138,20 +133,19 @@ func main() { }() urlFilePath := filepath.Join(config.CommonInfo.RuntimePath, "casaos.url") - err = file.CreateFileAndWriteContent(urlFilePath, "http://"+listener.Addr().String()) - if err != nil { - loger.Error("Management service is listening...", + if err := file.CreateFileAndWriteContent(urlFilePath, "http://"+listener.Addr().String()); err != nil { + logger.Error("error when creating address file", zap.Error(err), zap.Any("address", listener.Addr().String()), zap.Any("filepath", urlFilePath), ) } if supported, err := daemon.SdNotify(false, daemon.SdNotifyReady); err != nil { - loger.Error("Failed to notify systemd that casaos main service is ready", zap.Any("error", err)) + logger.Error("Failed to notify systemd that casaos main service is ready", zap.Any("error", err)) } else if supported { - loger.Info("Notified systemd that casaos main service is ready") + logger.Info("Notified systemd that casaos main service is ready") } else { - loger.Info("This process is not running as a systemd service.") + logger.Info("This process is not running as a systemd service.") } s := &http.Server{ @@ -159,6 +153,8 @@ func main() { ReadHeaderTimeout: 5 * time.Second, // fix G112: Potential slowloris attack (see https://github.com/securego/gosec) } + logger.Info("CasaOS main service is listening...", zap.Any("address", listener.Addr().String())) + err = s.Serve(listener) // not using http.serve() to fix G114: Use of net/http serve function that has no support for setting timeouts (see https://github.com/securego/gosec) if err != nil { panic(err) diff --git a/model/app.go b/model/app.go deleted file mode 100644 index 58b69c2..0000000 --- a/model/app.go +++ /dev/null @@ -1,128 +0,0 @@ -package model - -import ( - "database/sql/driver" - "encoding/json" - "time" -) - -type ServerAppListCollection struct { - List []ServerAppList `json:"list"` - Recommend []ServerAppList `json:"recommend"` - Community []ServerAppList `json:"community"` - Version string `json:"version"` -} - -// @tiger - 对于用于出参的数据结构,静态信息(例如 title)和 -// 动态信息(例如 state、query_count)应该划分到不同的数据结构中 -// -// 这样的好处是 -// 1 - 多次获取动态信息时可以减少出参复杂度,因为静态信息只获取一次就好 -// 2 - 在未来的迭代中,可以降低维护成本(所有字段都展开放在一个层级维护成本略高) -// -// 另外,一些针对性字段,例如 Docker 相关的,可以用 map 来保存。 -// 这样在未来增加多态 App,例如 Snap,不需要维护多个结构,或者一个结构保存不必要的字段 -type ServerAppList struct { - Id uint `gorm:"column:id;primary_key" json:"id"` - Title string `json:"title"` - Description string `json:"description"` - Tagline string `json:"tagline"` - Tags Strings `gorm:"type:json" json:"tags"` - Icon string `json:"icon"` - ScreenshotLink Strings `gorm:"type:json" json:"screenshot_link"` - Category string `json:"category"` - CategoryId int `json:"category_id"` - CategoryFont string `json:"category_font"` - PortMap string `json:"port_map"` - ImageVersion string `json:"image_version"` - Tip string `json:"tip"` - Envs EnvArray `json:"envs"` - Ports PortArray `json:"ports"` - Volumes PathArray `json:"volumes"` - Devices PathArray `json:"devices"` - NetworkModel string `json:"network_model"` - Image string `json:"image"` - Index string `json:"index"` - CreatedAt time.Time `json:"created_at"` - UpdatedAt time.Time `json:"updated_at"` - State int `json:"state"` - Author string `json:"author"` - MinMemory int `json:"min_memory"` - MinDisk int `json:"min_disk"` - MaxMemory uint64 `json:"max_memory"` - Thumbnail string `json:"thumbnail"` - Healthy string `json:"healthy"` - Plugins Strings `json:"plugins"` - Origin string `json:"origin"` - Type int `json:"type"` - QueryCount int `json:"query_count"` - Developer string `json:"developer"` - HostName string `json:"host_name"` - Privileged bool `json:"privileged"` - CapAdd Strings `json:"cap_add"` - Cmd Strings `json:"cmd"` -} - -type Ports struct { - ContainerPort uint `json:"container_port"` - CommendPort int `json:"commend_port"` - Desc string `json:"desc"` - Type int `json:"type"` // 1:必选 2:可选 3:默认值不必显示 4:系统处理 5:container内容也可编辑 -} - -type Volume struct { - ContainerPath string `json:"container_path"` - Path string `json:"path"` - Desc string `json:"desc"` - Type int `json:"type"` // 1:必选 2:可选 3:默认值不必显示 4:系统处理 5:container内容也可编辑 -} - -type Envs struct { - Name string `json:"name"` - Value string `json:"value"` - Desc string `json:"desc"` - Type int `json:"type"` // 1:必选 2:可选 3:默认值不必显示 4:系统处理 5:container内容也可编辑 -} - -type Devices struct { - ContainerPath string `json:"container_path"` - Path string `json:"path"` - Desc string `json:"desc"` - Type int `json:"type"` // 1:必选 2:可选 3:默认值不必显示 4:系统处理 5:container内容也可编辑 -} - -type configures struct { - TcpPorts []Ports `json:"tcp_ports"` - UdpPorts []Ports `json:"udp_ports"` - Envs []Envs `json:"envs"` - Volumes []Volume `json:"volumes"` - Devices []Devices `json:"devices"` -} - -/****************使gorm支持[]string结构*******************/ -type Strings []string - -func (c Strings) Value() (driver.Value, error) { - b, err := json.Marshal(c) - return string(b), err -} - -func (c *Strings) Scan(input interface{}) error { - return json.Unmarshal(input.([]byte), c) -} - -/****************使gorm支持[]string结构*******************/ - -/****************使gorm支持[]string结构*******************/ -type MapStrings []map[string]string - -func (c MapStrings) Value() (driver.Value, error) { - b, err := json.Marshal(c) - return string(b), err -} - -func (c *MapStrings) Scan(input interface{}) error { - return json.Unmarshal(input.([]byte), c) -} - -/****************使gorm支持[]string结构*******************/ diff --git a/model/category.go b/model/category.go deleted file mode 100644 index 3005491..0000000 --- a/model/category.go +++ /dev/null @@ -1,23 +0,0 @@ -/* - * @Author: link a624669980@163.com - * @Date: 2022-05-16 17:37:08 - * @LastEditors: LinkLeong - * @LastEditTime: 2022-07-13 10:46:38 - * @FilePath: /CasaOS/model/category.go - * @Description: - */ -package model - -type ServerCategoryList struct { - Version string `json:"version"` - Item []CategoryList `json:"item"` -} -type CategoryList struct { - Id uint `gorm:"column:id;primary_key" json:"id"` - //CreatedAt time.Time `json:"created_at"` - // - //UpdatedAt time.Time `json:"updated_at"` - Font string `json:"font"` // @tiger - 如果这个和前端有关,应该不属于后端的出参范围,而是前端去界定 - Name string `json:"name"` - Count uint `json:"count"` // @tiger - count 属于动态信息,应该单独放在一个出参结构中(原因见另外一个关于 静态/动态 出参的注释) -} diff --git a/model/docker.go b/model/docker.go deleted file mode 100644 index 34412cd..0000000 --- a/model/docker.go +++ /dev/null @@ -1,24 +0,0 @@ -/* - * @Author: LinkLeong link@icewhale.com - * @Date: 2021-12-08 18:10:25 - * @LastEditors: LinkLeong - * @LastEditTime: 2022-07-13 10:49:16 - * @FilePath: /CasaOS/model/docker.go - * @Description: - * @Website: https://www.casaos.io - * Copyright (c) 2022 by icewhale, All Rights Reserved. - */ -package model - -type DockerStatsModel struct { - Icon string `json:"icon"` - Title string `json:"title"` - Data interface{} `json:"data"` - Previous interface{} `json:"previous"` -} - -// reference - https://docs.docker.com/engine/reference/commandline/dockerd/#daemon-configuration-file -type DockerDaemonConfigurationModel struct { - // e.g. `/var/lib/docker` - Root string `json:"data-root,omitempty"` -} diff --git a/model/manifest.go b/model/manifest.go deleted file mode 100644 index 0888fb0..0000000 --- a/model/manifest.go +++ /dev/null @@ -1,133 +0,0 @@ -package model - -import ( - "database/sql/driver" - "encoding/json" -) - -type TcpPorts struct { - Desc string `json:"desc"` - ContainerPort int `json:"container_port"` -} -type UdpPorts struct { - Desc string `json:"desc"` - ContainerPort int `json:"container_port"` -} - -/*******************使用gorm支持json************************************/ - -type PortMap struct { - ContainerPort string `json:"container"` - CommendPort string `json:"host"` - Protocol string `json:"protocol"` - Desc string `json:"desc"` - Type int `json:"type"` -} - -type PortArray []PortMap - -// Value 实现方法 -func (p PortArray) Value() (driver.Value, error) { - return json.Marshal(p) -} - -// Scan 实现方法 -func (p *PortArray) Scan(input interface{}) error { - return json.Unmarshal(input.([]byte), p) -} - -/************************************************************************/ - -/*******************使用gorm支持json************************************/ - -type Env struct { - Name string `json:"container"` - Value string `json:"host"` - Desc string `json:"desc"` - Type int `json:"type"` -} - -type JSON json.RawMessage - -type EnvArray []Env - -// Value 实现方法 -func (p EnvArray) Value() (driver.Value, error) { - return json.Marshal(p) - //return .MarshalJSON() -} - -// Scan 实现方法 -func (p *EnvArray) Scan(input interface{}) error { - return json.Unmarshal(input.([]byte), p) -} - -/************************************************************************/ - -/*******************使用gorm支持json************************************/ - -type PathMap struct { - ContainerPath string `json:"container"` - Path string `json:"host"` - Type int `json:"type"` - Desc string `json:"desc"` -} - -type PathArray []PathMap - -// Value 实现方法 -func (p PathArray) Value() (driver.Value, error) { - return json.Marshal(p) -} - -// Scan 实现方法 -func (p *PathArray) Scan(input interface{}) error { - return json.Unmarshal(input.([]byte), p) -} - -/************************************************************************/ - -//type PostData struct { -// Envs EnvArrey `json:"envs,omitempty"` -// Udp PortArrey `json:"udp_ports"` -// Tcp PortArrey `json:"tcp_ports"` -// Volumes PathArrey `json:"volumes"` -// Devices PathArrey `json:"devices"` -// Port string `json:"port,omitempty"` -// PortMap string `json:"port_map"` -// CpuShares int64 `json:"cpu_shares,omitempty"` -// Memory int64 `json:"memory,omitempty"` -// Restart string `json:"restart,omitempty"` -// EnableUPNP bool `json:"enable_upnp"` -// Label string `json:"label"` -// Position bool `json:"position"` -//} - -type CustomizationPostData struct { - ContainerName string `json:"container_name"` - CustomId string `json:"custom_id"` - Origin string `json:"origin"` - NetworkModel string `json:"network_model"` - Index string `json:"index"` - Icon string `json:"icon"` - Image string `json:"image"` - Envs EnvArray `json:"envs"` - Ports PortArray `json:"ports"` - Volumes PathArray `json:"volumes"` - Devices PathArray `json:"devices"` - //Port string `json:"port,omitempty"` - PortMap string `json:"port_map"` - CpuShares int64 `json:"cpu_shares"` - Memory int64 `json:"memory"` - Restart string `json:"restart"` - EnableUPNP bool `json:"enable_upnp"` - Label string `json:"label"` - Description string `json:"description"` - Position bool `json:"position"` - HostName string `json:"host_name"` - Privileged bool `json:"privileged"` - CapAdd []string `json:"cap_add"` - Cmd []string `json:"cmd"` - Protocol string `json:"protocol"` - Host string `json:"host"` -} diff --git a/model/notify/application.go b/model/notify/application.go deleted file mode 100644 index 439de9f..0000000 --- a/model/notify/application.go +++ /dev/null @@ -1,21 +0,0 @@ -/* - * @Author: LinkLeong link@icewhale.com - * @Date: 2022-05-27 15:01:58 - * @LastEditors: LinkLeong - * @LastEditTime: 2022-05-31 14:51:21 - * @FilePath: /CasaOS/model/notify/application.go - * @Description: - * @Website: https://www.casaos.io - * Copyright (c) 2022 by icewhale, All Rights Reserved. - */ -package notify - -type Application struct { - Name string `json:"name"` - State string `json:"state"` - Type string `json:"type"` - Icon string `json:"icon"` - Message string `json:"message"` - Finished bool `json:"finished"` - Success bool `json:"success"` -} diff --git a/model/sys_common.go b/model/sys_common.go index 098ba97..6e56e25 100644 --- a/model/sys_common.go +++ b/model/sys_common.go @@ -14,7 +14,7 @@ import "time" // 系统配置 type SysInfoModel struct { - Name string //系统名称 + Name string // 系统名称 } // 服务配置 @@ -66,10 +66,6 @@ type SystemConfig struct { ConfigPath string `json:"config_path"` } -type CasaOSGlobalVariables struct { - AppChange bool -} - type FileSetting struct { ShareDir []string `json:"share_dir" delim:"|"` DownloadDir string `json:"download_dir"` diff --git a/pkg/config/init.go b/pkg/config/init.go index b2de00f..abd6068 100644 --- a/pkg/config/init.go +++ b/pkg/config/init.go @@ -31,23 +31,20 @@ var AppInfo = &model.APPModel{} var CommonInfo = &model.CommonModel{} -//var RedisInfo = &model.RedisModel{} +// var RedisInfo = &model.RedisModel{} // server相关 var ServerInfo = &model.ServerModel{} var SystemConfigInfo = &model.SystemConfig{} -var CasaOSGlobalVariables = &model.CasaOSGlobalVariables{} - var FileSettingInfo = &model.FileSetting{} var Cfg *ini.File // 初始化设置,获取系统的部分信息。 func InitSetup(config string) { - - var configDir = USERCONFIGURL + configDir := USERCONFIGURL if len(config) > 0 { configDir = config } @@ -55,7 +52,7 @@ func InitSetup(config string) { configDir = "./conf/conf.conf" } var err error - //读取文件 + // 读取文件 Cfg, err = ini.Load(configDir) if err != nil { Cfg, err = ini.Load("/etc/casaos.conf") @@ -68,7 +65,7 @@ func InitSetup(config string) { } } mapTo("app", AppInfo) - //mapTo("redis", RedisInfo) + // mapTo("redis", RedisInfo) mapTo("server", ServerInfo) mapTo("system", SystemConfigInfo) mapTo("file", FileSettingInfo) @@ -91,7 +88,6 @@ func InitSetup(config string) { } Cfg.SaveTo(configDir) // AppInfo.ProjectPath = getCurrentDirectory() //os.Getwd() - } // 映射 @@ -111,6 +107,7 @@ func getCurrentAbPathByCaller() string { } return abPath } + func getCurrentDirectory() string { dir, err := filepath.Abs(filepath.Dir(os.Args[0])) if err != nil { diff --git a/pkg/docker/emum.go b/pkg/docker/emum.go deleted file mode 100644 index fad329b..0000000 --- a/pkg/docker/emum.go +++ /dev/null @@ -1,3 +0,0 @@ -package docker - -const NETWORKNAME = "oasis" diff --git a/pkg/docker/helper.go b/pkg/docker/helper.go deleted file mode 100644 index 0aef117..0000000 --- a/pkg/docker/helper.go +++ /dev/null @@ -1,402 +0,0 @@ -package docker - -import ( - "bytes" - json2 "encoding/json" - "fmt" - "io" - "regexp" - "sync" - "time" - - "github.com/gorilla/websocket" - "github.com/sirupsen/logrus" - "golang.org/x/crypto/ssh" -) - -func NewSshClient(user, password string, port string) (*ssh.Client, error) { - // connet to ssh - // addr = fmt.Sprintf("%s:%d", host, port) - - config := &ssh.ClientConfig{ - Timeout: time.Second * 5, - User: user, - HostKeyCallback: ssh.InsecureIgnoreHostKey(), - // HostKeyCallback: , - // HostKeyCallback: hostKeyCallBackFunc(h.Host), - } - // if h.Type == "password" { - config.Auth = []ssh.AuthMethod{ssh.Password(password)} - //} else { - // config.Auth = []ssh.AuthMethod{publicKeyAuthFunc(h.Key)} - //} - addr := fmt.Sprintf("%s:%s", "127.0.0.1", port) - c, err := ssh.Dial("tcp", addr, config) - if err != nil { - return nil, err - } - return c, nil -} - -// setup ssh shell session -// set Session and StdinPipe here, -// and the Session.Stdout and Session.Sdterr are also set. -func NewSshConn(cols, rows int, sshClient *ssh.Client) (*SshConn, error) { - sshSession, err := sshClient.NewSession() - if err != nil { - return nil, err - } - - stdinP, err := sshSession.StdinPipe() - if err != nil { - return nil, err - } - comboWriter := new(wsBufferWriter) - - sshSession.Stdout = comboWriter - sshSession.Stderr = comboWriter - - modes := ssh.TerminalModes{ - ssh.ECHO: 1, // disable echo - ssh.TTY_OP_ISPEED: 14400, // input speed = 14.4kbaud - ssh.TTY_OP_OSPEED: 14400, // output speed = 14.4kbaud - } - // Request pseudo terminal - if err := sshSession.RequestPty("xterm", rows, cols, modes); err != nil { - return nil, err - } - // Start remote shell - if err := sshSession.Shell(); err != nil { - return nil, err - } - return &SshConn{StdinPipe: stdinP, ComboOutput: comboWriter, Session: sshSession}, nil -} - -type SshConn struct { - // calling Write() to write data into ssh server - StdinPipe io.WriteCloser - // Write() be called to receive data from ssh server - ComboOutput *wsBufferWriter - Session *ssh.Session -} -type wsBufferWriter struct { - buffer bytes.Buffer - mu sync.Mutex -} - -func (w *wsBufferWriter) Write(p []byte) (int, error) { - w.mu.Lock() - defer w.mu.Unlock() - return w.buffer.Write(p) -} - -func (s *SshConn) Close() { - if s.Session != nil { - s.Session.Close() - } -} - -const ( - wsMsgCmd = "cmd" - wsMsgResize = "resize" -) - -// ReceiveWsMsg receive websocket msg do some handling then write into ssh.session.stdin -func ReceiveWsMsgUser(wsConn *websocket.Conn, logBuff *bytes.Buffer) string { - // tells other go routine quit - username := "" - for { - - // read websocket msg - _, wsData, err := wsConn.ReadMessage() - if err != nil { - return "" - } - - msgObj := wsMsg{} - if err := json2.Unmarshal(wsData, &msgObj); err != nil { - msgObj.Type = "cmd" - msgObj.Cmd = string(wsData) - } - //if err := json.Unmarshal(wsData, &msgObj); err != nil { - // logrus.WithError(err).WithField("wsData", string(wsData)).Error("unmarshal websocket message failed") - //} - switch msgObj.Type { - case wsMsgCmd: - // handle xterm.js stdin - // decodeBytes, err := base64.StdEncoding.DecodeString(msgObj.Cmd) - decodeBytes := []byte(msgObj.Cmd) - if msgObj.Cmd == "\u007f" { - if len(username) == 0 { - continue - } - wsConn.WriteMessage(websocket.TextMessage, []byte("\b\x1b[K")) - username = username[:len(username)-1] - continue - } - if msgObj.Cmd == "\r" { - return username - } - username += msgObj.Cmd - - if err := wsConn.WriteMessage(websocket.TextMessage, decodeBytes); err != nil { - logrus.WithError(err).Error("ws cmd bytes write to ssh.stdin pipe failed") - } - // write input cmd to log buffer - if _, err := logBuff.Write(decodeBytes); err != nil { - logrus.WithError(err).Error("write received cmd into log buffer failed") - } - } - - } -} - -func ReceiveWsMsgPassword(wsConn *websocket.Conn, logBuff *bytes.Buffer) string { - // tells other go routine quit - password := "" - for { - - // read websocket msg - _, wsData, err := wsConn.ReadMessage() - if err != nil { - logrus.WithError(err).Error("reading webSocket message failed") - return "" - } - - msgObj := wsMsg{} - if err := json2.Unmarshal(wsData, &msgObj); err != nil { - msgObj.Type = "cmd" - msgObj.Cmd = string(wsData) - } - //if err := json.Unmarshal(wsData, &msgObj); err != nil { - // logrus.WithError(err).WithField("wsData", string(wsData)).Error("unmarshal websocket message failed") - //} - switch msgObj.Type { - case wsMsgCmd: - // handle xterm.js stdin - // decodeBytes, err := base64.StdEncoding.DecodeString(msgObj.Cmd) - if msgObj.Cmd == "\r" { - return password - } - - if msgObj.Cmd == "\u007f" { - if len(password) == 0 { - continue - } - password = password[:len(password)-1] - continue - } - password += msgObj.Cmd - } - - } -} - -// ReceiveWsMsg receive websocket msg do some handling then write into ssh.session.stdin -func (ssConn *SshConn) ReceiveWsMsg(wsConn *websocket.Conn, logBuff *bytes.Buffer, exitCh chan bool) { - // tells other go routine quit - defer setQuit(exitCh) - for { - select { - case <-exitCh: - return - default: - // read websocket msg - _, wsData, err := wsConn.ReadMessage() - if err != nil { - logrus.WithError(err).Error("reading webSocket message failed") - return - } - //unmashal bytes into struct - //msgObj := wsMsg{ - // Type: "cmd", - // Cmd: "", - // Rows: 50, - // Cols: 180, - //} - msgObj := wsMsg{} - if err := json2.Unmarshal(wsData, &msgObj); err != nil { - msgObj.Type = "cmd" - msgObj.Cmd = string(wsData) - } - //if err := json.Unmarshal(wsData, &msgObj); err != nil { - // logrus.WithError(err).WithField("wsData", string(wsData)).Error("unmarshal websocket message failed") - //} - switch msgObj.Type { - - case wsMsgResize: - // handle xterm.js size change - if msgObj.Cols > 0 && msgObj.Rows > 0 { - if err := ssConn.Session.WindowChange(msgObj.Rows, msgObj.Cols); err != nil { - logrus.WithError(err).Error("ssh pty change windows size failed") - } - } - case wsMsgCmd: - // handle xterm.js stdin - // decodeBytes, err := base64.StdEncoding.DecodeString(msgObj.Cmd) - decodeBytes := []byte(msgObj.Cmd) - if err != nil { - logrus.WithError(err).Error("websock cmd string base64 decoding failed") - } - if _, err := ssConn.StdinPipe.Write(decodeBytes); err != nil { - logrus.WithError(err).Error("ws cmd bytes write to ssh.stdin pipe failed") - } - // write input cmd to log buffer - if _, err := logBuff.Write(decodeBytes); err != nil { - logrus.WithError(err).Error("write received cmd into log buffer failed") - } - } - } - } -} - -func (ssConn *SshConn) SendComboOutput(wsConn *websocket.Conn, exitCh chan bool) { - // tells other go routine quit - // defer setQuit(exitCh) - - // every 120ms write combine output bytes into websocket response - tick := time.NewTicker(time.Millisecond * time.Duration(120)) - // for range time.Tick(120 * time.Millisecond){} - defer tick.Stop() - for { - select { - case <-tick.C: - // write combine output bytes into websocket response - if err := flushComboOutput(ssConn.ComboOutput, wsConn); err != nil { - logrus.WithError(err).Error("ssh sending combo output to webSocket failed") - return - } - case <-exitCh: - return - } - } -} - -func flushComboOutput(w *wsBufferWriter, wsConn *websocket.Conn) error { - if w.buffer.Len() != 0 { - err := wsConn.WriteMessage(websocket.TextMessage, w.buffer.Bytes()) - if err != nil { - return err - } - w.buffer.Reset() - } - return nil -} - -// ReceiveWsMsg receive websocket msg do some handling then write into ssh.session.stdin -func (ssConn *SshConn) Login(wsConn *websocket.Conn, logBuff *bytes.Buffer, exitCh chan bool) { - // tells other go routine quit - defer setQuit(exitCh) - for { - select { - case <-exitCh: - return - default: - // read websocket msg - _, wsData, err := wsConn.ReadMessage() - if err != nil { - logrus.WithError(err).Error("reading webSocket message failed") - return - } - //unmashal bytes into struct - //msgObj := wsMsg{ - // Type: "cmd", - // Cmd: "", - // Rows: 50, - // Cols: 180, - //} - msgObj := wsMsg{} - if err := json2.Unmarshal(wsData, &msgObj); err != nil { - msgObj.Type = "cmd" - msgObj.Cmd = string(wsData) - } - //if err := json.Unmarshal(wsData, &msgObj); err != nil { - // logrus.WithError(err).WithField("wsData", string(wsData)).Error("unmarshal websocket message failed") - //} - switch msgObj.Type { - - case wsMsgResize: - // handle xterm.js size change - if msgObj.Cols > 0 && msgObj.Rows > 0 { - if err := ssConn.Session.WindowChange(msgObj.Rows, msgObj.Cols); err != nil { - logrus.WithError(err).Error("ssh pty change windows size failed") - } - } - case wsMsgCmd: - // handle xterm.js stdin - // decodeBytes, err := base64.StdEncoding.DecodeString(msgObj.Cmd) - decodeBytes := []byte(msgObj.Cmd) - if err != nil { - logrus.WithError(err).Error("websock cmd string base64 decoding failed") - } - if _, err := ssConn.StdinPipe.Write(decodeBytes); err != nil { - logrus.WithError(err).Error("ws cmd bytes write to ssh.stdin pipe failed") - } - // write input cmd to log buffer - if _, err := logBuff.Write(decodeBytes); err != nil { - logrus.WithError(err).Error("write received cmd into log buffer failed") - } - } - } - } -} - -func (ssConn *SshConn) SessionWait(quitChan chan bool) { - if err := ssConn.Session.Wait(); err != nil { - logrus.WithError(err).Error("ssh session wait failed") - setQuit(quitChan) - } -} - -func setQuit(ch chan bool) { - ch <- true -} - -type wsMsg struct { - Type string `json:"type"` - Cmd string `json:"cmd"` - Cols int `json:"cols"` - Rows int `json:"rows"` -} - -// 将终端的输出转发到前端 -func WsWriterCopy(reader io.Reader, writer *websocket.Conn) { - buf := make([]byte, 8192) - reg1 := regexp.MustCompile(`stty rows \d+ && stty cols \d+ `) - for { - nr, err := reader.Read(buf) - if nr > 0 { - result1 := reg1.FindIndex(buf[0:nr]) - if len(result1) > 0 { - fmt.Println(result1) - } else { - err := writer.WriteMessage(websocket.BinaryMessage, buf[0:nr]) - if err != nil { - return - } - } - - } - if err != nil { - return - } - } -} - -// 将前端的输入转发到终端 -func WsReaderCopy(reader *websocket.Conn, writer io.Writer) { - for { - messageType, p, err := reader.ReadMessage() - if err != nil { - return - } - if messageType == websocket.TextMessage { - msgObj := wsMsg{} - if err = json2.Unmarshal(p, &msgObj); err != nil { - writer.Write(p) - } else if msgObj.Type == wsMsgResize { - // writer.Write([]byte("stty rows " + strconv.Itoa(msgObj.Rows) + " && stty cols " + strconv.Itoa(msgObj.Cols) + " \r")) - } - } - } -} diff --git a/pkg/docker/volumes.go b/pkg/docker/volumes.go deleted file mode 100644 index d782a20..0000000 --- a/pkg/docker/volumes.go +++ /dev/null @@ -1,11 +0,0 @@ -package docker - -import "strings" - -func GetDir(id, envName string) string { - - if strings.Contains(envName, "$AppID") && len(id) > 0 { - return strings.ReplaceAll(envName, "$AppID", id) - } - return envName -} diff --git a/pkg/docker/volumes_test.go b/pkg/docker/volumes_test.go deleted file mode 100644 index c5d45fb..0000000 --- a/pkg/docker/volumes_test.go +++ /dev/null @@ -1,10 +0,0 @@ -package docker - -import ( - "fmt" - "testing" -) - -func TestGetDir(t *testing.T) { - fmt.Println(GetDir("", "config")) -} diff --git a/pkg/sqlite/db.go b/pkg/sqlite/db.go index e5d7595..b88e013 100644 --- a/pkg/sqlite/db.go +++ b/pkg/sqlite/db.go @@ -13,8 +13,8 @@ package sqlite import ( "time" + "github.com/IceWhaleTech/CasaOS-Common/utils/logger" "github.com/IceWhaleTech/CasaOS/pkg/utils/file" - "github.com/IceWhaleTech/CasaOS/pkg/utils/loger" model2 "github.com/IceWhaleTech/CasaOS/service/model" "go.uber.org/zap" "gorm.io/driver/sqlite" @@ -28,8 +28,8 @@ func GetDb(dbPath string) *gorm.DB { return gdb } // Refer https://github.com/go-sql-driver/mysql#dsn-data-source-name - //dsn := fmt.Sprintf("%v:%v@tcp(%v:%v)/%v?charset=utf8mb4&parseTime=True&loc=Local", m.User, m.PWD, m.IP, m.Port, m.DBName) - //db, err := gorm.Open(mysql2.Open(dsn), &gorm.Config{}) + // dsn := fmt.Sprintf("%v:%v@tcp(%v:%v)/%v?charset=utf8mb4&parseTime=True&loc=Local", m.User, m.PWD, m.IP, m.Port, m.DBName) + // db, err := gorm.Open(mysql2.Open(dsn), &gorm.Config{}) file.IsNotExistMkDir(dbPath) db, err := gorm.Open(sqlite.Open(dbPath+"/casaOS.db"), &gorm.Config{}) c, _ := db.DB() @@ -37,19 +37,18 @@ func GetDb(dbPath string) *gorm.DB { c.SetMaxOpenConns(100) c.SetConnMaxIdleTime(time.Second * 1000) if err != nil { - loger.Error("sqlite connect error", zap.Any("db connect error", err)) + logger.Error("sqlite connect error", zap.Any("db connect error", err)) panic("sqlite connect error") - return nil } gdb = db - err = db.AutoMigrate(&model2.AppNotify{}, &model2.AppListDBModel{}, model2.SharesDBModel{}, model2.ConnectionsDBModel{}) + err = db.AutoMigrate(&model2.AppNotify{}, model2.SharesDBModel{}, model2.ConnectionsDBModel{}) db.Exec("DROP TABLE IF EXISTS o_application") db.Exec("DROP TABLE IF EXISTS o_friend") db.Exec("DROP TABLE IF EXISTS o_person_download") db.Exec("DROP TABLE IF EXISTS o_person_down_record") if err != nil { - loger.Error("check or create db error", zap.Any("error", err)) + logger.Error("check or create db error", zap.Any("error", err)) } return db } diff --git a/pkg/utils/env_helper/env.go b/pkg/utils/env_helper/env.go deleted file mode 100644 index b6894e1..0000000 --- a/pkg/utils/env_helper/env.go +++ /dev/null @@ -1,26 +0,0 @@ -package env_helper - -import "strings" - -func ReplaceDefaultENV(key, tz string) string { - temp := "" - switch key { - case "$DefaultPassword": - temp = "casaos" - case "$DefaultUserName": - temp = "admin" - - case "$PUID": - temp = "1000" - case "$PGID": - temp = "1000" - case "$TZ": - temp = tz - } - return temp -} - -//replace env default setting -func ReplaceStringDefaultENV(str string) string { - return strings.ReplaceAll(strings.ReplaceAll(str, "$DefaultPassword", ReplaceDefaultENV("$DefaultPassword", "")), "$DefaultUserName", ReplaceDefaultENV("$DefaultUserName", "")) -} diff --git a/pkg/utils/httper/httper.go b/pkg/utils/httper/httper.go index da96388..c0037d1 100644 --- a/pkg/utils/httper/httper.go +++ b/pkg/utils/httper/httper.go @@ -12,9 +12,9 @@ import ( "github.com/tidwall/gjson" ) -//发送GET请求 -//url:请求地址 -//response:请求返回的内容 +// 发送GET请求 +// url:请求地址 +// response:请求返回的内容 func Get(url string, head map[string]string) (response string) { client := &http.Client{Timeout: 30 * time.Second} req, err := http.NewRequest("GET", url, nil) @@ -28,10 +28,10 @@ func Get(url string, head map[string]string) (response string) { resp, err := client.Do(req) if err != nil { fmt.Println(err) - //需要错误日志的处理 - //loger.Error(error) + // 需要错误日志的处理 + // logger.Error(error) return "" - //panic(error) + // panic(error) } defer resp.Body.Close() var buffer [512]byte @@ -42,7 +42,7 @@ func Get(url string, head map[string]string) (response string) { if err != nil && err == io.EOF { break } else if err != nil { - //loger.Error(err) + // logger.Error(err) return "" // panic(err) } @@ -51,22 +51,21 @@ func Get(url string, head map[string]string) (response string) { return } -//发送GET请求 -//url:请求地址 -//response:请求返回的内容 +// 发送GET请求 +// url:请求地址 +// response:请求返回的内容 func PersonGet(url string) (response string) { client := &http.Client{Timeout: 5 * time.Second} req, err := http.NewRequest("GET", url, nil) - if err != nil { return "" } resp, err := client.Do(req) if err != nil { - //需要错误日志的处理 - //loger.Error(error) + // 需要错误日志的处理 + // logger.Error(error) return "" - //panic(error) + // panic(error) } defer resp.Body.Close() var buffer [512]byte @@ -77,7 +76,7 @@ func PersonGet(url string) (response string) { if err != nil && err == io.EOF { break } else if err != nil { - //loger.Error(err) + // logger.Error(err) return "" // panic(err) } @@ -86,11 +85,10 @@ func PersonGet(url string) (response string) { return } -//发送POST请求 -//url:请求地址,data:POST请求提交的数据,contentType:请求体格式,如:application/json -//content:请求放回的内容 +// 发送POST请求 +// url:请求地址,data:POST请求提交的数据,contentType:请求体格式,如:application/json +// content:请求放回的内容 func Post(url string, data []byte, contentType string, head map[string]string) (content string) { - req, err := http.NewRequest("POST", url, bytes.NewBuffer(data)) req.Header.Add("content-type", contentType) for k, v := range head { @@ -113,9 +111,9 @@ func Post(url string, data []byte, contentType string, head map[string]string) ( return } -//发送POST请求 -//url:请求地址,data:POST请求提交的数据,contentType:请求体格式,如:application/json -//content:请求放回的内容 +// 发送POST请求 +// url:请求地址,data:POST请求提交的数据,contentType:请求体格式,如:application/json +// content:请求放回的内容 func ZeroTierGet(url string, head map[string]string) (content string, code int) { req, err := http.NewRequest(http.MethodGet, url, nil) for k, v := range head { @@ -138,11 +136,10 @@ func ZeroTierGet(url string, head map[string]string) (content string, code int) return } -//发送GET请求 -//url:请求地址 -//response:请求返回的内容 +// 发送GET请求 +// url:请求地址 +// response:请求返回的内容 func OasisGet(url string) (response string) { - head := make(map[string]string) t := make(chan string) @@ -155,5 +152,4 @@ func OasisGet(url string) (response string) { head["Authorization"] = <-t return Get(url, head) - } diff --git a/pkg/utils/loger/log.go b/pkg/utils/loger/log.go deleted file mode 100644 index 7a59c2e..0000000 --- a/pkg/utils/loger/log.go +++ /dev/null @@ -1,92 +0,0 @@ -/* - * @Author: LinkLeong link@icewhale.com - * @Date: 2022-06-02 15:09:38 - * @LastEditors: LinkLeong - * @LastEditTime: 2022-06-27 15:47:49 - * @FilePath: /CasaOS/pkg/utils/loger/log.go - * @Description: - * @Website: https://www.casaos.io - * Copyright (c) 2022 by icewhale, All Rights Reserved. - */ -package loger - -import ( - "fmt" - "os" - "path" - "path/filepath" - "runtime" - - "github.com/IceWhaleTech/CasaOS/pkg/config" - "go.uber.org/zap" - "go.uber.org/zap/zapcore" - "gopkg.in/natefinch/lumberjack.v2" -) - -var loggers *zap.Logger - -func getFileLogWriter() (writeSyncer zapcore.WriteSyncer) { - // 使用 lumberjack 实现 log rotate - lumberJackLogger := &lumberjack.Logger{ - Filename: filepath.Join(config.AppInfo.LogPath, fmt.Sprintf("%s.%s", - config.AppInfo.LogSaveName, - config.AppInfo.LogFileExt, - )), - MaxSize: 10, - MaxBackups: 60, - MaxAge: 1, - Compress: true, - } - - return zapcore.AddSync(lumberJackLogger) -} - -func LogInit() { - encoderConfig := zap.NewProductionEncoderConfig() - encoderConfig.EncodeTime = zapcore.EpochTimeEncoder - encoder := zapcore.NewJSONEncoder(encoderConfig) - fileWriteSyncer := getFileLogWriter() - core := zapcore.NewTee( - zapcore.NewCore(encoder, zapcore.AddSync(os.Stdout), zapcore.InfoLevel), - zapcore.NewCore(encoder, fileWriteSyncer, zapcore.InfoLevel), - ) - loggers = zap.New(core) - -} - -func Info(message string, fields ...zap.Field) { - callerFields := getCallerInfoForLog() - fields = append(fields, callerFields...) - loggers.Info(message, fields...) -} - -func Debug(message string, fields ...zap.Field) { - callerFields := getCallerInfoForLog() - fields = append(fields, callerFields...) - loggers.Debug(message, fields...) -} - -func Error(message string, fields ...zap.Field) { - callerFields := getCallerInfoForLog() - fields = append(fields, callerFields...) - loggers.Error(message, fields...) -} - -func Warn(message string, fields ...zap.Field) { - callerFields := getCallerInfoForLog() - fields = append(fields, callerFields...) - loggers.Warn(message, fields...) -} - -func getCallerInfoForLog() (callerFields []zap.Field) { - - pc, file, line, ok := runtime.Caller(2) // 回溯两层,拿到写日志的调用方的函数信息 - if !ok { - return - } - funcName := runtime.FuncForPC(pc).Name() - funcName = path.Base(funcName) //Base函数返回路径的最后一个元素,只保留函数名 - - callerFields = append(callerFields, zap.String("func", funcName), zap.String("file", file), zap.Int("line", line)) - return -} diff --git a/pkg/utils/port/port.go b/pkg/utils/port/port.go deleted file mode 100644 index 8daf1a2..0000000 --- a/pkg/utils/port/port.go +++ /dev/null @@ -1,68 +0,0 @@ -package port - -import ( - "fmt" - "net" -) - -// 获取可用端口 -func GetAvailablePort(t string) (int, error) { - address := fmt.Sprintf("%s:0", "0.0.0.0") - if t == "udp" { - add, err := net.ResolveUDPAddr(t, address) - if err != nil { - return 0, err - } - - listener, err := net.ListenUDP(t, add) - if err != nil { - return 0, err - } - - defer listener.Close() - return listener.LocalAddr().(*net.UDPAddr).Port, nil - } else { - add, err := net.ResolveTCPAddr(t, address) - if err != nil { - return 0, err - } - - listener, err := net.ListenTCP(t, add) - if err != nil { - return 0, err - } - - defer listener.Close() - return listener.Addr().(*net.TCPAddr).Port, nil - } - -} - -// 判断端口是否可以(未被占用) -// param t tcp/udp -func IsPortAvailable(port int, t string) bool { - address := fmt.Sprintf("%s:%d", "0.0.0.0", port) - if t == "udp" { - sadd, err := net.ResolveUDPAddr("udp", address) - uc, err := net.ListenUDP("udp", sadd) - - if err != nil { - fmt.Println(err.Error()) - return false - } else { - defer uc.Close() - return true - } - - } else { - listener, err := net.Listen(t, address) - - if err != nil { - //log.Infof("port %s is taken: %s", address, err) - return false - } - defer listener.Close() - return true - } - -} diff --git a/pkg/utils/port/port_test.go b/pkg/utils/port/port_test.go deleted file mode 100644 index 85a4140..0000000 --- a/pkg/utils/port/port_test.go +++ /dev/null @@ -1,18 +0,0 @@ -package port - -import ( - "fmt" - "testing" -) - -func TestPortAvailable(t *testing.T) { - // fmt.Println(PortAvailable()) - //fmt.Println(IsPortAvailable(6881,"tcp")) - p, _ := GetAvailablePort("udp") - fmt.Println("udp", p) - fmt.Println(IsPortAvailable(p, "udp")) - - t1, _ := GetAvailablePort("tcp") - fmt.Println("tcp", t1) - fmt.Println(IsPortAvailable(t1, "tcp")) -} diff --git a/pkg/utils/random/random.go b/pkg/utils/random/random.go deleted file mode 100644 index 6909cad..0000000 --- a/pkg/utils/random/random.go +++ /dev/null @@ -1,24 +0,0 @@ -package random - -import ( - "math/rand" - "time" -) - -func RandomString(n int, onlyLetter bool) string { - - var letters []rune - - if onlyLetter { - letters = []rune("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ") - } else { - letters = []rune("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789") - } - - b := make([]rune, n) - rand.Seed(time.Now().UnixNano()) - for i := range b { - b[i] = letters[rand.Intn(len(letters))] - } - return string(b) -} diff --git a/pkg/utils/random/random_test.go b/pkg/utils/random/random_test.go deleted file mode 100644 index 47d801d..0000000 --- a/pkg/utils/random/random_test.go +++ /dev/null @@ -1,10 +0,0 @@ -package random - -import ( - "fmt" - "testing" -) - -func TestRandomString(t *testing.T) { - fmt.Println(RandomString(6, true)) -} diff --git a/route/init.go b/route/init.go index 405df48..4c55e1a 100644 --- a/route/init.go +++ b/route/init.go @@ -17,12 +17,12 @@ import ( "strings" "time" + "github.com/IceWhaleTech/CasaOS-Common/utils/logger" "github.com/IceWhaleTech/CasaOS/model" "github.com/IceWhaleTech/CasaOS/pkg/config" "github.com/IceWhaleTech/CasaOS/pkg/samba" "github.com/IceWhaleTech/CasaOS/pkg/utils/encryption" "github.com/IceWhaleTech/CasaOS/pkg/utils/file" - "github.com/IceWhaleTech/CasaOS/pkg/utils/loger" "github.com/IceWhaleTech/CasaOS/service" "github.com/IceWhaleTech/CasaOS/types" "go.uber.org/zap" @@ -38,7 +38,7 @@ func InitInfo() { if file.Exists(config.AppInfo.DBPath + "/baseinfo.conf") { err := json.Unmarshal(file.ReadFullFile(config.AppInfo.DBPath+"/baseinfo.conf"), &mb) if err != nil { - loger.Error("baseinfo.conf", zap.String("error", err.Error())) + logger.Error("baseinfo.conf", zap.String("error", err.Error())) } } if file.Exists("/etc/CHANNEL") { @@ -47,14 +47,14 @@ func InitInfo() { } mac, err := service.MyService.System().GetMacAddress() if err != nil { - loger.Error("GetMacAddress", zap.String("error", err.Error())) + logger.Error("GetMacAddress", zap.String("error", err.Error())) } mb.Hash = encryption.GetMD5ByStr(mac) mb.Version = types.CURRENTVERSION os.Remove(config.AppInfo.DBPath + "/baseinfo.conf") by, err := json.Marshal(mb) if err != nil { - loger.Error("init info err", zap.Any("err", err)) + logger.Error("init info err", zap.Any("err", err)) return } file.WriteToFullPath(by, config.AppInfo.DBPath+"/baseinfo.conf", 0o666) @@ -68,7 +68,7 @@ func InitNetworkMount() { directories, err := samba.GetSambaSharesList(connection.Host, connection.Port, connection.Username, connection.Password) if err != nil { service.MyService.Connections().DeleteConnection(fmt.Sprint(connection.ID)) - loger.Error("mount samba err", zap.Any("err", err), zap.Any("info", connection)) + logger.Error("mount samba err", zap.Any("err", err), zap.Any("info", connection)) continue } baseHostPath := "/mnt/" + connection.Host diff --git a/route/periodical.go b/route/periodical.go index a14d163..db8fa09 100644 --- a/route/periodical.go +++ b/route/periodical.go @@ -54,7 +54,6 @@ func SendMemBySocket() { } func SendAllHardwareStatusBySocket() { - netList := service.MyService.System().GetNetInfo() newNet := []model.IOCountersStat{} nets := service.MyService.System().GetNet(true) @@ -91,7 +90,6 @@ func SendAllHardwareStatusBySocket() { memInfo := service.MyService.System().GetMemInfo() service.MyService.Notify().SendAllHardwareStatusBySocket(memInfo, cpuData, newNet) - } // func MonitoryUSB() { @@ -99,7 +97,7 @@ func SendAllHardwareStatusBySocket() { // conn := new(netlink.UEventConn) // if err := conn.Connect(netlink.UdevEvent); err != nil { -// loger.Error("udev err", zap.Any("Unable to connect to Netlink Kobject UEvent socket", err)) +// logger.Error("udev err", zap.Any("Unable to connect to Netlink Kobject UEvent socket", err)) // } // defer conn.Close() @@ -124,7 +122,7 @@ func SendAllHardwareStatusBySocket() { // continue // } // case err := <-errors: -// loger.Error("udev err", zap.Any("err", err)) +// logger.Error("udev err", zap.Any("err", err)) // } // } diff --git a/route/route.go b/route/route.go index 7e388a7..2084e80 100644 --- a/route/route.go +++ b/route/route.go @@ -58,68 +58,6 @@ func InitRouter() *gin.Engine { v1Group.Use(jwt.ExceptLocalhost()) { - // v1UsersGroup := v1Group.Group("/users") - // v1UsersGroup.Use() - // { - // v1UsersGroup.GET("/current", v1.GetUserInfo) - // v1UsersGroup.PUT("/current", v1.PutUserInfo) - // v1UsersGroup.PUT("/current/password", v1.PutUserPassword) - - // v1UsersGroup.GET("/current/custom/:key", v1.GetUserCustomConf) - // v1UsersGroup.POST("/current/custom/:key", v1.PostUserCustomConf) - // v1UsersGroup.DELETE("/current/custom/:key", v1.DeleteUserCustomConf) - - // v1UsersGroup.POST("/current/image/:key", v1.PostUserUploadImage) - // v1UsersGroup.PUT("/current/image/:key", v1.PutUserImage) - // //v1UserGroup.POST("/file/image/:key", v1.PostUserFileImage) - // v1UsersGroup.DELETE("/current/image", v1.DeleteUserImage) - - // //v1UserGroup.PUT("/avatar", v1.PutUserAvatar) - // //v1UserGroup.GET("/avatar", v1.GetUserAvatar) - // v1UsersGroup.DELETE("/:id", v1.DeleteUser) - // v1UsersGroup.GET("/:username", v1.GetUserInfoByUsername) - // v1UsersGroup.DELETE("", v1.DeleteUserAll) - // } - - v1AppsGroup := v1Group.Group("/apps") - v1AppsGroup.Use() - { - v1AppsGroup.GET("", v1.AppList) // list - v1AppsGroup.GET("/:id", v1.AppInfo) - } - v1ContainerGroup := v1Group.Group("/container") - v1ContainerGroup.Use() - { - - v1ContainerGroup.GET("", v1.MyAppList) ///my/list - v1ContainerGroup.GET("/usage", v1.AppUsageList) - v1ContainerGroup.GET("/:id", v1.ContainerUpdateInfo) ///update/:id/info - v1ContainerGroup.GET("/:id/logs", v1.ContainerLog) // /app/logs/:id - v1ContainerGroup.GET("/networks", v1.GetDockerNetworks) // app/install/config - - v1ContainerGroup.GET("/:id/state", v1.GetContainerState) // app/state/:id ?state=install_progress - // there are problems, temporarily do not deal with - v1ContainerGroup.GET("/:id/terminal", v1.DockerTerminal) // app/terminal/:id - v1ContainerGroup.POST("", v1.InstallApp) // app/install - // v1ContainerGroup.GET("/:id", v1.ContainerInfo) // /app/info/:id - - v1ContainerGroup.PUT("/:id", v1.UpdateSetting) ///update/:id/setting - - v1ContainerGroup.PUT("/:id/state", v1.ChangAppState) // /app/state/:id - v1ContainerGroup.DELETE("/:id", v1.UnInstallApp) // app/uninstall/:id - // Not used - v1ContainerGroup.PUT("/:id/latest", v1.PutAppUpdate) - // Not used - v1ContainerGroup.POST("/share", v1.ShareAppFile) - v1ContainerGroup.GET("/info", v1.GetDockerDaemonConfiguration) - v1ContainerGroup.PUT("/info", v1.PutDockerDaemonConfiguration) - - } - v1AppCategoriesGroup := v1Group.Group("/app-categories") - v1AppCategoriesGroup.Use() - { - v1AppCategoriesGroup.GET("", v1.CategoryList) - } v1SysGroup := v1Group.Group("/sys") v1SysGroup.Use() @@ -148,7 +86,6 @@ func InitRouter() *gin.Engine { v1SysGroup.GET("/server-info", nil) v1SysGroup.PUT("/server-info", nil) - v1SysGroup.GET("/apps-state", v1.GetSystemAppsStatus) // v1SysGroup.GET("/port", v1.GetCasaOSPort) // v1SysGroup.PUT("/port", v1.PutCasaOSPort) v1SysGroup.GET("/proxy", v1.GetSystemProxy) @@ -222,6 +159,8 @@ func InitRouter() *gin.Engine { v1NotifyGroup.POST("/:path", v1.PostNotifyMessage) // merge to system v1NotifyGroup.POST("/system_status", v1.PostSystemStatusNotify) + v1NotifyGroup.POST("/install_app", v1.PostInstallAppNotify) + v1NotifyGroup.POST("/uninstall_app", v1.PostUninstallAppNotify) } } return r diff --git a/route/socket.go b/route/socket.go index 8b73a0b..1ab4f88 100644 --- a/route/socket.go +++ b/route/socket.go @@ -14,15 +14,14 @@ import ( "strconv" "time" + "github.com/IceWhaleTech/CasaOS-Common/utils/port" "github.com/IceWhaleTech/CasaOS/model/notify" "github.com/IceWhaleTech/CasaOS/pkg/config" - "github.com/IceWhaleTech/CasaOS/pkg/utils/port" "github.com/IceWhaleTech/CasaOS/service" f "github.com/ambelovsky/gosf" ) func SocketInit(msg chan notify.Message) { - // set socket port socketPort := 0 if len(config.ServerInfo.SocketPort) == 0 { @@ -51,10 +50,9 @@ func SocketInit(msg chan notify.Message) { f.Broadcast("", v.Path, &v.Msg) time.Sleep(time.Millisecond * 100) } - }(msg) f.Startup(map[string]interface{}{ - "port": socketPort}) - + "port": socketPort, + }) } diff --git a/route/v1/app.go b/route/v1/app.go deleted file mode 100644 index 8e39347..0000000 --- a/route/v1/app.go +++ /dev/null @@ -1,355 +0,0 @@ -package v1 - -import ( - "encoding/json" - "io/ioutil" - "net/http" - "path/filepath" - "strconv" - - "github.com/IceWhaleTech/CasaOS/model" - "github.com/IceWhaleTech/CasaOS/pkg/utils/command" - "github.com/IceWhaleTech/CasaOS/pkg/utils/common_err" - "github.com/IceWhaleTech/CasaOS/pkg/utils/file" - - port2 "github.com/IceWhaleTech/CasaOS/pkg/utils/port" - "github.com/IceWhaleTech/CasaOS/service" - "github.com/gin-gonic/gin" -) - -const ( - dockerRootDirFilePath = "/var/lib/casaos/docker_root" - dockerDaemonConfigurationFilePath = "/etc/docker/daemon.json" -) - -// @Summary 获取远程列表 -// @Produce application/json -// @Accept application/json -// @Tags app -// @Param index query int false "页码" -// @Param size query int false "每页数量" -// @Param category_id query int false "分类id" -// @Param type query string false "rank,new" -// @Param key query string false "search key" -// @Security ApiKeyAuth -// @Success 200 {string} string "ok" -// @Router /app/list [get] -func AppList(c *gin.Context) { - // service.MyService.Docker().DockerContainerCommit("test2") - - index := c.DefaultQuery("index", "1") - size := c.DefaultQuery("size", "10000") - t := c.DefaultQuery("type", "rank") - categoryId := c.DefaultQuery("category_id", "0") - key := c.DefaultQuery("key", "") - if len(index) == 0 || len(size) == 0 || len(t) == 0 || len(categoryId) == 0 { - c.JSON(common_err.CLIENT_ERROR, &model.Result{Success: common_err.INVALID_PARAMS, Message: common_err.GetMsg(common_err.INVALID_PARAMS)}) - return - } - collection, err := service.MyService.Casa().GetServerList(index, size, t, categoryId, key) - if err != nil { - c.JSON(common_err.SERVICE_ERROR, &model.Result{Success: common_err.SERVICE_ERROR, Message: common_err.GetMsg(common_err.SERVICE_ERROR), Data: err.Error()}) - return - } - // for i := 0; i < len(recommend); i++ { - // ct, _ := service.MyService.Docker().DockerListByImage(recommend[i].Image, recommend[i].ImageVersion) - // if ct != nil { - // recommend[i].State = ct.State - // } - // } - // for i := 0; i < len(list); i++ { - // ct, _ := service.MyService.Docker().DockerListByImage(list[i].Image, list[i].ImageVersion) - // if ct != nil { - // list[i].State = ct.State - // } - // } - // for i := 0; i < len(community); i++ { - // ct, _ := service.MyService.Docker().DockerListByImage(community[i].Image, community[i].ImageVersion) - // if ct != nil { - // community[i].State = ct.State - // } - // } - data := make(map[string]interface{}, 3) - data["recommend"] = collection.Recommend - data["list"] = collection.List - data["community"] = collection.Community - - c.JSON(common_err.SUCCESS, &model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: data}) -} - -// @Summary 获取一个可用端口 -// @Produce application/json -// @Accept application/json -// @Tags app -// @Param type query string true "端口类型 udp/tcp" -// @Security ApiKeyAuth -// @Success 200 {string} string "ok" -// @Router /app/getport [get] -func GetPort(c *gin.Context) { - t := c.DefaultQuery("type", "tcp") - var p int - ok := true - for ok { - p, _ = port2.GetAvailablePort(t) - ok = !port2.IsPortAvailable(p, t) - } - // @tiger 这里最好封装成 {'port': ...} 的形式,来体现出参的上下文 - c.JSON(common_err.SUCCESS, &model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: p}) -} - -// @Summary 检查端口是否可用 -// @Produce application/json -// @Accept application/json -// @Tags app -// @Param port path int true "端口号" -// @Param type query string true "端口类型 udp/tcp" -// @Security ApiKeyAuth -// @Success 200 {string} string "ok" -// @Router /app/check/{port} [get] -func PortCheck(c *gin.Context) { - p, _ := strconv.Atoi(c.Param("port")) - t := c.DefaultQuery("type", "tcp") - c.JSON(common_err.SUCCESS, &model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: port2.IsPortAvailable(p, t)}) -} - -// @Summary 我的应用列表 -// @Produce application/json -// @Accept application/json -// @Tags app -// @Security ApiKeyAuth -// @Param index query int false "index" -// @Param size query int false "size" -// @Param position query bool false "是否是首页应用" -// @Success 200 {string} string "ok" -// @Router /app/my/list [get] -func MyAppList(c *gin.Context) { - index, _ := strconv.Atoi(c.DefaultQuery("index", "1")) - size, _ := strconv.Atoi(c.DefaultQuery("size", "0")) - position, _ := strconv.ParseBool(c.DefaultQuery("position", "true")) - list, unTranslation := service.MyService.App().GetMyList(index, size, position) - data := make(map[string]interface{}, 2) - data["casaos_apps"] = list - data["local_apps"] = unTranslation - - c.JSON(common_err.SUCCESS, &model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: data}) -} - -// @Summary my app hardware usage list -// @Produce application/json -// @Accept application/json -// @Tags app -// @Security ApiKeyAuth -// @Success 200 {string} string "ok" -// @Router /app/usage [get] -func AppUsageList(c *gin.Context) { - list := service.MyService.App().GetHardwareUsage() - c.JSON(common_err.SUCCESS, &model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: list}) - // c.JSON(common_err.SUCCESS, &model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: nil}) -} - -// @Summary 应用详情 -// @Produce application/json -// @Accept application/json -// @Tags app -// @Param id path int true "id" -// @Security ApiKeyAuth -// @Success 200 {string} string "ok" -// @Router /app/appinfo/{id} [get] -func AppInfo(c *gin.Context) { - id := c.Param("id") - language := c.GetHeader("Language") - info, err := service.MyService.Casa().GetServerAppInfo(id, "", language) - if err != nil { - c.JSON(common_err.SERVICE_ERROR, &model.Result{Success: common_err.SERVICE_ERROR, Message: common_err.GetMsg(common_err.SERVICE_ERROR), Data: err.Error()}) - return - } - if info.NetworkModel != "host" { - for i := 0; i < len(info.Ports); i++ { - if p, _ := strconv.Atoi(info.Ports[i].ContainerPort); port2.IsPortAvailable(p, info.Ports[i].Protocol) { - info.Ports[i].CommendPort = strconv.Itoa(p) - } else { - if info.Ports[i].Protocol == "tcp" { - if p, err := port2.GetAvailablePort("tcp"); err == nil { - info.Ports[i].CommendPort = strconv.Itoa(p) - } - } else if info.Ports[i].Protocol == "upd" { - if p, err := port2.GetAvailablePort("udp"); err == nil { - info.Ports[i].CommendPort = strconv.Itoa(p) - } - } - } - - if info.Ports[i].Type == 0 { - info.PortMap = info.Ports[i].CommendPort - } - } - } else { - for i := 0; i < len(info.Ports); i++ { - if info.Ports[i].Type == 0 { - info.PortMap = info.Ports[i].ContainerPort - break - } - } - } - - for i := 0; i < len(info.Devices); i++ { - if !file.CheckNotExist(info.Devices[i].ContainerPath) { - info.Devices[i].Path = info.Devices[i].ContainerPath - } - } - // if len(info.Tip) > 0 { - // info.Tip = env_helper.ReplaceStringDefaultENV(info.Tip) - // } - - // portOrder := func(c1, c2 *model.Ports) bool { - // return c1.Type < c2.Type - // } - - // envOrder := func(c1, c2 *model.Envs) bool { - // return c1.Type < c2.Type - // } - - // volOrder := func(c1, c2 *model.Volume) bool { - // return c1.Type < c2.Type - // } - - // devOrder := func(c1, c2 *model.Devices) bool { - // return c1.Type < c2.Type - // } - - // sort - // if info.NetworkModel != "host" { - // sort.PortsSort(portOrder).Sort(info.Configures.TcpPorts) - // sort.PortsSort(portOrder).Sort(info.Configures.UdpPorts) - // } - - // sort.EnvSort(envOrder).Sort(info.Envs) - // sort.VolSort(volOrder).Sort(info.Volumes.([]model.PathMap)) - // sort.DevSort(devOrder).Sort(info.Devices) - info.Image += ":" + info.ImageVersion - info.MaxMemory = (service.MyService.System().GetMemInfo()["total"]).(uint64) >> 20 - - c.JSON(common_err.SUCCESS, &model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: info}) -} - -// @Summary 获取远程分类列表 -// @Produce application/json -// @Accept application/json -// @Tags app -// @Security ApiKeyAuth -// @Success 200 {string} string "ok" -// @Router /app/category [get] -func CategoryList(c *gin.Context) { - list, err := service.MyService.Casa().GetServerCategoryList() - if err != nil { - c.JSON(common_err.SERVICE_ERROR, &model.Result{Success: common_err.SERVICE_ERROR, Message: common_err.GetMsg(common_err.SERVICE_ERROR), Data: err.Error()}) - return - } - var count uint = 0 - for _, category := range list { - count += category.Count - } - - rear := append([]model.CategoryList{}, list[0:]...) - list = append(list[:0], model.CategoryList{Count: count, Name: "All", Font: "apps"}) - list = append(list, rear...) - c.JSON(common_err.SUCCESS, &model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: list}) -} - -// @Summary 分享该应用配置 -// @Produce application/json -// @Accept application/json -// @Tags app -// @Security ApiKeyAuth -// @Success 200 {string} string "ok" -// @Router /app/share [post] -func ShareAppFile(c *gin.Context) { - str, _ := ioutil.ReadAll(c.Request.Body) - content := service.MyService.Casa().ShareAppFile(str) - c.JSON(common_err.SUCCESS, json.RawMessage(content)) -} - -func GetDockerDaemonConfiguration(c *gin.Context) { - // info, err := service.MyService.Docker().GetDockerInfo() - // if err != nil { - // c.JSON(common_err.SERVICE_ERROR, &model.Result{Success: common_err.SERVICE_ERROR, Message: common_err.GetMsg(common_err.SERVICE_ERROR), Data: err.Error()}) - // return - // } - data := make(map[string]interface{}) - - if file.Exists(dockerRootDirFilePath) { - buf := file.ReadFullFile(dockerRootDirFilePath) - err := json.Unmarshal(buf, &data) - if err != nil { - c.JSON(common_err.CLIENT_ERROR, &model.Result{Success: common_err.CLIENT_ERROR, Message: common_err.GetMsg(common_err.INVALID_PARAMS), Data: err}) - return - } - } - c.JSON(common_err.SUCCESS, &model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: data}) -} - -func PutDockerDaemonConfiguration(c *gin.Context) { - request := make(map[string]interface{}) - if err := c.BindJSON(&request); err != nil { - c.JSON(http.StatusBadRequest, &model.Result{Success: common_err.CLIENT_ERROR, Message: common_err.GetMsg(common_err.INVALID_PARAMS), Data: err}) - return - } - - value, ok := request["docker_root_dir"] - if !ok { - c.JSON(http.StatusBadRequest, &model.Result{Success: common_err.CLIENT_ERROR, Message: common_err.GetMsg(common_err.INVALID_PARAMS), Data: "`docker_root_dir` should not empty"}) - return - } - - dockerConfig := model.DockerDaemonConfigurationModel{} - if file.Exists(dockerDaemonConfigurationFilePath) { - byteResult := file.ReadFullFile(dockerDaemonConfigurationFilePath) - err := json.Unmarshal(byteResult, &dockerConfig) - if err != nil { - c.JSON(http.StatusInternalServerError, &model.Result{Success: common_err.SERVICE_ERROR, Message: "error when trying to deserialize " + dockerDaemonConfigurationFilePath, Data: err}) - return - } - } - - dockerRootDir := value.(string) - if dockerRootDir == "/" { - dockerConfig.Root = "" // omitempty - empty string will not be serialized - } else { - if !file.Exists(dockerRootDir) { - c.JSON(http.StatusBadRequest, &model.Result{Success: common_err.CLIENT_ERROR, Message: common_err.GetMsg(common_err.DIR_NOT_EXISTS), Data: common_err.GetMsg(common_err.DIR_NOT_EXISTS)}) - return - } - - dockerConfig.Root = filepath.Join(dockerRootDir, "docker") - - if err := file.IsNotExistMkDir(dockerConfig.Root); err != nil { - c.JSON(http.StatusInternalServerError, &model.Result{Success: common_err.SERVICE_ERROR, Message: "error when trying to create " + dockerConfig.Root, Data: err}) - return - } - } - - if buf, err := json.Marshal(request); err != nil { - c.JSON(http.StatusBadRequest, &model.Result{Success: common_err.CLIENT_ERROR, Message: "error when trying to serialize docker root json", Data: err}) - return - } else { - if err := file.WriteToFullPath(buf, dockerRootDirFilePath, 0o644); err != nil { - c.JSON(http.StatusInternalServerError, &model.Result{Success: common_err.SERVICE_ERROR, Message: "error when trying to write " + dockerRootDirFilePath, Data: err}) - return - } - } - - if buf, err := json.Marshal(dockerConfig); err != nil { - c.JSON(http.StatusBadRequest, &model.Result{Success: common_err.CLIENT_ERROR, Message: "error when trying to serialize docker config", Data: dockerConfig}) - return - } else { - if err := file.WriteToFullPath(buf, dockerDaemonConfigurationFilePath, 0o644); err != nil { - c.JSON(http.StatusInternalServerError, &model.Result{Success: common_err.SERVICE_ERROR, Message: "error when trying to write to " + dockerDaemonConfigurationFilePath, Data: err}) - return - } - } - - println(command.ExecResultStr("systemctl daemon-reload")) - println(command.ExecResultStr("systemctl restart docker")) - - c.JSON(http.StatusOK, &model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: request}) -} diff --git a/route/v1/docker.go b/route/v1/docker.go deleted file mode 100644 index db252f1..0000000 --- a/route/v1/docker.go +++ /dev/null @@ -1,1267 +0,0 @@ -package v1 - -import ( - "bytes" - json2 "encoding/json" - "net/http" - "os/exec" - "path/filepath" - "strconv" - "strings" - "time" - - "github.com/IceWhaleTech/CasaOS/model" - "github.com/IceWhaleTech/CasaOS/model/notify" - "github.com/IceWhaleTech/CasaOS/pkg/config" - "github.com/IceWhaleTech/CasaOS/pkg/docker" - "github.com/IceWhaleTech/CasaOS/pkg/utils/common_err" - "github.com/IceWhaleTech/CasaOS/pkg/utils/file" - "github.com/IceWhaleTech/CasaOS/pkg/utils/loger" - port2 "github.com/IceWhaleTech/CasaOS/pkg/utils/port" - "github.com/IceWhaleTech/CasaOS/pkg/utils/random" - "github.com/IceWhaleTech/CasaOS/service" - "github.com/IceWhaleTech/CasaOS/service/docker_base" - model2 "github.com/IceWhaleTech/CasaOS/service/model" - "github.com/IceWhaleTech/CasaOS/types" - "github.com/gin-gonic/gin" - "github.com/gorilla/websocket" - "github.com/jinzhu/copier" - uuid "github.com/satori/go.uuid" - "go.uber.org/zap" - "golang.org/x/crypto/ssh" -) - -var upgrader = websocket.Upgrader{ - ReadBufferSize: 1024, - WriteBufferSize: 1024, - CheckOrigin: func(r *http.Request) bool { return true }, - HandshakeTimeout: time.Duration(time.Second * 5), -} - -// 打开docker的terminal -func DockerTerminal(c *gin.Context) { - col := c.DefaultQuery("cols", "100") - row := c.DefaultQuery("rows", "30") - conn, err := upgrader.Upgrade(c.Writer, c.Request, nil) - if err != nil { - c.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.SERVICE_ERROR, Message: common_err.GetMsg(common_err.SERVICE_ERROR), Data: err.Error()}) - return - } - defer conn.Close() - container := c.Param("id") - hr, err := service.Exec(container, row, col) - if err != nil { - c.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.SERVICE_ERROR, Message: common_err.GetMsg(common_err.SERVICE_ERROR), Data: err.Error()}) - return - } - // 关闭I/O流 - defer hr.Close() - // 退出进程 - defer func() { - hr.Conn.Write([]byte("exit\r")) - }() - go func() { - docker.WsWriterCopy(hr.Conn, conn) - }() - docker.WsReaderCopy(conn, hr.Conn) -} - -func PostSshLogin(c *gin.Context) { - j := make(map[string]string) - c.ShouldBind(&j) - userName := j["username"] - password := j["password"] - port := j["port"] - if userName == "" || password == "" || port == "" { - c.JSON(common_err.CLIENT_ERROR, model.Result{Success: common_err.INVALID_PARAMS, Message: common_err.GetMsg(common_err.INVALID_PARAMS), Data: "Username or password or port is empty"}) - return - } - _, err := docker.NewSshClient(userName, password, port) - if err != nil { - c.JSON(common_err.CLIENT_ERROR, model.Result{Success: common_err.CLIENT_ERROR, Message: common_err.GetMsg(common_err.CLIENT_ERROR), Data: "Please check if the username and port are correct, and make sure that ssh server is installed."}) - loger.Error("connect ssh error", zap.Any("error", err)) - return - } - c.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS)}) -} - -func WsSsh(c *gin.Context) { - _, e := exec.LookPath("ssh") - if e != nil { - c.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.SERVICE_ERROR, Message: common_err.GetMsg(common_err.SERVICE_ERROR), Data: "ssh server not found"}) - return - } - - userName := c.Query("username") - password := c.Query("password") - port := c.Query("port") - wsConn, _ := upgrader.Upgrade(c.Writer, c.Request, nil) - var logBuff = new(bytes.Buffer) - - quitChan := make(chan bool, 3) - // user := "" - // password := "" - var login int = 1 - cols, _ := strconv.Atoi(c.DefaultQuery("cols", "200")) - rows, _ := strconv.Atoi(c.DefaultQuery("rows", "32")) - var client *ssh.Client - for login != 0 { - - var err error - if userName == "" || password == "" || port == "" { - wsConn.WriteMessage(websocket.TextMessage, []byte("username or password or port is empty")) - } - // wsConn.WriteMessage(websocket.TextMessage, []byte("login:")) - // user = docker.ReceiveWsMsgUser(wsConn, logBuff) - // wsConn.WriteMessage(websocket.TextMessage, []byte("\r\n\x1b[0m")) - // wsConn.WriteMessage(websocket.TextMessage, []byte("password:")) - // password = docker.ReceiveWsMsgPassword(wsConn, logBuff) - // wsConn.WriteMessage(websocket.TextMessage, []byte("\r\n\x1b[0m")) - client, err = docker.NewSshClient(userName, password, port) - - if err != nil && client == nil { - wsConn.WriteMessage(websocket.TextMessage, []byte(err.Error())) - wsConn.WriteMessage(websocket.TextMessage, []byte("\r\n\x1b[0m")) - } else { - login = 0 - } - - } - if client != nil { - defer client.Close() - } - - ssConn, _ := docker.NewSshConn(cols, rows, client) - defer ssConn.Close() - - go ssConn.ReceiveWsMsg(wsConn, logBuff, quitChan) - go ssConn.SendComboOutput(wsConn, quitChan) - go ssConn.SessionWait(quitChan) - - <-quitChan - -} - -// @Summary 安装app(该接口需要post json数据) -// @Produce application/json -// @Accept application/json -// @Tags app -// @Param id path int true "id" -// @Param port formData int true "主端口" -// @Param tcp formData string false "tcp端口" -// @Param udp formData string false "udp端口" -// @Param env formData string false "环境变量" -// @Security ApiKeyAuth -// @Success 200 {string} string "ok" -// @Router /app/install [post] -func InstallApp(c *gin.Context) { - var appInfo model.ServerAppList - m := model.CustomizationPostData{} - c.ShouldBind(&m) - - const CUSTOM = "custom" - var dockerImage string - var dockerImageVersion string - - //check app name is exist - if len(m.Protocol) == 0 { - m.Protocol = "http" - } - m.ContainerName = strings.Replace(m.Label, " ", "_", -1) - if m.Origin != CUSTOM { - oldName := m.ContainerName - oldLabel := m.Label - for i := 0; true; i++ { - if i != 0 { - m.ContainerName = oldName + "-" + strconv.Itoa(i) - m.Label = oldLabel + "-" + strconv.Itoa(i) - } - if _, err := service.MyService.Docker().DockerListByName(m.ContainerName); err != nil { - break - } - } - } else { - if _, err := service.MyService.Docker().DockerListByName(m.ContainerName); err == nil { - c.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.ERROR_APP_NAME_EXIST, Message: common_err.GetMsg(common_err.ERROR_APP_NAME_EXIST)}) - return - } - - } - - //check port - if len(m.PortMap) > 0 && m.PortMap != "0" { - //c.JSON(http.StatusOK, model.Result{Success: common_err.INVALID_PARAMS, Message: common_err.GetMsg(common_err.INVALID_PARAMS)}) - portMap, _ := strconv.Atoi(m.PortMap) - if !port2.IsPortAvailable(portMap, "tcp") { - c.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.SERVICE_ERROR, Message: "Duplicate port:" + m.PortMap}) - return - } - } - //if len(m.Port) == 0 || m.Port == "0" { - // m.Port = m.PortMap - //} - - imageArr := strings.Split(m.Image, ":") - if len(imageArr) == 2 { - dockerImage = imageArr[0] - dockerImageVersion = imageArr[1] - } else { - dockerImage = m.Image - dockerImageVersion = "latest" - } - m.Image = dockerImage + ":" + dockerImageVersion - for _, u := range m.Ports { - - if u.Protocol == "udp" { - t, _ := strconv.Atoi(u.CommendPort) - if !port2.IsPortAvailable(t, "udp") { - c.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.SERVICE_ERROR, Message: "Duplicate port:" + u.CommendPort}) - return - } - } else if u.Protocol == "tcp" { - - te, _ := strconv.Atoi(u.CommendPort) - if !port2.IsPortAvailable(te, "tcp") { - c.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.SERVICE_ERROR, Message: "Duplicate port:" + u.CommendPort}) - return - } - } else if u.Protocol == "both" { - t, _ := strconv.Atoi(u.CommendPort) - if !port2.IsPortAvailable(t, "udp") { - c.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.SERVICE_ERROR, Message: "Duplicate port:" + u.CommendPort}) - return - } - te, _ := strconv.Atoi(u.CommendPort) - if !port2.IsPortAvailable(te, "tcp") { - c.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.SERVICE_ERROR, Message: "Duplicate port:" + u.CommendPort}) - return - } - } - } - if m.Origin == CUSTOM { - for _, device := range m.Devices { - if file.CheckNotExist(device.Path) { - c.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.DEVICE_NOT_EXIST, Message: device.Path + "," + common_err.GetMsg(common_err.DEVICE_NOT_EXIST)}) - return - } - - } - } else { - dev := []model.PathMap{} - for _, device := range dev { - if !file.CheckNotExist(device.Path) { - dev = append(dev, device) - } - } - m.Devices = dev - } - - //restart := c.PostForm("restart") //always 总是重启, unless-stopped 除非用户手动停止容器,否则总是重新启动, on-failure:仅当容器退出代码非零时重新启动 - //if len(restart) > 0 { - // - //} - // - //privileged := c.PostForm("privileged") //是否处于特权模式 - //if len(privileged) > 0 { - // - //} - id := uuid.NewV4().String() - m.CustomId = id - var relyMap = make(map[string]string) - go func() { - // installLog := model2.AppNotify{} - // installLog.State = 0 - // installLog.CustomId = m.Label - // installLog.Message = "installing rely" - // installLog.Class = types.NOTIFY_APP - // installLog.Type = types.NOTIFY_TYPE_UNIMPORTANT - // installLog.CreatedAt = strconv.FormatInt(time.Now().Unix(), 10) - // installLog.UpdatedAt = strconv.FormatInt(time.Now().Unix(), 10) - // installLog.Id = uuid.NewV4().String() - // service.MyService.Notify().AddLog(installLog) - if m.Origin != CUSTOM { - for _, plugin := range appInfo.Plugins { - if plugin == "mysql" { - mid := uuid.NewV4().String() - mc := docker_base.MysqlConfig{} - mc.DataBasePassword = random.RandomString(6, false) - mc.DataBaseDB = appInfo.Title - mc.DataBaseUser = "root" - mc.DataBasePort = "3306" - mysqlContainerId, err := docker_base.MysqlCreate(mc, mid, m.CpuShares, m.Memory) - if len(mysqlContainerId) > 0 && err == nil { - - mc.DataBaseHost = mid - - m.Envs = docker_base.MysqlFilter(mc, m.Envs) - - rely := model2.RelyDBModel{} - rely.Type = types.RELY_TYPE_MYSQL - rely.ContainerId = mysqlContainerId - rely.CustomId = mid - rely.ContainerCustomId = m.Label - var mysqlConfig model2.MysqlConfigs - - //结构体转换 - copier.Copy(&mysqlConfig, &mc) - rely.Config = mysqlConfig - service.MyService.Rely().Create(rely) - - relyMap["mysql"] = mid - - } else { - docker_base.MysqlDelete(mysqlContainerId) - // installLog.State = 0 - // installLog.Message = err.Error() - // service.MyService.Notify().UpdateLog(installLog) - } - } - } - } - - // step:下载镜像 - err := service.MyService.Docker().DockerPullImage(dockerImage+":"+dockerImageVersion, m.Icon, m.Label) - if err != nil { - notify := notify.Application{} - notify.Icon = m.Icon - notify.Name = m.Label - notify.State = "PULLING" - notify.Type = "INSTALL" - notify.Success = false - notify.Finished = false - notify.Message = err.Error() - service.MyService.Notify().SendInstallAppBySocket(notify) - return - } - - for !service.MyService.Docker().IsExistImage(m.Image) { - time.Sleep(time.Second) - } - - _, err = service.MyService.Docker().DockerContainerCreate(m, "") - if err != nil { - //service.MyService.Redis().Set(id, "{\"id\"\""+id+"\",\"state\":false,\"message\":\""+err.Error()+"\",\"speed\":80}", 100) - notify := notify.Application{} - notify.Icon = m.Icon - notify.Name = m.Label - notify.State = "STARTING" - notify.Type = "INSTALL" - notify.Success = false - notify.Finished = false - notify.Message = err.Error() - service.MyService.Notify().SendInstallAppBySocket(notify) - return - } else { - notify := notify.Application{} - notify.Icon = m.Icon - notify.Name = m.Label - notify.State = "STARTING" - notify.Type = "INSTALL" - notify.Success = true - notify.Finished = false - service.MyService.Notify().SendInstallAppBySocket(notify) - } - - // echo -e "hellow\nworld" >> - - //step:启动容器 - err = service.MyService.Docker().DockerContainerStart(m.ContainerName) - if err != nil { - //service.MyService.Redis().Set(id, "{\"id\"\""+id+"\",\"state\":false,\"message\":\""+err.Error()+"\",\"speed\":90}", 100) - notify := notify.Application{} - notify.Icon = m.Icon - notify.Name = m.Label - notify.State = "STARTING" - notify.Type = "INSTALL" - notify.Success = false - notify.Finished = false - notify.Message = err.Error() - service.MyService.Notify().SendInstallAppBySocket(notify) - return - } else { - // if m.Origin != CUSTOM { - // installLog.Message = "setting upnp" - // } else { - // installLog.Message = "nearing completion" - // } - // service.MyService.Notify().UpdateLog(installLog) - } - - //step: 启动成功 检查容器状态确认启动成功 - container, err := service.MyService.Docker().DockerContainerInfo(m.ContainerName) - if err != nil && container.ContainerJSONBase.State.Running { - notify := notify.Application{} - notify.Icon = m.Icon - notify.Name = m.Label - notify.State = "INSTALLED" - notify.Type = "INSTALL" - notify.Success = false - notify.Finished = true - notify.Message = err.Error() - service.MyService.Notify().SendInstallAppBySocket(notify) - return - } else { - notify := notify.Application{} - notify.Icon = m.Icon - notify.Name = m.Label - notify.State = "INSTALLED" - notify.Type = "INSTALL" - notify.Success = true - notify.Finished = true - service.MyService.Notify().SendInstallAppBySocket(notify) - } - - // if m.Origin != "custom" { - // for i := 0; i < len(m.Volumes); i++ { - // m.Volumes[i].Path = docker.GetDir(id, m.Volumes[i].Path) - // } - // } - //service.MyService.App().SaveContainer(md) - config.CasaOSGlobalVariables.AppChange = true - - }() - - c.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: m.Label}) - -} - -//// @Summary 自定义安装app(该接口需要post json数据) -//// @Produce application/json -//// @Accept application/json -//// @Tags app -//// @Param id path int true "id" -//// @Param port formData int true "主端口" -//// @Param tcp formData string false "tcp端口" -//// @Param udp formData string false "udp端口" -//// @Param env formData string false "环境变量" -//// @Security ApiKeyAuth -//// @Success 200 {string} string "ok" -//// @Router /app/install/{id} [post] -//func CustomInstallApp(c *gin.Context) { -// //appId := c.Param("id") -// // appInfo := service.MyService.App().GetServerAppInfo(appId) -// -// m := model.CustomizationPostData{} -// c.ShouldBind(&m) -// //检查端口 -// if len(m.PortMap) == 0 || m.PortMap == "0" { -// c.JSON(http.StatusOK, model.Result{Success: common_err.INVALID_PARAMS, Message: common_err.GetMsg(common_err.INVALID_PARAMS)}) -// return -// } -// if len(m.Port) == 0 || m.Port == "0" { -// m.Port = m.PortMap -// } -// -// portMap, _ := strconv.Atoi(m.PortMap) -// if !port2.IsPortAvailable(portMap, "tcp") { -// c.JSON(http.StatusOK, model.Result{Success: common_err.ERROR, Message: "Duplicate port:" + m.PortMap}) -// return -// } -// -// for _, u := range m.Udp { -// t, _ := strconv.Atoi(u.CommendPort) -// if !port2.IsPortAvailable(t, "udp") { -// c.JSON(http.StatusOK, model.Result{Success: common_err.ERROR, Message: "Duplicate port:" + u.CommendPort}) -// return -// } -// } -// -// for _, t := range m.Tcp { -// te, _ := strconv.Atoi(t.CommendPort) -// if !port2.IsPortAvailable(te, "tcp") { -// c.JSON(http.StatusOK, model.Result{Success: common_err.ERROR, Message: "Duplicate port:" + t.CommendPort}) -// return -// } -// } -// -// //restart := c.PostForm("restart") //always 总是重启, unless-stopped 除非用户手动停止容器,否则总是重新启动, on-failure:仅当容器退出代码非零时重新启动 -// //if len(restart) > 0 { -// // -// //} -// // -// //privileged := c.PostForm("privileged") //是否处于特权模式 -// //if len(privileged) > 0 { -// // -// //} -// -// err := service.MyService.Docker().DockerPullImage(m.Image) -// if err != nil { -// c.JSON(http.StatusOK, model.Result{Success: common_err.PULL_IMAGE_ERROR, Message: common_err.GetMsg(common_err.PULL_IMAGE_ERROR)}) -// } -// -// id := uuid.NewV4().String() -// -// var relyMap = make(map[string]string) -// go func() { -// installLog := model2.AppNotify{} -// installLog.CustomId = id -// installLog.State = 0 -// installLog.Message = "installing rely" -// installLog.Speed = 30 -// installLog.CreatedAt = time.Now() -// installLog.UpdatedAt = time.Now() -// service.MyService.Notify().AddLog(installLog) -// -// for !service.MyService.Docker().IsExistImage(m.Image) { -// time.Sleep(time.Second) -// } -// -// installLog.Speed = 50 -// installLog.Message = "pulling" -// service.MyService.Notify().UpdateLog(installLog) -// // step:下载镜像 -// -// var cpd model.PostData -// copier.Copy(&cpd, &m) -// //step:创建容器 -// containerId, err := service.MyService.Docker().DockerContainerCreate(m.Image, id, cpd, m.NetworkModel, m.Image, "custom") -// installLog.ContainerId = containerId -// if err != nil { -// //service.MyService.Redis().Set(id, "{\"id\"\""+id+"\",\"state\":false,\"message\":\""+err.Error()+"\",\"speed\":80}", 100) -// installLog.State = 0 -// installLog.Speed = 80 -// installLog.Message = err.Error() -// service.MyService.Notify().UpdateLog(installLog) -// return -// } else { -// //service.MyService.Redis().Set(id, "{\"id\":\""+id+"\",\"state\":true,\"message\":\"starting\",\"speed\":80}", 100) -// installLog.Speed = 80 -// installLog.Message = "starting" -// service.MyService.Notify().UpdateLog(installLog) -// } -// -// //step:启动容器 -// err = service.MyService.Docker().DockerContainerStart(id) -// if err != nil { -// //service.MyService.Redis().Set(id, "{\"id\"\""+id+"\",\"state\":false,\"message\":\""+err.Error()+"\",\"speed\":90}", 100) -// installLog.State = 0 -// installLog.Speed = 90 -// installLog.Message = err.Error() -// service.MyService.Notify().UpdateLog(installLog) -// return -// } else { -// //service.MyService.Redis().Set(id, "{\"id\":\""+id+"\",\"state\":true,\"message\":\"setting upnp\",\"speed\":90}", 100) -// installLog.Speed = 90 -// installLog.Message = "setting upnp" -// service.MyService.Notify().UpdateLog(installLog) -// } -// -// //step: 启动成功 检查容器状态确认启动成功 -// containerStatus, err := service.MyService.Docker().DockerContainerInfo(id) -// if err != nil && containerStatus.ContainerJSONBase.State.Running { -// //service.MyService.Redis().Set(id, "{\"id\"\""+id+"\",\"state\":false,\"message\":\""+err.Error()+"\",\"speed\":100}", 100) -// installLog.State = 0 -// installLog.Speed = 100 -// installLog.Message = err.Error() -// service.MyService.Notify().UpdateLog(installLog) -// return -// } else { -// //service.MyService.Redis().Set(id, "{\"id\":\""+id+"\",\"state\":true,\"message\":\"installed\",\"speed\":100}", 100) -// installLog.Speed = 100 -// installLog.Message = "installed" -// service.MyService.Notify().UpdateLog(installLog) -// } -// -// rely := model.MapStrings{} -// -// copier.Copy(&rely, &relyMap) -// -// //step: 保存数据到数据库 -// md := model2.AppListDBModel{ -// CustomId: id, -// Title: m.Label, -// // ScreenshotLink: []string, -// Slogan: "", -// Description: m.Description, -// // Tags: , -// Icon: m.Icon, -// Version: m.Image, -// ContainerId: containerId, -// Image: m.Image, -// Index: "", -// Port: m.Port, -// PortMap: m.PortMap, -// Label: m.Label, -// EnableUPNP: m.EnableUPNP, -// UdpPorts: m.Udp, -// TcpPorts: m.Tcp, -// Envs: m.Envs, -// Volumes: m.Volumes, -// Position: m.Position, -// NetModel: m.NetworkModel, -// Restart: m.Restart, -// CpuShares: m.CpuShares, -// Memory: m.Memory, -// Devices: m.Devices, -// Rely: rely, -// Origin: "custom", -// } -// if m.NetworkModel == "host" { -// m.PortMap = m.Port -// } -// service.MyService.App().SaveContainer(md) -// -// }() -// -// c.JSON(http.StatusOK, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: id}) -// -//} - -// @Summary 卸载app -// @Produce application/json -// @Accept multipart/form-data -// @Tags app -// @Param id path string true "容器id" -// @Security ApiKeyAuth -// @Success 200 {string} string "ok" -// @Router /app/uninstall/{id} [delete] -func UnInstallApp(c *gin.Context) { - appId := c.Param("id") - - if len(appId) == 0 { - c.JSON(common_err.CLIENT_ERROR, model.Result{Success: common_err.INVALID_PARAMS, Message: common_err.GetMsg(common_err.INVALID_PARAMS)}) - return - } - - j := make(map[string]string) - c.ShouldBind(&j) - isDelete := j["delete_config_folder"] - - //info := service.MyService.App().GetUninstallInfo(appId) - - info, err := service.MyService.Docker().DockerContainerInfo(appId) - if err != nil { - c.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.SERVICE_ERROR, Message: common_err.GetMsg(common_err.SERVICE_ERROR), Data: err.Error()}) - return - } - - //step:停止容器 - err = service.MyService.Docker().DockerContainerStop(appId) - if err != nil { - c.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.UNINSTALL_APP_ERROR, Message: common_err.GetMsg(common_err.UNINSTALL_APP_ERROR), Data: err.Error()}) - return - } - - err = service.MyService.Docker().DockerContainerRemove(appId, false) - if err != nil { - c.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.UNINSTALL_APP_ERROR, Message: common_err.GetMsg(common_err.UNINSTALL_APP_ERROR), Data: err.Error()}) - return - } - - // step:remove image - service.MyService.Docker().DockerImageRemove(info.Config.Image) - - if info.Config.Labels["origin"] != "custom" && len(isDelete) > 0 { - //step: 删除文件夹 - for _, v := range info.Mounts { - if strings.Contains(v.Source, info.Name) { - path := filepath.Join(strings.Split(v.Source, info.Name)[0], info.Name) - service.MyService.App().DelAppConfigDir(path) - } - } - - //step: 删除install log - //service.MyService.Notify().DelLog(appId) - - // for k, v := range info.Rely { - // - // if k == "mysql" { - // docker_base.MysqlDelete(v) - // service.MyService.Rely().Delete(v) - // } - // } - - //if info.EnableUPNP { - // upnp, err := upnp2.Gateway() - // if err == nil { - // for _, p := range info.Ports { - // if p.Protocol == "udp" { - // upnp.CtrlUrl = upnp2.GetCtrlUrl(upnp.GatewayHost, upnp.DeviceDescUrl) - // upnp.LocalHost = ip_helper2.GetLoclIp() - // tComment, _ := strconv.Atoi(p.CommendPort) - // upnp.DelPortMapping(tComment, "UDP") - // time.Sleep(time.Millisecond * 200) - // } else if p.Protocol == "tcp" { - // upnp.CtrlUrl = upnp2.GetCtrlUrl(upnp.GatewayHost, upnp.DeviceDescUrl) - // upnp.LocalHost = ip_helper2.GetLoclIp() - // tComment, _ := strconv.Atoi(p.CommendPort) - // upnp.DelPortMapping(tComment, "TCP") - // time.Sleep(time.Millisecond * 200) - // } else if p.Protocol == "both" { - // upnp.CtrlUrl = upnp2.GetCtrlUrl(upnp.GatewayHost, upnp.DeviceDescUrl) - // upnp.LocalHost = ip_helper2.GetLoclIp() - // tComment, _ := strconv.Atoi(p.CommendPort) - // upnp.DelPortMapping(tComment, "UDP") - // - // upnp.DelPortMapping(tComment, "TCP") - // time.Sleep(time.Millisecond * 200) - // } - // } - // } - //} - } - config.CasaOSGlobalVariables.AppChange = true - notify := notify.Application{} - notify.Icon = info.Config.Labels["icon"] - notify.Name = strings.ReplaceAll(info.Name, "/", "") - notify.State = "FINISHED" - notify.Type = "UNINSTALL" - notify.Success = true - notify.Finished = true - service.MyService.Notify().SendUninstallAppBySocket(notify) - c.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS)}) - -} - -// @Summary 修改app状态 -// @Produce application/json -// @Accept multipart/form-data -// @Tags app -// @Param id path string true "appid" -// @Param state query string false "是否停止 start stop restart" -// @Security ApiKeyAuth -// @Success 200 {string} string "ok" -// @Router /app/state/{id} [put] -func ChangAppState(c *gin.Context) { - appId := c.Param("id") - js := make(map[string]string) - c.ShouldBind(&js) - state := js["state"] - if len(appId) == 0 || len(state) == 0 { - c.JSON(common_err.CLIENT_ERROR, model.Result{Success: common_err.INVALID_PARAMS, Message: common_err.GetMsg(common_err.INVALID_PARAMS)}) - return - } - var err error - if state == "start" { - err = service.MyService.Docker().DockerContainerStart(appId) - } else if state == "restart" { - service.MyService.Docker().DockerContainerStop(appId) - err = service.MyService.Docker().DockerContainerStart(appId) - } else { - err = service.MyService.Docker().DockerContainerStop(appId) - } - - if err != nil { - c.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.SERVICE_ERROR, Message: common_err.GetMsg(common_err.SERVICE_ERROR), Data: err.Error()}) - return - } - info, err := service.MyService.App().GetContainerInfo(appId) - if err != nil { - c.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.SERVICE_ERROR, Message: common_err.GetMsg(common_err.SERVICE_ERROR), Data: err.Error()}) - return - } - - // @tiger - 用 {'state': ...} 来体现出参上下文 - c.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: info.State}) -} - -// @Summary 查看容器日志 -// @Produce application/json -// @Accept application/json -// @Tags app -// @Param id path string true "appid" -// @Security ApiKeyAuth -// @Success 200 {string} string "ok" -// @Router /app/logs/{id} [get] -func ContainerLog(c *gin.Context) { - appId := c.Param("id") - log, _ := service.MyService.Docker().DockerContainerLog(appId) - c.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: string(log)}) -} - -// @Summary 获取容器状态 -// @Produce application/json -// @Accept application/json -// @Tags app -// @Param id path string true "容器id" -// @Param type query string false "type=1" -// @Security ApiKeyAuth -// @Success 200 {string} string "ok" -// @Router /app/state/{id} [get] -func GetContainerState(c *gin.Context) { - id := c.Param("id") - //t := c.DefaultQuery("type", "0") - containerInfo, e := service.MyService.App().GetSimpleContainerInfo(id) - if e != nil { - c.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.SERVICE_ERROR, Message: e.Error()}) - return - } - - var data = make(map[string]interface{}) - - data["state"] = containerInfo.State - - // if t == "1" { - // appInfo := service.MyService.App().GetAppDBInfo(id) - // data["app"] = appInfo - // } - - c.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: data}) -} - -// @Summary 更新设置 -// @Produce application/json -// @Accept multipart/form-data -// @Tags app -// @Param id path string true "容器id" -// @Param shares formData string false "cpu权重" -// @Param mem formData string false "内存大小MB" -// @Param restart formData string false "重启策略" -// @Param label formData string false "应用名称" -// @Param position formData bool true "是否放到首页" -// @Security ApiKeyAuth -// @Success 200 {string} string "ok" -// @Router /app/update/{id}/setting [put] -func UpdateSetting(c *gin.Context) { - id := c.Param("id") - const CUSTOM = "custom" - m := model.CustomizationPostData{} - c.ShouldBind(&m) - - if len(id) == 0 { - c.JSON(common_err.CLIENT_ERROR, model.Result{Success: common_err.INVALID_PARAMS, Message: common_err.GetMsg(common_err.INVALID_PARAMS)}) - return - } - //var cpd model.CustomizationPostData - - //copier.Copy(&cpd, &m) - - //appInfo := service.MyService.App().GetAppDBInfo(id) - //info, err := service.MyService.Docker().DockerContainerInfo(id) - - // //check app name is exist - // if _, err := service.MyService.Docker().DockerListByName(m.Label); err == nil { - // c.JSON(http.StatusOK, model.Result{Success: common_err.ERROR_APP_NAME_EXIST, Message: common_err.GetMsg(common_err.ERROR_APP_NAME_EXIST)}) - // return - // } - service.MyService.Docker().DockerContainerStop(id) - portMap, _ := strconv.Atoi(m.PortMap) - if !port2.IsPortAvailable(portMap, "tcp") { - service.MyService.Docker().DockerContainerStart(id) - c.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.SERVICE_ERROR, Message: "Duplicate port:" + m.PortMap}) - return - } - - for _, u := range m.Ports { - - if u.Protocol == "udp" { - t, _ := strconv.Atoi(u.CommendPort) - if !port2.IsPortAvailable(t, "udp") { - service.MyService.Docker().DockerContainerStart(id) - c.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.SERVICE_ERROR, Message: "Duplicate port:" + u.CommendPort}) - return - } - } else if u.Protocol == "tcp" { - te, _ := strconv.Atoi(u.CommendPort) - if !port2.IsPortAvailable(te, "tcp") { - service.MyService.Docker().DockerContainerStart(id) - c.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.SERVICE_ERROR, Message: "Duplicate port:" + u.CommendPort}) - return - } - } else if u.Protocol == "both" { - t, _ := strconv.Atoi(u.CommendPort) - if !port2.IsPortAvailable(t, "udp") { - service.MyService.Docker().DockerContainerStart(id) - c.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.SERVICE_ERROR, Message: "Duplicate port:" + u.CommendPort}) - return - } - - te, _ := strconv.Atoi(u.CommendPort) - if !port2.IsPortAvailable(te, "tcp") { - service.MyService.Docker().DockerContainerStart(id) - c.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.SERVICE_ERROR, Message: "Duplicate port:" + u.CommendPort}) - return - } - } - - } - service.MyService.Docker().DockerContainerUpdateName(id, id) - //service.MyService.Docker().DockerContainerRemove(id, true) - - containerId, err := service.MyService.Docker().DockerContainerCreate(m, id) - if err != nil { - service.MyService.Docker().DockerContainerUpdateName(m.ContainerName, id) - service.MyService.Docker().DockerContainerStart(id) - c.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.SERVICE_ERROR, Message: common_err.GetMsg(common_err.SERVICE_ERROR), Data: err.Error()}) - return - } - // echo -e "hellow\nworld" >> - - //step:启动容器 - err = service.MyService.Docker().DockerContainerStart(containerId) - - if err != nil { - c.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.SERVICE_ERROR, Message: common_err.GetMsg(common_err.SERVICE_ERROR)}) - return - } - service.MyService.Docker().DockerContainerRemove(id, true) - //更新upnp - if m.Origin != CUSTOM { - //if appInfo.EnableUPNP != appInfo.EnableUPNP { - // if appInfo.EnableUPNP { - // upnp, err := upnp2.Gateway() - // if err == nil { - // - // for _, p := range appInfo.Ports { - // if p.Protocol == "udp" { - // upnp.CtrlUrl = upnp2.GetCtrlUrl(upnp.GatewayHost, upnp.DeviceDescUrl) - // upnp.LocalHost = ip_helper2.GetLoclIp() - // tComment, _ := strconv.Atoi(p.CommendPort) - // upnp.AddPortMapping(tComment, tComment, "UDP") - // time.Sleep(time.Millisecond * 200) - // } else if p.Protocol == "tcp" { - // upnp.CtrlUrl = upnp2.GetCtrlUrl(upnp.GatewayHost, upnp.DeviceDescUrl) - // upnp.LocalHost = ip_helper2.GetLoclIp() - // tComment, _ := strconv.Atoi(p.CommendPort) - // upnp.AddPortMapping(tComment, tComment, "TCP") - // time.Sleep(time.Millisecond * 200) - // } else if p.Protocol == "both" { - // upnp.CtrlUrl = upnp2.GetCtrlUrl(upnp.GatewayHost, upnp.DeviceDescUrl) - // upnp.LocalHost = ip_helper2.GetLoclIp() - // tComment, _ := strconv.Atoi(p.CommendPort) - // upnp.AddPortMapping(tComment, tComment, "UDP") - // time.Sleep(time.Millisecond * 200) - // - // upnp.AddPortMapping(tComment, tComment, "TCP") - // time.Sleep(time.Millisecond * 200) - // } - // } - // } - // } else { - // upnp, err := upnp2.Gateway() - // if err == nil { - // for _, p := range appInfo.Ports { - // if p.Protocol == "udp" { - // - // upnp.CtrlUrl = upnp2.GetCtrlUrl(upnp.GatewayHost, upnp.DeviceDescUrl) - // upnp.LocalHost = ip_helper2.GetLoclIp() - // tComment, _ := strconv.Atoi(p.CommendPort) - // upnp.DelPortMapping(tComment, "UDP") - // time.Sleep(time.Millisecond * 200) - // } else if p.Protocol == "tcp" { - // upnp.CtrlUrl = upnp2.GetCtrlUrl(upnp.GatewayHost, upnp.DeviceDescUrl) - // upnp.LocalHost = ip_helper2.GetLoclIp() - // tComment, _ := strconv.Atoi(p.CommendPort) - // upnp.DelPortMapping(tComment, "TCP") - // time.Sleep(time.Millisecond * 200) - // } else if p.Protocol == "both" { - // upnp.CtrlUrl = upnp2.GetCtrlUrl(upnp.GatewayHost, upnp.DeviceDescUrl) - // upnp.LocalHost = ip_helper2.GetLoclIp() - // tComment, _ := strconv.Atoi(p.CommendPort) - // upnp.DelPortMapping(tComment, "UDP") - // time.Sleep(time.Millisecond * 200) - // - // upnp.DelPortMapping(tComment, "TCP") - // time.Sleep(time.Millisecond * 200) - // } - // } - // } - // } - //} - } - - //service.MyService.App().UpdateApp(appInfo) - - c.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS)}) -} - -// @Summary update app version -// @Produce application/json -// @Accept multipart/form-data -// @Tags app -// @Param id path string true "容器id" -// @Security ApiKeyAuth -// @Success 200 {string} string "ok" -// @Router /app/update/{id} [put] -func PutAppUpdate(c *gin.Context) { - id := c.Param("id") - - if len(id) == 0 { - c.JSON(common_err.CLIENT_ERROR, model.Result{Success: common_err.INVALID_PARAMS, Message: common_err.GetMsg(common_err.INVALID_PARAMS)}) - return - } - - inspect, err := service.MyService.Docker().DockerContainerInfo(id) - if err != nil { - c.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.SERVICE_ERROR, Message: common_err.GetMsg(common_err.SERVICE_ERROR), Data: err.Error()}) - return - - } - imageLatest := strings.Split(inspect.Config.Image, ":")[0] + ":latest" - err = service.MyService.Docker().DockerPullImage(imageLatest, "", "") - if err != nil { - c.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.SERVICE_ERROR, Message: common_err.GetMsg(common_err.SERVICE_ERROR), Data: err.Error()}) - return - - } - service.MyService.Docker().DockerContainerStop(id) - service.MyService.Docker().DockerContainerUpdateName(id, id) - //service.MyService.Docker().DockerContainerRemove(id, true) - inspect.Image = imageLatest - inspect.Config.Image = imageLatest - containerId, err := service.MyService.Docker().DockerContainerCopyCreate(inspect) - if err != nil { - service.MyService.Docker().DockerContainerUpdateName(inspect.Name, id) - service.MyService.Docker().DockerContainerStart(id) - c.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.SERVICE_ERROR, Message: common_err.GetMsg(common_err.SERVICE_ERROR)}) - return - } - - //step:启动容器 - err = service.MyService.Docker().DockerContainerStart(containerId) - - if err != nil { - c.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.SERVICE_ERROR, Message: common_err.GetMsg(common_err.SERVICE_ERROR)}) - return - } - service.MyService.Docker().DockerContainerRemove(id, true) - delete(service.NewVersionApp, id) - - c.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS)}) -} - -// @Summary 获取容器详情 -// @Produce application/json -// @Accept application/json -// @Tags app -// @Param id path string true "appid" -// @Security ApiKeyAuth -// @Success 200 {string} string "ok" -// @Router /app/info/{id} [get] -func ContainerInfo(c *gin.Context) { - appId := c.Param("id") - - // @tiger - 作为最佳实践,不应该直接把数据库的信息返回,来避免未来数据库结构上的迭代带来的新字段 - appInfo := service.MyService.App().GetAppDBInfo(appId) - containerInfo, _ := service.MyService.Docker().DockerContainerStats(appId) - var cpuModel = "arm" - if cpu := service.MyService.System().GetCpuInfo(); len(cpu) > 0 { - if strings.Count(strings.ToLower(strings.TrimSpace(cpu[0].ModelName)), "intel") > 0 { - cpuModel = "intel" - } else if strings.Count(strings.ToLower(strings.TrimSpace(cpu[0].ModelName)), "amd") > 0 { - cpuModel = "amd" - } - } - - info, err := service.MyService.Docker().DockerContainerInfo(appId) - if err != nil { - //todo 需要自定义错误 - c.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.SERVICE_ERROR, Message: common_err.GetMsg(common_err.SERVICE_ERROR), Data: err.Error()}) - return - } - con := struct { - Status string `json:"status"` - StartedAt string `json:"started_at"` - CPUShares int64 `json:"cpu_shares"` - Memory int64 `json:"total_memory"` // @tiger - 改成 total_memory,方便以后增加 free_memory 之类的字段 - Restart string `json:"restart_policy"` // @tiger - 改成 restart_policy? - }{Status: info.State.Status, StartedAt: info.State.StartedAt, CPUShares: info.HostConfig.CPUShares, Memory: info.HostConfig.Memory >> 20, Restart: info.HostConfig.RestartPolicy.Name} - data := make(map[string]interface{}, 5) - data["app"] = appInfo // @tiget - 最佳实践是,返回 appid,然后具体的 app 信息由前端另行获取 - data["cpu"] = cpuModel // @tiger - 改成 arch - data["memory"] = service.MyService.System().GetMemInfo()["total"] // @tiger - 改成 total_memory,方便以后增加 free_memory 之类的字段 - data["container"] = json2.RawMessage(containerInfo) - data["info"] = con - c.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: data}) -} - -func GetDockerNetworks(c *gin.Context) { - networks := service.MyService.Docker().DockerNetworkModelList() - list := []map[string]string{} - for _, network := range networks { - if network.Driver != "null" { - list = append(list, map[string]string{"name": network.Name, "driver": network.Driver, "id": network.ID}) - } - } - c.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: list}) -} - -// @Summary 获取依赖数据 -// @Produce application/json -// @Accept application/json -// @Tags app -// @Param id path string true "rely id" -// @Security ApiKeyAuth -// @Success 200 {string} string "ok" -// @Router /app/rely/{id}/info [get] -func ContainerRelyInfo(c *gin.Context) { - id := c.Param("id") - appInfo := service.MyService.Rely().GetInfo(id) - c.JSON(http.StatusOK, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: appInfo}) -} - -// @Produce application/json -// @Accept application/json -// @Tags app -// @Param id path string true "appid" -// @Security ApiKeyAuth -// @Success 200 {string} string "ok" -// @Router /app/update/{id}/info [get] -func ContainerUpdateInfo(c *gin.Context) { - appId := c.Param("id") - //appInfo := service.MyService.App().GetAppDBInfo(appId) - info, err := service.MyService.Docker().DockerContainerInfo(appId) - if err != nil { - - c.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: err.Error()}) - return - } - var port model.PortArray - // json2.Unmarshal([]byte(appInfo.Ports), &port) - - for k, v := range info.HostConfig.PortBindings { - temp := model.PortMap{ - CommendPort: v[0].HostPort, - ContainerPort: k.Port(), - - Protocol: k.Proto(), - } - port = append(port, temp) - } - - var envs model.EnvArray - // json2.Unmarshal([]byte(appInfo.Envs), &envs) - - showENV := info.Config.Labels["show_env"] - showENVList := strings.Split(showENV, ",") - showENVMap := make(map[string]string) - if len(showENVList) > 0 && showENVList[0] != "" { - for _, name := range showENVList { - showENVMap[name] = "1" - } - } - for _, v := range info.Config.Env { - if len(showENVList) > 0 && info.Config.Labels["origin"] != "local" { - if _, ok := showENVMap[strings.Split(v, "=")[0]]; ok { - temp := model.Env{ - Name: strings.Split(v, "=")[0], - Value: strings.Split(v, "=")[1], - } - envs = append(envs, temp) - } - } else { - temp := model.Env{ - Name: strings.Split(v, "=")[0], - Value: strings.Split(v, "=")[1], - } - envs = append(envs, temp) - } - - } - - var vol model.PathArray - // json2.Unmarshal([]byte(appInfo.Volumes), &vol) - - for i := 0; i < len(info.Mounts); i++ { - temp := model.PathMap{ - Path: strings.ReplaceAll(info.Mounts[i].Source, "$AppID", info.Name), - ContainerPath: info.Mounts[i].Destination, - } - vol = append(vol, temp) - } - var driver model.PathArray - - //volumesStr, _ := json2.Marshal(m.Volumes) - //devicesStr, _ := json2.Marshal(m.Devices) - for _, v := range info.HostConfig.Resources.Devices { - temp := model.PathMap{ - Path: v.PathOnHost, - ContainerPath: v.PathInContainer, - } - driver = append(driver, temp) - } - - m := model.CustomizationPostData{} - m.Icon = info.Config.Labels["icon"] - m.Ports = port - m.Image = info.Config.Image - m.Origin = info.Config.Labels["origin"] - if len(m.Origin) == 0 { - m.Origin = "local" - } - m.NetworkModel = string(info.HostConfig.NetworkMode) - m.Description = info.Config.Labels["desc"] - m.ContainerName = strings.ReplaceAll(info.Name, "/", "") - m.PortMap = info.Config.Labels["web"] - m.Devices = driver - m.Envs = envs - m.Memory = info.HostConfig.Memory >> 20 - m.CpuShares = info.HostConfig.CPUShares - m.Volumes = vol //appInfo.Volumes - m.Restart = info.HostConfig.RestartPolicy.Name - m.EnableUPNP = false - m.Index = info.Config.Labels["index"] - m.Position = false - m.CustomId = info.Config.Labels["custom_id"] - m.Host = info.Config.Labels["host"] - if len(m.CustomId) == 0 { - m.CustomId = uuid.NewV4().String() - } - m.CapAdd = info.HostConfig.CapAdd - m.Cmd = info.Config.Cmd - m.HostName = info.Config.Hostname - m.Privileged = info.HostConfig.Privileged - name := info.Config.Labels["name"] - if len(name) == 0 { - name = strings.ReplaceAll(info.Name, "/", "") - } - m.Label = name - - m.Protocol = info.Config.Labels["protocol"] - if m.Protocol == "" { - m.Protocol = "http" - } - - c.JSON(http.StatusOK, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: m}) -} - -////准备安装(暂时不需要) -//func ReadyInstall(c *gin.Context) { -// _, tcp, udp := service.MyService.GetManifestJsonByRepo() -// data := make(map[string]interface{}, 2) -// if t := gjson.Parse(tcp).Array(); len(t) > 0 { -// //tcpList := []model.TcpPorts{} -// //e := json2.Unmarshal([]byte(tcp), tcpList) -// //if e!=nil { -// // return -// //} -// //for _, port := range tcpList { -// // if port.ContainerPort>0&&port.ExtranetPort { -// // -// // } -// //} -// var inarr []interface{} -// for _, result := range t { -// -// var p int -// ok := true -// for ok { -// p, _ = port.GetAvailablePort() -// ok = !port.IsPortAvailable(p) -// } -// pm := model.PortMap{gjson.Get(result.Raw, "container_port").Int(), p} -// inarr = append(inarr, pm) -// } -// data["tcp"] = inarr -// } -// if u := gjson.Parse(udp).Array(); len(u) > 0 { -// //udpList := []model.UdpPorts{} -// //e := json2.Unmarshal([]byte(udp), udpList) -// //if e != nil { -// // return -// //} -// var inarr []model.PortMap -// for _, result := range u { -// var p int -// ok := true -// for ok { -// p, _ = port.GetAvailablePort() -// ok = !port.IsPortAvailable(p) -// } -// pm := model.PortMap{gjson.Get(result.Raw, "container_port").Int(), p} -// inarr = append(inarr, pm) -// } -// data["udp"] = inarr -// } -// c.JSON(http.StatusOK, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: data}) -//} diff --git a/route/v1/file.go b/route/v1/file.go index 2b1fd11..143045b 100644 --- a/route/v1/file.go +++ b/route/v1/file.go @@ -15,10 +15,10 @@ import ( "strings" "sync" + "github.com/IceWhaleTech/CasaOS-Common/utils/logger" "github.com/IceWhaleTech/CasaOS/model" "github.com/IceWhaleTech/CasaOS/pkg/utils/common_err" "github.com/IceWhaleTech/CasaOS/pkg/utils/file" - "github.com/IceWhaleTech/CasaOS/pkg/utils/loger" "github.com/IceWhaleTech/CasaOS/service" "github.com/gin-gonic/gin" uuid "github.com/satori/go.uuid" @@ -222,19 +222,6 @@ func DirPath(c *gin.Context) { for _, v := range shares { sharesMap[v.Path] = fmt.Sprint(v.ID) } - if path == "/DATA/AppData" { - list := service.MyService.Docker().DockerContainerList() - apps := make(map[string]string, len(list)) - for _, v := range list { - apps[strings.ReplaceAll(v.Names[0], "/", "")] = strings.ReplaceAll(v.Names[0], "/", "") - } - for i := 0; i < len(info); i++ { - if v, ok := apps[info[i].Name]; ok { - info[i].Label = v - info[i].Type = "application" - } - } - } for i := 0; i < len(info); i++ { if v, ok := sharesMap[info[i].Path]; ok { @@ -403,7 +390,7 @@ func PostFileUpload(c *gin.Context) { hash := file.GetHashByContent([]byte(fileName)) if len(path) == 0 { - loger.Error("path should not be empty") + logger.Error("path should not be empty") c.JSON(http.StatusBadRequest, model.Result{Success: common_err.INVALID_PARAMS, Message: common_err.GetMsg(common_err.INVALID_PARAMS)}) return } @@ -413,7 +400,7 @@ func PostFileUpload(c *gin.Context) { dirPath = strings.TrimSuffix(relative, fileName) tempDir += dirPath if err := file.MkDir(path + "/" + dirPath); err != nil { - loger.Error("error when trying to create `"+path+"/"+dirPath+"`", zap.Error(err)) + logger.Error("error when trying to create `"+path+"/"+dirPath+"`", zap.Error(err)) c.JSON(http.StatusInternalServerError, model.Result{Success: common_err.SERVICE_ERROR, Message: err.Error()}) return } @@ -423,7 +410,7 @@ func PostFileUpload(c *gin.Context) { if !file.CheckNotExist(tempDir + chunkNumber) { if err := file.RMDir(tempDir + chunkNumber); err != nil { - loger.Error("error when trying to remove existing `"+tempDir+chunkNumber+"`", zap.Error(err)) + logger.Error("error when trying to remove existing `"+tempDir+chunkNumber+"`", zap.Error(err)) c.JSON(http.StatusInternalServerError, model.Result{Success: common_err.SERVICE_ERROR, Message: err.Error()}) return } @@ -431,14 +418,14 @@ func PostFileUpload(c *gin.Context) { if totalChunks > 1 { if err := file.IsNotExistMkDir(tempDir); err != nil { - loger.Error("error when trying to create `"+tempDir+"`", zap.Error(err)) + logger.Error("error when trying to create `"+tempDir+"`", zap.Error(err)) c.JSON(http.StatusInternalServerError, model.Result{Success: common_err.SERVICE_ERROR, Message: err.Error()}) return } out, err := os.OpenFile(tempDir+chunkNumber, os.O_WRONLY|os.O_CREATE, 0o644) if err != nil { - loger.Error("error when trying to open `"+tempDir+chunkNumber+"` for creation", zap.Error(err)) + logger.Error("error when trying to open `"+tempDir+chunkNumber+"` for creation", zap.Error(err)) c.JSON(http.StatusInternalServerError, model.Result{Success: common_err.SERVICE_ERROR, Message: err.Error()}) return } @@ -446,27 +433,27 @@ func PostFileUpload(c *gin.Context) { defer out.Close() if _, err := io.Copy(out, f); err != nil { // recommend to use https://github.com/iceber/iouring-go for faster copy - loger.Error("error when trying to write to `"+tempDir+chunkNumber+"`", zap.Error(err)) + logger.Error("error when trying to write to `"+tempDir+chunkNumber+"`", zap.Error(err)) c.JSON(http.StatusInternalServerError, model.Result{Success: common_err.SERVICE_ERROR, Message: err.Error()}) return } fileNum, err := ioutil.ReadDir(tempDir) if err != nil { - loger.Error("error when trying to read number of files under `"+tempDir+"`", zap.Error(err)) + logger.Error("error when trying to read number of files under `"+tempDir+"`", zap.Error(err)) c.JSON(http.StatusInternalServerError, model.Result{Success: common_err.SERVICE_ERROR, Message: err.Error()}) return } if totalChunks == len(fileNum) { if err := file.SpliceFiles(tempDir, path, totalChunks, 1); err != nil { - loger.Error("error when trying to splice files under `"+tempDir+"`", zap.Error(err)) + logger.Error("error when trying to splice files under `"+tempDir+"`", zap.Error(err)) c.JSON(http.StatusInternalServerError, model.Result{Success: common_err.SERVICE_ERROR, Message: err.Error()}) return } if err := file.RMDir(tempDir); err != nil { - loger.Error("error when trying to remove `"+tempDir+"`", zap.Error(err)) + logger.Error("error when trying to remove `"+tempDir+"`", zap.Error(err)) c.JSON(http.StatusInternalServerError, model.Result{Success: common_err.SERVICE_ERROR, Message: err.Error()}) return } @@ -474,7 +461,7 @@ func PostFileUpload(c *gin.Context) { } else { out, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE, 0o644) if err != nil { - loger.Error("error when trying to open `"+path+"` for creation", zap.Error(err)) + logger.Error("error when trying to open `"+path+"` for creation", zap.Error(err)) c.JSON(http.StatusInternalServerError, model.Result{Success: common_err.SERVICE_ERROR, Message: err.Error()}) return } @@ -482,7 +469,7 @@ func PostFileUpload(c *gin.Context) { defer out.Close() if _, err := io.Copy(out, f); err != nil { // recommend to use https://github.com/iceber/iouring-go for faster copy - loger.Error("error when trying to write to `"+path+"`", zap.Error(err)) + logger.Error("error when trying to write to `"+path+"`", zap.Error(err)) c.JSON(http.StatusInternalServerError, model.Result{Success: common_err.SERVICE_ERROR, Message: common_err.GetMsg(common_err.SERVICE_ERROR), Data: err.Error()}) return } diff --git a/route/v1/notify.go b/route/v1/notify.go new file mode 100644 index 0000000..100a49e --- /dev/null +++ b/route/v1/notify.go @@ -0,0 +1,56 @@ +package v1 + +import ( + "net/http" + + "github.com/IceWhaleTech/CasaOS-Common/model/notify" + "github.com/IceWhaleTech/CasaOS/model" + "github.com/IceWhaleTech/CasaOS/pkg/utils/common_err" + "github.com/IceWhaleTech/CasaOS/service" + "github.com/gin-gonic/gin" +) + +func PostNotifyMessage(c *gin.Context) { + path := c.Param("path") + message := make(map[string]interface{}) + if err := c.ShouldBind(&message); err != nil { + c.JSON(http.StatusBadRequest, model.Result{Success: common_err.INVALID_PARAMS, Message: err.Error()}) + return + } + + service.MyService.Notify().SendNotify(path, message) + c.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS)}) +} + +func PostSystemStatusNotify(c *gin.Context) { + message := make(map[string]interface{}) + if err := c.ShouldBind(&message); err != nil { + c.JSON(http.StatusBadRequest, model.Result{Success: common_err.INVALID_PARAMS, Message: err.Error()}) + return + } + + service.MyService.Notify().SettingSystemTempData(message) + c.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS)}) +} + +func PostInstallAppNotify(c *gin.Context) { + app := notify.Application{} + if err := c.ShouldBind(&app); err != nil { + c.JSON(http.StatusBadRequest, model.Result{Success: common_err.INVALID_PARAMS, Message: err.Error()}) + return + } + + service.MyService.Notify().SendInstallAppBySocket(app) + c.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS)}) +} + +func PostUninstallAppNotify(c *gin.Context) { + app := notify.Application{} + if err := c.ShouldBind(&app); err != nil { + c.JSON(http.StatusBadRequest, model.Result{Success: common_err.INVALID_PARAMS, Message: err.Error()}) + return + } + + service.MyService.Notify().SendUninstallAppBySocket(app) + c.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS)}) +} diff --git a/route/v1/notiry.go b/route/v1/notiry.go deleted file mode 100644 index eef2a1b..0000000 --- a/route/v1/notiry.go +++ /dev/null @@ -1,23 +0,0 @@ -package v1 - -import ( - "github.com/IceWhaleTech/CasaOS/model" - "github.com/IceWhaleTech/CasaOS/pkg/utils/common_err" - "github.com/IceWhaleTech/CasaOS/service" - "github.com/gin-gonic/gin" -) - -func PostNotifyMessage(c *gin.Context) { - path := c.Param("path") - message := make(map[string]interface{}) - c.ShouldBind(&message) - service.MyService.Notify().SendNotify(path, message) - c.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS)}) -} - -func PostSystemStatusNotify(c *gin.Context) { - message := make(map[string]interface{}) - c.ShouldBind(&message) - service.MyService.Notify().SettingSystemTempData(message) - c.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS)}) -} diff --git a/route/v1/ssh.go b/route/v1/ssh.go new file mode 100644 index 0000000..f1e7299 --- /dev/null +++ b/route/v1/ssh.go @@ -0,0 +1,96 @@ +package v1 + +import ( + "bytes" + "net/http" + "os/exec" + "strconv" + "time" + + "github.com/IceWhaleTech/CasaOS-Common/utils/common_err" + "github.com/IceWhaleTech/CasaOS-Common/utils/logger" + sshHelper "github.com/IceWhaleTech/CasaOS-Common/utils/ssh" + + "github.com/gin-gonic/gin" + "github.com/gorilla/websocket" + "go.uber.org/zap" + "golang.org/x/crypto/ssh" + + modelCommon "github.com/IceWhaleTech/CasaOS-Common/model" +) + +var upgrader = websocket.Upgrader{ + ReadBufferSize: 1024, + WriteBufferSize: 1024, + CheckOrigin: func(r *http.Request) bool { return true }, + HandshakeTimeout: time.Duration(time.Second * 5), +} + +func PostSshLogin(c *gin.Context) { + j := make(map[string]string) + c.ShouldBind(&j) + userName := j["username"] + password := j["password"] + port := j["port"] + if userName == "" || password == "" || port == "" { + c.JSON(common_err.CLIENT_ERROR, modelCommon.Result{Success: common_err.INVALID_PARAMS, Message: common_err.GetMsg(common_err.INVALID_PARAMS), Data: "Username or password or port is empty"}) + return + } + _, err := sshHelper.NewSshClient(userName, password, port) + if err != nil { + c.JSON(common_err.CLIENT_ERROR, modelCommon.Result{Success: common_err.CLIENT_ERROR, Message: common_err.GetMsg(common_err.CLIENT_ERROR), Data: "Please check if the username and port are correct, and make sure that ssh server is installed."}) + logger.Error("connect ssh error", zap.Any("error", err)) + return + } + c.JSON(common_err.SUCCESS, modelCommon.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS)}) +} + +func WsSsh(c *gin.Context) { + _, e := exec.LookPath("ssh") + if e != nil { + c.JSON(common_err.SERVICE_ERROR, modelCommon.Result{Success: common_err.SERVICE_ERROR, Message: common_err.GetMsg(common_err.SERVICE_ERROR), Data: "ssh server not found"}) + return + } + + userName := c.Query("username") + password := c.Query("password") + port := c.Query("port") + wsConn, _ := upgrader.Upgrade(c.Writer, c.Request, nil) + logBuff := new(bytes.Buffer) + + quitChan := make(chan bool, 3) + // user := "" + // password := "" + var login int = 1 + cols, _ := strconv.Atoi(c.DefaultQuery("cols", "200")) + rows, _ := strconv.Atoi(c.DefaultQuery("rows", "32")) + var client *ssh.Client + for login != 0 { + + var err error + if userName == "" || password == "" || port == "" { + wsConn.WriteMessage(websocket.TextMessage, []byte("username or password or port is empty")) + } + client, err = sshHelper.NewSshClient(userName, password, port) + + if err != nil && client == nil { + wsConn.WriteMessage(websocket.TextMessage, []byte(err.Error())) + wsConn.WriteMessage(websocket.TextMessage, []byte("\r\n\x1b[0m")) + } else { + login = 0 + } + + } + if client != nil { + defer client.Close() + } + + ssConn, _ := sshHelper.NewSshConn(cols, rows, client) + defer ssConn.Close() + + go ssConn.ReceiveWsMsg(wsConn, logBuff, quitChan) + go ssConn.SendComboOutput(wsConn, quitChan) + go ssConn.SessionWait(quitChan) + + <-quitChan +} diff --git a/route/v1/system.go b/route/v1/system.go index 207eb4f..5c04e10 100644 --- a/route/v1/system.go +++ b/route/v1/system.go @@ -13,10 +13,10 @@ import ( "unsafe" http2 "github.com/IceWhaleTech/CasaOS-Common/utils/http" + "github.com/IceWhaleTech/CasaOS-Common/utils/port" "github.com/IceWhaleTech/CasaOS/model" "github.com/IceWhaleTech/CasaOS/pkg/config" "github.com/IceWhaleTech/CasaOS/pkg/utils/common_err" - port2 "github.com/IceWhaleTech/CasaOS/pkg/utils/port" "github.com/IceWhaleTech/CasaOS/pkg/utils/version" "github.com/IceWhaleTech/CasaOS/service" model2 "github.com/IceWhaleTech/CasaOS/service/model" @@ -127,7 +127,7 @@ func PutCasaOSPort(c *gin.Context) { json := make(map[string]string) c.ShouldBind(&json) portStr := json["port"] - port, err := strconv.Atoi(portStr) + portNumber, err := strconv.Atoi(portStr) if err != nil { c.JSON(common_err.SERVICE_ERROR, model.Result{ @@ -137,7 +137,7 @@ func PutCasaOSPort(c *gin.Context) { return } - isAvailable := port2.IsPortAvailable(port, "tcp") + isAvailable := port.IsPortAvailable(portNumber, "tcp") if !isAvailable { c.JSON(common_err.SERVICE_ERROR, model.Result{ @@ -146,7 +146,7 @@ func PutCasaOSPort(c *gin.Context) { }) return } - service.MyService.System().UpSystemPort(strconv.Itoa(port)) + service.MyService.System().UpSystemPort(strconv.Itoa(portNumber)) c.JSON(common_err.SUCCESS, model.Result{ Success: common_err.SUCCESS, @@ -165,40 +165,6 @@ func PostKillCasaOS(c *gin.Context) { os.Exit(0) } -func GetSystemAppsStatus(c *gin.Context) { - systemAppList := service.MyService.App().GetSystemAppList() - appList := []model2.MyAppList{} - for _, v := range systemAppList { - name := strings.ReplaceAll(v.Names[0], "/", "") - if len(v.Labels["name"]) > 0 { - name = v.Labels["name"] - } - appList = append(appList, model2.MyAppList{ - Name: name, - Icon: v.Labels["icon"], - State: v.State, - CustomId: v.Labels["custom_id"], - Id: v.ID, - Port: v.Labels["web"], - Index: v.Labels["index"], - // Order: m.Labels["order"], - Image: v.Image, - Latest: false, - // Type: m.Labels["origin"], - // Slogan: m.Slogan, - // Rely: m.Rely, - Host: v.Labels["host"], - Protocol: v.Labels["protocol"], - }) - } - c.JSON(common_err.SUCCESS, - model.Result{ - Success: common_err.SUCCESS, - Message: common_err.GetMsg(common_err.SUCCESS), - Data: appList, - }) -} - // @Summary get system hardware info // @Produce application/json // @Accept application/json @@ -228,7 +194,7 @@ func GetSystemUtilization(c *gin.Context) { data := make(map[string]interface{}) cpu := service.MyService.System().GetCpuPercent() num := service.MyService.System().GetCpuCoreNum() - var cpuModel = "arm" + cpuModel := "arm" if cpu := service.MyService.System().GetCpuInfo(); len(cpu) > 0 { if strings.Count(strings.ToLower(strings.TrimSpace(cpu[0].ModelName)), "intel") > 0 { cpuModel = "intel" @@ -375,13 +341,46 @@ func PutSystemState(c *gin.Context) { time.Sleep(30 * time.Second) service.MyService.System().SystemShutdown() }() - } else if state == "restart" { go func() { time.Sleep(30 * time.Second) service.MyService.System().SystemReboot() }() - } c.JSON(http.StatusOK, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: "The operation will be executed after 30 seconds"}) } + +// @Summary 获取一个可用端口 +// @Produce application/json +// @Accept application/json +// @Tags app +// @Param type query string true "端口类型 udp/tcp" +// @Security ApiKeyAuth +// @Success 200 {string} string "ok" +// @Router /app/getport [get] +func GetPort(c *gin.Context) { + t := c.DefaultQuery("type", "tcp") + var p int + ok := true + for ok { + p, _ = port.GetAvailablePort(t) + ok = !port.IsPortAvailable(p, t) + } + // @tiger 这里最好封装成 {'port': ...} 的形式,来体现出参的上下文 + c.JSON(common_err.SUCCESS, &model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: p}) +} + +// @Summary 检查端口是否可用 +// @Produce application/json +// @Accept application/json +// @Tags app +// @Param port path int true "端口号" +// @Param type query string true "端口类型 udp/tcp" +// @Security ApiKeyAuth +// @Success 200 {string} string "ok" +// @Router /app/check/{port} [get] +func PortCheck(c *gin.Context) { + p, _ := strconv.Atoi(c.Param("port")) + t := c.DefaultQuery("type", "tcp") + c.JSON(common_err.SUCCESS, &model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: port.IsPortAvailable(p, t)}) +} diff --git a/service/app.go b/service/app.go deleted file mode 100644 index a2bb58b..0000000 --- a/service/app.go +++ /dev/null @@ -1,480 +0,0 @@ -package service - -import ( - "context" - "encoding/json" - "fmt" - "io" - "io/ioutil" - "runtime" - "strings" - "sync" - "time" - - "github.com/IceWhaleTech/CasaOS/model" - "github.com/IceWhaleTech/CasaOS/pkg/config" - "github.com/IceWhaleTech/CasaOS/pkg/utils/command" - "github.com/IceWhaleTech/CasaOS/pkg/utils/loger" - model2 "github.com/IceWhaleTech/CasaOS/service/model" - "github.com/docker/docker/api/types" - "github.com/docker/docker/api/types/filters" - client2 "github.com/docker/docker/client" - "github.com/pkg/errors" - uuid "github.com/satori/go.uuid" - "go.uber.org/zap" - "gorm.io/gorm" -) - -type AppService interface { - GetMyList(index, size int, position bool) (*[]model2.MyAppList, *[]model2.MyAppList) - SaveContainer(m model2.AppListDBModel) - GetUninstallInfo(id string) model2.AppListDBModel - DeleteApp(id string) - GetContainerInfo(id string) (types.Container, error) - GetAppDBInfo(id string) model2.AppListDBModel - UpdateApp(m model2.AppListDBModel) - GetSimpleContainerInfo(id string) (types.Container, error) - DelAppConfigDir(path string) - GetSystemAppList() []types.Container - GetHardwareUsageStream() - GetHardwareUsage() []model.DockerStatsModel - GetAppStats(id string) string - GetAllDBApps() []model2.AppListDBModel - ImportApplications(casaApp bool) - CheckNewImage() -} - -type appStruct struct { - db *gorm.DB -} - -func (a *appStruct) CheckNewImage() { - list := MyService.Docker().DockerContainerList() - for _, v := range list { - inspect, err := MyService.Docker().DockerImageInfo(strings.Split(v.Image, ":")[0]) - if err != nil { - NewVersionApp[v.ID] = inspect.ID - continue - } - if inspect.ID == v.ImageID { - delete(NewVersionApp, v.ID) - continue - } - NewVersionApp[v.ID] = inspect.ID - } - -} -func (a *appStruct) ImportApplications(casaApp bool) { - if casaApp { - list := MyService.App().GetAllDBApps() - for _, app := range list { - info, err := MyService.Docker().DockerContainerInfo(app.CustomId) - if err != nil { - MyService.App().DeleteApp(app.CustomId) - continue - } - //info.NetworkSettings - info.Config.Labels["casaos"] = "casaos" - info.Config.Labels["web"] = app.PortMap - info.Config.Labels["icon"] = app.Icon - info.Config.Labels["desc"] = app.Description - info.Config.Labels["index"] = app.Index - info.Config.Labels["custom_id"] = app.CustomId - info.Name = app.Title - container_id, err := MyService.Docker().DockerContainerCopyCreate(info) - if err != nil { - fmt.Println(err) - continue - } - MyService.App().DeleteApp(app.CustomId) - MyService.Docker().DockerContainerStop(app.CustomId) - MyService.Docker().DockerContainerRemove(app.CustomId, false) - MyService.Docker().DockerContainerStart(container_id) - - } - } else { - list := MyService.Docker().DockerContainerList() - for _, app := range list { - info, err := MyService.Docker().DockerContainerInfo(app.ID) - if err != nil || info.Config.Labels["casaos"] == "casaos" { - continue - } - info.Config.Labels["casaos"] = "casaos" - info.Config.Labels["web"] = "" - info.Config.Labels["icon"] = "" - info.Config.Labels["desc"] = "" - info.Config.Labels["index"] = "" - info.Config.Labels["custom_id"] = uuid.NewV4().String() - - _, err = MyService.Docker().DockerContainerCopyCreate(info) - if err != nil { - continue - } - - } - } - - // allcontainer := MyService.Docker().DockerContainerList() - // for _, app := range allcontainer { - // info, err := MyService.Docker().DockerContainerInfo(app.ID) - // if err != nil { - // continue - // } - // MyService.Docker().DockerContainerStop(app.ID) - // MyService.Docker().DockerContainerRemove(app.ID, false) - // //info.NetworkSettings - // info.Config.Labels["custom_id"] = uuid.NewV4().String() - // container_id, err := MyService.Docker().DockerContainerCopyCreate(info) - // if err != nil { - // fmt.Println(err) - // continue - // } - // MyService.Docker().DockerContainerStart(container_id) - //} -} - -//获取我的应用列表 -func (a *appStruct) GetMyList(index, size int, position bool) (*[]model2.MyAppList, *[]model2.MyAppList) { - cli, err := client2.NewClientWithOpts(client2.FromEnv, client2.WithTimeout(time.Second*5)) - if err != nil { - loger.Error("Failed to init client", zap.Any("err", err)) - } - defer cli.Close() - // fts := filters.NewArgs() - // fts.Add("label", "casaos=casaos") - //fts.Add("label", "casaos") - //fts.Add("casaos", "casaos") - containers, err := cli.ContainerList(context.Background(), types.ContainerListOptions{All: true}) - if err != nil { - loger.Error("Failed to get container_list", zap.Any("err", err)) - } - //获取本地数据库应用 - - unTranslation := []model2.MyAppList{} - - list := []model2.MyAppList{} - - for _, m := range containers { - if m.Labels["casaos"] == "casaos" { - - _, newVersion := NewVersionApp[m.ID] - name := strings.ReplaceAll(m.Names[0], "/", "") - icon := m.Labels["icon"] - if len(m.Labels["name"]) > 0 { - name = m.Labels["name"] - } - if m.Labels["origin"] == "system" { - name = strings.Split(m.Image, ":")[0] - if len(strings.Split(name, "/")) > 1 { - icon = "https://icon.casaos.io/main/all/" + strings.Split(name, "/")[1] + ".png" - } - } - - list = append(list, model2.MyAppList{ - Name: name, - Icon: icon, - State: m.State, - CustomId: m.Labels["custom_id"], - Id: m.ID, - Port: m.Labels["web"], - Index: m.Labels["index"], - //Order: m.Labels["order"], - Image: m.Image, - Latest: newVersion, - //Type: m.Labels["origin"], - //Slogan: m.Slogan, - //Rely: m.Rely, - Host: m.Labels["host"], - Protocol: m.Labels["protocol"], - }) - } else { - unTranslation = append(unTranslation, model2.MyAppList{ - Name: strings.ReplaceAll(m.Names[0], "/", ""), - Icon: "", - State: m.State, - CustomId: m.ID, - Id: m.ID, - Port: "", - Latest: false, - Host: "", - Protocol: "", - Image: m.Image, - }) - } - } - - //lMap := make(map[string]interface{}) - // for _, dbModel := range lm { - // if position { - // if dbModel.Position { - // lMap[dbModel.ContainerId] = dbModel - // } - // } else { - // lMap[dbModel.ContainerId] = dbModel - // } - // } - // for _, container := range containers { - - // if lMap[container.ID] != nil && container.Labels["origin"] != "system" { - // m := lMap[container.ID].(model2.AppListDBModel) - // if len(m.Label) == 0 { - // m.Label = m.Title - // } - - // // info, err := cli.ContainerInspect(context.Background(), container.ID) - // // var tm string - // // if err != nil { - // // tm = time.Now().String() - // // } else { - // // tm = info.State.StartedAt - // //} - // list = append(list, model2.MyAppList{ - // Name: m.Label, - // Icon: m.Icon, - // State: container.State, - // CustomId: strings.ReplaceAll(container.Names[0], "/", ""), - // Port: m.PortMap, - // Index: m.Index, - // //UpTime: tm, - // Image: m.Image, - // Slogan: m.Slogan, - // //Rely: m.Rely, - // }) - // } - - // } - - return &list, &unTranslation - -} - -//system application list -func (a *appStruct) GetSystemAppList() []types.Container { - //获取docker应用 - cli, err := client2.NewClientWithOpts(client2.FromEnv) - if err != nil { - loger.Error("Failed to init client", zap.Any("err", err)) - } - defer cli.Close() - fts := filters.NewArgs() - fts.Add("label", "origin=system") - containers, err := cli.ContainerList(context.Background(), types.ContainerListOptions{All: true, Filters: fts}) - if err != nil { - loger.Error("Failed to get container_list", zap.Any("err", err)) - } - - //获取本地数据库应用 - - // var lm []model2.AppListDBModel - // a.db.Table(model2.CONTAINERTABLENAME).Select("title,icon,port_map,`index`,container_id,position,label,slogan,image,volumes").Find(&lm) - - //list := []model2.MyAppList{} - //lMap := make(map[string]interface{}) - // for _, dbModel := range lm { - // lMap[dbModel.ContainerId] = dbModel - // } - - return containers - -} -func (a *appStruct) GetAllDBApps() []model2.AppListDBModel { - var lm []model2.AppListDBModel - a.db.Table(model2.CONTAINERTABLENAME).Select("custom_id,title,icon,container_id,label,slogan,image,port_map").Find(&lm) - return lm -} - -//获取我的应用列表 -func (a *appStruct) GetContainerInfo(id string) (types.Container, error) { - //获取docker应用 - cli, err := client2.NewClientWithOpts(client2.FromEnv) - if err != nil { - loger.Error("Failed to init client", zap.Any("err", err)) - } - filters := filters.NewArgs() - filters.Add("id", id) - containers, err := cli.ContainerList(context.Background(), types.ContainerListOptions{All: true, Filters: filters}) - if err != nil { - loger.Error("Failed to get container_list", zap.Any("err", err)) - } - - if len(containers) > 0 { - return containers[0], nil - } - return types.Container{}, nil - -} - -func (a *appStruct) GetSimpleContainerInfo(id string) (types.Container, error) { - //获取docker应用 - cli, err := client2.NewClientWithOpts(client2.FromEnv) - if err != nil { - return types.Container{}, err - } - defer cli.Close() - filters := filters.NewArgs() - filters.Add("id", id) - containers, err := cli.ContainerList(context.Background(), types.ContainerListOptions{All: true, Filters: filters}) - if err != nil { - return types.Container{}, err - } - - if len(containers) > 0 { - return containers[0], nil - } - return types.Container{}, errors.New("container not existent") -} - -//获取我的应用列表 -func (a *appStruct) GetAppDBInfo(id string) model2.AppListDBModel { - var m model2.AppListDBModel - a.db.Table(model2.CONTAINERTABLENAME).Where("custom_id = ?", id).First(&m) - return m -} - -//根据容器id获取镜像名称 -func (a *appStruct) GetUninstallInfo(id string) model2.AppListDBModel { - var m model2.AppListDBModel - a.db.Table(model2.CONTAINERTABLENAME).Select("image,version,enable_upnp,ports,envs,volumes,origin").Where("custom_id = ?", id).First(&m) - return m -} - -//创建容器成功后保存容器 -func (a *appStruct) SaveContainer(m model2.AppListDBModel) { - a.db.Table(model2.CONTAINERTABLENAME).Create(&m) -} - -func (a *appStruct) UpdateApp(m model2.AppListDBModel) { - a.db.Table(model2.CONTAINERTABLENAME).Save(&m) -} - -func (a *appStruct) DelAppConfigDir(path string) { - command.OnlyExec("source " + config.AppInfo.ShellPath + "/helper.sh ;DelAppConfigDir " + path) -} - -func (a *appStruct) DeleteApp(id string) { - a.db.Table(model2.CONTAINERTABLENAME).Where("custom_id = ?", id).Delete(&model2.AppListDBModel{}) -} - -var dataStats sync.Map - -var isFinish bool = false - -func (a *appStruct) GetAppStats(id string) string { - cli, err := client2.NewClientWithOpts(client2.FromEnv) - if err != nil { - return "" - } - defer cli.Close() - con, err := cli.ContainerStats(context.Background(), id, false) - if err != nil { - return err.Error() - } - defer con.Body.Close() - c, _ := ioutil.ReadAll(con.Body) - return string(c) -} - -func (a *appStruct) GetHardwareUsage() []model.DockerStatsModel { - - stream := true - for !isFinish { - if stream { - stream = false - go func() { - a.GetHardwareUsageStream() - }() - } - runtime.Gosched() - } - list := []model.DockerStatsModel{} - - dataStats.Range(func(key, value interface{}) bool { - list = append(list, value.(model.DockerStatsModel)) - return true - }) - return list - -} - -func (a *appStruct) GetHardwareUsageStream() { - - cli, err := client2.NewClientWithOpts(client2.FromEnv) - if err != nil { - return - } - defer cli.Close() - - ctx := context.Background() - ctx, cancel := context.WithCancel(ctx) - - fts := filters.NewArgs() - fts.Add("label", "casaos=casaos") - //fts.Add("status", "running") - containers, err := cli.ContainerList(context.Background(), types.ContainerListOptions{All: true, Filters: fts}) - if err != nil { - loger.Error("Failed to get container_list", zap.Any("err", err)) - } - for i := 0; i < 100; i++ { - if i%10 == 0 { - containers, err = cli.ContainerList(context.Background(), types.ContainerListOptions{All: true, Filters: fts}) - if err != nil { - loger.Error("Failed to get container_list", zap.Any("err", err)) - continue - } - } - if config.CasaOSGlobalVariables.AppChange { - config.CasaOSGlobalVariables.AppChange = false - dataStats.Range(func(key, value interface{}) bool { - dataStats.Delete(key) - return true - }) - } - - var temp sync.Map - var wg sync.WaitGroup - for _, v := range containers { - if v.State != "running" { - continue - } - wg.Add(1) - go func(v types.Container, i int) { - defer wg.Done() - stats, err := cli.ContainerStatsOneShot(ctx, v.ID) - if err != nil { - return - } - decode := json.NewDecoder(stats.Body) - var data interface{} - if err := decode.Decode(&data); err == io.EOF { - return - } - m, _ := dataStats.Load(v.ID) - dockerStats := model.DockerStatsModel{} - if m != nil { - dockerStats.Previous = m.(model.DockerStatsModel).Data - } - dockerStats.Data = data - dockerStats.Icon = v.Labels["icon"] - dockerStats.Title = strings.ReplaceAll(v.Names[0], "/", "") - - // @tiger - 不建议直接把依赖的数据结构封装返回。 - // 如果依赖的数据结构有变化,应该在这里适配或者保存,这样更加对客户端负责 - temp.Store(v.ID, dockerStats) - if i == 99 { - stats.Body.Close() - } - }(v, i) - } - wg.Wait() - dataStats = temp - isFinish = true - - time.Sleep(time.Second * 1) - } - isFinish = false - cancel() -} - -func NewAppService(db *gorm.DB) AppService { - return &appStruct{db: db} -} diff --git a/service/casa.go b/service/casa.go index 4d80bf4..88e1c45 100644 --- a/service/casa.go +++ b/service/casa.go @@ -1,266 +1,20 @@ package service import ( - "encoding/json" json2 "encoding/json" - "fmt" - "sort" - "strconv" "time" "github.com/IceWhaleTech/CasaOS/model" "github.com/IceWhaleTech/CasaOS/pkg/config" - "github.com/IceWhaleTech/CasaOS/pkg/utils/file" "github.com/IceWhaleTech/CasaOS/pkg/utils/httper" - httper2 "github.com/IceWhaleTech/CasaOS/pkg/utils/httper" - "github.com/IceWhaleTech/CasaOS/pkg/utils/loger" - "github.com/pkg/errors" "github.com/tidwall/gjson" - "go.uber.org/zap" ) type CasaService interface { - GetServerList(index, size, tp, categoryId, key string) (model.ServerAppListCollection, error) - GetServerCategoryList() (list []model.CategoryList, err error) - GetServerAppInfo(id, t string, language string) (model.ServerAppList, error) - ShareAppFile(body []byte) string GetCasaosVersion() model.Version - AsyncGetServerList() (collection model.ServerAppListCollection, err error) - AsyncGetServerCategoryList() ([]model.CategoryList, error) } -type casaService struct { -} - -func (o *casaService) ShareAppFile(body []byte) string { - head := make(map[string]string) - - head["Authorization"] = GetToken() - - content := httper2.Post(config.ServerInfo.ServerApi+"/v1/community/add", body, "application/json", head) - return content -} - -func (o *casaService) GetServerList(index, size, tp, categoryId, key string) (model.ServerAppListCollection, error) { - - keyName := fmt.Sprintf("list_%s_%s_%s_%s_%s", index, size, tp, categoryId, "en") - collection := model.ServerAppListCollection{} - if result, ok := Cache.Get(keyName); ok { - res, ok := result.(string) - if ok { - json2.Unmarshal([]byte(res), &collection) - return collection, nil - } - } - - collectionStr := file.ReadFullFile(config.AppInfo.DBPath + "/app_list.json") - - err := json2.Unmarshal(collectionStr, &collection) - if err != nil { - loger.Error("marshal error", zap.Any("err", err), zap.Any("content", string(collectionStr))) - collection, err = o.AsyncGetServerList() - if err != nil { - return collection, err - } - } - - go o.AsyncGetServerList() - - if categoryId != "0" { - categoryInt, _ := strconv.Atoi(categoryId) - nList := []model.ServerAppList{} - for _, v := range collection.List { - if v.CategoryId == categoryInt { - nList = append(nList, v) - } - } - collection.List = nList - nCommunity := []model.ServerAppList{} - for _, v := range collection.Community { - if v.CategoryId == categoryInt { - nCommunity = append(nCommunity, v) - } - } - collection.Community = nCommunity - } - if tp != "name" { - if tp == "new" { - sort.Slice(collection.List, func(i, j int) bool { - return collection.List[i].CreatedAt.After(collection.List[j].CreatedAt) - }) - sort.Slice(collection.Community, func(i, j int) bool { - return collection.Community[i].CreatedAt.After(collection.Community[j].CreatedAt) - }) - } else if tp == "rank" { - sort.Slice(collection.List, func(i, j int) bool { - return collection.List[i].QueryCount > collection.List[j].QueryCount - }) - sort.Slice(collection.Community, func(i, j int) bool { - return collection.Community[i].QueryCount > collection.Community[j].QueryCount - }) - } - } - sizeInt, _ := strconv.Atoi(size) - - if index != "1" { - indexInt, _ := strconv.Atoi(index) - collection.List = collection.List[(indexInt-1)*sizeInt : indexInt*sizeInt] - collection.Community = collection.Community[(indexInt-1)*sizeInt : indexInt*sizeInt] - } else { - if len(collection.List) > sizeInt { - collection.List = collection.List[:sizeInt] - } - if len(collection.Community) > sizeInt { - collection.Community = collection.Community[:sizeInt] - } - } - - if len(collection.List) > 0 { - by, _ := json.Marshal(collection) - Cache.Set(keyName, string(by), time.Minute*10) - } - - return collection, nil - -} - -func (o *casaService) AsyncGetServerList() (collection model.ServerAppListCollection, err error) { - - results := file.ReadFullFile(config.AppInfo.DBPath + "/app_list.json") - errr := json2.Unmarshal(results, &collection) - if errr != nil { - loger.Error("marshal error", zap.Any("err", err), zap.Any("content", string(results))) - } - - head := make(map[string]string) - - head["Authorization"] = GetToken() - - listS := httper2.Get(config.ServerInfo.ServerApi+"/v2/app/newlist?index=1&size=1000&rank=name&category_id=0&key=&language=en", head) - listModel := []model.ServerAppList{} - communityModel := []model.ServerAppList{} - recommendModel := []model.ServerAppList{} - err = json2.Unmarshal([]byte(gjson.Get(listS, "data.list").String()), &listModel) - json2.Unmarshal([]byte(gjson.Get(listS, "data.recommend").String()), &recommendModel) - json2.Unmarshal([]byte(gjson.Get(listS, "data.community").String()), &communityModel) - - if len(listModel) > 0 { - collection.Community = communityModel - collection.List = listModel - collection.Recommend = recommendModel - collection.Version = o.GetCasaosVersion().Version - var by []byte - by, err = json.Marshal(collection) - if err != nil { - loger.Error("marshal error", zap.Any("err", err)) - } - file.WriteToPath(by, config.AppInfo.DBPath, "app_list.json") - } - return -} - -// func (o *casaService) GetServerCategoryList() (list []model.ServerCategoryList) { - -// keyName := fmt.Sprintf("category_list") -// if result, ok := Cache.Get(keyName); ok { -// res, ok := result.(string) -// if ok { -// json2.Unmarshal([]byte(gjson.Get(res, "data").String()), &list) -// return list -// } -// } - -// head := make(map[string]string) -// head["Authorization"] = GetToken() - -// listS := httper2.Get(config.ServerInfo.ServerApi+"/v2/app/category", head) - -// json2.Unmarshal([]byte(gjson.Get(listS, "data").String()), &list) -// if len(list) > 0 { -// Cache.Set(keyName, listS, time.Hour*24) -// } -// return list -// } - -func (o *casaService) GetServerCategoryList() (list []model.CategoryList, err error) { - category := model.ServerCategoryList{} - results := file.ReadFullFile(config.AppInfo.DBPath + "/app_category.json") - err = json2.Unmarshal(results, &category) - if err != nil { - loger.Error("marshal error", zap.Any("err", err), zap.Any("content", string(results))) - return o.AsyncGetServerCategoryList() - } - go o.AsyncGetServerCategoryList() - return category.Item, err -} - -func (o *casaService) AsyncGetServerCategoryList() ([]model.CategoryList, error) { - list := model.ServerCategoryList{} - results := file.ReadFullFile(config.AppInfo.DBPath + "/app_category.json") - err := json2.Unmarshal(results, &list) - if err != nil { - loger.Error("marshal error", zap.Any("err", err), zap.Any("content", string(results))) - } - item := []model.CategoryList{} - head := make(map[string]string) - head["Authorization"] = GetToken() - listS := httper2.Get(config.ServerInfo.ServerApi+"/v2/app/category", head) - if len(listS) == 0 { - return item, errors.New("server error") - } - json2.Unmarshal([]byte(gjson.Get(listS, "data").String()), &item) - if len(item) > 0 { - list.Version = o.GetCasaosVersion().Version - list.Item = item - by, err := json.Marshal(list) - if err != nil { - loger.Error("marshal error", zap.Any("err", err)) - } - file.WriteToPath(by, config.AppInfo.DBPath, "app_category.json") - } - return item, nil -} - -func (o *casaService) GetServerAppInfo(id, t string, language string) (model.ServerAppList, error) { - - head := make(map[string]string) - - head["Authorization"] = GetToken() - infoS := httper2.Get(config.ServerInfo.ServerApi+"/v2/app/info/"+id+"?t="+t+"&language="+language, head) - - info := model.ServerAppList{} - if infoS == "" { - return info, errors.New("server error") - } - err := json2.Unmarshal([]byte(gjson.Get(infoS, "data").String()), &info) - if err != nil { - fmt.Println(infoS) - return info, err - } - - return info, nil -} -func GetToken() string { - t := make(chan string) - keyName := "casa_token" - - var auth string - if result, ok := Cache.Get(keyName); ok { - auth, ok = result.(string) - if ok { - - return auth - } - } - go func() { - str := httper2.Get(config.ServerInfo.ServerApi+"/token", nil) - t <- gjson.Get(str, "data").String() - }() - auth = <-t - - Cache.SetDefault(keyName, auth) - return auth -} +type casaService struct{} /** * @description: get remote version diff --git a/service/docker.go b/service/docker.go deleted file mode 100644 index 8963dc5..0000000 --- a/service/docker.go +++ /dev/null @@ -1,962 +0,0 @@ -package service - -import ( - "bytes" - "context" - "encoding/base64" - "encoding/binary" - json2 "encoding/json" - "fmt" - - "github.com/IceWhaleTech/CasaOS/model/notify" - "github.com/pkg/errors" - "go.uber.org/zap" - - "github.com/IceWhaleTech/CasaOS/model" - "github.com/IceWhaleTech/CasaOS/pkg/docker" - command2 "github.com/IceWhaleTech/CasaOS/pkg/utils/command" - "github.com/IceWhaleTech/CasaOS/pkg/utils/env_helper" - "github.com/IceWhaleTech/CasaOS/pkg/utils/file" - "github.com/IceWhaleTech/CasaOS/pkg/utils/loger" - - //"github.com/containerd/containerd/oci" - "io" - "io/ioutil" - "log" - "os" - "strconv" - "strings" - "time" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/api/types/container" - "github.com/docker/docker/api/types/filters" - "github.com/docker/docker/api/types/mount" - "github.com/docker/docker/api/types/network" - client2 "github.com/docker/docker/client" - "github.com/docker/go-connections/nat" -) - -type DockerService interface { - DockerPullImage(imageName string, icon, name string) error - IsExistImage(imageName string) bool - DockerContainerCreate(m model.CustomizationPostData, id string) (containerId string, err error) - DockerContainerCopyCreate(info *types.ContainerJSON) (containerId string, err error) - DockerContainerStart(name string) error - DockerContainerStats(name string) (string, error) - DockerListByName(name string) (*types.Container, error) - DockerListByImage(image, version string) (*types.Container, error) - DockerContainerInfo(name string) (*types.ContainerJSON, error) - DockerImageRemove(name string) error - DockerContainerRemove(name string, update bool) error - DockerContainerStop(id string) error - DockerContainerUpdateName(name, id string) (err error) - DockerContainerUpdate(m model.CustomizationPostData, id string) (err error) - DockerContainerLog(name string) ([]byte, error) - DockerContainerCommit(name string) - DockerContainerList() []types.Container - DockerNetworkModelList() []types.NetworkResource - DockerImageInfo(image string) (types.ImageInspect, error) - GetNetWorkNameByNetWorkID(id string) (string, error) - ContainerExecShell(container_id string) string - GetDockerInfo() (types.Info, error) -} - -type dockerService struct { - rootDir string -} - -func (ds *dockerService) DockerContainerList() []types.Container { - cli, err := client2.NewClientWithOpts(client2.FromEnv, client2.WithTimeout(time.Second*5)) - if err != nil { - return nil - } - defer cli.Close() - containers, err := cli.ContainerList(context.Background(), types.ContainerListOptions{All: true}) - if err != nil { - return containers - } - return containers -} - -func (ds *dockerService) ContainerExecShell(container_id string) string { - cli, _ := client2.NewClientWithOpts(client2.FromEnv) - exec, err := cli.ContainerExecCreate(context.Background(), container_id, types.ExecConfig{ - User: "1000:1000", - Cmd: []string{"echo -e \"hellow\nworld\" >> /a.txt"}, - }) - if err != nil { - os.Exit(5) - } - err = cli.ContainerExecStart(context.Background(), exec.ID, types.ExecStartCheck{}) - if err != nil { - fmt.Println("exec script error ", err) - } - return exec.ID -} - -// 创建默认网络 -func DockerNetwork() { - - cli, _ := client2.NewClientWithOpts(client2.FromEnv) - defer cli.Close() - d, _ := cli.NetworkList(context.Background(), types.NetworkListOptions{}) - - for _, resource := range d { - if resource.Name == docker.NETWORKNAME { - return - } - } - cli.NetworkCreate(context.Background(), docker.NETWORKNAME, types.NetworkCreate{}) -} - -// 根据网络id获取网络名 -func (ds *dockerService) GetNetWorkNameByNetWorkID(id string) (string, error) { - cli, _ := client2.NewClientWithOpts(client2.FromEnv) - defer cli.Close() - filter := filters.NewArgs() - filter.Add("id", id) - d, err := cli.NetworkList(context.Background(), types.NetworkListOptions{Filters: filter}) - if err == nil && len(d) > 0 { - return d[0].Name, nil - } - return "", err -} - -// 拉取镜像 -func DockerPull() { - - cli, _ := client2.NewClientWithOpts(client2.FromEnv) - defer cli.Close() - - authConfig := types.AuthConfig{} - encodedJSON, err := json2.Marshal(authConfig) - fmt.Println(err) - - authStr := base64.URLEncoding.EncodeToString(encodedJSON) - reader, err := cli.ImagePull(context.Background(), "swr.cn-north-4.myhuaweicloud.com/root/swr-demo-2048:latest", types.ImagePullOptions{RegistryAuth: authStr}) - - buf := new(bytes.Buffer) - buf.ReadFrom(reader) - fmt.Println(buf.String()) - -} - -// 拉取镜像 -func DockerEx() { - - cli, _ := client2.NewClientWithOpts(client2.FromEnv) - defer cli.Close() - - importResponse, err := cli.ImageImport(context.Background(), types.ImageImportSource{ - Source: strings.NewReader("source"), - SourceName: "image_source", - }, "repository_name:imported", types.ImageImportOptions{ - Tag: "imported", - Message: "A message", - Changes: []string{"change1", "change2"}, - }) - - response, err := ioutil.ReadAll(importResponse) - if err != nil { - fmt.Println(err) - } - importResponse.Close() - println(string(response)) - if string(response) != "response" { - fmt.Printf("expected response to contain 'response', got %s", string(response)) - } -} - -//func DockerContainerSize() { -// cli, err := client2.NewClientWithOpts(client2.FromEnv) -// //but := bytes.Buffer{} -// d, err := cli.ContainerExecCreate(context.Background(), "c3adcef92bae648890941ac00e6c4024d7f2959c2e629f0b581d6a19d77b5eda") -// fmt.Println(d) -// st, _ := ioutil.ReadAll(d.Body) -// fmt.Println(string(st)) -// if err != nil { -// fmt.Print(err) -// } -// -//} - -func (ds *dockerService) DockerImageInfo(image string) (types.ImageInspect, error) { - cli, err := client2.NewClientWithOpts(client2.FromEnv) - if err != nil { - return types.ImageInspect{}, err - } - inspect, _, err := cli.ImageInspectWithRaw(context.Background(), image) - if err != nil { - return inspect, err - } - return inspect, nil -} - -func MsqlExec(container string) error { - cli, err := client2.NewClientWithOpts(client2.FromEnv) - ctx := context.Background() - // 执行/bin/bash命令 - ir, err := cli.ContainerExecCreate(ctx, container, types.ExecConfig{ - AttachStdin: false, - AttachStdout: true, - AttachStderr: true, - Cmd: []string{"date"}, - Tty: true, - Env: []string{"aaa=ddd"}, - }) - err = cli.ContainerExecStart(ctx, ir.ID, types.ExecStartCheck{}) - - fmt.Println(err) - - return err -} - -func Exec(container, row, col string) (hr types.HijackedResponse, err error) { - cli, err := client2.NewClientWithOpts(client2.FromEnv) - ctx := context.Background() - // 执行/bin/bash命令 - ir, err := cli.ContainerExecCreate(ctx, container, types.ExecConfig{ - AttachStdin: true, - AttachStdout: true, - AttachStderr: true, - Env: []string{"COLUMNS=" + col, "LINES=" + row}, - Cmd: []string{"/bin/bash"}, - Tty: true, - }) - if err != nil { - return - } - // 附加到上面创建的/bin/bash进程中 - hr, err = cli.ContainerExecAttach(ctx, ir.ID, types.ExecStartCheck{Detach: false, Tty: true}) - if err != nil { - return - } - return -} - -func DockerLog() { - //cli, err := client2.NewClientWithOpts(client2.FromEnv) - //ctx := context.Background() - //ir, err := cli.ContainerLogs(ctx, "79c6fa382c330b9149e2d28d24f4d2c231cdb8cfc0710c2d268ccee13c5b24f8", types.ContainerLogsOptions{}) - //str, err := ioutil.ReadAll(ir) - //fmt.Println(string(str)) - //fmt.Println(err) - - ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) - defer cancel() - - client, _ := client2.NewClientWithOpts(client2.FromEnv) - reader, err := client.ContainerLogs(ctx, "79c6fa382c330b9149e2d28d24f4d2c231cdb8cfc0710c2d268ccee13c5b24f8", types.ContainerLogsOptions{}) - if err != nil { - log.Fatal(err) - } - _, err = io.Copy(os.Stdout, reader) - if err != nil && err != io.EOF { - log.Fatal(err) - } -} - -func DockerLogs() { - cli, err := client2.NewClientWithOpts(client2.FromEnv) - i, err := cli.ContainerLogs(context.Background(), "79c6fa382c330b9149e2d28d24f4d2c231cdb8cfc0710c2d268ccee13c5b24f8", types.ContainerLogsOptions{ - ShowStderr: true, - ShowStdout: true, - Timestamps: false, - Follow: true, - Tail: "40", - }) - if err != nil { - log.Fatal(err) - } - defer i.Close() - - hdr := make([]byte, 8) - for { - _, err := i.Read(hdr) - if err != nil { - log.Fatal(err) - } - var w io.Writer - switch hdr[0] { - case 1: - w = os.Stdout - default: - w = os.Stderr - } - count := binary.BigEndian.Uint32(hdr[4:]) - dat := make([]byte, count) - _, err = i.Read(dat) - fmt.Fprint(w, string(dat)) - } -} - -//正式内容 - -// 检查镜像是否存在 -func (ds *dockerService) IsExistImage(imageName string) bool { - cli, err := client2.NewClientWithOpts(client2.FromEnv) - if err != nil { - return false - } - defer cli.Close() - filter := filters.NewArgs() - filter.Add("reference", imageName) - - list, err := cli.ImageList(context.Background(), types.ImageListOptions{Filters: filter}) - - if err == nil && len(list) > 0 { - return true - } - - return false -} - -// 安装镜像 -func (ds *dockerService) DockerPullImage(imageName string, icon, name string) error { - cli, err := client2.NewClientWithOpts(client2.FromEnv) - if err != nil { - return err - } - defer cli.Close() - out, err := cli.ImagePull(context.Background(), imageName, types.ImagePullOptions{}) - if err != nil { - return err - } - defer out.Close() - if err != nil { - - return err - } - //io.Copy() - buf := make([]byte, 2048*4) - for { - n, err := out.Read(buf) - if err != nil { - if err != io.EOF { - fmt.Println("read error:", err) - } - break - } - if len(icon) > 0 && len(name) > 0 { - notify := notify.Application{} - notify.Icon = icon - notify.Name = name - notify.State = "PULLING" - notify.Type = "INSTALL" - notify.Finished = false - notify.Success = true - notify.Message = string(buf[:n]) - MyService.Notify().SendInstallAppBySocket(notify) - } - - } - return err -} -func (ds *dockerService) DockerContainerCopyCreate(info *types.ContainerJSON) (containerId string, err error) { - cli, err := client2.NewClientWithOpts(client2.FromEnv) - if err != nil { - return "", err - } - defer cli.Close() - container, err := cli.ContainerCreate(context.Background(), info.Config, info.HostConfig, &network.NetworkingConfig{info.NetworkSettings.Networks}, nil, info.Name) - if err != nil { - return "", err - } - return container.ID, err -} - -// param imageName 镜像名称 -// param containerDbId 数据库的id -// param port 容器内部主端口 -// param mapPort 容器主端口映射到外部的端口 -// param tcp 容器其他tcp端口 -// param udp 容器其他udp端口 -func (ds *dockerService) DockerContainerCreate(m model.CustomizationPostData, id string) (containerId string, err error) { - if len(m.NetworkModel) == 0 { - m.NetworkModel = "bridge" - } - - cli, err := client2.NewClientWithOpts(client2.FromEnv) - if err != nil { - return "", err - } - - defer cli.Close() - ports := make(nat.PortSet) - portMaps := make(nat.PortMap) - // ports[nat.Port(fmt.Sprint(m.PortMap)+"/tcp")] = struct{}{} - // if net != "host" { - // portMaps[nat.Port(fmt.Sprint(m.Port)+"/tcp")] = []nat.PortBinding{{HostIP: "", HostPort: m.PortMap}} - // } - //port := "" - for _, portMap := range m.Ports { - // if portMap.CommendPort == m.PortMap && portMap.Protocol == "tcp" || portMap.Protocol == "both" { - // port = portMap.ContainerPort - // } - if portMap.Protocol == "tcp" { - - tContainer, _ := strconv.Atoi(portMap.ContainerPort) - if tContainer > 0 { - ports[nat.Port(portMap.ContainerPort+"/tcp")] = struct{}{} - if m.NetworkModel != "host" { - portMaps[nat.Port(portMap.ContainerPort+"/tcp")] = []nat.PortBinding{{HostPort: portMap.CommendPort}} - } - } - } else if portMap.Protocol == "both" { - - tContainer, _ := strconv.Atoi(portMap.ContainerPort) - if tContainer > 0 { - ports[nat.Port(portMap.ContainerPort+"/tcp")] = struct{}{} - if m.NetworkModel != "host" { - portMaps[nat.Port(portMap.ContainerPort+"/tcp")] = []nat.PortBinding{{HostPort: portMap.CommendPort}} - } - } - - uContainer, _ := strconv.Atoi(portMap.ContainerPort) - if uContainer > 0 { - ports[nat.Port(portMap.ContainerPort+"/udp")] = struct{}{} - if m.NetworkModel != "host" { - portMaps[nat.Port(portMap.ContainerPort+"/udp")] = []nat.PortBinding{{HostPort: portMap.CommendPort}} - } - } - - } else { - uContainer, _ := strconv.Atoi(portMap.ContainerPort) - if uContainer > 0 { - ports[nat.Port(portMap.ContainerPort+"/udp")] = struct{}{} - if m.NetworkModel != "host" { - portMaps[nat.Port(portMap.ContainerPort+"/udp")] = []nat.PortBinding{{HostPort: portMap.CommendPort}} - } - } - } - - } - - var envArr []string - var showENV []string - showENV = append(showENV, "casaos") - for _, e := range m.Envs { - showENV = append(showENV, e.Name) - if strings.HasPrefix(e.Value, "$") { - envArr = append(envArr, e.Name+"="+env_helper.ReplaceDefaultENV(e.Value, MyService.System().GetTimeZone())) - continue - } - if len(e.Value) > 0 { - if e.Value == "port_map" { - envArr = append(envArr, e.Name+"="+m.PortMap) - continue - } - envArr = append(envArr, e.Name+"="+e.Value) - } - } - - res := container.Resources{} - if m.CpuShares > 0 { - res.CPUShares = m.CpuShares - } - if m.Memory > 0 { - res.Memory = m.Memory << 20 - } - for _, p := range m.Devices { - if len(p.Path) > 0 { - res.Devices = append(res.Devices, container.DeviceMapping{PathOnHost: p.Path, PathInContainer: p.ContainerPath, CgroupPermissions: "rwm"}) - } - } - hostConfingBind := []string{} - // volumes bind - volumes := []mount.Mount{} - for _, v := range m.Volumes { - path := v.Path - if len(path) == 0 { - path = docker.GetDir(m.Label, v.Path) - if len(path) == 0 { - continue - } - } - path = strings.ReplaceAll(path, "$AppID", m.Label) - //reg1 := regexp.MustCompile(`([^<>/\\\|:""\*\?]+\.\w+$)`) - //result1 := reg1.FindAllStringSubmatch(path, -1) - //if len(result1) == 0 { - err = file.IsNotExistMkDir(path) - if err != nil { - loger.Error("Failed to create a folder", zap.Any("err", err)) - continue - } - //} - // else { - // err = file.IsNotExistCreateFile(path) - // if err != nil { - // ds.log.Error("mkdir error", err) - // continue - // } - // } - - volumes = append(volumes, mount.Mount{ - Type: mount.TypeBind, - Source: path, - Target: v.ContainerPath, - }) - - hostConfingBind = append(hostConfingBind, v.Path+":"+v.ContainerPath) - } - - rp := container.RestartPolicy{} - - if len(m.Restart) > 0 { - rp.Name = m.Restart - } - // healthTest := []string{} - // if len(port) > 0 { - // healthTest = []string{"CMD-SHELL", "curl -f http://localhost:" + port + m.Index + " || exit 1"} - // } - - // health := &container.HealthConfig{ - // Test: healthTest, - // StartPeriod: 0, - // Retries: 1000, - // } - // fmt.Print(health) - if len(m.HostName) == 0 { - m.HostName = m.Label - } - - info, err := cli.ContainerInspect(context.Background(), id) - hostConfig := &container.HostConfig{} - config := &container.Config{} - config.Labels = map[string]string{} - if err == nil { - // info.HostConfig = &container.HostConfig{} - // info.Config = &container.Config{} - // info.NetworkSettings = &types.NetworkSettings{} - hostConfig = info.HostConfig - config = info.Config - if config.Labels["casaos"] == "casaos" { - config.Cmd = m.Cmd - config.Image = m.Image - config.Env = envArr - config.Hostname = m.HostName - config.ExposedPorts = ports - } - } else { - config.Cmd = m.Cmd - config.Image = m.Image - config.Env = envArr - config.Hostname = m.HostName - config.ExposedPorts = ports - } - - config.Labels["origin"] = m.Origin - config.Labels["casaos"] = "casaos" - config.Labels["web"] = m.PortMap - config.Labels["icon"] = m.Icon - config.Labels["desc"] = m.Description - config.Labels["index"] = m.Index - config.Labels["custom_id"] = m.CustomId - config.Labels["show_env"] = strings.Join(showENV, ",") - config.Labels["protocol"] = m.Protocol - config.Labels["host"] = m.Host - config.Labels["name"] = m.Label - //container, err := cli.ContainerCreate(context.Background(), info.Config, info.HostConfig, &network.NetworkingConfig{info.NetworkSettings.Networks}, nil, info.Name) - - hostConfig.Mounts = volumes - hostConfig.Binds = []string{} - hostConfig.Privileged = m.Privileged - hostConfig.CapAdd = m.CapAdd - hostConfig.NetworkMode = container.NetworkMode(m.NetworkModel) - hostConfig.RestartPolicy = rp - hostConfig.Resources = res - //hostConfig := &container.HostConfig{Resources: res, Mounts: volumes, RestartPolicy: rp, NetworkMode: , Privileged: m.Privileged, CapAdd: m.CapAdd} - //if net != "host" { - - hostConfig.PortBindings = portMaps - //} - containerDb, err := cli.ContainerCreate(context.Background(), - config, - hostConfig, - &network.NetworkingConfig{EndpointsConfig: map[string]*network.EndpointSettings{m.NetworkModel: {NetworkID: "", Aliases: []string{}}}}, - nil, - m.ContainerName) - if err != nil { - return "", err - } - return containerDb.ID, err -} - -// 删除容器 -func (ds *dockerService) DockerContainerRemove(name string, update bool) error { - cli, err := client2.NewClientWithOpts(client2.FromEnv) - if err != nil { - return err - } - defer cli.Close() - err = cli.ContainerRemove(context.Background(), name, types.ContainerRemoveOptions{}) - - //路径处理 - if !update { - path := docker.GetDir(name, "/config") - if !file.CheckNotExist(path) { - file.RMDir(path) - } - } - - if err != nil { - return err - } - - return err -} - -// 删除镜像 -func (ds *dockerService) DockerImageRemove(name string) error { - cli, err := client2.NewClientWithOpts(client2.FromEnv) - if err != nil { - return err - } - defer cli.Close() - imageList, err := cli.ImageList(context.Background(), types.ImageListOptions{}) - - imageId := "" - -Loop: - for _, ig := range imageList { - for _, i := range ig.RepoTags { - if i == name { - imageId = ig.ID - break Loop - } - } - } - _, err = cli.ImageRemove(context.Background(), imageId, types.ImageRemoveOptions{}) - return err -} - -func DockerImageRemove(name string) error { - cli, err := client2.NewClientWithOpts(client2.FromEnv) - if err != nil { - return err - } - defer cli.Close() - imageList, err := cli.ImageList(context.Background(), types.ImageListOptions{}) - imageId := "" - -Loop: - for _, ig := range imageList { - fmt.Println(ig.RepoDigests) - fmt.Println(ig.Containers) - for _, i := range ig.RepoTags { - if i == name { - imageId = ig.ID - break Loop - } - } - } - _, err = cli.ImageRemove(context.Background(), imageId, types.ImageRemoveOptions{}) - return err -} - -// 停止镜像 -func (ds *dockerService) DockerContainerStop(id string) error { - cli, err := client2.NewClientWithOpts(client2.FromEnv) - if err != nil { - return err - } - defer cli.Close() - err = cli.ContainerStop(context.Background(), id, nil) - return err -} - -// 启动容器 -func (ds *dockerService) DockerContainerStart(name string) error { - cli, err := client2.NewClientWithOpts(client2.FromEnv) - if err != nil { - return err - } - defer cli.Close() - err = cli.ContainerStart(context.Background(), name, types.ContainerStartOptions{}) - return err -} - -// 查看日志 -func (ds *dockerService) DockerContainerLog(name string) ([]byte, error) { - cli, err := client2.NewClientWithOpts(client2.FromEnv) - if err != nil { - return []byte(""), err - } - defer cli.Close() - //body, err := cli.ContainerAttach(context.Background(), name, types.ContainerAttachOptions{Logs: true, Stream: false, Stdin: false, Stdout: false, Stderr: false}) - body, err := cli.ContainerLogs(context.Background(), name, types.ContainerLogsOptions{ShowStdout: true, ShowStderr: true}) - - if err != nil { - return []byte(""), err - } - - defer body.Close() - content, err := ioutil.ReadAll(body) - //content, err := ioutil.ReadAll(body) - if err != nil { - return []byte(""), err - } - return content, nil -} - -func DockerContainerStats1() error { - cli, err := client2.NewClientWithOpts(client2.FromEnv) - if err != nil { - return err - } - defer cli.Close() - dss, err := cli.ContainerStats(context.Background(), "dockermysql", false) - if err != nil { - return err - } - defer dss.Body.Close() - sts, err := ioutil.ReadAll(dss.Body) - if err != nil { - return err - } - fmt.Println(string(sts)) - return nil -} - -// 获取容器状态 -func (ds *dockerService) DockerContainerStats(name string) (string, error) { - cli, err := client2.NewClientWithOpts(client2.FromEnv) - if err != nil { - return "", err - } - defer cli.Close() - dss, err := cli.ContainerStats(context.Background(), name, false) - if err != nil { - return "", err - } - defer dss.Body.Close() - sts, err := ioutil.ReadAll(dss.Body) - if err != nil { - return "", err - } - return string(sts), nil -} - -// 备份容器 -func (ds *dockerService) DockerContainerCommit(name string) { - cli, err := client2.NewClientWithOpts(client2.FromEnv) - if err != nil { - fmt.Println(err) - } - defer cli.Close() - d, err := cli.ContainerInspect(context.Background(), name) - dss, err := cli.ContainerCommit(context.Background(), name, types.ContainerCommitOptions{Reference: "test", Config: d.Config}) - if err != nil { - fmt.Println(err) - } - fmt.Println(dss) -} - -func (ds *dockerService) DockerListByName(name string) (*types.Container, error) { - cli, _ := client2.NewClientWithOpts(client2.FromEnv) - defer cli.Close() - filter := filters.NewArgs() - filter.Add("name", name) - containers, err := cli.ContainerList(context.Background(), types.ContainerListOptions{Filters: filter}) - if err != nil { - return &types.Container{}, err - } - if len(containers) == 0 { - return &types.Container{}, errors.New("not found") - } - return &containers[0], nil -} - -func (ds *dockerService) DockerListByImage(image, version string) (*types.Container, error) { - cli, _ := client2.NewClientWithOpts(client2.FromEnv) - defer cli.Close() - filter := filters.NewArgs() - filter.Add("ancestor", image+":"+version) - containers, err := cli.ContainerList(context.Background(), types.ContainerListOptions{Filters: filter}) - if err != nil { - return nil, err - } - if len(containers) == 0 { - return nil, nil - } - return &containers[0], nil -} - -// 获取容器详情 -func (ds *dockerService) DockerContainerInfo(name string) (*types.ContainerJSON, error) { - - cli, err := client2.NewClientWithOpts(client2.FromEnv) - if err != nil { - return &types.ContainerJSON{}, err - } - defer cli.Close() - d, err := cli.ContainerInspect(context.Background(), name) - if err != nil { - return &types.ContainerJSON{}, err - } - return &d, nil -} - -// 更新容器 -// param shares cpu优先级 -// param containerDbId 数据库的id -// param port 容器内部主端口 -// param mapPort 容器主端口映射到外部的端口 -// param tcp 容器其他tcp端口 -// param udp 容器其他udp端口 -func (ds *dockerService) DockerContainerUpdate(m model.CustomizationPostData, id string) (err error) { - cli, err := client2.NewClientWithOpts(client2.FromEnv) - if err != nil { - return err - } - defer cli.Close() - //重启策略 - rp := container.RestartPolicy{ - Name: "", - MaximumRetryCount: 0, - } - if len(m.Restart) > 0 { - rp.Name = m.Restart - } - res := container.Resources{} - - if m.Memory > 0 { - res.Memory = m.Memory * 1024 * 1024 - res.MemorySwap = -1 - } - if m.CpuShares > 0 { - res.CPUShares = m.CpuShares - } - for _, p := range m.Devices { - res.Devices = append(res.Devices, container.DeviceMapping{PathOnHost: p.Path, PathInContainer: p.ContainerPath, CgroupPermissions: "rwm"}) - } - _, err = cli.ContainerUpdate(context.Background(), id, container.UpdateConfig{RestartPolicy: rp, Resources: res}) - if err != nil { - return err - } - - return -} - -// 更新容器名称 -// param name 容器名称 -// param id 老的容器名称 -func (ds *dockerService) DockerContainerUpdateName(name, id string) (err error) { - cli, err := client2.NewClientWithOpts(client2.FromEnv) - if err != nil { - return err - } - defer cli.Close() - - err = cli.ContainerRename(context.Background(), id, name) - if err != nil { - return err - } - return -} - -// 获取网络列表 -func (ds *dockerService) DockerNetworkModelList() []types.NetworkResource { - - cli, _ := client2.NewClientWithOpts(client2.FromEnv) - defer cli.Close() - networks, _ := cli.NetworkList(context.Background(), types.NetworkListOptions{}) - return networks -} -func NewDockerService() DockerService { - return &dockerService{rootDir: command2.ExecResultStr(`source ./shell/helper.sh ;GetDockerRootDir`)} -} - -func (ds *dockerService) GetDockerInfo() (types.Info, error) { - cli, err := client2.NewClientWithOpts(client2.FromEnv) - if err != nil { - return types.Info{}, err - } - defer cli.Close() - - return cli.Info(context.Background()) - -} - -// ---------------------------------------test------------------------------------ -//func ServiceCreate() { -// cli, err := client2.NewClientWithOpts(client2.FromEnv) -// r, err := cli.ServiceCreate(context.Background(), swarm.ServiceSpec{}, types.ServiceCreateOptions{}) -// if err != nil { -// fmt.Println("error", err) -// } -// -// -//} - -// func Containerd() { -// // create a new client connected to the default socket path for containerd -// cli, err := containerd.New("/run/containerd/containerd.sock") -// if err != nil { -// fmt.Println("111") -// fmt.Println(err) -// } -// defer cli.Close() - -// // create a new context with an "example" namespace -// ctx := namespaces.WithNamespace(context.Background(), "default") - -// // pull the redis image from DockerHub -// image, err := cli.Pull(ctx, "docker.io/library/busybox:latest", containerd.WithPullUnpack) -// if err != nil { -// fmt.Println("222") -// fmt.Println(err) -// } - -// // create a container -// container, err := cli.NewContainer( -// ctx, -// "test1", -// containerd.WithImage(image), -// containerd.WithNewSnapshot("redis-server-snapshot1", image), -// containerd.WithNewSpec(oci.WithImageConfig(image)), -// ) - -// if err != nil { -// fmt.Println(err) -// } -// defer container.Delete(ctx, containerd.WithSnapshotCleanup) - -// // create a task from the container -// task, err := container.NewTask(ctx, cio.NewCreator(cio.WithStdio)) -// if err != nil { -// fmt.Println(err) -// } -// defer task.Delete(ctx) - -// // make sure we wait before calling start -// exitStatusC, err := task.Wait(ctx) -// if err != nil { -// fmt.Println(err) -// } - -// // call start on the task to execute the redis server -// if err = task.Start(ctx); err != nil { -// fmt.Println(err) -// } - -// fmt.Println("执行完成等待") -// // sleep for a lil bit to see the logs -// time.Sleep(3 * time.Second) - -// // kill the process and get the exit status -// if err = task.Kill(ctx, syscall.SIGTERM); err != nil { -// fmt.Println(err) -// } - -// // wait for the process to fully exit and print out the exit status - -// status := <-exitStatusC -// code, _, err := status.Result() -// if err != nil { -// fmt.Println(err) -// } -// fmt.Printf("redis-server exited with status: %d\n", code) - -// } diff --git a/service/docker_base/common.go b/service/docker_base/common.go deleted file mode 100644 index 1541fe4..0000000 --- a/service/docker_base/common.go +++ /dev/null @@ -1,24 +0,0 @@ -package docker_base - -import "github.com/IceWhaleTech/CasaOS/model" - -//过滤mysql关键字 -func MysqlFilter(c MysqlConfig, envs model.EnvArray) model.EnvArray { - for i := 0; i < len(envs); i++ { - switch envs[i].Value { - case "$MYSQL_HOST": - envs[i].Value = c.DataBaseHost - case "$MYSQL_PORT": - envs[i].Value = c.DataBasePort - case "$MYSQL_USERNAME": - envs[i].Value = c.DataBaseUser - case "$MYSQL_PASSWORD": - envs[i].Value = c.DataBasePassword - case "$MYSQL_DBNAME": - envs[i].Value = c.DataBaseDB - case "$MYSQL_HOST_AND_PORT": - envs[i].Value = c.DataBaseHost + ":" + c.DataBasePort - } - } - return envs -} diff --git a/service/docker_base/model.go b/service/docker_base/model.go deleted file mode 100644 index 3413577..0000000 --- a/service/docker_base/model.go +++ /dev/null @@ -1,9 +0,0 @@ -package docker_base - -type MysqlConfig struct { - DataBaseHost string `json:"database_host"` - DataBasePort string `json:"database_port"` - DataBaseUser string `json:"database_user"` - DataBasePassword string `json:"data_base_password"` - DataBaseDB string `json:"data_base_db"` -} diff --git a/service/docker_base/mysql.go b/service/docker_base/mysql.go deleted file mode 100644 index 565a18a..0000000 --- a/service/docker_base/mysql.go +++ /dev/null @@ -1,93 +0,0 @@ -package docker_base - -import ( - "context" - "github.com/docker/docker/api/types" - "github.com/docker/docker/api/types/container" - "github.com/docker/docker/api/types/filters" - "github.com/docker/docker/api/types/network" - client2 "github.com/docker/docker/client" - "time" -) - -//创建一个mysql数据库 -func MysqlCreate(mysqlConfig MysqlConfig, dbId string, cpuShares int64, memory int64) (string, error) { - const imageName = "mysql" - const imageVersion = "8" - const imageNet = "oasis" - - cli, err := client2.NewClientWithOpts(client2.FromEnv) - if err != nil { - return "", err - } - defer cli.Close() - _, err = cli.ImagePull(context.Background(), imageName+":"+imageVersion, types.ImagePullOptions{}) - - isExist := true - //检查到镜像才继续 - for isExist { - filter := filters.NewArgs() - filter.Add("before", imageName+":"+imageVersion) - list, e := cli.ImageList(context.Background(), types.ImageListOptions{Filters: filter}) - if e == nil && len(list) > 0 { - isExist = false - } - time.Sleep(time.Second) - } - - var envArr = []string{"MYSQL_ROOT_PASSWORD=" + mysqlConfig.DataBasePassword, "MYSQL_DATABASE=" + mysqlConfig.DataBaseDB} - - res := container.Resources{} - if cpuShares > 0 { - res.CPUShares = cpuShares - } - if memory > 0 { - res.Memory = memory << 20 - } - - rp := container.RestartPolicy{} - - rp.Name = "always" - - config := &container.Config{ - Image: imageName, - Labels: map[string]string{"version": imageVersion, "author": "official"}, - Env: envArr, - } - hostConfig := &container.HostConfig{Resources: res, RestartPolicy: rp, NetworkMode: container.NetworkMode(imageNet)} - - containerCreate, err := cli.ContainerCreate(context.Background(), - config, - hostConfig, - &network.NetworkingConfig{EndpointsConfig: map[string]*network.EndpointSettings{imageNet: {NetworkID: ""}}}, - nil, - dbId) - - containerId := containerCreate.ID - - //启动容器 - err = cli.ContainerStart(context.Background(), dbId, types.ContainerStartOptions{}) - if err != nil { - return containerId, err - } - - return containerId, nil - -} - -func MysqlDelete(dbId string) error { - - cli, err := client2.NewClientWithOpts(client2.FromEnv) - if err != nil { - return err - } - defer cli.Close() - err = cli.ContainerStop(context.Background(), dbId, nil) - if err != nil { - return err - } - - err = cli.ContainerRemove(context.Background(), dbId, types.ContainerRemoveOptions{}) - return err - -} diff --git a/service/docker_test.go b/service/docker_test.go deleted file mode 100644 index c0c99a6..0000000 --- a/service/docker_test.go +++ /dev/null @@ -1,50 +0,0 @@ -package service - -import ( - "fmt" - "testing" -) - -//func TestDockerImageInfo(t *testing.T) { -// //DockerImageInfo() -// -// address, err := net.ResolveTCPAddr("tcp", fmt.Sprintf("%s:0", "0.0.0.0")) -// if err != nil { -// fmt.Println(0, err) -// } -// -// listener, err := net.ListenTCP("tcp", address) -// if err != nil { -// fmt.Println(0, err) -// } -// -// defer listener.Close() -// fmt.Println(listener.Addr().(*net.TCPAddr).Port, nil) -// -//} - -//func TestDockerNetwork(t *testing.T) { -// DockerNetwork() -//} -// -//func TestDockerPull(t *testing.T) { -// DockerPull() -//} -// -//func TestDockerLog(t *testing.T) { -// DockerLog() -//} -//func TestDockerLogs(t *testing.T) { -// DockerLogs() -//} - -func TestDockerContainerStats(t *testing.T) { - fmt.Println(DockerContainerStats1()) -} - -//func TestDockerImageRemove(t *testing.T) { -// host, domain, tld := gotld.GetSubdomain("aaa.liru-05.top", 1) -// fmt.Println(host) -// fmt.Println(domain) -// fmt.Println(tld) -//} diff --git a/service/file.go b/service/file.go index af2490a..d68b662 100644 --- a/service/file.go +++ b/service/file.go @@ -19,9 +19,9 @@ import ( "sync" "time" + "github.com/IceWhaleTech/CasaOS-Common/utils/logger" "github.com/IceWhaleTech/CasaOS/model" "github.com/IceWhaleTech/CasaOS/pkg/utils/file" - "github.com/IceWhaleTech/CasaOS/pkg/utils/loger" "go.uber.org/zap" ) @@ -78,8 +78,8 @@ func (w *writer) Write(p []byte) (n int, err error) { return w.w.Write(p) } } -func FileOperate(k string) { +func FileOperate(k string) { list, ok := FileQueue.Load(k) if !ok { return @@ -103,10 +103,10 @@ func FileOperate(k string) { } err := os.Rename(v.From, temp.To+"/"+lastPath) if err != nil { - loger.Error("file move error", zap.Any("err", err)) + logger.Error("file move error", zap.Any("err", err)) err = file.MoveFile(v.From, temp.To+"/"+lastPath) if err != nil { - loger.Error("MoveFile error", zap.Any("err", err)) + logger.Error("MoveFile error", zap.Any("err", err)) continue } @@ -152,7 +152,6 @@ func CheckFileStatus() { } temp := item.(model.FileOperate) for i := 0; i < len(temp.Item); i++ { - if !temp.Item[i].Finished { size, err := file.GetFileOrDirSize(temp.To + "/" + filepath.Base(temp.Item[i].From)) if err != nil { @@ -166,7 +165,6 @@ func CheckFileStatus() { } else { total += temp.Item[i].ProcessedSize } - } temp.ProcessedSize = total FileQueue.Store(v, temp) diff --git a/service/model/o_container.go b/service/model/o_container.go deleted file mode 100644 index 69c32f7..0000000 --- a/service/model/o_container.go +++ /dev/null @@ -1,78 +0,0 @@ -/* - * @Author: LinkLeong link@icewhale.com - * @Date: 2022-05-13 18:15:46 - * @LastEditors: LinkLeong - * @LastEditTime: 2022-07-13 10:56:34 - * @FilePath: /CasaOS/service/model/o_container.go - * @Description: - * @Website: https://www.casaos.io - * Copyright (c) 2022 by icewhale, All Rights Reserved. - */ -package model - -const CONTAINERTABLENAME = "o_container" - -//Soon to be removed -type AppListDBModel struct { - CustomId string `gorm:"column:custom_id;primary_key" json:"custom_id"` - Title string `json:"title"` - // ScreenshotLink model.Strings `gorm:"type:json" json:"screenshot_link,omitempty"` - ScreenshotLink string `json:"screenshot_link"` - Slogan string `json:"slogan"` - Description string `json:"description"` - //Tags model.Strings `gorm:"type:json" json:"tags"` - Tags string `json:"tags"` - Icon string `json:"icon"` - Version string `json:"version"` - ContainerId string `json:"container_id,omitempty"` - Image string `json:"image,omitempty"` - Index string `json:"index"` - CreatedAt string `gorm:"<-:create;autoCreateTime" json:"created_at"` - UpdatedAt string `gorm:"<-:create;<-:update;autoUpdateTime" json:"updated_at"` - //Port string `json:"port,omitempty"` - PortMap string `json:"port_map"` - Label string `json:"label"` - EnableUPNP bool `json:"enable_upnp"` - Envs string `json:"envs"` - Ports string `json:"ports"` - Volumes string `json:"volumes"` - Devices string `json:"devices"` - //Envs []model.Env `json:"envs"` - //Ports []model.PortMap `gorm:"type:json" json:"ports"` - //Volumes []model.PathMap `gorm:"type:json" json:"volumes"` - //Devices []model.PathMap `gorm:"type:json" json:"device"` - Position bool `json:"position"` - NetModel string `json:"net_model"` - CpuShares int64 `json:"cpu_shares"` - Memory int64 `json:"memory"` - Restart string `json:"restart"` - //Rely model.MapStrings `gorm:"type:json" json:"rely"` //[{"mysql":"id"},{"mysql":"id"}] - Origin string `json:"origin"` - HostName string `json:"host_name"` - Privileged bool `json:"privileged"` - CapAdd string `json:"cap_add"` - Cmd string `gorm:"type:json" json:"cmd"` -} - -func (p *AppListDBModel) TableName() string { - return "o_container" -} - -type MyAppList struct { - Id string `json:"id"` - Name string `json:"name"` - Icon string `json:"icon"` - State string `json:"state"` - CustomId string `gorm:"column:custom_id;primary_key" json:"custom_id"` - Index string `json:"index"` - //Order string `json:"order"` - Port string `json:"port"` - Slogan string `json:"slogan"` - Type string `json:"type"` - //Rely model.MapStrings `json:"rely"` //[{"mysql":"id"},{"mysql":"id"}] - Image string `json:"image"` - Volumes string `json:"volumes"` - Latest bool `json:"latest"` - Host string `json:"host"` - Protocol string `json:"protocol"` -} diff --git a/service/model/o_rely.go b/service/model/o_rely.go index a28ecd1..dd86fe5 100644 --- a/service/model/o_rely.go +++ b/service/model/o_rely.go @@ -1,33 +1,17 @@ package model import ( - "database/sql/driver" - "encoding/json" - "github.com/IceWhaleTech/CasaOS/service/docker_base" "time" ) type RelyDBModel struct { - Id uint `gorm:"column:id;primary_key" json:"id"` - CustomId string ` json:"custom_id"` - ContainerCustomId string `json:"container_custom_id"` - Config MysqlConfigs `json:"config"` - ContainerId string `json:"container_id,omitempty"` - Type int `json:"type"` //目前暂未使用 - CreatedAt time.Time `gorm:"<-:create" json:"created_at"` - UpdatedAt time.Time `gorm:"<-:create;<-:update" json:"updated_at"` -} - -/****************使gorm支持[]string结构*******************/ -type MysqlConfigs docker_base.MysqlConfig - -func (c MysqlConfigs) Value() (driver.Value, error) { - b, err := json.Marshal(c) - return string(b), err -} - -func (c *MysqlConfigs) Scan(input interface{}) error { - return json.Unmarshal(input.([]byte), c) + Id uint `gorm:"column:id;primary_key" json:"id"` + CustomId string ` json:"custom_id"` + ContainerCustomId string `json:"container_custom_id"` + ContainerId string `json:"container_id,omitempty"` + Type int `json:"type"` // 目前暂未使用 + CreatedAt time.Time `gorm:"<-:create" json:"created_at"` + UpdatedAt time.Time `gorm:"<-:create;<-:update" json:"updated_at"` } /****************使gorm支持[]string结构*******************/ diff --git a/service/notify.go b/service/notify.go index 5e31ebe..1571f28 100644 --- a/service/notify.go +++ b/service/notify.go @@ -5,6 +5,7 @@ import ( "fmt" "time" + notifyCommon "github.com/IceWhaleTech/CasaOS-Common/model/notify" model2 "github.com/IceWhaleTech/CasaOS/model" "github.com/IceWhaleTech/CasaOS/model/notify" "github.com/IceWhaleTech/CasaOS/service/model" @@ -15,24 +16,26 @@ import ( "gorm.io/gorm" ) -var NotifyMsg chan notify.Message -var ClientCount int = 0 +var ( + NotifyMsg chan notify.Message + ClientCount int +) type NotifyServer interface { GetLog(id string) model.AppNotify AddLog(log model.AppNotify) UpdateLog(log model.AppNotify) - UpdateLogByCustomId(log model.AppNotify) + UpdateLogByCustomID(log model.AppNotify) DelLog(id string) GetList(c int) (list []model.AppNotify) MarkRead(id string, state int) // SendText(m model.AppNotify) - SendUninstallAppBySocket(app notify.Application) + SendUninstallAppBySocket(app notifyCommon.Application) SendNetInfoBySocket(netList []model2.IOCountersStat) SendCPUInfoBySocket(cpu map[string]interface{}) SendMemInfoBySocket(mem map[string]interface{}) SendFileOperateNotify(nowSend bool) - SendInstallAppBySocket(app notify.Application) + SendInstallAppBySocket(app notifyCommon.Application) SendAllHardwareStatusBySocket(mem map[string]interface{}, cpu map[string]interface{}, netList []model2.IOCountersStat) SendStorageBySocket(message notify.StorageMessage) SendNotify(path string, message map[string]interface{}) @@ -62,7 +65,6 @@ func (i *notifyServer) SendNotify(path string, message map[string]interface{}) { notify.Msg = msg NotifyMsg <- notify - } func (i *notifyServer) SendStorageBySocket(message notify.StorageMessage) { @@ -80,8 +82,8 @@ func (i *notifyServer) SendStorageBySocket(message notify.StorageMessage) { NotifyMsg <- notify } -func (i *notifyServer) SendAllHardwareStatusBySocket(mem map[string]interface{}, cpu map[string]interface{}, netList []model2.IOCountersStat) { +func (i *notifyServer) SendAllHardwareStatusBySocket(mem map[string]interface{}, cpu map[string]interface{}, netList []model2.IOCountersStat) { body := make(map[string]interface{}) body["sys_mem"] = mem @@ -104,12 +106,10 @@ func (i *notifyServer) SendAllHardwareStatusBySocket(mem map[string]interface{}, notify.Msg = msg NotifyMsg <- notify - } // Send periodic broadcast messages func (i *notifyServer) SendFileOperateNotify(nowSend bool) { - if nowSend { len := 0 @@ -259,7 +259,6 @@ func (i *notifyServer) SendFileOperateNotify(nowSend bool) { time.Sleep(time.Second * 3) } } - } func (i *notifyServer) SendMemInfoBySocket(mem map[string]interface{}) { @@ -278,7 +277,7 @@ func (i *notifyServer) SendMemInfoBySocket(mem map[string]interface{}) { NotifyMsg <- notify } -func (i *notifyServer) SendInstallAppBySocket(app notify.Application) { +func (i *notifyServer) SendInstallAppBySocket(app notifyCommon.Application) { body := make(map[string]interface{}) body["data"] = app @@ -309,6 +308,7 @@ func (i *notifyServer) SendCPUInfoBySocket(cpu map[string]interface{}) { NotifyMsg <- notify } + func (i *notifyServer) SendNetInfoBySocket(netList []model2.IOCountersStat) { body := make(map[string]interface{}) body["data"] = netList @@ -325,7 +325,7 @@ func (i *notifyServer) SendNetInfoBySocket(netList []model2.IOCountersStat) { NotifyMsg <- notify } -func (i *notifyServer) SendUninstallAppBySocket(app notify.Application) { +func (i *notifyServer) SendUninstallAppBySocket(app notifyCommon.Application) { body := make(map[string]interface{}) body["data"] = app @@ -358,17 +358,20 @@ func (i *notifyServer) AddLog(log model.AppNotify) { func (i *notifyServer) UpdateLog(log model.AppNotify) { i.db.Save(&log) } -func (i *notifyServer) UpdateLogByCustomId(log model.AppNotify) { + +func (i *notifyServer) UpdateLogByCustomID(log model.AppNotify) { if len(log.CustomId) == 0 { return } i.db.Model(&model.AppNotify{}).Select("*").Where("custom_id = ? ", log.CustomId).Updates(log) } + func (i *notifyServer) GetLog(id string) model.AppNotify { var log model.AppNotify i.db.Where("custom_id = ? ", id).First(&log) return log } + func (i *notifyServer) MarkRead(id string, state int) { if id == "0" { i.db.Model(&model.AppNotify{}).Where("1 = ?", 1).Update("state", state) @@ -376,6 +379,7 @@ func (i *notifyServer) MarkRead(id string, state int) { } i.db.Model(&model.AppNotify{}).Where("id = ? ", id).Update("state", state) } + func (i *notifyServer) DelLog(id string) { var log model.AppNotify i.db.Where("custom_id = ?", id).Delete(&log) @@ -444,10 +448,9 @@ func SendMeg() { // } func (i *notifyServer) GetSystemTempMap() map[string]interface{} { - return i.SystemTempMap - } + func NewNotifyService(db *gorm.DB) NotifyServer { return ¬ifyServer{db: db, SystemTempMap: make(map[string]interface{})} } diff --git a/service/service.go b/service/service.go index 3858fef..a215d56 100644 --- a/service/service.go +++ b/service/service.go @@ -21,14 +21,13 @@ var Cache *cache.Cache var MyService Repository -var WebSocketConns []*websocket.Conn -var NewVersionApp map[string]string -var SocketRun bool +var ( + WebSocketConns []*websocket.Conn + SocketRun bool +) type Repository interface { - App() AppService - //User() UserService - Docker() DockerService + // User() UserService Casa() CasaService Notify() NotifyServer Rely() RelyService @@ -39,7 +38,6 @@ type Repository interface { } func NewService(db *gorm.DB, RuntimePath string) Repository { - gatewayManagement, err := external.NewManagementService(RuntimePath) if err != nil && len(RuntimePath) > 0 { panic(err) @@ -47,8 +45,6 @@ func NewService(db *gorm.DB, RuntimePath string) Repository { return &store{ gateway: gatewayManagement, - app: NewAppService(db), - docker: NewDockerService(), casa: NewCasaService(), notify: NewNotifyService(db), rely: NewRelyService(db), @@ -60,8 +56,6 @@ func NewService(db *gorm.DB, RuntimePath string) Repository { type store struct { db *gorm.DB - app AppService - docker DockerService casa CasaService notify NotifyServer rely RelyService @@ -74,9 +68,11 @@ type store struct { func (c *store) Gateway() external.ManagementService { return c.gateway } + func (s *store) Connections() ConnectionsService { return s.connections } + func (s *store) Shares() SharesService { return s.shares } @@ -88,19 +84,11 @@ func (c *store) Rely() RelyService { func (c *store) System() SystemService { return c.system } + func (c *store) Notify() NotifyServer { - return c.notify } -func (c *store) App() AppService { - return c.app -} - -func (c *store) Docker() DockerService { - return c.docker -} - func (c *store) Casa() CasaService { return c.casa } diff --git a/service/system.go b/service/system.go index e43fdf2..dcffa3e 100644 --- a/service/system.go +++ b/service/system.go @@ -12,12 +12,12 @@ import ( "strings" "time" + "github.com/IceWhaleTech/CasaOS-Common/utils/logger" "github.com/IceWhaleTech/CasaOS/model" "github.com/IceWhaleTech/CasaOS/pkg/config" command2 "github.com/IceWhaleTech/CasaOS/pkg/utils/command" "github.com/IceWhaleTech/CasaOS/pkg/utils/common_err" "github.com/IceWhaleTech/CasaOS/pkg/utils/file" - "github.com/IceWhaleTech/CasaOS/pkg/utils/loger" "github.com/shirou/gopsutil/v3/cpu" "github.com/shirou/gopsutil/v3/disk" "github.com/shirou/gopsutil/v3/host" @@ -66,6 +66,7 @@ func (c *systemService) GetMacAddress() (string, error) { inter := interfaces[0] return inter.HardwareAddr, nil } + func (c *systemService) MkdirAll(path string) (int, error) { _, err := os.Stat(path) if err == nil { @@ -227,15 +228,15 @@ func (s *systemService) UpdateSystemVersion(version string) { os.Remove(config.AppInfo.LogPath + "/upgrade.log") } file.CreateFile(config.AppInfo.LogPath + "/upgrade.log") - //go command2.OnlyExec("curl -fsSL https://raw.githubusercontent.com/LinkLeong/casaos-alpha/main/update.sh | bash") + // go command2.OnlyExec("curl -fsSL https://raw.githubusercontent.com/LinkLeong/casaos-alpha/main/update.sh | bash") if len(config.ServerInfo.UpdateUrl) > 0 { go command2.OnlyExec("curl -fsSL " + config.ServerInfo.UpdateUrl + " | bash") } else { go command2.OnlyExec("curl -fsSL https://get.casaos.io/update | bash") } - //s.log.Error(config.AppInfo.ProjectPath + "/shell/tool.sh -r " + version) - //s.log.Error(command2.ExecResultStr(config.AppInfo.ProjectPath + "/shell/tool.sh -r " + version)) + // s.log.Error(config.AppInfo.ProjectPath + "/shell/tool.sh -r " + version) + // s.log.Error(command2.ExecResultStr(config.AppInfo.ProjectPath + "/shell/tool.sh -r " + version)) } func (s *systemService) UpdateAssist() { @@ -328,17 +329,17 @@ func GetCPUThermalZone() string { name = strings.TrimSuffix(string(file.ReadFullFile(path+"/type")), "\n") for _, s := range cpu_types { if strings.HasPrefix(name, s) { - loger.Info(fmt.Sprintf("CPU thermal zone found: %s, path: %s.", name, path)) + logger.Info(fmt.Sprintf("CPU thermal zone found: %s, path: %s.", name, path)) Cache.SetDefault(keyName, path) return path } } } else { - if len(name) > 0 { //proves at least one zone - loger.Warn("CPU thermal zone not matched. Default to thermal_zone0.") + if len(name) > 0 { // proves at least one zone + logger.Info("CPU thermal zone not matched. Default to thermal_zone0.") path = stub + "0" } else { - loger.Error("No CPU thermal zones found. CPU temp will not be displayed.") + logger.Error("No CPU thermal zones found. CPU temp will not be displayed.") path = "" } break diff --git a/types/system.go b/types/system.go index dbef4f6..73f7ab4 100644 --- a/types/system.go +++ b/types/system.go @@ -19,6 +19,6 @@ */ package types -const CURRENTVERSION = "0.3.8" +const CURRENTVERSION = "0.4.0" const BODY = " "