Skip to content

Commit f500d69

Browse files
authored
Merge pull request #97 from HyperloopUPV-H8/backend/messages-codec
[backend] New protection message codification
2 parents 101dce9 + 592640f commit f500d69

23 files changed

Lines changed: 743 additions & 880 deletions

File tree

.github/workflows/build-backend.yaml

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -72,16 +72,16 @@ jobs:
7272
- name: "Setup Go"
7373
uses: actions/setup-go@v4
7474
with:
75-
go-version: "1.19"
75+
go-version: "1.21.3"
7676
cache-dependency-path: "${{env.BACKEND_DIR}}\\go.sum"
7777

7878
- name: "Load secret"
7979
working-directory: "${{env.BACKEND_DIR}}"
8080
run: |
81-
echo "${{env.SECRET}}" > ".\internal\excel\secret.json" &&
82-
echo "${{env.SECRET}}" > ".\internal\excel_adapter\internals\secret.json" &&
83-
echo "${{env.SECRET}}" > ".\pkg\excel\secret.json" &&
84-
echo "${{env.SECRET}}" > ".\pkg\excel_adapter\internals\secret.json"
81+
echo "$env:SECRET" > ".\internal\excel\secret.json"
82+
echo "$env:SECRET" > ".\internal\excel_adapter\internals\secret.json"
83+
echo "$env:SECRET" > ".\pkg\excel\secret.json"
84+
echo "$env:SECRET" > ".\pkg\excel_adapter\internals\secret.json"
8585
8686
- name: "Create output path"
8787
working-directory: "${{env.BACKEND_DIR}}"
@@ -118,7 +118,7 @@ jobs:
118118
- name: "Setup Go"
119119
uses: actions/setup-go@v4
120120
with:
121-
go-version: "1.19"
121+
go-version: "1.21.3"
122122
cache-dependency-path: "${{env.BACKEND_DIR}}/go.sum"
123123

124124
- uses: actions/checkout@v3

backend/cmd/main.go

Lines changed: 69 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -33,15 +33,14 @@ import (
3333
h "github.com/HyperloopUPV-H8/h9-backend/pkg/http"
3434
"github.com/HyperloopUPV-H8/h9-backend/pkg/logger"
3535
data_logger "github.com/HyperloopUPV-H8/h9-backend/pkg/logger/data"
36-
messages_logger "github.com/HyperloopUPV-H8/h9-backend/pkg/logger/messages"
3736
order_logger "github.com/HyperloopUPV-H8/h9-backend/pkg/logger/order"
37+
protection_logger "github.com/HyperloopUPV-H8/h9-backend/pkg/logger/protection"
3838
state_logger "github.com/HyperloopUPV-H8/h9-backend/pkg/logger/state"
3939
"github.com/HyperloopUPV-H8/h9-backend/pkg/transport"
4040
"github.com/HyperloopUPV-H8/h9-backend/pkg/transport/network/sniffer"
4141
"github.com/HyperloopUPV-H8/h9-backend/pkg/transport/network/tcp"
4242
blcu_packet "github.com/HyperloopUPV-H8/h9-backend/pkg/transport/packet/blcu"
4343
"github.com/HyperloopUPV-H8/h9-backend/pkg/transport/packet/data"
44-
info_packet "github.com/HyperloopUPV-H8/h9-backend/pkg/transport/packet/info"
4544
"github.com/HyperloopUPV-H8/h9-backend/pkg/transport/packet/order"
4645
"github.com/HyperloopUPV-H8/h9-backend/pkg/transport/packet/protection"
4746
"github.com/HyperloopUPV-H8/h9-backend/pkg/transport/presentation"
@@ -50,6 +49,7 @@ import (
5049
"github.com/fatih/color"
5150
"github.com/google/gopacket/layers"
5251
"github.com/google/gopacket/pcap"
52+
"github.com/jmaralo/sntp"
5353
"github.com/pelletier/go-toml/v2"
5454
trace "github.com/rs/zerolog/log"
5555
)
@@ -117,10 +117,10 @@ func main() {
117117
// <--- logger --->
118118
var boardMap map[abstraction.BoardId]string
119119
var subloggers = map[abstraction.LoggerName]abstraction.Logger{
120-
data_logger.Name: data_logger.NewLogger(),
121-
messages_logger.Name: messages_logger.NewLogger(boardMap),
122-
order_logger.Name: order_logger.NewLogger(),
123-
state_logger.Name: state_logger.NewLogger(),
120+
data_logger.Name: data_logger.NewLogger(),
121+
protection_logger.Name: protection_logger.NewLogger(boardMap),
122+
order_logger.Name: order_logger.NewLogger(),
123+
state_logger.Name: state_logger.NewLogger(),
124124
}
125125

126126
loggerHandler := logger.NewLogger(subloggers)
@@ -159,17 +159,23 @@ func main() {
159159
broker.SetPool(pool)
160160

161161
// <--- transport --->
162-
orders := make(map[abstraction.PacketId]struct{})
163-
for _, board := range podData.Boards {
164-
for _, packet := range board.Packets {
165-
if packet.Type == "order" {
166-
orders[abstraction.PacketId(packet.Id)] = struct{}{}
167-
}
168-
}
162+
transp := transport.NewTransport()
163+
164+
// <--- vehicle --->
165+
ipToBoardId := make(map[string]abstraction.BoardId)
166+
for name, ip := range info.Addresses.Boards {
167+
ipToBoardId[ip.String()] = abstraction.BoardId(info.BoardIds[name])
169168
}
170169

171-
transp := transport.NewTransport()
170+
vehicle := vehicle.New()
171+
vehicle.SetBroker(broker)
172+
vehicle.SetLogger(loggerHandler)
173+
vehicle.SetUpdateFactory(updateFactory)
174+
vehicle.SetIpToBoardId(ipToBoardId)
175+
vehicle.SetIdToBoardName(idToBoard)
176+
vehicle.SetTransport(transp)
172177

178+
// <--- transport --->
173179
// Load and set packet decoder and encoder
174180
decoder, encoder := getTransportDecEnc(info, podData)
175181
transp.WithDecoder(decoder).WithEncoder(encoder)
@@ -182,17 +188,19 @@ func main() {
182188
}
183189

184190
// Start handling TCP client connections
185-
backendTcpClientAddr, err := net.ResolveTCPAddr("tcp", fmt.Sprintf("%s:%d", info.Addresses.Backend.String(), info.Ports.TcpClient))
186-
if err != nil {
187-
panic("Failed to resolve local backend TCP client address")
188-
}
191+
i := 0
189192
serverTargets := make(map[string]abstraction.TransportTarget)
190193
for _, board := range podData.Boards {
191194
if !common.Contains(config.Vehicle.Boards, board.Name) {
192195
serverTargets[fmt.Sprintf("%s:%d", info.Addresses.Boards[board.Name], info.Ports.TcpClient)] = abstraction.TransportTarget(board.Name)
193196
continue
194197
}
198+
backendTcpClientAddr, err := net.ResolveTCPAddr("tcp", fmt.Sprintf("%s:%d", info.Addresses.Backend.String(), info.Ports.TcpClient+uint16(i)))
199+
if err != nil {
200+
panic("Failed to resolve local backend TCP client address")
201+
}
195202
go transp.HandleClient(tcp.NewClient(backendTcpClientAddr), abstraction.TransportTarget(board.Name), "tcp", fmt.Sprintf("%s:%d", info.Addresses.Boards[board.Name], info.Ports.TcpServer))
203+
i++
196204
}
197205

198206
// Start handling TCP server connections
@@ -213,14 +221,6 @@ func main() {
213221
}
214222
go transp.HandleSniffer(sniffer.New(source, &layers.LayerTypeEthernet))
215223

216-
// <--- vehicle --->
217-
vehicle := vehicle.New()
218-
vehicle.SetBroker(broker)
219-
vehicle.SetLogger(loggerHandler)
220-
vehicle.SetUpdateFactory(updateFactory)
221-
vehicle.SetIdToBoardName(idToBoard)
222-
vehicle.SetTransport(transp)
223-
224224
// <--- http server --->
225225
podDataHandle, err := h.HandleDataJSON("podData.json", pod_data.GetDataOnlyPodData(podData))
226226
if err != nil {
@@ -251,6 +251,26 @@ func main() {
251251
go httpServer.ListenAndServe()
252252
}
253253

254+
// <--- SNTP --->
255+
sntpAddr, err := net.ResolveUDPAddr("udp", fmt.Sprintf("%s:%d", info.Addresses.Backend, info.Ports.SNTP))
256+
if err != nil {
257+
fmt.Fprintf(os.Stderr, "error resolving sntp address: %v\n", err)
258+
os.Exit(1)
259+
}
260+
sntpServer, err := sntp.NewUnicast("udp", sntpAddr)
261+
if err != nil {
262+
fmt.Fprintf(os.Stderr, "error creating sntp server: %v\n", err)
263+
os.Exit(1)
264+
}
265+
266+
go func() {
267+
err := sntpServer.ListenAndServe()
268+
if err != nil {
269+
fmt.Fprintf(os.Stderr, "error listening sntp server: %v\n", err)
270+
return
271+
}
272+
}()
273+
254274
interrupt := make(chan os.Signal, 1)
255275
signal.Notify(interrupt, os.Interrupt)
256276

@@ -426,19 +446,35 @@ func getTransportDecEnc(info info.Info, podData pod_data.PodData) (*presentation
426446

427447
decoder.SetPacketDecoder(abstraction.PacketId(info.MessageIds.BlcuAck), blcu_packet.NewDecoder())
428448

429-
decoder.SetPacketDecoder(abstraction.PacketId(info.MessageIds.Info), info_packet.NewDecoder(0))
430-
431449
stateOrdersDecoder := order.NewDecoder(binary.LittleEndian)
432450
stateOrdersDecoder.SetActionId(abstraction.PacketId(info.MessageIds.AddStateOrder), stateOrdersDecoder.DecodeAdd)
433451
stateOrdersDecoder.SetActionId(abstraction.PacketId(info.MessageIds.RemoveStateOrder), stateOrdersDecoder.DecodeRemove)
434452
decoder.SetPacketDecoder(abstraction.PacketId(info.MessageIds.AddStateOrder), stateOrdersDecoder)
435453
decoder.SetPacketDecoder(abstraction.PacketId(info.MessageIds.RemoveStateOrder), stateOrdersDecoder)
436454

437-
protectionDecoder := protection.NewDecoder()
438-
protectionDecoder.SetSeverity(abstraction.PacketId(info.MessageIds.Warning), protection.SeverityWarning)
439-
protectionDecoder.SetSeverity(abstraction.PacketId(info.MessageIds.Fault), protection.SeverityFault)
440-
decoder.SetPacketDecoder(abstraction.PacketId(info.MessageIds.Warning), protectionDecoder)
441-
decoder.SetPacketDecoder(abstraction.PacketId(info.MessageIds.Fault), protectionDecoder)
455+
protectionDecoder := protection.NewDecoder(binary.LittleEndian)
456+
protectionDecoder.SetSeverity(1000, protection.Fault).SetSeverity(2000, protection.Warning).SetSeverity(3000, protection.Ok)
457+
protectionDecoder.SetSeverity(1111, protection.Fault).SetSeverity(2111, protection.Warning).SetSeverity(3111, protection.Ok)
458+
protectionDecoder.SetSeverity(1222, protection.Fault).SetSeverity(2222, protection.Warning).SetSeverity(3222, protection.Ok)
459+
protectionDecoder.SetSeverity(1333, protection.Fault)
460+
protectionDecoder.SetSeverity(1444, protection.Fault)
461+
protectionDecoder.SetSeverity(1555, protection.Fault)
462+
protectionDecoder.SetSeverity(1666, protection.Fault).SetSeverity(2666, protection.Warning).SetSeverity(3666, protection.Ok)
463+
decoder.SetPacketDecoder(1000, protectionDecoder)
464+
decoder.SetPacketDecoder(1111, protectionDecoder)
465+
decoder.SetPacketDecoder(1222, protectionDecoder)
466+
decoder.SetPacketDecoder(1333, protectionDecoder)
467+
decoder.SetPacketDecoder(1444, protectionDecoder)
468+
decoder.SetPacketDecoder(1555, protectionDecoder)
469+
decoder.SetPacketDecoder(1666, protectionDecoder)
470+
decoder.SetPacketDecoder(2000, protectionDecoder)
471+
decoder.SetPacketDecoder(2111, protectionDecoder)
472+
decoder.SetPacketDecoder(2222, protectionDecoder)
473+
decoder.SetPacketDecoder(2666, protectionDecoder)
474+
decoder.SetPacketDecoder(3000, protectionDecoder)
475+
decoder.SetPacketDecoder(3111, protectionDecoder)
476+
decoder.SetPacketDecoder(3222, protectionDecoder)
477+
decoder.SetPacketDecoder(3666, protectionDecoder)
442478

443479
return decoder, encoder
444480
}

backend/go.mod

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
module github.com/HyperloopUPV-H8/h9-backend
22

3-
go 1.19
3+
go 1.21.3
44

55
require (
66
github.com/HyperloopUPV-H8/ade-linter v0.0.0-20230530153315-3379f05a664f
77
github.com/google/gopacket v1.1.19
88
github.com/google/uuid v1.3.0
99
github.com/gorilla/websocket v1.5.0
10+
github.com/jmaralo/sntp v0.0.0-20240116111937-45a0a3419272
1011
github.com/pelletier/go-toml/v2 v2.0.7
1112
github.com/pin/tftp/v3 v3.0.0
1213
github.com/pkg/errors v0.9.1

backend/go.sum

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ cloud.google.com/go/compute v1.19.1/go.mod h1:6ylj3a05WF8leseCdIf77NK0g1ey+nj5IK
55
cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY=
66
cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA=
77
cloud.google.com/go/longrunning v0.4.1 h1:v+yFJOfKC3yZdY6ZUI933pIYdhyhV8S3NpWrXWmg7jM=
8+
cloud.google.com/go/longrunning v0.4.1/go.mod h1:4iWDqhBZ70CvZ6BfETbvam3T8FMvLK+eFj0E6AaRQTo=
89
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
910
github.com/HyperloopUPV-H8/ade-linter v0.0.0-20230530153315-3379f05a664f h1:WxWQzMMuGKBTZZ1c/z+4cHckI3FxOpdoBl6kUpu1L/o=
1011
github.com/HyperloopUPV-H8/ade-linter v0.0.0-20230530153315-3379f05a664f/go.mod h1:y2zH0pjAkyEirrmjDq/O3lg03whnTSk5KPtQwJLr0Q4=
@@ -47,6 +48,7 @@ github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/
4748
github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
4849
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
4950
github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
51+
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
5052
github.com/google/gopacket v1.1.19 h1:ves8RnFZPGiFnTS0uPQStjwru6uO6h+nlr9j6fL7kF8=
5153
github.com/google/gopacket v1.1.19/go.mod h1:iJ8V8n6KS+z2U1A8pUwu8bW5SyEMkXJB8Yo/Vo+TKTo=
5254
github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
@@ -56,10 +58,10 @@ github.com/googleapis/enterprise-certificate-proxy v0.2.3 h1:yk9/cqRKtT9wXZSsRH9
5658
github.com/googleapis/enterprise-certificate-proxy v0.2.3/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k=
5759
github.com/googleapis/gax-go/v2 v2.7.1 h1:gF4c0zjUP2H/s/hEGyLA3I0fA2ZWjzYiONAD6cvPr8A=
5860
github.com/googleapis/gax-go/v2 v2.7.1/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI=
59-
github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI=
60-
github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So=
6161
github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc=
6262
github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
63+
github.com/jmaralo/sntp v0.0.0-20240116111937-45a0a3419272 h1:dtQzdBn2P781UxyDPZd1tv4QE29ffpnmJ15qBkXHypY=
64+
github.com/jmaralo/sntp v0.0.0-20240116111937-45a0a3419272/go.mod h1:nA+gdd8RXyFnxlLOCu0lOLGcQuwNklQfWOUL8fAFBDI=
6365
github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=
6466
github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
6567
github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=

backend/pkg/broker/topics/message/update.go

Lines changed: 15 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,6 @@ import (
77

88
"github.com/HyperloopUPV-H8/h9-backend/pkg/abstraction"
99
"github.com/HyperloopUPV-H8/h9-backend/pkg/broker/topics"
10-
"github.com/HyperloopUPV-H8/h9-backend/pkg/transport/packet"
11-
"github.com/HyperloopUPV-H8/h9-backend/pkg/transport/packet/info"
1210
"github.com/HyperloopUPV-H8/h9-backend/pkg/transport/packet/protection"
1311
"github.com/HyperloopUPV-H8/h9-backend/pkg/websocket"
1412
"github.com/google/uuid"
@@ -44,7 +42,7 @@ func (update *Update) Push(p abstraction.BrokerPush) error {
4442
return topics.ErrUnexpectedPush{Push: p}
4543
}
4644

47-
raw, err := json.Marshal(push.Data(update.idToBoard))
45+
raw, err := json.Marshal(push.Data(push.boardId, update.idToBoard))
4846
if err != nil {
4947
return err
5048
}
@@ -102,18 +100,19 @@ func (update *Update) SetAPI(api abstraction.BrokerAPI) {
102100
}
103101

104102
type push struct {
105-
data any
103+
data any
104+
boardId abstraction.BoardId
106105
}
107106

108-
func Push(data any) *push {
109-
return &push{data: data}
107+
func Push(data any, boardId abstraction.BoardId) *push {
108+
return &push{data: data, boardId: boardId}
110109
}
111110

112111
func (push *push) Topic() abstraction.BrokerTopic {
113112
return UpdateName
114113
}
115114

116-
func (push *push) Data(idToBoard map[abstraction.BoardId]string) wrapper {
115+
func (push *push) Data(boardID abstraction.BoardId, idToBoard map[abstraction.BoardId]string) wrapper {
117116
switch data := push.data.(type) {
118117
case *protection.Packet:
119118
return wrapper{
@@ -122,30 +121,21 @@ func (push *push) Data(idToBoard map[abstraction.BoardId]string) wrapper {
122121
Kind string `json:"kind"`
123122
Data any `json:"data"`
124123
}{
125-
Kind: string(data.Protection.Type),
126-
Data: data.Protection.Data,
124+
Kind: string(data.Data.Name()),
125+
Data: data.Data,
127126
},
128-
Board: string(idToBoard[data.BoardId]),
129-
Name: string(data.Protection.Name),
130-
Timestamp: data.Timestamp,
131-
}
132-
case *info.Packet:
133-
return wrapper{
134-
Kind: "info",
135-
Payload: string(data.Msg),
136-
Board: string(idToBoard[data.BoardId]),
137-
Name: "info",
127+
Board: string(idToBoard[boardID]),
128+
Name: string(data.Name),
138129
Timestamp: data.Timestamp,
139130
}
140131
}
141-
142132
return wrapper{}
143133
}
144134

145135
type wrapper struct {
146-
Kind string `json:"kind"`
147-
Payload any `json:"payload"`
148-
Board string `json:"board"`
149-
Name string `json:"name"`
150-
Timestamp packet.Timestamp `json:"timestamp"`
136+
Kind string `json:"kind"`
137+
Payload any `json:"payload"`
138+
Board string `json:"board"`
139+
Name string `json:"name"`
140+
Timestamp *protection.Timestamp `json:"timestamp"`
151141
}

backend/pkg/http/handlers.go

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,18 +41,20 @@ func (handle *handleData) ServeHTTP(writer http.ResponseWriter, request *http.Re
4141
}
4242

4343
type handleStatic struct {
44-
path string
44+
server http.Handler
4545
}
4646

4747
func HandleStatic(path string) *handleStatic {
4848
return &handleStatic{
49-
path: path,
49+
server: http.FileServer(http.Dir(path)),
5050
}
5151
}
5252

5353
func (handle *handleStatic) ServeHTTP(writer http.ResponseWriter, request *http.Request) {
5454
defer request.Body.Close()
5555

56+
writer.Header().Set("Cache-Control", "no-cache")
57+
writer.Header().Set("Pragma", "no-cache")
5658
writer.Header().Set("Access-Control-Allow-Origin", "*")
57-
http.ServeFile(writer, request, handle.path)
59+
handle.server.ServeHTTP(writer, request)
5860
}

0 commit comments

Comments
 (0)