diff --git a/Dockerfile b/Dockerfile index 264afb0..5648fe0 100644 --- a/Dockerfile +++ b/Dockerfile @@ -8,22 +8,33 @@ WORKDIR /app COPY . . -RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories -RUN apk add gcc g++ -RUN go env && CGO_ENABLED=1 GOOS=linux GOARCH=amd64 go build -a -ldflags '-linkmode external -extldflags "-static"' -o next_terminal main.go +RUN go env && CGO_ENABLED=0 go build -o nt main.go FROM guacamole/guacd:1.2.0 LABEL MAINTAINER="helloworld1024@foxmail.com" -WORKDIR /opt/next_terminal +RUN apt-get update && apt-get -y install supervisor +RUN mkdir -p /var/log/supervisor +COPY --from=builder /app/supervisord.conf /etc/supervisor/conf.d/supervisord.conf -COPY --from=builder /app/next_terminal ./ -COPY --from=builder /app/next-terminal.yml ./ +ENV MYSQL_HOSTNAME 127.0.0.1 +ENV MYSQL_PORT 3306 +ENV MYSQL_USERNAME mysql +ENV MYSQL_PASSWORD mysql +ENV MYSQL_DATABASE next_terminal +ENV SERVER_PORT 8088 + +WORKDIR /usr/local/nt + +COPY --from=builder /app/nt ./ +COPY --from=builder /app/config.yml ./ COPY --from=builder /app/web/build ./web/build +COPY --from=builder /app/web/src/fonts/Menlo-Regular-1.ttf /usr/share/fonts/ -RUN touch next-terminal.db & chmod +x next_terminal +RUN mkfontscale && mkfontdir && fc-cache -EXPOSE 8088 +EXPOSE $SERVER_PORT -ENTRYPOINT ./next_terminal \ No newline at end of file +RUN mkdir recording && mkdir drive +ENTRYPOINT /usr/bin/supervisord \ No newline at end of file diff --git a/config.yml b/config.yml new file mode 100644 index 0000000..097253e --- /dev/null +++ b/config.yml @@ -0,0 +1,8 @@ +mysql: + hostname: 127.0.0.1 + port: 3306 + username: root + password: root + database: next_terminal +server: + addr: 0.0.0.0:8088 \ No newline at end of file diff --git a/go.mod b/go.mod index bb6f8d5..d8d3ab3 100644 --- a/go.mod +++ b/go.mod @@ -3,17 +3,16 @@ module next-terminal go 1.13 require ( - github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d // indirect - github.com/go-ole/go-ole v1.2.4 // indirect github.com/gofrs/uuid v3.3.0+incompatible github.com/gorilla/websocket v1.4.2 github.com/labstack/echo/v4 v4.1.17 github.com/labstack/gommon v0.3.0 github.com/patrickmn/go-cache v2.1.0+incompatible github.com/pkg/sftp v1.12.0 + github.com/sirupsen/logrus v1.2.0 + github.com/spf13/pflag v1.0.3 github.com/spf13/viper v1.7.1 golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a - gorm.io/driver/mysql v1.0.1 - gorm.io/driver/sqlite v1.1.4 + gorm.io/driver/mysql v1.0.3 gorm.io/gorm v1.20.7 ) diff --git a/go.sum b/go.sum index cd6e167..7e3cf5b 100644 --- a/go.sum +++ b/go.sum @@ -11,11 +11,10 @@ cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqCl cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d h1:G0m3OIz70MZUWq3EgK3CesDbo8upS2Vm9/P3FtgI+Jk= -github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= @@ -25,9 +24,6 @@ github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24 github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= -github.com/boj/redistore v0.0.0-20180917114910-cd5dcc76aeff/go.mod h1:+RTT1BOk5P97fT2CiHkbFQwkK3mjsFAP6zCYV2aXtjw= -github.com/bradfitz/gomemcache v0.0.0-20190329173943-551aad21a668/go.mod h1:H0wQNHz2YrLsuXOZozoeDmnHXkNCRmMW0gwFWDfEZDA= -github.com/bradleypeabody/gorilla-sessions-memcache v0.0.0-20181103040241-659414f458e1/go.mod h1:dkChI7Tbtx7H1Tj7TqGSZMOeGpMP5gLHtjroHd4agiI= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= @@ -45,30 +41,10 @@ github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5Kwzbycv github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/gin-contrib/sessions v0.0.3 h1:PoBXki+44XdJdlgDqDrY5nDVe3Wk7wDV/UCOuLP6fBI= -github.com/gin-contrib/sessions v0.0.3/go.mod h1:8C/J6cad3Il1mWYYgtw0w+hqasmpvy25mPkXdOgeB9I= -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.5.0/go.mod h1:Nd6IXA8m5kNZdNEHMBd93KT+mdY3+bewLgRvmCsR2Do= -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/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-ole/go-ole v1.2.4 h1:nNBDSCOigTSiarFpYE9J/KtEA1IOW4CNeqT9TQDqCxI= -github.com/go-ole/go-ole v1.2.4/go.mod h1:XCwSNxSkXRo4vlyPy93sltvi/qJq0jqQhjqQNIwKuxM= -github.com/go-playground/assert/v2 v2.0.1 h1:MsBgLAaY856+nPRTKrp3/OZK38U/wa0CcBYNjji3q3A= -github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= -github.com/go-playground/locales v0.12.1/go.mod h1:IUMDtCfWo/w/mtMfIE/IG2K+Ey3ygWanZIBtBW0W2TM= -github.com/go-playground/locales v0.13.0 h1:HyWk6mgj5qFqCT5fjGBuRArbVDfE4hi8+e8ceBS/t7Q= -github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= -github.com/go-playground/universal-translator v0.16.0/go.mod h1:1AnU7NaIRDWWzGEKwgtJRd2xk99HeFyHw3yid4rvQIY= -github.com/go-playground/universal-translator v0.17.0 h1:icxd5fm+REJzpZx7ZfpaD876Lmtgy7VtROAbHHXk8no= -github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= -github.com/go-playground/validator/v10 v10.2.0 h1:KgJ0snyC2R9VXYN2rneOtQcw5aHQB1Vv0sFl1UcHBOY= -github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= github.com/go-sql-driver/mysql v1.5.0 h1:ozyZYNQW3x3HtqT1jira07DN2PArx2v7/mN66gGcHOs= github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= @@ -84,28 +60,18 @@ github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFU github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.3 h1:gyjaxf+svBWX08ZjK86iN9geUJF0H6gp2IRKX6Nf6/I= -github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/gomodule/redigo v2.0.0+incompatible/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gorilla/context v1.1.1 h1:AWwleXJkX/nhcU9bZSnZoi3h/qGYqQAGhq6zZe/aQW8= -github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= -github.com/gorilla/securecookie v1.1.1 h1:miw7JPhV+b/lAHSXz4qd/nN9jRiAFV5FwjeKyCS8BvQ= -github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= -github.com/gorilla/sessions v1.1.1/go.mod h1:8KCfur6+4Mqcc6S0FEfKuN15Vl5MgXW92AE8ovaJD0w= -github.com/gorilla/sessions v1.1.3 h1:uXoZdcdA5XdXF3QzuSlheVRUvjl+1rKY7zBXL68L9RU= -github.com/gorilla/sessions v1.1.3/go.mod h1:8KCfur6+4Mqcc6S0FEfKuN15Vl5MgXW92AE8ovaJD0w= github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= @@ -138,31 +104,26 @@ github.com/jinzhu/now v1.1.1 h1:g39TucaRWyV3dwDO++eEc6qf8TVIQ/Da48WmqjZ3i7E= github.com/jinzhu/now v1.1.1/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -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/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= +github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/kidstuff/mongostore v0.0.0-20181113001930-e650cd85ee4b/go.mod h1:g2nVr8KZVXJSS97Jo8pJ0jgq29P6H7dG0oplUA86MQw= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/fs v0.1.0 h1:Jskdu9ieNAYnjxsi0LbQp1ulIKZV1LAFgK1tWhpZgl8= github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= +github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= 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 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/labstack/echo v1.4.4 h1:1bEiBNeGSUKxcPDGfZ/7IgdhJJZx8wV/pICJh4W2NJI= -github.com/labstack/echo v3.3.10+incompatible h1:pGRcYk231ExFAyoAjAfD85kQzRJCRI8bbnE7CX5OEgg= github.com/labstack/echo/v4 v4.1.17 h1:PQIBaRplyRy3OjwILGkPg89JRtH2x5bssi59G2EL3fo= github.com/labstack/echo/v4 v4.1.17/go.mod h1:Tn2yRQL/UclUalpb5rPdXDevbkJ+lp/2svdyFBg6CHQ= github.com/labstack/gommon v0.3.0 h1:JEeO0bvc78PKdyHxloTKiF8BD5iGrH8T6MSeGvSgob0= github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= -github.com/leodido/go-urn v1.1.0/go.mod h1:+cyI34gQWZcE1eQU7NVgKkkzdXDQHr1dBMtdAPozLkw= -github.com/leodido/go-urn v1.2.0 h1:hpXL4XnriNwQ/ABnpepYM/1vCLWNDfUNts8dX3xTG6Y= -github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= github.com/magiconair/properties v1.8.1 h1:ZC2Vc7/ZFkGmsVC9KvOjumD+G5lXy2RtTKyzRKO2BQ4= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= @@ -174,10 +135,7 @@ github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hd github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= 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-sqlite3 v1.14.5 h1:1IdxlwTNazvbKJQSxoJ5/9ECbEeaTTyeU7sEAZ5KKTQ= -github.com/mattn/go-sqlite3 v1.14.5/go.mod h1:WVKg1VTActs4Qso6iwGbiFih2UIHo0ENGwNd0Lj+XmI= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/memcachier/mc v2.0.1+incompatible/go.mod h1:7bkvFE61leUBvXz+yxsOnGBQSZpBSPIMUQSmmSHvuXc= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= @@ -187,12 +145,8 @@ github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0Qu github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -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/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/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/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= @@ -220,15 +174,15 @@ github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y8 github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= -github.com/quasoft/memstore v0.0.0-20180925164028-84a050167438/go.mod h1:wTPjTepVu7uJBYgZ0SdWHQlIas582j6cn2jgk4DDdlg= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/shirou/gopsutil v3.20.10+incompatible h1:kQuRhh6h6y4luXvnmtu/lJEGtdJ3q8lbu9NQY99GP+o= -github.com/shirou/gopsutil v3.20.10+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= +github.com/sirupsen/logrus v1.2.0 h1:juTguoYk5qI21pwyTXY3B3Y5cOTH3ZUyZCg1v/mihuo= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= @@ -248,14 +202,11 @@ github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXf github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -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/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= @@ -389,10 +340,9 @@ google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ij gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= -gopkg.in/go-playground/validator.v9 v9.29.1/go.mod h1:+c9/zcJMFNgbLvly1L1V+PpxWdVbfP1avr/N00E2vyQ= gopkg.in/ini.v1 v1.51.0 h1:AQvPpx3LzTDM0AjnIRlVFwFFGC+npRopjZxLJj6gdno= gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= @@ -401,16 +351,11 @@ gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4 h1:/eiJrUcujPVeJ3xlSWaiNi3uSVmDGBK1pDHUHAnao1I= 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 h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gorm.io/driver/mysql v1.0.1 h1:omJoilUzyrAp0xNoio88lGJCroGdIOen9hq2A/+3ifw= -gorm.io/driver/mysql v1.0.1/go.mod h1:KtqSthtg55lFp3S5kUXqlGaelnWpKitn4k1xZTnoiPw= -gorm.io/driver/sqlite v1.1.4 h1:PDzwYE+sI6De2+mxAneV9Xs11+ZyKV6oxD3wDGkaNvM= -gorm.io/driver/sqlite v1.1.4/go.mod h1:mJCeTFr7+crvS+TRnWc5Z3UvwxUN1BGBLMrf5LA9DYw= -gorm.io/gorm v1.9.19/go.mod h1:0HFTzE/SqkGTzK6TlDPPQbAYCluiVvhzoA1+aVyzenw= -gorm.io/gorm v1.20.0 h1:qfIlyaZvrF7kMWY3jBdEBXkXJ2M5MFYMTppjILxS3fQ= -gorm.io/gorm v1.20.0/go.mod h1:0HFTzE/SqkGTzK6TlDPPQbAYCluiVvhzoA1+aVyzenw= +gorm.io/driver/mysql v1.0.3 h1:+JKBYPfn1tygR1/of/Fh2T8iwuVwzt+PEJmKaXzMQXg= +gorm.io/driver/mysql v1.0.3/go.mod h1:twGxftLBlFgNVNakL7F+P/x9oYqoymG3YYT8cAfI9oI= +gorm.io/gorm v1.20.4/go.mod h1:0HFTzE/SqkGTzK6TlDPPQbAYCluiVvhzoA1+aVyzenw= gorm.io/gorm v1.20.7 h1:rMS4CL3pNmYq1V5/X+nHHjh1Dx6dnf27+Cai5zabo+M= gorm.io/gorm v1.20.7/go.mod h1:0HFTzE/SqkGTzK6TlDPPQbAYCluiVvhzoA1+aVyzenw= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/main.go b/main.go index 7a5a497..4c075f8 100644 --- a/main.go +++ b/main.go @@ -1,12 +1,15 @@ package main import ( + "fmt" "github.com/labstack/gommon/log" "github.com/patrickmn/go-cache" - "gorm.io/driver/sqlite" + "gorm.io/driver/mysql" "gorm.io/gorm" + "gorm.io/gorm/logger" "next-terminal/pkg/api" "next-terminal/pkg/config" + "next-terminal/pkg/global" "next-terminal/pkg/handle" "next-terminal/pkg/model" "next-terminal/pkg/utils" @@ -19,18 +22,24 @@ func main() { } func Run() error { - config.NextTerminal = config.SetupConfig() + global.Config = config.SetupConfig() var err error - //config.DB, err = gorm.Open(mysql.Open(config.NextTerminal.Dsn), &gorm.Config{ - // Logger: logger.Default.LogMode(logger.Info), - //}) - config.DB, err = gorm.Open(sqlite.Open("next-terminal.db"), &gorm.Config{}) + dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True&loc=Local", + global.Config.Mysql.Username, + global.Config.Mysql.Password, + global.Config.Mysql.Hostname, + global.Config.Mysql.Port, + global.Config.Mysql.Database, + ) + global.DB, err = gorm.Open(mysql.Open(dsn), &gorm.Config{ + Logger: logger.Default.LogMode(logger.Info), + }) if err != nil { log.Fatal("连接数据库异常", err) } - if err := config.DB.AutoMigrate(&model.User{}); err != nil { + if err := global.DB.AutoMigrate(&model.User{}); err != nil { return err } @@ -53,23 +62,23 @@ func Run() error { } } - if err := config.DB.AutoMigrate(&model.Asset{}); err != nil { + if err := global.DB.AutoMigrate(&model.Asset{}); err != nil { return err } - if err := config.DB.AutoMigrate(&model.Session{}); err != nil { + if err := global.DB.AutoMigrate(&model.Session{}); err != nil { return err } - if err := config.DB.AutoMigrate(&model.Command{}); err != nil { + if err := global.DB.AutoMigrate(&model.Command{}); err != nil { return err } - if err := config.DB.AutoMigrate(&model.Credential{}); err != nil { + if err := global.DB.AutoMigrate(&model.Credential{}); err != nil { return err } - if err := config.DB.AutoMigrate(&model.Property{}); err != nil { + if err := global.DB.AutoMigrate(&model.Property{}); err != nil { return err } - if err := config.DB.AutoMigrate(&model.Num{}); err != nil { + if err := global.DB.AutoMigrate(&model.Num{}); err != nil { return err } @@ -81,13 +90,15 @@ func Run() error { } } - config.Cache = cache.New(5*time.Minute, 10*time.Minute) - config.Store = config.NewStore() + global.Cache = cache.New(5*time.Minute, 10*time.Minute) + global.Store = global.NewStore() e := api.SetupRoutes() + if err := handle.InitProperties(); err != nil { + return err + } // 启动定时任务 //go handle.RunTicker() go handle.RunDataFix() - go handle.InitProperties() - return e.Start(config.NextTerminal.Addr) + return e.Start(global.Config.Server.Addr) } diff --git a/next-terminal.yml b/next-terminal.yml deleted file mode 100644 index 187d681..0000000 --- a/next-terminal.yml +++ /dev/null @@ -1,4 +0,0 @@ -next-terminal: -# dsn: root:root@tcp(127.0.0.1:3306)/next-terminal?charset=utf8mb4&parseTime=True&loc=Local - dsn: root:mysql@tcp(172.16.101.32:3306)/next-terminal?charset=utf8mb4&parseTime=True&loc=Local - addr: 0.0.0.0:8088 diff --git a/pkg/api/account.go b/pkg/api/account.go index 9ebbb1d..73d914a 100644 --- a/pkg/api/account.go +++ b/pkg/api/account.go @@ -2,7 +2,7 @@ package api import ( "github.com/labstack/echo/v4" - "next-terminal/pkg/config" + "next-terminal/pkg/global" "next-terminal/pkg/model" "next-terminal/pkg/utils" "time" @@ -29,7 +29,7 @@ func LoginEndpoint(c echo.Context) error { token := utils.UUID() - config.Cache.Set(token, user, time.Minute*time.Duration(30)) + global.Cache.Set(token, user, time.Minute*time.Duration(30)) model.UpdateUserById(&model.User{Online: true}, user.ID) @@ -38,7 +38,7 @@ func LoginEndpoint(c echo.Context) error { func LogoutEndpoint(c echo.Context) error { token := GetToken(c) - config.Cache.Delete(token) + global.Cache.Delete(token) return Success(c, nil) } diff --git a/pkg/api/middleware.go b/pkg/api/middleware.go index 628ba47..9145872 100644 --- a/pkg/api/middleware.go +++ b/pkg/api/middleware.go @@ -2,14 +2,14 @@ package api import ( "github.com/labstack/echo/v4" - "next-terminal/pkg/config" + "next-terminal/pkg/global" "strings" "time" ) func Auth(next echo.HandlerFunc) echo.HandlerFunc { - urls := []string{"download", "login"} + urls := []string{"download", "recording", "login", "static", "favicon", "logo"} return func(c echo.Context) error { // 路由拦截 - 登录身份、资源权限判断等 @@ -23,12 +23,12 @@ func Auth(next echo.HandlerFunc) echo.HandlerFunc { } token := GetToken(c) - user, found := config.Cache.Get(token) + user, found := global.Cache.Get(token) if !found { c.Logger().Error("您的登录信息已失效,请重新登录后再试。") return Fail(c, 403, "您的登录信息已失效,请重新登录后再试。") } - config.Cache.Set(token, user, time.Minute*time.Duration(30)) + global.Cache.Set(token, user, time.Minute*time.Duration(30)) return next(c) } } diff --git a/pkg/api/routes.go b/pkg/api/routes.go index bef0e52..11b2512 100644 --- a/pkg/api/routes.go +++ b/pkg/api/routes.go @@ -4,7 +4,7 @@ import ( "github.com/labstack/echo/v4" "github.com/labstack/echo/v4/middleware" "net/http" - "next-terminal/pkg/config" + "next-terminal/pkg/global" "next-terminal/pkg/model" ) @@ -12,7 +12,6 @@ const Token = "X-Auth-Token" func SetupRoutes() *echo.Echo { - // Echo instance e := echo.New() e.File("/", "web/build/index.html") @@ -22,6 +21,15 @@ func SetupRoutes() *echo.Echo { // Middleware e.Use(middleware.Logger()) + + //fd, _ := os.OpenFile( + // "nt.log", + // os.O_RDWR|os.O_APPEND, + // 0666, + //) + //writer := io.MultiWriter(fd, os.Stdout) + + //e.Logger.SetOutput(writer) e.Use(middleware.Recover()) e.Use(middleware.CORSWithConfig(middleware.CORSConfig{ Skipper: middleware.DefaultSkipper, @@ -92,6 +100,7 @@ func SetupRoutes() *echo.Echo { sessions.DELETE("/:id/rmdir", SessionRmDirEndpoint) sessions.DELETE("/:id/rm", SessionRmEndpoint) sessions.DELETE("/:id", SessionDeleteEndpoint) + sessions.GET("/:id/recording", SessionRecordingEndpoint) } e.GET("/properties", PropertyGetEndpoint) @@ -137,7 +146,7 @@ func GetToken(c echo.Context) string { func GetCurrentAccount(c echo.Context) (model.User, bool) { token := GetToken(c) - get, b := config.Cache.Get(token) + get, b := global.Cache.Get(token) if b { return get.(model.User), true } diff --git a/pkg/api/session.go b/pkg/api/session.go index ed7282c..fcf432f 100644 --- a/pkg/api/session.go +++ b/pkg/api/session.go @@ -5,10 +5,11 @@ import ( "errors" "fmt" "github.com/labstack/echo/v4" + "github.com/labstack/gommon/log" "io" "io/ioutil" "net/http" - "next-terminal/pkg/config" + "next-terminal/pkg/global" "next-terminal/pkg/model" "next-terminal/pkg/utils" "os" @@ -42,12 +43,14 @@ func SessionDeleteEndpoint(c echo.Context) error { sessionIds := c.Param("id") split := strings.Split(sessionIds, ",") for i := range split { - model.DeleteSessionById(split[i]) drivePath, err := model.GetRecordingPath() if err != nil { continue } - _ = os.Remove(path.Join(drivePath, split[i])) + if err := os.RemoveAll(path.Join(drivePath, split[i])); err != nil { + return err + } + model.DeleteSessionById(split[i]) } return Success(c, nil) @@ -70,7 +73,7 @@ func SessionDiscontentEndpoint(c echo.Context) error { split := strings.Split(sessionIds, ",") for i := range split { - tun, ok := config.Store.Get(split[i]) + tun, ok := global.Store.Get(split[i]) if ok { CloseSession(split[i], tun) } @@ -78,9 +81,9 @@ func SessionDiscontentEndpoint(c echo.Context) error { return Success(c, nil) } -func CloseSession(sessionId string, tun config.Tun) { +func CloseSession(sessionId string, tun global.Tun) { _ = tun.Tun.Close() - config.Store.Del(sessionId) + global.Store.Del(sessionId) session := model.Session{} session.ID = sessionId @@ -172,7 +175,7 @@ func SessionUploadEndpoint(c echo.Context) error { remoteFile := path.Join(remoteDir, filename) if "ssh" == session.Protocol { - tun, ok := config.Store.Get(sessionId) + tun, ok := global.Store.Get(sessionId) if !ok { return errors.New("获取sftp客户端失败") } @@ -226,7 +229,7 @@ func SessionDownloadEndpoint(c echo.Context) error { remoteFile := c.QueryParam("file") if "ssh" == session.Protocol { - tun, ok := config.Store.Get(sessionId) + tun, ok := global.Store.Get(sessionId) if !ok { return errors.New("获取sftp客户端失败") } @@ -273,7 +276,7 @@ func SessionLsEndpoint(c echo.Context) error { } remoteDir := c.QueryParam("dir") if "ssh" == session.Protocol { - tun, ok := config.Store.Get(sessionId) + tun, ok := global.Store.Get(sessionId) if !ok { return errors.New("获取sftp客户端失败") } @@ -334,7 +337,7 @@ func SessionMkDirEndpoint(c echo.Context) error { } remoteDir := c.QueryParam("dir") if "ssh" == session.Protocol { - tun, ok := config.Store.Get(sessionId) + tun, ok := global.Store.Get(sessionId) if !ok { return errors.New("获取sftp客户端失败") } @@ -365,7 +368,7 @@ func SessionRmDirEndpoint(c echo.Context) error { } remoteDir := c.QueryParam("dir") if "ssh" == session.Protocol { - tun, ok := config.Store.Get(sessionId) + tun, ok := global.Store.Get(sessionId) if !ok { return errors.New("获取sftp客户端失败") } @@ -407,7 +410,7 @@ func SessionRmEndpoint(c echo.Context) error { } remoteFile := c.QueryParam("file") if "ssh" == session.Protocol { - tun, ok := config.Store.Get(sessionId) + tun, ok := global.Store.Get(sessionId) if !ok { return errors.New("获取sftp客户端失败") } @@ -428,3 +431,14 @@ func SessionRmEndpoint(c echo.Context) error { } return nil } + +func SessionRecordingEndpoint(c echo.Context) error { + sessionId := c.Param("id") + recordingPath, err := model.GetRecordingPath() + if err != nil { + return err + } + recording := path.Join(recordingPath, sessionId, "recording") + log.Printf("读取录屏文件:%s", recording) + return c.File(recording) +} diff --git a/pkg/api/tunnel.go b/pkg/api/tunnel.go index ae68ee4..fca9342 100644 --- a/pkg/api/tunnel.go +++ b/pkg/api/tunnel.go @@ -6,7 +6,7 @@ import ( "github.com/labstack/echo/v4" "github.com/pkg/sftp" "log" - "next-terminal/pkg/config" + "next-terminal/pkg/global" "next-terminal/pkg/guacd" "next-terminal/pkg/model" "path" @@ -60,9 +60,9 @@ func TunEndpoint(c echo.Context) error { } if propertyMap[guacd.EnableRecording] == "true" { - configuration.SetParameter(guacd.CreateRecordingPath, path.Join(propertyMap[guacd.CreateRecordingPath], sessionId)) + configuration.SetParameter(guacd.RecordingPath, path.Join(propertyMap[guacd.RecordingPath], sessionId)) } else { - configuration.SetParameter(guacd.CreateRecordingPath, "") + configuration.SetParameter(guacd.RecordingPath, "") } configuration.Protocol = session.Protocol @@ -110,15 +110,15 @@ func TunEndpoint(c echo.Context) error { } fmt.Printf("=====================================================\n") - fmt.Printf("connect to %v with config: %+v\n", addr, configuration) + fmt.Printf("connect to %v with global: %+v\n", addr, configuration) fmt.Printf("=====================================================\n") - tun := config.Tun{ + tun := global.Tun{ Tun: tunnel, SftpClient: sftpClient, } - config.Store.Set(sessionId, tun) + global.Store.Set(sessionId, tun) if len(session.ConnectionId) == 0 { session.ConnectionId = tunnel.UUID diff --git a/pkg/config/config.go b/pkg/config/config.go index 86d40bc..3a1b95d 100644 --- a/pkg/config/config.go +++ b/pkg/config/config.go @@ -1,14 +1,63 @@ package config import ( - "github.com/patrickmn/go-cache" - "gorm.io/gorm" + "github.com/spf13/pflag" + "github.com/spf13/viper" + "log" ) -var DB *gorm.DB +type Config struct { + Server *Server + Mysql *Mysql +} -var Cache *cache.Cache +type Mysql struct { + Hostname string + Port int + Username string + Password string + Database string +} -var NextTerminal *NextTerminalConfig +type Server struct { + Addr string +} -var Store *TunStore +func SetupConfig() *Config { + + viper.SetConfigName("config") + viper.SetConfigType("yaml") + viper.AddConfigPath("/etc/nt/") + viper.AddConfigPath("$HOME/.nt") + viper.AddConfigPath(".") + + pflag.String("mysql.hostname", "127.0.0.1", "mysql hostname") + pflag.Int("mysql.port", 3306, "mysql port") + pflag.String("mysql.username", "mysql", "mysql username") + pflag.String("mysql.password", "mysql", "mysql password") + pflag.String("mysql.database", "next_terminal", "mysql database") + pflag.String("server.addr", "0.0.0.0:8088", "server listen addr") + + pflag.Parse() + _ = viper.BindPFlags(pflag.CommandLine) + + err := viper.ReadInConfig() + if err != nil { + log.Fatal(err) + } + + var config = &Config{ + Mysql: &Mysql{ + Hostname: viper.GetString("mysql.hostname"), + Port: viper.GetInt("mysql.port"), + Username: viper.GetString("mysql.username"), + Password: viper.GetString("mysql.password"), + Database: viper.GetString("mysql.database"), + }, + Server: &Server{ + Addr: viper.GetString("server.addr"), + }, + } + + return config +} diff --git a/pkg/config/next-terminal.go b/pkg/config/next-terminal.go deleted file mode 100644 index 0372d75..0000000 --- a/pkg/config/next-terminal.go +++ /dev/null @@ -1,31 +0,0 @@ -package config - -import ( - "github.com/spf13/viper" - "log" -) - -type NextTerminalConfig struct { - Dsn string - Addr string -} - -func SetupConfig() *NextTerminalConfig { - - viper.SetConfigName("next-terminal") - viper.SetConfigType("yaml") - viper.AddConfigPath("/etc/next-terminal/") - viper.AddConfigPath("$HOME/.next-terminal") - viper.AddConfigPath(".") - err := viper.ReadInConfig() - if err != nil { - log.Fatal(err) - } - - var config = &NextTerminalConfig{ - Dsn: viper.GetString("next-terminal.dsn"), - Addr: viper.GetString("next-terminal.addr"), - } - - return config -} diff --git a/pkg/global/global.go b/pkg/global/global.go new file mode 100644 index 0000000..8648066 --- /dev/null +++ b/pkg/global/global.go @@ -0,0 +1,15 @@ +package global + +import ( + "github.com/patrickmn/go-cache" + "gorm.io/gorm" + "next-terminal/pkg/config" +) + +var DB *gorm.DB + +var Cache *cache.Cache + +var Config *config.Config + +var Store *TunStore diff --git a/pkg/config/store.go b/pkg/global/store.go similarity index 97% rename from pkg/config/store.go rename to pkg/global/store.go index d07c09b..2017f93 100644 --- a/pkg/config/store.go +++ b/pkg/global/store.go @@ -1,4 +1,4 @@ -package config +package global import ( "github.com/pkg/sftp" diff --git a/pkg/handle/runner.go b/pkg/handle/runner.go index 4772378..6a9d4ff 100644 --- a/pkg/handle/runner.go +++ b/pkg/handle/runner.go @@ -48,7 +48,7 @@ func RunDataFix() { } } -func InitProperties() { +func InitProperties() error { propertyMap := model.FindAllPropertiesMap() if len(propertyMap[guacd.Host]) == 0 { @@ -56,7 +56,9 @@ func InitProperties() { Name: guacd.Host, Value: "127.0.0.1", } - _ = model.CreateNewProperty(&property) + if err := model.CreateNewProperty(&property); err != nil { + return err + } } if len(propertyMap[guacd.Port]) == 0 { @@ -64,7 +66,9 @@ func InitProperties() { Name: guacd.Port, Value: "4822", } - _ = model.CreateNewProperty(&property) + if err := model.CreateNewProperty(&property); err != nil { + return err + } } if len(propertyMap[guacd.EnableRecording]) == 0 { @@ -72,7 +76,9 @@ func InitProperties() { Name: guacd.EnableRecording, Value: "true", } - _ = model.CreateNewProperty(&property) + if err := model.CreateNewProperty(&property); err != nil { + return err + } } if len(propertyMap[guacd.RecordingPath]) == 0 { @@ -81,7 +87,14 @@ func InitProperties() { Name: guacd.RecordingPath, Value: path + "/recording/", } - _ = model.CreateNewProperty(&property) + if !utils.Exists(property.Value) { + if err := os.Mkdir(property.Value, os.ModePerm); err != nil { + return err + } + } + if err := model.CreateNewProperty(&property); err != nil { + return err + } } if len(propertyMap[guacd.CreateRecordingPath]) == 0 { @@ -89,7 +102,9 @@ func InitProperties() { Name: guacd.CreateRecordingPath, Value: "true", } - _ = model.CreateNewProperty(&property) + if err := model.CreateNewProperty(&property); err != nil { + return err + } } if len(propertyMap[guacd.DriveName]) == 0 { @@ -97,7 +112,9 @@ func InitProperties() { Name: guacd.DriveName, Value: "File-System", } - _ = model.CreateNewProperty(&property) + if err := model.CreateNewProperty(&property); err != nil { + return err + } } if len(propertyMap[guacd.DrivePath]) == 0 { @@ -108,7 +125,14 @@ func InitProperties() { Name: guacd.DrivePath, Value: path + "/drive/", } - _ = model.CreateNewProperty(&property) + if !utils.Exists(property.Value) { + if err := os.Mkdir(property.Value, os.ModePerm); err != nil { + return err + } + } + if err := model.CreateNewProperty(&property); err != nil { + return err + } } if len(propertyMap[guacd.FontName]) == 0 { @@ -116,7 +140,9 @@ func InitProperties() { Name: guacd.FontName, Value: "menlo", } - _ = model.CreateNewProperty(&property) + if err := model.CreateNewProperty(&property); err != nil { + return err + } } if len(propertyMap[guacd.FontSize]) == 0 { @@ -124,7 +150,9 @@ func InitProperties() { Name: guacd.FontSize, Value: "12", } - _ = model.CreateNewProperty(&property) + if err := model.CreateNewProperty(&property); err != nil { + return err + } } if len(propertyMap[guacd.ColorScheme]) == 0 { @@ -132,7 +160,9 @@ func InitProperties() { Name: guacd.ColorScheme, Value: "gray-black", } - _ = model.CreateNewProperty(&property) + if err := model.CreateNewProperty(&property); err != nil { + return err + } } if len(propertyMap[guacd.EnableDrive]) == 0 { @@ -140,7 +170,9 @@ func InitProperties() { Name: guacd.EnableDrive, Value: "true", } - _ = model.CreateNewProperty(&property) + if err := model.CreateNewProperty(&property); err != nil { + return err + } } if len(propertyMap[guacd.EnableWallpaper]) == 0 { @@ -148,7 +180,9 @@ func InitProperties() { Name: guacd.EnableWallpaper, Value: "false", } - _ = model.CreateNewProperty(&property) + if err := model.CreateNewProperty(&property); err != nil { + return err + } } if len(propertyMap[guacd.EnableTheming]) == 0 { @@ -156,7 +190,9 @@ func InitProperties() { Name: guacd.EnableTheming, Value: "false", } - _ = model.CreateNewProperty(&property) + if err := model.CreateNewProperty(&property); err != nil { + return err + } } if len(propertyMap[guacd.EnableFontSmoothing]) == 0 { @@ -164,7 +200,9 @@ func InitProperties() { Name: guacd.EnableFontSmoothing, Value: "false", } - _ = model.CreateNewProperty(&property) + if err := model.CreateNewProperty(&property); err != nil { + return err + } } if len(propertyMap[guacd.EnableFullWindowDrag]) == 0 { @@ -172,7 +210,9 @@ func InitProperties() { Name: guacd.EnableFullWindowDrag, Value: "false", } - _ = model.CreateNewProperty(&property) + if err := model.CreateNewProperty(&property); err != nil { + return err + } } if len(propertyMap[guacd.EnableDesktopComposition]) == 0 { @@ -180,7 +220,9 @@ func InitProperties() { Name: guacd.EnableDesktopComposition, Value: "false", } - _ = model.CreateNewProperty(&property) + if err := model.CreateNewProperty(&property); err != nil { + return err + } } if len(propertyMap[guacd.EnableMenuAnimations]) == 0 { @@ -188,7 +230,9 @@ func InitProperties() { Name: guacd.EnableMenuAnimations, Value: "false", } - _ = model.CreateNewProperty(&property) + if err := model.CreateNewProperty(&property); err != nil { + return err + } } if len(propertyMap[guacd.DisableBitmapCaching]) == 0 { @@ -196,7 +240,9 @@ func InitProperties() { Name: guacd.DisableBitmapCaching, Value: "false", } - _ = model.CreateNewProperty(&property) + if err := model.CreateNewProperty(&property); err != nil { + return err + } } if len(propertyMap[guacd.DisableOffscreenCaching]) == 0 { @@ -204,7 +250,9 @@ func InitProperties() { Name: guacd.DisableOffscreenCaching, Value: "false", } - _ = model.CreateNewProperty(&property) + if err := model.CreateNewProperty(&property); err != nil { + return err + } } if len(propertyMap[guacd.DisableGlyphCaching]) == 0 { @@ -212,6 +260,9 @@ func InitProperties() { Name: guacd.DisableGlyphCaching, Value: "false", } - _ = model.CreateNewProperty(&property) + if err := model.CreateNewProperty(&property); err != nil { + return err + } } + return nil } diff --git a/pkg/model/asset.go b/pkg/model/asset.go index 75c4204..c601bd2 100644 --- a/pkg/model/asset.go +++ b/pkg/model/asset.go @@ -1,7 +1,7 @@ package model import ( - "next-terminal/pkg/config" + "next-terminal/pkg/global" "next-terminal/pkg/utils" ) @@ -27,12 +27,12 @@ func (r *Asset) TableName() string { } func FindAllAsset() (o []Asset, err error) { - err = config.DB.Find(&o).Error + err = global.DB.Find(&o).Error return } func FindAssetByConditions(protocol string) (o []Asset, err error) { - db := config.DB + db := global.DB if len(protocol) > 0 { db = db.Where("protocol = ?", protocol) @@ -42,7 +42,7 @@ func FindAssetByConditions(protocol string) (o []Asset, err error) { } func FindPageAsset(pageIndex, pageSize int, name, protocol string) (o []Asset, total int64, err error) { - db := config.DB + db := global.DB if len(name) > 0 { db = db.Where("name like ?", "%"+name+"%") } @@ -60,27 +60,27 @@ func FindPageAsset(pageIndex, pageSize int, name, protocol string) (o []Asset, t } func CreateNewAsset(o *Asset) (err error) { - if err = config.DB.Create(o).Error; err != nil { + if err = global.DB.Create(o).Error; err != nil { return err } return nil } func FindAssetById(id string) (o Asset, err error) { - err = config.DB.Where("id = ?", id).First(&o).Error + err = global.DB.Where("id = ?", id).First(&o).Error return } func UpdateAssetById(o *Asset, id string) { o.ID = id - config.DB.Updates(o) + global.DB.Updates(o) } func DeleteAssetById(id string) { - config.DB.Where("id = ?", id).Delete(&Asset{}) + global.DB.Where("id = ?", id).Delete(&Asset{}) } func CountAsset() (total int64, err error) { - err = config.DB.Find(&Asset{}).Count(&total).Error + err = global.DB.Find(&Asset{}).Count(&total).Error return } diff --git a/pkg/model/command.go b/pkg/model/command.go index 2ed0974..e1bc5d2 100644 --- a/pkg/model/command.go +++ b/pkg/model/command.go @@ -1,7 +1,7 @@ package model import ( - "next-terminal/pkg/config" + "next-terminal/pkg/global" "next-terminal/pkg/utils" ) @@ -18,7 +18,7 @@ func (r *Command) TableName() string { func FindPageCommand(pageIndex, pageSize int, name, content string) (o []Command, total int64, err error) { - db := config.DB + db := global.DB if len(name) > 0 { db = db.Where("name like ?", "%"+name+"%") } @@ -35,22 +35,22 @@ func FindPageCommand(pageIndex, pageSize int, name, content string) (o []Command } func CreateNewCommand(o *Command) (err error) { - if err = config.DB.Create(o).Error; err != nil { + if err = global.DB.Create(o).Error; err != nil { return err } return nil } func FindCommandById(id string) (o Command, err error) { - err = config.DB.Where("id = ?", id).First(&o).Error + err = global.DB.Where("id = ?", id).First(&o).Error return } func UpdateCommandById(o *Command, id string) { o.ID = id - config.DB.Updates(o) + global.DB.Updates(o) } func DeleteCommandById(id string) { - config.DB.Where("id = ?", id).Delete(&Command{}) + global.DB.Where("id = ?", id).Delete(&Command{}) } diff --git a/pkg/model/credential.go b/pkg/model/credential.go index 412baaf..d47ab2e 100644 --- a/pkg/model/credential.go +++ b/pkg/model/credential.go @@ -1,7 +1,7 @@ package model import ( - "next-terminal/pkg/config" + "next-terminal/pkg/global" "next-terminal/pkg/utils" ) @@ -18,12 +18,12 @@ func (r *Credential) TableName() string { } func FindAllCredential() (o []Credential, err error) { - err = config.DB.Find(&o).Error + err = global.DB.Find(&o).Error return } func FindPageCredential(pageIndex, pageSize int, name string) (o []Credential, total int64, err error) { - db := config.DB + db := global.DB if len(name) > 0 { db = db.Where("name like ?", "%"+name+"%") } @@ -36,7 +36,7 @@ func FindPageCredential(pageIndex, pageSize int, name string) (o []Credential, t } func CreateNewCredential(o *Credential) (err error) { - if err = config.DB.Create(o).Error; err != nil { + if err = global.DB.Create(o).Error; err != nil { return err } return nil @@ -44,20 +44,20 @@ func CreateNewCredential(o *Credential) (err error) { func FindCredentialById(id string) (o Credential, err error) { - err = config.DB.Where("id = ?", id).First(&o).Error + err = global.DB.Where("id = ?", id).First(&o).Error return } func UpdateCredentialById(o *Credential, id string) { o.ID = id - config.DB.Updates(o) + global.DB.Updates(o) } func DeleteCredentialById(id string) { - config.DB.Where("id = ?", id).Delete(&Credential{}) + global.DB.Where("id = ?", id).Delete(&Credential{}) } func CountCredential() (total int64, err error) { - err = config.DB.Find(&Credential{}).Count(&total).Error + err = global.DB.Find(&Credential{}).Count(&total).Error return } diff --git a/pkg/model/num.go b/pkg/model/num.go index 8f983c8..653c246 100644 --- a/pkg/model/num.go +++ b/pkg/model/num.go @@ -1,7 +1,7 @@ package model import ( - "next-terminal/pkg/config" + "next-terminal/pkg/global" ) type Num struct { @@ -13,13 +13,13 @@ func (r *Num) TableName() string { } func FindAllTemp() (o []Num) { - if config.DB.Find(&o).Error != nil { + if global.DB.Find(&o).Error != nil { return nil } return } func CreateNewTemp(o *Num) (err error) { - err = config.DB.Create(o).Error + err = global.DB.Create(o).Error return } diff --git a/pkg/model/property.go b/pkg/model/property.go index bcc2c16..6c84a73 100644 --- a/pkg/model/property.go +++ b/pkg/model/property.go @@ -1,7 +1,7 @@ package model import ( - "next-terminal/pkg/config" + "next-terminal/pkg/global" "next-terminal/pkg/guacd" ) @@ -15,24 +15,24 @@ func (r *Property) TableName() string { } func FindAllProperties() (o []Property) { - if config.DB.Find(&o).Error != nil { + if global.DB.Find(&o).Error != nil { return nil } return } func CreateNewProperty(o *Property) (err error) { - err = config.DB.Create(o).Error + err = global.DB.Create(o).Error return } func UpdatePropertyByName(o *Property, name string) { o.Name = name - config.DB.Updates(o) + global.DB.Updates(o) } func FindPropertyByName(name string) (o Property, err error) { - err = config.DB.Where("name = ?", name).First(&o).Error + err = global.DB.Where("name = ?", name).First(&o).Error return } diff --git a/pkg/model/session.go b/pkg/model/session.go index e5c2cc0..f0624ab 100644 --- a/pkg/model/session.go +++ b/pkg/model/session.go @@ -1,7 +1,7 @@ package model import ( - "next-terminal/pkg/config" + "next-terminal/pkg/global" "next-terminal/pkg/utils" "time" ) @@ -57,7 +57,7 @@ type SessionVo struct { func FindPageSession(pageIndex, pageSize int, status, userId, clientIp, assetId, protocol string) (results []SessionVo, total int64, err error) { - db := config.DB + db := global.DB var params []interface{} params = append(params, status) @@ -103,40 +103,40 @@ func FindPageSession(pageIndex, pageSize int, status, userId, clientIp, assetId, } func FindSessionByStatus(status string) (o []Session, err error) { - err = config.DB.Where("status = ?", status).Find(&o).Error + err = global.DB.Where("status = ?", status).Find(&o).Error return } func CreateNewSession(o *Session) (err error) { - err = config.DB.Create(o).Error + err = global.DB.Create(o).Error return } func FindSessionById(id string) (o Session, err error) { - err = config.DB.Where("id = ?", id).First(&o).Error + err = global.DB.Where("id = ?", id).First(&o).Error return } func FindSessionByConnectionId(connectionId string) (o Session, err error) { - err = config.DB.Where("connection_id = ?", connectionId).First(&o).Error + err = global.DB.Where("connection_id = ?", connectionId).First(&o).Error return } func UpdateSessionById(o *Session, id string) { o.ID = id - config.DB.Updates(o) + global.DB.Updates(o) } func DeleteSessionById(id string) { - config.DB.Where("id = ?", id).Delete(&Session{}) + global.DB.Where("id = ?", id).Delete(&Session{}) } func DeleteSessionByStatus(status string) { - config.DB.Where("status = ?", status).Delete(&Session{}) + global.DB.Where("status = ?", status).Delete(&Session{}) } func CountOnlineSession() (total int64, err error) { - err = config.DB.Where("status = ?", Connected).Find(&Session{}).Count(&total).Error + err = global.DB.Where("status = ?", Connected).Find(&Session{}).Count(&total).Error return } @@ -155,7 +155,7 @@ func CountSessionByDay(day int) (results []D, err error) { for i := range protocols { var result []D - err = config.DB.Raw(sql, day, protocols[i], day).Scan(&result).Error + err = global.DB.Raw(sql, day, protocols[i], day).Scan(&result).Error if err != nil { return nil, err } diff --git a/pkg/model/user.go b/pkg/model/user.go index a94fe48..4bca96d 100644 --- a/pkg/model/user.go +++ b/pkg/model/user.go @@ -1,7 +1,7 @@ package model import ( - "next-terminal/pkg/config" + "next-terminal/pkg/global" "next-terminal/pkg/utils" "reflect" ) @@ -25,7 +25,7 @@ func (r *User) IsEmpty() bool { } func FindAllUser() (o []User) { - if config.DB.Find(&o).Error != nil { + if global.DB.Find(&o).Error != nil { return nil } return @@ -33,7 +33,7 @@ func FindAllUser() (o []User) { func FindPageUser(pageIndex, pageSize int, username, nickname string) (o []User, total int64, err error) { - db := config.DB + db := global.DB if len(username) > 0 { db = db.Where("username like ?", "%"+username+"%") } @@ -50,30 +50,30 @@ func FindPageUser(pageIndex, pageSize int, username, nickname string) (o []User, } func CreateNewUser(o *User) (err error) { - err = config.DB.Create(o).Error + err = global.DB.Create(o).Error return } func FindUserById(id string) (o User, err error) { - err = config.DB.Where("id = ?", id).First(&o).Error + err = global.DB.Where("id = ?", id).First(&o).Error return } func FindUserByUsername(username string) (o User, err error) { - err = config.DB.Where("username = ?", username).First(&o).Error + err = global.DB.Where("username = ?", username).First(&o).Error return } func UpdateUserById(o *User, id string) { o.ID = id - config.DB.Updates(o) + global.DB.Updates(o) } func DeleteUserById(id string) { - config.DB.Where("id = ?", id).Delete(&User{}) + global.DB.Where("id = ?", id).Delete(&User{}) } func CountUser() (total int64, err error) { - err = config.DB.Find(&User{}).Count(&total).Error + err = global.DB.Find(&User{}).Count(&total).Error return } diff --git a/pkg/utils/utils.go b/pkg/utils/utils.go index 4f3b9b5..f3e5d70 100644 --- a/pkg/utils/utils.go +++ b/pkg/utils/utils.go @@ -6,6 +6,7 @@ import ( "github.com/gofrs/uuid" "golang.org/x/crypto/bcrypt" "net" + "os" "strconv" "time" ) @@ -79,3 +80,29 @@ func Tcping(ip string, port int) bool { defer conn.Close() return true } + +// 判断所给路径文件/文件夹是否存在 +func Exists(path string) bool { + _, err := os.Stat(path) //os.Stat获取文件信息 + if err != nil { + if os.IsExist(err) { + return true + } + return false + } + return true +} + +// 判断所给路径是否为文件夹 +func IsDir(path string) bool { + s, err := os.Stat(path) + if err != nil { + return false + } + return s.IsDir() +} + +// 判断所给路径是否为文件 +func IsFile(path string) bool { + return !IsDir(path) +} diff --git a/supervisord.conf b/supervisord.conf new file mode 100644 index 0000000..ae6658f --- /dev/null +++ b/supervisord.conf @@ -0,0 +1,8 @@ +[supervisord] +nodaemon=true +[program:guacd] +command=/usr/local/guacamole/sbin/guacd -b 0.0.0.0 -L info -f + +[program:next-terminal] +; command=/usr/local/nt/nt --mysql.hostname $MYSQL_HOSTNAME --mysql.port $MYSQL_PORT --mysql.username $MYSQL_USERNAME --mysql.password $MYSQL_PASSWORD --mysql.database $MYSQL_DATABASE --server.addr 0.0.0.0:$SERVER_PORT +command=/usr/local/nt/nt --mysql.hostname %(ENV_MYSQL_HOSTNAME)s --mysql.port %(ENV_MYSQL_PORT)s --mysql.username %(ENV_MYSQL_USERNAME)s --mysql.password %(ENV_MYSQL_PASSWORD)s --mysql.database %(ENV_MYSQL_DATABASE)s --server.addr 0.0.0.0:%(ENV_SERVER_PORT)s \ No newline at end of file diff --git a/web/src/App.js b/web/src/App.js index 6e049fd..53f9086 100644 --- a/web/src/App.js +++ b/web/src/App.js @@ -226,7 +226,7 @@ class App extends Component { diff --git a/web/src/common/request.js b/web/src/common/request.js index 1dadc3b..2003103 100644 --- a/web/src/common/request.js +++ b/web/src/common/request.js @@ -18,7 +18,7 @@ const handleError = (error) => { return; } if (error.response !== undefined) { - message.error(error.response.data.message); + // message.error(error.response.data.message); } }; diff --git a/web/src/components/access/Monitor.js b/web/src/components/access/Monitor.js index dd3cb3f..1380902 100644 --- a/web/src/components/access/Monitor.js +++ b/web/src/components/access/Monitor.js @@ -3,7 +3,6 @@ import Guacamole from 'guacamole-common-js'; import {message, Modal} from 'antd' import qs from "qs"; import {prefix, wsServer} from "../../common/constants"; -import {LoadingOutlined} from '@ant-design/icons'; import {getToken} from "../../utils/utils"; import './Access.css' @@ -14,8 +13,6 @@ const STATE_CONNECTED = 3; const STATE_DISCONNECTING = 4; const STATE_DISCONNECTED = 5; -const antIcon = ; - class Access extends Component { formRef = React.createRef() diff --git a/web/src/components/dashboard/Dashboard.js b/web/src/components/dashboard/Dashboard.js index fe471e5..43fdaf1 100644 --- a/web/src/components/dashboard/Dashboard.js +++ b/web/src/components/dashboard/Dashboard.js @@ -1,5 +1,5 @@ import React, {Component} from 'react'; -import {Card, Col, Layout, PageHeader, Radio, Row, Statistic, Typography} from "antd"; +import {Card, Col, PageHeader, Radio, Row, Statistic} from "antd"; import {DesktopOutlined, IdcardOutlined, LinkOutlined, UserOutlined} from '@ant-design/icons'; import {itemRender} from '../../utils/utils' import request from "../../common/request"; @@ -7,9 +7,6 @@ import './Dashboard.css' import {Link} from "react-router-dom"; import {Area} from '@ant-design/charts'; -const {Content} = Layout; -const {Title, Paragraph} = Typography; - const routes = [ { diff --git a/web/src/components/session/OfflineSession.js b/web/src/components/session/OfflineSession.js index a858d08..fcead23 100644 --- a/web/src/components/session/OfflineSession.js +++ b/web/src/components/session/OfflineSession.js @@ -258,14 +258,6 @@ class OfflineSession extends Component { return `${record.username}@${record.ip}:${record.port}`; } - }, { - title: '屏幕大小', - dataIndex: 'screen', - key: 'screen', - render: (text, record) => { - - return `${record.width}x${record.height}`; - } }, { title: '连接协议', dataIndex: 'protocol', @@ -385,7 +377,7 @@ class OfflineSession extends Component { /> { - - return `${record.width}x${record.height}`; - } }, { title: '连接协议', dataIndex: 'protocol', @@ -378,7 +370,7 @@ class OnlineSession extends Component { /> - this.onNewPasswordChange(value)}/> + this.onNewPasswordChange(value)}/> - this.onNewPassword2Change(value)}/> + this.onNewPassword2Change(value)}/> diff --git a/web/src/components/user/UserModal.js b/web/src/components/user/UserModal.js index c619fa6..8541da4 100644 --- a/web/src/components/user/UserModal.js +++ b/web/src/components/user/UserModal.js @@ -1,5 +1,5 @@ import React from 'react'; -import {Form, Input, Modal, Radio} from "antd/lib/index"; +import {Form, Input, Modal} from "antd/lib/index"; const UserModal = ({title, visible, handleOk, handleCancel, confirmLoading, model}) => { diff --git a/web/src/fonts/Menlo-Regular-1.ttf b/web/src/fonts/Menlo-Regular-1.ttf new file mode 100644 index 0000000..033dc6d Binary files /dev/null and b/web/src/fonts/Menlo-Regular-1.ttf differ diff --git a/web/src/fonts/Menlo/Menlo-Italic-4.ttf b/web/src/fonts/Menlo/Menlo-Italic-4.ttf deleted file mode 100644 index f2e3528..0000000 Binary files a/web/src/fonts/Menlo/Menlo-Italic-4.ttf and /dev/null differ