From 57c9b88898a174454b2458af5b211261c32a6b3f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Johannes=20B=C3=BClow?= Date: Sun, 28 Jan 2024 15:31:58 +0100 Subject: [PATCH] cleanup now runs in a loop in a separate goroutine --- .../machines/default/libvirt/created_networks | 1 + Makefile | 14 +++--- go.mod | 17 +++++-- go.sum | 27 ++++++++++++ main.go | 44 +++++++++++++++++-- pods/container.go | 23 +++++++--- pods/garbageCollector.go | 12 +++++ pods/manager.go | 43 ++++++++++++------ web/router.go | 31 +++++++++---- 9 files changed, 170 insertions(+), 42 deletions(-) create mode 100644 pods/garbageCollector.go diff --git a/.vagrant/machines/default/libvirt/created_networks b/.vagrant/machines/default/libvirt/created_networks index a1f058e..066625a 100644 --- a/.vagrant/machines/default/libvirt/created_networks +++ b/.vagrant/machines/default/libvirt/created_networks @@ -1,3 +1,4 @@ 5533801d-70e3-4c21-9942-82d20930c789 5533801d-70e3-4c21-9942-82d20930c789 5533801d-70e3-4c21-9942-82d20930c789 +5533801d-70e3-4c21-9942-82d20930c789 diff --git a/Makefile b/Makefile index 5a10f13..3c9993d 100644 --- a/Makefile +++ b/Makefile @@ -1,19 +1,17 @@ release: deps - CGO_ENABLED=1 go build -v -x -buildvcs=true . + CGO_ENABLED=1 go build -buildvcs=true . dev: go build . ./podterminal -clean: - rm -f filegate - # rm -f config.yaml - rm -f db.sqlite - rm -rf storage/ - deps: go mod download go mod tidy - +install: + mv podterminal /usr/local/bin/podterminal + mkdir -p /etc/podterminal + useradd -r -s /bin/false podterminal + install -m 644 ./exampleconfig.yaml /etc/podterminal/config.yaml diff --git a/go.mod b/go.mod index a404c9e..12e88ab 100644 --- a/go.mod +++ b/go.mod @@ -76,6 +76,7 @@ require ( github.com/gorilla/sessions v1.2.1 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-multierror v1.1.1 // indirect + github.com/hashicorp/hcl v1.0.0 // indirect github.com/jinzhu/copier v0.4.0 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect @@ -85,6 +86,7 @@ require ( github.com/kr/fs v0.1.0 // indirect github.com/leodido/go-urn v1.2.4 // indirect github.com/letsencrypt/boulder v0.0.0-20230213213521-fdfea0d469b6 // indirect + github.com/magiconair/properties v1.8.7 // indirect github.com/mailru/easyjson v0.7.7 // indirect github.com/manifoldco/promptui v0.9.0 // indirect github.com/mattn/go-isatty v0.0.19 // indirect @@ -113,13 +115,20 @@ require ( github.com/pkg/sftp v1.13.6 // indirect github.com/proglottis/gpgme v0.1.3 // indirect github.com/rivo/uniseg v0.4.4 // indirect + github.com/sagikazarmark/locafero v0.4.0 // indirect + github.com/sagikazarmark/slog-shim v0.1.0 // indirect github.com/secure-systems-lab/go-securesystemslib v0.7.0 // indirect github.com/sigstore/fulcio v1.4.3 // indirect github.com/sigstore/rekor v1.2.2 // indirect github.com/sigstore/sigstore v1.7.5 // indirect github.com/sirupsen/logrus v1.9.3 // indirect + github.com/sourcegraph/conc v0.3.0 // indirect + github.com/spf13/afero v1.11.0 // indirect + github.com/spf13/cast v1.6.0 // indirect github.com/spf13/pflag v1.0.5 // indirect + github.com/spf13/viper v1.18.2 // indirect github.com/stefanberger/go-pkcs11uri v0.0.0-20201008174630-78d3cae3a980 // indirect + github.com/subosito/gotenv v1.6.0 // indirect github.com/sylabs/sif/v2 v2.15.0 // indirect github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635 // indirect github.com/tchap/go-patricia/v2 v2.3.1 // indirect @@ -132,20 +141,22 @@ require ( go.mongodb.org/mongo-driver v1.11.3 // indirect go.mozilla.org/pkcs7 v0.0.0-20210826202110-33d05740a352 // indirect go.opencensus.io v0.24.0 // indirect + go.uber.org/multierr v1.11.0 // indirect golang.org/x/arch v0.5.0 // indirect golang.org/x/crypto v0.17.0 // indirect golang.org/x/exp v0.0.0-20231006140011-7918f672742d // indirect golang.org/x/mod v0.13.0 // indirect - golang.org/x/net v0.18.0 // indirect + golang.org/x/net v0.19.0 // indirect golang.org/x/sync v0.5.0 // indirect golang.org/x/sys v0.15.0 // indirect golang.org/x/term v0.15.0 // indirect golang.org/x/text v0.14.0 // indirect golang.org/x/tools v0.14.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20230920204549-e6e6cdab5c13 // indirect - google.golang.org/grpc v1.58.3 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20231120223509-83a465c0220f // indirect + google.golang.org/grpc v1.59.0 // indirect google.golang.org/protobuf v1.31.0 // indirect gopkg.in/go-jose/go-jose.v2 v2.6.1 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect sigs.k8s.io/yaml v1.4.0 // indirect diff --git a/go.sum b/go.sum index c035441..4472723 100644 --- a/go.sum +++ b/go.sum @@ -604,6 +604,7 @@ github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+l github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/honeycombio/beeline-go v1.10.0 h1:cUDe555oqvw8oD76BQJ8alk7FP0JZ/M/zXpNvOEDLDc= github.com/honeycombio/beeline-go v1.10.0/go.mod h1:Zz5WMeQCJzFt2Mvf8t6HC1X8RLskLVR/e8rvcmXB1G8= @@ -682,6 +683,8 @@ github.com/letsencrypt/boulder v0.0.0-20230213213521-fdfea0d469b6 h1:unJdfS94Y3k github.com/letsencrypt/boulder v0.0.0-20230213213521-fdfea0d469b6/go.mod h1:PUgW5vI9ANEaV6qv9a6EKu8gAySgwf0xrzG9xIB/CK0= github.com/linuxkit/virtsock v0.0.0-20201010232012-f8cee7dfc7a3/go.mod h1:3r6x7q95whyfWQpmGZTu3gk3v2YkMi05HEzl7Tf7YEo= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= +github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= @@ -889,6 +892,10 @@ github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDN github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/safchain/ethtool v0.0.0-20190326074333-42ed695e3de8/go.mod h1:Z0q5wiBQGYcxhMZ6gUqHn6pYNLypFAvaL3UvgZLR0U4= +github.com/sagikazarmark/locafero v0.4.0 h1:HApY1R9zGo4DBgr7dqsTH/JJxLTTsOt7u6keLGt6kNQ= +github.com/sagikazarmark/locafero v0.4.0/go.mod h1:Pe1W6UlPYUk/+wc/6KFhbORCfqzgYEpgQ3O5fPuL3H4= +github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE= +github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= github.com/sclevine/spec v1.2.0/go.mod h1:W4J29eT/Kzv7/b9IWLB055Z+qvVC9vt0Arko24q7p+U= github.com/sebdah/goldie/v2 v2.5.3 h1:9ES/mNN+HNUbNWpVAlrzuZ7jE+Nrczbj8uFRjM7624Y= @@ -923,10 +930,16 @@ github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVs github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= +github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= +github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= +github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8= +github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cast v1.6.0 h1:GEiTHELF+vaR5dhz3VqZfFSzZjYbgeKDpBxQVS4GYJ0= +github.com/spf13/cast v1.6.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= github.com/spf13/cobra v0.0.2-0.20171109065643-2da4a54c5cee/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= @@ -940,6 +953,8 @@ github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnIn github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= +github.com/spf13/viper v1.18.2 h1:LUXCnvUvSM6FXAsj6nnfc8Q2tp1dIgUfY9Kc8GsSOiQ= +github.com/spf13/viper v1.18.2/go.mod h1:EKmWIqdnk5lOcmR72yw6hS+8OPYcwD0jteitLMVB+yk= github.com/stefanberger/go-pkcs11uri v0.0.0-20201008174630-78d3cae3a980 h1:lIOOHPEbXzO3vnmx2gok1Tfs31Q8GQqKLc8vVqyQq/I= github.com/stefanberger/go-pkcs11uri v0.0.0-20201008174630-78d3cae3a980/go.mod h1:AO3tvPzVZ/ayst6UlUKUv6rcPQInYe3IknH3jYhAKu8= github.com/stretchr/objx v0.0.0-20180129172003-8a3f7159479f/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= @@ -961,6 +976,8 @@ github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= 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/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= +github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= github.com/sylabs/sif/v2 v2.15.0 h1:Nv0tzksFnoQiQ2eUwpAis9nVqEu4c3RcNSxX8P3Cecw= github.com/sylabs/sif/v2 v2.15.0/go.mod h1:X1H7eaPz6BAxA84POMESXoXfTqgAnLQkujyF/CQFWTc= github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= @@ -1054,6 +1071,8 @@ go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqe go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= golang.org/x/arch v0.5.0 h1:jpGode6huXQxcskEIpOCvrU+tzo81b6+oFLUYXWtH/Y= @@ -1160,6 +1179,8 @@ golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= golang.org/x/net v0.18.0 h1:mIYleuAkSbHh0tCv7RvjL3F6ZVbLjq4+R7zbOn3Kokg= golang.org/x/net v0.18.0/go.mod h1:/czyP5RqHAH4odGYxBJ1qz0+CE5WZ+2j1YgoEo8F2jQ= +golang.org/x/net v0.19.0 h1:zTwKpTd2XuCqf8huc7Fo2iSy+4RHPd10s4KzeTnVr1c= +golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1395,6 +1416,8 @@ google.golang.org/genproto v0.0.0-20200527145253-8367513e4ece/go.mod h1:jDfRM7Fc google.golang.org/genproto v0.0.0-20201110150050-8816d57aaa9a/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto/googleapis/rpc v0.0.0-20230920204549-e6e6cdab5c13 h1:N3bU/SQDCDyD6R528GJ/PwW9KjYcJA3dgyH+MovAkIM= google.golang.org/genproto/googleapis/rpc v0.0.0-20230920204549-e6e6cdab5c13/go.mod h1:KSqppvjFjtoCI+KGd4PELB0qLNxdJHRGqRI09mB6pQA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20231120223509-83a465c0220f h1:ultW7fxlIvee4HYrtnaRPon9HpEgFk5zYpmfMgtKB5I= +google.golang.org/genproto/googleapis/rpc v0.0.0-20231120223509-83a465c0220f/go.mod h1:L9KNLi232K1/xB6f7AlSX692koaRnKaWSR0stBki0Yc= google.golang.org/grpc v0.0.0-20160317175043-d3ddb4469d5a/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= @@ -1415,6 +1438,8 @@ google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAG google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= google.golang.org/grpc v1.58.3 h1:BjnpXut1btbtgN/6sp+brB2Kbm2LjNXnidYujAVbSoQ= google.golang.org/grpc v1.58.3/go.mod h1:tgX3ZQDlNJGU96V6yHh1T/JeoBQ2TXdr43YbYSsCJk0= +google.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk= +google.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -1448,6 +1473,8 @@ gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKW gopkg.in/go-jose/go-jose.v2 v2.6.1 h1:qEzJlIDmG9q5VO0M/o8tGS65QMHMS1w01TQJB1VPJ4U= gopkg.in/go-jose/go-jose.v2 v2.6.1/go.mod h1:zzZDPkNNw/c9IE7Z9jr11mBZQhKQTMzoEEIoEdZlFBI= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= diff --git a/main.go b/main.go index 38119d7..835ef5e 100644 --- a/main.go +++ b/main.go @@ -3,6 +3,9 @@ package main import ( "log" "net" + "os" + + "github.com/spf13/viper" "git.jmbit.de/jmb/podterminal/pods" "git.jmbit.de/jmb/podterminal/utils" @@ -10,17 +13,52 @@ import ( ) func main() { + readConfigFile() laddr := &net.TCPAddr{ IP: net.IPv4zero, - Port: 80, + Port: viper.GetInt("port"), } + log.Println("Binding Port ", viper.GetInt("port")) listener, err := net.ListenTCP("tcp", laddr) if err != nil { - log.Fatal("could not bind to port 80", err) + log.Fatalln("could not bind to port ", viper.GetInt("port"), ": ", err) } pods.ConnectSocket() // Dumm, ich weiß utils.DropPrivileges("podterminal") - pods.Cleanup() + log.Println("Dropped Privileges") + pods.PullImage() + // Jank + go pods.GarbageCollector() web.Run(listener) } + +func readConfigFile() { + log.Println("Reading Config") + viper.SetConfigFile("/etc/podterminal/config.yaml") + viper.SetDefault("port", 80) + viper.SetDefault("image", "lscr.io/linuxserver/webtop") + viper.SetDefault("maxAge", 10800) + viper.SetDefault("dri", false) + viper.SetDefault("dir_node", "/dev/dri/renderD128") + viper.SetDefault("envvars", + map[string]string{ + "CUSTOM_USER": "user", + "PASSWORD": "", + "TITLE": "Podterminal", + }, + ) + if _, err := os.Stat("/etc/podterminal/config.yaml"); os.IsNotExist(err) { + log.Println("Config file does not exist, creating") + os.MkdirAll("/etc/podterminal", 755) + err := viper.WriteConfig() + if err != nil { + log.Fatalln("could not write default config", err) + } + } + err := viper.ReadInConfig() + if err != nil { + log.Fatalln("could not read config file", err) + } + log.Println("Finished reading Config") +} diff --git a/pods/container.go b/pods/container.go index 7d9c43b..16a55d6 100644 --- a/pods/container.go +++ b/pods/container.go @@ -5,19 +5,29 @@ import ( "github.com/containers/podman/v4/pkg/bindings/containers" "github.com/containers/podman/v4/pkg/specgen" + runtime_spec "github.com/opencontainers/runtime-spec/specs-go" + "github.com/spf13/viper" ) func CreateContainer() (string, error) { - image := "docker.io/linuxserver/webtop" + image := viper.GetString("image") conn := Socket envmap := make(map[string]string) + driDevice := runtime_spec.LinuxDevice{ + Path: viper.GetString("dri_node"), + } + for envvar, value := range viper.GetStringMap("envvars") { + envmap[envvar] = value.(string) + } s := specgen.NewSpecGenerator(image, false) - envmap["PASSWORD"] = "" - envmap["TITLE"] = "Pod Terminal" - envmap["PUID"] = "1000" - envmap["GUID"] = "1000" s.Env = envmap + + // Experimental DRI support for GPU acceleration in Container + if viper.GetBool("dri") == true { + s.Devices = []runtime_spec.LinuxDevice{driDevice} + } createResponse, err := containers.CreateWithSpec(conn, s, nil) + log.Println("Created Container ", createResponse.ID, err, createResponse.Warnings) return createResponse.ID, err } @@ -28,6 +38,7 @@ func StartContainer(id string) error { func DestroyContainer(id string) error { conn := Socket + log.Println("Deleting Container", id) if err := containers.Kill(conn, id, nil); err != nil { log.Println(err) return err @@ -44,7 +55,7 @@ func GetContainerIP(id string) (string, error) { container, err := containers.Inspect(conn, id, nil) if err != nil { - log.Println(err) + log.Println("Could not get IP of container", err) return "", err } ip := container.NetworkSettings.IPAddress diff --git a/pods/garbageCollector.go b/pods/garbageCollector.go new file mode 100644 index 0000000..854565d --- /dev/null +++ b/pods/garbageCollector.go @@ -0,0 +1,12 @@ +package pods + +import ( + "time" +) + +func GarbageCollector() { + for { + Cleanup() + time.Sleep(time.Minute * 10) + } +} diff --git a/pods/manager.go b/pods/manager.go index c1c4a71..2ab1a9b 100644 --- a/pods/manager.go +++ b/pods/manager.go @@ -3,10 +3,13 @@ package pods import ( "context" "log" + "time" "github.com/containers/podman/v4/pkg/bindings" "github.com/containers/podman/v4/pkg/bindings/containers" "github.com/containers/podman/v4/pkg/bindings/images" + "github.com/containers/podman/v4/pkg/domain/entities" + "github.com/spf13/viper" ) var Socket context.Context @@ -29,7 +32,8 @@ func ConnectSocket() { } func PullImage() { - image := "docker.io/linuxserver/webtop" + log.Println("Downloading Container image ", viper.GetString("image")) + image := viper.GetString("image") conn := Socket _, err := images.Pull(conn, image, nil) if err != nil { @@ -37,20 +41,33 @@ func PullImage() { } } +// Cleanup deletes Containers older than the specified maximum Age (Equal to session cookie maximum age) func Cleanup() { + log.Println("Starting cleanup function") + containerList := containerList() + + for _, container := range containerList { + now := time.Now() + maxAge := time.Second * time.Duration(viper.GetInt("maxAge")) + containerAge := now.Sub(container.Created) + if containerAge > maxAge { + + err := containers.Kill(Socket, container.ID, nil) + if err != nil { + log.Println(err) + } + _, err = containers.Remove(Socket, container.ID, nil) + if err != nil { + log.Println(err) + } + } + } +} + +func containerList() []entities.ListContainer { containerList, err := containers.List(Socket, nil) if err != nil { - log.Println(err) + log.Println("Could not get Containers", err) } - for _, container := range containerList { - err = containers.Kill(Socket, container.ID, nil) - if err != nil { - log.Println(err) - } - _, err := containers.Remove(Socket, container.ID, nil) - if err != nil { - log.Println(err) - } - } - + return containerList } diff --git a/web/router.go b/web/router.go index bfd4faa..31ee5c0 100644 --- a/web/router.go +++ b/web/router.go @@ -12,6 +12,7 @@ import ( "github.com/gin-contrib/sessions/cookie" "github.com/gin-gonic/gin" "github.com/google/uuid" + "github.com/spf13/viper" "git.jmbit.de/jmb/podterminal/pods" ) @@ -28,15 +29,20 @@ func Run(listener net.Listener) error { } func setupRouter() *gin.Engine { + log.Println("Setting up router") gin.ForceConsoleColor() gin.SetMode("release") router := gin.New() store := cookie.NewStore([]byte(uuid.NewString())) + store.Options(sessions.Options{ + MaxAge: viper.GetInt("maxAge"), + }) router.Use(gin.Recovery()) router.Use(sessions.Sessions("session", store)) - router.Use(urlLog()) + //router.Use(urlLog()) router.Use(containerProxy) // router.Any("/", containerProxy) + log.Println("Router is ready") return router } @@ -54,10 +60,11 @@ func urlLog() gin.HandlerFunc { func createReverseProxy(backendService string) (*httputil.ReverseProxy, error) { var err error + log.Println("Creating reverse Proxy for ", backendService) backendURL, err := url.Parse(backendService) if err != nil { - log.Printf("Could not parees backend URL: %v", err) + log.Printf("Could not parse backend URL: %v", err) } proxy := &httputil.ReverseProxy{ @@ -72,15 +79,17 @@ func createReverseProxy(backendService string) (*httputil.ReverseProxy, error) { func containerProxy(c *gin.Context) { session := sessions.Default(c) + sessionID := session.ID() if session.Get("ct") == nil { + log.Println("Creating Container for Session ", sessionID) ct, err := pods.CreateContainer() if err != nil { - c.HTML(500, "Error", fmt.Sprintf("Could not create Container: %v", err)) + c.HTML(500, "Error", fmt.Sprintf("[%s] Could not create Container: %v", sessionID, err)) c.Abort() } err = pods.StartContainer(ct) if err != nil { - c.HTML(500, "Error", fmt.Sprintf("Could not start Container: %v", err)) + c.HTML(500, "Error", fmt.Sprintf("[%s] Could not start Container: %v", sessionID, err)) c.Abort() } // Hack to wait for Container to start up and get assigned an IP @@ -88,26 +97,30 @@ func containerProxy(c *gin.Context) { ctip, err := pods.GetContainerIP(ct) if err != nil { - c.HTML(500, "Error", fmt.Sprintf("Could not get Container ip: %v", err)) + c.HTML(500, "Error", fmt.Sprintf("[%s] Could not get Container ip: %v", sessionID, err)) c.Abort() } proxies[ct], err = createReverseProxy(fmt.Sprintf("http://%s:3000", ctip)) if err != nil { - c.HTML(500, "Error", fmt.Sprintf("Could not create Container Proxy: %v", err)) + c.HTML( + 500, + "Error", + fmt.Sprintf("[%s] Could not create Container Proxy: %v", sessionID, err), + ) c.Abort() } session.Set("ct", ct) session.Save() c.Redirect(301, "/") } else { - sessionID := session.Get("ct") - switch sessionID.(type) { + sessionCT := session.Get("ct") + switch sessionCT.(type) { case string: default: - c.HTML(500, "Error", "SessionID is not a string") + c.HTML(500, "Error", "Session Container ID is not a string") c.Abort() } id := session.Get("ct").(string)