diff --git a/go.mod b/go.mod deleted file mode 100644 index 29a413a..0000000 --- a/go.mod +++ /dev/null @@ -1,39 +0,0 @@ -module nfsense.net/nfsense - -go 1.21 - -toolchain go1.21.2 - -require ( - github.com/coreos/go-systemd/v22 v22.5.0 - github.com/godbus/dbus/v5 v5.1.0 - github.com/google/uuid v1.3.1 - github.com/pterm/pterm v0.12.69 - github.com/r3labs/diff/v3 v3.0.1 - github.com/santhosh-tekuri/jsonschema/v5 v5.3.1 - github.com/tredoe/osutil v1.3.6 - go4.org/netipx v0.0.0-20230824141953-6213f710f925 - golang.org/x/exp v0.0.0-20231006140011-7918f672742d - nhooyr.io/websocket v1.8.7 -) - -require ( - atomicgo.dev/cursor v0.2.0 // indirect - atomicgo.dev/keyboard v0.2.9 // indirect - atomicgo.dev/schedule v0.1.0 // indirect - github.com/containerd/console v1.0.3 // indirect - github.com/go-playground/validator/v10 v10.15.5 // indirect - github.com/gookit/color v1.5.4 // indirect - github.com/klauspost/compress v1.17.0 // indirect - github.com/lithammer/fuzzysearch v1.1.8 // indirect - github.com/mattn/go-runewidth v0.0.15 // indirect - github.com/rivo/uniseg v0.4.4 // indirect - github.com/vmihailenco/msgpack/v5 v5.4.0 // indirect - github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect - github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect - golang.org/x/crypto v0.14.0 // indirect - golang.org/x/net v0.16.0 // indirect - golang.org/x/sys v0.13.0 // indirect - golang.org/x/term v0.13.0 // indirect - golang.org/x/text v0.13.0 // indirect -) diff --git a/go.sum b/go.sum deleted file mode 100644 index a4013f9..0000000 --- a/go.sum +++ /dev/null @@ -1,202 +0,0 @@ -atomicgo.dev/assert v0.0.2 h1:FiKeMiZSgRrZsPo9qn/7vmr7mCsh5SZyXY4YGYiYwrg= -atomicgo.dev/assert v0.0.2/go.mod h1:ut4NcI3QDdJtlmAxQULOmA13Gz6e2DWbSAS8RUOmNYQ= -atomicgo.dev/cursor v0.2.0 h1:H6XN5alUJ52FZZUkI7AlJbUc1aW38GWZalpYRPpoPOw= -atomicgo.dev/cursor v0.2.0/go.mod h1:Lr4ZJB3U7DfPPOkbH7/6TOtJ4vFGHlgj1nc+n900IpU= -atomicgo.dev/keyboard v0.2.9 h1:tOsIid3nlPLZ3lwgG8KZMp/SFmr7P0ssEN5JUsm78K8= -atomicgo.dev/keyboard v0.2.9/go.mod h1:BC4w9g00XkxH/f1HXhW2sXmJFOCWbKn9xrOunSFtExQ= -atomicgo.dev/schedule v0.1.0 h1:nTthAbhZS5YZmgYbb2+DH8uQIZcTlIrd4eYr3UQxEjs= -atomicgo.dev/schedule v0.1.0/go.mod h1:xeUa3oAkiuHYh8bKiQBRojqAMq3PXXbJujjb0hw8pEU= -github.com/MarvinJWendt/testza v0.1.0/go.mod h1:7AxNvlfeHP7Z/hDQ5JtE3OKYT3XFUeLCDE2DQninSqs= -github.com/MarvinJWendt/testza v0.2.1/go.mod h1:God7bhG8n6uQxwdScay+gjm9/LnO4D3kkcZX4hv9Rp8= -github.com/MarvinJWendt/testza v0.2.8/go.mod h1:nwIcjmr0Zz+Rcwfh3/4UhBp7ePKVhuBExvZqnKYWlII= -github.com/MarvinJWendt/testza v0.2.10/go.mod h1:pd+VWsoGUiFtq+hRKSU1Bktnn+DMCSrDrXDpX2bG66k= -github.com/MarvinJWendt/testza v0.2.12/go.mod h1:JOIegYyV7rX+7VZ9r77L/eH6CfJHHzXjB69adAhzZkI= -github.com/MarvinJWendt/testza v0.3.0/go.mod h1:eFcL4I0idjtIx8P9C6KkAuLgATNKpX4/2oUqKc6bF2c= -github.com/MarvinJWendt/testza v0.4.2/go.mod h1:mSdhXiKH8sg/gQehJ63bINcCKp7RtYewEjXsvsVUPbE= -github.com/MarvinJWendt/testza v0.5.2 h1:53KDo64C1z/h/d/stCYCPY69bt/OSwjq5KpFNwi+zB4= -github.com/MarvinJWendt/testza v0.5.2/go.mod h1:xu53QFE5sCdjtMCKk8YMQ2MnymimEctc4n3EjyIYvEY= -github.com/atomicgo/cursor v0.0.1/go.mod h1:cBON2QmmrysudxNBFthvMtN32r3jxVRIvzkUiF/RuIk= -github.com/containerd/console v1.0.3 h1:lIr7SlA5PxZyMV30bDW0MGbiOPXwc63yRuCP0ARubLw= -github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U= -github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs= -github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/gabriel-vasile/mimetype v1.4.2 h1:w5qFW6JKBz9Y393Y4q372O9A7cUSequkh1Q7OhCmWKU= -github.com/gabriel-vasile/mimetype v1.4.2/go.mod h1:zApsH/mKG4w07erKIaJPFiX0Tsq9BFQgN3qGY5GnNgA= -github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= -github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= -github.com/gin-gonic/gin v1.6.3 h1:ahKqKTFpO5KTPHxWZjEdPScmYaGtLo8Y4DMHoEsnp14= -github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M= -github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= -github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= -github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= -github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= -github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= -github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= -github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= -github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= -github.com/go-playground/validator/v10 v10.15.5 h1:LEBecTWb/1j5TNY1YYG2RcOUN3R7NLylN+x8TTueE24= -github.com/go-playground/validator/v10 v10.15.5/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU= -github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee h1:s+21KNqlpePfkah2I+gwHF8xmJWRjooY+5248k6m4A0= -github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= -github.com/gobwas/pool v0.2.0 h1:QEmUOlnSjWtnpRGHF3SauEiOsy82Cup83Vf2LcMlnc8= -github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= -github.com/gobwas/ws v1.0.2 h1:CoAavW/wd/kulfZmSIBt6p24n4j7tHgNVCjsfHVNUbo= -github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= -github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk= -github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.5 h1:F768QJ1E9tib+q5Sc8MkdJi1RxLTbRcTf8LJV56aRls= -github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= -github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/uuid v1.3.1 h1:KjJaJ9iWZ3jOFZIf1Lqf4laDRCasjl0BCmnEGxkdLb4= -github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/gookit/color v1.4.2/go.mod h1:fqRyamkC1W8uxl+lxCQxOT09l/vYfZ+QeiX3rKQHCoQ= -github.com/gookit/color v1.5.0/go.mod h1:43aQb+Zerm/BWh2GnrgOQm7ffz7tvQXEKV6BFMl7wAo= -github.com/gookit/color v1.5.4 h1:FZmqs7XOyGgCAxmWyPslpiok1k05wmY3SJTytgvYFs0= -github.com/gookit/color v1.5.4/go.mod h1:pZJOeOS8DM43rXbp4AZo1n9zCU2qjpcRko0b6/QJi9w= -github.com/gorilla/websocket v1.4.1 h1:q7AeDBpnBk8AogcD4DSag/Ukw/KV+YhzLj2bP5HvKCM= -github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/json-iterator/go v1.1.9 h1:9yzud/Ht36ygwatGx56VwCZtlI/2AD15T1X2sjSuGns= -github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= -github.com/klauspost/compress v1.17.0 h1:Rnbp4K9EjcDuVuHtd0dgA4qNuv9yKDYKK1ulpJwgrqM= -github.com/klauspost/compress v1.17.0/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= -github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/klauspost/cpuid/v2 v2.0.10/go.mod h1:g2LTdtYhdyuGPqyWyv7qRAmj1WBqxuObKfj5c0PQa7c= -github.com/klauspost/cpuid/v2 v2.0.12/go.mod h1:g2LTdtYhdyuGPqyWyv7qRAmj1WBqxuObKfj5c0PQa7c= -github.com/klauspost/cpuid/v2 v2.2.3 h1:sxCkb+qR91z4vsqw4vGGZlDgPz3G7gjaLyK3V8y70BU= -github.com/klauspost/cpuid/v2 v2.2.3/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= -github.com/leodido/go-urn v1.2.4 h1:XlAE/cm/ms7TE/VMVoduSpNBoyc2dOxHs5MZSwAN63Q= -github.com/leodido/go-urn v1.2.4/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4= -github.com/lithammer/fuzzysearch v1.1.8 h1:/HIuJnjHuXS8bKaiTMeeDlW2/AyIWk2brx1V8LFgLN4= -github.com/lithammer/fuzzysearch v1.1.8/go.mod h1:IdqeyBClc3FFqSzYq/MXESsS4S0FsZ5ajtkr5xPLts4= -github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= -github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= -github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U= -github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= -github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc= -github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742 h1:Esafd1046DLDQ0W1YjYsBW+p8U2u7vzgW2SQVmlNazg= -github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/pterm/pterm v0.12.27/go.mod h1:PhQ89w4i95rhgE+xedAoqous6K9X+r6aSOI2eFF7DZI= -github.com/pterm/pterm v0.12.29/go.mod h1:WI3qxgvoQFFGKGjGnJR849gU0TsEOvKn5Q8LlY1U7lg= -github.com/pterm/pterm v0.12.30/go.mod h1:MOqLIyMOgmTDz9yorcYbcw+HsgoZo3BQfg2wtl3HEFE= -github.com/pterm/pterm v0.12.31/go.mod h1:32ZAWZVXD7ZfG0s8qqHXePte42kdz8ECtRyEejaWgXU= -github.com/pterm/pterm v0.12.33/go.mod h1:x+h2uL+n7CP/rel9+bImHD5lF3nM9vJj80k9ybiiTTE= -github.com/pterm/pterm v0.12.36/go.mod h1:NjiL09hFhT/vWjQHSj1athJpx6H8cjpHXNAK5bUw8T8= -github.com/pterm/pterm v0.12.40/go.mod h1:ffwPLwlbXxP+rxT0GsgDTzS3y3rmpAO1NMjUkGTYf8s= -github.com/pterm/pterm v0.12.69 h1:fBCKnB8dSLAl8FlYRQAWYGp2WTI/Xm/tKJ21Hyo9USw= -github.com/pterm/pterm v0.12.69/go.mod h1:wl06ko9MHnqxz4oDV++IORDpjCzw6+mfrvf0MPj6fdk= -github.com/r3labs/diff/v3 v3.0.1 h1:CBKqf3XmNRHXKmdU7mZP1w7TV0pDyVCis1AUHtA4Xtg= -github.com/r3labs/diff/v3 v3.0.1/go.mod h1:f1S9bourRbiM66NskseyUdo0fTmEE0qKrikYJX63dgo= -github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= -github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis= -github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= -github.com/santhosh-tekuri/jsonschema/v5 v5.3.1 h1:lZUw3E0/J3roVtGQ+SCrUrg3ON6NgVqpn3+iol9aGu4= -github.com/santhosh-tekuri/jsonschema/v5 v5.3.1/go.mod h1:uToXkOrWAZ6/Oc07xWQrPOhJotwFIyu2bBVN41fcDUY= -github.com/sergi/go-diff v1.2.0 h1:XU+rvMAioB0UC3q1MFrIQy4Vo5/4VsRDQQXHsEya6xQ= -github.com/sergi/go-diff v1.2.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= -github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/tredoe/fileutil v1.0.5/go.mod h1:HFzzpvg+3Q8LgmZgo1mVF5epHc/CVkWKEb3hja+/1Zo= -github.com/tredoe/goutil v1.0.0/go.mod h1:Qhf75QLcNEChimbl4wb8nROzw9PCFCPYTEUmTnoszXY= -github.com/tredoe/osutil v1.3.6 h1:VrweDEuUWOYU/lskw8HqsGRt4fOdbdp6td5vjgVzrj8= -github.com/tredoe/osutil v1.3.6/go.mod h1:panccMiyCdP8g45yxJ7DcxdMTZfPqHGGceuou2MNvHo= -github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo= -github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= -github.com/ugorji/go/codec v1.1.7 h1:2SvQaVZ1ouYrrKKwoSk2pzd4A9evlKJb9oTL+OaLUSs= -github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= -github.com/vmihailenco/msgpack/v5 v5.3.5/go.mod h1:7xyJ9e+0+9SaZT0Wt1RGleJXzli6Q/V5KbhBonMG9jc= -github.com/vmihailenco/msgpack/v5 v5.4.0 h1:hRM0digJwyR6vll33NNAwCFguy5JuBD6jxDmQP3l608= -github.com/vmihailenco/msgpack/v5 v5.4.0/go.mod h1:GaZTsDaehaPpQVyxrf5mtQlH+pc21PIudVV/E3rRQok= -github.com/vmihailenco/tagparser/v2 v2.0.0 h1:y09buUbR+b5aycVFQs/g70pqKVZNBmxwAhO7/IwNM9g= -github.com/vmihailenco/tagparser/v2 v2.0.0/go.mod h1:Wri+At7QHww0WTrCBeu4J6bNtoV6mEfg5OIWRZA9qds= -github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778/go.mod h1:2MuV+tbUrU1zIOPMxZ5EncGwgmMJsa+9ucAQZXxsObs= -github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e h1:JVG44RsyaB9T2KIHavMF/ppJZNG9ZpyihvCd0w101no= -github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e/go.mod h1:RbqR21r5mrJuqunuUZ/Dhy/avygyECGrLceyNeo4LiM= -github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -go4.org/netipx v0.0.0-20230824141953-6213f710f925 h1:eeQDDVKFkx0g4Hyy8pHgmZaK0EqB4SD6rvKbUdN3ziQ= -go4.org/netipx v0.0.0-20230824141953-6213f710f925/go.mod h1:PLyyIXexvUFg3Owu6p/WfdlivPbZJsZdgWZlrGope/Y= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= -golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= -golang.org/x/exp v0.0.0-20231006140011-7918f672742d h1:jtJma62tbqLibJ5sFQz8bKtEM8rJBtfilJ2qTU199MI= -golang.org/x/exp v0.0.0-20231006140011-7918f672742d/go.mod h1:ldy0pHrwJyGW56pPQzzkH36rKxoZW1tw7ZJpeKx+hdo= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.16.0 h1:7eBu7KsSvFDtSXUIDbh3aqlK4DPsZ1rByC8PFfBThos= -golang.org/x/net v0.16.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211013075003-97ac67df715c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220319134239-a9b59b0215f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= -golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/term v0.13.0 h1:bb+I9cTfFazGW51MZqBVmZy7+JEJMouUHTUSKVQLBek= -golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= -golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= -golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= -gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -nhooyr.io/websocket v1.8.7 h1:usjR2uOr/zjjkVMy0lW+PPohFok7PCow5sDjLgX4P4g= -nhooyr.io/websocket v1.8.7/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= diff --git a/internal/api/config/config.go b/internal/api/config/config.go deleted file mode 100644 index 8e7e6d2..0000000 --- a/internal/api/config/config.go +++ /dev/null @@ -1,7 +0,0 @@ -package config - -import "nfsense.net/nfsense/internal/config" - -type Config struct { - ConfigManager *config.ConfigManager -} diff --git a/internal/api/config/pending.go b/internal/api/config/pending.go deleted file mode 100644 index db437e3..0000000 --- a/internal/api/config/pending.go +++ /dev/null @@ -1,40 +0,0 @@ -package config - -import ( - "context" - "fmt" - - "github.com/r3labs/diff/v3" -) - -type GetPendingStatusResult struct { - Changed bool -} - -func (c *Config) GetPendingStatus(ctx context.Context, params struct{}) (GetPendingStatusResult, error) { - return GetPendingStatusResult{ - Changed: c.ConfigManager.AreChangesPending(), - }, nil -} - -type GetPendingChangelogResult struct { - Changelog diff.Changelog -} - -func (c *Config) GetPendingChangelog(ctx context.Context, params struct{}) (GetPendingChangelogResult, error) { - log, err := c.ConfigManager.GetPendingChangelog() - if err != nil { - return GetPendingChangelogResult{}, fmt.Errorf("Get Pending changelog %w", err) - } - return GetPendingChangelogResult{ - Changelog: log, - }, nil -} - -func (c *Config) ApplyPendingChanges(ctx context.Context, params struct{}) (struct{}, error) { - return struct{}{}, c.ConfigManager.ApplyPendingChanges() -} - -func (c *Config) DiscardPendingChanges(ctx context.Context, params struct{}) (struct{}, error) { - return struct{}{}, c.ConfigManager.DiscardPendingConfig() -} diff --git a/internal/api/firewall/destination_nat_rules.go b/internal/api/firewall/destination_nat_rules.go deleted file mode 100644 index 2222fe8..0000000 --- a/internal/api/firewall/destination_nat_rules.go +++ /dev/null @@ -1,104 +0,0 @@ -package firewall - -import ( - "context" - "fmt" - - "nfsense.net/nfsense/internal/definitions/firewall" -) - -type GetDestinationNATRuleParameters struct { - ID uint -} - -type GetDestinationNATRuleResult struct { - firewall.DestinationNATRule -} - -func (f *Firewall) GetDestinationNATRule(ctx context.Context, params GetDestinationNATRuleParameters) (GetDestinationNATRuleResult, error) { - if int(params.ID) >= len(f.ConfigManager.GetPendingConfig().Firewall.DestinationNATRules) { - return GetDestinationNATRuleResult{}, fmt.Errorf("DestinationNATRule does not Exist") - } - - return GetDestinationNATRuleResult{ - DestinationNATRule: f.ConfigManager.GetPendingConfig().Firewall.DestinationNATRules[params.ID], - }, nil -} - -type GetDestinationNATRulesResult struct { - DestinationNATRules []firewall.DestinationNATRule `json:"destination_nat_rules"` -} - -func (f *Firewall) GetDestinationNATRules(ctx context.Context, params struct{}) (GetDestinationNATRulesResult, error) { - return GetDestinationNATRulesResult{ - DestinationNATRules: f.ConfigManager.GetPendingConfig().Firewall.DestinationNATRules, - }, nil -} - -type CreateDestinationNATRuleParameters struct { - firewall.DestinationNATRule -} - -func (f *Firewall) CreateDestinationNATRule(ctx context.Context, params CreateDestinationNATRuleParameters) (struct{}, error) { - t, conf := f.ConfigManager.StartTransaction() - defer t.Discard() - - conf.Firewall.DestinationNATRules = append(conf.Firewall.DestinationNATRules, params.DestinationNATRule) - return struct{}{}, t.Commit() -} - -type UpdateDestinationNATRuleParameters struct { - Index uint64 `json:"index"` - firewall.DestinationNATRule -} - -func (f *Firewall) UpdateDestinationNATRule(ctx context.Context, params UpdateDestinationNATRuleParameters) (struct{}, error) { - if int(params.Index) >= len(f.ConfigManager.GetPendingConfig().Firewall.DestinationNATRules) { - return struct{}{}, fmt.Errorf("DestinationNATRule does not Exist") - } - - t, conf := f.ConfigManager.StartTransaction() - defer t.Discard() - - conf.Firewall.DestinationNATRules[params.Index] = params.DestinationNATRule - return struct{}{}, t.Commit() -} - -type MoveDestinationNATRuleParameters struct { - Index uint64 `json:"index"` - ToIndex uint64 `json:"to_index"` -} - -func (f *Firewall) MoveDestinationNATRule(ctx context.Context, params MoveDestinationNATRuleParameters) (struct{}, error) { - if int(params.Index) >= len(f.ConfigManager.GetPendingConfig().Firewall.DestinationNATRules) { - return struct{}{}, fmt.Errorf("DestinationNATRule does not Exist") - } - - t, conf := f.ConfigManager.StartTransaction() - defer t.Discard() - - rule := conf.Firewall.DestinationNATRules[params.Index] - sliceWithoutRule := append(conf.Firewall.DestinationNATRules[:params.Index], conf.Firewall.DestinationNATRules[params.Index+1:]...) - newSlice := make([]firewall.DestinationNATRule, params.ToIndex+1) - copy(newSlice, sliceWithoutRule[:params.ToIndex]) - newSlice[params.ToIndex] = rule - conf.Firewall.DestinationNATRules = append(newSlice, sliceWithoutRule[params.ToIndex:]...) - - return struct{}{}, t.Commit() -} - -type DeleteDestinationNATRuleParameters struct { - Index uint64 `json:"index"` -} - -func (f *Firewall) DeleteDestinationNATRule(ctx context.Context, params DeleteDestinationNATRuleParameters) (struct{}, error) { - if int(params.Index) >= len(f.ConfigManager.GetPendingConfig().Firewall.DestinationNATRules) { - return struct{}{}, fmt.Errorf("DestinationNATRule does not Exist") - } - - t, conf := f.ConfigManager.StartTransaction() - defer t.Discard() - - conf.Firewall.DestinationNATRules = append(conf.Firewall.DestinationNATRules[:params.Index], conf.Firewall.DestinationNATRules[params.Index+1:]...) - return struct{}{}, t.Commit() -} diff --git a/internal/api/firewall/firewall.go b/internal/api/firewall/firewall.go deleted file mode 100644 index 1bde05c..0000000 --- a/internal/api/firewall/firewall.go +++ /dev/null @@ -1,9 +0,0 @@ -package firewall - -import ( - "nfsense.net/nfsense/internal/config" -) - -type Firewall struct { - ConfigManager *config.ConfigManager -} diff --git a/internal/api/firewall/forward_rules.go b/internal/api/firewall/forward_rules.go deleted file mode 100644 index cd2d0a1..0000000 --- a/internal/api/firewall/forward_rules.go +++ /dev/null @@ -1,104 +0,0 @@ -package firewall - -import ( - "context" - "fmt" - - "nfsense.net/nfsense/internal/definitions/firewall" -) - -type GetForwardRuleParameters struct { - ID uint -} - -type GetForwardRuleResult struct { - firewall.ForwardRule -} - -func (f *Firewall) GetForwardRule(ctx context.Context, params GetForwardRuleParameters) (GetForwardRuleResult, error) { - if int(params.ID) >= len(f.ConfigManager.GetPendingConfig().Firewall.ForwardRules) { - return GetForwardRuleResult{}, fmt.Errorf("ForwardRule does not Exist") - } - - return GetForwardRuleResult{ - ForwardRule: f.ConfigManager.GetPendingConfig().Firewall.ForwardRules[params.ID], - }, nil -} - -type GetForwardRulesResult struct { - ForwardRules []firewall.ForwardRule `json:"forward_rules"` -} - -func (f *Firewall) GetForwardRules(ctx context.Context, params struct{}) (GetForwardRulesResult, error) { - return GetForwardRulesResult{ - ForwardRules: f.ConfigManager.GetPendingConfig().Firewall.ForwardRules, - }, nil -} - -type CreateForwardRuleParameters struct { - firewall.ForwardRule -} - -func (f *Firewall) CreateForwardRule(ctx context.Context, params CreateForwardRuleParameters) (struct{}, error) { - t, conf := f.ConfigManager.StartTransaction() - defer t.Discard() - - conf.Firewall.ForwardRules = append(conf.Firewall.ForwardRules, params.ForwardRule) - return struct{}{}, t.Commit() -} - -type UpdateForwardRuleParameters struct { - Index uint64 `json:"index"` - firewall.ForwardRule -} - -func (f *Firewall) UpdateForwardRule(ctx context.Context, params UpdateForwardRuleParameters) (struct{}, error) { - if int(params.Index) >= len(f.ConfigManager.GetPendingConfig().Firewall.ForwardRules) { - return struct{}{}, fmt.Errorf("ForwardRule does not Exist") - } - - t, conf := f.ConfigManager.StartTransaction() - defer t.Discard() - - conf.Firewall.ForwardRules[params.Index] = params.ForwardRule - return struct{}{}, t.Commit() -} - -type MoveForwardRuleParameters struct { - Index uint64 `json:"index"` - ToIndex uint64 `json:"to_index"` -} - -func (f *Firewall) MoveForwardRule(ctx context.Context, params MoveForwardRuleParameters) (struct{}, error) { - if int(params.Index) >= len(f.ConfigManager.GetPendingConfig().Firewall.ForwardRules) { - return struct{}{}, fmt.Errorf("ForwardRule does not Exist") - } - - t, conf := f.ConfigManager.StartTransaction() - defer t.Discard() - - rule := conf.Firewall.ForwardRules[params.Index] - sliceWithoutRule := append(conf.Firewall.ForwardRules[:params.Index], conf.Firewall.ForwardRules[params.Index+1:]...) - newSlice := make([]firewall.ForwardRule, params.ToIndex+1) - copy(newSlice, sliceWithoutRule[:params.ToIndex]) - newSlice[params.ToIndex] = rule - conf.Firewall.ForwardRules = append(newSlice, sliceWithoutRule[params.ToIndex:]...) - - return struct{}{}, t.Commit() -} - -type DeleteForwardRuleParameters struct { - Index uint64 `json:"index"` -} - -func (f *Firewall) DeleteForwardRule(ctx context.Context, params DeleteForwardRuleParameters) (struct{}, error) { - if int(params.Index) >= len(f.ConfigManager.GetPendingConfig().Firewall.ForwardRules) { - return struct{}{}, fmt.Errorf("ForwardRule does not Exist") - } - - t, conf := f.ConfigManager.StartTransaction() - defer t.Discard() - - conf.Firewall.ForwardRules = append(conf.Firewall.ForwardRules[:params.Index], conf.Firewall.ForwardRules[params.Index+1:]...) - return struct{}{}, t.Commit() -} diff --git a/internal/api/firewall/source_nat_rules.go b/internal/api/firewall/source_nat_rules.go deleted file mode 100644 index 3c687a0..0000000 --- a/internal/api/firewall/source_nat_rules.go +++ /dev/null @@ -1,104 +0,0 @@ -package firewall - -import ( - "context" - "fmt" - - "nfsense.net/nfsense/internal/definitions/firewall" -) - -type GetSourceNATRuleParameters struct { - ID uint -} - -type GetSourceNATRuleResult struct { - firewall.SourceNATRule -} - -func (f *Firewall) GetSourceNATRule(ctx context.Context, params GetSourceNATRuleParameters) (GetSourceNATRuleResult, error) { - if int(params.ID) >= len(f.ConfigManager.GetPendingConfig().Firewall.SourceNATRules) { - return GetSourceNATRuleResult{}, fmt.Errorf("SourceNATRule does not Exist") - } - - return GetSourceNATRuleResult{ - SourceNATRule: f.ConfigManager.GetPendingConfig().Firewall.SourceNATRules[params.ID], - }, nil -} - -type GetSourceNATRulesResult struct { - SourceNATRules []firewall.SourceNATRule `json:"source_nat_rules"` -} - -func (f *Firewall) GetSourceNATRules(ctx context.Context, params struct{}) (GetSourceNATRulesResult, error) { - return GetSourceNATRulesResult{ - SourceNATRules: f.ConfigManager.GetPendingConfig().Firewall.SourceNATRules, - }, nil -} - -type CreateSourceNATRuleParameters struct { - firewall.SourceNATRule -} - -func (f *Firewall) CreateSourceNATRule(ctx context.Context, params CreateSourceNATRuleParameters) (struct{}, error) { - t, conf := f.ConfigManager.StartTransaction() - defer t.Discard() - - conf.Firewall.SourceNATRules = append(conf.Firewall.SourceNATRules, params.SourceNATRule) - return struct{}{}, t.Commit() -} - -type UpdateSourceNATRuleParameters struct { - Index uint64 `json:"index"` - firewall.SourceNATRule -} - -func (f *Firewall) UpdateSourceNATRule(ctx context.Context, params UpdateSourceNATRuleParameters) (struct{}, error) { - if int(params.Index) >= len(f.ConfigManager.GetPendingConfig().Firewall.SourceNATRules) { - return struct{}{}, fmt.Errorf("SourceNATRule does not Exist") - } - - t, conf := f.ConfigManager.StartTransaction() - defer t.Discard() - - conf.Firewall.SourceNATRules[params.Index] = params.SourceNATRule - return struct{}{}, t.Commit() -} - -type MoveSourceNATRuleParameters struct { - Index uint64 `json:"index"` - ToIndex uint64 `json:"to_index"` -} - -func (f *Firewall) MoveSourceNATRule(ctx context.Context, params MoveSourceNATRuleParameters) (struct{}, error) { - if int(params.Index) >= len(f.ConfigManager.GetPendingConfig().Firewall.SourceNATRules) { - return struct{}{}, fmt.Errorf("SourceNATRule does not Exist") - } - - t, conf := f.ConfigManager.StartTransaction() - defer t.Discard() - - rule := conf.Firewall.SourceNATRules[params.Index] - sliceWithoutRule := append(conf.Firewall.SourceNATRules[:params.Index], conf.Firewall.SourceNATRules[params.Index+1:]...) - newSlice := make([]firewall.SourceNATRule, params.ToIndex+1) - copy(newSlice, sliceWithoutRule[:params.ToIndex]) - newSlice[params.ToIndex] = rule - conf.Firewall.SourceNATRules = append(newSlice, sliceWithoutRule[params.ToIndex:]...) - - return struct{}{}, t.Commit() -} - -type DeleteSourceNATRuleParameters struct { - Index uint64 `json:"index"` -} - -func (f *Firewall) DeleteSourceNATRule(ctx context.Context, params DeleteSourceNATRuleParameters) (struct{}, error) { - if int(params.Index) >= len(f.ConfigManager.GetPendingConfig().Firewall.SourceNATRules) { - return struct{}{}, fmt.Errorf("SourceNATRule does not Exist") - } - - t, conf := f.ConfigManager.StartTransaction() - defer t.Discard() - - conf.Firewall.SourceNATRules = append(conf.Firewall.SourceNATRules[:params.Index], conf.Firewall.SourceNATRules[params.Index+1:]...) - return struct{}{}, t.Commit() -} diff --git a/internal/api/network/interfaces.go b/internal/api/network/interfaces.go deleted file mode 100644 index 5b32f39..0000000 --- a/internal/api/network/interfaces.go +++ /dev/null @@ -1,107 +0,0 @@ -package network - -import ( - "context" - "fmt" - - "nfsense.net/nfsense/internal/definitions/network" - "nfsense.net/nfsense/internal/networkd/dbus" -) - -type GetLinksResult struct { - Links []dbus.Link -} - -func (f *Network) GetLinks(ctx context.Context, params struct{}) (GetLinksResult, error) { - links, err := dbus.GetLinks(*f.DbusConn) - if err != nil { - return GetLinksResult{}, fmt.Errorf("Getting Links: %w", err) - } - return GetLinksResult{ - Links: links, - }, nil -} - -type GetInterfaceParameters struct { - ID string -} - -type GetInterfaceResult struct { - Name string `json:"name"` - network.Interface -} - -func (f *Network) GetInterface(ctx context.Context, params GetInterfaceParameters) (GetInterfaceResult, error) { - _, ok := f.ConfigManager.GetPendingConfig().Network.Interfaces[params.ID] - if !ok { - return GetInterfaceResult{}, fmt.Errorf("Interface does not Exist") - } - - return GetInterfaceResult{ - Name: params.ID, - Interface: f.ConfigManager.GetPendingConfig().Network.Interfaces[params.ID], - }, nil -} - -type GetInterfacesResult struct { - Interfaces map[string]network.Interface -} - -func (f *Network) GetInterfaces(ctx context.Context, params struct{}) (GetInterfacesResult, error) { - return GetInterfacesResult{ - Interfaces: f.ConfigManager.GetPendingConfig().Network.Interfaces, - }, nil -} - -type CreateInterfaceParameters struct { - Name string `json:"name"` - network.Interface -} - -func (f *Network) CreateInterface(ctx context.Context, params CreateInterfaceParameters) (struct{}, error) { - _, ok := f.ConfigManager.GetPendingConfig().Network.Interfaces[params.Name] - if ok { - return struct{}{}, fmt.Errorf("Interface already Exists") - } - - t, conf := f.ConfigManager.StartTransaction() - defer t.Discard() - - conf.Network.Interfaces[params.Name] = params.Interface - return struct{}{}, t.Commit() -} - -type UpdateInterfaceParameters struct { - Name string - network.Interface -} - -func (f *Network) UpdateInterface(ctx context.Context, params UpdateInterfaceParameters) (struct{}, error) { - _, ok := f.ConfigManager.GetPendingConfig().Network.Interfaces[params.Name] - if !ok { - return struct{}{}, fmt.Errorf("Interface does not Exist") - } - - t, conf := f.ConfigManager.StartTransaction() - defer t.Discard() - - conf.Network.Interfaces[params.Name] = params.Interface - return struct{}{}, t.Commit() -} - -type DeleteInterfaceParameters struct { - Name string -} - -func (f *Network) DeleteInterface(ctx context.Context, params DeleteInterfaceParameters) (struct{}, error) { - _, ok := f.ConfigManager.GetPendingConfig().Network.Interfaces[params.Name] - if !ok { - return struct{}{}, fmt.Errorf("Interface does not Exist") - } - - t, conf := f.ConfigManager.StartTransaction() - defer t.Discard() - - delete(conf.Network.Interfaces, params.Name) - return struct{}{}, t.Commit() -} diff --git a/internal/api/network/network.go b/internal/api/network/network.go deleted file mode 100644 index 4811b49..0000000 --- a/internal/api/network/network.go +++ /dev/null @@ -1,11 +0,0 @@ -package network - -import ( - "github.com/godbus/dbus/v5" - "nfsense.net/nfsense/internal/config" -) - -type Network struct { - ConfigManager *config.ConfigManager - DbusConn *dbus.Conn -} diff --git a/internal/api/network/static_routes.go b/internal/api/network/static_routes.go deleted file mode 100644 index 67e09dc..0000000 --- a/internal/api/network/static_routes.go +++ /dev/null @@ -1,77 +0,0 @@ -package network - -import ( - "context" - "fmt" - - "nfsense.net/nfsense/internal/definitions/network" -) - -type GetStaticRouteParameters struct { - ID uint -} - -type GetStaticRouteResult struct { - network.StaticRoute -} - -func (f *Network) GetStaticRoute(ctx context.Context, params GetStaticRouteParameters) (GetStaticRouteResult, error) { - if int(params.ID) >= len(f.ConfigManager.GetPendingConfig().Network.StaticRoutes) { - return GetStaticRouteResult{}, fmt.Errorf("StaticRoute does not Exist") - } - - return GetStaticRouteResult{ - StaticRoute: f.ConfigManager.GetPendingConfig().Network.StaticRoutes[params.ID], - }, nil -} - -type GetStaticRoutesResult struct { - StaticRoutes []network.StaticRoute -} - -func (f *Network) GetStaticRoutes(ctx context.Context, params struct{}) (GetStaticRoutesResult, error) { - return GetStaticRoutesResult{ - StaticRoutes: f.ConfigManager.GetPendingConfig().Network.StaticRoutes, - }, nil -} - -func (f *Network) CreateStaticRoute(ctx context.Context, params network.StaticRoute) (struct{}, error) { - t, conf := f.ConfigManager.StartTransaction() - defer t.Discard() - - conf.Network.StaticRoutes = append(conf.Network.StaticRoutes, params) - return struct{}{}, t.Commit() -} - -type UpdateStaticRouteParameters struct { - Index uint - network.StaticRoute -} - -func (f *Network) UpdateStaticRoute(ctx context.Context, params UpdateStaticRouteParameters) (struct{}, error) { - if int(params.Index) >= len(f.ConfigManager.GetPendingConfig().Firewall.DestinationNATRules) { - return struct{}{}, fmt.Errorf("StaticRoute does not Exist") - } - - t, conf := f.ConfigManager.StartTransaction() - defer t.Discard() - - conf.Network.StaticRoutes = append(conf.Network.StaticRoutes, params.StaticRoute) - return struct{}{}, t.Commit() -} - -type DeleteStaticRouteParameters struct { - Index uint -} - -func (f *Network) DeleteStaticRoute(ctx context.Context, params DeleteStaticRouteParameters) (struct{}, error) { - if int(params.Index) >= len(f.ConfigManager.GetPendingConfig().Firewall.DestinationNATRules) { - return struct{}{}, fmt.Errorf("StaticRoute does not Exist") - } - - t, conf := f.ConfigManager.StartTransaction() - defer t.Discard() - - conf.Network.StaticRoutes = append(conf.Network.StaticRoutes[:params.Index], conf.Network.StaticRoutes[params.Index+1:]...) - return struct{}{}, t.Commit() -} diff --git a/internal/api/object/addresses.go b/internal/api/object/addresses.go deleted file mode 100644 index 3504259..0000000 --- a/internal/api/object/addresses.go +++ /dev/null @@ -1,92 +0,0 @@ -package object - -import ( - "context" - "fmt" - - "nfsense.net/nfsense/internal/definitions/object" -) - -type GetAddressParameters struct { - ID string -} - -type GetAddressResult struct { - Name string `json:"name"` - object.Address -} - -func (f *Object) GetAddress(ctx context.Context, params GetAddressParameters) (GetAddressResult, error) { - _, ok := f.ConfigManager.GetPendingConfig().Object.Addresses[params.ID] - if !ok { - return GetAddressResult{}, fmt.Errorf("Address does not Exist") - } - - return GetAddressResult{ - Name: params.ID, - Address: f.ConfigManager.GetPendingConfig().Object.Addresses[params.ID], - }, nil -} - -type GetAddressesResult struct { - Addresses map[string]object.Address -} - -func (f *Object) GetAddresses(ctx context.Context, params struct{}) (GetAddressesResult, error) { - return GetAddressesResult{ - Addresses: f.ConfigManager.GetPendingConfig().Object.Addresses, - }, nil -} - -type CreateAddressParameters struct { - Name string - object.Address -} - -func (f *Object) CreateAddress(ctx context.Context, params CreateAddressParameters) (struct{}, error) { - _, ok := f.ConfigManager.GetPendingConfig().Object.Addresses[params.Name] - if ok { - return struct{}{}, fmt.Errorf("Address already Exists") - } - - t, conf := f.ConfigManager.StartTransaction() - defer t.Discard() - - conf.Object.Addresses[params.Name] = params.Address - return struct{}{}, t.Commit() -} - -type UpdateAddressParameters struct { - Name string - object.Address -} - -func (f *Object) UpdateAddress(ctx context.Context, params UpdateAddressParameters) (struct{}, error) { - _, ok := f.ConfigManager.GetPendingConfig().Object.Addresses[params.Name] - if !ok { - return struct{}{}, fmt.Errorf("Address does not Exist") - } - - t, conf := f.ConfigManager.StartTransaction() - defer t.Discard() - - conf.Object.Addresses[params.Name] = params.Address - return struct{}{}, t.Commit() -} - -type DeleteAddressParameters struct { - Name string -} - -func (f *Object) DeleteAddress(ctx context.Context, params DeleteAddressParameters) (struct{}, error) { - _, ok := f.ConfigManager.GetPendingConfig().Object.Addresses[params.Name] - if !ok { - return struct{}{}, fmt.Errorf("Address does not Exist") - } - - t, conf := f.ConfigManager.StartTransaction() - defer t.Discard() - - delete(conf.Object.Addresses, params.Name) - return struct{}{}, t.Commit() -} diff --git a/internal/api/object/object.go b/internal/api/object/object.go deleted file mode 100644 index e34d905..0000000 --- a/internal/api/object/object.go +++ /dev/null @@ -1,7 +0,0 @@ -package object - -import "nfsense.net/nfsense/internal/config" - -type Object struct { - ConfigManager *config.ConfigManager -} diff --git a/internal/api/object/services.go b/internal/api/object/services.go deleted file mode 100644 index 435f1fc..0000000 --- a/internal/api/object/services.go +++ /dev/null @@ -1,92 +0,0 @@ -package object - -import ( - "context" - "fmt" - - "nfsense.net/nfsense/internal/definitions/object" -) - -type GetServiceParameters struct { - ID string -} - -type GetServiceResult struct { - Name string `json:"name"` - object.Service -} - -func (f *Object) GetService(ctx context.Context, params GetServiceParameters) (GetServiceResult, error) { - _, ok := f.ConfigManager.GetPendingConfig().Object.Services[params.ID] - if !ok { - return GetServiceResult{}, fmt.Errorf("Service does not Exist") - } - - return GetServiceResult{ - Name: params.ID, - Service: f.ConfigManager.GetPendingConfig().Object.Services[params.ID], - }, nil -} - -type GetServicesResult struct { - Services map[string]object.Service -} - -func (f *Object) GetServices(ctx context.Context, params struct{}) (GetServicesResult, error) { - return GetServicesResult{ - Services: f.ConfigManager.GetPendingConfig().Object.Services, - }, nil -} - -type CreateServiceParameters struct { - Name string - object.Service -} - -func (f *Object) CreateService(ctx context.Context, params CreateServiceParameters) (struct{}, error) { - _, ok := f.ConfigManager.GetPendingConfig().Object.Services[params.Name] - if ok { - return struct{}{}, fmt.Errorf("Service already Exists") - } - - t, conf := f.ConfigManager.StartTransaction() - defer t.Discard() - - conf.Object.Services[params.Name] = params.Service - return struct{}{}, t.Commit() -} - -type UpdateServiceParameters struct { - Name string - object.Service -} - -func (f *Object) UpdateService(ctx context.Context, params UpdateServiceParameters) (struct{}, error) { - _, ok := f.ConfigManager.GetPendingConfig().Object.Services[params.Name] - if !ok { - return struct{}{}, fmt.Errorf("Service does not Exist") - } - - t, conf := f.ConfigManager.StartTransaction() - defer t.Discard() - - conf.Object.Services[params.Name] = params.Service - return struct{}{}, t.Commit() -} - -type DeleteServiceParameters struct { - Name string -} - -func (f *Object) DeleteService(ctx context.Context, params DeleteServiceParameters) (struct{}, error) { - _, ok := f.ConfigManager.GetPendingConfig().Object.Services[params.Name] - if !ok { - return struct{}{}, fmt.Errorf("Interface does not Exist") - } - - t, conf := f.ConfigManager.StartTransaction() - defer t.Discard() - - delete(conf.Object.Services, params.Name) - return struct{}{}, t.Commit() -} diff --git a/internal/api/service/dhcp_v4_server.go b/internal/api/service/dhcp_v4_server.go deleted file mode 100644 index 09b9413..0000000 --- a/internal/api/service/dhcp_v4_server.go +++ /dev/null @@ -1,81 +0,0 @@ -package service - -import ( - "context" - "fmt" - - "nfsense.net/nfsense/internal/definitions/service" -) - -type GetDHCPv4ServerParameters struct { - ID uint -} - -type GetDHCPv4ServerResult struct { - service.DHCPv4Server -} - -func (f *Service) GetDHCPv4Server(ctx context.Context, params GetDHCPv4ServerParameters) (GetDHCPv4ServerResult, error) { - if int(params.ID) >= len(f.ConfigManager.GetPendingConfig().Service.DHCPv4Servers) { - return GetDHCPv4ServerResult{}, fmt.Errorf("DHCPv4Server does not Exist") - } - - return GetDHCPv4ServerResult{ - DHCPv4Server: f.ConfigManager.GetPendingConfig().Service.DHCPv4Servers[params.ID], - }, nil -} - -type GetDHCPv4ServersResult struct { - DHCPv4Servers []service.DHCPv4Server `json:"dhcp_v4_servers"` -} - -func (f *Service) GetDHCPv4Servers(ctx context.Context, params struct{}) (GetDHCPv4ServersResult, error) { - return GetDHCPv4ServersResult{ - DHCPv4Servers: f.ConfigManager.GetPendingConfig().Service.DHCPv4Servers, - }, nil -} - -type CreateDHCPv4ServerParameters struct { - service.DHCPv4Server -} - -func (f *Service) CreateDHCPv4Server(ctx context.Context, params CreateDHCPv4ServerParameters) (struct{}, error) { - t, conf := f.ConfigManager.StartTransaction() - defer t.Discard() - - conf.Service.DHCPv4Servers = append(conf.Service.DHCPv4Servers, params.DHCPv4Server) - return struct{}{}, t.Commit() -} - -type UpdateDHCPv4ServerParameters struct { - Index uint64 `json:"index"` - DHCPv4Server service.DHCPv4Server `json:"dhcp_v4_server"` -} - -func (f *Service) UpdateDHCPv4Server(ctx context.Context, params UpdateDHCPv4ServerParameters) (struct{}, error) { - if int(params.Index) >= len(f.ConfigManager.GetPendingConfig().Service.DHCPv4Servers) { - return struct{}{}, fmt.Errorf("DHCPv4Server does not Exist") - } - - t, conf := f.ConfigManager.StartTransaction() - defer t.Discard() - - conf.Service.DHCPv4Servers[params.Index] = params.DHCPv4Server - return struct{}{}, t.Commit() -} - -type DeleteDHCPv4ServerParameters struct { - Index uint64 `json:"index"` -} - -func (f *Service) DeleteDHCPv4Server(ctx context.Context, params DeleteDHCPv4ServerParameters) (struct{}, error) { - if int(params.Index) >= len(f.ConfigManager.GetPendingConfig().Service.DHCPv4Servers) { - return struct{}{}, fmt.Errorf("DHCPv4Server does not Exist") - } - - t, conf := f.ConfigManager.StartTransaction() - defer t.Discard() - - conf.Service.DHCPv4Servers = append(conf.Service.DHCPv4Servers[:params.Index], conf.Service.DHCPv4Servers[params.Index+1:]...) - return struct{}{}, t.Commit() -} diff --git a/internal/api/service/dhcp_v6_server.go b/internal/api/service/dhcp_v6_server.go deleted file mode 100644 index 665047e..0000000 --- a/internal/api/service/dhcp_v6_server.go +++ /dev/null @@ -1,81 +0,0 @@ -package service - -import ( - "context" - "fmt" - - "nfsense.net/nfsense/internal/definitions/service" -) - -type GetDHCPv6ServerParameters struct { - ID uint -} - -type GetDHCPv6ServerResult struct { - service.DHCPv6Server -} - -func (f *Service) GetDHCPv6Server(ctx context.Context, params GetDHCPv6ServerParameters) (GetDHCPv6ServerResult, error) { - if int(params.ID) >= len(f.ConfigManager.GetPendingConfig().Service.DHCPv6Servers) { - return GetDHCPv6ServerResult{}, fmt.Errorf("DHCPv6Server does not Exist") - } - - return GetDHCPv6ServerResult{ - DHCPv6Server: f.ConfigManager.GetPendingConfig().Service.DHCPv6Servers[params.ID], - }, nil -} - -type GetDHCPv6ServersResult struct { - DHCPv6Servers []service.DHCPv6Server `json:"dhcp_v6_servers"` -} - -func (f *Service) GetDHCPv6Servers(ctx context.Context, params struct{}) (GetDHCPv6ServersResult, error) { - return GetDHCPv6ServersResult{ - DHCPv6Servers: f.ConfigManager.GetPendingConfig().Service.DHCPv6Servers, - }, nil -} - -type CreateDHCPv6ServerParameters struct { - service.DHCPv6Server -} - -func (f *Service) CreateDHCPv6Server(ctx context.Context, params CreateDHCPv6ServerParameters) (struct{}, error) { - t, conf := f.ConfigManager.StartTransaction() - defer t.Discard() - - conf.Service.DHCPv6Servers = append(conf.Service.DHCPv6Servers, params.DHCPv6Server) - return struct{}{}, t.Commit() -} - -type UpdateDHCPv6ServerParameters struct { - Index uint64 `json:"index"` - DHCPv6Server service.DHCPv6Server `json:"dhcp_v6_server"` -} - -func (f *Service) UpdateDHCPv6Server(ctx context.Context, params UpdateDHCPv6ServerParameters) (struct{}, error) { - if int(params.Index) >= len(f.ConfigManager.GetPendingConfig().Service.DHCPv6Servers) { - return struct{}{}, fmt.Errorf("DHCPv6Server does not Exist") - } - - t, conf := f.ConfigManager.StartTransaction() - defer t.Discard() - - conf.Service.DHCPv6Servers[params.Index] = params.DHCPv6Server - return struct{}{}, t.Commit() -} - -type DeleteDHCPv6ServerParameters struct { - Index uint64 `json:"index"` -} - -func (f *Service) DeleteDHCPv6Server(ctx context.Context, params DeleteDHCPv6ServerParameters) (struct{}, error) { - if int(params.Index) >= len(f.ConfigManager.GetPendingConfig().Service.DHCPv6Servers) { - return struct{}{}, fmt.Errorf("DHCPv6Server does not Exist") - } - - t, conf := f.ConfigManager.StartTransaction() - defer t.Discard() - - conf.Service.DHCPv6Servers = append(conf.Service.DHCPv6Servers[:params.Index], conf.Service.DHCPv6Servers[params.Index+1:]...) - return struct{}{}, t.Commit() -} diff --git a/internal/api/service/dns_server.go b/internal/api/service/dns_server.go deleted file mode 100644 index 9803968..0000000 --- a/internal/api/service/dns_server.go +++ /dev/null @@ -1,81 +0,0 @@ -package service - -import ( - "context" - "fmt" - - "nfsense.net/nfsense/internal/definitions/service" -) - -type GetDNSServerParameters struct { - ID uint -} - -type GetDNSServerResult struct { - service.DNSServer -} - -func (f *Service) GetDNSServer(ctx context.Context, params GetDNSServerParameters) (GetDNSServerResult, error) { - if int(params.ID) >= len(f.ConfigManager.GetPendingConfig().Service.DNSServers) { - return GetDNSServerResult{}, fmt.Errorf("DNSServer does not Exist") - } - - return GetDNSServerResult{ - DNSServer: f.ConfigManager.GetPendingConfig().Service.DNSServers[params.ID], - }, nil -} - -type GetDNSServersResult struct { - DNSServers []service.DNSServer `json:"dns_servers"` -} - -func (f *Service) GetDNSServers(ctx context.Context, params struct{}) (GetDNSServersResult, error) { - return GetDNSServersResult{ - DNSServers: f.ConfigManager.GetPendingConfig().Service.DNSServers, - }, nil -} - -type CreateDNSServerParameters struct { - service.DNSServer -} - -func (f *Service) CreateDNSServer(ctx context.Context, params CreateDNSServerParameters) (struct{}, error) { - t, conf := f.ConfigManager.StartTransaction() - defer t.Discard() - - conf.Service.DNSServers = append(conf.Service.DNSServers, params.DNSServer) - return struct{}{}, t.Commit() -} - -type UpdateDNSServerParameters struct { - Index uint64 `json:"index"` - DNSServer service.DNSServer `json:"dns_server"` -} - -func (f *Service) UpdateDNSServer(ctx context.Context, params UpdateDNSServerParameters) (struct{}, error) { - if int(params.Index) >= len(f.ConfigManager.GetPendingConfig().Service.DNSServers) { - return struct{}{}, fmt.Errorf("DNSServer does not Exist") - } - - t, conf := f.ConfigManager.StartTransaction() - defer t.Discard() - - conf.Service.DNSServers[params.Index] = params.DNSServer - return struct{}{}, t.Commit() -} - -type DeleteDNSServerParameters struct { - Index uint64 `json:"index"` -} - -func (f *Service) DeleteDNSServer(ctx context.Context, params DeleteDNSServerParameters) (struct{}, error) { - if int(params.Index) >= len(f.ConfigManager.GetPendingConfig().Service.DNSServers) { - return struct{}{}, fmt.Errorf("DNSServer does not Exist") - } - - t, conf := f.ConfigManager.StartTransaction() - defer t.Discard() - - conf.Service.DNSServers = append(conf.Service.DNSServers[:params.Index], conf.Service.DNSServers[params.Index+1:]...) - return struct{}{}, t.Commit() -} diff --git a/internal/api/service/ntp_server.go b/internal/api/service/ntp_server.go deleted file mode 100644 index fca7519..0000000 --- a/internal/api/service/ntp_server.go +++ /dev/null @@ -1,81 +0,0 @@ -package service - -import ( - "context" - "fmt" - - "nfsense.net/nfsense/internal/definitions/service" -) - -type GetNTPServerParameters struct { - ID uint -} - -type GetNTPServerResult struct { - service.NTPServer -} - -func (f *Service) GetNTPServer(ctx context.Context, params GetNTPServerParameters) (GetNTPServerResult, error) { - if int(params.ID) >= len(f.ConfigManager.GetPendingConfig().Service.NTPServers) { - return GetNTPServerResult{}, fmt.Errorf("NTPServer does not Exist") - } - - return GetNTPServerResult{ - NTPServer: f.ConfigManager.GetPendingConfig().Service.NTPServers[params.ID], - }, nil -} - -type GetNTPServersResult struct { - NTPServers []service.NTPServer `json:"ntp_servers"` -} - -func (f *Service) GetNTPServers(ctx context.Context, params struct{}) (GetNTPServersResult, error) { - return GetNTPServersResult{ - NTPServers: f.ConfigManager.GetPendingConfig().Service.NTPServers, - }, nil -} - -type CreateNTPServerParameters struct { - service.NTPServer -} - -func (f *Service) CreateNTPServer(ctx context.Context, params CreateNTPServerParameters) (struct{}, error) { - t, conf := f.ConfigManager.StartTransaction() - defer t.Discard() - - conf.Service.NTPServers = append(conf.Service.NTPServers, params.NTPServer) - return struct{}{}, t.Commit() -} - -type UpdateNTPServerParameters struct { - Index uint64 `json:"index"` - NTPServer service.NTPServer `json:"ntp_server"` -} - -func (f *Service) UpdateNTPServer(ctx context.Context, params UpdateNTPServerParameters) (struct{}, error) { - if int(params.Index) >= len(f.ConfigManager.GetPendingConfig().Service.NTPServers) { - return struct{}{}, fmt.Errorf("NTPServer does not Exist") - } - - t, conf := f.ConfigManager.StartTransaction() - defer t.Discard() - - conf.Service.NTPServers[params.Index] = params.NTPServer - return struct{}{}, t.Commit() -} - -type DeleteNTPServerParameters struct { - Index uint64 `json:"index"` -} - -func (f *Service) DeleteNTPServer(ctx context.Context, params DeleteNTPServerParameters) (struct{}, error) { - if int(params.Index) >= len(f.ConfigManager.GetPendingConfig().Service.NTPServers) { - return struct{}{}, fmt.Errorf("NTPServer does not Exist") - } - - t, conf := f.ConfigManager.StartTransaction() - defer t.Discard() - - conf.Service.NTPServers = append(conf.Service.NTPServers[:params.Index], conf.Service.NTPServers[params.Index+1:]...) - return struct{}{}, t.Commit() -} diff --git a/internal/api/service/service.go b/internal/api/service/service.go deleted file mode 100644 index 2dd9f4d..0000000 --- a/internal/api/service/service.go +++ /dev/null @@ -1,11 +0,0 @@ -package service - -import ( - "github.com/godbus/dbus/v5" - "nfsense.net/nfsense/internal/config" -) - -type Service struct { - ConfigManager *config.ConfigManager - DbusConn *dbus.Conn -} diff --git a/internal/api/system/system.go b/internal/api/system/system.go deleted file mode 100644 index 4c004cb..0000000 --- a/internal/api/system/system.go +++ /dev/null @@ -1,9 +0,0 @@ -package system - -import ( - "nfsense.net/nfsense/internal/config" -) - -type System struct { - ConfigManager *config.ConfigManager -} diff --git a/internal/api/system/user.go b/internal/api/system/user.go deleted file mode 100644 index e2b06c0..0000000 --- a/internal/api/system/user.go +++ /dev/null @@ -1,139 +0,0 @@ -package system - -import ( - "context" - "fmt" - - "nfsense.net/nfsense/internal/auth" - "nfsense.net/nfsense/internal/definitions/system" -) - -type User struct { - Comment string `json:"comment"` -} - -type GetUserParameters struct { - ID string -} - -type GetUserResult struct { - Name string `json:"name"` - User -} - -func (f *System) GetUser(ctx context.Context, params GetUserParameters) (GetUserResult, error) { - _, ok := f.ConfigManager.GetPendingConfig().System.Users[params.ID] - if !ok { - return GetUserResult{}, fmt.Errorf("User does not Exist") - } - - return GetUserResult{ - Name: params.ID, - User: User{ - Comment: f.ConfigManager.GetPendingConfig().System.Users[params.ID].Comment, - }, - }, nil -} - -type GetUsersResult struct { - Users map[string]User -} - -func (f *System) GetUsers(ctx context.Context, params struct{}) (GetUsersResult, error) { - users := map[string]User{} - for n, u := range f.ConfigManager.GetPendingConfig().System.Users { - users[n] = User{Comment: u.Comment} - } - return GetUsersResult{ - Users: users, - }, nil -} - -type CreateUserParameters struct { - Name string `json:"name"` - Password string `json:"password"` - User -} - -func (f *System) CreateUser(ctx context.Context, params CreateUserParameters) (struct{}, error) { - _, ok := f.ConfigManager.GetPendingConfig().System.Users[params.Name] - if ok { - return struct{}{}, fmt.Errorf("User already Exists") - } - - if params.Name == "" { - return struct{}{}, fmt.Errorf("Name Cannot be empty") - } - - if params.Password == "" { - return struct{}{}, fmt.Errorf("Password Cannot be empty") - } - - hash, salt, err := auth.GenerateHash(params.Password) - if err != nil { - return struct{}{}, fmt.Errorf("Generate Hash: %w", err) - } - - t, conf := f.ConfigManager.StartTransaction() - defer t.Discard() - - conf.System.Users[params.Name] = system.User{ - Hash: hash, - Salt: salt, - Comment: params.User.Comment, - } - return struct{}{}, t.Commit() -} - -type UpdateUserParameters struct { - Name string `json:"name"` - Password string `json:"password"` - User -} - -func (f *System) UpdateUser(ctx context.Context, params UpdateUserParameters) (struct{}, error) { - _, ok := f.ConfigManager.GetPendingConfig().System.Users[params.Name] - if !ok { - return struct{}{}, fmt.Errorf("User does not Exist") - } - - if params.Name == "" { - return struct{}{}, fmt.Errorf("Name Cannot be empty") - } - user := f.ConfigManager.GetPendingConfig().System.Users[params.Name] - - if params.Password != "" { - hash, salt, err := auth.GenerateHash(params.Password) - if err != nil { - return struct{}{}, fmt.Errorf("Generate Hash: %w", err) - } - - user.Hash = hash - user.Salt = salt - } - - user.Comment = params.User.Comment - - t, conf := f.ConfigManager.StartTransaction() - defer t.Discard() - - conf.System.Users[params.Name] = user - return struct{}{}, t.Commit() -} - -type DeleteUserParameters struct { - Name string -} - -func (f *System) DeleteUser(ctx context.Context, params DeleteUserParameters) (struct{}, error) { - _, ok := f.ConfigManager.GetPendingConfig().System.Users[params.Name] - if !ok { - return struct{}{}, fmt.Errorf("User does not Exist") - } - - t, conf := f.ConfigManager.StartTransaction() - defer t.Discard() - - delete(conf.System.Users, params.Name) - return struct{}{}, t.Commit() -} diff --git a/internal/api/vpn/interfaces.go b/internal/api/vpn/interfaces.go deleted file mode 100644 index c637673..0000000 --- a/internal/api/vpn/interfaces.go +++ /dev/null @@ -1,92 +0,0 @@ -package vpn - -import ( - "context" - "fmt" - - "nfsense.net/nfsense/internal/definitions/vpn" -) - -type GetWireguardInterfaceParameters struct { - ID string -} - -type GetWireguardInterfaceResult struct { - Name string `json:"name"` - vpn.WireguardInterface -} - -func (f *VPN) GetWireguardInterface(ctx context.Context, params GetWireguardInterfaceParameters) (GetWireguardInterfaceResult, error) { - _, ok := f.ConfigManager.GetPendingConfig().VPN.Wireguard.Interfaces[params.ID] - if !ok { - return GetWireguardInterfaceResult{}, fmt.Errorf("WireguardInterface does not Exist") - } - - return GetWireguardInterfaceResult{ - Name: params.ID, - WireguardInterface: f.ConfigManager.GetPendingConfig().VPN.Wireguard.Interfaces[params.ID], - }, nil -} - -type GetWireguardInterfacesResult struct { - Interfaces map[string]vpn.WireguardInterface -} - -func (f *VPN) GetWireguardInterfaces(ctx context.Context, params struct{}) (GetWireguardInterfacesResult, error) { - return GetWireguardInterfacesResult{ - Interfaces: f.ConfigManager.GetPendingConfig().VPN.Wireguard.Interfaces, - }, nil -} - -type CreateWireguardInterfaceParameters struct { - Name string `json:"name"` - vpn.WireguardInterface -} - -func (f *VPN) CreateWireguardInterface(ctx context.Context, params CreateWireguardInterfaceParameters) (struct{}, error) { - _, ok := f.ConfigManager.GetPendingConfig().VPN.Wireguard.Interfaces[params.Name] - if ok { - return struct{}{}, fmt.Errorf("WireguardInterface already Exists") - } - - t, conf := f.ConfigManager.StartTransaction() - defer t.Discard() - - conf.VPN.Wireguard.Interfaces[params.Name] = params.WireguardInterface - return struct{}{}, t.Commit() -} - -type UpdateWireguardInterfaceParameters struct { - Name string - vpn.WireguardInterface -} - -func (f *VPN) UpdateWireguardInterface(ctx context.Context, params UpdateWireguardInterfaceParameters) (struct{}, error) { - _, ok := f.ConfigManager.GetPendingConfig().VPN.Wireguard.Interfaces[params.Name] - if !ok { - return struct{}{}, fmt.Errorf("WireguardInterface does not Exist") - } - - t, conf := f.ConfigManager.StartTransaction() - defer t.Discard() - - conf.VPN.Wireguard.Interfaces[params.Name] = params.WireguardInterface - return struct{}{}, t.Commit() -} - -type DeleteWireguardInterfaceParameters struct { - Name string -} - -func (f *VPN) DeleteWireguardInterface(ctx context.Context, params DeleteWireguardInterfaceParameters) (struct{}, error) { - _, ok := f.ConfigManager.GetPendingConfig().VPN.Wireguard.Interfaces[params.Name] - if !ok { - return struct{}{}, fmt.Errorf("WireguardInterface does not Exist") - } - - t, conf := f.ConfigManager.StartTransaction() - defer t.Discard() - - delete(conf.VPN.Wireguard.Interfaces, params.Name) - return struct{}{}, t.Commit() -} diff --git a/internal/api/vpn/peers.go b/internal/api/vpn/peers.go deleted file mode 100644 index 6742f50..0000000 --- a/internal/api/vpn/peers.go +++ /dev/null @@ -1,92 +0,0 @@ -package vpn - -import ( - "context" - "fmt" - - "nfsense.net/nfsense/internal/definitions/vpn" -) - -type GetWireguardPeerParameters struct { - ID string -} - -type GetWireguardPeerResult struct { - Name string `json:"name"` - vpn.WireguardPeer -} - -func (f *VPN) GetWireguardPeer(ctx context.Context, params GetWireguardPeerParameters) (GetWireguardPeerResult, error) { - _, ok := f.ConfigManager.GetPendingConfig().VPN.Wireguard.Peers[params.ID] - if !ok { - return GetWireguardPeerResult{}, fmt.Errorf("WireguardPeer does not Exist") - } - - return GetWireguardPeerResult{ - Name: params.ID, - WireguardPeer: f.ConfigManager.GetPendingConfig().VPN.Wireguard.Peers[params.ID], - }, nil -} - -type GetWireguardPeersResult struct { - WireguardPeers map[string]vpn.WireguardPeer -} - -func (f *VPN) GetWireguardPeers(ctx context.Context, params struct{}) (GetWireguardPeersResult, error) { - return GetWireguardPeersResult{ - WireguardPeers: f.ConfigManager.GetPendingConfig().VPN.Wireguard.Peers, - }, nil -} - -type CreateWireguardPeerParameters struct { - Name string `json:"name"` - vpn.WireguardPeer -} - -func (f *VPN) CreateWireguardPeer(ctx context.Context, params CreateWireguardPeerParameters) (struct{}, error) { - _, ok := f.ConfigManager.GetPendingConfig().VPN.Wireguard.Peers[params.Name] - if ok { - return struct{}{}, fmt.Errorf("WireguardPeer already Exists") - } - - t, conf := f.ConfigManager.StartTransaction() - defer t.Discard() - - conf.VPN.Wireguard.Peers[params.Name] = params.WireguardPeer - return struct{}{}, t.Commit() -} - -type UpdateWireguardPeerParameters struct { - Name string - vpn.WireguardPeer -} - -func (f *VPN) UpdateWireguardPeer(ctx context.Context, params UpdateWireguardPeerParameters) (struct{}, error) { - _, ok := f.ConfigManager.GetPendingConfig().VPN.Wireguard.Peers[params.Name] - if !ok { - return struct{}{}, fmt.Errorf("WireguardPeer does not Exist") - } - - t, conf := f.ConfigManager.StartTransaction() - defer t.Discard() - - conf.VPN.Wireguard.Peers[params.Name] = params.WireguardPeer - return struct{}{}, t.Commit() -} - -type DeleteWireguardPeerParameters struct { - Name string -} - -func (f *VPN) DeleteWireguardPeer(ctx context.Context, params DeleteWireguardPeerParameters) (struct{}, error) { - _, ok := f.ConfigManager.GetPendingConfig().VPN.Wireguard.Peers[params.Name] - if !ok { - return struct{}{}, fmt.Errorf("WireguardPeer does not Exist") - } - - t, conf := f.ConfigManager.StartTransaction() - defer t.Discard() - - delete(conf.VPN.Wireguard.Peers, params.Name) - return struct{}{}, t.Commit() -} diff --git a/internal/api/vpn/status.go b/internal/api/vpn/status.go deleted file mode 100644 index 931ef14..0000000 --- a/internal/api/vpn/status.go +++ /dev/null @@ -1,29 +0,0 @@ -package vpn - -import ( - "bytes" - "context" - "fmt" - "os/exec" - - "golang.org/x/exp/slog" -) - -type GetWireguardStatusResult struct { - Status string -} - -func (f *VPN) GetWireguardStatus(ctx context.Context, params struct{}) (GetWireguardStatusResult, error) { - cmd := exec.Command("wg") - var out bytes.Buffer - cmd.Stdout = &out - - err := cmd.Run() - if err != nil { - return GetWireguardStatusResult{}, fmt.Errorf("restarting networkd: %w", err) - } - slog.Info("wg output", "out", out.String()) - return GetWireguardStatusResult{ - Status: out.String(), - }, nil -} diff --git a/internal/api/vpn/vpn.go b/internal/api/vpn/vpn.go deleted file mode 100644 index 5006b92..0000000 --- a/internal/api/vpn/vpn.go +++ /dev/null @@ -1,11 +0,0 @@ -package vpn - -import ( - "github.com/godbus/dbus/v5" - "nfsense.net/nfsense/internal/config" -) - -type VPN struct { - ConfigManager *config.ConfigManager - DbusConn *dbus.Conn -} diff --git a/internal/auth/auth.go b/internal/auth/auth.go deleted file mode 100644 index 11617b0..0000000 --- a/internal/auth/auth.go +++ /dev/null @@ -1,47 +0,0 @@ -package auth - -import ( - "fmt" - "math/rand" - "time" - - "github.com/tredoe/osutil/user/crypt/sha512_crypt" - "nfsense.net/nfsense/internal/definitions/config" -) - -func AuthenticateUser(conf config.Config, username, password string) error { - user, ok := conf.System.Users[username] - if !ok { - return fmt.Errorf("User not found") - } - - // Using sha512 to be compatible with /etc/shadow - c := sha512_crypt.New() - hash, err := c.Generate([]byte(password), []byte(user.Salt)) - if err != nil { - return fmt.Errorf("Hashing Password: %w", err) - } - - if hash == user.Hash { - return nil - } - - return fmt.Errorf("Invalid Password") -} - -func GenerateHash(password string) (string, string, error) { - const charset = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" - seededRand := rand.New(rand.NewSource(time.Now().UnixNano())) - s := make([]byte, 8) - for i := range s { - s[i] = charset[seededRand.Intn(len(charset))] - } - salt := []byte(fmt.Sprintf("$6$%s", s)) - - c := sha512_crypt.New() - hash, err := c.Generate([]byte(password), []byte(salt)) - if err != nil { - return "", "", fmt.Errorf("Hashing Password: %w", err) - } - return hash, string(salt), nil -} diff --git a/internal/chrony/apply.go b/internal/chrony/apply.go deleted file mode 100644 index 1690a64..0000000 --- a/internal/chrony/apply.go +++ /dev/null @@ -1,37 +0,0 @@ -package chrony - -import ( - "context" - "fmt" - - systemctl "github.com/coreos/go-systemd/v22/dbus" - "nfsense.net/nfsense/internal/definitions/config" - "nfsense.net/nfsense/internal/util" -) - -const chronyConfigFile = "/etc/chrony.conf" - -func ApplyNTPConfiguration(currentConfig config.Config, pendingConfig config.Config) error { - - conf, err := GenerateChronyConfiguration(pendingConfig) - if err != nil { - return fmt.Errorf("Generating Chrony Configuration: %w", err) - } - - err = util.OverwriteFile(chronyConfigFile, conf) - if err != nil { - return fmt.Errorf("Writing Chrony Configuration: %w", err) - } - - conn, err := systemctl.NewSystemConnectionContext(context.Background()) - if err != nil { - return fmt.Errorf("Opening Dbus Connection: %w", err) - } - - _, err = conn.ReloadOrRestartUnitContext(context.Background(), "chronyd.service", "replace", nil) - if err != nil { - return fmt.Errorf("restarting chronyd.service: %w", err) - } - - return nil -} diff --git a/internal/chrony/config.go b/internal/chrony/config.go deleted file mode 100644 index cbde8e9..0000000 --- a/internal/chrony/config.go +++ /dev/null @@ -1,17 +0,0 @@ -package chrony - -import ( - "bytes" - "fmt" - - "nfsense.net/nfsense/internal/definitions/config" -) - -func GenerateChronyConfiguration(conf config.Config) (string, error) { - buf := new(bytes.Buffer) - err := templates.ExecuteTemplate(buf, "config.tmpl", conf) - if err != nil { - return "", fmt.Errorf("executing server.tmpl template: %w", err) - } - return buf.String(), nil -} diff --git a/internal/chrony/template.go b/internal/chrony/template.go deleted file mode 100644 index 9341652..0000000 --- a/internal/chrony/template.go +++ /dev/null @@ -1,26 +0,0 @@ -package chrony - -import ( - "embed" - "text/template" - - "nfsense.net/nfsense/internal/definitions/config" -) - -//go:embed template -var templateFS embed.FS -var templates *template.Template - -func init() { - var err error - templates, err = template.New("").Funcs(template.FuncMap{ - "getInterfaceNetworkAddressCIDR": getInterfaceNetworkAddressCIDR, - }).ParseFS(templateFS, "template/*.tmpl") - if err != nil { - panic(err) - } -} - -func getInterfaceNetworkAddressCIDR(conf config.Config, name string) string { - return conf.Network.Interfaces[name].Address.Masked().String() -} diff --git a/internal/chrony/template/config.tmpl b/internal/chrony/template/config.tmpl deleted file mode 100644 index 78fce09..0000000 --- a/internal/chrony/template/config.tmpl +++ /dev/null @@ -1,13 +0,0 @@ -pool pool.ntp.org iburst -driftfile /var/lib/chrony/drift -makestep 1.0 3 -rtcsync -keyfile /etc/chrony.keys -ntsdumpdir /var/lib/chrony -leapsectz right/UTC -logdir /var/log/chrony - -# Allowed Networks -{{- range $i, $server := .Service.NTPServers }} -allow {{ getInterfaceNetworkAddressCIDR $ $server.Interface }} -{{- end }} \ No newline at end of file diff --git a/internal/config/apply.go b/internal/config/apply.go deleted file mode 100644 index e5b916e..0000000 --- a/internal/config/apply.go +++ /dev/null @@ -1,52 +0,0 @@ -package config - -import ( - "fmt" - "os" - - "golang.org/x/exp/slog" - "nfsense.net/nfsense/internal/definitions/config" -) - -// ApplyPendingChanges Takes all pending Changes and Tries to Apply them using the Registered Apply Functions. -// In Case of error it Attempts to Revert to the Current Config -func (m *ConfigManager) ApplyPendingChanges() error { - slog.Info("Applying Pending Changes...") - for _, fn := range m.applyFunctions { - err := fn(*m.currentConfig, *m.pendingConfig) - if err != nil { - slog.Error("Applying Pending Changes", "err", err) - err2 := revertToCurrent(m) - if err2 != nil { - slog.Error("Reverting Error", "err", err2) - return fmt.Errorf("Apply Error %w; Reverting Error %w", err, err2) - } - return err - } - } - m.currentConfig = m.pendingConfig.Clone() - - err := m.saveConfig(m.currentConfigFilePath, m.pendingConfig) - if err != nil { - return fmt.Errorf("Save Current Config: %w", err) - } - err = os.Remove(m.pendingConfigFilePath) - if err != nil { - return fmt.Errorf("Delete Pending Config: %w", err) - } - return nil -} - -func revertToCurrent(m *ConfigManager) error { - for _, fn := range m.applyFunctions { - err := fn(*m.pendingConfig, *m.currentConfig) - if err != nil { - return err - } - } - return nil -} - -func (m *ConfigManager) RegisterApplyFunction(fn func(currentConfig config.Config, pendingConfig config.Config) error) { - m.applyFunctions = append(m.applyFunctions, fn) -} diff --git a/internal/config/default.go b/internal/config/default.go deleted file mode 100644 index 3dd8370..0000000 --- a/internal/config/default.go +++ /dev/null @@ -1,56 +0,0 @@ -package config - -import ( - "fmt" - - "nfsense.net/nfsense/internal/definitions/config" - "nfsense.net/nfsense/internal/definitions/firewall" - "nfsense.net/nfsense/internal/definitions/network" - "nfsense.net/nfsense/internal/definitions/object" - "nfsense.net/nfsense/internal/definitions/service" - "nfsense.net/nfsense/internal/definitions/system" - "nfsense.net/nfsense/internal/definitions/vpn" -) - -func (m *ConfigManager) LoadDefaultConfig() error { - conf := config.Config{ - ConfigVersion: 1, - Firewall: firewall.Firewall{ - ForwardRules: []firewall.ForwardRule{}, - DestinationNATRules: []firewall.DestinationNATRule{}, - SourceNATRules: []firewall.SourceNATRule{}, - }, - Object: object.Object{ - Addresses: map[string]object.Address{}, - Services: map[string]object.Service{}, - }, - Network: network.Network{ - Interfaces: map[string]network.Interface{}, - StaticRoutes: []network.StaticRoute{}, - }, - Service: service.Service{ - DHCPv4Servers: []service.DHCPv4Server{}, - DHCPv6Servers: []service.DHCPv6Server{}, - DNSServers: []service.DNSServer{}, - NTPServers: []service.NTPServer{}, - }, - VPN: vpn.VPN{ - Wireguard: vpn.Wireguard{ - Interfaces: map[string]vpn.WireguardInterface{}, - Peers: map[string]vpn.WireguardPeer{}, - }, - }, - System: system.System{ - Users: map[string]system.User{}, - }, - } - - err := config.ValidateConfig(&conf) - if err != nil { - return fmt.Errorf("validating Config: %w", err) - } - - m.currentConfig = &conf - m.pendingConfig = &conf - return nil -} diff --git a/internal/config/diff.go b/internal/config/diff.go deleted file mode 100644 index 4175b6d..0000000 --- a/internal/config/diff.go +++ /dev/null @@ -1,11 +0,0 @@ -package config - -import "github.com/r3labs/diff/v3" - -func (m *ConfigManager) AreChangesPending() bool { - return diff.Changed(m.currentConfig, m.pendingConfig) -} - -func (m *ConfigManager) GetPendingChangelog() (diff.Changelog, error) { - return diff.Diff(m.currentConfig, m.pendingConfig, diff.SliceOrdering(true)) -} diff --git a/internal/config/discard.go b/internal/config/discard.go deleted file mode 100644 index f4163ae..0000000 --- a/internal/config/discard.go +++ /dev/null @@ -1,16 +0,0 @@ -package config - -import ( - "errors" - "os" -) - -func (m *ConfigManager) DiscardPendingConfig() error { - m.pendingConfig = m.currentConfig.Clone() - - err := os.Remove(m.pendingConfigFilePath) - if !errors.Is(err, os.ErrNotExist) { - return err - } - return nil -} diff --git a/internal/config/get.go b/internal/config/get.go deleted file mode 100644 index 1cf7d15..0000000 --- a/internal/config/get.go +++ /dev/null @@ -1,13 +0,0 @@ -package config - -import ( - "nfsense.net/nfsense/internal/definitions/config" -) - -func (m *ConfigManager) GetCurrentConfig() config.Config { - return *m.currentConfig.Clone() -} - -func (m *ConfigManager) GetPendingConfig() config.Config { - return *m.pendingConfig.Clone() -} diff --git a/internal/config/load.go b/internal/config/load.go deleted file mode 100644 index d38fe68..0000000 --- a/internal/config/load.go +++ /dev/null @@ -1,57 +0,0 @@ -package config - -import ( - "encoding/json" - "fmt" - "os" - - "nfsense.net/nfsense/internal/definitions/config" -) - -func (m *ConfigManager) LoadCurrentConfigFromDisk() error { - var conf config.Config - configFile, err := os.Open(m.currentConfigFilePath) - if err != nil { - return fmt.Errorf("opening Config File %w", err) - } - defer configFile.Close() - - jsonParser := json.NewDecoder(configFile) - jsonParser.DisallowUnknownFields() - err = jsonParser.Decode(&conf) - if err != nil { - return fmt.Errorf("decoding Config File %w", err) - } - - err = config.ValidateConfig(&conf) - if err != nil { - return fmt.Errorf("validating Config: %w", err) - } - - m.currentConfig = &conf - return nil -} - -func (m *ConfigManager) LoadPendingConfigFromDisk() error { - var conf config.Config - configFile, err := os.Open(m.pendingConfigFilePath) - if err != nil { - return fmt.Errorf("opening Config File %w", err) - } - defer configFile.Close() - - jsonParser := json.NewDecoder(configFile) - jsonParser.DisallowUnknownFields() - err = jsonParser.Decode(&conf) - if err != nil { - return fmt.Errorf("decoding Config File %w", err) - } - - err = config.ValidateConfig(&conf) - if err != nil { - return fmt.Errorf("validating Config: %w", err) - } - - m.pendingConfig = &conf - return nil -} diff --git a/internal/config/manager.go b/internal/config/manager.go deleted file mode 100644 index 08eeb30..0000000 --- a/internal/config/manager.go +++ /dev/null @@ -1,29 +0,0 @@ -package config - -import ( - "sync" - - "nfsense.net/nfsense/internal/definitions/config" -) - -type ConfigManager struct { - currentConfigFilePath string - pendingConfigFilePath string - - currentConfig *config.Config - pendingConfig *config.Config - - transactionMutex sync.Mutex - - applyFunctions []func(currentConfig config.Config, pendingConfig config.Config) error -} - -func CreateConfigManager() *ConfigManager { - manager := ConfigManager{ - currentConfigFilePath: "config.json", - pendingConfigFilePath: "pending.json", - currentConfig: &config.Config{}, - pendingConfig: &config.Config{}, - } - return &manager -} diff --git a/internal/config/save.go b/internal/config/save.go deleted file mode 100644 index 0c13bd6..0000000 --- a/internal/config/save.go +++ /dev/null @@ -1,35 +0,0 @@ -package config - -import ( - "encoding/json" - "fmt" - "os" - - "nfsense.net/nfsense/internal/definitions/config" -) - -func (m *ConfigManager) saveConfig(path string, conf *config.Config) error { - data, err := json.MarshalIndent(conf, "", " ") - if err != nil { - return fmt.Errorf("Marshal Config: %w", err) - } - - err = os.WriteFile(path, data, 0644) - if err != nil { - return fmt.Errorf("Write Config: %w", err) - } - - return nil -} - -func (m *ConfigManager) SaveWithoutApplying() error { - m.currentConfig = m.pendingConfig.Clone() - - err := m.saveConfig(m.currentConfigFilePath, m.pendingConfig) - if err != nil { - return fmt.Errorf("Save Current Config: %w", err) - } - - os.Remove(m.pendingConfigFilePath) - return nil -} diff --git a/internal/config/transaction.go b/internal/config/transaction.go deleted file mode 100644 index 83ca684..0000000 --- a/internal/config/transaction.go +++ /dev/null @@ -1,62 +0,0 @@ -package config - -import ( - "fmt" - "sync" - - "nfsense.net/nfsense/internal/definitions/config" -) - -type ConfigTransaction struct { - finished bool - mutex sync.Mutex - configManager *ConfigManager - changes *config.Config -} - -func (m *ConfigManager) StartTransaction() (*ConfigTransaction, *config.Config) { - m.transactionMutex.Lock() - confCopy := m.pendingConfig.Clone() - return &ConfigTransaction{ - configManager: m, - changes: confCopy, - }, confCopy -} - -func (t *ConfigTransaction) Commit() error { - t.mutex.Lock() - defer t.mutex.Unlock() - - if t.finished { - return fmt.Errorf("transaction already finished") - } - - t.finished = true - defer t.configManager.transactionMutex.Unlock() - - err := config.ValidateConfig(t.changes) - if err != nil { - return fmt.Errorf("validating Config before Apply: %w", err) - } - - err = t.configManager.saveConfig(t.configManager.pendingConfigFilePath, t.changes) - if err != nil { - return fmt.Errorf("Save Current Config: %w", err) - } - - t.configManager.pendingConfig = t.changes.Clone() - - return nil -} - -// Discard Discards the Transaction. -// Is a noop if The Transaction Already Finished due to a Commit() or another Discard() -func (t *ConfigTransaction) Discard() { - t.mutex.Lock() - defer t.mutex.Unlock() - - if !t.finished { - t.finished = true - t.configManager.transactionMutex.Unlock() - } -} diff --git a/internal/definitions/common/hardwareaddress.go b/internal/definitions/common/hardwareaddress.go deleted file mode 100644 index 42023fd..0000000 --- a/internal/definitions/common/hardwareaddress.go +++ /dev/null @@ -1,30 +0,0 @@ -package common - -import ( - "encoding/json" - "net" -) - -type HardwareAddress struct { - net.HardwareAddr -} - -// MarshalJSON for IPCIDR -func (i HardwareAddress) MarshalJSON() ([]byte, error) { - return json.Marshal(i.String()) -} - -// UnmarshalJSON for IPCIDR -func (i *HardwareAddress) UnmarshalJSON(b []byte) error { - var s string - if err := json.Unmarshal(b, &s); err != nil { - return err - } - - mac, err := net.ParseMAC(s) - if err != nil { - return err - } - i.HardwareAddr = mac - return nil -} diff --git a/internal/definitions/common/ipcidr.go b/internal/definitions/common/ipcidr.go deleted file mode 100644 index 99db0eb..0000000 --- a/internal/definitions/common/ipcidr.go +++ /dev/null @@ -1,32 +0,0 @@ -package common - -import ( - "encoding/json" - "net" -) - -// IPCIDR is IP Address with the mask in CIDR format -type IPCIDR struct { - net.IPNet -} - -// MarshalJSON for IPCIDR -func (i IPCIDR) MarshalJSON() ([]byte, error) { - return json.Marshal(i.String()) -} - -// UnmarshalJSON for IPCIDR -func (i *IPCIDR) UnmarshalJSON(b []byte) error { - var s string - if err := json.Unmarshal(b, &s); err != nil { - return err - } - - ip, ipnet, err := net.ParseCIDR(s) - if err != nil { - return err - } - i.IPNet = *ipnet - i.IPNet.IP = ip - return nil -} diff --git a/internal/definitions/common/ipnet.go b/internal/definitions/common/ipnet.go deleted file mode 100644 index 7946549..0000000 --- a/internal/definitions/common/ipnet.go +++ /dev/null @@ -1,30 +0,0 @@ -package common - -import ( - "encoding/json" - "net" -) - -type IPNet struct { - net.IPNet -} - -// MarshalJSON for IPNet -func (i IPNet) MarshalJSON() ([]byte, error) { - return json.Marshal(i.String()) -} - -// UnmarshalJSON for IPNet -func (i *IPNet) UnmarshalJSON(b []byte) error { - var s string - if err := json.Unmarshal(b, &s); err != nil { - return err - } - - _, ipnet, err := net.ParseCIDR(s) - if err != nil { - return err - } - i.IPNet = *ipnet - return nil -} diff --git a/internal/definitions/common/time.go b/internal/definitions/common/time.go deleted file mode 100644 index 0a365e6..0000000 --- a/internal/definitions/common/time.go +++ /dev/null @@ -1,34 +0,0 @@ -package common - -import ( - "encoding/json" - "errors" - "time" -) - -type Duration struct { - time.Duration -} - -// MarshalJSON for IPNet -func (i Duration) MarshalJSON() ([]byte, error) { - return json.Marshal(int(i.Seconds())) -} - -// UnmarshalJSON for IPNet -func (i *Duration) UnmarshalJSON(b []byte) error { - var v interface{} - if err := json.Unmarshal(b, &v); err != nil { - return err - } - switch value := v.(type) { - case float64: - i.Duration = time.Second * time.Duration(value) - return nil - case int: - i.Duration = time.Second * time.Duration(value) - return nil - default: - return errors.New("invalid duration") - } -} diff --git a/internal/definitions/config/config.go b/internal/definitions/config/config.go deleted file mode 100644 index 816e640..0000000 --- a/internal/definitions/config/config.go +++ /dev/null @@ -1,42 +0,0 @@ -package config - -import ( - "encoding/json" - "fmt" - - "nfsense.net/nfsense/internal/definitions/firewall" - "nfsense.net/nfsense/internal/definitions/network" - "nfsense.net/nfsense/internal/definitions/object" - "nfsense.net/nfsense/internal/definitions/service" - "nfsense.net/nfsense/internal/definitions/system" - "nfsense.net/nfsense/internal/definitions/vpn" - "nfsense.net/nfsense/internal/validation" -) - -type Config struct { - ConfigVersion uint64 `json:"config_version"` - Firewall firewall.Firewall `json:"firewall"` - Object object.Object `json:"object"` - Network network.Network `json:"network"` - Service service.Service `json:"service"` - VPN vpn.VPN `json:"vpn"` - System system.System `json:"system"` -} - -// Clone TODO find a better way to deep copy -func (c *Config) Clone() *Config { - data, err := json.Marshal(c) - if err != nil { - panic(fmt.Errorf("Marshal Error: %w", err)) - } - var clone Config - err = json.Unmarshal(data, &clone) - if err != nil { - panic(fmt.Errorf("Unmarshal Error: %w", err)) - } - return &clone -} - -func ValidateConfig(conf *Config) error { - return validation.ValidateConfig(*conf) -} diff --git a/internal/definitions/firewall/destination_nat.go b/internal/definitions/firewall/destination_nat.go deleted file mode 100644 index 54cae2e..0000000 --- a/internal/definitions/firewall/destination_nat.go +++ /dev/null @@ -1,7 +0,0 @@ -package firewall - -type DestinationNATRule struct { - Rule - Address *string `json:"address,omitempty"` - Service *string `json:"service,omitempty"` -} diff --git a/internal/definitions/firewall/firewall.go b/internal/definitions/firewall/firewall.go deleted file mode 100644 index 419d9e7..0000000 --- a/internal/definitions/firewall/firewall.go +++ /dev/null @@ -1,7 +0,0 @@ -package firewall - -type Firewall struct { - ForwardRules []ForwardRule `json:"forward_rules"` - DestinationNATRules []DestinationNATRule `json:"destination_nat_rules"` - SourceNATRules []SourceNATRule `json:"source_nat_rules"` -} diff --git a/internal/definitions/firewall/match.go b/internal/definitions/firewall/match.go deleted file mode 100644 index be92fb4..0000000 --- a/internal/definitions/firewall/match.go +++ /dev/null @@ -1,7 +0,0 @@ -package firewall - -type Match struct { - Services []string `json:"services,omitempty"` - SourceAddresses []string `json:"source_addresses,omitempty"` - DestinationAddresses []string `json:"destination_addresses,omitempty"` -} diff --git a/internal/definitions/firewall/rule.go b/internal/definitions/firewall/rule.go deleted file mode 100644 index 21f9d9e..0000000 --- a/internal/definitions/firewall/rule.go +++ /dev/null @@ -1,49 +0,0 @@ -package firewall - -import "encoding/json" - -type Rule struct { - Name string `json:"name"` - Match Match `json:"match"` - Comment string `json:"comment,omitempty"` - Counter bool `json:"counter,omitempty"` -} - -type ForwardRule struct { - Rule - Verdict Verdict `json:"verdict"` -} - -type Verdict int - -const ( - Accept Verdict = iota - Drop - Continue -) - -func (t Verdict) String() string { - return [...]string{"accept", "drop", "continue"}[t] -} - -func (t *Verdict) FromString(input string) Verdict { - return map[string]Verdict{ - "accept": Accept, - "drop": Drop, - "continue": Continue, - }[input] -} - -func (t Verdict) MarshalJSON() ([]byte, error) { - return json.Marshal(t.String()) -} - -func (t *Verdict) UnmarshalJSON(b []byte) error { - var s string - err := json.Unmarshal(b, &s) - if err != nil { - return err - } - *t = t.FromString(s) - return nil -} diff --git a/internal/definitions/firewall/source_nat.go b/internal/definitions/firewall/source_nat.go deleted file mode 100644 index 0d41a4f..0000000 --- a/internal/definitions/firewall/source_nat.go +++ /dev/null @@ -1,42 +0,0 @@ -package firewall - -import "encoding/json" - -type SourceNATRule struct { - Rule - Type SnatType `json:"type"` - Address *string `json:"address,omitempty"` - Service *string `json:"service,omitempty"` -} - -type SnatType int - -const ( - Snat SnatType = iota - Masquerade -) - -func (t SnatType) String() string { - return [...]string{"snat", "masquerade"}[t] -} - -func (t *SnatType) FromString(input string) SnatType { - return map[string]SnatType{ - "snat": Snat, - "masquerade": Masquerade, - }[input] -} - -func (t SnatType) MarshalJSON() ([]byte, error) { - return json.Marshal(t.String()) -} - -func (t *SnatType) UnmarshalJSON(b []byte) error { - var s string - err := json.Unmarshal(b, &s) - if err != nil { - return err - } - *t = t.FromString(s) - return nil -} diff --git a/internal/definitions/network/interface.go b/internal/definitions/network/interface.go deleted file mode 100644 index 2d67dac..0000000 --- a/internal/definitions/network/interface.go +++ /dev/null @@ -1,90 +0,0 @@ -package network - -import ( - "encoding/json" - "net/netip" -) - -type Interface struct { - Alias string `json:"alias,omitempty"` - Type InterfaceType `json:"type"` - AddressingMode InterfaceAddressingMode `json:"addressing_mode"` - Address *netip.Prefix `json:"address,omitempty"` - HardwareDevice *string `json:"hardware_device,omitempty"` - // TODO fix Validator for int pointers with min=0,max=4094 - VlanID *uint `json:"vlan_id,omitempty"` - VlanParent *string `json:"vlan_parent,omitempty"` - BondMembers *[]string `json:"bond_members,omitempty"` - BridgeMembers *[]string `json:"bridge_members,omitempty"` - Comment string `json:"comment,omitempty"` -} - -type InterfaceType int - -const ( - Hardware InterfaceType = iota - Vlan - Bond - Bridge -) - -func (t InterfaceType) String() string { - return [...]string{"hardware", "vlan", "bond", "bridge"}[t] -} - -func (t *InterfaceType) FromString(input string) InterfaceType { - return map[string]InterfaceType{ - "hardware": Hardware, - "vlan": Vlan, - "bond": Bond, - "bridge": Bridge, - }[input] -} - -func (t InterfaceType) MarshalJSON() ([]byte, error) { - return json.Marshal(t.String()) -} - -func (t *InterfaceType) UnmarshalJSON(b []byte) error { - var s string - err := json.Unmarshal(b, &s) - if err != nil { - return err - } - *t = t.FromString(s) - return nil -} - -type InterfaceAddressingMode int - -const ( - None InterfaceAddressingMode = iota - Static - Dhcp -) - -func (t InterfaceAddressingMode) String() string { - return [...]string{"none", "static", "dhcp"}[t] -} - -func (t *InterfaceAddressingMode) FromString(input string) InterfaceAddressingMode { - return map[string]InterfaceAddressingMode{ - "none": None, - "static": Static, - "dhcp": Dhcp, - }[input] -} - -func (t InterfaceAddressingMode) MarshalJSON() ([]byte, error) { - return json.Marshal(t.String()) -} - -func (t *InterfaceAddressingMode) UnmarshalJSON(b []byte) error { - var s string - err := json.Unmarshal(b, &s) - if err != nil { - return err - } - *t = t.FromString(s) - return nil -} diff --git a/internal/definitions/network/network.go b/internal/definitions/network/network.go deleted file mode 100644 index 036a1ab..0000000 --- a/internal/definitions/network/network.go +++ /dev/null @@ -1,6 +0,0 @@ -package network - -type Network struct { - Interfaces map[string]Interface `json:"interfaces"` - StaticRoutes []StaticRoute `json:"static_routes"` -} diff --git a/internal/definitions/network/static_route.go b/internal/definitions/network/static_route.go deleted file mode 100644 index c2ce9a2..0000000 --- a/internal/definitions/network/static_route.go +++ /dev/null @@ -1,13 +0,0 @@ -package network - -import ( - "net/netip" -) - -type StaticRoute struct { - Name string `json:"name,omitempty"` - Interface string `json:"interface,omitempty"` - Gateway netip.Addr `json:"gateway,omitempty"` - Destination netip.Prefix `json:"destination,omitempty"` - Metric uint `json:"metric,omitempty"` -} diff --git a/internal/definitions/object/address.go b/internal/definitions/object/address.go deleted file mode 100644 index 94a2dcb..0000000 --- a/internal/definitions/object/address.go +++ /dev/null @@ -1,53 +0,0 @@ -package object - -import ( - "encoding/json" - "net/netip" - - "go4.org/netipx" -) - -type Address struct { - Type AddressType `json:"type"` - Comment string `json:"comment,omitempty"` - Host *netip.Addr `json:"host,omitempty"` - Range *netipx.IPRange `json:"range,omitempty"` - NetworkAddress *netip.Prefix `json:"network,omitempty"` - Children *[]string `json:"children,omitempty"` -} - -type AddressType int - -const ( - Host AddressType = iota - Range - NetworkAddress - AddressGroup -) - -func (t AddressType) String() string { - return [...]string{"host", "range", "network", "group"}[t] -} - -func (t *AddressType) FromString(input string) AddressType { - return map[string]AddressType{ - "host": Host, - "range": Range, - "network": NetworkAddress, - "group": AddressGroup, - }[input] -} - -func (t AddressType) MarshalJSON() ([]byte, error) { - return json.Marshal(t.String()) -} - -func (t *AddressType) UnmarshalJSON(b []byte) error { - var s string - err := json.Unmarshal(b, &s) - if err != nil { - return err - } - *t = t.FromString(s) - return nil -} diff --git a/internal/definitions/object/object.go b/internal/definitions/object/object.go deleted file mode 100644 index ef9a16b..0000000 --- a/internal/definitions/object/object.go +++ /dev/null @@ -1,6 +0,0 @@ -package object - -type Object struct { - Addresses map[string]Address `json:"addresses"` - Services map[string]Service `json:"services"` -} diff --git a/internal/definitions/object/service.go b/internal/definitions/object/service.go deleted file mode 100644 index 7afc2e3..0000000 --- a/internal/definitions/object/service.go +++ /dev/null @@ -1,71 +0,0 @@ -package object - -import ( - "encoding/json" - "fmt" -) - -type Service struct { - Type ServiceType `json:"type"` - Comment string `json:"comment,omitempty"` - SPortStart *uint32 `json:"sport_start,omitempty"` - SPortEnd *uint32 `json:"sport_end,omitempty"` - DPortStart *uint32 `json:"dport_start,omitempty"` - DPortEnd *uint32 `json:"dport_end,omitempty"` - ICMPCode *uint32 `json:"icmp_code,omitempty"` - Children *[]string `json:"children,omitempty"` -} - -func (s Service) GetSPort() string { - if s.SPortStart == nil || *s.SPortStart == 0 { - return "" - } else if s.SPortEnd == nil || *s.SPortEnd == 0 { - return fmt.Sprintf("%d", *s.SPortStart) - } - return fmt.Sprintf("%d - %d", *s.SPortStart, *s.SPortEnd) -} - -func (s Service) GetDPort() string { - if s.DPortStart == nil || *s.DPortStart == 0 { - return "" - } else if s.DPortEnd == nil || *s.DPortEnd == 0 { - return fmt.Sprintf("%d", *s.DPortStart) - } - return fmt.Sprintf("%d - %d", *s.DPortStart, *s.DPortEnd) -} - -type ServiceType int - -const ( - TCP ServiceType = iota - UDP - ICMP - ServiceGroup -) - -func (t ServiceType) String() string { - return [...]string{"tcp", "udp", "icmp", "group"}[t] -} - -func (t *ServiceType) FromString(input string) ServiceType { - return map[string]ServiceType{ - "tcp": TCP, - "udp": UDP, - "icmp": ICMP, - "group": ServiceGroup, - }[input] -} - -func (t ServiceType) MarshalJSON() ([]byte, error) { - return json.Marshal(t.String()) -} - -func (t *ServiceType) UnmarshalJSON(b []byte) error { - var s string - err := json.Unmarshal(b, &s) - if err != nil { - return err - } - *t = t.FromString(s) - return nil -} diff --git a/internal/definitions/service/dhcp_v4_server.go b/internal/definitions/service/dhcp_v4_server.go deleted file mode 100644 index 35ccd52..0000000 --- a/internal/definitions/service/dhcp_v4_server.go +++ /dev/null @@ -1,21 +0,0 @@ -package service - -import "nfsense.net/nfsense/internal/definitions/common" - -type DHCPv4Server struct { - Interface string `json:"interface"` - Pool []string `json:"pool"` - DefaultLeaseTime common.Duration `json:"default_lease_time"` - MaxLeaseTime common.Duration `json:"max_lease_time"` - - GatewayMode Mode `json:"gateway_mode"` - Gateway *string `json:"gateway,omitempty"` - DNSServerMode Mode `json:"dns_server_mode"` - DNSServers *[]string `json:"dns_servers,omitempty"` - NTPServerMode Mode `json:"ntp_server_mode"` - NTPServers *[]string `json:"ntp_servers,omitempty"` - - Reservations map[string]Reservation `json:"reservations"` - - Comment string `json:"comment,omitempty"` -} diff --git a/internal/definitions/service/dhcp_v6_server.go b/internal/definitions/service/dhcp_v6_server.go deleted file mode 100644 index 7834c29..0000000 --- a/internal/definitions/service/dhcp_v6_server.go +++ /dev/null @@ -1,21 +0,0 @@ -package service - -import "nfsense.net/nfsense/internal/definitions/common" - -type DHCPv6Server struct { - Interface string `json:"interface"` - Pool []string `json:"pool"` - DefaultLeaseTime common.Duration `json:"default_lease_time"` - MaxLeaseTime common.Duration `json:"max_lease_time"` - - GatewayMode Mode `json:"gateway_mode"` - Gateway *string `json:"gateway,omitempty"` - DNSServerMode Mode `json:"dns_server_mode"` - DNSServers *[]string `json:"dns_servers,omitempty"` - NTPServerMode Mode `json:"ntp_server_mode"` - NTPServers *[]string `json:"ntp_servers,omitempty"` - - Reservations map[string]Reservation `json:"reservations"` - - Comment string `json:"comment,omitempty"` -} diff --git a/internal/definitions/service/dns_server.go b/internal/definitions/service/dns_server.go deleted file mode 100644 index efdc690..0000000 --- a/internal/definitions/service/dns_server.go +++ /dev/null @@ -1,6 +0,0 @@ -package service - -type DNSServer struct { - Interface string `json:"interface"` - Comment string `json:"comment,omitempty"` -} diff --git a/internal/definitions/service/mode.go b/internal/definitions/service/mode.go deleted file mode 100644 index c5168c4..0000000 --- a/internal/definitions/service/mode.go +++ /dev/null @@ -1,37 +0,0 @@ -package service - -import "encoding/json" - -type Mode int - -const ( - None Mode = iota - Interface - Specify -) - -func (t Mode) String() string { - return [...]string{"none", "interface", "specify"}[t] -} - -func (t *Mode) FromString(input string) Mode { - return map[string]Mode{ - "none": None, - "interface": Interface, - "specify": Specify, - }[input] -} - -func (t Mode) MarshalJSON() ([]byte, error) { - return json.Marshal(t.String()) -} - -func (t *Mode) UnmarshalJSON(b []byte) error { - var s string - err := json.Unmarshal(b, &s) - if err != nil { - return err - } - *t = t.FromString(s) - return nil -} diff --git a/internal/definitions/service/ntp_server.go b/internal/definitions/service/ntp_server.go deleted file mode 100644 index 513da23..0000000 --- a/internal/definitions/service/ntp_server.go +++ /dev/null @@ -1,6 +0,0 @@ -package service - -type NTPServer struct { - Interface string `json:"interface"` - Comment string `json:"comment,omitempty"` -} diff --git a/internal/definitions/service/reservation.go b/internal/definitions/service/reservation.go deleted file mode 100644 index 8c5665f..0000000 --- a/internal/definitions/service/reservation.go +++ /dev/null @@ -1,12 +0,0 @@ -package service - -import ( - "net/netip" - - "nfsense.net/nfsense/internal/definitions/common" -) - -type Reservation struct { - HardwareAddress common.HardwareAddress - IPAddress netip.Addr -} diff --git a/internal/definitions/service/service.go b/internal/definitions/service/service.go deleted file mode 100644 index ebf7811..0000000 --- a/internal/definitions/service/service.go +++ /dev/null @@ -1,8 +0,0 @@ -package service - -type Service struct { - DHCPv4Servers []DHCPv4Server `json:"dhcp_v4_servers"` - DHCPv6Servers []DHCPv6Server `json:"dhcp_v6_servers"` - DNSServers []DNSServer `json:"dns_servers"` - NTPServers []NTPServer `json:"ntp_servers"` -} diff --git a/internal/definitions/system/system.go b/internal/definitions/system/system.go deleted file mode 100644 index f5c1f35..0000000 --- a/internal/definitions/system/system.go +++ /dev/null @@ -1,5 +0,0 @@ -package system - -type System struct { - Users map[string]User `json:"users"` -} diff --git a/internal/definitions/system/user.go b/internal/definitions/system/user.go deleted file mode 100644 index c8e0081..0000000 --- a/internal/definitions/system/user.go +++ /dev/null @@ -1,7 +0,0 @@ -package system - -type User struct { - Comment string `json:"comment"` - Hash string `json:"hash"` - Salt string `json:"salt"` -} diff --git a/internal/definitions/vpn/interface.go b/internal/definitions/vpn/interface.go deleted file mode 100644 index 8963aaa..0000000 --- a/internal/definitions/vpn/interface.go +++ /dev/null @@ -1,9 +0,0 @@ -package vpn - -type WireguardInterface struct { - PublicKey string `json:"public_key"` - PrivateKey string `json:"private_key"` - ListenPort uint64 `json:"listen_port"` - Peers []string `json:"peers"` - Comment string `json:"comment,omitempty"` -} diff --git a/internal/definitions/vpn/peer.go b/internal/definitions/vpn/peer.go deleted file mode 100644 index d043932..0000000 --- a/internal/definitions/vpn/peer.go +++ /dev/null @@ -1,10 +0,0 @@ -package vpn - -type WireguardPeer struct { - PublicKey string `json:"public_key"` - PresharedKey *string `json:"preshared_key,omitempty"` - AllowedIPs []string `json:"allowed_ips"` - Endpoint *string `json:"endpoint,omitempty"` - PersistentKeepalive *uint64 `json:"persistent_keepalive,omitempty"` - Comment string `json:"comment,omitempty"` -} diff --git a/internal/definitions/vpn/vpn.go b/internal/definitions/vpn/vpn.go deleted file mode 100644 index 18beeaa..0000000 --- a/internal/definitions/vpn/vpn.go +++ /dev/null @@ -1,5 +0,0 @@ -package vpn - -type VPN struct { - Wireguard Wireguard `json:"wireguard"` -} diff --git a/internal/definitions/vpn/wireguard.go b/internal/definitions/vpn/wireguard.go deleted file mode 100644 index 8f768d6..0000000 --- a/internal/definitions/vpn/wireguard.go +++ /dev/null @@ -1,6 +0,0 @@ -package vpn - -type Wireguard struct { - Interfaces map[string]WireguardInterface `json:"interfaces"` - Peers map[string]WireguardPeer `json:"peers"` -} diff --git a/internal/dhcp_server/apply.go b/internal/dhcp_server/apply.go deleted file mode 100644 index 8665211..0000000 --- a/internal/dhcp_server/apply.go +++ /dev/null @@ -1,65 +0,0 @@ -package dhcp - -import ( - "context" - "fmt" - - systemctl "github.com/coreos/go-systemd/v22/dbus" - "nfsense.net/nfsense/internal/definitions/config" - "nfsense.net/nfsense/internal/util" -) - -const dhcpv4File = "/etc/dhcp/dhcpd.conf" -const dhcpv6File = "/etc/dhcp/dhcpd6.conf" - -func ApplyDHCPServerConfiguration(currentConfig config.Config, pendingConfig config.Config) error { - - v4Conf, err := GenerateDHCPServerV4Configuration(pendingConfig) - if err != nil { - return fmt.Errorf("Generating DHCPServerV4 Configuration: %w", err) - } - - v6Conf, err := GenerateDHCPServerV6Configuration(pendingConfig) - if err != nil { - return fmt.Errorf("Generating DHCPServerV6 Configuration: %w", err) - } - - err = util.OverwriteFile(dhcpv4File, v4Conf) - if err != nil { - return fmt.Errorf("Writing v4 Configuration: %w", err) - } - - err = util.OverwriteFile(dhcpv6File, v6Conf) - if err != nil { - return fmt.Errorf("Writing v6 Configuration: %w", err) - } - - conn, err := systemctl.NewSystemConnectionContext(context.Background()) - if err != nil { - return fmt.Errorf("Opening Dbus Connection: %w", err) - } - - if len(pendingConfig.Service.DHCPv4Servers) == 0 && len(pendingConfig.Service.DHCPv6Servers) == 0 { - // if there are no servers stop the service instead - _, err := conn.StopUnitContext(context.Background(), "dhcpd.service", "replace", nil) - if err != nil { - return fmt.Errorf("stopping dhcpd.service: %w", err) - } - - _, err = conn.DisableUnitFilesContext(context.Background(), []string{"dhcpd.service"}, false) - if err != nil { - return fmt.Errorf("disableing dhcpd.service: %w", err) - } - } else { - _, err := conn.ReloadOrRestartUnitContext(context.Background(), "dhcpd.service", "replace", nil) - if err != nil { - return fmt.Errorf("restarting dhcpd.service: %w", err) - } - - _, _, err = conn.EnableUnitFilesContext(context.Background(), []string{"dhcpd.service"}, false, true) - if err != nil { - return fmt.Errorf("enableing dhcpd.service: %w", err) - } - } - return nil -} diff --git a/internal/dhcp_server/dhcpv4.go b/internal/dhcp_server/dhcpv4.go deleted file mode 100644 index 64c1fb8..0000000 --- a/internal/dhcp_server/dhcpv4.go +++ /dev/null @@ -1,17 +0,0 @@ -package dhcp - -import ( - "bytes" - "fmt" - - "nfsense.net/nfsense/internal/definitions/config" -) - -func GenerateDHCPServerV4Configuration(conf config.Config) (string, error) { - buf := new(bytes.Buffer) - err := templates.ExecuteTemplate(buf, "v4_config.tmpl", conf) - if err != nil { - return "", fmt.Errorf("executing config.tmpl template: %w", err) - } - return buf.String(), nil -} diff --git a/internal/dhcp_server/dhcpv6.go b/internal/dhcp_server/dhcpv6.go deleted file mode 100644 index 1ba550c..0000000 --- a/internal/dhcp_server/dhcpv6.go +++ /dev/null @@ -1,17 +0,0 @@ -package dhcp - -import ( - "bytes" - "fmt" - - "nfsense.net/nfsense/internal/definitions/config" -) - -func GenerateDHCPServerV6Configuration(conf config.Config) (string, error) { - buf := new(bytes.Buffer) - err := templates.ExecuteTemplate(buf, "v6_config.tmpl", conf) - if err != nil { - return "", fmt.Errorf("executing config.tmpl template: %w", err) - } - return buf.String(), nil -} diff --git a/internal/dhcp_server/template.go b/internal/dhcp_server/template.go deleted file mode 100644 index ac0b671..0000000 --- a/internal/dhcp_server/template.go +++ /dev/null @@ -1,107 +0,0 @@ -package dhcp - -import ( - "embed" - "fmt" - "net" - "net/netip" - "strconv" - "strings" - "text/template" - - "nfsense.net/nfsense/internal/definitions/common" - "nfsense.net/nfsense/internal/definitions/config" - "nfsense.net/nfsense/internal/util" -) - -//go:embed template -var templateFS embed.FS -var templates *template.Template - -func init() { - var err error - templates, err = template.New("").Funcs(template.FuncMap{ - "getInterfaceAddress": getInterfaceAddress, - "getInterfaceNetworkAddress": getInterfaceNetworkAddress, - "getInterfaceBroadcastAddress": getInterfaceBroadcastAddress, - "getInterfaceNetworkMask": getInterfaceNetworkMask, - "getAddressObjectsAsCommaList": getAddressObjectsAsCommaList, - "getAddressObjectAsPoolRange": getAddressObjectAsPoolRange, - "getTimeInSecond": getTimeInSecond, - }).ParseFS(templateFS, "template/*.tmpl") - if err != nil { - panic(err) - } -} - -func getInterfaceAddress(conf config.Config, name string) string { - return conf.Network.Interfaces[name].Address.Addr().String() -} - -func getInterfaceNetworkAddress(conf config.Config, name string) string { - return conf.Network.Interfaces[name].Address.Masked().Addr().String() -} - -func getInterfaceBroadcastAddress(conf config.Config, name string) string { - return util.BroadcastAddr(prefix2IPNet(*conf.Network.Interfaces[name].Address)).String() -} - -func getInterfaceNetworkMask(conf config.Config, name string) string { - return NetMaskToString(conf.Network.Interfaces[name].Address.Bits()) -} - -func getAddressObjectsAsCommaList(conf config.Config, names []string) string { - res := "" - for i, name := range names { - res = res + conf.Object.Addresses[name].Host.String() - if len(names)-1 != i { - res = res + ", " - } - } - return res -} - -func getAddressObjectAsPoolRange(conf config.Config, name string) string { - // TODO - return strings.ReplaceAll(conf.Object.Addresses[name].Range.String(), "-", " ") -} - -func getTimeInSecond(dur common.Duration) string { - return fmt.Sprintf("%d", int(dur.Seconds())) -} - -func prefix2IPNet(prefix netip.Prefix) net.IPNet { - addr := prefix.Addr() // extract the address portion of the prefix - pLen := 128 // plen is the total size of the subnet mask - if addr.Is4() { - pLen = 32 - } - ones := prefix.Bits() // ones is the portion of the mask that's set - ip := net.IP(addr.AsSlice()) // convert the address portion to net.IP - mask := net.CIDRMask(ones, pLen) // create a net.IPMask - return net.IPNet{ // and construct the final IPNet - IP: ip, - Mask: mask, - } -} - -func NetMaskToString(mask int) string { - var binarystring string - - for ii := 1; ii <= mask; ii++ { - binarystring = binarystring + "1" - } - for ii := 1; ii <= (32 - mask); ii++ { - binarystring = binarystring + "0" - } - oct1 := binarystring[0:8] - oct2 := binarystring[8:16] - oct3 := binarystring[16:24] - oct4 := binarystring[24:] - - ii1, _ := strconv.ParseInt(oct1, 2, 64) - ii2, _ := strconv.ParseInt(oct2, 2, 64) - ii3, _ := strconv.ParseInt(oct3, 2, 64) - ii4, _ := strconv.ParseInt(oct4, 2, 64) - return strconv.Itoa(int(ii1)) + "." + strconv.Itoa(int(ii2)) + "." + strconv.Itoa(int(ii3)) + "." + strconv.Itoa(int(ii4)) -} diff --git a/internal/dhcp_server/template/v4_config.tmpl b/internal/dhcp_server/template/v4_config.tmpl deleted file mode 100644 index 33cdec4..0000000 --- a/internal/dhcp_server/template/v4_config.tmpl +++ /dev/null @@ -1,46 +0,0 @@ -# Global Options -authoritative; -deny bootp; -deny declines; -one-lease-per-client on; - -# Servers -{{- range $i, $server := .Service.DHCPv4Servers }} -subnet {{ getInterfaceNetworkAddress $ $server.Interface }} netmask {{ getInterfaceNetworkMask $ $server.Interface }} { - # Pool - {{- range $j, $p := $server.Pool }} - range {{ getAddressObjectAsPoolRange $ $p }}; - {{- end}} - - # Settings - default-lease-time {{ getTimeInSecond $server.DefaultLeaseTime }}; - max-lease-time {{ getTimeInSecond $server.MaxLeaseTime }}; - - # Options - option subnet-mask {{ getInterfaceNetworkMask $ $server.Interface }}; - option broadcast-address {{ getInterfaceBroadcastAddress $ $server.Interface }}; - {{- if eq $server.GatewayMode 1 }} - option routers {{ getInterfaceAddress $ $server.Interface }}; - {{- else if eq $server.GatewayMode 2 }} - option routers {{ $server.Gateway }}; - {{- end }} - {{- if eq $server.DNSServerMode 1 }} - option domain-name-servers {{ getInterfaceAddress $ $server.Interface }}; - {{- else if eq $server.DNSServerMode 2 }} - option domain-name-servers {{ getAddressObjectsAsCommaList $ $server.DNSServers }}; - {{- end }} - {{- if eq $server.NTPServerMode 1 }} - option time-servers {{ getInterfaceAddress $ $server.Interface }}; - {{- else if eq $server.NTPServerMode 2 }} - option time-servers {{ getAddressObjectsAsCommaList $ $server.NTPServers }}; - {{- end }} - - # Hosts - {{- range $j, $reservation := $server.Reservations }} - host {{ $j }} { - hardware ethernet $reservation.HardwareAddress; - fixed-address $reservation.IPAddress; - } - {{end}} -} -{{end}} \ No newline at end of file diff --git a/internal/dhcp_server/template/v6_config.tmpl b/internal/dhcp_server/template/v6_config.tmpl deleted file mode 100644 index e69de29..0000000 diff --git a/internal/jsonrpc/error.go b/internal/jsonrpc/error.go deleted file mode 100644 index a50bea9..0000000 --- a/internal/jsonrpc/error.go +++ /dev/null @@ -1,37 +0,0 @@ -package jsonrpc - -import ( - "io" -) - -type ErrorCode int - -const ( - ErrParse ErrorCode = -32700 - ErrInvalidRequest ErrorCode = -32600 - ErrMethodNotFound ErrorCode = -32601 - ErrInvalidParams ErrorCode = -32602 - ErrInternalError ErrorCode = -32603 - - // Custom - ErrRequestError ErrorCode = -32000 -) - -type respError struct { - Code ErrorCode `json:"code"` - Message string `json:"message"` - // cannot be omitempty because of frontend library - Data any `json:"data"` -} - -func respondError(w io.Writer, id any, code ErrorCode, err error) error { - respond(w, response{ - Jsonrpc: "2.0", - ID: id, - Error: &respError{ - Code: code, - Message: err.Error(), - }, - }) - return err -} diff --git a/internal/jsonrpc/handler.go b/internal/jsonrpc/handler.go deleted file mode 100644 index d047895..0000000 --- a/internal/jsonrpc/handler.go +++ /dev/null @@ -1,100 +0,0 @@ -package jsonrpc - -import ( - "bytes" - "context" - "encoding/json" - "fmt" - "io" - "reflect" - "runtime/debug" - - "golang.org/x/exp/slog" - "nfsense.net/nfsense/internal/session" -) - -type Handler struct { - methods map[string]method - - maxRequestSize int64 -} - -func NewHandler(maxRequestSize int64) *Handler { - return &Handler{ - methods: map[string]method{}, - maxRequestSize: maxRequestSize, - } -} - -func (h *Handler) HandleRequest(ctx context.Context, s *session.Session, r io.Reader, w io.Writer) error { - defer func() { - if r := recover(); r != nil { - slog.Error("Recovered Panic Handling JSONRPC Request", "err", fmt.Errorf("%v", r), "stack", debug.Stack()) - } - }() - var req request - bufferedRequest := new(bytes.Buffer) - reqSize, err := bufferedRequest.ReadFrom(io.LimitReader(r, h.maxRequestSize+1)) - if err != nil { - return respondError(w, "", ErrInternalError, fmt.Errorf("Reading Request: %w", err)) - } - if reqSize > h.maxRequestSize { - return respondError(w, "", ErrParse, fmt.Errorf("Request exceeds Max Request Size")) - } - - dec := json.NewDecoder(bufferedRequest) - dec.DisallowUnknownFields() - err = dec.Decode(&req) - if err != nil { - return respondError(w, "", ErrParse, fmt.Errorf("Decodeing Request: %w", err)) - } - - if req.Jsonrpc != "2.0" { - return respondError(w, req.ID, ErrMethodNotFound, fmt.Errorf("Unsupported Jsonrpc version %v", req.Jsonrpc)) - } - - if s == nil { - return respondError(w, req.ID, 401, fmt.Errorf("Unauthorized")) - } - - method, ok := h.methods[req.Method] - if !ok { - return respondError(w, req.ID, ErrMethodNotFound, fmt.Errorf("Unknown Method %v", req.Method)) - } - - p := reflect.New(method.inType) - paramPointer := p.Interface() - - if len(req.Params) != 0 { - dec = json.NewDecoder(bytes.NewReader(req.Params)) - dec.DisallowUnknownFields() - err = dec.Decode(paramPointer) - if err != nil { - return respondError(w, req.ID, ErrInvalidParams, fmt.Errorf("Decoding Parameters: %w", err)) - } - } - - params := make([]reflect.Value, 3) - params[0] = method.subSystem - params[1] = reflect.ValueOf(ctx) - params[2] = reflect.ValueOf(paramPointer).Elem() - - defer func() { - if r := recover(); r != nil { - slog.Error("Recovered Panic Executing API Method", "err", fmt.Errorf("%v", r), "method", req.Method, "params", fmt.Sprintf("%+v", params[2]), "id", req.ID, "stack", debug.Stack()) - respondError(w, req.ID, ErrInternalError, fmt.Errorf("%v", r)) - } - }() - res := method.handlerFunc.Call(params) - result := res[0].Interface() - - if !res[1].IsNil() { - reqerr := res[1].Interface().(error) - slog.Error("API Method", "err", reqerr, "method", req.Method, "id", req.ID, "params", fmt.Sprintf("%+v", params[2])) - respondError(w, req.ID, ErrInternalError, reqerr) - return nil - } - - respondResult(w, req.ID, result) - return nil -} diff --git a/internal/jsonrpc/method.go b/internal/jsonrpc/method.go deleted file mode 100644 index f96ff40..0000000 --- a/internal/jsonrpc/method.go +++ /dev/null @@ -1,10 +0,0 @@ -package jsonrpc - -import "reflect" - -type method struct { - subSystem reflect.Value - handlerFunc reflect.Value - inType reflect.Type - outType reflect.Type -} diff --git a/internal/jsonrpc/register.go b/internal/jsonrpc/register.go deleted file mode 100644 index 3abca51..0000000 --- a/internal/jsonrpc/register.go +++ /dev/null @@ -1,46 +0,0 @@ -package jsonrpc - -import ( - "context" - "fmt" - "reflect" -) - -func (h *Handler) Register(subSystemName string, s any) { - subSystem := reflect.ValueOf(s) - - for i := 0; i < subSystem.NumMethod(); i++ { - m := subSystem.Type().Method(i) - - funcType := m.Func.Type() - - if funcType.NumIn() != 3 { - panic(fmt.Errorf("2 parameters are required %v", funcType.NumIn())) - } - if funcType.In(1) != reflect.TypeOf(new(context.Context)).Elem() { - panic(fmt.Errorf("the first argument needs to be a context.Context instead of %v ", funcType.In(1))) - } - if funcType.In(2).Kind() != reflect.Struct { - panic("the second argument needs to be a struct") - } - - if funcType.NumOut() != 2 { - panic("2 return types are required") - } - if reflect.TypeOf(new(error)).Implements(funcType.Out(1)) { - panic("the second return type needs to be a error") - } - - name := m.Name - if subSystemName != "" { - name = subSystemName + "." + name - } - - h.methods[name] = method{ - handlerFunc: m.Func, - subSystem: subSystem, - inType: funcType.In(2), - outType: funcType.Out(0), - } - } -} diff --git a/internal/jsonrpc/request.go b/internal/jsonrpc/request.go deleted file mode 100644 index f334d46..0000000 --- a/internal/jsonrpc/request.go +++ /dev/null @@ -1,10 +0,0 @@ -package jsonrpc - -import "encoding/json" - -type request struct { - Jsonrpc string `json:"jsonrpc"` - ID any `json:"id,omitempty"` - Method string `json:"method"` - Params json.RawMessage `json:"params"` -} diff --git a/internal/jsonrpc/response.go b/internal/jsonrpc/response.go deleted file mode 100644 index 162ef30..0000000 --- a/internal/jsonrpc/response.go +++ /dev/null @@ -1,30 +0,0 @@ -package jsonrpc - -import ( - "encoding/json" - "io" - - "golang.org/x/exp/slog" -) - -type response struct { - Jsonrpc string `json:"jsonrpc"` - Result any `json:"result,omitempty"` - ID any `json:"id"` - Error *respError `json:"error,omitempty"` -} - -func respond(w io.Writer, resp response) { - err := json.NewEncoder(w).Encode(resp) - if err != nil { - slog.Warn("write response", "err", err) - } -} - -func respondResult(w io.Writer, id, res any) { - respond(w, response{ - Jsonrpc: "2.0", - ID: id, - Result: res, - }) -} diff --git a/internal/networkd/apply.go b/internal/networkd/apply.go deleted file mode 100644 index cca679d..0000000 --- a/internal/networkd/apply.go +++ /dev/null @@ -1,76 +0,0 @@ -package networkd - -import ( - "bytes" - "fmt" - "os" - "os/exec" - "path/filepath" - - "golang.org/x/exp/slog" - "nfsense.net/nfsense/internal/definitions/config" -) - -const basepath = "/etc/systemd/network" - -func ApplyNetworkdConfiguration(currentConfig config.Config, pendingConfig config.Config) error { - files, err := GenerateNetworkdConfiguration(pendingConfig) - if err != nil { - return fmt.Errorf("Generating Networkd Configuration: %w", err) - } - - err = RemoveContents(basepath) - if err != nil { - return fmt.Errorf("Removing old Config Files: %w", err) - } - - for _, file := range files { - f, err := os.Create(basepath + "/" + file.Name) - if err != nil { - return fmt.Errorf("creating File: %w", err) - } - - _, err = f.WriteString(file.Content + "\n") - if err != nil { - return fmt.Errorf("writing File: %w", err) - } - - err = f.Sync() - if err != nil { - return fmt.Errorf("syncing File: %w", err) - } - } - - // TODO Use dbus instead - cmd := exec.Command("systemctl", "restart", "systemd-networkd") - - var out bytes.Buffer - cmd.Stdout = &out - - err = cmd.Run() - if err != nil { - return fmt.Errorf("restarting networkd: %w", err) - } - slog.Info("networkd output", "out", out.String()) - - return nil -} - -func RemoveContents(dir string) error { - d, err := os.Open(dir) - if err != nil { - return err - } - defer d.Close() - names, err := d.Readdirnames(-1) - if err != nil { - return err - } - for _, name := range names { - err = os.RemoveAll(filepath.Join(dir, name)) - if err != nil { - return err - } - } - return nil -} diff --git a/internal/networkd/configuration.go b/internal/networkd/configuration.go deleted file mode 100644 index b13e648..0000000 --- a/internal/networkd/configuration.go +++ /dev/null @@ -1,192 +0,0 @@ -package networkd - -import ( - "bytes" - "fmt" - - "golang.org/x/exp/slog" - "nfsense.net/nfsense/internal/definitions/config" - "nfsense.net/nfsense/internal/definitions/network" -) - -type NetworkdConfigFile struct { - Name string - Content string -} - -type InterfaceWithName struct { - Name string - network.Interface - Vlans []string - StaticRoutes []network.StaticRoute -} - -type BondMembership struct { - Name string - BondName string -} - -type BridgeMembership struct { - Name string - BridgeName string -} - -type NameAndConfig struct { - Name string - Config config.Config -} - -func GenerateNetworkdConfiguration(conf config.Config) ([]NetworkdConfigFile, error) { - files := []NetworkdConfigFile{} - - // Step 1 Generate vlan netdev files - for name, inter := range conf.Network.Interfaces { - if inter.Type == network.Vlan { - buf := new(bytes.Buffer) - err := templates.ExecuteTemplate(buf, "create-vlan.netdev.tmpl", InterfaceWithName{ - Name: name, - Interface: inter, - }) - if err != nil { - return nil, fmt.Errorf("executing create-vlan.netdev.tmpl template: %w", err) - } - files = append(files, NetworkdConfigFile{ - Name: fmt.Sprintf("10-create-vlan-%v.netdev", name), - Content: buf.String(), - }) - } - } - - // Step 2 Generate bond netdev files - for name, inter := range conf.Network.Interfaces { - if inter.Type == network.Bond { - buf := new(bytes.Buffer) - err := templates.ExecuteTemplate(buf, "create-bond.netdev.tmpl", InterfaceWithName{ - Name: name, - Interface: inter, - }) - if err != nil { - return nil, fmt.Errorf("executing create-bond.netdev.tmpl template: %w", err) - } - files = append(files, NetworkdConfigFile{ - Name: fmt.Sprintf("20-create-bond-%v.netdev", name), - Content: buf.String(), - }) - } - } - - // Step 3 Generate bridge netdev files - for name, inter := range conf.Network.Interfaces { - if inter.Type == network.Bridge { - buf := new(bytes.Buffer) - err := templates.ExecuteTemplate(buf, "create-bridge.netdev.tmpl", InterfaceWithName{ - Name: name, - Interface: inter, - }) - if err != nil { - return nil, fmt.Errorf("executing create-bridge.netdev.tmpl template: %w", err) - } - files = append(files, NetworkdConfigFile{ - Name: fmt.Sprintf("30-create-bridge-%v.netdev", name), - Content: buf.String(), - }) - } - } - - // Step 4 Generate wireguard netdev files - for name := range conf.VPN.Wireguard.Interfaces { - buf := new(bytes.Buffer) - err := templates.ExecuteTemplate(buf, "create-wireguard.netdev.tmpl", NameAndConfig{ - Name: name, - Config: conf, - }) - if err != nil { - return nil, fmt.Errorf("executing create-wireguard.netdev.tmpl template: %w", err) - } - files = append(files, NetworkdConfigFile{ - Name: fmt.Sprintf("40-create-wireguard-%v.netdev", name), - Content: buf.String(), - }) - } - - // Step 5 Generate Bond Members - for name, inter := range conf.Network.Interfaces { - if inter.Type == network.Bond && inter.BondMembers != nil { - for _, member := range *inter.BondMembers { - buf := new(bytes.Buffer) - err := templates.ExecuteTemplate(buf, "bond-membership.network.tmpl", BondMembership{ - Name: member, - BondName: name, - }) - if err != nil { - return nil, fmt.Errorf("executing bond-membership.network.tmpl template: %w", err) - } - files = append(files, NetworkdConfigFile{ - Name: fmt.Sprintf("50-bond-membership-%v.network", name), - Content: buf.String(), - }) - } - } - } - - // Step 6 Generate Bridge Members - for name, inter := range conf.Network.Interfaces { - if inter.Type == network.Bridge && inter.BridgeMembers != nil { - for _, member := range *inter.BridgeMembers { - buf := new(bytes.Buffer) - err := templates.ExecuteTemplate(buf, "bridge-membership.network.tmpl", BridgeMembership{ - Name: member, - BridgeName: name, - }) - if err != nil { - return nil, fmt.Errorf("executing bridge-membership.network.tmpl template: %w", err) - } - files = append(files, NetworkdConfigFile{ - Name: fmt.Sprintf("60-bridge-membership-%v.network", name), - Content: buf.String(), - }) - } - } - } - - // Step 7 Generate addressing network files - for name, inter := range conf.Network.Interfaces { - // Vlans - vlans := []string{} - if inter.Type != network.Vlan { - for vlanName, vlanInter := range conf.Network.Interfaces { - if vlanInter.Type == network.Vlan { - if *vlanInter.VlanParent == name { - vlans = append(vlans, vlanName) - } - } - } - slog.Info("Vlans on interface", "interface", name, "count", len(vlans)) - } - - // Static Routes - staticRoutes := []network.StaticRoute{} - for _, route := range conf.Network.StaticRoutes { - if route.Interface == name { - staticRoutes = append(staticRoutes, route) - } - } - - buf := new(bytes.Buffer) - err := templates.ExecuteTemplate(buf, "config-addressing.network.tmpl", InterfaceWithName{ - Name: name, - Interface: inter, - Vlans: vlans, - StaticRoutes: staticRoutes, - }) - if err != nil { - return nil, fmt.Errorf("executing config-addressing.network.tmpl template: %w", err) - } - files = append(files, NetworkdConfigFile{ - Name: fmt.Sprintf("70-config-addressing-%v.network", name), - Content: buf.String(), - }) - } - - return files, nil -} diff --git a/internal/networkd/dbus/link.go b/internal/networkd/dbus/link.go deleted file mode 100644 index e11b0d2..0000000 --- a/internal/networkd/dbus/link.go +++ /dev/null @@ -1,48 +0,0 @@ -package dbus - -import ( - "fmt" - - "github.com/godbus/dbus/v5" - "golang.org/x/exp/slog" -) - -type Link struct { - Name string `json:"name"` - CarrierState string `json:"carrier_state"` - OperationalState string `json:"operational_state"` -} - -func GetLinks(dbusConn dbus.Conn) ([]Link, error) { - managerObj := dbusConn.Object("org.freedesktop.network1", dbus.ObjectPath("/org/freedesktop/network1")) - - var links [][]any - err := managerObj.Call("org.freedesktop.network1.Manager.ListLinks", 0).Store(&links) - if err != nil { - return nil, fmt.Errorf("Calling ListLinks %w", err) - } - slog.Info("Dbus Result", "links", links) - - result := []Link{} - - for _, link := range links { - name := link[1].(string) - path := link[2].(dbus.ObjectPath) - linkObj := dbusConn.Object("org.freedesktop.network1", path) - carrierState, err := linkObj.GetProperty("org.freedesktop.network1.Link.CarrierState") - if err != nil { - return nil, fmt.Errorf("GetProperty CarrierState %w", err) - } - operationalState, err := linkObj.GetProperty("org.freedesktop.network1.Link.OperationalState") - if err != nil { - return nil, fmt.Errorf("GetProperty OperationalState %w", err) - } - result = append(result, Link{ - Name: name, - CarrierState: carrierState.String(), - OperationalState: operationalState.String(), - }) - } - - return result, nil -} diff --git a/internal/networkd/template.go b/internal/networkd/template.go deleted file mode 100644 index 87d00ac..0000000 --- a/internal/networkd/template.go +++ /dev/null @@ -1,36 +0,0 @@ -package networkd - -import ( - "embed" - "text/template" - - "nfsense.net/nfsense/internal/definitions/config" - "nfsense.net/nfsense/internal/definitions/object" -) - -//go:embed template -var templateFS embed.FS -var templates *template.Template - -func init() { - - var err error - templates, err = template.New("").Funcs(template.FuncMap{ - "getAddressObjectsAsCidr": getAddressObjectsAsCidr, - }).ParseFS(templateFS, "template/*.tmpl") - if err != nil { - panic(err) - } -} - -func getAddressObjectsAsCidr(conf config.Config, name string) string { - addr := conf.Object.Addresses[name] - switch addr.Type { - case object.Host: - return addr.Host.String() + "/32" - case object.NetworkAddress: - return addr.NetworkAddress.String() - default: - panic("unsupported Address Type") - } -} diff --git a/internal/networkd/template/bond-membership.network.tmpl b/internal/networkd/template/bond-membership.network.tmpl deleted file mode 100644 index 1e87faf..0000000 --- a/internal/networkd/template/bond-membership.network.tmpl +++ /dev/null @@ -1,9 +0,0 @@ -[Match] -{{- if eq .Type 0 }} -Name={{ .HardwareDevice }} -{{- else }} -Name={{ .Name }} -{{- end }} - -[Network] -Bond={{ .BondName }} diff --git a/internal/networkd/template/bridge-membership.network.tmpl b/internal/networkd/template/bridge-membership.network.tmpl deleted file mode 100644 index fe1b0b6..0000000 --- a/internal/networkd/template/bridge-membership.network.tmpl +++ /dev/null @@ -1,9 +0,0 @@ -[Match] -{{- if eq .Type 0 }} -Name={{ .HardwareDevice }} -{{- else }} -Name={{ .Name }} -{{- end }} - -[Network] -Bridge={{ .BridgeName }} diff --git a/internal/networkd/template/config-addressing.network.tmpl b/internal/networkd/template/config-addressing.network.tmpl deleted file mode 100644 index a9dafb9..0000000 --- a/internal/networkd/template/config-addressing.network.tmpl +++ /dev/null @@ -1,26 +0,0 @@ -[Match] -{{- if eq .Type 0 }} -Name={{ .HardwareDevice }} -{{- else }} -Name={{ .Name }} -{{- end }} - -[Network] -LLMNR=no -{{- if eq .AddressingMode 1 }} -Address={{ .Address }} -{{- else if eq .AddressingMode 2 }} -DHCP=yes -{{- end }} -{{- range .Vlans }} -VLAN={{ . }} -{{- end}} - -{{- range .StaticRoutes }} -[Route] -Destination={{ .Destination }} -Gateway={{ .Gateway }} -{{- if ne .Metric 0 }} -Metric={{ .Metric }} -{{- end }} -{{end}} \ No newline at end of file diff --git a/internal/networkd/template/create-bond.netdev.tmpl b/internal/networkd/template/create-bond.netdev.tmpl deleted file mode 100644 index dddf771..0000000 --- a/internal/networkd/template/create-bond.netdev.tmpl +++ /dev/null @@ -1,6 +0,0 @@ -[NetDev] -Name={{ .Name }} -Kind=bond - -[Bond] -Mode=active-backup \ No newline at end of file diff --git a/internal/networkd/template/create-bridge.netdev.tmpl b/internal/networkd/template/create-bridge.netdev.tmpl deleted file mode 100644 index 36dbb7f..0000000 --- a/internal/networkd/template/create-bridge.netdev.tmpl +++ /dev/null @@ -1,3 +0,0 @@ -[NetDev] -Name={{ .Name }} -Kind=bridge \ No newline at end of file diff --git a/internal/networkd/template/create-vlan.netdev.tmpl b/internal/networkd/template/create-vlan.netdev.tmpl deleted file mode 100644 index 2d6b5ce..0000000 --- a/internal/networkd/template/create-vlan.netdev.tmpl +++ /dev/null @@ -1,6 +0,0 @@ -[NetDev] -Name={{ .Name }} -Kind=vlan - -[VLAN] -Id={{ .VlanID }} \ No newline at end of file diff --git a/internal/networkd/template/create-wireguard.netdev.tmpl b/internal/networkd/template/create-wireguard.netdev.tmpl deleted file mode 100644 index 54756a0..0000000 --- a/internal/networkd/template/create-wireguard.netdev.tmpl +++ /dev/null @@ -1,24 +0,0 @@ -[NetDev] -Name={{ $.Name }} -Kind=wireguard - -{{- $intertface := index $.Config.VPN.Wireguard.Interfaces .Name }} - -[WireGuard] -ListenPort={{ $intertface.ListenPort }} -PrivateKey={{ $intertface.PrivateKey }} - -{{ range $i, $peerName := $intertface.Peers }} -{{- $peer := index $.Config.VPN.Wireguard.Peers $peerName }} -[WireGuardPeer] -PublicKey={{ $peer.PublicKey }} -{{- if ne $peer.PresharedKey nil }} -PresharedKey={{ $peer.PresharedKey }} -{{- end }} -{{range $i, $allowedIpName := $peer.AllowedIPs }} -AllowedIPs={{ getAddressObjectsAsCidr $.Config $allowedIpName}} -{{- end }} -{{- if ne $peer.Endpoint nil }} -Endpoint={{ $peer.Endpoint }} -{{- end }} -{{- end }} diff --git a/internal/nftables/action.go b/internal/nftables/action.go deleted file mode 100644 index 8bf239b..0000000 --- a/internal/nftables/action.go +++ /dev/null @@ -1,74 +0,0 @@ -package nftables - -import ( - "nfsense.net/nfsense/internal/definitions/config" - "nfsense.net/nfsense/internal/definitions/firewall" - "nfsense.net/nfsense/internal/definitions/object" -) - -func GenerateDestinationNatAction(conf config.Config, rule firewall.DestinationNATRule) string { - destination := "" - - if rule.Address != nil { - addr := conf.Object.Addresses[*rule.Address] - - if addr.Type == object.Host { - destination = addr.Host.String() - } else { - panic("invalid address type") - } - } - - if rule.Service != nil { - serv := conf.Object.Services[*rule.Service] - - if serv.Type == object.TCP || serv.Type == object.UDP { - destination += ":" + serv.GetDPort() - } else { - panic("invalid service type") - } - } - // TODO if the destination is ip v6 use ip6 instead of ip here - if rule.Address != nil { - return "dnat ip to " + destination - } - // ip or ip6 are not needed if the addresses is not changed - return "dnat to " + destination -} - -func GenerateSourceNatAction(conf config.Config, rule firewall.SourceNATRule) string { - if rule.Type == firewall.Masquerade { - return "masquerade" - } - - source := "" - - if rule.Address != nil { - addr := conf.Object.Addresses[*rule.Address] - - if addr.Type == object.Host { - source = addr.Host.String() - } else if addr.Type == object.Range { - source = addr.Range.String() - } else { - panic("invalid address type") - } - } - - if rule.Service != nil { - serv := conf.Object.Services[*rule.Service] - - if serv.Type == object.TCP || serv.Type == object.UDP { - source += ":" + serv.GetSPort() - } else { - panic("invalid service type") - } - } - - // TODO if the destination is ip v6 use ip6 instead of ip here - if rule.Address != nil { - return "snat ip to " + source - } - // ip or ip6 are not needed if the addresses is not changed - return "snat to " + source -} diff --git a/internal/nftables/apply.go b/internal/nftables/apply.go deleted file mode 100644 index c75da3a..0000000 --- a/internal/nftables/apply.go +++ /dev/null @@ -1,35 +0,0 @@ -package nftables - -import ( - "context" - "fmt" - - systemctl "github.com/coreos/go-systemd/v22/dbus" - "nfsense.net/nfsense/internal/definitions/config" - "nfsense.net/nfsense/internal/util" -) - -const nftablesFile = "/etc/nftables/nfsense.conf" - -func ApplyNFTablesConfiguration(currentConfig config.Config, pendingConfig config.Config) error { - nftablesConf, err := GenerateNfTablesConfig(pendingConfig) - if err != nil { - return fmt.Errorf("Generating nftables Configuration: %w", err) - } - - err = util.OverwriteFile(nftablesFile, nftablesConf) - if err != nil { - return fmt.Errorf("Writing nftables Configuration: %w", err) - } - - conn, err := systemctl.NewSystemConnectionContext(context.Background()) - if err != nil { - return fmt.Errorf("Opening Dbus Connection: %w", err) - } - - _, err = conn.ReloadOrRestartUnitContext(context.Background(), "nftables.service", "replace", nil) - if err != nil { - return fmt.Errorf("restarting unbound.service: %w", err) - } - return nil -} diff --git a/internal/nftables/config.go b/internal/nftables/config.go deleted file mode 100644 index c538d42..0000000 --- a/internal/nftables/config.go +++ /dev/null @@ -1,17 +0,0 @@ -package nftables - -import ( - "bytes" - "fmt" - - "nfsense.net/nfsense/internal/definitions/config" -) - -func GenerateNfTablesConfig(conf config.Config) (string, error) { - buf := new(bytes.Buffer) - err := templates.ExecuteTemplate(buf, "nftables.tmpl", conf) - if err != nil { - return "", fmt.Errorf("executing template: %w", err) - } - return buf.String(), nil -} diff --git a/internal/nftables/match.go b/internal/nftables/match.go deleted file mode 100644 index 9a5edf3..0000000 --- a/internal/nftables/match.go +++ /dev/null @@ -1,87 +0,0 @@ -package nftables - -import ( - "fmt" - - "nfsense.net/nfsense/internal/definitions/firewall" - "nfsense.net/nfsense/internal/definitions/object" - "nfsense.net/nfsense/internal/util" -) - -func GenerateServiceMatcher(service object.Service) string { - res := "" - - switch service.Type { - case object.TCP: - if service.GetSPort() != "" { - res = "tcp sport " + service.GetSPort() - } - if service.GetDPort() != "" { - if len(res) != 0 { - res += " " - } - res += "tcp dport " + service.GetDPort() - } - case object.UDP: - if service.GetSPort() != "" { - res = "udp sport " + service.GetSPort() - } - if service.GetDPort() != "" { - if len(res) != 0 { - res += " " - } - res += "udp dport " + service.GetDPort() - } - case object.ICMP: - res = "icmp codes " + fmt.Sprint(service.ICMPCode) - default: - panic("invalid service type") - } - - return res -} - -func GenerateAddressMatcher(allAddresses map[string]object.Address, match firewall.Match) string { - sourceAddressList := util.ResolveBaseAddresses(allAddresses, match.SourceAddresses) - destinationAddressList := util.ResolveBaseAddresses(allAddresses, match.DestinationAddresses) - - sourceAddresses := []string{} - destinationAddresses := []string{} - - for _, address := range sourceAddressList { - switch address.Type { - case object.Host: - sourceAddresses = append(sourceAddresses, address.Host.String()) - case object.Range: - sourceAddresses = append(sourceAddresses, address.Range.String()) - case object.NetworkAddress: - sourceAddresses = append(sourceAddresses, address.NetworkAddress.String()) - default: - panic("invalid address type") - } - } - - for _, address := range destinationAddressList { - switch address.Type { - case object.Host: - destinationAddresses = append(destinationAddresses, address.Host.String()) - case object.Range: - destinationAddresses = append(destinationAddresses, address.Range.String()) - case object.NetworkAddress: - destinationAddresses = append(destinationAddresses, address.NetworkAddress.String()) - default: - panic("invalid address type") - } - } - - res := "" - - if len(sourceAddresses) != 0 { - res += "ip saddr " + util.ConvertSliceToSetString(sourceAddresses) + " " - } - if len(destinationAddresses) != 0 { - res += "ip daddr " + util.ConvertSliceToSetString(destinationAddresses) + " " - } - - return res -} diff --git a/internal/nftables/template.go b/internal/nftables/template.go deleted file mode 100644 index e16f6ea..0000000 --- a/internal/nftables/template.go +++ /dev/null @@ -1,29 +0,0 @@ -package nftables - -import ( - "embed" - "text/template" - - "nfsense.net/nfsense/internal/util" -) - -//go:embed template -var templateFS embed.FS -var templates *template.Template - -func init() { - - funcMap := template.FuncMap{ - "addressMatcher": GenerateAddressMatcher, - "serviceMatcher": GenerateServiceMatcher, - "destinationNatAction": GenerateDestinationNatAction, - "sourceNatAction": GenerateSourceNatAction, - "getBaseServices": util.ResolveBaseServices, - } - - var err error - templates, err = template.New("").Funcs(funcMap).ParseFS(templateFS, "template/*.tmpl") - if err != nil { - panic(err) - } -} diff --git a/internal/nftables/template/nftables.tmpl b/internal/nftables/template/nftables.tmpl deleted file mode 100644 index 0d50db9..0000000 --- a/internal/nftables/template/nftables.tmpl +++ /dev/null @@ -1,97 +0,0 @@ -#!/usr/sbin/nft -f - -flush ruleset - -# nfsense nftables inet (ipv4 + ipv6) table -table inet nfsense_inet { - - # Rule Counters for Forward Rules - {{- range $i, $rule := $.Firewall.ForwardRules }} - {{- if $rule.Counter }} - counter fw_{{ $i }} { - comment "{{ $rule.Name }}" - } - {{- end}} - {{- end}} - - # Rule Counters for Destination NAT Rules - {{- range $i, $rule := $.Firewall.DestinationNATRules }} - {{- if $rule.Counter }} - counter dnat_{{ $i }} { - comment "{{ $rule.Name }}" - } - {{- end}} - {{- end}} - - # Rule Counters for Source NAT Rules - {{- range $i, $rule := $.Firewall.SourceNATRules }} - {{- if $rule.Counter }} - counter snat_{{ $i }} { - comment "{{ $rule.Name }}" - } - {{- end}} - {{- end}} - - # Inbound Rules - chain inbound { - type filter hook input priority 0; policy drop; - - # Allow traffic from established and related packets, drop invalid - ct state vmap { established : accept, related : accept, invalid : drop } - - # Allow loopback traffic - iifname lo accept - - # temp Allow Inbound traffic - counter accept comment "temp inbound allow" - } - - # Forward Rules - chain forward { - type filter hook forward priority 0; policy drop; - - # Allow traffic from established and related packets, drop invalid - ct state vmap { established : accept, related : accept, invalid : drop } - - # Generated Forward Rules - {{- range $i, $rule := $.Firewall.ForwardRules }} - {{ addressMatcher $.Object.Addresses $rule.Match }} jump { - {{- $baseServices := getBaseServices $.Object.Services $rule.Match.Services }} - {{- range $service := $baseServices }} - {{ serviceMatcher $service }}{{ if $rule.Counter }} counter name fw_{{ $i }}{{ end }} {{ $rule.Verdict.String }} - {{- end}} - } - {{- end}} - } - - # Destination NAT Rules - chain prerouting { - type nat hook prerouting priority -100; policy accept; - - # Generated Destination NAT Rules - {{- range $i, $rule := $.Firewall.DestinationNATRules }} - {{ addressMatcher $.Object.Addresses $rule.Match }} jump { - {{- $baseServices := getBaseServices $.Object.Services $rule.Match.Services }} - {{- range $service := $baseServices }} - {{ serviceMatcher $service }}{{ if $rule.Counter }} counter name dnat_{{ $i }}{{ end }} {{ destinationNatAction $ $rule }} - {{- end}} - } - {{- end}} - } - - # Source NAT Rules - chain postrouting { - type nat hook postrouting priority 100; policy accept; - - # Generated Source NAT Rules - {{- range $i, $rule := $.Firewall.SourceNATRules }} - {{ addressMatcher $.Object.Addresses $rule.Match }} jump { - {{- $baseServices := getBaseServices $.Object.Services $rule.Match.Services }} - {{- range $service := $baseServices }} - {{ serviceMatcher $service }}{{ if $rule.Counter }} counter name snat_{{ $i }}{{ end }} {{ sourceNatAction $ $rule }} - {{- end}} - } - {{- end}} - } -} - diff --git a/internal/server/api.go b/internal/server/api.go deleted file mode 100644 index 72dff3f..0000000 --- a/internal/server/api.go +++ /dev/null @@ -1,35 +0,0 @@ -package server - -import ( - "context" - "fmt" - "net/http" - "runtime/debug" - "time" - - "golang.org/x/exp/slog" - "nfsense.net/nfsense/internal/session" -) - -func HandleAPI(w http.ResponseWriter, r *http.Request) { - _, s := session.GetSession(r) - if s == nil { - // Fallthrough after so that jsonrpc can still deliver a valid jsonrpc error - w.WriteHeader(http.StatusUnauthorized) - } - - defer func() { - if r := recover(); r != nil { - slog.Error("Recovered Panic Handling HTTP API Request", "err", fmt.Errorf("%v", r), "stack", debug.Stack()) - http.Error(w, "Internal Server Error", http.StatusInternalServerError) - return - } - }() - ctx, cancel := context.WithTimeout(context.WithValue(r.Context(), session.SessionKey, s), time.Second*10) - defer cancel() - - err := apiHandler.HandleRequest(ctx, s, r.Body, w) - if err != nil { - slog.Error("Handling HTTP API Request", "err", err) - } -} diff --git a/internal/server/server.go b/internal/server/server.go deleted file mode 100644 index 90d0788..0000000 --- a/internal/server/server.go +++ /dev/null @@ -1,55 +0,0 @@ -package server - -import ( - "context" - "errors" - "fmt" - "net/http" - - "golang.org/x/exp/slog" - - "nfsense.net/nfsense/internal/config" - "nfsense.net/nfsense/internal/jsonrpc" - "nfsense.net/nfsense/internal/session" -) - -var server http.Server -var mux = http.NewServeMux() -var apiHandler *jsonrpc.Handler -var stopCleanup chan struct{} -var configManager *config.ConfigManager - -func StartWebserver(_configManager *config.ConfigManager, _apiHandler *jsonrpc.Handler) { - server.Addr = ":8080" - server.Handler = mux - apiHandler = _apiHandler - configManager = _configManager - - // Routing - mux.HandleFunc("/login", HandleLogin) - mux.HandleFunc("/logout", HandleLogout) - mux.HandleFunc("/session", HandleSession) - mux.HandleFunc("/api", HandleAPI) - mux.HandleFunc("/ws/api", HandleWebsocketAPI) - mux.HandleFunc("/", HandleWebinterface) - - stopCleanup = make(chan struct{}) - - go session.CleanupSessions(stopCleanup) - - go func() { - if err := server.ListenAndServe(); !errors.Is(err, http.ErrServerClosed) { - slog.Error("Webserver error", "err", err) - } - slog.Info("Webserver Stopped") - }() -} - -func ShutdownWebserver(ctx context.Context) error { - stopCleanup <- struct{}{} - err := server.Shutdown(ctx) - if err != nil { - return fmt.Errorf("Shutting down: %w", err) - } - return nil -} diff --git a/internal/server/session.go b/internal/server/session.go deleted file mode 100644 index 6635625..0000000 --- a/internal/server/session.go +++ /dev/null @@ -1,67 +0,0 @@ -package server - -import ( - "encoding/json" - "io" - "net/http" - "time" - - "golang.org/x/exp/slog" - "nfsense.net/nfsense/internal/auth" - "nfsense.net/nfsense/internal/session" -) - -type LoginRequest struct { - Username string `json:"username"` - Password string `json:"password"` -} - -func HandleLogin(w http.ResponseWriter, r *http.Request) { - buf, err := io.ReadAll(r.Body) - if err != nil { - slog.Error("Reading Body", err) - return - } - var req LoginRequest - err = json.Unmarshal(buf, &req) - if err != nil { - slog.Error("Unmarshal", "err", err) - return - } - err = auth.AuthenticateUser(configManager.GetCurrentConfig(), req.Username, req.Password) - if err != nil { - slog.Error("User Login failed", "err", err, "username", req.Username) - w.WriteHeader(http.StatusUnauthorized) - return - } - - slog.Info("User Login Successful", "username", req.Username) - session.GenerateSession(w, req.Username) - w.WriteHeader(http.StatusOK) -} - -func HandleLogout(w http.ResponseWriter, r *http.Request) { - http.SetCookie(w, session.GetCookie("", time.Now())) - w.WriteHeader(http.StatusOK) -} - -func HandleSession(w http.ResponseWriter, r *http.Request) { - id, s := session.GetSession(r) - if s == nil { - w.WriteHeader(http.StatusUnauthorized) - return - } - session.ExtendSession(s) - http.SetCookie(w, session.GetCookie(id, s.Expires)) - w.WriteHeader(http.StatusOK) - resp := session.SessionResponse{ - CommitHash: session.CommitHash, - } - res, err := json.Marshal(resp) - if err != nil { - w.WriteHeader(http.StatusInternalServerError) - return - } - - w.Write(res) -} diff --git a/internal/server/webinterface.go b/internal/server/webinterface.go deleted file mode 100644 index c882ebb..0000000 --- a/internal/server/webinterface.go +++ /dev/null @@ -1,9 +0,0 @@ -package server - -import ( - "net/http" -) - -func HandleWebinterface(w http.ResponseWriter, r *http.Request) { - -} diff --git a/internal/server/websocket.go b/internal/server/websocket.go deleted file mode 100644 index bce283d..0000000 --- a/internal/server/websocket.go +++ /dev/null @@ -1,61 +0,0 @@ -package server - -import ( - "bytes" - "context" - "fmt" - "net/http" - "runtime/debug" - "time" - - "golang.org/x/exp/slog" - "nfsense.net/nfsense/internal/session" - "nhooyr.io/websocket" -) - -func HandleWebsocketAPI(w http.ResponseWriter, r *http.Request) { - _, s := session.GetSession(r) - if s == nil { - w.WriteHeader(http.StatusUnauthorized) - return - } - - ctx, cancel := context.WithCancel(context.WithValue(r.Context(), session.SessionKey, s)) - defer cancel() - c, err := websocket.Accept(w, r, nil) - if err != nil { - slog.Error("Accepting Websocket Connection", "err", err) - return - } - defer c.Close(websocket.StatusInternalError, "Unexpected Closing") - - slog.Info("Accepted API Websocket Connection") - - for { - _, m, err := c.Read(ctx) - if websocket.CloseStatus(err) == websocket.StatusNormalClosure { - slog.Info("API Websocket Closed Normally") - cancel() - return - } else if err != nil { - slog.Error("API Websocket Closed Unexpectedly", "err", err) - cancel() - } - - go func() { - defer func() { - if r := recover(); r != nil { - slog.Error("Recovered Panic Handling Websocket API Request", "err", fmt.Errorf("%v", r), "stack", debug.Stack()) - return - } - }() - ctx, cancel := context.WithTimeout(ctx, time.Second*10) - defer cancel() - - err := apiHandler.HandleRequest(ctx, s, bytes.NewReader(m), w) - if err != nil { - slog.Error("Handling Websocket API Request", "err", err) - } - }() - } -} diff --git a/internal/session/cookie.go b/internal/session/cookie.go deleted file mode 100644 index 32da76e..0000000 --- a/internal/session/cookie.go +++ /dev/null @@ -1,10 +0,0 @@ -package session - -import ( - "net/http" - "time" -) - -func GetCookie(value string, expires time.Time) *http.Cookie { - return &http.Cookie{Name: SessionCookieName, HttpOnly: true, SameSite: http.SameSiteStrictMode, Value: value, Expires: expires} -} diff --git a/internal/session/session.go b/internal/session/session.go deleted file mode 100644 index 3378d2a..0000000 --- a/internal/session/session.go +++ /dev/null @@ -1,94 +0,0 @@ -package session - -import ( - "net/http" - "runtime/debug" - "sync" - "time" - - "github.com/google/uuid" -) - -type SessionKeyType string - -const SessionKey SessionKeyType = "session" -const SessionCookieName string = "session" -const SessionLifeTime = time.Minute * 15 - -type Session struct { - Username string - Expires time.Time - // TODO Add []websocket.Conn pointer to close all active websockets, alternatively do this via context cancelation -} - -type SessionResponse struct { - CommitHash string `json:"commit_hash"` -} - -var sessionsSync sync.Mutex -var sessions map[string]*Session = map[string]*Session{} - -var CommitHash = func() string { - if info, ok := debug.ReadBuildInfo(); ok { - for _, setting := range info.Settings { - if setting.Key == "vcs.revision" { - return setting.Value - } - } - } - return "asd" -}() - -func ExtendSession(s *Session) { - sessionsSync.Lock() - defer sessionsSync.Unlock() - if s != nil { - s.Expires = time.Now().Add(SessionLifeTime) - } -} - -func GetSession(r *http.Request) (string, *Session) { - c, err := r.Cookie("session") - if err != nil { - return "", nil - } - s, ok := sessions[c.Value] - if ok { - return c.Value, s - } - return "", nil -} - -func GenerateSession(w http.ResponseWriter, username string) { - id := uuid.New().String() - expires := time.Now().Add(SessionLifeTime) - sessionsSync.Lock() - defer sessionsSync.Unlock() - sessions[id] = &Session{ - Username: username, - Expires: expires, - } - http.SetCookie(w, &http.Cookie{Name: SessionCookieName, HttpOnly: true, SameSite: http.SameSiteStrictMode, Value: id, Expires: expires}) -} - -func CleanupSessions(stop chan struct{}) { - tick := time.NewTicker(time.Minute) - for { - select { - case <-tick.C: - ids := []string{} - sessionsSync.Lock() - for id, s := range sessions { - if time.Now().After(s.Expires) { - ids = append(ids, id) - } - } - for _, id := range ids { - delete(sessions, id) - } - sessionsSync.Unlock() - case <-stop: - return - } - } -} diff --git a/internal/unbound/apply.go b/internal/unbound/apply.go deleted file mode 100644 index 7f23abf..0000000 --- a/internal/unbound/apply.go +++ /dev/null @@ -1,54 +0,0 @@ -package unbound - -import ( - "context" - "fmt" - - systemctl "github.com/coreos/go-systemd/v22/dbus" - "nfsense.net/nfsense/internal/definitions/config" - "nfsense.net/nfsense/internal/util" -) - -const unboundServerFile = "/etc/unbound/unbound.conf" - -func ApplyDNSServerConfiguration(currentConfig config.Config, pendingConfig config.Config) error { - - serverConf, err := GenerateUnboundServerConfiguration(pendingConfig) - if err != nil { - return fmt.Errorf("Generating Unbound Server Configuration: %w", err) - } - - err = util.OverwriteFile(unboundServerFile, serverConf) - if err != nil { - return fmt.Errorf("Writing server Configuration: %w", err) - } - - conn, err := systemctl.NewSystemConnectionContext(context.Background()) - if err != nil { - return fmt.Errorf("Opening Dbus Connection: %w", err) - } - - if len(pendingConfig.Service.DNSServers) == 0 { - // if there are no servers stop the service instead - _, err := conn.StopUnitContext(context.Background(), "unbound.service", "replace", nil) - if err != nil { - return fmt.Errorf("stopping unbound.service: %w", err) - } - - _, err = conn.DisableUnitFilesContext(context.Background(), []string{"unbound.service"}, false) - if err != nil { - return fmt.Errorf("disableing unbound.service: %w", err) - } - } else { - _, err := conn.ReloadOrRestartUnitContext(context.Background(), "unbound.service", "replace", nil) - if err != nil { - return fmt.Errorf("restarting unbound.service: %w", err) - } - - _, _, err = conn.EnableUnitFilesContext(context.Background(), []string{"unbound.service"}, false, true) - if err != nil { - return fmt.Errorf("enableing unbound.service: %w", err) - } - } - return nil -} diff --git a/internal/unbound/server.go b/internal/unbound/server.go deleted file mode 100644 index bca001a..0000000 --- a/internal/unbound/server.go +++ /dev/null @@ -1,17 +0,0 @@ -package unbound - -import ( - "bytes" - "fmt" - - "nfsense.net/nfsense/internal/definitions/config" -) - -func GenerateUnboundServerConfiguration(conf config.Config) (string, error) { - buf := new(bytes.Buffer) - err := templates.ExecuteTemplate(buf, "server.tmpl", conf) - if err != nil { - return "", fmt.Errorf("executing server.tmpl template: %w", err) - } - return buf.String(), nil -} diff --git a/internal/unbound/template.go b/internal/unbound/template.go deleted file mode 100644 index a98f79b..0000000 --- a/internal/unbound/template.go +++ /dev/null @@ -1,35 +0,0 @@ -package unbound - -import ( - "embed" - "text/template" - - "nfsense.net/nfsense/internal/definitions/config" - "nfsense.net/nfsense/internal/definitions/network" -) - -//go:embed template -var templateFS embed.FS -var templates *template.Template - -func init() { - var err error - templates, err = template.New("").Funcs(template.FuncMap{ - "getInterfaceNetworkAddressCIDR": getInterfaceNetworkAddressCIDR, - "getInterfaceName": getInterfaceName, - }).ParseFS(templateFS, "template/*.tmpl") - if err != nil { - panic(err) - } -} - -func getInterfaceNetworkAddressCIDR(conf config.Config, name string) string { - return conf.Network.Interfaces[name].Address.Masked().String() -} - -func getInterfaceName(conf config.Config, name string) string { - if conf.Network.Interfaces[name].Type == network.Hardware { - return *conf.Network.Interfaces[name].HardwareDevice - } - return name -} diff --git a/internal/unbound/template/server.tmpl b/internal/unbound/template/server.tmpl deleted file mode 100644 index 6535cf8..0000000 --- a/internal/unbound/template/server.tmpl +++ /dev/null @@ -1,15 +0,0 @@ -server: - -# Listen Interfaces -{{- range $i, $server := .Service.NTPServers }} - interface: {{ getInterfaceName $ $server.Interface }} -{{- end }} - -# Allowed Networks -{{- range $i, $server := .Service.NTPServers }} - access-control: {{ getInterfaceNetworkAddressCIDR $ $server.Interface }} allow -{{- end }} - - -remote-control: - control-enable: yes \ No newline at end of file diff --git a/internal/util/address.go b/internal/util/address.go deleted file mode 100644 index 5c2b15a..0000000 --- a/internal/util/address.go +++ /dev/null @@ -1,37 +0,0 @@ -package util - -import ( - "nfsense.net/nfsense/internal/definitions/object" -) - -// ResolveBaseAddresses Resolves all groups to their base Addresses -func ResolveBaseAddresses(allAddresses map[string]object.Address, addressNames []string) []object.Address { - baseAddresses := []object.Address{} - - for _, addressName := range addressNames { - address := allAddresses[addressName] - - if address.Type == object.AddressGroup { - baseAddresses = append(baseAddresses, resolveAddressChildren(allAddresses, address)...) - } else { - baseAddresses = append(baseAddresses, address) - } - - } - - return baseAddresses -} - -func resolveAddressChildren(allAddresses map[string]object.Address, a object.Address) []object.Address { - addressList := []object.Address{} - for _, addressName := range *a.Children { - address := allAddresses[addressName] - - if address.Type == object.AddressGroup { - addressList = append(addressList, resolveAddressChildren(allAddresses, address)...) - } else { - addressList = append(addressList, address) - } - } - return addressList -} diff --git a/internal/util/file.go b/internal/util/file.go deleted file mode 100644 index e63faf2..0000000 --- a/internal/util/file.go +++ /dev/null @@ -1,34 +0,0 @@ -package util - -import ( - "fmt" - "os" -) - -func OverwriteFile(path, content string) error { - f, err := os.OpenFile(path, os.O_RDWR, 0644) - if err != nil { - return fmt.Errorf("opening File: %w", err) - } - - err = f.Truncate(0) - if err != nil { - return fmt.Errorf("truncate File: %w", err) - } - - _, err = f.Seek(0, 0) - if err != nil { - return fmt.Errorf("seek File: %w", err) - } - - _, err = f.WriteString(content + "\n") - if err != nil { - return fmt.Errorf("writing File: %w", err) - } - - err = f.Sync() - if err != nil { - return fmt.Errorf("syncing File: %w", err) - } - return nil -} diff --git a/internal/util/net.go b/internal/util/net.go deleted file mode 100644 index d35ed6b..0000000 --- a/internal/util/net.go +++ /dev/null @@ -1,22 +0,0 @@ -package util - -import ( - "net" -) - -func BroadcastAddr(n net.IPNet) net.IP { - var broadcast net.IP - var length int - if n.IP.To4() != nil { - broadcast = net.ParseIP("0.0.0.0").To4() - length = 4 - } else { - broadcast = net.ParseIP("::") - length = 16 - - } - for i := 0; i < length; i++ { - broadcast[i] = n.IP[i] | ^n.Mask[i] - } - return broadcast -} diff --git a/internal/util/service.go b/internal/util/service.go deleted file mode 100644 index 8132f51..0000000 --- a/internal/util/service.go +++ /dev/null @@ -1,35 +0,0 @@ -package util - -import "nfsense.net/nfsense/internal/definitions/object" - -// ResolveBaseServices Resolves all groups to their base Services -func ResolveBaseServices(allServices map[string]object.Service, serviceNames []string) []object.Service { - baseServices := []object.Service{} - - for _, serviceName := range serviceNames { - service := allServices[serviceName] - - if service.Type == object.ServiceGroup { - baseServices = append(baseServices, resolveServiceChildren(allServices, service)...) - } else { - baseServices = append(baseServices, service) - } - - } - - return baseServices -} - -func resolveServiceChildren(allServices map[string]object.Service, s object.Service) []object.Service { - serviceList := []object.Service{} - for _, serviceName := range *s.Children { - service := allServices[serviceName] - - if service.Type == object.ServiceGroup { - serviceList = append(serviceList, resolveServiceChildren(allServices, service)...) - } else { - serviceList = append(serviceList, service) - } - } - return serviceList -} diff --git a/internal/util/set.go b/internal/util/set.go deleted file mode 100644 index 6e36e7a..0000000 --- a/internal/util/set.go +++ /dev/null @@ -1,21 +0,0 @@ -package util - -func ConvertSliceToSetString(slice []string) string { - if len(slice) == 0 { - return "" - } else if len(slice) == 1 { - return slice[0] - } - - res := "{ " - - for i := range slice { - res += " " + slice[i] - if i < len(slice)-1 { - res += "," - } - } - - res += " }" - return res -} diff --git a/internal/validation/schema.go b/internal/validation/schema.go deleted file mode 100644 index b5d2fab..0000000 --- a/internal/validation/schema.go +++ /dev/null @@ -1,53 +0,0 @@ -package validation - -import ( - "embed" - "fmt" - "path/filepath" - - "github.com/santhosh-tekuri/jsonschema/v5" - "golang.org/x/exp/slog" -) - -//go:embed schema/* -var schemasFS embed.FS -var schema *jsonschema.Schema - -func init() { - - c := jsonschema.NewCompiler() - - addFolderResources(c, "schema") - - s, err := c.Compile("https://nfsense.net/schema/config/config.schema.json") - if err != nil { - panic(fmt.Errorf("Reading Schemas: %w", err)) - } - - schema = s -} - -func addFolderResources(c *jsonschema.Compiler, path string) { - all, err := schemasFS.ReadDir(path) - if err != nil { - panic(fmt.Errorf("Reading Schemas: %w", err)) - } - - for _, f := range all { - fullpath := filepath.Join(path, f.Name()) - slog.Debug("Checking Path", "fullpath", fullpath, "dir", f.IsDir()) - if f.IsDir() { - addFolderResources(c, fullpath) - } else { - data, err := schemasFS.Open(fullpath) - if err != nil { - panic(fmt.Errorf("Reading Schema: %w", err)) - } - slog.Debug("Adding Resource", "id", "https://nfsense.net/"+fullpath) - err = c.AddResource("https://nfsense.net/"+fullpath, data) - if err != nil { - panic(fmt.Errorf("Adding Schema: %w", err)) - } - } - } -} diff --git a/internal/validation/schema/config/config.schema.json b/internal/validation/schema/config/config.schema.json deleted file mode 100644 index 2a8c292..0000000 --- a/internal/validation/schema/config/config.schema.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "$id": "https://nfsense.net/schema/config/config.schema.json", - "title": "Config", - "type": "object", - "properties": { - "config_version": { - "type": "number", - "const": 1 - }, - "firewall": { - "description": "System Settings", - "$ref": "https://nfsense.net/schema/firewall/firewall.schema.json" - }, - "object": { - "description": "Object Settings", - "$ref": "https://nfsense.net/schema/object/object.schema.json" - }, - "network": { - "description": "Network Settings", - "$ref": "https://nfsense.net/schema/network/network.schema.json" - }, - "service": { - "description": "Service Settings", - "$ref": "https://nfsense.net/schema/service/service.schema.json" - }, - "vpn": { - "description": "VPN Settings", - "$ref": "https://nfsense.net/schema/vpn/vpn.schema.json" - }, - "system": { - "description": "System Settings", - "$ref": "https://nfsense.net/schema/system/system.schema.json" - } - }, - "required": ["config_version", "firewall", "object", "network", "service", "vpn", "system"] -} \ No newline at end of file diff --git a/internal/validation/schema/firewall/destination_nat_rule.schema.json b/internal/validation/schema/firewall/destination_nat_rule.schema.json deleted file mode 100644 index 4cb8910..0000000 --- a/internal/validation/schema/firewall/destination_nat_rule.schema.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "$id": "https://nfsense.net/schema/firewall/destination_nat_rule.schema.json", - "title": "Destination NAT Rule", - "$ref": "https://nfsense.net/schema/firewall/rule.schema.json", - "type": "object", - "properties": { - "address": { - "type": "string" - }, - "service": { - "type": "string" - } - } -} \ No newline at end of file diff --git a/internal/validation/schema/firewall/firewall.schema.json b/internal/validation/schema/firewall/firewall.schema.json deleted file mode 100644 index 2ff63f8..0000000 --- a/internal/validation/schema/firewall/firewall.schema.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "$id": "https://nfsense.net/schema/firewall/firewall.schema.json", - "title": "Firewall", - "type": "object", - "properties": { - "forward_rules": { - "type": "array", - "items": { - "$ref": "https://nfsense.net/schema/firewall/forward_rule.schema.json" - } - }, - "destination_nat_rules": { - "type": "array", - "items": { - "$ref": "https://nfsense.net/schema/firewall/destination_nat_rule.schema.json" - } - }, - "source_nat_rules": { - "type": "array", - "items": { - "$ref": "https://nfsense.net/schema/firewall/source_nat_rule.schema.json" - } - } - }, - "required": ["forward_rules", "destination_nat_rules", "source_nat_rules"] -} \ No newline at end of file diff --git a/internal/validation/schema/firewall/forward_rule.schema.json b/internal/validation/schema/firewall/forward_rule.schema.json deleted file mode 100644 index 1d19dbf..0000000 --- a/internal/validation/schema/firewall/forward_rule.schema.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "$id": "https://nfsense.net/schema/firewall/forward_rule.schema.json", - "title": "Forward Rule", - "$ref": "https://nfsense.net/schema/firewall/rule.schema.json", - "type": "object", - "properties": { - "verdict": { - "type": "string" - } - }, - "required": ["verdict"] -} \ No newline at end of file diff --git a/internal/validation/schema/firewall/match.schema.json b/internal/validation/schema/firewall/match.schema.json deleted file mode 100644 index 6837e34..0000000 --- a/internal/validation/schema/firewall/match.schema.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "$id": "https://nfsense.net/schema/firewall/match.schema.json", - "title": "Match", - "type": "object", - "properties": { - "services": { - "type": "array", - "items": { - "type": "string" - } - }, - "source_addresses": { - "type": "array", - "items": { - "type": "string" - } - }, - "destination_addresses": { - "type": "array", - "items": { - "type": "string" - } - } - } -} \ No newline at end of file diff --git a/internal/validation/schema/firewall/rule.schema.json b/internal/validation/schema/firewall/rule.schema.json deleted file mode 100644 index 8169a96..0000000 --- a/internal/validation/schema/firewall/rule.schema.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "$id": "https://nfsense.net/schema/firewall/rule.schema.json", - "title": "Rule", - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "match": { - "$ref": "https://nfsense.net/schema/firewall/match.schema.json" - }, - "comment": { - "type": "string" - }, - "counter": { - "type": "boolean" - } - }, - "required": ["name", "match"] -} \ No newline at end of file diff --git a/internal/validation/schema/firewall/source_nat_rule.schema.json b/internal/validation/schema/firewall/source_nat_rule.schema.json deleted file mode 100644 index 7593b53..0000000 --- a/internal/validation/schema/firewall/source_nat_rule.schema.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "$id": "https://nfsense.net/schema/firewall/source_nat_rule.schema.json", - "title": "Source NAT Rule", - "$ref": "https://nfsense.net/schema/firewall/rule.schema.json", - "type": "object", - "properties": { - "type": { - "type": "string" - }, - "address": { - "type": "string" - }, - "service": { - "type": "string" - } - } -} \ No newline at end of file diff --git a/internal/validation/schema/network/interface.schema.json b/internal/validation/schema/network/interface.schema.json deleted file mode 100644 index 42e5a86..0000000 --- a/internal/validation/schema/network/interface.schema.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "$id": "https://nfsense.net/schema/network/interface.schema.json", - "title": "Interface", - "type": "object", - "properties": { - "alias": { - "type": "string" - }, - "type": { - "type": "string" - }, - "addressing_mode": { - "type": "string" - }, - "address": { - "type": "string" - }, - "hardware_device": { - "type": "string" - }, - "vlan_id": { - "type": "number" - }, - "vlan_parent": { - "type": "string" - }, - "bond_members": { - "type": "array", - "items": { - "type": "string" - } - }, - "bridge_members": { - "type": "array", - "items": { - "type": "string" - } - }, - "comment": { - "type": "string" - } - }, - "required": ["type", "addressing_mode"] -} \ No newline at end of file diff --git a/internal/validation/schema/network/network.schema.json b/internal/validation/schema/network/network.schema.json deleted file mode 100644 index 15a11f1..0000000 --- a/internal/validation/schema/network/network.schema.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "$id": "https://nfsense.net/schema/network/network.schema.json", - "title": "Network", - "type": "object", - "properties": { - "interfaces": { - "type": "object", - "additionalProperties": { - "$ref": "https://nfsense.net/schema/network/interface.schema.json" - } - }, - "static_routes": { - "type": "array", - "items": { - "$ref": "https://nfsense.net/schema/network/static_route.schema.json" - } - } - }, - "required": ["interfaces"] -} \ No newline at end of file diff --git a/internal/validation/schema/network/static_route.schema.json b/internal/validation/schema/network/static_route.schema.json deleted file mode 100644 index 742d663..0000000 --- a/internal/validation/schema/network/static_route.schema.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "$id": "https://nfsense.net/schema/network/static_route.schema.json", - "title": "Static Route", - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "interface": { - "type": "string" - }, - "gateway": { - "type": "string" - }, - "destination": { - "type": "string" - }, - "metric": { - "type": "number" - } - }, - "required": ["name", "interface", "gateway", "destination"] -} \ No newline at end of file diff --git a/internal/validation/schema/object/address.schema.json b/internal/validation/schema/object/address.schema.json deleted file mode 100644 index 3f5ca3b..0000000 --- a/internal/validation/schema/object/address.schema.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "$id": "https://nfsense.net/schema/object/address.schema.json", - "title": "Address", - "type": "object", - "properties": { - "type": { - "type": "string" - }, - "comment": { - "type": "string" - }, - "host": { - "type": "string" - }, - "range": { - "type": "string" - }, - "network": { - "type": "string" - }, - "children": { - "type": "array", - "items": { - "type": "string" - } - } - }, - "required": ["type"] -} \ No newline at end of file diff --git a/internal/validation/schema/object/object.schema.json b/internal/validation/schema/object/object.schema.json deleted file mode 100644 index a59f62d..0000000 --- a/internal/validation/schema/object/object.schema.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "$id": "https://nfsense.net/schema/object/object.schema.json", - "title": "Object", - "type": "object", - "properties": { - "addresses": { - "type": "object", - "additionalProperties": { - "$ref": "https://nfsense.net/schema/object/address.schema.json" - } - }, - "services": { - "type": "object", - "additionalProperties": { - "$ref": "https://nfsense.net/schema/object/service.schema.json" - } - } - }, - "required": ["addresses", "services"] -} \ No newline at end of file diff --git a/internal/validation/schema/object/service.schema.json b/internal/validation/schema/object/service.schema.json deleted file mode 100644 index 47b15d4..0000000 --- a/internal/validation/schema/object/service.schema.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "$id": "https://nfsense.net/schema/object/service.schema.json", - "title": "Service", - "type": "object", - "properties": { - "type": { - "type": "string" - }, - "comment": { - "type": "string" - }, - "sport_start": { - "type": "number" - }, - "sport_end": { - "type": "number" - }, - "dport_start": { - "type": "number" - }, - "dport_end": { - "type": "number" - }, - "icmp_code": { - "type": "number" - }, - "children": { - "type": "array", - "items": { - "type": "string" - } - } - }, - "required": ["type"] -} \ No newline at end of file diff --git a/internal/validation/schema/service/dhcp_reservation.schema.json b/internal/validation/schema/service/dhcp_reservation.schema.json deleted file mode 100644 index 7a73a41..0000000 --- a/internal/validation/schema/service/dhcp_reservation.schema.json +++ /dev/null @@ -1,2 +0,0 @@ -{ -} \ No newline at end of file diff --git a/internal/validation/schema/service/dhcp_v4_server.schema.json b/internal/validation/schema/service/dhcp_v4_server.schema.json deleted file mode 100644 index 36147eb..0000000 --- a/internal/validation/schema/service/dhcp_v4_server.schema.json +++ /dev/null @@ -1,57 +0,0 @@ -{ - "$id": "https://nfsense.net/schema/service/dhcp_v4_server.schema.json", - "title": "DHCP Server", - "type": "object", - "properties": { - "interface": { - "type": "string" - }, - "pool": { - "type": "array", - "items": { - "type": "string" - } - }, - "default_lease_time": { - "type": "number" - }, - "max_lease_time": { - "type": "number" - }, - "gateway_mode": { - "type": "string" - }, - "gateway": { - "type": "string" - }, - "dns_server_mode": { - "type": "string" - }, - "dns_servers": { - "type": "array", - "items": { - "type": "string" - } - }, - "ntp_server_mode": { - "type": "string" - }, - "ntp_servers": { - "type": "array", - "items": { - "type": "string" - } - }, - "reservations": { - "type": ["object", "null"], - "additionalProperties": { - "description": "DHCP Reservations", - "$ref": "https://nfsense.net/schema/service/dhcp_reservation.schema.json" - } - }, - "comment": { - "type": "string" - } - }, - "required": ["interface", "pool", "default_lease_time", "max_lease_time", "gateway_mode", "dns_server_mode", "ntp_server_mode"] -} \ No newline at end of file diff --git a/internal/validation/schema/service/dns_server.schema.json b/internal/validation/schema/service/dns_server.schema.json deleted file mode 100644 index 6075461..0000000 --- a/internal/validation/schema/service/dns_server.schema.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "$id": "https://nfsense.net/schema/service/dns_server.schema.json", - "title": "DNS Server", - "type": "object", - "properties": { - "interface": { - "type": "string" - }, - "comment": { - "type": "string" - } - }, - "required": ["interface"] -} \ No newline at end of file diff --git a/internal/validation/schema/service/ntp_server.schema.json b/internal/validation/schema/service/ntp_server.schema.json deleted file mode 100644 index c8e3411..0000000 --- a/internal/validation/schema/service/ntp_server.schema.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "$id": "https://nfsense.net/schema/service/ntp_server.schema.json", - "title": "NTP Server", - "type": "object", - "properties": { - "interface": { - "type": "string" - }, - "comment": { - "type": "string" - } - }, - "required": ["interface"] -} \ No newline at end of file diff --git a/internal/validation/schema/service/service.schema.json b/internal/validation/schema/service/service.schema.json deleted file mode 100644 index 08bafb5..0000000 --- a/internal/validation/schema/service/service.schema.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "$id": "https://nfsense.net/schema/service/service.schema.json", - "title": "Service", - "type": "object", - "properties": { - "dhcp_v4_servers": { - "type": "array", - "items": { - "$ref": "https://nfsense.net/schema/service/dhcp_v4_server.schema.json" - } - }, - "dhcp_v6_servers": { - "type": "array", - "items": { - "$ref": "https://nfsense.net/schema/service/dhcp_v4_server.schema.json" - } - }, - "dns_servers": { - "type": "array", - "items": { - "$ref": "https://nfsense.net/schema/service/dns_server.schema.json" - } - }, - "ntp_servers": { - "type": "array", - "items": { - "$ref": "https://nfsense.net/schema/service/ntp_server.schema.json" - } - } - } -} \ No newline at end of file diff --git a/internal/validation/schema/system/system.schema.json b/internal/validation/schema/system/system.schema.json deleted file mode 100644 index aa9adf1..0000000 --- a/internal/validation/schema/system/system.schema.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "$id": "https://nfsense.net/schema/system/system.schema.json", - "title": "System", - "type": "object", - "properties": { - "users": { - "type": "object", - "additionalProperties": { - "description": "System Settings", - "$ref": "https://nfsense.net/schema/system/user.schema.json" - } - } - }, - "required": ["users"] -} \ No newline at end of file diff --git a/internal/validation/schema/system/user.schema.json b/internal/validation/schema/system/user.schema.json deleted file mode 100644 index 282f292..0000000 --- a/internal/validation/schema/system/user.schema.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "$id": "https://nfsense.net/schema/system/user.schema.json", - "title": "User", - "type": "object", - "properties": { - "comment": { - "type": "string" - }, - "hash": { - "type": "string" - }, - "salt": { - "type": "string" - } - }, - "required": ["hash", "salt"] - -} \ No newline at end of file diff --git a/internal/validation/schema/vpn/vpn.schema.json b/internal/validation/schema/vpn/vpn.schema.json deleted file mode 100644 index 3223a5e..0000000 --- a/internal/validation/schema/vpn/vpn.schema.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "$id": "https://nfsense.net/schema/vpn/vpn.schema.json", - "title": "VPN", - "type": "object", - "properties": { - "wireguard": { - "$ref": "https://nfsense.net/schema/vpn/wireguard.schema.json" - } - }, - "required": ["wireguard"] -} \ No newline at end of file diff --git a/internal/validation/schema/vpn/wireguard.schema.json b/internal/validation/schema/vpn/wireguard.schema.json deleted file mode 100644 index 1803fff..0000000 --- a/internal/validation/schema/vpn/wireguard.schema.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "$id": "https://nfsense.net/schema/vpn/wireguard.schema.json", - "title": "Wireguard", - "type": "object", - "properties": { - "interfaces": { - "type": "object", - "additionalProperties": { - "description": "Wireguard Interface", - "$ref": "https://nfsense.net/schema/vpn/wireguard_interface.schema.json" - } - }, - "peers": { - "type": "object", - "additionalProperties": { - "description": "Wireguard Peer", - "$ref": "https://nfsense.net/schema/vpn/wireguard_peer.schema.json" - } - } - }, - "required": ["interfaces", "peers"] -} \ No newline at end of file diff --git a/internal/validation/schema/vpn/wireguard_interface.schema.json b/internal/validation/schema/vpn/wireguard_interface.schema.json deleted file mode 100644 index 80a1285..0000000 --- a/internal/validation/schema/vpn/wireguard_interface.schema.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "$id": "https://nfsense.net/schema/vpn/wireguard_interface.schema.json", - "title": "Wireguard Interface", - "type": "object", - "properties": { - "public_key": { - "type": "string" - }, - "private_key": { - "type": "string" - }, - "listen_port": { - "type": "number" - }, - "peers": { - "type": "array", - "items": { - "type": "string" - } - }, - "comment": { - "type": "string" - } - }, - "required": ["public_key", "private_key", "listen_port", "peers"] -} \ No newline at end of file diff --git a/internal/validation/schema/vpn/wireguard_peer.schema.json b/internal/validation/schema/vpn/wireguard_peer.schema.json deleted file mode 100644 index 0ecc830..0000000 --- a/internal/validation/schema/vpn/wireguard_peer.schema.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "$id": "https://nfsense.net/schema/vpn/wireguard_peer.schema.json", - "title": "Wireguard Peer", - "type": "object", - "properties": { - "public_key": { - "type": "string" - }, - "preshared_key": { - "type": ["string", "null"] - }, - "allowed_ips": { - "type": "array", - "items": { - "type": "string" - } - }, - "endpoint": { - "type": ["string", "null"] - }, - "persistent_keepalive": { - "type": ["number", "null"] - }, - "comment": { - "type": "string" - } - }, - "required": ["public_key", "allowed_ips"] -} \ No newline at end of file diff --git a/internal/validation/validation.go b/internal/validation/validation.go deleted file mode 100644 index a279ea9..0000000 --- a/internal/validation/validation.go +++ /dev/null @@ -1,22 +0,0 @@ -package validation - -import ( - "encoding/json" - "fmt" -) - -func ValidateConfig(conf any) error { - - // TODO find a better way validate config since jsonschema only takes a map[string]interface{} - data, err := json.Marshal(conf) - if err != nil { - panic(fmt.Errorf("Marshal Error: %w", err)) - } - var clone any - err = json.Unmarshal(data, &clone) - if err != nil { - panic(fmt.Errorf("Unmarshal Error: %w", err)) - } - - return schema.Validate(clone) -} diff --git a/main.go b/main.go deleted file mode 100644 index 963835e..0000000 --- a/main.go +++ /dev/null @@ -1,126 +0,0 @@ -package main - -import ( - "context" - "errors" - "os" - "os/signal" - "syscall" - "time" - - "github.com/godbus/dbus/v5" - "golang.org/x/exp/slog" - configAPI "nfsense.net/nfsense/internal/api/config" - "nfsense.net/nfsense/internal/api/firewall" - "nfsense.net/nfsense/internal/api/network" - "nfsense.net/nfsense/internal/api/object" - "nfsense.net/nfsense/internal/api/service" - "nfsense.net/nfsense/internal/api/system" - "nfsense.net/nfsense/internal/api/vpn" - "nfsense.net/nfsense/internal/chrony" - "nfsense.net/nfsense/internal/config" - dhcp "nfsense.net/nfsense/internal/dhcp_server" - "nfsense.net/nfsense/internal/jsonrpc" - "nfsense.net/nfsense/internal/networkd" - "nfsense.net/nfsense/internal/nftables" - "nfsense.net/nfsense/internal/server" - "nfsense.net/nfsense/internal/unbound" -) - -func main() { - slog.Info("Starting...") - - dbusConn, err := dbus.ConnectSystemBus() - if err != nil { - slog.Error("Connecting to DBus", "err", err) - // os.Exit(1) - } - defer dbusConn.Close() - - configManager := config.CreateConfigManager() - RegisterApplyFunctions(configManager) - - // Check for Subcommand - - apply := false - if len(os.Args) > 1 { - switch os.Args[1] { - case "apply": - apply = true - case "setup": - setup(configManager, dbusConn) - return - } - } - - err = configManager.LoadCurrentConfigFromDisk() - if err != nil { - slog.Error("Loading Current Config", "err", err) - os.Exit(1) - } - - slog.Info("Config Loaded") - - err = configManager.LoadPendingConfigFromDisk() - if err != nil { - if !errors.Is(err, os.ErrNotExist) { - slog.Error("Loading Pending Config", err) - } - err = configManager.DiscardPendingConfig() - if err != nil { - slog.Error("Discarding Pending Config", "err", err) - os.Exit(1) - } - } - - if apply { - slog.Info("Applying Config...") - err := configManager.ApplyPendingChanges() - if err != nil { - slog.Error("Applying Pending Config", "err", err) - os.Exit(1) - } - slog.Info("Config Applied, Exiting...") - return - } - - slog.Info("Setup API...") - apiHandler := jsonrpc.NewHandler(100 << 20) - RegisterAPIMethods(apiHandler, configManager, dbusConn) - - slog.Info("Starting Webserver...") - server.StartWebserver(configManager, apiHandler) - - slog.Info("Ready.") - - // Handle Exit Signal - sigChan := make(chan os.Signal, 1) - signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM) - <-sigChan - slog.Info("Got Signal, Exiting...") - - shutdownCtx, shutdownRelease := context.WithTimeout(context.Background(), 10*time.Second) - defer shutdownRelease() - - server.ShutdownWebserver(shutdownCtx) - - slog.Info("Done") -} - -func RegisterAPIMethods(apiHandler *jsonrpc.Handler, configManager *config.ConfigManager, dbusConn *dbus.Conn) { - apiHandler.Register("Config", &configAPI.Config{ConfigManager: configManager}) - apiHandler.Register("Firewall", &firewall.Firewall{ConfigManager: configManager}) - apiHandler.Register("Network", &network.Network{ConfigManager: configManager, DbusConn: dbusConn}) - apiHandler.Register("Object", &object.Object{ConfigManager: configManager}) - apiHandler.Register("Service", &service.Service{ConfigManager: configManager, DbusConn: dbusConn}) - apiHandler.Register("VPN", &vpn.VPN{ConfigManager: configManager, DbusConn: dbusConn}) - apiHandler.Register("System", &system.System{ConfigManager: configManager}) -} - -func RegisterApplyFunctions(configManager *config.ConfigManager) { - configManager.RegisterApplyFunction(networkd.ApplyNetworkdConfiguration) - configManager.RegisterApplyFunction(dhcp.ApplyDHCPServerConfiguration) - configManager.RegisterApplyFunction(chrony.ApplyNTPConfiguration) - configManager.RegisterApplyFunction(unbound.ApplyDNSServerConfiguration) - configManager.RegisterApplyFunction(nftables.ApplyNFTablesConfiguration) -} diff --git a/setup.go b/setup.go deleted file mode 100644 index 03d3baa..0000000 --- a/setup.go +++ /dev/null @@ -1,141 +0,0 @@ -package main - -import ( - "context" - "fmt" - "net/netip" - - "github.com/godbus/dbus/v5" - "github.com/pterm/pterm" - "golang.org/x/exp/slog" - "nfsense.net/nfsense/internal/api/network" - "nfsense.net/nfsense/internal/api/system" - "nfsense.net/nfsense/internal/config" - netdefs "nfsense.net/nfsense/internal/definitions/network" -) - -func setup(configManager *config.ConfigManager, dbusConn *dbus.Conn) { - slog.Info("Entering Setup...") - - err := configManager.LoadDefaultConfig() - if err != nil { - slog.Error("Loading Default Config", "err", err) - return - } - s := system.System{ConfigManager: configManager} - n := network.Network{ConfigManager: configManager, DbusConn: dbusConn} - - slog.Info("Create Admin User") - - err = createUser(s) - if err != nil { - slog.Error("Error Creating User", "err", err) - return - } - - slog.Info("Configure LAN Interface") - err = createInterface(n) - if err != nil { - slog.Error("Error Creating Interface", "err", err) - return - } - - slog.Info("Saving Changes...") - err = configManager.SaveWithoutApplying() - if err != nil { - slog.Error("Saving", "err", err) - return - } - - slog.Info("Setup Done") -} - -func createUser(s system.System) error { - username, err := pterm.DefaultInteractiveTextInput.WithDefaultText("Username").Show() - if err != nil { - return fmt.Errorf("Reading Username Prompt: %w", err) - } - -password: - - password, err := pterm.DefaultInteractiveTextInput.WithDefaultText("Password").WithMask("*").Show() - if err != nil { - return fmt.Errorf("Reading Password Prompt: %w", err) - } - - repeat, err := pterm.DefaultInteractiveTextInput.WithDefaultText("Repeat").WithMask("*").Show() - if err != nil { - return fmt.Errorf("Reading Repeat Prompt: %w", err) - } - - if password != repeat { - slog.Error("Password and Repeat Dont Match") - goto password - } - - _, err = s.CreateUser(context.Background(), system.CreateUserParameters{ - Name: username, - Password: password, - }) - if err != nil { - return fmt.Errorf("Doing API Call: %w", err) - } - return nil -} - -func createInterface(n network.Network) error { - links, err := n.GetLinks(context.Background(), struct{}{}) - if err != nil { - return fmt.Errorf("Getting Links: %w", err) - } - - options := []string{} - - for _, l := range links.Links { - options = append(options, l.Name) - } - - if len(options) == 0 { - return fmt.Errorf("No Links Found") - } - - link, err := pterm.DefaultInteractiveSelect.WithDefaultText("Select Hardware Interface").WithOptions(options).Show() - if err != nil { - return fmt.Errorf("Reading link Prompt: %w", err) - } - - interfaceName, err := pterm.DefaultInteractiveTextInput.WithDefaultText("Interface Name").Show() - if err != nil { - return fmt.Errorf("Reading Interface Prompt: %w", err) - } - - if interfaceName == "" { - return fmt.Errorf("Interface Name Cannot be empty") - } - - ipv4, err := pterm.DefaultInteractiveTextInput.WithDefaultText("Set IPv4 Address with CIDR").Show() - if err != nil { - return fmt.Errorf("Reading ipv4 Prompt: %w", err) - } - - address, err := netip.ParsePrefix(ipv4) - if err != nil { - return fmt.Errorf("Parsing ipv4: %w", err) - } - - _, err = n.CreateInterface(context.Background(), network.CreateInterfaceParameters{ - Name: interfaceName, - Interface: netdefs.Interface{ - Type: netdefs.Hardware, - HardwareDevice: &link, - AddressingMode: netdefs.Static, - Address: &address, - Comment: "Created by CLI Setup", - }, - }) - if err != nil { - return fmt.Errorf("Doing API Call: %w", err) - } - - return nil -} diff --git a/staticcheck.conf b/staticcheck.conf deleted file mode 100644 index 219a9ed..0000000 --- a/staticcheck.conf +++ /dev/null @@ -1,10 +0,0 @@ -checks = ["all", "-ST1005", "-ST1000", "-ST1003", "-ST1016"] -initialisms = ["ACL", "API", "ASCII", "CPU", "CSS", "DNS", - "EOF", "GUID", "HTML", "HTTP", "HTTPS", "ID", - "IP", "JSON", "QPS", "RAM", "RPC", "SLA", - "SMTP", "SQL", "SSH", "TCP", "TLS", "TTL", - "UDP", "UI", "GID", "UID", "UUID", "URI", - "URL", "UTF8", "VM", "XML", "XMPP", "XSRF", - "XSS"] -dot_import_whitelist = [] -http_status_code_whitelist = ["200", "400", "404", "500"] \ No newline at end of file