Skip to content

Commit 53d8c7f

Browse files
authored
Systematizing preparation for minor release candidate (#6)
* feat: example client & server functions * fix: default target TCP server IP * feat: sample MQTT demo with Go * feat: example TCP republisher via server * fix: message payload contents (topic + data) * fix: build location & dependency requirements * feat: first draft at continuous integration (CI) workflow * feat: meta-testing for AETB & static binary name * nit: upgrade transitive/direct dependencies https://go.dev/doc/modules/managing-dependencies
1 parent 9058f1d commit 53d8c7f

File tree

9 files changed

+202
-24
lines changed

9 files changed

+202
-24
lines changed

.github/workflows/go.yml

+15-14
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,30 @@
11
# This workflow will build a golang project
22
# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-go
33

4-
name: Go
4+
name: ARCTIC Energy Testbed
55

66
on:
77
push:
8-
branches: [ "main" ]
8+
branches: ["main"]
99
pull_request:
10-
branches: [ "main" ]
10+
branches: ["main"]
1111

1212
jobs:
13-
1413
build:
1514
runs-on: ubuntu-latest
1615
steps:
17-
- uses: actions/checkout@v3
16+
- uses: actions/checkout@v3
17+
18+
- name: Set up Go
19+
uses: actions/setup-go@v4
20+
with:
21+
go-version: "1.21.x"
1822

19-
- name: Set up Go
20-
uses: actions/setup-go@v4
21-
with:
22-
go-version: '1.20'
23-
# FIXME: match version format (actions/setup-go/pull/410).
23+
- name: Install dependencies
24+
run: go get .
2425

25-
# - name: Build
26-
# run: go build -v ./...
26+
- name: Build
27+
run: go build -o diode .
2728

28-
# - name: Test
29-
# run: go test -v ./...
29+
- name: Test with the Go CLI
30+
run: go test

sample/Pipfile renamed to Pipfile

+2-1
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,9 @@ verify_ssl = true
44
name = "pypi"
55

66
[packages]
7+
paho-mqtt = "*"
78

89
[dev-packages]
910

1011
[requires]
11-
python_version = "3.11"
12+
python_version = "3.10"

Pipfile.lock

+28
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

README.md

+2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
# Data Diode
22
Scripts for verifying TCP passthrough functionality.
33

4+
## Development Environment
5+
46
## Architecture Diagram
57

68
## User Stories

go.mod

+8-4
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,20 @@
1-
module acep-uaf/cli/diode
1+
module github.com/acep-uaf/data-diode
22

3-
go 1.21.4
3+
go 1.21.6
44

55
require (
6-
github.com/urfave/cli/v2 v2.25.7
6+
github.com/eclipse/paho.mqtt.golang v1.4.3
7+
github.com/urfave/cli/v2 v2.27.1
78
rsc.io/quote v1.5.2
89
)
910

1011
require (
1112
github.com/cpuguy83/go-md2man/v2 v2.0.3 // indirect
13+
github.com/gorilla/websocket v1.5.1 // indirect
1214
github.com/russross/blackfriday/v2 v2.1.0 // indirect
13-
github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 // indirect
15+
github.com/xrash/smetrics v0.0.0-20231213231151-1d8dd44e695e // indirect
16+
golang.org/x/net v0.20.0 // indirect
17+
golang.org/x/sync v0.6.0 // indirect
1418
golang.org/x/text v0.14.0 // indirect
1519
rsc.io/sampler v1.99.99 // indirect
1620
)

go.sum

+12-4
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,19 @@
11
github.com/cpuguy83/go-md2man/v2 v2.0.3 h1:qMCsGGgs+MAzDFyp9LpAe1Lqy/fY/qCovCm0qnXZOBM=
22
github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
3+
github.com/eclipse/paho.mqtt.golang v1.4.3 h1:2kwcUGn8seMUfWndX0hGbvH8r7crgcJguQNCyp70xik=
4+
github.com/eclipse/paho.mqtt.golang v1.4.3/go.mod h1:CSYvoAlsMkhYOXh/oKyxa8EcBci6dVkLCbo5tTC1RIE=
5+
github.com/gorilla/websocket v1.5.1 h1:gmztn0JnHVt9JZquRuzLw3g4wouNVzKL15iLr/zn/QY=
6+
github.com/gorilla/websocket v1.5.1/go.mod h1:x3kM2JMyaluk02fnUJpQuwD2dCS5NDG2ZHL0uE0tcaY=
37
github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk=
48
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
5-
github.com/urfave/cli/v2 v2.25.7 h1:VAzn5oq403l5pHjc4OhD54+XGO9cdKVL/7lDjF+iKUs=
6-
github.com/urfave/cli/v2 v2.25.7/go.mod h1:8qnjx1vcq5s2/wpsqoZFndg2CE5tNFyrTvS6SinrnYQ=
7-
github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU=
8-
github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8=
9+
github.com/urfave/cli/v2 v2.27.1 h1:8xSQ6szndafKVRmfyeUMxkNUJQMjL1F2zmsZ+qHpfho=
10+
github.com/urfave/cli/v2 v2.27.1/go.mod h1:8qnjx1vcq5s2/wpsqoZFndg2CE5tNFyrTvS6SinrnYQ=
11+
github.com/xrash/smetrics v0.0.0-20231213231151-1d8dd44e695e h1:+SOyEddqYF09QP7vr7CgJ1eti3pY9Fn3LHO1M1r/0sI=
12+
github.com/xrash/smetrics v0.0.0-20231213231151-1d8dd44e695e/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8=
13+
golang.org/x/net v0.20.0 h1:aCL9BSgETF1k+blQaYUBx9hJ9LOGP3gAVemcZlf1Kpo=
14+
golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY=
15+
golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ=
16+
golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
917
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
1018
golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
1119
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=

mqtt/republish.py

+49
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
# Data Diode TCP Stream Republisher
2+
3+
import socket
4+
import paho.mqtt.client as mqtt
5+
import json
6+
from datetime import datetime
7+
8+
# Configuration Settings
9+
10+
targetTcpServerIP = "192.168.1.20"
11+
targetTcpServerPort = 503
12+
13+
mqttBrokerIP = "test.mosquitto.org"
14+
mqttBrokerPort = 1883
15+
mqttTopic = "test/message"
16+
17+
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
18+
server.bind((targetTcpServerIP, targetTcpServerPort))
19+
server.listen(1)
20+
21+
mqtt_client = mqtt.Client()
22+
mqtt_client.connect(mqttBrokerIP, mqttBrokerPort)
23+
24+
while True:
25+
print(">> Waiting for connection...")
26+
connection, client = server.accept()
27+
28+
try:
29+
print(">> Connected to client IP: {}".format(client))
30+
31+
while True:
32+
data = connection.recv(10240)
33+
if not data:
34+
break
35+
36+
# print(f">> Received data: {data.decode()}")
37+
38+
message = {
39+
"timestamp": datetime.utcnow().strftime("%Y-%m-%d %H:%M:%S"),
40+
"topic": mqttTopic,
41+
"data": data.decode()
42+
}
43+
44+
json_message = json.dumps(message)
45+
46+
mqtt_client.publish(mqttTopic, json_message)
47+
48+
finally:
49+
connection.close()

testbed.go

+67-1
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import (
1414
"os"
1515
"time"
1616

17+
mqtt "github.com/eclipse/paho.mqtt.golang"
1718
"github.com/urfave/cli/v2"
1819
"rsc.io/quote"
1920
)
@@ -111,6 +112,61 @@ func sampleMetrics() {
111112
fmt.Println(">> UTC time: ", time.Now().UTC())
112113
}
113114

115+
func demo() {
116+
mqttBrokerIP := "test.mosquitto.org"
117+
mqttBrokerPort := 1883
118+
mqttBrokerMessage := "Hello, world."
119+
mqttBrokerTopic := "test/message"
120+
121+
fmt.Println(">> MQTT")
122+
fmt.Println(">> Broker: ", mqttBrokerIP)
123+
fmt.Println(">> Port: ", mqttBrokerPort)
124+
125+
// Source: https://github.com/eclipse/paho.mqtt.golang/blob/master/cmd/simple/main.go
126+
var example mqtt.MessageHandler = func(client mqtt.Client, msg mqtt.Message) {
127+
fmt.Printf(">> Topic: %s\n", msg.Topic())
128+
fmt.Printf(">> Message: %s\n", msg.Payload())
129+
}
130+
131+
mqtt.DEBUG = log.New(os.Stdout, "", 0)
132+
mqtt.ERROR = log.New(os.Stdout, "", 0)
133+
134+
// Initial Connection
135+
opts := mqtt.NewClientOptions().AddBroker(fmt.Sprintf("tcp://%s:%d", mqttBrokerIP, mqttBrokerPort))
136+
opts.SetKeepAlive(2 * time.Second)
137+
opts.SetDefaultPublishHandler(example)
138+
opts.SetPingTimeout(1 * time.Second)
139+
140+
// Create and start a client using the above ClientOptions
141+
client := mqtt.NewClient(opts)
142+
if token := client.Connect(); token.Wait() && token.Error() != nil {
143+
panic(token.Error())
144+
}
145+
146+
// Subscribe to a topic
147+
if token := client.Subscribe(mqttBrokerTopic, 0, nil); token.Wait() && token.Error() != nil {
148+
fmt.Println(token.Error())
149+
os.Exit(1)
150+
}
151+
152+
// Publish to a topic
153+
token := client.Publish(mqttBrokerTopic, 0, false, mqttBrokerMessage)
154+
token.Wait()
155+
156+
time.Sleep(6 * time.Second)
157+
158+
// Disconnect from the broker
159+
if token := client.Unsubscribe(mqttBrokerTopic); token.Wait() && token.Error() != nil {
160+
fmt.Println(token.Error())
161+
os.Exit(1)
162+
}
163+
164+
client.Disconnect(250)
165+
166+
time.Sleep(1 * time.Second)
167+
168+
}
169+
114170
func main() {
115171

116172
// Configuration Options
@@ -172,12 +228,22 @@ func main() {
172228
return nil
173229
},
174230
},
231+
{
232+
Name: "mqtt",
233+
Aliases: []string{"m"},
234+
Usage: "MQTT (republisher) demo",
235+
Action: func(mCtx *cli.Context) error {
236+
fmt.Println("----- MQTT -----")
237+
demo()
238+
return nil
239+
},
240+
},
175241
{
176242
Name: "version",
177243
Aliases: []string{"v"},
178244
Usage: "Print the version of the diode CLI",
179245
Action: func(vCtx *cli.Context) error {
180-
fmt.Println(">> diode version 0.0.2")
246+
fmt.Println(">> diode version 0.0.3")
181247
return nil
182248
},
183249
},

testbed_test.go

+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package main
2+
3+
import (
4+
"testing"
5+
)
6+
7+
func TestNewClient(t *testing.T) {
8+
name := "Input"
9+
t.Run(name, func(t *testing.T) {
10+
t.Parallel()
11+
})
12+
}
13+
14+
func TestNewServer(t *testing.T) {
15+
name := "Output"
16+
t.Run(name, func(t *testing.T) {
17+
t.Parallel()
18+
})
19+
}

0 commit comments

Comments
 (0)