Compare commits
22 Commits
v2023.8.14
...
2023.10.3-
Author | SHA1 | Date | |
---|---|---|---|
a84fa05c27 | |||
6c78bc5c7c | |||
75cab3264f | |||
1a270fa4d8 | |||
6318a8b497 | |||
3d7a094cb8 | |||
077964c7b9 | |||
3af6324121 | |||
b31900ae2f | |||
777648ff44 | |||
d9919c888f | |||
1eb3de4f16 | |||
9326bac792 | |||
3c1f5042c8 | |||
14eecbf01e | |||
c51ac0adc7 | |||
3e168dadf6 | |||
61ac5e8ae0 | |||
929394c479 | |||
a1ec5b87c8 | |||
5c36955c13 | |||
6cf01adb61 |
44
.chglog/CHANGELOG.tpl.md
Normal file
44
.chglog/CHANGELOG.tpl.md
Normal file
@ -0,0 +1,44 @@
|
||||
{{ if .Versions -}}
|
||||
{{ if .Unreleased.CommitGroups -}}
|
||||
<a name="unreleased"></a>
|
||||
## [Unreleased]
|
||||
|
||||
{{ range .Unreleased.CommitGroups -}}
|
||||
### {{ .Title }}
|
||||
{{ range .Commits -}}
|
||||
- {{ if .Scope }}**{{ .Scope }}:** {{ end }}{{ .Subject }}
|
||||
{{ end }}
|
||||
{{ end -}}
|
||||
{{ end -}}
|
||||
{{ end -}}
|
||||
|
||||
{{ range .Versions }}
|
||||
<a name="{{ .Tag.Name }}"></a>
|
||||
## {{ if .Tag.Previous }}[{{ .Tag.Name }}]{{ else }}{{ .Tag.Name }}{{ end }} - {{ datetime "2006-01-02" .Tag.Date }}
|
||||
{{ range .CommitGroups -}}
|
||||
### {{ .Title }}
|
||||
{{ range .Commits -}}
|
||||
- {{ if .Scope }}**{{ .Scope }}:** {{ end }}{{ .Subject }}
|
||||
{{ end }}
|
||||
{{ else }}
|
||||
_Nothing functionally significant._
|
||||
{{ end -}}
|
||||
|
||||
{{- if .NoteGroups -}}
|
||||
{{ range .NoteGroups -}}
|
||||
### {{ .Title }}
|
||||
{{ range .Notes }}
|
||||
{{ .Body }}
|
||||
{{ end }}
|
||||
{{ end -}}
|
||||
{{ end -}}
|
||||
{{ end -}}
|
||||
|
||||
{{- if .Versions }}
|
||||
[Unreleased]: {{ .Info.RepositoryURL }}/compare/{{ $latest := index .Versions 0 }}{{ $latest.Tag.Name }}...HEAD
|
||||
{{ range .Versions -}}
|
||||
{{ if .Tag.Previous -}}
|
||||
[{{ .Tag.Name }}]: {{ $.Info.RepositoryURL }}/compare/{{ .Tag.Previous.Name }}...{{ .Tag.Name }}
|
||||
{{ end -}}
|
||||
{{ end -}}
|
||||
{{ end -}}
|
33
.chglog/config.yml
Normal file
33
.chglog/config.yml
Normal file
@ -0,0 +1,33 @@
|
||||
style: github
|
||||
template: CHANGELOG.tpl.md
|
||||
info:
|
||||
title: CHANGELOG
|
||||
repository_url: https://forge.cadoles.com//
|
||||
options:
|
||||
commits:
|
||||
filters:
|
||||
Type:
|
||||
- feat
|
||||
- fix
|
||||
- perf
|
||||
- refactor
|
||||
- docs
|
||||
commit_groups:
|
||||
title_maps:
|
||||
feat: Features
|
||||
fix: Bug Fixes
|
||||
perf: Performance Improvements
|
||||
refactor: Code Refactoring
|
||||
docs: Documentation
|
||||
header:
|
||||
pattern: "^(\\w*)(?:\\(([\\w\\$\\.\\-\\*\\s]*)\\))?\\:\\s(.*)$"
|
||||
pattern_maps:
|
||||
- Type
|
||||
- Scope
|
||||
- Subject
|
||||
notes:
|
||||
keywords:
|
||||
- BREAKING CHANGE
|
||||
issues:
|
||||
prefix:
|
||||
- '#'
|
4
.gitignore
vendored
4
.gitignore
vendored
@ -10,4 +10,6 @@ dist/
|
||||
/apps
|
||||
/server-key.json
|
||||
/.emissary-token
|
||||
/out
|
||||
/out
|
||||
.mktools/
|
||||
/CHANGELOG.md
|
||||
|
@ -105,6 +105,9 @@ nfpms:
|
||||
file_info:
|
||||
mode: 0755
|
||||
packager: apk
|
||||
- src: misc/packaging/openrc/emissary-server.logrotate.conf
|
||||
dst: /etc/logrotate.d/emissary-server
|
||||
packager: apk
|
||||
- dst: /var/lib/emissary
|
||||
type: dir
|
||||
file_info:
|
||||
@ -147,5 +150,8 @@ nfpms:
|
||||
file_info:
|
||||
mode: 0755
|
||||
packager: apk
|
||||
- src: misc/packaging/openrc/emissary-agent.logrotate.conf
|
||||
dst: /etc/logrotate.d/emissary-agent
|
||||
packager: apk
|
||||
scripts:
|
||||
postinstall: "misc/packaging/common/postinstall-agent.sh"
|
||||
|
30
Jenkinsfile
vendored
30
Jenkinsfile
vendored
@ -19,7 +19,7 @@ pipeline {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
stage('Run unit tests') {
|
||||
steps {
|
||||
script {
|
||||
@ -58,20 +58,22 @@ pipeline {
|
||||
passwordVariable: 'GITEA_RELEASE_PASSWORD'
|
||||
])
|
||||
]) {
|
||||
sh 'make gitea-release'
|
||||
}
|
||||
def currentVersion = sh(returnStdout: true, script: 'make full-version').trim()
|
||||
if (currentVersion.endsWith('-dirty')) {
|
||||
unstable('Could not trigger emissary-firmware build, dirty version !')
|
||||
} else {
|
||||
build(
|
||||
job: "../emissary-firmware/${env.GIT_BRANCH}",
|
||||
parameters: [
|
||||
[$class: 'StringParameterValue', name: 'emissaryRelease', value: currentVersion]
|
||||
],
|
||||
wait: false
|
||||
)
|
||||
sh """
|
||||
export MKT_PROJECT_VERSION_BRANCH_NAME=${env.BRANCH_NAME}
|
||||
make mktools
|
||||
make gitea-release
|
||||
"""
|
||||
}
|
||||
|
||||
String currentVersion = sh(script: "MKT_PROJECT_VERSION_BRANCH_NAME=${env.BRANCH_NAME} make version", returnStdout: true).trim()
|
||||
|
||||
build(
|
||||
job: "../emissary-firmware/${env.GIT_BRANCH}",
|
||||
parameters: [
|
||||
[$class: 'StringParameterValue', name: 'emissaryRelease', value: currentVersion]
|
||||
],
|
||||
wait: false
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
66
Makefile
66
Makefile
@ -5,12 +5,9 @@ GITCHLOG_ARGS ?=
|
||||
SHELL := /bin/bash
|
||||
|
||||
EMISSARY_VERSION ?=
|
||||
GIT_VERSION := $(shell git describe --always)
|
||||
DATE_VERSION := $(shell date +%Y.%-m.%-d)
|
||||
FULL_VERSION := v$(DATE_VERSION)-$(GIT_VERSION)$(if $(shell git diff --stat),-dirty,)
|
||||
|
||||
DOCKER_IMAGE_NAME ?= bornholm/emissary
|
||||
DOCKER_IMAGE_TAG ?= $(FULL_VERSION)
|
||||
DOCKER_IMAGE_TAG ?= $(MKT_PROJECT_VERSION)
|
||||
|
||||
GOTEST_ARGS ?= -short
|
||||
|
||||
@ -45,7 +42,7 @@ build-emissary-%: deps ## Build executable
|
||||
-v \
|
||||
-ldflags "\
|
||||
-X 'main.GitRef=$(shell git rev-parse --short HEAD)' \
|
||||
-X 'main.ProjectVersion=$(FULL_VERSION)' \
|
||||
-X 'main.ProjectVersion=$(MKT_PROJECT_VERSION)' \
|
||||
-X 'main.BuildDate=$(shell date --utc --rfc-3339=seconds)' \
|
||||
" \
|
||||
-o ./bin/$* \
|
||||
@ -66,7 +63,7 @@ run-emissary-%: .env
|
||||
( set -o allexport && source .env && set +o allexport && bin/$* $(EMISSARY_CMD))
|
||||
|
||||
.PHONY: deps
|
||||
deps: .env
|
||||
deps: .env .mktools
|
||||
|
||||
.PHONY: dump-config
|
||||
dump-config: build-emissary
|
||||
@ -74,27 +71,8 @@ dump-config: build-emissary
|
||||
./bin/emissary config dump > tmp/config.yml
|
||||
|
||||
.PHONY: goreleaser
|
||||
goreleaser: deps
|
||||
( set -o allexport && source .env && set +o allexport && VERSION=$(GORELEASER_VERSION) curl -sfL https://goreleaser.com/static/run | GORELEASER_CURRENT_TAG="$(FULL_VERSION)" bash /dev/stdin $(GORELEASER_ARGS) )
|
||||
|
||||
.PHONY: start-release
|
||||
start-release:
|
||||
if [ -z "$(EMISSARY_VERSION)" ]; then echo "You must define environment variable FAQD_VERSION"; exit 1; fi
|
||||
|
||||
git flow release start $(EMISSARY_VERSION)
|
||||
|
||||
# Update package.json version
|
||||
jq '.version = "$(EMISSARY_VERSION)"' package.json | sponge package.json
|
||||
git add package.json
|
||||
git commit -m "chore: bump to version $(EMISSARY_VERSION)" --allow-empty
|
||||
|
||||
echo "Commit you additional modifications then execute 'make finish-release'"
|
||||
|
||||
.PHONY: finish-release
|
||||
finish-release:
|
||||
git flow release finish -m "v$(EMISSARY_VERSION)"
|
||||
git push --all
|
||||
git push --tags
|
||||
goreleaser: .mktools
|
||||
( set -o allexport && source .env && set +o allexport && VERSION=$(GORELEASER_VERSION) curl -sfL https://goreleaser.com/static/run | GORELEASER_CURRENT_TAG="$(MKT_PROJECT_VERSION)" bash /dev/stdin $(GORELEASER_ARGS) )
|
||||
|
||||
install-git-hooks:
|
||||
git config core.hooksPath .githooks
|
||||
@ -119,32 +97,28 @@ deploy-openwrt-agent:
|
||||
scp dist/emissary-agent_linux_arm_6/emissary root@$(OPENWRT_DEVICE):/usr/bin/emissary
|
||||
ssh root@$(OPENWRT_DEVICE) /etc/init.d/emissary-agent start
|
||||
|
||||
gitea-release: tools/gitea-release/bin/gitea-release.sh goreleaser
|
||||
gitea-release: .mktools tools/gitea-release/bin/gitea-release.sh goreleaser changelog
|
||||
mkdir -p .gitea-release
|
||||
rm -rf .gitea-release/*
|
||||
|
||||
cp dist/*.tar.gz .gitea-release/
|
||||
cp dist/*.apk .gitea-release/
|
||||
cp dist/*.deb .gitea-release/
|
||||
cp CHANGELOG.md .gitea-release/
|
||||
|
||||
GITEA_RELEASE_PROJECT="emissary" \
|
||||
GITEA_RELEASE_ORG="arcad" \
|
||||
GITEA_RELEASE_BASE_URL="https://forge.cadoles.com" \
|
||||
GITEA_RELEASE_VERSION="$(FULL_VERSION)" \
|
||||
GITEA_RELEASE_NAME="$(FULL_VERSION)" \
|
||||
GITEA_RELEASE_VERSION="$(MKT_PROJECT_VERSION)" \
|
||||
GITEA_RELEASE_NAME="$(MKT_PROJECT_VERSION)" \
|
||||
GITEA_RELEASE_COMMITISH_TARGET="$(GIT_VERSION)" \
|
||||
GITEA_RELEASE_IS_DRAFT="false" \
|
||||
GITEA_RELEASE_BODY="" \
|
||||
GITEA_RELEASE_ATTACHMENTS="$$(find .gitea-release/* -type f)" \
|
||||
tools/gitea-release/bin/gitea-release.sh
|
||||
|
||||
tools/gitea-release/bin/gitea-release.sh:
|
||||
mkdir -p tools/gitea-release/bin
|
||||
curl --output tools/gitea-release/bin/gitea-release.sh https://forge.cadoles.com/Cadoles/Jenkins/raw/branch/master/resources/com/cadoles/gitea/gitea-release.sh
|
||||
chmod +x tools/gitea-release/bin/gitea-release.sh
|
||||
|
||||
.emissary-token:
|
||||
$(MAKE) run-emissary-server EMISSARY_CMD="--debug --config tmp/server.yml server auth create-token --role writer > .emissary-token"
|
||||
$(MAKE) run-emissary-server EMISSARY_CMD="--debug --config tmp/server.yml server auth create-token --role writer --output .emissary-token"
|
||||
|
||||
AGENT_ID ?= 1
|
||||
|
||||
@ -153,8 +127,8 @@ load-sample-specs:
|
||||
cat misc/spec-samples/proxy.emissary.cadoles.com.json | ./bin/server api agent spec update -a $(AGENT_ID) --no-patch --spec-data - --spec-name proxy.emissary.cadoles.com
|
||||
cat misc/spec-samples/mdns.emissary.cadoles.com.json | ./bin/server api agent spec update -a $(AGENT_ID) --no-patch --spec-data - --spec-name mdns.emissary.cadoles.com
|
||||
|
||||
full-version:
|
||||
@echo $(FULL_VERSION)
|
||||
version: .mktools
|
||||
@echo $(MKT_PROJECT_VERSION)
|
||||
|
||||
update-edge-lib:
|
||||
git pull --rebase
|
||||
@ -163,4 +137,18 @@ update-edge-lib:
|
||||
$(MAKE) test
|
||||
git add go.mod go.sum
|
||||
git commit -m "feat: update arcad/edge dependency"
|
||||
git push
|
||||
git push
|
||||
|
||||
.PHONY: changelog
|
||||
changelog: .mktools
|
||||
$(MAKE) MKT_GIT_CHGLOG_ARGS='--next-tag $(MKT_PROJECT_VERSION) --tag-filter-pattern $(MKT_PROJECT_VERSION_CHANNEL) --output CHANGELOG.md' mkt-changelog
|
||||
|
||||
.PHONY: mktools
|
||||
mktools:
|
||||
rm -rf .mktools
|
||||
curl -q https://forge.cadoles.com/Cadoles/mktools/raw/branch/master/install.sh | $(SHELL)
|
||||
|
||||
.mktools:
|
||||
$(MAKE) mktools
|
||||
|
||||
-include .mktools/*.mk
|
@ -24,3 +24,7 @@ See:
|
||||
|
||||
- [`misc/packaging/common/config-agent.yml`](../misc/packaging/common/config-agent.yml)
|
||||
- [`misc/packaging/common/config-server.yml`](../misc/packaging/common/config-server.yml)
|
||||
|
||||
### Other projects
|
||||
|
||||
- [`emissary-firmware`](https://forge.cadoles.com/arcad/emissary-firmware) - Preconfigured OpenWRT firmwares with an agent
|
@ -80,9 +80,11 @@
|
||||
5. Créer un jeton d'administration:
|
||||
|
||||
```shell
|
||||
sudo emissary --workdir /usr/share/emissary --config /etc/emissary/server.yml server auth create-token --role writer --subject $(whoami) > .emissary-token
|
||||
sudo emissary --workdir /usr/share/emissary --config /etc/emissary/server.yml server auth create-token --role writer --subject $(whoami)
|
||||
```
|
||||
|
||||
> **Note** Le jeton sera stocké dans le répertoire `$HOME/.config/emissary`.
|
||||
|
||||
6. Vérifier l'authentification sur l'API:
|
||||
|
||||
```shell
|
||||
|
5
go.mod
5
go.mod
@ -3,10 +3,11 @@ module forge.cadoles.com/Cadoles/emissary
|
||||
go 1.19
|
||||
|
||||
require (
|
||||
forge.cadoles.com/arcad/edge v0.0.0-20230426135323-17808d14c978
|
||||
forge.cadoles.com/arcad/edge v0.0.0-20231003032536-4c6e979bb6bf
|
||||
github.com/Masterminds/sprig/v3 v3.2.3
|
||||
github.com/alecthomas/participle/v2 v2.0.0-beta.5
|
||||
github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883
|
||||
github.com/antonmedv/expr v1.12.7
|
||||
github.com/brutella/dnssd v1.2.6
|
||||
github.com/btcsuite/btcd/btcutil v1.1.3
|
||||
github.com/davecgh/go-spew v1.1.1
|
||||
@ -33,7 +34,6 @@ require (
|
||||
require (
|
||||
github.com/Masterminds/goutils v1.1.1 // indirect
|
||||
github.com/Masterminds/semver/v3 v3.2.0 // indirect
|
||||
github.com/antonmedv/expr v1.12.7 // indirect
|
||||
github.com/barnybug/go-cast v0.0.0-20201201064555-a87ccbc26692 // indirect
|
||||
github.com/dop251/goja_nodejs v0.0.0-20230320130059-dcf93ba651dd // indirect
|
||||
github.com/gabriel-vasile/mimetype v1.4.1 // indirect
|
||||
@ -45,6 +45,7 @@ require (
|
||||
github.com/huandu/xstrings v1.3.3 // indirect
|
||||
github.com/igm/sockjs-go/v3 v3.0.2 // indirect
|
||||
github.com/imdario/mergo v0.3.12 // indirect
|
||||
github.com/keegancsmith/rpc v1.3.0 // indirect
|
||||
github.com/miekg/dns v1.1.53 // indirect
|
||||
github.com/mitchellh/copystructure v1.0.0 // indirect
|
||||
github.com/mitchellh/reflectwalk v1.0.0 // indirect
|
||||
|
6
go.sum
6
go.sum
@ -54,8 +54,8 @@ cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohl
|
||||
cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=
|
||||
cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=
|
||||
dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
|
||||
forge.cadoles.com/arcad/edge v0.0.0-20230426135323-17808d14c978 h1:fekSRSb8gYcVx8C0B9K6B7+KiFHVixIwvPUkxcnRFp4=
|
||||
forge.cadoles.com/arcad/edge v0.0.0-20230426135323-17808d14c978/go.mod h1:uv3wBa+UbcEUb7IiJCj1T96Xo3cmx1BwNxbBYRZhln8=
|
||||
forge.cadoles.com/arcad/edge v0.0.0-20231003032536-4c6e979bb6bf h1:jiQt6WdXCQlgMm+cC/vFd7aEibaXQUVZKB+tpLzyVao=
|
||||
forge.cadoles.com/arcad/edge v0.0.0-20231003032536-4c6e979bb6bf/go.mod h1:cHbSOTFy09i2RD+EpE76q/rZfTzxZLFD+iHxVfE6QxA=
|
||||
gioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8=
|
||||
github.com/AdaLogics/go-fuzz-headers v0.0.0-20210715213245-6c3934b029d8/go.mod h1:CzsSbkDixRphAF5hS6wbMKq0eI6ccJRb7/A0M6JBnwg=
|
||||
github.com/Azure/azure-pipeline-go v0.2.3/go.mod h1:x841ezTBIMG6O3lAcl8ATHnsOPVl2bqk7S3ta6S6u4k=
|
||||
@ -878,6 +878,8 @@ github.com/karrick/godirwalk v1.8.0/go.mod h1:H5KPZjojv4lE+QYImBI8xVtrBRgYrIVsaR
|
||||
github.com/karrick/godirwalk v1.10.3/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0LhBygSwrAsHA=
|
||||
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs=
|
||||
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8=
|
||||
github.com/keegancsmith/rpc v1.3.0 h1:wGWOpjcNrZaY8GDYZJfvyxmlLljm3YQWF+p918DXtDk=
|
||||
github.com/keegancsmith/rpc v1.3.0/go.mod h1:6O2xnOGjPyvIPbvp0MdrOe5r6cu1GZ4JoTzpzDhWeo0=
|
||||
github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q=
|
||||
github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00=
|
||||
github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
|
||||
|
@ -4,7 +4,6 @@ import (
|
||||
"bytes"
|
||||
"context"
|
||||
"net"
|
||||
"path/filepath"
|
||||
"text/template"
|
||||
|
||||
"forge.cadoles.com/Cadoles/emissary/internal/agent/controller/app/spec"
|
||||
@ -20,44 +19,54 @@ import (
|
||||
fetchModule "forge.cadoles.com/arcad/edge/pkg/module/fetch"
|
||||
netModule "forge.cadoles.com/arcad/edge/pkg/module/net"
|
||||
shareModule "forge.cadoles.com/arcad/edge/pkg/module/share"
|
||||
shareSqlite "forge.cadoles.com/arcad/edge/pkg/module/share/sqlite"
|
||||
"forge.cadoles.com/arcad/edge/pkg/storage"
|
||||
"forge.cadoles.com/arcad/edge/pkg/storage/sqlite"
|
||||
"forge.cadoles.com/arcad/edge/pkg/storage/driver"
|
||||
"forge.cadoles.com/arcad/edge/pkg/storage/share"
|
||||
"github.com/Masterminds/sprig/v3"
|
||||
"github.com/go-chi/chi/v5"
|
||||
"github.com/lestrrat-go/jwx/v2/jwa"
|
||||
"github.com/pkg/errors"
|
||||
"gitlab.com/wpetit/goweb/logger"
|
||||
|
||||
// Register storage drivers
|
||||
_ "forge.cadoles.com/arcad/edge/pkg/storage/driver/rpc"
|
||||
_ "forge.cadoles.com/arcad/edge/pkg/storage/driver/sqlite"
|
||||
)
|
||||
|
||||
type Dependencies struct {
|
||||
Bus bus.Bus
|
||||
DocumentStore storage.DocumentStore
|
||||
BlobStore storage.BlobStore
|
||||
KeySet jwk.Set
|
||||
AppRepository appModule.Repository
|
||||
AppID app.ID
|
||||
ShareRepository shareModule.Repository
|
||||
Bus bus.Bus
|
||||
DocumentStore storage.DocumentStore
|
||||
BlobStore storage.BlobStore
|
||||
ShareStore share.Store
|
||||
KeySet jwk.Set
|
||||
AppRepository appModule.Repository
|
||||
AppID app.ID
|
||||
}
|
||||
|
||||
const defaultSQLiteParams = "?_pragma=foreign_keys(1)&_pragma=busy_timeout=60000"
|
||||
|
||||
func (c *Controller) getHandlerOptions(ctx context.Context, appKey string, specs *spec.Spec) ([]edgeHTTP.HandlerOptionFunc, error) {
|
||||
dataDir, err := c.ensureAppDataDir(ctx, appKey)
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "could not retrieve app data dir")
|
||||
appEntry, exists := specs.Apps[appKey]
|
||||
if !exists {
|
||||
return nil, errors.Errorf("could not find app entry '%s'", appKey)
|
||||
}
|
||||
|
||||
dbFile := filepath.Join(dataDir, appKey+".sqlite")
|
||||
db, err := sqlite.Open(dbFile + defaultSQLiteParams)
|
||||
if err != nil {
|
||||
return nil, errors.Wrapf(err, "could not open database file '%s'", dbFile)
|
||||
storage := appEntry.Storage
|
||||
if storage == nil {
|
||||
return nil, errors.Errorf("could not find app entry '%s' storage configuration", appKey)
|
||||
}
|
||||
|
||||
shareDBFile := filepath.Join(dataDir, "shared.sqlite")
|
||||
shareDB, err := sqlite.Open(shareDBFile + defaultSQLiteParams)
|
||||
documentStore, err := driver.NewDocumentStore(appEntry.Storage.DocumentStoreDSN)
|
||||
if err != nil {
|
||||
return nil, errors.Wrapf(err, "could not open database file '%s'", shareDBFile)
|
||||
return nil, errors.WithStack(err)
|
||||
}
|
||||
|
||||
blobStore, err := driver.NewBlobStore(appEntry.Storage.BlobStoreDSN)
|
||||
if err != nil {
|
||||
return nil, errors.WithStack(err)
|
||||
}
|
||||
|
||||
shareStore, err := driver.NewShareStore(appEntry.Storage.ShareStoreDSN)
|
||||
if err != nil {
|
||||
return nil, errors.WithStack(err)
|
||||
}
|
||||
|
||||
keySet, err := getAuthKeySet(specs.Config)
|
||||
@ -79,21 +88,29 @@ func (c *Controller) getHandlerOptions(ctx context.Context, appKey string, specs
|
||||
mounts = append(mounts, appModule.Mount(c.appRepository))
|
||||
|
||||
deps := Dependencies{
|
||||
Bus: memory.NewBus(),
|
||||
DocumentStore: sqlite.NewDocumentStoreWithDB(db),
|
||||
BlobStore: sqlite.NewBlobStoreWithDB(db),
|
||||
KeySet: keySet,
|
||||
AppRepository: c.appRepository,
|
||||
AppID: app.ID(appKey),
|
||||
ShareRepository: shareSqlite.NewRepositoryWithDB(shareDB),
|
||||
Bus: memory.NewBus(),
|
||||
DocumentStore: documentStore,
|
||||
BlobStore: blobStore,
|
||||
ShareStore: shareStore,
|
||||
KeySet: keySet,
|
||||
AppRepository: c.appRepository,
|
||||
AppID: app.ID(appKey),
|
||||
}
|
||||
|
||||
modules := c.getAppModules(deps)
|
||||
|
||||
anonymousUserMiddleware, err := getAnonymousUserMiddleware(specs.Config.Auth)
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "could not get anonymous user middleware")
|
||||
}
|
||||
|
||||
options := []edgeHTTP.HandlerOptionFunc{
|
||||
edgeHTTP.WithBus(deps.Bus),
|
||||
edgeHTTP.WithServerModules(modules...),
|
||||
edgeHTTP.WithHTTPMounts(mounts...),
|
||||
edgeHTTP.WithHTTPMiddlewares(
|
||||
anonymousUserMiddleware,
|
||||
),
|
||||
}
|
||||
|
||||
return options, nil
|
||||
@ -285,6 +302,6 @@ func (c *Controller) getAppModules(deps Dependencies) []app.ServerModuleFactory
|
||||
authModuleFactory(deps.KeySet),
|
||||
appModule.ModuleFactory(deps.AppRepository),
|
||||
fetchModule.ModuleFactory(deps.Bus),
|
||||
shareModule.ModuleFactory(deps.AppID, deps.ShareRepository),
|
||||
shareModule.ModuleFactory(deps.AppID, deps.ShareStore),
|
||||
}
|
||||
}
|
||||
|
@ -1,15 +1,18 @@
|
||||
package app
|
||||
|
||||
import (
|
||||
"net/http"
|
||||
"time"
|
||||
|
||||
"forge.cadoles.com/Cadoles/emissary/internal/agent/controller/app/spec"
|
||||
appSpec "forge.cadoles.com/Cadoles/emissary/internal/agent/controller/app/spec"
|
||||
"forge.cadoles.com/Cadoles/emissary/internal/jwk"
|
||||
"forge.cadoles.com/arcad/edge/pkg/app"
|
||||
"forge.cadoles.com/arcad/edge/pkg/module"
|
||||
"forge.cadoles.com/arcad/edge/pkg/module/auth"
|
||||
authModule "forge.cadoles.com/arcad/edge/pkg/module/auth"
|
||||
authHTTP "forge.cadoles.com/arcad/edge/pkg/module/auth/http"
|
||||
authModuleMiddleware "forge.cadoles.com/arcad/edge/pkg/module/auth/middleware"
|
||||
|
||||
"github.com/dop251/goja"
|
||||
"github.com/lestrrat-go/jwx/v2/jwa"
|
||||
"github.com/pkg/errors"
|
||||
@ -54,7 +57,7 @@ func authModuleFactory(keySet jwk.Set) app.ServerModuleFactory {
|
||||
)
|
||||
}
|
||||
|
||||
func getAuthMount(auth *spec.Auth, keySet jwk.Set) (auth.MountFunc, error) {
|
||||
func getAuthMount(auth *appSpec.Auth, keySet jwk.Set) (auth.MountFunc, error) {
|
||||
switch {
|
||||
case auth.Local != nil:
|
||||
var rawKey any = auth.Local.Key
|
||||
@ -77,7 +80,8 @@ func getAuthMount(auth *spec.Auth, keySet jwk.Set) (auth.MountFunc, error) {
|
||||
|
||||
return authModule.Mount(
|
||||
authHTTP.NewLocalHandler(
|
||||
jwa.HS256, key,
|
||||
key,
|
||||
jwa.HS256,
|
||||
authHTTP.WithRoutePrefix("/auth"),
|
||||
authHTTP.WithAccounts(auth.Local.Accounts...),
|
||||
authHTTP.WithCookieOptions(getCookieDomain, cookieDuration),
|
||||
@ -91,3 +95,72 @@ func getAuthMount(auth *spec.Auth, keySet jwk.Set) (auth.MountFunc, error) {
|
||||
return nil, nil
|
||||
}
|
||||
}
|
||||
|
||||
func getAnonymousUserMiddleware(auth *appSpec.Auth) (func(http.Handler) http.Handler, error) {
|
||||
anonymousUserSigningKey, err := getAnonymousUserSigningKey(auth)
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "could not get anonymous user signing key")
|
||||
}
|
||||
|
||||
cookieDuration := defaultCookieDuration
|
||||
if auth.Local.CookieDuration != "" {
|
||||
cookieDuration, err = time.ParseDuration(auth.Local.CookieDuration)
|
||||
if err != nil {
|
||||
return nil, errors.WithStack(err)
|
||||
}
|
||||
}
|
||||
|
||||
middleware := authModuleMiddleware.AnonymousUser(
|
||||
anonymousUserSigningKey,
|
||||
auth.Local.SigningAlgorithm,
|
||||
authModuleMiddleware.WithCookieOptions(getCookieDomain, cookieDuration),
|
||||
)
|
||||
|
||||
return middleware, nil
|
||||
}
|
||||
|
||||
func getAnonymousUserSigningKey(auth *appSpec.Auth) (jwk.Key, error) {
|
||||
var (
|
||||
key jwk.Key
|
||||
err error
|
||||
)
|
||||
|
||||
generateNewKey := func() (jwk.Key, error) {
|
||||
key, err := jwk.Generate(2048)
|
||||
if err != nil {
|
||||
return nil, errors.WithStack(err)
|
||||
}
|
||||
|
||||
return key, nil
|
||||
}
|
||||
|
||||
switch {
|
||||
default:
|
||||
fallthrough
|
||||
case auth == nil:
|
||||
key, err = generateNewKey()
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "could not generate anonymous user signing key")
|
||||
}
|
||||
|
||||
return key, nil
|
||||
|
||||
case auth.Local != nil:
|
||||
switch typedKey := auth.Local.Key.(type) {
|
||||
case string:
|
||||
key, err = jwk.FromRaw([]byte(typedKey))
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "could not parse local auth key")
|
||||
}
|
||||
|
||||
if err := key.Set(jwk.AlgorithmKey, jwa.HS256); err != nil {
|
||||
return nil, errors.WithStack(err)
|
||||
}
|
||||
|
||||
default:
|
||||
return nil, errors.Errorf("unexpected key type '%T'", auth.Local.Key)
|
||||
}
|
||||
}
|
||||
|
||||
return key, nil
|
||||
}
|
||||
|
@ -8,7 +8,6 @@ import (
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"forge.cadoles.com/Cadoles/emissary/internal/agent/controller/app/spec"
|
||||
appSpec "forge.cadoles.com/Cadoles/emissary/internal/agent/controller/app/spec"
|
||||
"forge.cadoles.com/Cadoles/emissary/internal/proxy/wildcard"
|
||||
edgeHTTP "forge.cadoles.com/arcad/edge/pkg/http"
|
||||
@ -128,7 +127,7 @@ func (s *Server) Stop() error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func NewServer(bundle bundle.Bundle, config *spec.Config, handlerOptions ...edgeHTTP.HandlerOptionFunc) *Server {
|
||||
func NewServer(bundle bundle.Bundle, config *appSpec.Config, handlerOptions ...edgeHTTP.HandlerOptionFunc) *Server {
|
||||
return &Server{
|
||||
bundle: bundle,
|
||||
config: config,
|
||||
|
@ -26,13 +26,34 @@
|
||||
"zip",
|
||||
"tar.gz"
|
||||
]
|
||||
},
|
||||
"storage": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"blobStoreDsn": {
|
||||
"type": "string"
|
||||
},
|
||||
"documentStoreDsn": {
|
||||
"type": "string"
|
||||
},
|
||||
"shareStoreDsn": {
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"blobStoreDsn",
|
||||
"documentStoreDsn",
|
||||
"shareStoreDsn"
|
||||
],
|
||||
"additionalProperties": false
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"url",
|
||||
"sha256sum",
|
||||
"address",
|
||||
"format"
|
||||
"format",
|
||||
"storage"
|
||||
],
|
||||
"additionalProperties": false
|
||||
}
|
||||
@ -84,6 +105,9 @@
|
||||
"key": {
|
||||
"type": ["object", "string"]
|
||||
},
|
||||
"signingAlgorithm": {
|
||||
"type": "string"
|
||||
},
|
||||
"accounts": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
@ -117,7 +141,8 @@
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"key"
|
||||
"key",
|
||||
"signingAlgorithm"
|
||||
],
|
||||
"additionalProperties": false
|
||||
}
|
||||
|
@ -3,6 +3,7 @@ package spec
|
||||
import (
|
||||
"forge.cadoles.com/Cadoles/emissary/internal/spec"
|
||||
edgeAuth "forge.cadoles.com/arcad/edge/pkg/module/auth/http"
|
||||
"github.com/lestrrat-go/jwx/v2/jwa"
|
||||
)
|
||||
|
||||
const Name spec.Name = "app.emissary.cadoles.com"
|
||||
@ -14,10 +15,17 @@ type Spec struct {
|
||||
}
|
||||
|
||||
type AppEntry struct {
|
||||
URL string `json:"url"`
|
||||
SHA256Sum string `json:"sha256sum"`
|
||||
Address string `json:"address"`
|
||||
Format string `json:"format"`
|
||||
URL string `json:"url"`
|
||||
SHA256Sum string `json:"sha256sum"`
|
||||
Address string `json:"address"`
|
||||
Format string `json:"format"`
|
||||
Storage *AppStorage `json:"storage"`
|
||||
}
|
||||
|
||||
type AppStorage struct {
|
||||
ShareStoreDSN string `json:"shareStoreDsn"`
|
||||
DocumentStoreDSN string `json:"documentStoreDsn"`
|
||||
BlobStoreDSN string `json:"blobStoreDsn"`
|
||||
}
|
||||
|
||||
type Auth struct {
|
||||
@ -25,10 +33,11 @@ type Auth struct {
|
||||
}
|
||||
|
||||
type LocalAuth struct {
|
||||
Key any `json:"key"`
|
||||
Accounts []edgeAuth.LocalAccount `json:"accounts"`
|
||||
CookieDomain string `json:"cookieDomain"`
|
||||
CookieDuration string `json:"cookieDuration"`
|
||||
Key any `json:"key"`
|
||||
SigningAlgorithm jwa.SignatureAlgorithm `json:"signingAlgorithm"`
|
||||
Accounts []edgeAuth.LocalAccount `json:"accounts"`
|
||||
CookieDomain string `json:"cookieDomain"`
|
||||
CookieDuration string `json:"cookieDuration"`
|
||||
}
|
||||
|
||||
type Config struct {
|
||||
|
@ -6,7 +6,12 @@
|
||||
"url": "http://example.com/edge.sdk.client.test_0.0.0.zip",
|
||||
"sha256sum": "58019192dacdae17755707719707db007e26dac856102280583fbd18427dd352",
|
||||
"address": ":8081",
|
||||
"format": "zip"
|
||||
"format": "zip",
|
||||
"storage": {
|
||||
"blobStoreDsn": "sqlite://apps/data/edge.sdk.client.test/blobstore.sqlite?_pragma=foreign_keys(1)&_pragma=busy_timeout=60000",
|
||||
"shareStoreDsn": "sqlite://apps/data/sharestore.sqlite?_pragma=foreign_keys(1)&_pragma=busy_timeout=60000",
|
||||
"documentStoreDsn": "sqlite://apps/data/edge.sdk.client.test/documentstore.sqlite?_pragma=foreign_keys(1)&_pragma=busy_timeout=60000"
|
||||
}
|
||||
}
|
||||
},
|
||||
"config": {
|
||||
@ -23,6 +28,7 @@
|
||||
"q": "yJJLNc9w6O4y2icME8k99FugV9E7ObwUxF3v5JN3y1cmAT0h2njyE3iAGqaDZwcY1_jGCisjwoqX6i5E8xqhxX3Gcy3J7SmUAf8fhY8wU3zv9DK7skg2IdvanDb8Y1OM6GchbYZAOVPEg2IvVio8zI-Ih3DDwDk8Df0ufzoHRb8",
|
||||
"qi": "zOE-4R3cjPesm3MX-4PdwmsaF9QZLUVRUvvHJ08pKs6kAXP18hzjctAoOjhQDxlTYqNYNePfKzKwost3OJoPgRIc9w9qwUCK1gNOS4Z_xozCIaXgMddNFhkoAfZ4JaKjNCiinzjGfqG99Lf-yzmmREuuhRv7SdS3ST4VQjiJQew"
|
||||
},
|
||||
"signingAlgorithm": "RS256",
|
||||
"accounts": [
|
||||
{
|
||||
"username": "foo",
|
||||
|
@ -2,7 +2,6 @@ package flag
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"io/ioutil"
|
||||
"os"
|
||||
"strings"
|
||||
|
||||
@ -12,6 +11,11 @@ import (
|
||||
"github.com/urfave/cli/v2"
|
||||
)
|
||||
|
||||
const (
|
||||
AuthTokenDefaultHomePath = "$HOME/.config/emissary/auth-token"
|
||||
AuthTokenDefaultLocalPath = ".emissary-token"
|
||||
)
|
||||
|
||||
func ComposeFlags(flags ...cli.Flag) []cli.Flag {
|
||||
baseFlags := []cli.Flag{
|
||||
&cli.StringFlag{
|
||||
@ -37,10 +41,10 @@ func ComposeFlags(flags ...cli.Flag) []cli.Flag {
|
||||
Aliases: []string{"t"},
|
||||
Usage: "use `TOKEN` as authentication token",
|
||||
},
|
||||
&cli.StringFlag{
|
||||
&cli.StringSliceFlag{
|
||||
Name: "token-file",
|
||||
Usage: "use `TOKEN_FILE` as file containing the authentication token",
|
||||
Value: ".emissary-token",
|
||||
Value: cli.NewStringSlice(AuthTokenDefaultLocalPath, AuthTokenDefaultHomePath),
|
||||
TakesFile: true,
|
||||
},
|
||||
}
|
||||
@ -55,14 +59,14 @@ type BaseFlags struct {
|
||||
Format format.Format
|
||||
OutputMode format.OutputMode
|
||||
Token string
|
||||
TokenFile string
|
||||
TokenFiles []string
|
||||
}
|
||||
|
||||
func GetBaseFlags(ctx *cli.Context) *BaseFlags {
|
||||
serverURL := ctx.String("server")
|
||||
rawFormat := ctx.String("format")
|
||||
rawOutputMode := ctx.String("output-mode")
|
||||
tokenFile := ctx.String("token-file")
|
||||
tokenFiles := ctx.StringSlice("token-file")
|
||||
token := ctx.String("token")
|
||||
|
||||
return &BaseFlags{
|
||||
@ -70,7 +74,7 @@ func GetBaseFlags(ctx *cli.Context) *BaseFlags {
|
||||
Format: format.Format(rawFormat),
|
||||
OutputMode: format.OutputMode(rawOutputMode),
|
||||
Token: token,
|
||||
TokenFile: tokenFile,
|
||||
TokenFiles: tokenFiles,
|
||||
}
|
||||
}
|
||||
|
||||
@ -79,18 +83,20 @@ func GetToken(flags *BaseFlags) (string, error) {
|
||||
return flags.Token, nil
|
||||
}
|
||||
|
||||
if flags.TokenFile == "" {
|
||||
return "", nil
|
||||
for _, tokenFile := range flags.TokenFiles {
|
||||
tokenFile = os.ExpandEnv(tokenFile)
|
||||
|
||||
rawToken, err := os.ReadFile(tokenFile)
|
||||
if err != nil && !errors.Is(err, os.ErrNotExist) {
|
||||
return "", errors.WithStack(err)
|
||||
}
|
||||
|
||||
if rawToken == nil {
|
||||
continue
|
||||
}
|
||||
|
||||
return strings.TrimSpace(string(rawToken)), nil
|
||||
}
|
||||
|
||||
rawToken, err := ioutil.ReadFile(flags.TokenFile)
|
||||
if err != nil && !errors.Is(err, os.ErrNotExist) {
|
||||
return "", errors.WithStack(err)
|
||||
}
|
||||
|
||||
if rawToken == nil {
|
||||
return "", nil
|
||||
}
|
||||
|
||||
return strings.TrimSpace(string(rawToken)), nil
|
||||
return "", nil
|
||||
}
|
||||
|
@ -2,8 +2,11 @@ package auth
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"os"
|
||||
"path/filepath"
|
||||
|
||||
"forge.cadoles.com/Cadoles/emissary/internal/auth/thirdparty"
|
||||
"forge.cadoles.com/Cadoles/emissary/internal/command/api/flag"
|
||||
"forge.cadoles.com/Cadoles/emissary/internal/command/common"
|
||||
"forge.cadoles.com/Cadoles/emissary/internal/jwk"
|
||||
"github.com/lithammer/shortuuid/v4"
|
||||
@ -26,6 +29,13 @@ func CreateTokenCommand() *cli.Command {
|
||||
Usage: "associate `SUBJECT` to the token",
|
||||
Value: fmt.Sprintf("user-%s", shortuuid.New()),
|
||||
},
|
||||
&cli.StringFlag{
|
||||
Name: "output",
|
||||
Aliases: []string{"o"},
|
||||
TakesFile: true,
|
||||
Usage: "output token to `OUTPUT` (or '-' to print to stdout)",
|
||||
Value: flag.AuthTokenDefaultHomePath,
|
||||
},
|
||||
},
|
||||
Action: func(ctx *cli.Context) error {
|
||||
conf, err := common.LoadConfig(ctx)
|
||||
@ -35,6 +45,7 @@ func CreateTokenCommand() *cli.Command {
|
||||
|
||||
subject := ctx.String("subject")
|
||||
role := ctx.String("role")
|
||||
output := ctx.String("output")
|
||||
|
||||
localAuth := conf.Server.Auth.Local
|
||||
if localAuth == nil {
|
||||
@ -51,7 +62,23 @@ func CreateTokenCommand() *cli.Command {
|
||||
return errors.WithStack(err)
|
||||
}
|
||||
|
||||
fmt.Println(token)
|
||||
output = os.ExpandEnv(output)
|
||||
|
||||
if output == "-" {
|
||||
fmt.Println(token)
|
||||
} else {
|
||||
outputDirectory := filepath.Dir(output)
|
||||
|
||||
if err := os.MkdirAll(outputDirectory, os.FileMode(0o700)); err != nil {
|
||||
return errors.WithStack(err)
|
||||
}
|
||||
|
||||
if err := os.WriteFile(output, []byte(token), os.FileMode(0o600)); err != nil {
|
||||
return errors.WithStack(err)
|
||||
}
|
||||
|
||||
fmt.Printf("Token written to '%s'.\n", output)
|
||||
}
|
||||
|
||||
return nil
|
||||
},
|
||||
|
@ -1,26 +1,55 @@
|
||||
# Emissary agent configuration
|
||||
|
||||
# Logger configuration
|
||||
logger:
|
||||
# Logging verbosity
|
||||
# DEBUG: 0
|
||||
# INFO: 1
|
||||
# WARN: 2
|
||||
# ERROR: 3
|
||||
# CRITICAL: 4
|
||||
level: 1
|
||||
# Logging format
|
||||
# Possible values: human, json
|
||||
format: human
|
||||
|
||||
# Agent configuration
|
||||
agent:
|
||||
# Emissary server URL
|
||||
serverUrl: http://127.0.0.1:3000
|
||||
# Agent private key path
|
||||
privateKeyPath: /var/lib/emissary/agent-key.json
|
||||
reconciliationInterval: 5
|
||||
# Agent reconciliation interval (in seconds)
|
||||
reconciliationInterval: 30
|
||||
|
||||
# Controllers configuration
|
||||
controllers:
|
||||
# Persistence controller configuration
|
||||
persistence:
|
||||
enabled: true
|
||||
stateFile: /var/lib/emissary/state.json
|
||||
|
||||
# Spec controller configuration
|
||||
spec:
|
||||
enabled: true
|
||||
|
||||
# Proxy controller configuration
|
||||
proxy:
|
||||
enabled: true
|
||||
|
||||
# UCI controller configuration
|
||||
uci:
|
||||
enabled: true
|
||||
binPath: uci
|
||||
configBackupFile: /var/lib/emissary/uci-backup.conf
|
||||
|
||||
# App controller configuration
|
||||
app:
|
||||
enabled: true
|
||||
dataDir: /var/lib/emissary/apps/data
|
||||
downloadDir: /var/lib/emissary/apps/bundles
|
||||
|
||||
# Sysupgrade controller configuration
|
||||
sysupgrade:
|
||||
enabled: true
|
||||
sysupgradeCommand:
|
||||
@ -33,6 +62,8 @@ agent:
|
||||
- sh
|
||||
- -c
|
||||
- source /etc/openwrt_release && echo "$DISTRIB_ID-$DISTRIB_RELEASE-$DISTRIB_REVISION"
|
||||
|
||||
# Collectors configuration
|
||||
collectors:
|
||||
- name: uname
|
||||
command: uname
|
||||
|
@ -1,13 +1,38 @@
|
||||
# Emissary server configuration
|
||||
|
||||
# Logger configuration
|
||||
logger:
|
||||
# Logging verbosity
|
||||
# DEBUG: 0
|
||||
# INFO: 1
|
||||
# WARN: 2
|
||||
# ERROR: 3
|
||||
# CRITICAL: 4
|
||||
level: 1
|
||||
# Logging format
|
||||
# Possible values: human, json
|
||||
format: human
|
||||
|
||||
# Server configuration
|
||||
server:
|
||||
# HTTP server configuration
|
||||
http:
|
||||
# Listening address (0.0.0.0 to listen on all interfaces)
|
||||
host: 0.0.0.0
|
||||
# Listening port
|
||||
port: 3000
|
||||
|
||||
# Database configuration
|
||||
database:
|
||||
# Database driver
|
||||
# Possible values: sqlite
|
||||
driver: sqlite
|
||||
# Database DSN
|
||||
# sqlite: see https://github.com/mattn/go-sqlite3#connection-string
|
||||
dsn: sqlite:///var/lib/emissary/data.sqlite?_pragma=foreign_keys(1)&_pragma=busy_timeout=60000
|
||||
|
||||
# CORS configuration
|
||||
# See https://developer.mozilla.org/en/docs/Glossary/CORS
|
||||
cors:
|
||||
allowedOrigins: []
|
||||
allowCredentials: true
|
||||
@ -22,12 +47,25 @@ server:
|
||||
- Content-Type
|
||||
- Authorization
|
||||
- Sentry-Trace
|
||||
debug: false
|
||||
|
||||
# Auth configuration
|
||||
auth:
|
||||
# Local authentication configuration
|
||||
local:
|
||||
privateKeyPath: /var/lib/emissary/server-key.json
|
||||
roleExtractionRules:
|
||||
- "jwt.role != nil ? str(jwt.role) : ''"
|
||||
|
||||
# Remote authentication configuration
|
||||
# Disabled by default
|
||||
remote: ~
|
||||
# jwksUrl: https://my-server/.well-known/jwks.json
|
||||
|
||||
|
||||
# Role extraction rules
|
||||
# Permit to derivate user's role
|
||||
# from the received JWT.
|
||||
#
|
||||
# The first rule returning a non empty
|
||||
# string will define the role of the user.
|
||||
#
|
||||
# The role should be 'reader' or 'writer'.
|
||||
roleExtractionRules:
|
||||
- "jwt.role != nil ? str(jwt.role) : ''"
|
||||
|
7
misc/packaging/openrc/emissary-agent.logrotate.conf
Normal file
7
misc/packaging/openrc/emissary-agent.logrotate.conf
Normal file
@ -0,0 +1,7 @@
|
||||
/var/log/emissary/agent.log {
|
||||
missingok
|
||||
sharedscripts
|
||||
postrotate
|
||||
/etc/init.d/emissary-agent restart
|
||||
endscript
|
||||
}
|
7
misc/packaging/openrc/emissary-server.logrotate.conf
Normal file
7
misc/packaging/openrc/emissary-server.logrotate.conf
Normal file
@ -0,0 +1,7 @@
|
||||
/var/log/emissary/server.log {
|
||||
missingok
|
||||
sharedscripts
|
||||
postrotate
|
||||
/etc/init.d/emissary-server restart
|
||||
endscript
|
||||
}
|
@ -4,13 +4,23 @@
|
||||
"url": "https://emissary.cadol.es/files/apps/app.arcad.edge.hextris_v2023.4.20-2bbbe94.zip",
|
||||
"sha256sum": "67942ef4b623c46308c3f640b534bd4cb6b1d6021a422e40b62ab97658ba4586",
|
||||
"address": ":8083",
|
||||
"format": "zip"
|
||||
"format": "zip",
|
||||
"storage": {
|
||||
"blobStoreDsn": "sqlite://apps/data/app.arcad.edge.hextris/blobstore.sqlite?_pragma=foreign_keys(1)&_pragma=busy_timeout=60000",
|
||||
"shareStoreDsn": "sqlite://apps/data/sharestore.sqlite?_pragma=foreign_keys(1)&_pragma=busy_timeout=60000",
|
||||
"documentStoreDsn": "sqlite://apps/data/app.arcad.edge.hextris/documentstore.sqlite?_pragma=foreign_keys(1)&_pragma=busy_timeout=60000"
|
||||
}
|
||||
},
|
||||
"edge.sdk.client.test": {
|
||||
"url": "https://emissary.cadol.es/files/apps/edge.sdk.client.test_v2023.4.20-20c4189.zip",
|
||||
"sha256sum": "1edeb4aa75c1675db49cf27367b1537234a04526848ea6657931ca63f26e5dae",
|
||||
"address": ":8084",
|
||||
"format": "zip"
|
||||
"format": "zip",
|
||||
"storage": {
|
||||
"blobStoreDsn": "sqlite://apps/data/edge.sdk.client.test/blobstore.sqlite?_pragma=foreign_keys(1)&_pragma=busy_timeout=60000",
|
||||
"shareStoreDsn": "sqlite://apps/data/sharestore.sqlite?_pragma=foreign_keys(1)&_pragma=busy_timeout=60000",
|
||||
"documentStoreDsn": "sqlite://apps/data/edge.sdk.client.test/documentstore.sqlite?_pragma=foreign_keys(1)&_pragma=busy_timeout=60000"
|
||||
}
|
||||
}
|
||||
},
|
||||
"config": {
|
||||
@ -28,6 +38,7 @@
|
||||
"auth": {
|
||||
"local": {
|
||||
"key": "absolutlynotsecret",
|
||||
"signingAlgorithm": "HS256",
|
||||
"cookieDuration": "1h",
|
||||
"accounts": [
|
||||
{
|
||||
|
2072
misc/spec-samples/uci.emissary.cadoles.com.json
Normal file
2072
misc/spec-samples/uci.emissary.cadoles.com.json
Normal file
@ -0,0 +1,2072 @@
|
||||
{
|
||||
"config": {
|
||||
"packages": [
|
||||
{
|
||||
"configs": [
|
||||
{
|
||||
"name": "dnsmasq",
|
||||
"options": [
|
||||
{
|
||||
"name": "domainneeded",
|
||||
"type": "option",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "boguspriv",
|
||||
"type": "option",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "filterwin2k",
|
||||
"type": "option",
|
||||
"value": "0"
|
||||
},
|
||||
{
|
||||
"name": "localise_queries",
|
||||
"type": "option",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "rebind_localhost",
|
||||
"type": "option",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "local",
|
||||
"type": "option",
|
||||
"value": "/lan/"
|
||||
},
|
||||
{
|
||||
"name": "domain",
|
||||
"type": "option",
|
||||
"value": "lan"
|
||||
},
|
||||
{
|
||||
"name": "expandhosts",
|
||||
"type": "option",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "nonegcache",
|
||||
"type": "option",
|
||||
"value": "0"
|
||||
},
|
||||
{
|
||||
"name": "authoritative",
|
||||
"type": "option",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "readethers",
|
||||
"type": "option",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "leasefile",
|
||||
"type": "option",
|
||||
"value": "/tmp/dhcp.leases"
|
||||
},
|
||||
{
|
||||
"name": "resolvfile",
|
||||
"type": "option",
|
||||
"value": "/tmp/resolv.conf.d/resolv.conf.auto"
|
||||
},
|
||||
{
|
||||
"name": "nonwildcard",
|
||||
"type": "option",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "localservice",
|
||||
"type": "option",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "ednspacket_max",
|
||||
"type": "option",
|
||||
"value": "1232"
|
||||
},
|
||||
{
|
||||
"name": "rebind_protection",
|
||||
"type": "option",
|
||||
"value": "0"
|
||||
},
|
||||
{
|
||||
"name": "interface",
|
||||
"type": "list",
|
||||
"value": "lan"
|
||||
},
|
||||
{
|
||||
"name": "interface",
|
||||
"type": "list",
|
||||
"value": "guest"
|
||||
},
|
||||
{
|
||||
"name": "logqueries",
|
||||
"type": "option",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "address",
|
||||
"type": "list",
|
||||
"value": "/arcad.lan/10.10.10.1"
|
||||
},
|
||||
{
|
||||
"name": "address",
|
||||
"type": "list",
|
||||
"value": "/#/10.10.10.1"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "dhcp",
|
||||
"options": [
|
||||
{
|
||||
"name": "interface",
|
||||
"type": "option",
|
||||
"value": "lan"
|
||||
},
|
||||
{
|
||||
"name": "start",
|
||||
"type": "option",
|
||||
"value": "100"
|
||||
},
|
||||
{
|
||||
"name": "limit",
|
||||
"type": "option",
|
||||
"value": "150"
|
||||
},
|
||||
{
|
||||
"name": "leasetime",
|
||||
"type": "option",
|
||||
"value": "12h"
|
||||
},
|
||||
{
|
||||
"name": "dhcpv4",
|
||||
"type": "option",
|
||||
"value": "server"
|
||||
},
|
||||
{
|
||||
"name": "dhcpv6",
|
||||
"type": "option",
|
||||
"value": "server"
|
||||
},
|
||||
{
|
||||
"name": "ra",
|
||||
"type": "option",
|
||||
"value": "server"
|
||||
},
|
||||
{
|
||||
"name": "ra_slaac",
|
||||
"type": "option",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "ra_flags",
|
||||
"type": "list",
|
||||
"value": "managed-config"
|
||||
},
|
||||
{
|
||||
"name": "ra_flags",
|
||||
"type": "list",
|
||||
"value": "other-config"
|
||||
}
|
||||
],
|
||||
"section": "lan"
|
||||
},
|
||||
{
|
||||
"name": "dhcp",
|
||||
"options": [
|
||||
{
|
||||
"name": "interface",
|
||||
"type": "option",
|
||||
"value": "wan"
|
||||
},
|
||||
{
|
||||
"name": "ignore",
|
||||
"type": "option",
|
||||
"value": "1"
|
||||
}
|
||||
],
|
||||
"section": "wan"
|
||||
},
|
||||
{
|
||||
"name": "odhcpd",
|
||||
"options": [
|
||||
{
|
||||
"name": "maindhcp",
|
||||
"type": "option",
|
||||
"value": "0"
|
||||
},
|
||||
{
|
||||
"name": "leasefile",
|
||||
"type": "option",
|
||||
"value": "/tmp/hosts/odhcpd"
|
||||
},
|
||||
{
|
||||
"name": "leasetrigger",
|
||||
"type": "option",
|
||||
"value": "/usr/sbin/odhcpd-update"
|
||||
},
|
||||
{
|
||||
"name": "loglevel",
|
||||
"type": "option",
|
||||
"value": "4"
|
||||
}
|
||||
],
|
||||
"section": "odhcpd"
|
||||
},
|
||||
{
|
||||
"name": "dhcp",
|
||||
"options": [
|
||||
{
|
||||
"name": "interface",
|
||||
"type": "option",
|
||||
"value": "guest"
|
||||
},
|
||||
{
|
||||
"name": "start",
|
||||
"type": "option",
|
||||
"value": "100"
|
||||
},
|
||||
{
|
||||
"name": "limit",
|
||||
"type": "option",
|
||||
"value": "150"
|
||||
},
|
||||
{
|
||||
"name": "leasetime",
|
||||
"type": "option",
|
||||
"value": "12h"
|
||||
},
|
||||
{
|
||||
"name": "dhcp_option",
|
||||
"type": "list",
|
||||
"value": "160,http://arcad.lan"
|
||||
}
|
||||
],
|
||||
"section": "guest"
|
||||
}
|
||||
],
|
||||
"name": "dhcp"
|
||||
},
|
||||
{
|
||||
"configs": [
|
||||
{
|
||||
"name": "dropbear",
|
||||
"options": [
|
||||
{
|
||||
"name": "PasswordAuth",
|
||||
"type": "option",
|
||||
"value": "on"
|
||||
},
|
||||
{
|
||||
"name": "RootPasswordAuth",
|
||||
"type": "option",
|
||||
"value": "on"
|
||||
},
|
||||
{
|
||||
"name": "Port",
|
||||
"type": "option",
|
||||
"value": "22"
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"name": "dropbear"
|
||||
},
|
||||
{
|
||||
"configs": [
|
||||
{
|
||||
"name": "main",
|
||||
"options": [
|
||||
{
|
||||
"name": "reconciliation_interval",
|
||||
"type": "option",
|
||||
"value": "60"
|
||||
},
|
||||
{
|
||||
"name": "server_url",
|
||||
"type": "option",
|
||||
"value": "https://emissary.cadol.es"
|
||||
}
|
||||
],
|
||||
"section": "agent"
|
||||
}
|
||||
],
|
||||
"name": "emissary"
|
||||
},
|
||||
{
|
||||
"configs": [
|
||||
{
|
||||
"name": "defaults",
|
||||
"options": [
|
||||
{
|
||||
"name": "syn_flood",
|
||||
"type": "option",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "input",
|
||||
"type": "option",
|
||||
"value": "ACCEPT"
|
||||
},
|
||||
{
|
||||
"name": "output",
|
||||
"type": "option",
|
||||
"value": "ACCEPT"
|
||||
},
|
||||
{
|
||||
"name": "forward",
|
||||
"type": "option",
|
||||
"value": "REJECT"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "zone",
|
||||
"options": [
|
||||
{
|
||||
"name": "name",
|
||||
"type": "option",
|
||||
"value": "lan"
|
||||
},
|
||||
{
|
||||
"name": "network",
|
||||
"type": "list",
|
||||
"value": "lan"
|
||||
},
|
||||
{
|
||||
"name": "input",
|
||||
"type": "option",
|
||||
"value": "ACCEPT"
|
||||
},
|
||||
{
|
||||
"name": "output",
|
||||
"type": "option",
|
||||
"value": "ACCEPT"
|
||||
},
|
||||
{
|
||||
"name": "forward",
|
||||
"type": "option",
|
||||
"value": "ACCEPT"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "zone",
|
||||
"options": [
|
||||
{
|
||||
"name": "name",
|
||||
"type": "option",
|
||||
"value": "wan"
|
||||
},
|
||||
{
|
||||
"name": "network",
|
||||
"type": "list",
|
||||
"value": "wan"
|
||||
},
|
||||
{
|
||||
"name": "network",
|
||||
"type": "list",
|
||||
"value": "wan6"
|
||||
},
|
||||
{
|
||||
"name": "input",
|
||||
"type": "option",
|
||||
"value": "REJECT"
|
||||
},
|
||||
{
|
||||
"name": "output",
|
||||
"type": "option",
|
||||
"value": "ACCEPT"
|
||||
},
|
||||
{
|
||||
"name": "forward",
|
||||
"type": "option",
|
||||
"value": "REJECT"
|
||||
},
|
||||
{
|
||||
"name": "masq",
|
||||
"type": "option",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "mtu_fix",
|
||||
"type": "option",
|
||||
"value": "1"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "forwarding",
|
||||
"options": [
|
||||
{
|
||||
"name": "src",
|
||||
"type": "option",
|
||||
"value": "lan"
|
||||
},
|
||||
{
|
||||
"name": "dest",
|
||||
"type": "option",
|
||||
"value": "wan"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "rule",
|
||||
"options": [
|
||||
{
|
||||
"name": "name",
|
||||
"type": "option",
|
||||
"value": "Allow-DHCP-Renew"
|
||||
},
|
||||
{
|
||||
"name": "src",
|
||||
"type": "option",
|
||||
"value": "wan"
|
||||
},
|
||||
{
|
||||
"name": "proto",
|
||||
"type": "option",
|
||||
"value": "udp"
|
||||
},
|
||||
{
|
||||
"name": "dest_port",
|
||||
"type": "option",
|
||||
"value": "68"
|
||||
},
|
||||
{
|
||||
"name": "target",
|
||||
"type": "option",
|
||||
"value": "ACCEPT"
|
||||
},
|
||||
{
|
||||
"name": "family",
|
||||
"type": "option",
|
||||
"value": "ipv4"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "rule",
|
||||
"options": [
|
||||
{
|
||||
"name": "name",
|
||||
"type": "option",
|
||||
"value": "Allow-Ping"
|
||||
},
|
||||
{
|
||||
"name": "src",
|
||||
"type": "option",
|
||||
"value": "wan"
|
||||
},
|
||||
{
|
||||
"name": "proto",
|
||||
"type": "option",
|
||||
"value": "icmp"
|
||||
},
|
||||
{
|
||||
"name": "icmp_type",
|
||||
"type": "option",
|
||||
"value": "echo-request"
|
||||
},
|
||||
{
|
||||
"name": "family",
|
||||
"type": "option",
|
||||
"value": "ipv4"
|
||||
},
|
||||
{
|
||||
"name": "target",
|
||||
"type": "option",
|
||||
"value": "ACCEPT"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "rule",
|
||||
"options": [
|
||||
{
|
||||
"name": "name",
|
||||
"type": "option",
|
||||
"value": "Allow-IGMP"
|
||||
},
|
||||
{
|
||||
"name": "src",
|
||||
"type": "option",
|
||||
"value": "wan"
|
||||
},
|
||||
{
|
||||
"name": "proto",
|
||||
"type": "option",
|
||||
"value": "igmp"
|
||||
},
|
||||
{
|
||||
"name": "family",
|
||||
"type": "option",
|
||||
"value": "ipv4"
|
||||
},
|
||||
{
|
||||
"name": "target",
|
||||
"type": "option",
|
||||
"value": "ACCEPT"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "rule",
|
||||
"options": [
|
||||
{
|
||||
"name": "name",
|
||||
"type": "option",
|
||||
"value": "Allow-DHCPv6"
|
||||
},
|
||||
{
|
||||
"name": "src",
|
||||
"type": "option",
|
||||
"value": "wan"
|
||||
},
|
||||
{
|
||||
"name": "proto",
|
||||
"type": "option",
|
||||
"value": "udp"
|
||||
},
|
||||
{
|
||||
"name": "dest_port",
|
||||
"type": "option",
|
||||
"value": "546"
|
||||
},
|
||||
{
|
||||
"name": "family",
|
||||
"type": "option",
|
||||
"value": "ipv6"
|
||||
},
|
||||
{
|
||||
"name": "target",
|
||||
"type": "option",
|
||||
"value": "ACCEPT"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "rule",
|
||||
"options": [
|
||||
{
|
||||
"name": "name",
|
||||
"type": "option",
|
||||
"value": "Allow-MLD"
|
||||
},
|
||||
{
|
||||
"name": "src",
|
||||
"type": "option",
|
||||
"value": "wan"
|
||||
},
|
||||
{
|
||||
"name": "proto",
|
||||
"type": "option",
|
||||
"value": "icmp"
|
||||
},
|
||||
{
|
||||
"name": "src_ip",
|
||||
"type": "option",
|
||||
"value": "fe80::/10"
|
||||
},
|
||||
{
|
||||
"name": "icmp_type",
|
||||
"type": "list",
|
||||
"value": "130/0"
|
||||
},
|
||||
{
|
||||
"name": "icmp_type",
|
||||
"type": "list",
|
||||
"value": "131/0"
|
||||
},
|
||||
{
|
||||
"name": "icmp_type",
|
||||
"type": "list",
|
||||
"value": "132/0"
|
||||
},
|
||||
{
|
||||
"name": "icmp_type",
|
||||
"type": "list",
|
||||
"value": "143/0"
|
||||
},
|
||||
{
|
||||
"name": "family",
|
||||
"type": "option",
|
||||
"value": "ipv6"
|
||||
},
|
||||
{
|
||||
"name": "target",
|
||||
"type": "option",
|
||||
"value": "ACCEPT"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "rule",
|
||||
"options": [
|
||||
{
|
||||
"name": "name",
|
||||
"type": "option",
|
||||
"value": "Allow-ICMPv6-Input"
|
||||
},
|
||||
{
|
||||
"name": "src",
|
||||
"type": "option",
|
||||
"value": "wan"
|
||||
},
|
||||
{
|
||||
"name": "proto",
|
||||
"type": "option",
|
||||
"value": "icmp"
|
||||
},
|
||||
{
|
||||
"name": "icmp_type",
|
||||
"type": "list",
|
||||
"value": "echo-request"
|
||||
},
|
||||
{
|
||||
"name": "icmp_type",
|
||||
"type": "list",
|
||||
"value": "echo-reply"
|
||||
},
|
||||
{
|
||||
"name": "icmp_type",
|
||||
"type": "list",
|
||||
"value": "destination-unreachable"
|
||||
},
|
||||
{
|
||||
"name": "icmp_type",
|
||||
"type": "list",
|
||||
"value": "packet-too-big"
|
||||
},
|
||||
{
|
||||
"name": "icmp_type",
|
||||
"type": "list",
|
||||
"value": "time-exceeded"
|
||||
},
|
||||
{
|
||||
"name": "icmp_type",
|
||||
"type": "list",
|
||||
"value": "bad-header"
|
||||
},
|
||||
{
|
||||
"name": "icmp_type",
|
||||
"type": "list",
|
||||
"value": "unknown-header-type"
|
||||
},
|
||||
{
|
||||
"name": "icmp_type",
|
||||
"type": "list",
|
||||
"value": "router-solicitation"
|
||||
},
|
||||
{
|
||||
"name": "icmp_type",
|
||||
"type": "list",
|
||||
"value": "neighbour-solicitation"
|
||||
},
|
||||
{
|
||||
"name": "icmp_type",
|
||||
"type": "list",
|
||||
"value": "router-advertisement"
|
||||
},
|
||||
{
|
||||
"name": "icmp_type",
|
||||
"type": "list",
|
||||
"value": "neighbour-advertisement"
|
||||
},
|
||||
{
|
||||
"name": "limit",
|
||||
"type": "option",
|
||||
"value": "1000/sec"
|
||||
},
|
||||
{
|
||||
"name": "family",
|
||||
"type": "option",
|
||||
"value": "ipv6"
|
||||
},
|
||||
{
|
||||
"name": "target",
|
||||
"type": "option",
|
||||
"value": "ACCEPT"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "rule",
|
||||
"options": [
|
||||
{
|
||||
"name": "name",
|
||||
"type": "option",
|
||||
"value": "Allow-ICMPv6-Forward"
|
||||
},
|
||||
{
|
||||
"name": "src",
|
||||
"type": "option",
|
||||
"value": "wan"
|
||||
},
|
||||
{
|
||||
"name": "dest",
|
||||
"type": "option",
|
||||
"value": "*"
|
||||
},
|
||||
{
|
||||
"name": "proto",
|
||||
"type": "option",
|
||||
"value": "icmp"
|
||||
},
|
||||
{
|
||||
"name": "icmp_type",
|
||||
"type": "list",
|
||||
"value": "echo-request"
|
||||
},
|
||||
{
|
||||
"name": "icmp_type",
|
||||
"type": "list",
|
||||
"value": "echo-reply"
|
||||
},
|
||||
{
|
||||
"name": "icmp_type",
|
||||
"type": "list",
|
||||
"value": "destination-unreachable"
|
||||
},
|
||||
{
|
||||
"name": "icmp_type",
|
||||
"type": "list",
|
||||
"value": "packet-too-big"
|
||||
},
|
||||
{
|
||||
"name": "icmp_type",
|
||||
"type": "list",
|
||||
"value": "time-exceeded"
|
||||
},
|
||||
{
|
||||
"name": "icmp_type",
|
||||
"type": "list",
|
||||
"value": "bad-header"
|
||||
},
|
||||
{
|
||||
"name": "icmp_type",
|
||||
"type": "list",
|
||||
"value": "unknown-header-type"
|
||||
},
|
||||
{
|
||||
"name": "limit",
|
||||
"type": "option",
|
||||
"value": "1000/sec"
|
||||
},
|
||||
{
|
||||
"name": "family",
|
||||
"type": "option",
|
||||
"value": "ipv6"
|
||||
},
|
||||
{
|
||||
"name": "target",
|
||||
"type": "option",
|
||||
"value": "ACCEPT"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "rule",
|
||||
"options": [
|
||||
{
|
||||
"name": "name",
|
||||
"type": "option",
|
||||
"value": "Allow-IPSec-ESP"
|
||||
},
|
||||
{
|
||||
"name": "src",
|
||||
"type": "option",
|
||||
"value": "wan"
|
||||
},
|
||||
{
|
||||
"name": "dest",
|
||||
"type": "option",
|
||||
"value": "lan"
|
||||
},
|
||||
{
|
||||
"name": "proto",
|
||||
"type": "option",
|
||||
"value": "esp"
|
||||
},
|
||||
{
|
||||
"name": "target",
|
||||
"type": "option",
|
||||
"value": "ACCEPT"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "rule",
|
||||
"options": [
|
||||
{
|
||||
"name": "name",
|
||||
"type": "option",
|
||||
"value": "Allow-ISAKMP"
|
||||
},
|
||||
{
|
||||
"name": "src",
|
||||
"type": "option",
|
||||
"value": "wan"
|
||||
},
|
||||
{
|
||||
"name": "dest",
|
||||
"type": "option",
|
||||
"value": "lan"
|
||||
},
|
||||
{
|
||||
"name": "dest_port",
|
||||
"type": "option",
|
||||
"value": "500"
|
||||
},
|
||||
{
|
||||
"name": "proto",
|
||||
"type": "option",
|
||||
"value": "udp"
|
||||
},
|
||||
{
|
||||
"name": "target",
|
||||
"type": "option",
|
||||
"value": "ACCEPT"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "rule",
|
||||
"options": [
|
||||
{
|
||||
"name": "name",
|
||||
"type": "option",
|
||||
"value": "Allow SSH on WAN"
|
||||
},
|
||||
{
|
||||
"name": "src",
|
||||
"type": "option",
|
||||
"value": "wan"
|
||||
},
|
||||
{
|
||||
"name": "proto",
|
||||
"type": "option",
|
||||
"value": "tcp"
|
||||
},
|
||||
{
|
||||
"name": "dest_port",
|
||||
"type": "option",
|
||||
"value": "22"
|
||||
},
|
||||
{
|
||||
"name": "target",
|
||||
"type": "option",
|
||||
"value": "ACCEPT"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "rule",
|
||||
"options": [
|
||||
{
|
||||
"name": "name",
|
||||
"type": "option",
|
||||
"value": "Allow HTTP on WAN"
|
||||
},
|
||||
{
|
||||
"name": "src",
|
||||
"type": "option",
|
||||
"value": "wan"
|
||||
},
|
||||
{
|
||||
"name": "proto",
|
||||
"type": "option",
|
||||
"value": "tcp"
|
||||
},
|
||||
{
|
||||
"name": "dest_port",
|
||||
"type": "option",
|
||||
"value": "80"
|
||||
},
|
||||
{
|
||||
"name": "target",
|
||||
"type": "option",
|
||||
"value": "ACCEPT"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "rule",
|
||||
"options": [
|
||||
{
|
||||
"name": "name",
|
||||
"type": "option",
|
||||
"value": "Allow HTTPS on WAN"
|
||||
},
|
||||
{
|
||||
"name": "src",
|
||||
"type": "option",
|
||||
"value": "wan"
|
||||
},
|
||||
{
|
||||
"name": "proto",
|
||||
"type": "option",
|
||||
"value": "tcp"
|
||||
},
|
||||
{
|
||||
"name": "dest_port",
|
||||
"type": "option",
|
||||
"value": "443"
|
||||
},
|
||||
{
|
||||
"name": "target",
|
||||
"type": "option",
|
||||
"value": "ACCEPT"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "zone",
|
||||
"options": [
|
||||
{
|
||||
"name": "name",
|
||||
"type": "option",
|
||||
"value": "guest"
|
||||
},
|
||||
{
|
||||
"name": "input",
|
||||
"type": "option",
|
||||
"value": "ACCEPT"
|
||||
},
|
||||
{
|
||||
"name": "output",
|
||||
"type": "option",
|
||||
"value": "ACCEPT"
|
||||
},
|
||||
{
|
||||
"name": "forward",
|
||||
"type": "option",
|
||||
"value": "REJECT"
|
||||
},
|
||||
{
|
||||
"name": "network",
|
||||
"type": "list",
|
||||
"value": "guest"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "rule",
|
||||
"options": [
|
||||
{
|
||||
"name": "name",
|
||||
"type": "option",
|
||||
"value": "Allow 8080 on WAN"
|
||||
},
|
||||
{
|
||||
"name": "src",
|
||||
"type": "option",
|
||||
"value": "wan"
|
||||
},
|
||||
{
|
||||
"name": "proto",
|
||||
"type": "option",
|
||||
"value": "tcp"
|
||||
},
|
||||
{
|
||||
"name": "dest_port",
|
||||
"type": "option",
|
||||
"value": "8080"
|
||||
},
|
||||
{
|
||||
"name": "target",
|
||||
"type": "option",
|
||||
"value": "ACCEPT"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "rule",
|
||||
"options": [
|
||||
{
|
||||
"name": "name",
|
||||
"type": "option",
|
||||
"value": "Allow 8443 on WAN"
|
||||
},
|
||||
{
|
||||
"name": "src",
|
||||
"type": "option",
|
||||
"value": "wan"
|
||||
},
|
||||
{
|
||||
"name": "proto",
|
||||
"type": "option",
|
||||
"value": "tcp"
|
||||
},
|
||||
{
|
||||
"name": "dest_port",
|
||||
"type": "option",
|
||||
"value": "8443"
|
||||
},
|
||||
{
|
||||
"name": "target",
|
||||
"type": "option",
|
||||
"value": "ACCEPT"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "rule",
|
||||
"options": [
|
||||
{
|
||||
"name": "proto",
|
||||
"type": "list",
|
||||
"value": "udp"
|
||||
},
|
||||
{
|
||||
"name": "dest_port",
|
||||
"type": "option",
|
||||
"value": "5353"
|
||||
},
|
||||
{
|
||||
"name": "target",
|
||||
"type": "option",
|
||||
"value": "ACCEPT"
|
||||
},
|
||||
{
|
||||
"name": "name",
|
||||
"type": "option",
|
||||
"value": "Allow mDNS from device"
|
||||
},
|
||||
{
|
||||
"name": "src",
|
||||
"type": "option",
|
||||
"value": "*"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "rule",
|
||||
"options": [
|
||||
{
|
||||
"name": "proto",
|
||||
"type": "list",
|
||||
"value": "udp"
|
||||
},
|
||||
{
|
||||
"name": "src_port",
|
||||
"type": "option",
|
||||
"value": "5353"
|
||||
},
|
||||
{
|
||||
"name": "target",
|
||||
"type": "option",
|
||||
"value": "ACCEPT"
|
||||
},
|
||||
{
|
||||
"name": "name",
|
||||
"type": "option",
|
||||
"value": "Allow mDNS to device"
|
||||
},
|
||||
{
|
||||
"name": "src",
|
||||
"type": "option",
|
||||
"value": "*"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "redirect",
|
||||
"options": [
|
||||
{
|
||||
"name": "target",
|
||||
"type": "option",
|
||||
"value": "DNAT"
|
||||
},
|
||||
{
|
||||
"name": "proto",
|
||||
"type": "list",
|
||||
"value": "udp"
|
||||
},
|
||||
{
|
||||
"name": "src",
|
||||
"type": "option",
|
||||
"value": "guest"
|
||||
},
|
||||
{
|
||||
"name": "src_dport",
|
||||
"type": "option",
|
||||
"value": "53"
|
||||
},
|
||||
{
|
||||
"name": "dest_ip",
|
||||
"type": "option",
|
||||
"value": "10.10.10.1"
|
||||
},
|
||||
{
|
||||
"name": "dest_port",
|
||||
"type": "option",
|
||||
"value": "53"
|
||||
},
|
||||
{
|
||||
"name": "name",
|
||||
"type": "option",
|
||||
"value": "Redirect DNS"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "redirect",
|
||||
"options": [
|
||||
{
|
||||
"name": "target",
|
||||
"type": "option",
|
||||
"value": "DNAT"
|
||||
},
|
||||
{
|
||||
"name": "name",
|
||||
"type": "option",
|
||||
"value": "Redirect HTTP"
|
||||
},
|
||||
{
|
||||
"name": "proto",
|
||||
"type": "list",
|
||||
"value": "tcp"
|
||||
},
|
||||
{
|
||||
"name": "src",
|
||||
"type": "option",
|
||||
"value": "guest"
|
||||
},
|
||||
{
|
||||
"name": "src_dport",
|
||||
"type": "option",
|
||||
"value": "80"
|
||||
},
|
||||
{
|
||||
"name": "dest_ip",
|
||||
"type": "option",
|
||||
"value": "10.10.10.1"
|
||||
},
|
||||
{
|
||||
"name": "dest_port",
|
||||
"type": "option",
|
||||
"value": "80"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "rule",
|
||||
"options": [
|
||||
{
|
||||
"name": "name",
|
||||
"type": "option",
|
||||
"value": "Allow 8081 for edge.sdk.client.test on WAN"
|
||||
},
|
||||
{
|
||||
"name": "proto",
|
||||
"type": "list",
|
||||
"value": "tcp"
|
||||
},
|
||||
{
|
||||
"name": "src",
|
||||
"type": "option",
|
||||
"value": "wan"
|
||||
},
|
||||
{
|
||||
"name": "dest_port",
|
||||
"type": "option",
|
||||
"value": "8081"
|
||||
},
|
||||
{
|
||||
"name": "target",
|
||||
"type": "option",
|
||||
"value": "ACCEPT"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "rule",
|
||||
"options": [
|
||||
{
|
||||
"name": "name",
|
||||
"type": "option",
|
||||
"value": "Allow 8082 for app.arcad.edge.hextris on WAN"
|
||||
},
|
||||
{
|
||||
"name": "proto",
|
||||
"type": "list",
|
||||
"value": "tcp"
|
||||
},
|
||||
{
|
||||
"name": "src",
|
||||
"type": "option",
|
||||
"value": "wan"
|
||||
},
|
||||
{
|
||||
"name": "dest_port",
|
||||
"type": "option",
|
||||
"value": "8082"
|
||||
},
|
||||
{
|
||||
"name": "target",
|
||||
"type": "option",
|
||||
"value": "ACCEPT"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "rule",
|
||||
"options": [
|
||||
{
|
||||
"name": "name",
|
||||
"type": "option",
|
||||
"value": "Allow 8083 for arcad.diffusion on WAN"
|
||||
},
|
||||
{
|
||||
"name": "proto",
|
||||
"type": "list",
|
||||
"value": "tcp"
|
||||
},
|
||||
{
|
||||
"name": "src",
|
||||
"type": "option",
|
||||
"value": "wan"
|
||||
},
|
||||
{
|
||||
"name": "dest_port",
|
||||
"type": "option",
|
||||
"value": "8083"
|
||||
},
|
||||
{
|
||||
"name": "target",
|
||||
"type": "option",
|
||||
"value": "ACCEPT"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "rule",
|
||||
"options": [
|
||||
{
|
||||
"name": "name",
|
||||
"type": "option",
|
||||
"value": "Allow 8084 for app.arcad.edge.menu on WAN"
|
||||
},
|
||||
{
|
||||
"name": "proto",
|
||||
"type": "list",
|
||||
"value": "tcp"
|
||||
},
|
||||
{
|
||||
"name": "src",
|
||||
"type": "option",
|
||||
"value": "wan"
|
||||
},
|
||||
{
|
||||
"name": "dest_port",
|
||||
"type": "option",
|
||||
"value": "8084"
|
||||
},
|
||||
{
|
||||
"name": "target",
|
||||
"type": "option",
|
||||
"value": "ACCEPT"
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"name": "firewall"
|
||||
},
|
||||
{
|
||||
"configs": [
|
||||
{
|
||||
"name": "core",
|
||||
"options": [
|
||||
{
|
||||
"name": "lang",
|
||||
"type": "option",
|
||||
"value": "auto"
|
||||
},
|
||||
{
|
||||
"name": "mediaurlbase",
|
||||
"type": "option",
|
||||
"value": "/luci-static/bootstrap"
|
||||
},
|
||||
{
|
||||
"name": "resourcebase",
|
||||
"type": "option",
|
||||
"value": "/luci-static/resources"
|
||||
},
|
||||
{
|
||||
"name": "ubuspath",
|
||||
"type": "option",
|
||||
"value": "/ubus/"
|
||||
}
|
||||
],
|
||||
"section": "main"
|
||||
},
|
||||
{
|
||||
"name": "extern",
|
||||
"options": [
|
||||
{
|
||||
"name": "uci",
|
||||
"type": "option",
|
||||
"value": "/etc/config/"
|
||||
},
|
||||
{
|
||||
"name": "dropbear",
|
||||
"type": "option",
|
||||
"value": "/etc/dropbear/"
|
||||
},
|
||||
{
|
||||
"name": "openvpn",
|
||||
"type": "option",
|
||||
"value": "/etc/openvpn/"
|
||||
},
|
||||
{
|
||||
"name": "passwd",
|
||||
"type": "option",
|
||||
"value": "/etc/passwd"
|
||||
},
|
||||
{
|
||||
"name": "opkg",
|
||||
"type": "option",
|
||||
"value": "/etc/opkg.conf"
|
||||
},
|
||||
{
|
||||
"name": "firewall",
|
||||
"type": "option",
|
||||
"value": "/etc/firewall.user"
|
||||
},
|
||||
{
|
||||
"name": "uploads",
|
||||
"type": "option",
|
||||
"value": "/lib/uci/upload/"
|
||||
}
|
||||
],
|
||||
"section": "flash_keep"
|
||||
},
|
||||
{
|
||||
"name": "internal",
|
||||
"options": null,
|
||||
"section": "languages"
|
||||
},
|
||||
{
|
||||
"name": "internal",
|
||||
"options": [
|
||||
{
|
||||
"name": "sessionpath",
|
||||
"type": "option",
|
||||
"value": "/tmp/luci-sessions"
|
||||
},
|
||||
{
|
||||
"name": "sessiontime",
|
||||
"type": "option",
|
||||
"value": "3600"
|
||||
}
|
||||
],
|
||||
"section": "sauth"
|
||||
},
|
||||
{
|
||||
"name": "internal",
|
||||
"options": [
|
||||
{
|
||||
"name": "enable",
|
||||
"type": "option",
|
||||
"value": "1"
|
||||
}
|
||||
],
|
||||
"section": "ccache"
|
||||
},
|
||||
{
|
||||
"name": "internal",
|
||||
"options": [
|
||||
{
|
||||
"name": "Bootstrap",
|
||||
"type": "option",
|
||||
"value": "/luci-static/bootstrap"
|
||||
},
|
||||
{
|
||||
"name": "BootstrapDark",
|
||||
"type": "option",
|
||||
"value": "/luci-static/bootstrap-dark"
|
||||
},
|
||||
{
|
||||
"name": "BootstrapLight",
|
||||
"type": "option",
|
||||
"value": "/luci-static/bootstrap-light"
|
||||
}
|
||||
],
|
||||
"section": "themes"
|
||||
},
|
||||
{
|
||||
"name": "internal",
|
||||
"options": [
|
||||
{
|
||||
"name": "rollback",
|
||||
"type": "option",
|
||||
"value": "90"
|
||||
},
|
||||
{
|
||||
"name": "holdoff",
|
||||
"type": "option",
|
||||
"value": "4"
|
||||
},
|
||||
{
|
||||
"name": "timeout",
|
||||
"type": "option",
|
||||
"value": "5"
|
||||
},
|
||||
{
|
||||
"name": "display",
|
||||
"type": "option",
|
||||
"value": "1.5"
|
||||
}
|
||||
],
|
||||
"section": "apply"
|
||||
},
|
||||
{
|
||||
"name": "internal",
|
||||
"options": [
|
||||
{
|
||||
"name": "dns",
|
||||
"type": "option",
|
||||
"value": "openwrt.org"
|
||||
},
|
||||
{
|
||||
"name": "ping",
|
||||
"type": "option",
|
||||
"value": "openwrt.org"
|
||||
},
|
||||
{
|
||||
"name": "route",
|
||||
"type": "option",
|
||||
"value": "openwrt.org"
|
||||
}
|
||||
],
|
||||
"section": "diag"
|
||||
}
|
||||
],
|
||||
"name": "luci"
|
||||
},
|
||||
{
|
||||
"configs": [
|
||||
{
|
||||
"name": "interface",
|
||||
"options": [
|
||||
{
|
||||
"name": "proto",
|
||||
"type": "option",
|
||||
"value": "static"
|
||||
},
|
||||
{
|
||||
"name": "ipaddr",
|
||||
"type": "option",
|
||||
"value": "127.0.0.1"
|
||||
},
|
||||
{
|
||||
"name": "netmask",
|
||||
"type": "option",
|
||||
"value": "255.0.0.0"
|
||||
},
|
||||
{
|
||||
"name": "device",
|
||||
"type": "option",
|
||||
"value": "lo"
|
||||
}
|
||||
],
|
||||
"section": "loopback"
|
||||
},
|
||||
{
|
||||
"name": "interface",
|
||||
"options": [
|
||||
{
|
||||
"name": "proto",
|
||||
"type": "option",
|
||||
"value": "dhcp"
|
||||
},
|
||||
{
|
||||
"name": "device",
|
||||
"type": "option",
|
||||
"value": "eth0"
|
||||
}
|
||||
],
|
||||
"section": "wan"
|
||||
},
|
||||
{
|
||||
"name": "interface",
|
||||
"options": [
|
||||
{
|
||||
"name": "proto",
|
||||
"type": "option",
|
||||
"value": "static"
|
||||
},
|
||||
{
|
||||
"name": "device",
|
||||
"type": "option",
|
||||
"value": "wlan0"
|
||||
},
|
||||
{
|
||||
"name": "ipaddr",
|
||||
"type": "option",
|
||||
"value": "10.10.10.1"
|
||||
},
|
||||
{
|
||||
"name": "netmask",
|
||||
"type": "option",
|
||||
"value": "255.255.255.0"
|
||||
}
|
||||
],
|
||||
"section": "guest"
|
||||
}
|
||||
],
|
||||
"name": "network"
|
||||
},
|
||||
{
|
||||
"configs": [
|
||||
{
|
||||
"name": "rpcd",
|
||||
"options": [
|
||||
{
|
||||
"name": "socket",
|
||||
"type": "option",
|
||||
"value": "/var/run/ubus/ubus.sock"
|
||||
},
|
||||
{
|
||||
"name": "timeout",
|
||||
"type": "option",
|
||||
"value": "30"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "login",
|
||||
"options": [
|
||||
{
|
||||
"name": "username",
|
||||
"type": "option",
|
||||
"value": "root"
|
||||
},
|
||||
{
|
||||
"name": "password",
|
||||
"type": "option",
|
||||
"value": "$p$root"
|
||||
},
|
||||
{
|
||||
"name": "read",
|
||||
"type": "list",
|
||||
"value": "*"
|
||||
},
|
||||
{
|
||||
"name": "write",
|
||||
"type": "list",
|
||||
"value": "*"
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"name": "rpcd"
|
||||
},
|
||||
{
|
||||
"configs": [
|
||||
{
|
||||
"name": "system",
|
||||
"options": [
|
||||
{
|
||||
"name": "hostname",
|
||||
"type": "option",
|
||||
"value": "arcad-will"
|
||||
},
|
||||
{
|
||||
"name": "timezone",
|
||||
"type": "option",
|
||||
"value": "UTC"
|
||||
},
|
||||
{
|
||||
"name": "ttylogin",
|
||||
"type": "option",
|
||||
"value": "0"
|
||||
},
|
||||
{
|
||||
"name": "log_size",
|
||||
"type": "option",
|
||||
"value": "64"
|
||||
},
|
||||
{
|
||||
"name": "urandom_seed",
|
||||
"type": "option",
|
||||
"value": "0"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "timeserver",
|
||||
"options": [
|
||||
{
|
||||
"name": "enabled",
|
||||
"type": "option",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "enable_server",
|
||||
"type": "option",
|
||||
"value": "0"
|
||||
},
|
||||
{
|
||||
"name": "server",
|
||||
"type": "list",
|
||||
"value": "0.openwrt.pool.ntp.org"
|
||||
},
|
||||
{
|
||||
"name": "server",
|
||||
"type": "list",
|
||||
"value": "1.openwrt.pool.ntp.org"
|
||||
},
|
||||
{
|
||||
"name": "server",
|
||||
"type": "list",
|
||||
"value": "2.openwrt.pool.ntp.org"
|
||||
},
|
||||
{
|
||||
"name": "server",
|
||||
"type": "list",
|
||||
"value": "3.openwrt.pool.ntp.org"
|
||||
}
|
||||
],
|
||||
"section": "ntp"
|
||||
}
|
||||
],
|
||||
"name": "system"
|
||||
},
|
||||
{
|
||||
"configs": [
|
||||
{
|
||||
"name": "network",
|
||||
"options": [
|
||||
{
|
||||
"name": "init",
|
||||
"type": "option",
|
||||
"value": "network"
|
||||
},
|
||||
{
|
||||
"name": "affects",
|
||||
"type": "list",
|
||||
"value": "dhcp"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "wireless",
|
||||
"options": [
|
||||
{
|
||||
"name": "affects",
|
||||
"type": "list",
|
||||
"value": "network"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "firewall",
|
||||
"options": [
|
||||
{
|
||||
"name": "init",
|
||||
"type": "option",
|
||||
"value": "firewall"
|
||||
},
|
||||
{
|
||||
"name": "affects",
|
||||
"type": "list",
|
||||
"value": "luci-splash"
|
||||
},
|
||||
{
|
||||
"name": "affects",
|
||||
"type": "list",
|
||||
"value": "qos"
|
||||
},
|
||||
{
|
||||
"name": "affects",
|
||||
"type": "list",
|
||||
"value": "miniupnpd"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "olsr",
|
||||
"options": [
|
||||
{
|
||||
"name": "init",
|
||||
"type": "option",
|
||||
"value": "olsrd"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "dhcp",
|
||||
"options": [
|
||||
{
|
||||
"name": "init",
|
||||
"type": "option",
|
||||
"value": "dnsmasq"
|
||||
},
|
||||
{
|
||||
"name": "affects",
|
||||
"type": "list",
|
||||
"value": "odhcpd"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "odhcpd",
|
||||
"options": [
|
||||
{
|
||||
"name": "init",
|
||||
"type": "option",
|
||||
"value": "odhcpd"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "dropbear",
|
||||
"options": [
|
||||
{
|
||||
"name": "init",
|
||||
"type": "option",
|
||||
"value": "dropbear"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "httpd",
|
||||
"options": [
|
||||
{
|
||||
"name": "init",
|
||||
"type": "option",
|
||||
"value": "httpd"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "fstab",
|
||||
"options": [
|
||||
{
|
||||
"name": "exec",
|
||||
"type": "option",
|
||||
"value": "/sbin/block mount"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "qos",
|
||||
"options": [
|
||||
{
|
||||
"name": "init",
|
||||
"type": "option",
|
||||
"value": "qos"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "system",
|
||||
"options": [
|
||||
{
|
||||
"name": "init",
|
||||
"type": "option",
|
||||
"value": "led"
|
||||
},
|
||||
{
|
||||
"name": "exec",
|
||||
"type": "option",
|
||||
"value": "/etc/init.d/log reload"
|
||||
},
|
||||
{
|
||||
"name": "affects",
|
||||
"type": "list",
|
||||
"value": "luci_statistics"
|
||||
},
|
||||
{
|
||||
"name": "affects",
|
||||
"type": "list",
|
||||
"value": "dhcp"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "luci_splash",
|
||||
"options": [
|
||||
{
|
||||
"name": "init",
|
||||
"type": "option",
|
||||
"value": "luci_splash"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "upnpd",
|
||||
"options": [
|
||||
{
|
||||
"name": "init",
|
||||
"type": "option",
|
||||
"value": "miniupnpd"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "ntpclient",
|
||||
"options": [
|
||||
{
|
||||
"name": "init",
|
||||
"type": "option",
|
||||
"value": "ntpclient"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "samba",
|
||||
"options": [
|
||||
{
|
||||
"name": "init",
|
||||
"type": "option",
|
||||
"value": "samba"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "tinyproxy",
|
||||
"options": [
|
||||
{
|
||||
"name": "init",
|
||||
"type": "option",
|
||||
"value": "tinyproxy"
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"name": "ucitrack"
|
||||
},
|
||||
{
|
||||
"configs": [
|
||||
{
|
||||
"name": "uhttpd",
|
||||
"options": [
|
||||
{
|
||||
"name": "listen_http",
|
||||
"type": "list",
|
||||
"value": "0.0.0.0:8080"
|
||||
},
|
||||
{
|
||||
"name": "listen_http",
|
||||
"type": "list",
|
||||
"value": "[::]:8080"
|
||||
},
|
||||
{
|
||||
"name": "listen_https",
|
||||
"type": "list",
|
||||
"value": "0.0.0.0:8443"
|
||||
},
|
||||
{
|
||||
"name": "listen_https",
|
||||
"type": "list",
|
||||
"value": "[::]:8443"
|
||||
},
|
||||
{
|
||||
"name": "redirect_https",
|
||||
"type": "option",
|
||||
"value": "0"
|
||||
},
|
||||
{
|
||||
"name": "home",
|
||||
"type": "option",
|
||||
"value": "/www"
|
||||
},
|
||||
{
|
||||
"name": "rfc1918_filter",
|
||||
"type": "option",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "max_requests",
|
||||
"type": "option",
|
||||
"value": "3"
|
||||
},
|
||||
{
|
||||
"name": "max_connections",
|
||||
"type": "option",
|
||||
"value": "100"
|
||||
},
|
||||
{
|
||||
"name": "cert",
|
||||
"type": "option",
|
||||
"value": "/etc/uhttpd.crt"
|
||||
},
|
||||
{
|
||||
"name": "key",
|
||||
"type": "option",
|
||||
"value": "/etc/uhttpd.key"
|
||||
},
|
||||
{
|
||||
"name": "cgi_prefix",
|
||||
"type": "option",
|
||||
"value": "/cgi-bin"
|
||||
},
|
||||
{
|
||||
"name": "lua_prefix",
|
||||
"type": "list",
|
||||
"value": "/cgi-bin/luci=/usr/lib/lua/luci/sgi/uhttpd.lua"
|
||||
},
|
||||
{
|
||||
"name": "script_timeout",
|
||||
"type": "option",
|
||||
"value": "60"
|
||||
},
|
||||
{
|
||||
"name": "network_timeout",
|
||||
"type": "option",
|
||||
"value": "30"
|
||||
},
|
||||
{
|
||||
"name": "http_keepalive",
|
||||
"type": "option",
|
||||
"value": "20"
|
||||
},
|
||||
{
|
||||
"name": "tcp_keepalive",
|
||||
"type": "option",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "ubus_prefix",
|
||||
"type": "option",
|
||||
"value": "/ubus"
|
||||
}
|
||||
],
|
||||
"section": "main"
|
||||
},
|
||||
{
|
||||
"name": "cert",
|
||||
"options": [
|
||||
{
|
||||
"name": "days",
|
||||
"type": "option",
|
||||
"value": "730"
|
||||
},
|
||||
{
|
||||
"name": "key_type",
|
||||
"type": "option",
|
||||
"value": "ec"
|
||||
},
|
||||
{
|
||||
"name": "bits",
|
||||
"type": "option",
|
||||
"value": "2048"
|
||||
},
|
||||
{
|
||||
"name": "ec_curve",
|
||||
"type": "option",
|
||||
"value": "P-256"
|
||||
},
|
||||
{
|
||||
"name": "country",
|
||||
"type": "option",
|
||||
"value": "ZZ"
|
||||
},
|
||||
{
|
||||
"name": "state",
|
||||
"type": "option",
|
||||
"value": "Somewhere"
|
||||
},
|
||||
{
|
||||
"name": "location",
|
||||
"type": "option",
|
||||
"value": "Unknown"
|
||||
},
|
||||
{
|
||||
"name": "commonname",
|
||||
"type": "option",
|
||||
"value": "OpenWrt"
|
||||
}
|
||||
],
|
||||
"section": "defaults"
|
||||
}
|
||||
],
|
||||
"name": "uhttpd"
|
||||
},
|
||||
{
|
||||
"configs": [
|
||||
{
|
||||
"name": "wifi-device",
|
||||
"options": [
|
||||
{
|
||||
"name": "type",
|
||||
"type": "option",
|
||||
"value": "mac80211"
|
||||
},
|
||||
{
|
||||
"name": "path",
|
||||
"type": "option",
|
||||
"value": "platform/soc/3f300000.mmcnr/mmc_host/mmc1/mmc1:0001/mmc1:0001:1"
|
||||
},
|
||||
{
|
||||
"name": "channel",
|
||||
"type": "option",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "band",
|
||||
"type": "option",
|
||||
"value": "2g"
|
||||
},
|
||||
{
|
||||
"name": "htmode",
|
||||
"type": "option",
|
||||
"value": "HT20"
|
||||
},
|
||||
{
|
||||
"name": "cell_density",
|
||||
"type": "option",
|
||||
"value": "0"
|
||||
}
|
||||
],
|
||||
"section": "radio0"
|
||||
},
|
||||
{
|
||||
"name": "wifi-iface",
|
||||
"options": [
|
||||
{
|
||||
"name": "device",
|
||||
"type": "option",
|
||||
"value": "radio0"
|
||||
},
|
||||
{
|
||||
"name": "mode",
|
||||
"type": "option",
|
||||
"value": "ap"
|
||||
},
|
||||
{
|
||||
"name": "ssid",
|
||||
"type": "option",
|
||||
"value": "Arcad - Connect and Play"
|
||||
},
|
||||
{
|
||||
"name": "encryption",
|
||||
"type": "option",
|
||||
"value": "none"
|
||||
},
|
||||
{
|
||||
"name": "network",
|
||||
"type": "option",
|
||||
"value": "guest"
|
||||
}
|
||||
],
|
||||
"section": "default_radio0"
|
||||
}
|
||||
],
|
||||
"name": "wireless"
|
||||
}
|
||||
]
|
||||
},
|
||||
"postImportCommands": [
|
||||
{
|
||||
"args": [],
|
||||
"command": "reload_config"
|
||||
}
|
||||
]
|
||||
}
|
Reference in New Issue
Block a user