From 802249b9e0ac56ff25b27ba4390ceebdc12ddcc0 Mon Sep 17 00:00:00 2001 From: Jesus Date: Mon, 30 Dec 2024 19:11:54 +0100 Subject: [PATCH 01/20] Add python test --- backend/cmd/testpython.py | 110 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 110 insertions(+) create mode 100644 backend/cmd/testpython.py diff --git a/backend/cmd/testpython.py b/backend/cmd/testpython.py new file mode 100644 index 000000000..8c199badf --- /dev/null +++ b/backend/cmd/testpython.py @@ -0,0 +1,110 @@ +import os +import json + +def validate_json_structure(data): + errors = [] + + + if "board_id" in data: + if not isinstance(data["board_id"], int): + errors.append(f"'board_id' debe ser un entero, pero se encontró: {type(data['board_id']).__name__}.") + + if "board_ip" in data: + if not isinstance(data["board_ip"], str): + errors.append(f"'board_ip' debe ser una cadena, pero se encontró: {type(data['board_ip']).__name__}.") + + + if "measurements" in data: + if not isinstance(data["measurements"], list): + errors.append("La clave 'measurements' debe ser una lista.") + else: + for measurement in data["measurements"]: + if isinstance(measurement, dict): + required_keys = ["id", "name", "type", "podUnits", "displayUnits"] + for key in required_keys: + if key not in measurement: + errors.append(f"Falta la clave '{key}' en un objeto de 'measurements'.") + if "id" in measurement and not isinstance(measurement["id"], str): + errors.append(f"El 'id' debe ser una cadena en: {measurement}") + if "name" in measurement and not isinstance(measurement["name"], str): + errors.append(f"El 'name' debe ser una cadena en: {measurement}") + if "type" in measurement and not isinstance(measurement["type"], str): + errors.append(f"El 'type' debe ser una cadena en: {measurement}") + if "safeRange" in measurement and not isinstance(measurement.get("safeRange", []), list): + errors.append(f"'safeRange' debe ser una lista en: {measurement}") + if "warningRange" in measurement and not isinstance(measurement.get("warningRange", []), list): + errors.append(f"'warningRange' debe ser una lista en: {measurement}") + if "displayUnits" in measurement and not isinstance(measurement["displayUnits"], str): + errors.append(f"El 'podUnits' debe ser una cadena en: {measurement}") + if "podUnits" in measurement and not isinstance(measurement["podUnits"], str): + errors.append(f"El 'podUnits' debe ser una cadena en: {measurement}") #esto se puede quitar (json 516) + elif not isinstance(measurement, str): + errors.append("Cada elemento en 'measurements' debe ser un objeto o una cadena (nombre de archivo).") + + + if "packets" in data: + if not isinstance(data["packets"], list): + errors.append("La clave 'packets' debe ser una lista.") + else: + for packet in data["packets"]: + if isinstance(packet, dict): + required_keys = ["id", "name", "type","variable"] + for key in required_keys: + if key not in packet: + errors.append(f"Falta la clave '{key}' en un objeto de 'packets'.") + if "id" in packet and not isinstance(packet["id"], str): + errors.append(f"El 'id' debe ser una cadena en: {packet}") + if "name" in packet and not isinstance(packet["name"], str): + errors.append(f"El 'name' debe ser una cadena en: {packet}") + if "type" in packet and not isinstance(packet["type"], str): + errors.append(f"El 'type' debe ser una cadena en: {packet}") + if "variables" in packet: + if not isinstance(packet["variables"], list): + errors.append(f"'variables' debe ser una lista en: {packet}") + else: + for variable in packet["variables"]: + if not isinstance(variable, dict): + errors.append(f"Cada elemento en 'variables' debe ser un objeto en: {packet}") + if "name" not in variable: + errors.append(f"Falta la clave 'name' en un objeto de 'variables' en: {packet}") + elif not isinstance(packet, str): + errors.append("Cada elemento en 'packets' debe ser un objeto o una cadena (nombre de archivo).") + + return errors + +def validate_json_folder(folder_path): + + boards_file_path = os.path.join(folder_path, "boards.json") + + try: + + with open(boards_file_path, 'r') as boards_file: + boards_data = json.load(boards_file) + boards = boards_data.get("boards", {}) + except json.JSONDecodeError as e: + print(f"Error al decodificar JSON en {boards_file_path}: {e}") + return + except Exception as e: + print(f"Error al procesar el archivo {boards_file_path}: {e}") + return + + for board_name, board_file_path in boards.items(): + full_path = os.path.join(folder_path, board_file_path) + try: + with open(full_path, 'r') as board_file: + data = json.load(board_file) + errors = validate_json_structure(data) + if errors: + print(f"Errores encontrados en {full_path} para la placa '{board_name}':") + for error in errors: + print(f"- {error}") + else: + print(f"{full_path} para la placa '{board_name}' está bien estructurado.") + except json.JSONDecodeError as e: + print(f"Error al decodificar JSON en {full_path}: {e}") + except Exception as e: + print(f"Error al procesar el archivo {full_path}: {e}") + + +if __name__ == "__main__": + validate_json_folder("./JSON_ADE/") From df3c690d994cd1af086d0d6daf1b40f3059d353e Mon Sep 17 00:00:00 2001 From: Jesus Date: Mon, 30 Dec 2024 21:15:50 +0100 Subject: [PATCH 02/20] Python test --- backend/cmd/testpython.py | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/backend/cmd/testpython.py b/backend/cmd/testpython.py index 8c199badf..955e63f6e 100644 --- a/backend/cmd/testpython.py +++ b/backend/cmd/testpython.py @@ -1,5 +1,7 @@ import os import json +from collections import Counter + def validate_json_structure(data): errors = [] @@ -72,15 +74,24 @@ def validate_json_structure(data): return errors + + def validate_json_folder(folder_path): - boards_file_path = os.path.join(folder_path, "boards.json") - + try: - with open(boards_file_path, 'r') as boards_file: boards_data = json.load(boards_file) boards = boards_data.get("boards", {}) + + + board_keys = list(boards.keys()) + duplicate_keys = [key for key in board_keys if board_keys.count(key) > 1] + + if duplicate_keys: + print(f"Error: El archivo boards.json contiene claves duplicadas: {', '.join(duplicate_keys)}") + return + except json.JSONDecodeError as e: print(f"Error al decodificar JSON en {boards_file_path}: {e}") return @@ -88,6 +99,7 @@ def validate_json_folder(folder_path): print(f"Error al procesar el archivo {boards_file_path}: {e}") return + for board_name, board_file_path in boards.items(): full_path = os.path.join(folder_path, board_file_path) try: @@ -103,8 +115,14 @@ def validate_json_folder(folder_path): except json.JSONDecodeError as e: print(f"Error al decodificar JSON en {full_path}: {e}") except Exception as e: - print(f"Error al procesar el archivo {full_path}: {e}") + print(f"Error al procesar el archivo {full_path}: {e}") + + +if os.path.exists('./JSON_ADE/'): + print("La carpeta JSON_ADE existe") +else: + print("La carpeta JSON_ADE no existe") if __name__ == "__main__": validate_json_folder("./JSON_ADE/") From d212e13396ab0b663bcf1575ede5870802c77af5 Mon Sep 17 00:00:00 2001 From: Jesus Date: Sun, 5 Jan 2025 17:15:43 +0100 Subject: [PATCH 03/20] Func modifications --- packet-sender/PacketGenerator.go | 52 ++++++++++---------------------- 1 file changed, 16 insertions(+), 36 deletions(-) diff --git a/packet-sender/PacketGenerator.go b/packet-sender/PacketGenerator.go index 53693aaf2..125d9057f 100644 --- a/packet-sender/PacketGenerator.go +++ b/packet-sender/PacketGenerator.go @@ -10,9 +10,7 @@ import ( "strings" "time" - excelAdapter "github.com/HyperloopUPV-H8/h9-backend/pkg/excel_adapter" - "github.com/HyperloopUPV-H8/h9-backend/pkg/excel_adapter/internals" - "github.com/HyperloopUPV-H8/h9-backend/pkg/excel_adapter/models" + "github.com/HyperloopUPV-H8/software/backend/internal/adj" ) type PacketGenerator struct { @@ -20,49 +18,31 @@ type PacketGenerator struct { } func New() PacketGenerator { - excelAdapter := excelAdapter.New(excelAdapter.ExcelAdapterConfig{ - Download: internals.DownloadConfig{ - Id: "1NyNaAOw_6iWtnCpEg73AtSSFx1fMdhPRmmdOhjgjCZI", - Path: ".", - Name: "ade.xlsx", - }, - Parse: internals.ParseConfig{ - GlobalSheetPrefix: "GLOBAL ", - BoardSheetPrefix: "BOARD ", - TablePrefix: "[TABLE] ", - Global: internals.GlobalParseConfig{ - AddressTable: "addresses", - BackendKey: "Backend", - BLCUAddressKey: "BLCU", - UnitsTable: "units", - PortsTable: "ports", - BoardIdsTable: "board_ids", - MessageIdsTable: "message_ids", - }, - }, - }) + adj, err := adj.NewADJ() + if err != nil { + log.Fatalf("Failed to load ADJ: %v\n", err) + } - boards := excelAdapter.GetBoards() packets := make([]Packet, 0) - for _, board := range boards { + for _, board := range adj.Boards { for _, packet := range board.Packets { - if packet.Description.Type != "data" { + if packet.Type != "data" { continue } - id, err := strconv.ParseUint(packet.Description.ID, 10, 16) + id, err := strconv.ParseUint(packet.Id, 10, 16) if err != nil { log.Fatalf("data transfer: AddPacket: %s\n", err) } packets = append(packets, Packet{ ID: uint16(id), - Name: packet.Description.Name, + Name: packet.Name, HexValue: "", Count: 0, CycleTime: 0, - Measurements: getMeasurements(packet.Values), + Measurements: getMeasurements(packet.Variables), }) } } @@ -212,19 +192,19 @@ func writeNumberAsBytes(number float64, numberType string, buff *bytes.Buffer) { } } -func (pg *PacketGenerator) AddPacket(boardName string, packet models.Packet) { - if packet.Description.Type != "data" { +func (pg *PacketGenerator) AddPacket(boardName string, packet adj.Packet) { + if packet.Type != "data" { return } - id, err := strconv.ParseUint(packet.Description.ID, 10, 16) + id, err := strconv.ParseUint(packet.Id, 10, 16) if err != nil { log.Fatalf("data transfer: AddPacket: %s\n", err) } pg.packets = append(pg.packets, Packet{ ID: uint16(id), - Name: packet.Description.Name, + Name: packet.Name, HexValue: "", Count: 0, CycleTime: 0, @@ -233,7 +213,7 @@ func (pg *PacketGenerator) AddPacket(boardName string, packet models.Packet) { } -func getMeasurements(values []models.Value) []Measurement { +func getMeasurements(values []adj.Measurement) []Measurement { measurements := make([]Measurement, 0, len(values)) for _, value := range values { measurements = append(measurements, @@ -252,7 +232,7 @@ func getMeasurements(values []models.Value) []Measurement { return measurements } -func parseRange(literal string) []float64 { +func parseRange(literal string) []float64 { // adaptar con rangos del ADJ?? if literal == "" { return make([]float64, 0) } From a8930cb0f4aa61807c67872388da0bfaa298a4f9 Mon Sep 17 00:00:00 2001 From: Jesus Date: Mon, 6 Jan 2025 19:43:48 +0100 Subject: [PATCH 04/20] Module import change --- packet-sender/PacketGenerator.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packet-sender/PacketGenerator.go b/packet-sender/PacketGenerator.go index 125d9057f..04f9a3ed2 100644 --- a/packet-sender/PacketGenerator.go +++ b/packet-sender/PacketGenerator.go @@ -10,7 +10,7 @@ import ( "strings" "time" - "github.com/HyperloopUPV-H8/software/backend/internal/adj" + "github.com/HyperloopUPV-H8/h9-backend/internal/adj" ) type PacketGenerator struct { From bf3d23b588567a926be053fcc710041e70d18fa7 Mon Sep 17 00:00:00 2001 From: msanlli Date: Wed, 8 Jan 2025 16:26:36 +0100 Subject: [PATCH 05/20] tidy mod --- backend/cmd/main.go | 2 +- backend/go.mod | 22 +------- backend/go.sum | 126 -------------------------------------------- go.work.sum | 1 + 4 files changed, 3 insertions(+), 148 deletions(-) diff --git a/backend/cmd/main.go b/backend/cmd/main.go index 01a35b5b2..a8ad0e2a9 100644 --- a/backend/cmd/main.go +++ b/backend/cmd/main.go @@ -558,7 +558,7 @@ func getIPIPfilter() string { return "ip[9] == 4" } -func getUDPFilter(addrs []net.IP, backendAddr net.IP, port uint16) string { +func getUDPFilter(addrs []net.IP, backendAddr net.IP, _ uint16) string { udpPort := "udp" // TODO use proper ports for the filter srcUdpAddrs := common.Map(addrs, func(addr net.IP) string { return fmt.Sprintf("(src host %s)", addr) diff --git a/backend/go.mod b/backend/go.mod index ede0ed29d..4b458fac8 100644 --- a/backend/go.mod +++ b/backend/go.mod @@ -3,7 +3,6 @@ module github.com/HyperloopUPV-H8/h9-backend go 1.21.3 require ( - github.com/HyperloopUPV-H8/ade-linter v0.0.0-20230530153315-3379f05a664f github.com/go-git/go-git/v5 v5.12.0 github.com/google/gopacket v1.1.19 github.com/google/uuid v1.3.0 @@ -11,16 +10,11 @@ require ( github.com/jmaralo/sntp v0.0.0-20240116111937-45a0a3419272 github.com/pelletier/go-toml/v2 v2.0.7 github.com/pin/tftp/v3 v3.0.0 - github.com/pkg/errors v0.9.1 github.com/rs/zerolog v1.29.0 - github.com/xuri/excelize/v2 v2.7.1 golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1 - google.golang.org/api v0.114.0 ) require ( - cloud.google.com/go/compute v1.19.1 // indirect - cloud.google.com/go/compute/metadata v0.2.3 // indirect dario.cat/mergo v1.0.0 // indirect github.com/Microsoft/go-winio v0.6.1 // indirect github.com/ProtonMail/go-crypto v1.0.0 // indirect @@ -30,33 +24,19 @@ require ( github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect github.com/go-git/go-billy/v5 v5.5.0 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect - github.com/golang/protobuf v1.5.3 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.2.3 // indirect - github.com/googleapis/gax-go/v2 v2.7.1 // indirect github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect github.com/kevinburke/ssh_config v1.2.0 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.17 // indirect - github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 // indirect github.com/pjbgf/sha1cd v0.3.0 // indirect - github.com/richardlehane/mscfb v1.0.4 // indirect - github.com/richardlehane/msoleps v1.0.3 // indirect + github.com/pkg/errors v0.9.1 // indirect github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 // indirect github.com/skeema/knownhosts v1.2.2 // indirect github.com/xanzy/ssh-agent v0.3.3 // indirect - github.com/xuri/efp v0.0.0-20220603152613-6918739fd470 // indirect - github.com/xuri/nfp v0.0.0-20220409054826-5e722a1d9e22 // indirect - go.opencensus.io v0.24.0 // indirect golang.org/x/crypto v0.21.0 // indirect golang.org/x/mod v0.12.0 // indirect - golang.org/x/oauth2 v0.7.0 // indirect golang.org/x/sys v0.18.0 // indirect - golang.org/x/text v0.14.0 // indirect golang.org/x/tools v0.13.0 // indirect - google.golang.org/appengine v1.6.7 // indirect - google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 // indirect - google.golang.org/grpc v1.56.3 // indirect - google.golang.org/protobuf v1.30.0 // indirect gopkg.in/warnings.v0 v0.1.2 // indirect ) diff --git a/backend/go.sum b/backend/go.sum index f6f8c532f..2be23a1bd 100644 --- a/backend/go.sum +++ b/backend/go.sum @@ -1,16 +1,5 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.110.0 h1:Zc8gqp3+a9/Eyph2KDmcGaPtbKRIoqq4YTlL4NMD0Ys= -cloud.google.com/go/compute v1.19.1 h1:am86mquDUgjGNWxiGn+5PGLbmgiWXlE/yNWpIpNvuXY= -cloud.google.com/go/compute v1.19.1/go.mod h1:6ylj3a05WF8leseCdIf77NK0g1ey+nj5IKd5/kvShxE= -cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= -cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= -cloud.google.com/go/longrunning v0.4.1 h1:v+yFJOfKC3yZdY6ZUI933pIYdhyhV8S3NpWrXWmg7jM= -cloud.google.com/go/longrunning v0.4.1/go.mod h1:4iWDqhBZ70CvZ6BfETbvam3T8FMvLK+eFj0E6AaRQTo= dario.cat/mergo v1.0.0 h1:AGCNq9Evsj31mOgNPcLyXc+4PNABt905YmuqPYYpBWk= dario.cat/mergo v1.0.0/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/HyperloopUPV-H8/ade-linter v0.0.0-20230530153315-3379f05a664f h1:WxWQzMMuGKBTZZ1c/z+4cHckI3FxOpdoBl6kUpu1L/o= -github.com/HyperloopUPV-H8/ade-linter v0.0.0-20230530153315-3379f05a664f/go.mod h1:y2zH0pjAkyEirrmjDq/O3lg03whnTSk5KPtQwJLr0Q4= github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY= github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= @@ -21,12 +10,9 @@ github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be/go.mod h1:ySMOLuW github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= github.com/bwesterb/go-ristretto v1.2.3/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cloudflare/circl v1.3.3/go.mod h1:5XYMA4rFBvNIrhs50XuiBJ15vF2pZn4nnUKZrLbUZFA= github.com/cloudflare/circl v1.3.7 h1:qlCDlTPz2n9fu58M0Nh1J/JzcFpfgkFHHX3O35r5vcU= github.com/cloudflare/circl v1.3.7/go.mod h1:sRTcRWXGLrKw6yIGJ+l7amYJFfAXbZG0kBSc8r4zxgA= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/coreos/go-systemd/v22 v22.3.3-0.20220203105225-a9a7ef127534/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/cyphar/filepath-securejoin v0.2.4 h1:Ugdm7cg7i6ZK6x3xDF1oEu1nfkyfH53EtKeQYTC3kyg= github.com/cyphar/filepath-securejoin v0.2.4/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= @@ -37,10 +23,6 @@ github.com/elazarl/goproxy v0.0.0-20230808193330-2592e75ae04a h1:mATvB/9r/3gvcej github.com/elazarl/goproxy v0.0.0-20230808193330-2592e75ae04a/go.mod h1:Ro8st/ElPeALwNFlcTpWmkr6IoMFfkjXAvTHpevnDsM= github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= -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= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs= github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw= github.com/gliderlabs/ssh v0.3.7 h1:iV3Bqi942d9huXnzEF2Mt+CY9gLu8DNM4Obd+8bODRE= @@ -54,42 +36,14 @@ github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399/go.mod github.com/go-git/go-git/v5 v5.12.0 h1:7Md+ndsjrzZxbddRDZjF14qK+NN56sy6wkqaVrjZtys= github.com/go-git/go-git/v5 v5.12.0/go.mod h1:FTM9VKtnI2m65hNI/TenDDDnUf2Q9FHnXYjuz9i5OEY= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= -github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= -github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= -github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= -github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= -github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= -github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gopacket v1.1.19 h1:ves8RnFZPGiFnTS0uPQStjwru6uO6h+nlr9j6fL7kF8= github.com/google/gopacket v1.1.19/go.mod h1:iJ8V8n6KS+z2U1A8pUwu8bW5SyEMkXJB8Yo/Vo+TKTo= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/enterprise-certificate-proxy v0.2.3 h1:yk9/cqRKtT9wXZSsRH9aurXEpJX+U6FLtpYTdC3R06k= -github.com/googleapis/enterprise-certificate-proxy v0.2.3/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= -github.com/googleapis/gax-go/v2 v2.7.1 h1:gF4c0zjUP2H/s/hEGyLA3I0fA2ZWjzYiONAD6cvPr8A= -github.com/googleapis/gax-go/v2 v2.7.1/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI= 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/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A= @@ -112,8 +66,6 @@ github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27k github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 h1:RWengNIwukTxcDr9M+97sNutRR1RKhG96O6jWumTTnw= -github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8= github.com/onsi/gomega v1.27.10 h1:naR28SdDFlqrG6kScpT8VWpu1xWY5nJRCF3XaYyBjhI= github.com/onsi/gomega v1.27.10/go.mod h1:RsS8tutOdbdgzbPtzzATp12yT7kM5I5aElG3evPbQ0M= github.com/pelletier/go-toml/v2 v2.0.7 h1:muncTPStnKRos5dpVKULv2FVd4bMOhNePj9CjgDb8Us= @@ -126,12 +78,6 @@ github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/richardlehane/mscfb v1.0.4 h1:WULscsljNPConisD5hR0+OyZjwK46Pfyr6mPu5ZawpM= -github.com/richardlehane/mscfb v1.0.4/go.mod h1:YzVpcZg9czvAuhk9T+a3avCpcFPMUWm7gK3DypaEsUk= -github.com/richardlehane/msoleps v1.0.1/go.mod h1:BWev5JBpU9Ko2WAgmZEuiz4/u3ZYTKbjLycmwiWUfWg= -github.com/richardlehane/msoleps v1.0.3 h1:aznSZzrwYRl3rLKRT3gUk9am7T/mLNSnJINvN0AQoVM= -github.com/richardlehane/msoleps v1.0.3/go.mod h1:BWev5JBpU9Ko2WAgmZEuiz4/u3ZYTKbjLycmwiWUfWg= github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= github.com/rs/xid v1.4.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= @@ -154,72 +100,42 @@ github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsT github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/xanzy/ssh-agent v0.3.3 h1:+/15pJfg/RsTxqYcX6fHqOXZwwMP+2VyYWJeWM2qQFM= github.com/xanzy/ssh-agent v0.3.3/go.mod h1:6dzNDKs0J9rVPHPhaGCukekBHKqfl+L3KghI1Bc68Uw= -github.com/xuri/efp v0.0.0-20220603152613-6918739fd470 h1:6932x8ltq1w4utjmfMPVj09jdMlkY0aiA6+Skbtl3/c= -github.com/xuri/efp v0.0.0-20220603152613-6918739fd470/go.mod h1:ybY/Jr0T0GTCnYjKqmdwxyxn2BQf2RcQIIvex5QldPI= -github.com/xuri/excelize/v2 v2.7.1 h1:gm8q0UCAyaTt3MEF5wWMjVdmthm2EHAWesGSKS9tdVI= -github.com/xuri/excelize/v2 v2.7.1/go.mod h1:qc0+2j4TvAUrBw36ATtcTeC1VCM0fFdAXZOmcF4nTpY= -github.com/xuri/nfp v0.0.0-20220409054826-5e722a1d9e22 h1:OAmKAfT06//esDdpi/DZ8Qsdt4+M5+ltca05dA5bG2M= -github.com/xuri/nfp v0.0.0-20220409054826-5e722a1d9e22/go.mod h1:WwHg+CVyzlv/TX9xqBFXEZAuxOPxn2k1GNHwG41IIUQ= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= -go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.3.1-0.20221117191849-2c476679df9a/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= -golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE= golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1 h1:k/i9J1pBpvlfR+9QsetwPyERsqu1GIbi967PQMq3Ivc= golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1/go.mod h1:V1LtkGg67GoY2N1AnLN78QLrzxkLyJw7RJb1gzOOz9w= -golang.org/x/image v0.5.0 h1:5JMiNunQeQw++mMOz48/ISeNu3Iweh/JaZU8ZLqHRrI= -golang.org/x/image v0.5.0/go.mod h1:FVC7BI/5Ym8R25iw5OLsgshdUBbT1h5jZTpA+mvAdZ4= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc= golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -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-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= -golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= golang.org/x/net v0.22.0 h1:9sGLhx7iRIHEiX0oAJ3MRZMUCElJgy7Br1nO+AMN3Tc= golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.7.0 h1:qe6s0zUXlPX80/dITx3440hWZ7GwMwgDDyrSGTPJG/g= -golang.org/x/oauth2 v0.7.0/go.mod h1:hPLQkd9LyjfXTiRohC/41GhcFqxisoUQ99sCUOHO9x4= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/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-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -234,7 +150,6 @@ golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= @@ -242,25 +157,18 @@ golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuX golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= -golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= golang.org/x/term v0.18.0 h1:FcHjZXDMxI8mM3nwhX9HlKop4C0YQvCVCdwYl2wOtE8= golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/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= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= @@ -269,38 +177,6 @@ golang.org/x/tools v0.13.0 h1:Iey4qkscZuv0VvIt8E0neZjtPVQFSc870HQ448QgEmQ= golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/api v0.114.0 h1:1xQPji6cO2E2vLiI+C/XiFAnsn1WV3mjaEwGLhi3grE= -google.golang.org/api v0.114.0/go.mod h1:ifYI2ZsFK6/uGddGfAD5BMxlnkBqCmqHSDUVi45N5Yg= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -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/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 h1:KpwkzHKEF7B9Zxg18WzOa7djJ+Ha5DzthMyZYQfEn2A= -google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1/go.mod h1:nKE/iIaLqn2bQwXBg8f1g2Ylh6r5MN5CmZvuzZCgsCU= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.56.3 h1:8I4C0Yq1EjstUzUJzpcRVbuYA2mODtEmpWiQoN/b2nc= -google.golang.org/grpc v1.56.3/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s= -google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= -google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= -google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= -google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= -google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng= -google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/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= @@ -312,5 +188,3 @@ gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/go.work.sum b/go.work.sum index eeade9a0d..66ea8e657 100644 --- a/go.work.sum +++ b/go.work.sum @@ -127,6 +127,7 @@ cloud.google.com/go/lifesciences v0.8.0 h1:uWrMjWTsGjLZpCTWEAzYvyXj+7fhiZST45u9A cloud.google.com/go/lifesciences v0.8.0/go.mod h1:lFxiEOMqII6XggGbOnKiyZ7IBwoIqA84ClvoezaA/bo= cloud.google.com/go/logging v1.7.0 h1:CJYxlNNNNAMkHp9em/YEXcfJg+rPDg7YfwoRpMU+t5I= cloud.google.com/go/logging v1.7.0/go.mod h1:3xjP2CjkM3ZkO73aj4ASA5wRPGGCRrPIAeNqVNkzY8M= +cloud.google.com/go/longrunning v0.4.1/go.mod h1:4iWDqhBZ70CvZ6BfETbvam3T8FMvLK+eFj0E6AaRQTo= cloud.google.com/go/managedidentities v1.5.0 h1:ZRQ4k21/jAhrHBVKl/AY7SjgzeJwG1iZa+mJ82P+VNg= cloud.google.com/go/managedidentities v1.5.0/go.mod h1:+dWcZ0JlUmpuxpIDfyP5pP5y0bLdRwOS4Lp7gMni/LA= cloud.google.com/go/maps v0.7.0 h1:mv9YaczD4oZBZkM5XJl6fXQ984IkJNHPwkc8MUsdkBo= From 5f3258f7a4c98b19c163ad36c1e587f69d364c3a Mon Sep 17 00:00:00 2001 From: Marc Sanchis Date: Fri, 10 Jan 2025 23:34:16 +0100 Subject: [PATCH 06/20] Update READMEs (#193) --- CONTRIBUTING.md | 8 +++---- README.md | 33 +++++++++++++++++++++++++- backend/README.md | 26 --------------------- backend/docs/docs_structure.md | 42 ---------------------------------- ethernet-view/README.md | 19 --------------- 5 files changed, 36 insertions(+), 92 deletions(-) delete mode 100644 backend/README.md delete mode 100644 backend/docs/docs_structure.md delete mode 100644 ethernet-view/README.md diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 5dd3adea8..f578b1cf5 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -22,7 +22,7 @@ If the issue is not created yet, go to the issues page and create a new *task* i * If the issue is specific to one module (e.g. backend, ethernet view, etc.) start the title with `[module_name]`, changing *module_name* to the appropiate one. * Add the appropiate labels: is the issue related to the *frontend*, the *backend*, is it a *documentation* task? Try to identify these before creating the issue. * Assign yourself (or the member who will work on it) so they get notified with updates and everyone knows what everyone is doing. -* Add the issue to the `Software H9` project to keep track of its progress. +* Add the issue to the `Software HX` project to keep track of its progress. * Assign the issue to a milestone if possible. * Describe the task briefly. Write some lines on the task itself, what should be done, any details, notes on it, etc. * Add related issues / PRs. This is not required, but is useful, specially when tasks get blocked by other tasks. @@ -36,7 +36,7 @@ Of course don't become too obsessed with this, it's always best to try out somet It is also recommended to ask other members their points of view, what they are doing, dependencies they might have, etc. To get more ideas and ensure your changes won't screw with other person changes. -Also make sure to take notes, maybe in `software-docs` or as a comment on the issue, with anything relevant you found from this research. It might even be necessary to open new issues if you find anything outside the scope of the task. +Also make sure to take notes and create a wiki entry with anything relevant you found from this research. It might even be necessary to open new issues if you find anything outside the scope of the task. But once again, don't take more than a day doing this. @@ -66,7 +66,7 @@ Examples of good branch names are: `backend/tcp-keepalive-error`, `ethernet-view Some bad examples are: `abc`, `backend/minor-fixes` or `unrelated-module/some-feature`. -### writing code +### Writing code With the latest changes ready, the new branch created, and everything set up, you are ready to write code at last. These are some guidelines on how to make good changes: @@ -74,7 +74,7 @@ With the latest changes ready, the new branch created, and everything set up, yo * Keep commits atomic. These are commits that change just one specific thing, allowing the app to be compiled before and after. * Don't extend a branch life time, try to merge changes as soon as possible. If there are a lot of changes create multiple PRs and do it progresively. * Keep PRs small. Of course there are exceptions to this and sometimes a PR will have more lines than others. -* Document what you do, dedicate some time to write down the why and how of your changes. Documentation not that related to the code should be written to `software-docs`. +* Document what you do, dedicate some time to write down the why and how of your changes. Documentation not that related to the code should be written to the wiki. * Try to test the code. Prepare at least a primitive test to ensure it works, of course, it is better if tests are automatic, but in some cases, it is just easier to check by hand. ## 4. Open pull request diff --git a/README.md b/README.md index 9e4ab3218..e72f263fe 100644 --- a/README.md +++ b/README.md @@ -1 +1,32 @@ -# Software +# Software - Control Station + +[![CI](https://github.com/HyperloopUPV-H8/software/actions/workflows/build-backend.yaml/badge.svg)](https://github.com/HyperloopUPV-H8/software/actions/workflows/build-backend.yaml) +[![CI](https://github.com/HyperloopUPV-H8/software/actions/workflows/build-ethernet-view.yaml/badge.svg)](https://github.com/HyperloopUPV-H8/software/actions/workflows/build-ethernet-view.yaml) +[![CI](https://github.com/HyperloopUPV-H8/software/actions/workflows/build-control-station.yaml/badge.svg)](https://github.com/HyperloopUPV-H8/software/actions/workflows/build-control-station.yaml) + +Hyperloop UPV's Control STtaion is a unified software solution for monitoring and commanding the pod in real time. It combines a back-end (Go) that ingests and interprets sensor data–defined via the JSON-based "ADJ" specifications–and a front-end (Typescript/React) that displays metrics, logs, and diagnostics to operators. With features like packet parsing, logging, and live dashboards, it acts as the central hub to safely interface the pod, making it easier for team members to oversee performance, detect faults, and send precise orders to the vehicle. + +### Installation + +Download the last release, unzip it and leave the executable compatible with your OS in the folder. + +### Developing + +The main project file is inside `backend/cmd`. Make sure to have the proper `config.toml` configuration and that you are in the `develop` branch. To build the project just run `go build` inside the folder. With everything set up execute the `cmd` executable, then move to `ethernet-view` and run `npm run dev`, then to the `control-station` and do the same. + +### Contributing + +See [CONTRIBUTING.md](./CONTRIBUTING.md) for ways to contribute to the Control Station. + +### Authors + +- [Juan Martinez Alonso](https://github.com/jmaralo) +- [Marc Sanchis Llinares](https://github.com/msanlli) +- [Sergio Moreno Suay](https://github.com/smorsua) +- [Felipe Zaballa Martinez](https://github.com/lipezaballa) +- [Andrés de la Torre Mora](https://github.com/andresdlt03) +- [Alejandro Losa](https://github.com/Losina24) + +### About + +HyperloopUPV is a student team based at Universitat Politècnica de València (Spain), which works every year to develop the transport of the future, the hyperloop. Check out [our website](https://hyperloopupv.com/#/) diff --git a/backend/README.md b/backend/README.md deleted file mode 100644 index 9aa50e353..000000000 --- a/backend/README.md +++ /dev/null @@ -1,26 +0,0 @@ -# Ethernet View - Backend - -This is the official backend for the HyperloopUPV verification software *Ethernet View*. - -## Building - -The main project file is inside `cmd`, each of the folders contains one version of the backend, the latest is the one with the highest number (so `cmd/MVP-2` is more recent than `cmd/MVP-1`). -To build the project just run `go build` inside one of these folders. In order to run there are three more files that need to be present in the same folder as the executable: - -* The frontend build located in a folder named `static` (as the backend also serves the webpage) -* A `.env` with all the configuration options (the one in the repo lists all the possible options) -* The `secret.json` to access the Google API to download the excel (this is only available to us) - -alternatively you can download a version that is ready for production from the releases. - -## Authors - -* [Juan Martinez Alonso](https://github.com/jmaralo) -* [Sergio Moreno Suay](https://github.com/smorsua) -* [Felipe Zaballa Martinez](https://github.com/lipezaballa) -* [Alejandro Losa](https://github.com/Losina24) - -## About - -HyperloopUPV is a student team based at Universitat Politècnica de València (Spain) working every year to develop the transport of the future, the hyperloop. -[Our website](https://hyperloopupv.com/#/) diff --git a/backend/docs/docs_structure.md b/backend/docs/docs_structure.md deleted file mode 100644 index 23759a19a..000000000 --- a/backend/docs/docs_structure.md +++ /dev/null @@ -1,42 +0,0 @@ -Cada punto es una carpeta y cada subpunto es un archivo. Cada archivo debe explicar su concepto de la manera más directa. -La intro de cada sección será similar a los intros de los apartadas de The Rust book: uno o dos párrafos que resumen el concepto que engloba lo que se va a explicar y porque es necesario para el backend. -Cada documento puede contener extractos de código a modo de ejemplo. - -1. Introducción - 1. Intro + Funciones fundamentales de la estación de control. - 2. Guía de instalación + simular el back -2. BBDD - 1. Intro - 2. Estructura de ADE - 3. Descarga del excel con la API de Google - 4. Construcción de pod_data en varios pasos - 5. Detección de errores -3. Pod comm. - 1. Intro - 2. Setup Switch + Raspi y sniffado - 3. TCP: keepalives -4. Decoding - 1. Intro - 2. Modelos pod_data - 3. Discriminación de datos: vehicle.Listen() - 4. Funcionamiento del desparseo (mapas de decoders) -5. Enconding - 1. Ordenes -6. Protections -7. Data logging - 1. Intro - 2. Interfaz Loggable - 3. Posibilidad de usar ctx para coordinar los diferentes loggers. - 4. Loggeo redundante en el vehículo. -8. Front comm. - 1. Structs JSON - 2. Throttling - 3. Media movil - 4. Ws_handle: suscripción a temas. -9. Extras - 1. Tracing - 2. Patron de observables - 3. Configuración con TOML - 4. BLCU - 5. Multiples servers -10. Ideas para el año siguiente diff --git a/ethernet-view/README.md b/ethernet-view/README.md deleted file mode 100644 index 3c30f51dd..000000000 --- a/ethernet-view/README.md +++ /dev/null @@ -1,19 +0,0 @@ -# Ethernet View - Frontend - -This is the official frontend for the HyperloopUPV verification software *Ethernet View*. - -## Building - -To build the site, run `npm run build` in a terminal set at the root of the project. Then rename the generated folder to static and follow the instructions in the "Building" section of the backend repository. - -## Authors - -* [Juan Martinez Alonso](https://github.com/jmaralo) -* [Sergio Moreno Suay](https://github.com/smorsua) -* [Felipe Zaballa Martinez](https://github.com/lipezaballa) -* [Alejandro Losa](https://github.com/Losina24) - -## About - -HyperloopUPV is a student team based at Universitat Politècnica de València (Spain) working every year to develop the transport of the future, the hyperloop. -[Our website](https://hyperloopupv.com/#/) From 56598d9b55c9e1a3ac1791f50aa0a6720d1251a8 Mon Sep 17 00:00:00 2001 From: Marc Sanchis Date: Fri, 10 Jan 2025 23:37:55 +0100 Subject: [PATCH 07/20] Update READMEs (#194) * Update README.md * update CONTRIBUTING.md * remove backend readme * remove ethernet-view README.md * Update README.md * update README.md From 74d198002c940c658af1fe2f675c0c8ecf694ea6 Mon Sep 17 00:00:00 2001 From: msanlli Date: Sat, 11 Jan 2025 20:51:16 +0100 Subject: [PATCH 08/20] delete old packet sender --- packet-sender/.env | 4 - packet-sender/.gitignore | 24 --- packet-sender/PacketGenerator.go | 319 ------------------------------- packet-sender/README.md | 42 ---- packet-sender/go.mod | 43 ----- packet-sender/go.sum | 207 -------------------- packet-sender/main.go | 108 ----------- 7 files changed, 747 deletions(-) delete mode 100644 packet-sender/.env delete mode 100644 packet-sender/.gitignore delete mode 100644 packet-sender/PacketGenerator.go delete mode 100644 packet-sender/README.md delete mode 100644 packet-sender/go.mod delete mode 100644 packet-sender/go.sum delete mode 100644 packet-sender/main.go diff --git a/packet-sender/.env b/packet-sender/.env deleted file mode 100644 index ae9ef8632..000000000 --- a/packet-sender/.env +++ /dev/null @@ -1,4 +0,0 @@ -EXCEL_ADAPTER_ID="1b_nOrWqjMLOSEFIV9dMUObnJ15J7ypmF-KVJ4qztAtw" -EXCEL_ADAPTER_NAME="ade.xlsx" -EXCEL_ADAPTER_PATH="." -EXCEL_ADAPTER_CREDENTIALS="./secret.json" diff --git a/packet-sender/.gitignore b/packet-sender/.gitignore deleted file mode 100644 index 50cbea71a..000000000 --- a/packet-sender/.gitignore +++ /dev/null @@ -1,24 +0,0 @@ -# Binaries for programs and plugins -*.exe -*.exe~ -*.dll -*.so -*.dylib -packet-sender -packet_sender - -# Test binary, built with `go test -c` -*.test - -# Output of the go coverage tool, specifically when used with LiteIDE -*.out - -# Dependency directories (remove the comment below to include it) -# vendor/ - -# Workspace configuration -secret.json -excel.xlsx -.vscode - -*.xlsx diff --git a/packet-sender/PacketGenerator.go b/packet-sender/PacketGenerator.go deleted file mode 100644 index 53693aaf2..000000000 --- a/packet-sender/PacketGenerator.go +++ /dev/null @@ -1,319 +0,0 @@ -package main - -import ( - "bytes" - "encoding/binary" - "log" - "math" - "math/rand" - "strconv" - "strings" - "time" - - excelAdapter "github.com/HyperloopUPV-H8/h9-backend/pkg/excel_adapter" - "github.com/HyperloopUPV-H8/h9-backend/pkg/excel_adapter/internals" - "github.com/HyperloopUPV-H8/h9-backend/pkg/excel_adapter/models" -) - -type PacketGenerator struct { - packets []Packet -} - -func New() PacketGenerator { - excelAdapter := excelAdapter.New(excelAdapter.ExcelAdapterConfig{ - Download: internals.DownloadConfig{ - Id: "1NyNaAOw_6iWtnCpEg73AtSSFx1fMdhPRmmdOhjgjCZI", - Path: ".", - Name: "ade.xlsx", - }, - Parse: internals.ParseConfig{ - GlobalSheetPrefix: "GLOBAL ", - BoardSheetPrefix: "BOARD ", - TablePrefix: "[TABLE] ", - Global: internals.GlobalParseConfig{ - AddressTable: "addresses", - BackendKey: "Backend", - BLCUAddressKey: "BLCU", - UnitsTable: "units", - PortsTable: "ports", - BoardIdsTable: "board_ids", - MessageIdsTable: "message_ids", - }, - }, - }) - - boards := excelAdapter.GetBoards() - packets := make([]Packet, 0) - - for _, board := range boards { - for _, packet := range board.Packets { - if packet.Description.Type != "data" { - continue - } - - id, err := strconv.ParseUint(packet.Description.ID, 10, 16) - if err != nil { - log.Fatalf("data transfer: AddPacket: %s\n", err) - } - - packets = append(packets, Packet{ - ID: uint16(id), - Name: packet.Description.Name, - HexValue: "", - Count: 0, - CycleTime: 0, - Measurements: getMeasurements(packet.Values), - }) - } - } - - pg := PacketGenerator{ - packets: packets, - } - - return pg -} - -func (pg *PacketGenerator) CreateRandomPacket() []byte { - randomIndex := rand.Int63n(int64(len(pg.packets))) - randomPacket := pg.packets[randomIndex] - - buff := bytes.NewBuffer(make([]byte, 0)) - - binary.Write(buff, binary.LittleEndian, randomPacket.ID) - - for _, measurement := range randomPacket.Measurements { - if strings.Contains(measurement.Type, "enum") { - binary.Write(buff, binary.LittleEndian, uint8(rand.Int63n(int64(len(strings.Split(strings.ReplaceAll(strings.TrimSuffix(strings.TrimPrefix(measurement.Type, "enum("), ")"), " ", ""), ",")))))) - } else if measurement.Type == "bool" { - binary.Write(buff, binary.LittleEndian, rand.Int31n(2) == 1) - } else if measurement.Type != "string" { - var number float64 - if len(measurement.WarningRange) == 0 { - number = mapNumberToRange(rand.Float64(), measurement.WarningRange, measurement.Type) - } else { - number = mapNumberToRange(rand.Float64(), []float64{measurement.WarningRange[0] * 0.8, measurement.WarningRange[1] * 1.2}, measurement.Type) - } - writeNumberAsBytes(number, measurement.Type, buff) - } else { - return nil - } - - } - - return buff.Bytes() -} - -func (pg *PacketGenerator) CreateSinePacket() []byte { - randomIndex := rand.Int63n(int64(len(pg.packets))) - randomPacket := pg.packets[randomIndex] - - buff := bytes.NewBuffer(make([]byte, 0)) - - binary.Write(buff, binary.LittleEndian, randomPacket.ID) - - for _, measurement := range randomPacket.Measurements { - if strings.Contains(measurement.Type, "enum") { - binary.Write(buff, binary.LittleEndian, uint8(1)) - } else if measurement.Type != "string" { - sineValue := generateSinusoidalValue() - number := mapNumberToRange(sineValue, measurement.SafeRange, measurement.Type) - writeNumberAsBytes(number, measurement.Type, buff) - } else { - return nil - } - } - - return buff.Bytes() -} - -func generateSinusoidalValue() float64 { - amplitude := 1.0 - frequency := 0.01 - phase := 0.0 - - value := amplitude * math.Sin(2*math.Pi*frequency*float64(time.Now().Unix())+phase) - return value -} - -func mapNumberToRange(number float64, numberRange []float64, numberType string) float64 { - if len(numberRange) == 0 { - return number * getTypeMaxValue(numberType) - } else { - return (number * (numberRange[1] - numberRange[0])) + numberRange[0] - } -} - -func getTypeMaxValue(numberType string) float64 { - switch numberType { - case "uint8": - return math.MaxUint8 - case "uint16": - return math.MaxUint16 - case "uint32": - return math.MaxUint32 - case "uint64": - return math.MaxUint64 - case "int8": - return math.MaxInt8 - case "int16": - return math.MaxInt16 - case "int32": - return math.MaxInt32 - case "int64": - return math.MaxInt64 - case "float32": - return math.MaxFloat32 - case "float64": - return math.MaxFloat64 - case "bool": - return math.MaxUint8 - default: - return math.MaxUint8 - } -} - -func writeNumberAsBytes(number float64, numberType string, buff *bytes.Buffer) { - switch numberType { - case "uint8": - binary.Write(buff, binary.LittleEndian, uint8(number)) - case "uint16": - binary.Write(buff, binary.LittleEndian, uint16(number)) - - case "uint32": - binary.Write(buff, binary.LittleEndian, uint32(number)) - - case "uint64": - binary.Write(buff, binary.LittleEndian, uint64(number)) - - case "int8": - binary.Write(buff, binary.LittleEndian, int8(number)) - - case "int16": - binary.Write(buff, binary.LittleEndian, int16(number)) - - case "int32": - binary.Write(buff, binary.LittleEndian, int32(number)) - - case "int64": - binary.Write(buff, binary.LittleEndian, int64(number)) - - case "float32": - binary.Write(buff, binary.LittleEndian, float32(number)) - - case "float64": - binary.Write(buff, binary.LittleEndian, number) - - case "bool": - binary.Write(buff, binary.LittleEndian, uint8(number)) - - default: - binary.Write(buff, binary.LittleEndian, uint8(number)) - } -} - -func (pg *PacketGenerator) AddPacket(boardName string, packet models.Packet) { - if packet.Description.Type != "data" { - return - } - - id, err := strconv.ParseUint(packet.Description.ID, 10, 16) - if err != nil { - log.Fatalf("data transfer: AddPacket: %s\n", err) - } - - pg.packets = append(pg.packets, Packet{ - ID: uint16(id), - Name: packet.Description.Name, - HexValue: "", - Count: 0, - CycleTime: 0, - Measurements: getMeasurements(packet.Values), - }) - -} - -func getMeasurements(values []models.Value) []Measurement { - measurements := make([]Measurement, 0, len(values)) - for _, value := range values { - measurements = append(measurements, - Measurement{ - ID: value.ID, - Name: value.Name, - Type: value.Type, - //TODO: make sure added property (Value) doesn't break stuff - Value: getDefaultValue(value.Type), - Units: value.DisplayUnits, - SafeRange: parseRange(value.SafeRange), - WarningRange: parseRange(value.WarningRange), - }, - ) - } - return measurements -} - -func parseRange(literal string) []float64 { - if literal == "" { - return make([]float64, 0) - } - - strRange := strings.Split(strings.TrimSuffix(strings.TrimPrefix(strings.Replace(literal, " ", "", -1), "["), "]"), ",") - - if len(strRange) != 2 { - log.Fatalf("pod data: parseRange: invalid range %s\n", literal) - } - - numRange := make([]float64, 0) - - if strRange[0] != "" { - lowerBound, errLowerBound := strconv.ParseFloat(strRange[0], 64) - - if errLowerBound != nil { - log.Fatal("error parsing lower bound") - } - - numRange = append(numRange, lowerBound) - } - - if strRange[1] != "" { - upperBound, errUpperBound := strconv.ParseFloat(strRange[1], 64) - - if errUpperBound != nil { - log.Fatal("error parsing lower bound") - } - - numRange = append(numRange, upperBound) - } - - return numRange -} - -func getDefaultValue(valueType string) any { - switch valueType { - case "uint8", "uint16", "uint32", "uint64", "int8", "int16", "int32", "int64", "float32", "float64": - return 0 - case "bool": - return false - default: - return "Default" - } -} - -type Packet struct { - ID uint16 `json:"id"` - Name string `json:"name"` - HexValue string `json:"hexValue"` - Count uint16 `json:"count"` - CycleTime int64 `json:"cycleTime"` - Measurements []Measurement `json:"measurements"` -} - -type Measurement struct { - ID string `json:"id"` - Name string `json:"name"` - Type string `json:"type"` - Value any `json:"value"` - Units string `json:"units"` - SafeRange []float64 `json:"safeRange"` - WarningRange []float64 `json:"warningRange"` -} diff --git a/packet-sender/README.md b/packet-sender/README.md deleted file mode 100644 index ca50f7147..000000000 --- a/packet-sender/README.md +++ /dev/null @@ -1,42 +0,0 @@ -# Packet Sender - -Small utility to generate mock traffic to test the backend. - -## Features - -- Automatically fetch the ADE. -- Generate random values for numerics -- Supports all types of data -- It's over 9000 packets per second!!! - -## Run Locally - -Clone the project - -```bash -git clone https://github.com/HyperloopUPV-H8/packet-sender.git -``` - -Go to the project directory - -```bash -cd packet-sender -``` - -Edit go.mod and add the replacement directive at the end of the file - -```bash -echo "replace github.com/HyperloopUPV-H8/Backend-H8 => " >> go.mod -``` - -Build and Run - -```bash -go build && ./packet-sender -``` - -## Authors - -- [Juan Martinez Alonso](https://www.github.com/jmaralo) -- [Sergio Moreno Suay](https://www.github.com/smorsua) -- [Felipe Zaballa Martienz](https://www.github.com/lipezaballa) diff --git a/packet-sender/go.mod b/packet-sender/go.mod deleted file mode 100644 index 3afd8d3f7..000000000 --- a/packet-sender/go.mod +++ /dev/null @@ -1,43 +0,0 @@ -module packet_sender - -go 1.19 - -require ( - github.com/HyperloopUPV-H8/h9-backend v0.0.0-00010101000000-000000000000 - github.com/joho/godotenv v1.4.0 -) - -require ( - cloud.google.com/go/compute v1.19.1 // indirect - cloud.google.com/go/compute/metadata v0.2.3 // indirect - github.com/HyperloopUPV-H8/ade-linter v0.0.0-20230530153315-3379f05a664f // indirect - github.com/fatih/color v1.15.0 // indirect - github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e // indirect - github.com/golang/protobuf v1.5.3 // indirect - github.com/google/uuid v1.3.0 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.2.3 // indirect - github.com/googleapis/gax-go/v2 v2.7.1 // indirect - github.com/mattn/go-colorable v0.1.13 // indirect - github.com/mattn/go-isatty v0.0.17 // indirect - github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 // indirect - github.com/richardlehane/mscfb v1.0.4 // indirect - github.com/richardlehane/msoleps v1.0.3 // indirect - github.com/rs/zerolog v1.29.0 // indirect - github.com/xuri/efp v0.0.0-20220603152613-6918739fd470 // indirect - github.com/xuri/excelize/v2 v2.7.1 // indirect - github.com/xuri/nfp v0.0.0-20220409054826-5e722a1d9e22 // indirect - go.opencensus.io v0.24.0 // indirect - golang.org/x/crypto v0.14.0 // indirect - golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1 // indirect - golang.org/x/net v0.17.0 // indirect - golang.org/x/oauth2 v0.7.0 // indirect - golang.org/x/sys v0.13.0 // indirect - golang.org/x/text v0.13.0 // indirect - google.golang.org/api v0.114.0 // indirect - google.golang.org/appengine v1.6.7 // indirect - google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 // indirect - google.golang.org/grpc v1.56.3 // indirect - google.golang.org/protobuf v1.30.0 // indirect -) - -replace github.com/HyperloopUPV-H8/h9-backend => ../backend diff --git a/packet-sender/go.sum b/packet-sender/go.sum deleted file mode 100644 index de5c1d2d5..000000000 --- a/packet-sender/go.sum +++ /dev/null @@ -1,207 +0,0 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.110.0 h1:Zc8gqp3+a9/Eyph2KDmcGaPtbKRIoqq4YTlL4NMD0Ys= -cloud.google.com/go/compute v1.19.1 h1:am86mquDUgjGNWxiGn+5PGLbmgiWXlE/yNWpIpNvuXY= -cloud.google.com/go/compute v1.19.1/go.mod h1:6ylj3a05WF8leseCdIf77NK0g1ey+nj5IKd5/kvShxE= -cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= -cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= -cloud.google.com/go/longrunning v0.4.1 h1:v+yFJOfKC3yZdY6ZUI933pIYdhyhV8S3NpWrXWmg7jM= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/HyperloopUPV-H8/ade-linter v0.0.0-20230530153315-3379f05a664f h1:WxWQzMMuGKBTZZ1c/z+4cHckI3FxOpdoBl6kUpu1L/o= -github.com/HyperloopUPV-H8/ade-linter v0.0.0-20230530153315-3379f05a664f/go.mod h1:y2zH0pjAkyEirrmjDq/O3lg03whnTSk5KPtQwJLr0Q4= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/coreos/go-systemd/v22 v22.3.3-0.20220203105225-a9a7ef127534/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -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/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= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs= -github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw= -github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e h1:1r7pUrabqp18hOBcwBwiTsbnFeTZHV9eER/QT5JVZxY= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= -github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= -github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= -github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= -github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= -github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= -github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= -github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/enterprise-certificate-proxy v0.2.3 h1:yk9/cqRKtT9wXZSsRH9aurXEpJX+U6FLtpYTdC3R06k= -github.com/googleapis/enterprise-certificate-proxy v0.2.3/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= -github.com/googleapis/gax-go/v2 v2.7.1 h1:gF4c0zjUP2H/s/hEGyLA3I0fA2ZWjzYiONAD6cvPr8A= -github.com/googleapis/gax-go/v2 v2.7.1/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI= -github.com/joho/godotenv v1.4.0 h1:3l4+N6zfMWnkbPEXKng2o2/MR5mSwTrBih4ZEkkz1lg= -github.com/joho/godotenv v1.4.0/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= -github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= -github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= -github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= -github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= -github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= -github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 h1:RWengNIwukTxcDr9M+97sNutRR1RKhG96O6jWumTTnw= -github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/richardlehane/mscfb v1.0.4 h1:WULscsljNPConisD5hR0+OyZjwK46Pfyr6mPu5ZawpM= -github.com/richardlehane/mscfb v1.0.4/go.mod h1:YzVpcZg9czvAuhk9T+a3avCpcFPMUWm7gK3DypaEsUk= -github.com/richardlehane/msoleps v1.0.1/go.mod h1:BWev5JBpU9Ko2WAgmZEuiz4/u3ZYTKbjLycmwiWUfWg= -github.com/richardlehane/msoleps v1.0.3 h1:aznSZzrwYRl3rLKRT3gUk9am7T/mLNSnJINvN0AQoVM= -github.com/richardlehane/msoleps v1.0.3/go.mod h1:BWev5JBpU9Ko2WAgmZEuiz4/u3ZYTKbjLycmwiWUfWg= -github.com/rs/xid v1.4.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= -github.com/rs/zerolog v1.29.0 h1:Zes4hju04hjbvkVkOhdl2HpZa+0PmVwigmo8XoORE5w= -github.com/rs/zerolog v1.29.0/go.mod h1:NILgTygv/Uej1ra5XxGf82ZFSLk58MFGAUS2o6usyD0= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= -github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/xuri/efp v0.0.0-20220603152613-6918739fd470 h1:6932x8ltq1w4utjmfMPVj09jdMlkY0aiA6+Skbtl3/c= -github.com/xuri/efp v0.0.0-20220603152613-6918739fd470/go.mod h1:ybY/Jr0T0GTCnYjKqmdwxyxn2BQf2RcQIIvex5QldPI= -github.com/xuri/excelize/v2 v2.7.1 h1:gm8q0UCAyaTt3MEF5wWMjVdmthm2EHAWesGSKS9tdVI= -github.com/xuri/excelize/v2 v2.7.1/go.mod h1:qc0+2j4TvAUrBw36ATtcTeC1VCM0fFdAXZOmcF4nTpY= -github.com/xuri/nfp v0.0.0-20220409054826-5e722a1d9e22 h1:OAmKAfT06//esDdpi/DZ8Qsdt4+M5+ltca05dA5bG2M= -github.com/xuri/nfp v0.0.0-20220409054826-5e722a1d9e22/go.mod h1:WwHg+CVyzlv/TX9xqBFXEZAuxOPxn2k1GNHwG41IIUQ= -github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= -go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE= -golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= -golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1 h1:k/i9J1pBpvlfR+9QsetwPyERsqu1GIbi967PQMq3Ivc= -golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1/go.mod h1:V1LtkGg67GoY2N1AnLN78QLrzxkLyJw7RJb1gzOOz9w= -golang.org/x/image v0.5.0 h1:5JMiNunQeQw++mMOz48/ISeNu3Iweh/JaZU8ZLqHRrI= -golang.org/x/image v0.5.0/go.mod h1:FVC7BI/5Ym8R25iw5OLsgshdUBbT1h5jZTpA+mvAdZ4= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -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-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= -golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= -golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.7.0 h1:qe6s0zUXlPX80/dITx3440hWZ7GwMwgDDyrSGTPJG/g= -golang.org/x/oauth2 v0.7.0/go.mod h1:hPLQkd9LyjfXTiRohC/41GhcFqxisoUQ99sCUOHO9x4= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/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-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= -golang.org/x/sys v0.13.0/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/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= -golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/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= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/api v0.114.0 h1:1xQPji6cO2E2vLiI+C/XiFAnsn1WV3mjaEwGLhi3grE= -google.golang.org/api v0.114.0/go.mod h1:ifYI2ZsFK6/uGddGfAD5BMxlnkBqCmqHSDUVi45N5Yg= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -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/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 h1:KpwkzHKEF7B9Zxg18WzOa7djJ+Ha5DzthMyZYQfEn2A= -google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1/go.mod h1:nKE/iIaLqn2bQwXBg8f1g2Ylh6r5MN5CmZvuzZCgsCU= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.56.3 h1:8I4C0Yq1EjstUzUJzpcRVbuYA2mODtEmpWiQoN/b2nc= -google.golang.org/grpc v1.56.3/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s= -google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= -google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= -google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= -google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= -google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng= -google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= -gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/packet-sender/main.go b/packet-sender/main.go deleted file mode 100644 index 4c5abcc19..000000000 --- a/packet-sender/main.go +++ /dev/null @@ -1,108 +0,0 @@ -package main - -import ( - "fmt" - "log" - "net" - "os" - "os/signal" - "time" - - "github.com/joho/godotenv" -) - -const ( - lip string = "127.0.0.3" - lport uint16 = 50400 - rip string = "127.0.0.4" - rport uint16 = 50400 -) - -func main() { - err := godotenv.Load(".env") - - if err != nil { - log.Fatal("Error loading .env", err) - } - - _ = createListener(lip, lport, rip, rport) - conn := getConn(lip, lport, rip, rport) - defer conn.Close() - - packetGenerator := New() - fmt.Println("Sending packets") - - count := make(chan struct{}, 10000) - start := time.Now() - prev := time.Now() - go func() { - for { - packet := packetGenerator.CreateRandomPacket() - fmt.Println(time.Since(prev)) - prev = time.Now() - - if packet == nil { - continue - } - _, err := conn.Write(packet) - - if err != nil { - continue - } - - count <- struct{}{} - } - - }() - - interrupt := make(chan os.Signal, 1) - signal.Notify(interrupt, os.Interrupt) - - c := 0 - for { - select { - case <-count: - c++ - case <-interrupt: - fmt.Printf("%d, %v\n", c, time.Since(start)) - return - } - } - -} - -func getConn(lip string, lport uint16, rip string, rport uint16) *net.UDPConn { - laddr, err := net.ResolveUDPAddr("udp", fmt.Sprintf("%s:%d", lip, lport)) - if err != nil { - log.Fatalf("resolve address: %s\n", err) - } - raddr, err := net.ResolveUDPAddr("udp", fmt.Sprintf("%s:%d", rip, rport)) - if err != nil { - log.Fatalf("resolve address: %s\n", err) - } - conn, err := net.DialUDP("udp", laddr, raddr) - - if err != nil { - log.Fatal("Error creating udp connection", err) - } - - return conn -} - -func createListener(lip string, lport uint16, rip string, rport uint16) *net.UDPConn { - _, err := net.ResolveUDPAddr("udp", fmt.Sprintf("%s:%d", lip, lport)) - if err != nil { - log.Fatalf("resolve address: %s\n", err) - } - laddr, err := net.ResolveUDPAddr("udp", fmt.Sprintf("%s:%d", rip, rport)) - if err != nil { - log.Fatalf("resolve address: %s\n", err) - } - listener, err := net.ListenUDP("udp", laddr) - - if err != nil { - log.Fatal("Error creating udp connection", err) - } - - return listener -} From bac1c3ebb53806ec827c4afad3ffdd5a04e18e11 Mon Sep 17 00:00:00 2001 From: Jesus Date: Wed, 29 Jan 2025 18:54:30 +0100 Subject: [PATCH 09/20] Correct import + copy adj in pkg --- backend/pkg/adj/adj.go | 258 +++++++++++++++++++++++++++++++ backend/pkg/adj/models.go | 63 ++++++++ packet-sender/PacketGenerator.go | 2 +- 3 files changed, 322 insertions(+), 1 deletion(-) create mode 100644 backend/pkg/adj/adj.go create mode 100644 backend/pkg/adj/models.go diff --git a/backend/pkg/adj/adj.go b/backend/pkg/adj/adj.go new file mode 100644 index 000000000..52c02d2e1 --- /dev/null +++ b/backend/pkg/adj/adj.go @@ -0,0 +1,258 @@ +package adj + +import ( + "encoding/json" + "os" + "path" + + "github.com/HyperloopUPV-H8/h9-backend/internal/utils" + "github.com/go-git/go-git/v5" +) + +const ( + RepoUrl = "https://github.com/HyperloopUPV-H8/JSON_ADE.git" // URL of the ADJ repository + RepoPath = "./JSON_ADE/" // Path where the ADJ repository is cloned +) + +func NewADJ() (ADJ, error) { + infoRaw, boardsRaw, err := downloadADJ() + if err != nil { + return ADJ{}, err + } + + var infoJSON InfoJSON + if err := json.Unmarshal(infoRaw, &infoJSON); err != nil { + println("Info JSON unmarshal error") + return ADJ{}, err + } + + var info Info = Info{ + Ports: infoJSON.Ports, + MessageIds: infoJSON.MessageIds, + Units: make(map[string]utils.Operations), + } + for key, value := range infoJSON.Units { + info.Units[key], err = utils.NewOperations(value) + if err != nil { + return ADJ{}, err + } + } + + type BoardList struct { + Boards map[string]string `json:"boards"` + } + + var boardsList BoardList + if err := json.Unmarshal(boardsRaw, &boardsList); err != nil { + return ADJ{}, err + } + + boards, err := getBoards(boardsList.Boards) + if err != nil { + return ADJ{}, err + } + + info.BoardIds, err = getBoardIds(boardsList.Boards) + if err != nil { + return ADJ{}, err + } + + info.Addresses, err = getAddresses(boards) + if err != nil { + return ADJ{}, err + } + for target, address := range infoJSON.Addresses { + info.Addresses[target] = address + } + + adj := ADJ{ + Info: info, + Boards: boards, + } + + return adj, nil +} + +func downloadADJ() (json.RawMessage, json.RawMessage, error) { + if !checkRepo() { + _, err := git.PlainClone(RepoPath, false, &git.CloneOptions{ + URL: RepoUrl, + }) + if err != nil { + return nil, nil, err + } + } + + // The BoardIds are applied in the NewADJ function by the getBoardIds function + info, err := os.ReadFile(RepoPath + "general_info.json") + if err != nil { + return nil, nil, err + } + + boardsList, err := os.ReadFile(RepoPath + "boards.json") + if err != nil { + return nil, nil, err + } + + return info, boardsList, nil +} + +func checkRepo() bool { + if _, err := os.Stat(RepoPath); os.IsNotExist(err) { + return false + } + + return true +} + +func getBoards(boardsList map[string]string) (map[string]Board, error) { + boards := make(map[string]Board, len(boardsList)) + for boardName, boardPath := range boardsList { + fullPath := path.Join(RepoPath, boardPath) + boardRaw, err := os.ReadFile(fullPath) + if err != nil { + return nil, err + } + + var boardJSON BoardJSON + if err = json.Unmarshal(boardRaw, &boardJSON); err != nil { + return nil, err + } + + measPathsFr := make([]string, 0) + for _, measPath := range boardJSON.MeasurementsPaths { + measPathsFr = append(measPathsFr, path.Join(RepoPath, "boards", boardName, measPath)) + } + boardJSON.MeasurementsPaths = measPathsFr + + packetPathsFr := make([]string, 0) + for _, packetPath := range boardJSON.PacketsPaths { + packetPathsFr = append(packetPathsFr, path.Join(RepoPath, "boards", boardName, packetPath)) + } + boardJSON.PacketsPaths = packetPathsFr + + board := Board{ + Name: boardName, + IP: boardJSON.IP, + } + board.Packets, err = getBoardPackets(boardJSON.PacketsPaths) + if err != nil { + return nil, err + } + + board.Measurements, err = getBoardMeasurements(boardJSON.MeasurementsPaths) + if err != nil { + return nil, err + } + board.LookUpMeasurements = make(map[string]Measurement, len(board.Measurements)) + + for _, measurement := range board.Measurements { + board.LookUpMeasurements[measurement.Id] = measurement + } + board.Structures = getBoardStructures(board) + + boards[boardName] = board + } + + return boards, nil +} + +func getBoardPackets(packetsPaths []string) ([]Packet, error) { + packets := make([]Packet, 0) + for _, packetPath := range packetsPaths { + if _, err := os.Stat(packetPath); os.IsNotExist(err) { + continue + } + + packetRaw, err := os.ReadFile(packetPath) + if err != nil { + return nil, err + } + + // Magic happens here + type PacketJSON struct { + Packet []Packet `json:"packets"` + } + + packetsJSON := PacketJSON{} + if err = json.Unmarshal(packetRaw, &packetsJSON); err != nil { + return nil, err + } + for _, packetTMP := range packetsJSON.Packet { + packets = append(packets, packetTMP) + } + } + + return packets, nil +} + +func getBoardMeasurements(measurementsPaths []string) ([]Measurement, error) { + measurements := make([]Measurement, 0) + + for _, measurementPath := range measurementsPaths { + if _, err := os.Stat(measurementPath); os.IsNotExist(err) { + continue + } + + measurementRaw, err := os.ReadFile(measurementPath) + if err != nil { + return nil, err + } + + // Absolutely doing tricks on it AGAIN - @msanlli + type MeasurementJSON struct { + Measurements []Measurement `json:"measurements"` + } + + measurementsJSON := MeasurementJSON{} + if err = json.Unmarshal(measurementRaw, &measurementsJSON); err != nil { + return nil, err + } + for _, measurementTMP := range measurementsJSON.Measurements { + measurements = append(measurements, measurementTMP) + } + } + + return measurements, nil +} + +func getBoardIds(boards map[string]string) (map[string]uint16, error) { + boardIds := make(map[string]uint16, len(boards)) + for boardName, boardPath := range boards { + fullPath := path.Join(RepoPath, boardPath) + boardRaw, err := os.ReadFile(fullPath) + if err != nil { + return nil, err + } + + var boardJSON BoardJSON + if err = json.Unmarshal(boardRaw, &boardJSON); err != nil { + return nil, err + } + + boardIds[boardName] = boardJSON.ID + } + + return boardIds, nil +} + +func getBoardStructures(board Board) []Structure { + structures := make([]Structure, len(board.Packets)) + for i, packet := range board.Packets { + structures[i] = Structure{ + Packet: packet, + Measurements: board.Measurements, + } + } + + return structures +} + +func getAddresses(boards map[string]Board) (map[string]string, error) { + addresses := make(map[string]string, len(boards)) + for boardName, board := range boards { + addresses[boardName] = board.IP + } + + return addresses, nil +} diff --git a/backend/pkg/adj/models.go b/backend/pkg/adj/models.go new file mode 100644 index 000000000..f0ad09738 --- /dev/null +++ b/backend/pkg/adj/models.go @@ -0,0 +1,63 @@ +package adj + +import "github.com/HyperloopUPV-H8/h9-backend/internal/utils" + +type ADJ struct { + Info Info + Boards map[string]Board +} + +type InfoJSON struct { + Ports map[string]uint16 `json:"ports"` + Addresses map[string]string + Units map[string]string `json:"units"` + MessageIds map[string]uint16 `json:"message_ids"` + BoardIds map[string]uint16 +} + +type Info struct { + Ports map[string]uint16 + Addresses map[string]string + Units map[string]utils.Operations + MessageIds map[string]uint16 + BoardIds map[string]uint16 +} + +type BoardJSON struct { + ID uint16 `json:"board_id"` + IP string `json:"board_ip"` + MeasurementsPaths []string `json:"measurements"` + PacketsPaths []string `json:"packets"` +} + +type Board struct { + Name string + IP string + Packets []Packet + Measurements []Measurement + Structures []Structure + LookUpMeasurements map[string]Measurement +} + +type Packet struct { + Id string `json:"id"` + Name string `json:"name"` + Type string `json:"type"` + Variables []Measurement `json:"variables"` +} + +type Measurement struct { + Id string `json:"id"` + Name string `json:"name"` + Type string `json:"type"` + PodUnits string `json:"podUnits"` + DisplayUnits string `json:"displayUnits"` + SafeRange []*float64 `json:"safeRange"` + WarningRange []*float64 `json:"warningRange"` + EnumValues []string `json:"enumValues"` +} + +type Structure struct { + Packet Packet + Measurements []Measurement +} diff --git a/packet-sender/PacketGenerator.go b/packet-sender/PacketGenerator.go index 04f9a3ed2..72b54d920 100644 --- a/packet-sender/PacketGenerator.go +++ b/packet-sender/PacketGenerator.go @@ -10,7 +10,7 @@ import ( "strings" "time" - "github.com/HyperloopUPV-H8/h9-backend/internal/adj" + "github.com/HyperloopUPV-H8/h9-backend/pkg/adj" ) type PacketGenerator struct { From ae20ca8894615c424e06eec3d88c54f343062ef9 Mon Sep 17 00:00:00 2001 From: msanlli Date: Mon, 3 Feb 2025 19:36:15 +0100 Subject: [PATCH 10/20] force the pass of ADJ tests --- backend/cmd/main.go | 8 +++++ backend/cmd/{testpython.py => testadj.py} | 41 ++++++++++------------- 2 files changed, 25 insertions(+), 24 deletions(-) rename backend/cmd/{testpython.py => testadj.py} (90%) diff --git a/backend/cmd/main.go b/backend/cmd/main.go index a8ad0e2a9..2f18bc11d 100644 --- a/backend/cmd/main.go +++ b/backend/cmd/main.go @@ -12,6 +12,7 @@ import ( "net/http" _ "net/http/pprof" "os" + "os/exec" "os/signal" "path" "runtime" @@ -105,6 +106,13 @@ func main() { trace.Fatal().Err(err).Msg("setting up ADJ") } + test := exec.Command("python3", "testadj.py") + out, err := test.CombinedOutput() + if err != nil || len(out) != 0 { + fmt.Printf("\nPython test failed:\nError: %v\nOutput: %s\n", err, string(out)) + os.Exit(1) + } + podData, err := pod_data.NewPodData(adj.Boards, adj.Info.Units) if err != nil { fmt.Println(err) diff --git a/backend/cmd/testpython.py b/backend/cmd/testadj.py similarity index 90% rename from backend/cmd/testpython.py rename to backend/cmd/testadj.py index 955e63f6e..72ba3c160 100644 --- a/backend/cmd/testpython.py +++ b/backend/cmd/testadj.py @@ -1,12 +1,10 @@ import os import json -from collections import Counter def validate_json_structure(data): errors = [] - if "board_id" in data: if not isinstance(data["board_id"], int): errors.append(f"'board_id' debe ser un entero, pero se encontró: {type(data['board_id']).__name__}.") @@ -15,13 +13,13 @@ def validate_json_structure(data): if not isinstance(data["board_ip"], str): errors.append(f"'board_ip' debe ser una cadena, pero se encontró: {type(data['board_ip']).__name__}.") - + if "measurements" in data: if not isinstance(data["measurements"], list): errors.append("La clave 'measurements' debe ser una lista.") else: for measurement in data["measurements"]: - if isinstance(measurement, dict): + if isinstance(measurement, dict): required_keys = ["id", "name", "type", "podUnits", "displayUnits"] for key in required_keys: if key not in measurement: @@ -40,17 +38,17 @@ def validate_json_structure(data): errors.append(f"El 'podUnits' debe ser una cadena en: {measurement}") if "podUnits" in measurement and not isinstance(measurement["podUnits"], str): errors.append(f"El 'podUnits' debe ser una cadena en: {measurement}") #esto se puede quitar (json 516) - elif not isinstance(measurement, str): + elif not isinstance(measurement, str): errors.append("Cada elemento en 'measurements' debe ser un objeto o una cadena (nombre de archivo).") - + if "packets" in data: if not isinstance(data["packets"], list): errors.append("La clave 'packets' debe ser una lista.") else: for packet in data["packets"]: - if isinstance(packet, dict): - required_keys = ["id", "name", "type","variable"] + if isinstance(packet, dict): + required_keys = ["id", "name", "type","variable"] for key in required_keys: if key not in packet: errors.append(f"Falta la clave '{key}' en un objeto de 'packets'.") @@ -69,7 +67,7 @@ def validate_json_structure(data): errors.append(f"Cada elemento en 'variables' debe ser un objeto en: {packet}") if "name" not in variable: errors.append(f"Falta la clave 'name' en un objeto de 'variables' en: {packet}") - elif not isinstance(packet, str): + elif not isinstance(packet, str): errors.append("Cada elemento en 'packets' debe ser un objeto o una cadena (nombre de archivo).") return errors @@ -78,19 +76,19 @@ def validate_json_structure(data): def validate_json_folder(folder_path): boards_file_path = os.path.join(folder_path, "boards.json") - + try: with open(boards_file_path, 'r') as boards_file: boards_data = json.load(boards_file) boards = boards_data.get("boards", {}) - - + + board_keys = list(boards.keys()) duplicate_keys = [key for key in board_keys if board_keys.count(key) > 1] - + if duplicate_keys: print(f"Error: El archivo boards.json contiene claves duplicadas: {', '.join(duplicate_keys)}") - return + return except json.JSONDecodeError as e: print(f"Error al decodificar JSON en {boards_file_path}: {e}") @@ -99,7 +97,7 @@ def validate_json_folder(folder_path): print(f"Error al procesar el archivo {boards_file_path}: {e}") return - + for board_name, board_file_path in boards.items(): full_path = os.path.join(folder_path, board_file_path) try: @@ -110,19 +108,14 @@ def validate_json_folder(folder_path): print(f"Errores encontrados en {full_path} para la placa '{board_name}':") for error in errors: print(f"- {error}") - else: - print(f"{full_path} para la placa '{board_name}' está bien estructurado.") + except json.JSONDecodeError as e: print(f"Error al decodificar JSON en {full_path}: {e}") except Exception as e: - print(f"Error al procesar el archivo {full_path}: {e}") - - + print(f"Error al procesar el archivo {full_path}: {e}") -if os.path.exists('./JSON_ADE/'): - print("La carpeta JSON_ADE existe") -else: +if os.path.exists('./JSON_ADE/') == False: print("La carpeta JSON_ADE no existe") if __name__ == "__main__": - validate_json_folder("./JSON_ADE/") + validate_json_folder("./JSON_ADE/") From b2d63d0d4d389fdcc4f55925579203b925d5e770 Mon Sep 17 00:00:00 2001 From: Jesus Date: Thu, 6 Feb 2025 18:03:21 +0100 Subject: [PATCH 11/20] update --- packet-sender/PacketGenerator.go | 40 ++++++++---------------------- packet-sender/main.go | 42 ++++++++++++++++++++++++++++++++ 2 files changed, 52 insertions(+), 30 deletions(-) diff --git a/packet-sender/PacketGenerator.go b/packet-sender/PacketGenerator.go index 72b54d920..4144a379e 100644 --- a/packet-sender/PacketGenerator.go +++ b/packet-sender/PacketGenerator.go @@ -208,17 +208,17 @@ func (pg *PacketGenerator) AddPacket(boardName string, packet adj.Packet) { HexValue: "", Count: 0, CycleTime: 0, - Measurements: getMeasurements(packet.Values), + Measurements: getMeasurements(packet.Variables), }) } -func getMeasurements(values []adj.Measurement) []Measurement { - measurements := make([]Measurement, 0, len(values)) - for _, value := range values { +func getMeasurements(variables []adj.Measurement) []Measurement { + measurements := make([]Measurement, 0, len(variables)) + for _, value := range variables { measurements = append(measurements, Measurement{ - ID: value.ID, + ID: value.Id, Name: value.Name, Type: value.Type, //TODO: make sure added property (Value) doesn't break stuff @@ -232,37 +232,17 @@ func getMeasurements(values []adj.Measurement) []Measurement { return measurements } -func parseRange(literal string) []float64 { // adaptar con rangos del ADJ?? - if literal == "" { +func parseRange(literal []*float64) []float64 { + if len(literal) == 0 { return make([]float64, 0) } - strRange := strings.Split(strings.TrimSuffix(strings.TrimPrefix(strings.Replace(literal, " ", "", -1), "["), "]"), ",") - - if len(strRange) != 2 { - log.Fatalf("pod data: parseRange: invalid range %s\n", literal) - } - numRange := make([]float64, 0) - if strRange[0] != "" { - lowerBound, errLowerBound := strconv.ParseFloat(strRange[0], 64) - - if errLowerBound != nil { - log.Fatal("error parsing lower bound") - } - - numRange = append(numRange, lowerBound) - } - - if strRange[1] != "" { - upperBound, errUpperBound := strconv.ParseFloat(strRange[1], 64) - - if errUpperBound != nil { - log.Fatal("error parsing lower bound") + for _, val := range literal { + if val != nil { + numRange = append(numRange, *val) } - - numRange = append(numRange, upperBound) } return numRange diff --git a/packet-sender/main.go b/packet-sender/main.go index 4c5abcc19..dc920449d 100644 --- a/packet-sender/main.go +++ b/packet-sender/main.go @@ -18,6 +18,48 @@ const ( rport uint16 = 50400 ) +/* package main + +import ( + "encoding/json" + "fmt" + "log" + + "github.com/HyperloopUPV-H8/h9-backend/internal/adj" +) + +func main() { + + adjInstance, err := adj.NewADJ() + if err != nil { + log.Fatalf("Error initializing ADJ: %v", err) + } + + + packets := generatePackets(adjInstance) + + + output, err := json.MarshalIndent(packets, "", " ") + if err != nil { + log.Fatalf("Error marshalling packets: %v", err) + } + + fmt.Println(string(output)) +} + + +func generatePackets(adjInstance adj.ADJ) []adj.Packet { + var allPackets []adj.Packet + + for _, board := range adjInstance.Boards { + for _, packet := range board.Packets { + allPackets = append(allPackets, packet) + } + } + + return allPackets +}*/ + func main() { err := godotenv.Load(".env") From b3d09a4233ed5739d231a937099ed2b724831fb1 Mon Sep 17 00:00:00 2001 From: Jesus Date: Thu, 6 Feb 2025 18:07:32 +0100 Subject: [PATCH 12/20] Port solution for windows --- packet-sender/main.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packet-sender/main.go b/packet-sender/main.go index dc920449d..b7383c77e 100644 --- a/packet-sender/main.go +++ b/packet-sender/main.go @@ -13,9 +13,9 @@ import ( const ( lip string = "127.0.0.3" - lport uint16 = 50400 + lport uint16 = 3000 rip string = "127.0.0.4" - rport uint16 = 50400 + rport uint16 = 3000 ) /* package main From 8f9a9adeaea7aaac815f5e9d9aa7251de05aa839 Mon Sep 17 00:00:00 2001 From: msanlli Date: Thu, 6 Feb 2025 18:49:29 +0100 Subject: [PATCH 13/20] adapt config to ADJ --- backend/cmd/config.go | 5 +++-- backend/cmd/config.toml | 5 ++++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/backend/cmd/config.go b/backend/cmd/config.go index 3cb268afe..80908c01e 100644 --- a/backend/cmd/config.go +++ b/backend/cmd/config.go @@ -6,6 +6,7 @@ import ( ) type Config struct { - Vehicle vehicle.Config - Server server.Config + Vehicle vehicle.Config + Server server.Config + AdjBranch string } diff --git a/backend/cmd/config.toml b/backend/cmd/config.toml index 297584b3f..33ee414db 100644 --- a/backend/cmd/config.toml +++ b/backend/cmd/config.toml @@ -11,4 +11,7 @@ connections = "/backend" files = "/" [vehicle] -boardsList = ["VCU"] \ No newline at end of file +boardsList = ["VCU"] + +[adj] +branch = "" # Leave blank when using ADJ as a submodule From ea604f2532b4e89b486524a40e9c83223eb4a765 Mon Sep 17 00:00:00 2001 From: msanlli Date: Thu, 6 Feb 2025 18:50:12 +0100 Subject: [PATCH 14/20] adapt main to branch selector --- backend/cmd/main.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/cmd/main.go b/backend/cmd/main.go index a8ad0e2a9..39276ec7a 100644 --- a/backend/cmd/main.go +++ b/backend/cmd/main.go @@ -100,7 +100,7 @@ func main() { // <--- ADJ ---> - adj, err := adj_module.NewADJ() + adj, err := adj_module.NewADJ(config.AdjBranch) if err != nil { trace.Fatal().Err(err).Msg("setting up ADJ") } From 2e0ad3c7e00b3cadb56e6886f69e533ba9eede9e Mon Sep 17 00:00:00 2001 From: msanlli Date: Thu, 6 Feb 2025 20:28:39 +0100 Subject: [PATCH 15/20] fix config struct --- backend/cmd/config.go | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/backend/cmd/config.go b/backend/cmd/config.go index 80908c01e..e80b70d52 100644 --- a/backend/cmd/config.go +++ b/backend/cmd/config.go @@ -5,8 +5,11 @@ import ( "github.com/HyperloopUPV-H8/h9-backend/internal/vehicle" ) +type Adj struct { + Branch string +} type Config struct { - Vehicle vehicle.Config - Server server.Config - AdjBranch string + Vehicle vehicle.Config + Server server.Config + Adj Adj } From da4790168fa4d6e2211a1ebf9fc835684a15b503 Mon Sep 17 00:00:00 2001 From: msanlli Date: Thu, 6 Feb 2025 20:29:15 +0100 Subject: [PATCH 16/20] adjust main to new struct --- backend/cmd/main.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/backend/cmd/main.go b/backend/cmd/main.go index 39276ec7a..618506903 100644 --- a/backend/cmd/main.go +++ b/backend/cmd/main.go @@ -96,11 +96,12 @@ func main() { defer pprof.StopCPUProfile() } runtime.SetBlockProfileRate(*blockprofile) + config := getConfig("./config.toml") // <--- ADJ ---> - adj, err := adj_module.NewADJ(config.AdjBranch) + adj, err := adj_module.NewADJ(config.Adj.Branch) if err != nil { trace.Fatal().Err(err).Msg("setting up ADJ") } From 6ce939a62865cd0d1645ec611d752ca79f101ecd Mon Sep 17 00:00:00 2001 From: msanlli Date: Fri, 7 Feb 2025 18:58:49 +0100 Subject: [PATCH 17/20] git plumbing --- backend/internal/adj/adj.go | 110 +++++++++++++++++++++++++++++++----- 1 file changed, 95 insertions(+), 15 deletions(-) diff --git a/backend/internal/adj/adj.go b/backend/internal/adj/adj.go index 52c02d2e1..7a6ba9ea3 100644 --- a/backend/internal/adj/adj.go +++ b/backend/internal/adj/adj.go @@ -7,6 +7,7 @@ import ( "github.com/HyperloopUPV-H8/h9-backend/internal/utils" "github.com/go-git/go-git/v5" + "github.com/go-git/go-git/v5/plumbing" ) const ( @@ -14,8 +15,8 @@ const ( RepoPath = "./JSON_ADE/" // Path where the ADJ repository is cloned ) -func NewADJ() (ADJ, error) { - infoRaw, boardsRaw, err := downloadADJ() +func NewADJ(AdjBranch string) (ADJ, error) { + infoRaw, boardsRaw, err := downloadADJ(AdjBranch) if err != nil { return ADJ{}, err } @@ -73,15 +74,8 @@ func NewADJ() (ADJ, error) { return adj, nil } -func downloadADJ() (json.RawMessage, json.RawMessage, error) { - if !checkRepo() { - _, err := git.PlainClone(RepoPath, false, &git.CloneOptions{ - URL: RepoUrl, - }) - if err != nil { - return nil, nil, err - } - } +func downloadADJ(AdjBranch string) (json.RawMessage, json.RawMessage, error) { + updateRepo(AdjBranch) // The BoardIds are applied in the NewADJ function by the getBoardIds function info, err := os.ReadFile(RepoPath + "general_info.json") @@ -97,12 +91,98 @@ func downloadADJ() (json.RawMessage, json.RawMessage, error) { return info, boardsList, nil } -func checkRepo() bool { - if _, err := os.Stat(RepoPath); os.IsNotExist(err) { - return false +// WARNING: Doing tricks on it +func updateRepo(AdjBranch string) error { + var repo *git.Repository + var err error + + if AdjBranch == "" { + // Makes use of submodule + return nil + } else { + if _, err = os.Stat(RepoPath); os.IsNotExist(err) { + repo, err = git.PlainClone(RepoPath, false, &git.CloneOptions{ + URL: RepoUrl, + ReferenceName: plumbing.NewBranchReferenceName(AdjBranch), + SingleBranch: true, + Depth: 1, + }) + if err != nil { + return err + } + } else { + repo, err = git.PlainOpen(RepoPath) + if err != nil { + return err + } + } + + err = repo.Fetch(&git.FetchOptions{ + RemoteName: "origin", + Force: true, + }) + if err != nil && err != git.NoErrAlreadyUpToDate { + return err + } + + head, err := repo.Head() + if err != nil { + return err + } + + branch := head.Name().Short() + + println("actual branch is: ", branch) + + worktree, err := repo.Worktree() + if err != nil { + return err + } + + println(head.Name().Short(), AdjBranch) + + if branch != AdjBranch { + localBranchRef := plumbing.NewBranchReferenceName(AdjBranch) + _, err = repo.Reference(localBranchRef, false) + if err != nil { + remoteBranchRef := plumbing.NewRemoteReferenceName("origin", AdjBranch) + remoteRef, err2 := repo.Reference(remoteBranchRef, true) + if err2 != nil { + return err2 + } + + err = worktree.Checkout(&git.CheckoutOptions{ + Branch: localBranchRef, + Create: true, + Force: true, + Hash: remoteRef.Hash(), + }) + if err != nil { + println(err.Error()) + return err + } + } else { + err = worktree.Checkout(&git.CheckoutOptions{ + Branch: localBranchRef, + Force: true, + }) + } + } + + err = worktree.Pull(&git.PullOptions{ + RemoteName: "origin", + SingleBranch: true, + }) + if err != nil { + if err == git.NoErrAlreadyUpToDate { + return nil + } else { + return err + } + } } - return true + return nil } func getBoards(boardsList map[string]string) (map[string]Board, error) { From e09bbdae15800b0a986873dadeab3d8e31920b2c Mon Sep 17 00:00:00 2001 From: msanlli Date: Fri, 7 Feb 2025 18:59:18 +0100 Subject: [PATCH 18/20] make toml select adj main by default --- backend/cmd/config.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/cmd/config.toml b/backend/cmd/config.toml index 33ee414db..8a9f54fa1 100644 --- a/backend/cmd/config.toml +++ b/backend/cmd/config.toml @@ -14,4 +14,4 @@ files = "/" boardsList = ["VCU"] [adj] -branch = "" # Leave blank when using ADJ as a submodule +branch = "main" # Leave blank when using ADJ as a submodule From c1f026cc5feca58cb3204b568151b42e02a94fb4 Mon Sep 17 00:00:00 2001 From: Jesus Date: Sat, 8 Feb 2025 00:25:34 +0100 Subject: [PATCH 19/20] Change port (front) --- packet-sender/main.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packet-sender/main.go b/packet-sender/main.go index b7383c77e..9e367c0b0 100644 --- a/packet-sender/main.go +++ b/packet-sender/main.go @@ -13,9 +13,9 @@ import ( const ( lip string = "127.0.0.3" - lport uint16 = 3000 + lport uint16 = 8000 rip string = "127.0.0.4" - rport uint16 = 3000 + rport uint16 = 8000 ) /* package main From a519084cb358e60813df4afc9964ee33a35de5ad Mon Sep 17 00:00:00 2001 From: Jesus Date: Sat, 8 Feb 2025 00:58:35 +0100 Subject: [PATCH 20/20] Remove.env from main --- packet-sender/main.go | 8 -------- 1 file changed, 8 deletions(-) diff --git a/packet-sender/main.go b/packet-sender/main.go index 9e367c0b0..cd308029f 100644 --- a/packet-sender/main.go +++ b/packet-sender/main.go @@ -7,8 +7,6 @@ import ( "os" "os/signal" "time" - - "github.com/joho/godotenv" ) const ( @@ -61,12 +59,6 @@ func generatePackets(adjInstance adj.ADJ) []adj.Packet { }*/ func main() { - err := godotenv.Load(".env") - - if err != nil { - log.Fatal("Error loading .env", err) - } - _ = createListener(lip, lport, rip, rport) conn := getConn(lip, lport, rip, rport) defer conn.Close()