Skip to content

Commit 81875c6

Browse files
authored
Merge pull request #73 from mutablelogic/v4
Lots of changes
2 parents 24e3614 + 7825f01 commit 81875c6

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

80 files changed

+7849
-258
lines changed

Makefile

+13-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
# Paths to tools needed in dependencies
22
GO := $(shell which go)
33
DOCKER := $(shell which docker)
4+
NPM := $(shell which npm)
45

56
# Build flags
67
BUILD_MODULE := $(shell cat go.mod | head -1 | cut -d ' ' -f 2)
@@ -21,15 +22,18 @@ DOCKER_REGISTRY ?= ghcr.io/mutablelogic
2122
BUILD_DIR := "build"
2223
CMD_DIR := $(wildcard cmd/*)
2324
PLUGIN_DIR := $(wildcard plugin/*)
25+
NPM_DIR := $(wildcard npm/*)
2426
BUILD_TAG := ${DOCKER_REGISTRY}/go-server-${OS}-${ARCH}:${VERSION}
2527

2628
# Targets
27-
all: clean cmds plugins
29+
all: clean plugins cmds npm
2830

2931
cmds: $(CMD_DIR)
3032

3133
plugins: $(PLUGIN_DIR)
3234

35+
npm: $(NPM_DIR)
36+
3337
docker: docker-dep
3438
@echo build docker image: ${BUILD_TAG} for ${OS}/${ARCH}
3539
@${DOCKER} build \
@@ -60,8 +64,16 @@ $(PLUGIN_DIR): go-dep mkdir
6064
@echo Build plugin $(notdir $@)
6165
@${GO} build -buildmode=plugin ${BUILD_FLAGS} -o ${BUILD_DIR}/$(notdir $@).plugin ./$@
6266

67+
$(NPM_DIR): npm-dep mkdir
68+
@echo Build npm $(notdir $@)
69+
@cd $@ && npm install && npm run build
70+
@${GO} build -buildmode=plugin ${BUILD_FLAGS} -o ${BUILD_DIR}/$(notdir $@).npm.plugin ./$@
71+
6372
FORCE:
6473

74+
npm-dep:
75+
@test -f "${NPM}" && test -x "${NPM}" || (echo "Missing nom binary" && exit 1)
76+
6577
go-dep:
6678
@test -f "${GO}" && test -x "${GO}" || (echo "Missing go binary" && exit 1)
6779

cmd/http-server/main.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ func main() {
4242
if err != nil {
4343
log.Fatal(err)
4444
}
45-
static, err := static.Config{FS: filesys, Dir: true}.New()
45+
static, err := static.Config{FS: filesys, DirListing: true}.New()
4646
if err != nil {
4747
log.Fatal(err)
4848
}

cmd/nginx-server/main.go

+17-5
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111

1212
// Packages
1313
server "github.com/mutablelogic/go-server"
14+
routerFrontend "github.com/mutablelogic/go-server/npm/router"
1415
ctx "github.com/mutablelogic/go-server/pkg/context"
1516
auth "github.com/mutablelogic/go-server/pkg/handler/auth"
1617
certmanager "github.com/mutablelogic/go-server/pkg/handler/certmanager"
@@ -119,9 +120,13 @@ func main() {
119120
tasks = append(tasks, certmanager)
120121
}
121122

122-
// Location of the FCGI unix socket - this should be the same
123-
// as that listed in the nginx configuration
124-
socket := filepath.Join(n.(nginx.Nginx).DataPath(), "nginx/go-server.sock")
123+
// Router frontend
124+
routerFrontend, err := routerFrontend.Config{}.New()
125+
if err != nil {
126+
log.Fatal("routerFrontend: ", err)
127+
} else {
128+
tasks = append(tasks, routerFrontend)
129+
}
125130

126131
// Router
127132
// TODO: Promote middleware to the root of the configuration to reduce
@@ -157,10 +162,13 @@ func main() {
157162
tasks = append(tasks, r)
158163
}
159164

160-
// Add router
165+
// Add router and frontend
166+
// The API is served from http[s]://[any]/api/router and the frontend is served from http[s]://static/router
167+
// see the nginx default configuration to understand how the routing occurs in the proxy
161168
r.(router.Router).AddServiceEndpoints("router", r.(server.ServiceEndpoints), logger.(server.Middleware), auth.(server.Middleware))
169+
r.(router.Router).AddServiceEndpoints("static/router", routerFrontend.(server.ServiceEndpoints), logger.(server.Middleware))
162170

163-
// LDAP
171+
// LDAP gets enabled if a password is set
164172
if *ldap_password != "" {
165173
ldap, err := ldap.Config{
166174
URL: "ldap://admin@cm1.local/",
@@ -175,6 +183,10 @@ func main() {
175183
}
176184
}
177185

186+
// Location of the FCGI unix socket - this should be the same
187+
// as that listed in the nginx configuration
188+
socket := filepath.Join(n.(nginx.Nginx).DataPath(), "nginx/go-server.sock")
189+
178190
// HTTP Server
179191
httpserver, err := httpserver.Config{
180192
Listen: socket,

cmd/run/main.go

+30-42
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99
"strings"
1010

1111
// Packages
12+
1213
"github.com/mutablelogic/go-server/pkg/provider"
1314
)
1415

@@ -46,7 +47,8 @@ func main() {
4647

4748
// Create configurations
4849
var result error
49-
for _, plugin := range []string{"logger", "httpserver", "router", "nginx-handler", "auth-handler", "tokenjar-handler"} {
50+
for _, plugin := range []string{"logger", "httpserver", "router", "router-frontend", "nginx-handler", "auth-handler", "tokenjar-handler"} {
51+
// Create a new configuration for the plugin
5052
if _, err := provider.New(plugin); err != nil {
5153
result = errors.Join(result, err)
5254
}
@@ -56,48 +58,34 @@ func main() {
5658
os.Exit(1)
5759
}
5860

59-
// TODO: Set parameters from a JSON file
61+
// Create configuration manually
62+
// SET does not actually set it:
63+
// - checks the field exists
64+
// - updates the dependencies between fields
65+
// - marks that the value should be set later
66+
// - there is a binding stage later which actually sets the value
67+
// - this also ensures we set things in the right order
68+
// GET will:
69+
// - check the field exists
70+
// - return a reference to the value if not applied yet
6071
provider.Set("logger.flags", []string{"default", "prefix"})
72+
73+
provider.Set("nginx.binary", "/usr/local/bin/nginx")
74+
provider.Set("nginx.data", "/var/run/nginx")
75+
provider.Set("nginx.group", "www-data")
76+
77+
provider.Set("httpserver.listen", "run/go-server.sock")
78+
provider.Set("httpserver.group", "www-data")
79+
provider.Set("httpserver.router", provider.Get("router"))
80+
81+
provider.Set("auth.tokenjar", provider.Get("tokenjar"))
82+
provider.Set("auth.tokenbytes", 16)
83+
provider.Set("auth.bearer", true)
84+
85+
provider.Set("tokenjar.data", "run")
86+
provider.Set("tokenjar.writeinterval", "30s")
6187
}
6288

6389
/*
64-
{
65-
"logger": {
66-
"flags": ["default", "prefix"]
67-
},
68-
"nginx": {
69-
"binary": "/usr/local/bin/nginx",
70-
"data": "/var/run/nginx",
71-
"group": "www-data",
72-
},
73-
httpserver": {
74-
"listen": "run/go-server.sock",
75-
"group": "www-data",
76-
"router": "${ router }",
77-
},
78-
"router": {
79-
"services": {
80-
"nginx": {
81-
"service": "${ nginx }",
82-
"middleware": ["logger", "auth"]
83-
},
84-
"auth": {
85-
"service": "${ auth }",
86-
"middleware": ["logger", "auth"]
87-
},
88-
"router": {
89-
"service": "${ router }",
90-
"middleware": ["logger", "auth"]
91-
},
92-
},
93-
"auth": {
94-
"tokenjar": "${ tokenjar }",
95-
"tokenbytes": 16,
96-
"bearer": true,
97-
},
98-
"tokenjar": {
99-
"data": "run",
100-
"writeinterval": "30s",
101-
},
102-
}
103-
*/
90+
91+
*/

etc/json/README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11

2-
# JSON configuration files
2+
# JSON configuration & parser test files
33

44
Examples of JSON configuration files for the run command. This is not yet
55
implemented, but will be in the future.

etc/json/nginx-proxy.json

+20-15
Original file line numberDiff line numberDiff line change
@@ -1,42 +1,47 @@
11
{
2-
"logger": {
2+
"var": {
3+
"nginx-binary": "/usr/local/bin/nginx",
4+
"nginx-data": "/var/run/nginx",
5+
"nginx-group": "nginx"
6+
},
7+
"logger.main": {
38
"flags": [
49
"default",
510
"prefix"
611
]
712
},
8-
"nginx": {
9-
"binary": "/usr/local/bin/nginx",
10-
"data": "/var/run/nginx",
11-
"group": "nginx"
13+
"nginx-handler.main": {
14+
"binary": "${ var.nginx-binary }",
15+
"data": "${ var.nginx-data }",
16+
"group": "${ var.nginx-group }"
1217
},
13-
"tokenjar": {
18+
"tokenjar-handler.main": {
1419
"data": "run",
1520
"writeinterval": "30s"
1621
},
17-
"auth": {
18-
"tokenjar": "${ tokenjar }",
22+
"auth-handler.main": {
23+
"tokenjar": "${ tokenjar-handler.main }",
1924
"tokenbytes": 16,
2025
"bearer": true
21-
},
22-
"router": {
26+
},
27+
"router.main": {
2328
"services": {
2429
"nginx": {
25-
"service": "${ nginx }",
30+
"service": "${ nginx-handler.main }",
2631
"middleware": [
2732
"logger",
2833
"auth"
2934
]
3035
},
3136
"auth": {
32-
"service": "${ auth }",
37+
"service": "${ auth-handler.main }",
3338
"middleware": [
3439
"logger",
3540
"auth"
3641
]
3742
},
3843
"router": {
39-
"service": "${ router }",
44+
"service": "${ router.main }",
4045
"middleware": [
4146
"logger",
4247
"auth"
@@ -47,6 +52,6 @@
4752
"httpserver": {
4853
"listen": "run/go-server.sock",
4954
"group": "nginx",
50-
"router": "${ router }"
55+
"router": "${ router.main }"
5156
}
52-
}
57+
}

etc/json/parser-test-002.json

+71
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
{
2+
"arrays": {
3+
"bool_array": [
4+
true,
5+
false
6+
],
7+
"string_array": [
8+
"default",
9+
"prefix"
10+
],
11+
"number_array": [
12+
1,
13+
2
14+
],
15+
"null_array": [
16+
null,
17+
null
18+
]
19+
},
20+
"maps": {
21+
"bool_map": {
22+
"true": true,
23+
"false": false
24+
},
25+
"string_map": {
26+
"default": "default",
27+
"prefix": "prefix"
28+
},
29+
"number_map": {
30+
"one": 1,
31+
"two": 2
32+
},
33+
"null_map": {
34+
"null1": null,
35+
"null2": null
36+
}
37+
},
38+
"fields": {
39+
"bool": true,
40+
"string": "string",
41+
"number": 1,
42+
"null": null
43+
},
44+
"map_of_array": {
45+
"bool_array": [
46+
true,
47+
false
48+
],
49+
"string_array": [
50+
"default",
51+
"prefix"
52+
],
53+
"number_array": [
54+
1,
55+
2
56+
],
57+
"null_array": [
58+
null,
59+
null
60+
]
61+
},
62+
"empty_map": {},
63+
"empty_map_array": {
64+
"array1": [],
65+
"array2": []
66+
},
67+
"empty_map_map": {
68+
"map1": {},
69+
"map2": {}
70+
}
71+
}

etc/json/parser-test-003.json

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
{
2+
"plugin": {
3+
"string": "string",
4+
"number": 1,
5+
"null": null,
6+
"bool": true
7+
}
8+
}

0 commit comments

Comments
 (0)