├── .gitignore
├── demo1.jpg
├── demo2.jpg
├── templates
├── static
│ ├── fonts
│ │ ├── element-icons.535877f.woff
│ │ └── element-icons.732389d.ttf
│ └── js
│ │ ├── manifest.2ae2e69a05c33dfc65f8.js
│ │ ├── manifest.2ae2e69a05c33dfc65f8.js.map
│ │ ├── app.882927472b97c9c72b3e.js
│ │ └── app.882927472b97c9c72b3e.js.map
└── index.html
├── views
├── errors.go
└── views.go
├── go.mod
├── .github
└── workflows
│ └── go.yml
├── connections
├── models.go
└── funcs.go
├── README.md
├── server.go
└── go.sum
/.gitignore:
--------------------------------------------------------------------------------
1 | .idea
2 | *.gz
3 | *.zip
4 | *.exe
5 | web-terminal
--------------------------------------------------------------------------------
/demo1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/chengjoey/web-terminal/HEAD/demo1.jpg
--------------------------------------------------------------------------------
/demo2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/chengjoey/web-terminal/HEAD/demo2.jpg
--------------------------------------------------------------------------------
/templates/static/fonts/element-icons.535877f.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/chengjoey/web-terminal/HEAD/templates/static/fonts/element-icons.535877f.woff
--------------------------------------------------------------------------------
/templates/static/fonts/element-icons.732389d.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/chengjoey/web-terminal/HEAD/templates/static/fonts/element-icons.732389d.ttf
--------------------------------------------------------------------------------
/views/errors.go:
--------------------------------------------------------------------------------
1 | package views
2 |
3 | type ApiError struct {
4 | Code int `json:"code"`
5 | Message string `json:"message"`
6 | }
7 |
8 | func (e *ApiError) Error() string {
9 | return e.Message
10 | }
11 |
--------------------------------------------------------------------------------
/go.mod:
--------------------------------------------------------------------------------
1 | module github.com/chengjoey/web-terminal
2 |
3 | go 1.14
4 |
5 | require (
6 | github.com/gin-gonic/gin v1.7.0
7 | github.com/gorilla/websocket v1.4.2
8 | golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9
9 | )
10 |
--------------------------------------------------------------------------------
/templates/index.html:
--------------------------------------------------------------------------------
1 |
web-terminal-client
--------------------------------------------------------------------------------
/.github/workflows/go.yml:
--------------------------------------------------------------------------------
1 | name: Go
2 |
3 | on:
4 | push:
5 | branches: [ master ]
6 | pull_request:
7 | branches: [ master ]
8 |
9 | jobs:
10 |
11 | build:
12 | runs-on: ubuntu-latest
13 | steps:
14 | - uses: actions/checkout@v2
15 |
16 | - name: Set up Go
17 | uses: actions/setup-go@v2
18 | with:
19 | go-version: 1.15
20 |
21 | - name: Build
22 | run: go build -o terminal server.go
23 |
24 | - name: Scp
25 | uses: appleboy/scp-action@master
26 | with:
27 | host: ${{ secrets.HOST }}
28 | username: ${{ secrets.USERNAME }}
29 | password: ${{ secrets.PASSWORD }}
30 | port: ${{ secrets.PORT }}
31 | source: "terminal"
32 | target: "/opt/"
33 |
--------------------------------------------------------------------------------
/connections/models.go:
--------------------------------------------------------------------------------
1 | package connections
2 |
3 | import (
4 | "golang.org/x/crypto/ssh"
5 | )
6 |
7 | type ptyRequestMsg struct {
8 | Term string
9 | Columns uint32
10 | Rows uint32
11 | Width uint32
12 | Height uint32
13 | Modelist string
14 | }
15 |
16 | type Terminal struct {
17 | Columns uint32 `json:"cols"`
18 | Rows uint32 `json:"rows"`
19 | }
20 |
21 | type SSHClient struct {
22 | Username string `json:"username"`
23 | Password string `json:"password"`
24 | IpAddress string `json:"ipaddress"`
25 | Port int `json:"port"`
26 | Session *ssh.Session
27 | Client *ssh.Client
28 | channel ssh.Channel
29 | }
30 |
31 | func NewSSHClient() SSHClient {
32 | client := SSHClient{}
33 | client.Username = "root"
34 | client.Port = 22
35 | return client
36 | }
37 |
--------------------------------------------------------------------------------
/templates/static/js/manifest.2ae2e69a05c33dfc65f8.js:
--------------------------------------------------------------------------------
1 | !function(r){var n=window.webpackJsonp;window.webpackJsonp=function(e,u,c){for(var f,i,p,a=0,l=[];a 0 {
28 | err := detectedErrors[0].Err
29 | var parsedError *views.ApiError
30 | switch err.(type) {
31 | //如果产生的error是自定义的结构体,转换error,返回自定义的code和msg
32 | case *views.ApiError:
33 | parsedError = err.(*views.ApiError)
34 | default:
35 | parsedError = &views.ApiError{
36 | Code: http.StatusInternalServerError,
37 | Message: err.Error(),
38 | }
39 | }
40 | c.IndentedJSON(parsedError.Code, parsedError)
41 | return
42 | }
43 |
44 | }
45 | }
46 |
47 | //设置所有跨域请求
48 | func CORSMiddleware() gin.HandlerFunc {
49 | return func(c *gin.Context) {
50 | c.Writer.Header().Set("Access-Control-Allow-Origin", "*")
51 | c.Writer.Header().Set("Access-Control-Allow-Credentials", "true")
52 | c.Writer.Header().Set("Access-Control-Allow-Headers", "Content-Type, Content-Length, Accept-Encoding, X-CSRF-Token, Authorization, accept, origin, Cache-Control, X-Requested-With")
53 | c.Writer.Header().Set("Access-Control-Allow-Methods", "POST, OPTIONS, GET, PUT")
54 |
55 | if c.Request.Method == "OPTIONS" {
56 | c.AbortWithStatus(204)
57 | return
58 | }
59 |
60 | c.Next()
61 | }
62 | }
63 |
64 | func main() {
65 | server := gin.Default()
66 | server.LoadHTMLGlob(TemplateFiles)
67 | server.Static("/static", StaticFiles)
68 | server.Use(JSONAppErrorReporter())
69 | server.Use(CORSMiddleware())
70 | server.GET("/", func(c *gin.Context) {
71 | c.HTML(http.StatusOK, "index.html", nil)
72 | })
73 | server.GET("/ws", views.ShellWs)
74 | server.Run("0.0.0.0:5001")
75 | }
76 |
--------------------------------------------------------------------------------
/templates/static/js/manifest.2ae2e69a05c33dfc65f8.js.map:
--------------------------------------------------------------------------------
1 | {"version":3,"sources":["webpack:///webpack/bootstrap 9169eac02b3879247a01"],"names":["parentJsonpFunction","window","chunkIds","moreModules","executeModules","moduleId","chunkId","result","i","resolves","length","installedChunks","push","Object","prototype","hasOwnProperty","call","modules","shift","__webpack_require__","s","installedModules","2","exports","module","l","m","c","d","name","getter","o","defineProperty","configurable","enumerable","get","n","__esModule","object","property","p","oe","err","console","error"],"mappings":"aACA,IAAAA,EAAAC,OAAA,aACAA,OAAA,sBAAAC,EAAAC,EAAAC,GAIA,IADA,IAAAC,EAAAC,EAAAC,EAAAC,EAAA,EAAAC,KACQD,EAAAN,EAAAQ,OAAoBF,IAC5BF,EAAAJ,EAAAM,GACAG,EAAAL,IACAG,EAAAG,KAAAD,EAAAL,GAAA,IAEAK,EAAAL,GAAA,EAEA,IAAAD,KAAAF,EACAU,OAAAC,UAAAC,eAAAC,KAAAb,EAAAE,KACAY,EAAAZ,GAAAF,EAAAE,IAIA,IADAL,KAAAE,EAAAC,EAAAC,GACAK,EAAAC,QACAD,EAAAS,OAAAT,GAEA,GAAAL,EACA,IAAAI,EAAA,EAAYA,EAAAJ,EAAAM,OAA2BF,IACvCD,EAAAY,IAAAC,EAAAhB,EAAAI,IAGA,OAAAD,GAIA,IAAAc,KAGAV,GACAW,EAAA,GAIA,SAAAH,EAAAd,GAGA,GAAAgB,EAAAhB,GACA,OAAAgB,EAAAhB,GAAAkB,QAGA,IAAAC,EAAAH,EAAAhB,IACAG,EAAAH,EACAoB,GAAA,EACAF,YAUA,OANAN,EAAAZ,GAAAW,KAAAQ,EAAAD,QAAAC,IAAAD,QAAAJ,GAGAK,EAAAC,GAAA,EAGAD,EAAAD,QAKAJ,EAAAO,EAAAT,EAGAE,EAAAQ,EAAAN,EAGAF,EAAAS,EAAA,SAAAL,EAAAM,EAAAC,GACAX,EAAAY,EAAAR,EAAAM,IACAhB,OAAAmB,eAAAT,EAAAM,GACAI,cAAA,EACAC,YAAA,EACAC,IAAAL,KAMAX,EAAAiB,EAAA,SAAAZ,GACA,IAAAM,EAAAN,KAAAa,WACA,WAA2B,OAAAb,EAAA,SAC3B,WAAiC,OAAAA,GAEjC,OADAL,EAAAS,EAAAE,EAAA,IAAAA,GACAA,GAIAX,EAAAY,EAAA,SAAAO,EAAAC,GAAsD,OAAA1B,OAAAC,UAAAC,eAAAC,KAAAsB,EAAAC,IAGtDpB,EAAAqB,EAAA,IAGArB,EAAAsB,GAAA,SAAAC,GAA8D,MAApBC,QAAAC,MAAAF,GAAoBA","file":"static/js/manifest.2ae2e69a05c33dfc65f8.js","sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tvar parentJsonpFunction = window[\"webpackJsonp\"];\n \twindow[\"webpackJsonp\"] = function webpackJsonpCallback(chunkIds, moreModules, executeModules) {\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [], result;\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(chunkIds, moreModules, executeModules);\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n \t\tif(executeModules) {\n \t\t\tfor(i=0; i < executeModules.length; i++) {\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = executeModules[i]);\n \t\t\t}\n \t\t}\n \t\treturn result;\n \t};\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// objects to store loaded and loading chunks\n \tvar installedChunks = {\n \t\t2: 0\n \t};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"/\";\n\n \t// on error function for async loading\n \t__webpack_require__.oe = function(err) { console.error(err); throw err; };\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 9169eac02b3879247a01"],"sourceRoot":""}
--------------------------------------------------------------------------------
/connections/funcs.go:
--------------------------------------------------------------------------------
1 | package connections
2 |
3 | import (
4 | "bufio"
5 | "encoding/base64"
6 | "encoding/json"
7 | "fmt"
8 | "log"
9 | "net"
10 | "time"
11 | "unicode/utf8"
12 |
13 | "github.com/gorilla/websocket"
14 | "golang.org/x/crypto/ssh"
15 | )
16 |
17 | func DecodedMsgToSSHClient(msg string) (SSHClient, error) {
18 | client := NewSSHClient()
19 | decoded, err := base64.StdEncoding.DecodeString(msg)
20 | if err != nil {
21 | return client, err
22 | }
23 | err = json.Unmarshal(decoded, &client)
24 | if err != nil {
25 | return client, err
26 | }
27 | return client, nil
28 | }
29 |
30 | func (this *SSHClient) GenerateClient() error {
31 | var (
32 | auth []ssh.AuthMethod
33 | addr string
34 | clientConfig *ssh.ClientConfig
35 | client *ssh.Client
36 | config ssh.Config
37 | err error
38 | )
39 | auth = make([]ssh.AuthMethod, 0)
40 | auth = append(auth, ssh.Password(this.Password))
41 | config = ssh.Config{
42 | Ciphers: []string{"aes128-ctr", "aes192-ctr", "aes256-ctr", "aes128-gcm@openssh.com", "arcfour256", "arcfour128", "aes128-cbc", "3des-cbc", "aes192-cbc", "aes256-cbc"},
43 | }
44 | clientConfig = &ssh.ClientConfig{
45 | User: this.Username,
46 | Auth: auth,
47 | Timeout: 5 * time.Second,
48 | Config: config,
49 | HostKeyCallback: func(hostname string, remote net.Addr, key ssh.PublicKey) error {
50 | return nil
51 | },
52 | }
53 | addr = fmt.Sprintf("%s:%d", this.IpAddress, this.Port)
54 | if client, err = ssh.Dial("tcp", addr, clientConfig); err != nil {
55 | return err
56 | }
57 | this.Client = client
58 | return nil
59 | }
60 |
61 | func (this *SSHClient) RequestTerminal(terminal Terminal) *SSHClient {
62 | session, err := this.Client.NewSession()
63 | if err != nil {
64 | log.Println(err)
65 | return nil
66 | }
67 | this.Session = session
68 | channel, inRequests, err := this.Client.OpenChannel("session", nil)
69 | if err != nil {
70 | log.Println(err)
71 | return nil
72 | }
73 | this.channel = channel
74 | go func() {
75 | for req := range inRequests {
76 | if req.WantReply {
77 | req.Reply(false, nil)
78 | }
79 | }
80 | }()
81 | modes := ssh.TerminalModes{
82 | ssh.ECHO: 1,
83 | ssh.TTY_OP_ISPEED: 14400,
84 | ssh.TTY_OP_OSPEED: 14400,
85 | }
86 | var modeList []byte
87 | for k, v := range modes {
88 | kv := struct {
89 | Key byte
90 | Val uint32
91 | }{k, v}
92 | modeList = append(modeList, ssh.Marshal(&kv)...)
93 | }
94 | modeList = append(modeList, 0)
95 | req := ptyRequestMsg{
96 | Term: "xterm",
97 | Columns: terminal.Columns,
98 | Rows: terminal.Rows,
99 | Width: uint32(terminal.Columns * 8),
100 | Height: uint32(terminal.Columns * 8),
101 | Modelist: string(modeList),
102 | }
103 | ok, err := channel.SendRequest("pty-req", true, ssh.Marshal(&req))
104 | if !ok || err != nil {
105 | log.Println(err)
106 | return nil
107 | }
108 | ok, err = channel.SendRequest("shell", true, nil)
109 | if !ok || err != nil {
110 | log.Println(err)
111 | return nil
112 | }
113 | return this
114 | }
115 |
116 | func (this *SSHClient) Connect(ws *websocket.Conn) {
117 |
118 | //这里第一个协程获取用户的输入
119 | go func() {
120 | for {
121 | // p为用户输入
122 | _, p, err := ws.ReadMessage()
123 | if err != nil {
124 | return
125 | }
126 | _, err = this.channel.Write(p)
127 | if err != nil {
128 | return
129 | }
130 | }
131 | }()
132 |
133 | //第二个协程将远程主机的返回结果返回给用户
134 | go func() {
135 | br := bufio.NewReader(this.channel)
136 | buf := []byte{}
137 | t := time.NewTimer(time.Microsecond * 100)
138 | defer t.Stop()
139 | // 构建一个信道, 一端将数据远程主机的数据写入, 一段读取数据写入ws
140 | r := make(chan rune)
141 |
142 | // 另起一个协程, 一个死循环不断的读取ssh channel的数据, 并传给r信道直到连接断开
143 | go func() {
144 | defer this.Client.Close()
145 | defer this.Session.Close()
146 |
147 | for {
148 | x, size, err := br.ReadRune()
149 | if err != nil {
150 | log.Println(err)
151 | ws.WriteMessage(1, []byte("\033[31m已经关闭连接!\033[0m"))
152 | ws.Close()
153 | return
154 | }
155 | if size > 0 {
156 | r <- x
157 | }
158 | }
159 | }()
160 |
161 | // 主循环
162 | for {
163 | select {
164 | // 每隔100微秒, 只要buf的长度不为0就将数据写入ws, 并重置时间和buf
165 | case <-t.C:
166 | if len(buf) != 0 {
167 | err := ws.WriteMessage(websocket.TextMessage, buf)
168 | buf = []byte{}
169 | if err != nil {
170 | log.Println(err)
171 | return
172 | }
173 | }
174 | t.Reset(time.Microsecond * 100)
175 | // 前面已经将ssh channel里读取的数据写入创建的通道r, 这里读取数据, 不断增加buf的长度, 在设定的 100 microsecond后由上面判定长度是否返送数据
176 | case d := <-r:
177 | if d != utf8.RuneError {
178 | p := make([]byte, utf8.RuneLen(d))
179 | utf8.EncodeRune(p, d)
180 | buf = append(buf, p...)
181 | } else {
182 | buf = append(buf, []byte("@")...)
183 | }
184 | }
185 | }
186 | }()
187 |
188 | defer func() {
189 | if err := recover(); err != nil {
190 | log.Println(err)
191 | }
192 | }()
193 | }
194 |
--------------------------------------------------------------------------------
/go.sum:
--------------------------------------------------------------------------------
1 | github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
2 | github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
3 | github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
4 | github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE=
5 | github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI=
6 | github.com/gin-gonic/gin v1.7.0 h1:jGB9xAJQ12AIGNB4HguylppmDK1Am9ppF7XnGXXJuoU=
7 | github.com/gin-gonic/gin v1.7.0/go.mod h1:jD2toBW3GZUr5UMcdrwQA10I7RuaFOl/SGeDjXkfUtY=
8 | github.com/go-playground/assert/v2 v2.0.1 h1:MsBgLAaY856+nPRTKrp3/OZK38U/wa0CcBYNjji3q3A=
9 | github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
10 | github.com/go-playground/locales v0.13.0 h1:HyWk6mgj5qFqCT5fjGBuRArbVDfE4hi8+e8ceBS/t7Q=
11 | github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8=
12 | github.com/go-playground/universal-translator v0.17.0 h1:icxd5fm+REJzpZx7ZfpaD876Lmtgy7VtROAbHHXk8no=
13 | github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA=
14 | github.com/go-playground/validator/v10 v10.4.1 h1:pH2c5ADXtd66mxoE0Zm9SUhxE20r7aM3F26W0hOn+GE=
15 | github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4=
16 | github.com/golang/protobuf v1.3.3 h1:gyjaxf+svBWX08ZjK86iN9geUJF0H6gp2IRKX6Nf6/I=
17 | github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
18 | github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
19 | github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc=
20 | github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
21 | github.com/json-iterator/go v1.1.9 h1:9yzud/Ht36ygwatGx56VwCZtlI/2AD15T1X2sjSuGns=
22 | github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
23 | github.com/leodido/go-urn v1.2.0 h1:hpXL4XnriNwQ/ABnpepYM/1vCLWNDfUNts8dX3xTG6Y=
24 | github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII=
25 | github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY=
26 | github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
27 | github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc=
28 | github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
29 | github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742 h1:Esafd1046DLDQ0W1YjYsBW+p8U2u7vzgW2SQVmlNazg=
30 | github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
31 | github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
32 | github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
33 | github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
34 | github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
35 | github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk=
36 | github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
37 | github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo=
38 | github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw=
39 | github.com/ugorji/go/codec v1.1.7 h1:2SvQaVZ1ouYrrKKwoSk2pzd4A9evlKJb9oTL+OaLUSs=
40 | github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY=
41 | golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
42 | golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 h1:psW17arqaxU48Z5kZ0CQnkZWQJsqcURM6tKiBApRjXI=
43 | golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
44 | golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
45 | golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
46 | golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
47 | golang.org/x/sys v0.0.0-20200116001909-b77594299b42 h1:vEOn+mP2zCOVzKckCZy6YsCtDblrpj/w7B9nxGNELpg=
48 | golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
49 | golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
50 | golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
51 | golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
52 | gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
53 | gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
54 | gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
55 | gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10=
56 | gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
57 |
--------------------------------------------------------------------------------
/templates/static/js/app.882927472b97c9c72b3e.js:
--------------------------------------------------------------------------------
1 | webpackJsonp([1],{"4M7i":function(t,e){},BuVq:function(t,e){},D4uH:function(t,e,n){"use strict";var r=n("Gu7T"),i=n.n(r),s=n("bOdI"),o=n.n(s),a={},l={name:"fa-icon",props:{name:{type:String,validator:function(t){return!t||t in a||(console.warn('Invalid prop: prop "name" is referring to an unregistered icon "'+t+'".\nPlease make sure you have imported this icon before using it.'),!1)}},title:String,scale:[Number,String],spin:Boolean,inverse:Boolean,pulse:Boolean,flip:{validator:function(t){return"horizontal"===t||"vertical"===t}},label:String,tabindex:[Number,String]},data:function(){return{id:h(),x:!1,y:!1,childrenWidth:0,childrenHeight:0,outerScale:1}},computed:{normalizedScale:function(){var t=this.scale;return t=void 0===t?1:Number(t),isNaN(t)||t<=0?(console.warn('Invalid prop: prop "scale" should be a number over 0.',this),this.outerScale):t*this.outerScale},klass:function(){return o()({"fa-icon":!0,"fa-spin":this.spin,"fa-flip-horizontal":"horizontal"===this.flip,"fa-flip-vertical":"vertical"===this.flip,"fa-inverse":this.inverse,"fa-pulse":this.pulse},this.$options.name,!0)},icon:function(){return this.name?a[this.name]:null},box:function(){return this.icon?"0 0 "+this.icon.width+" "+this.icon.height:"0 0 "+this.width+" "+this.height},ratio:function(){if(!this.icon)return 1;var t=this.icon,e=t.width,n=t.height;return Math.max(e,n)/16},width:function(){return this.childrenWidth||this.icon&&this.icon.width/this.ratio*this.normalizedScale||0},height:function(){return this.childrenHeight||this.icon&&this.icon.height/this.ratio*this.normalizedScale||0},style:function(){return 1!==this.normalizedScale&&{fontSize:this.normalizedScale+"em"}},raw:function(){if(!this.icon||!this.icon.raw)return null;var t=this.icon.raw,e={};return t=t.replace(/\s(?:xml:)?id=(["']?)([^"')\s]+)\1/g,function(t,n,r){var i=h();return e[r]=i,' id="'+i+'"'}),t=t.replace(/#(?:([^'")\s]+)|xpointer\(id\((['"]?)([^')]+)\2\)\))/g,function(t,n,r,i){var s=n||i;return s&&e[s]?"#"+e[s]:t}),t},focusable:function(){var t=this.tabindex;return null==t?"false":("string"==typeof t?parseInt(t,10):t)>=0?null:"false"}},mounted:function(){this.updateStack()},updated:function(){this.updateStack()},methods:{updateStack:function(){var t=this;if(this.name||null===this.name||0!==this.$children.length){if(!this.icon){var e=0,n=0;this.$children.forEach(function(r){r.outerScale=t.normalizedScale,e=Math.max(e,r.width),n=Math.max(n,r.height)}),this.childrenWidth=e,this.childrenHeight=n,this.$children.forEach(function(t){t.x=(e-t.width)/2,t.y=(n-t.height)/2})}}else console.warn('Invalid prop: prop "name" is required.')}},render:function(t){if(null===this.name)return t();var e={class:this.klass,style:this.style,attrs:{role:this.$attrs.role||(this.label||this.title?"img":null),"aria-label":this.label||null,"aria-hidden":String(!(this.label||this.title)),tabindex:this.tabindex,x:this.x,y:this.y,width:this.width,height:this.height,viewBox:this.box,focusable:this.focusable}},n="vat-"+this.id;if(this.title&&(e.attrs["aria-labelledby"]=n),this.raw){var r=this.raw;this.title&&(r=''+function(t){return t.replace(/[<>"&]/g,function(t){return d[t]||t})}(this.title)+""+r),e.domProps={innerHTML:r}}var s=this.title?[t("title",{attrs:{id:n}},this.title)]:[];return t("svg",e,this.raw?null:s.concat(this.$slots.default||[].concat(i()(this.icon.paths.map(function(e,n){return t("path",{attrs:e,key:"path-"+n})})),i()(this.icon.polygons.map(function(e,n){return t("polygon",{attrs:e,key:"polygon-"+n})})))))},register:function(t){for(var e in t){var n=t[e],r=n.paths,i=void 0===r?[]:r,s=n.d,o=n.polygons,l=void 0===o?[]:o,c=n.points;s&&i.push({d:s}),c&&l.push({points:c}),a[e]=u({},n,{paths:i,polygons:l})}},icons:a};function u(t){for(var e=arguments.length,n=Array(e>1?e-1:0),r=1;r":">",'"':""","&":"&"};var m=n("VU/8")(l,null,!1,function(t){n("BuVq")},null,null);e.a=m.exports},NHnr:function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r=n("7+uW"),i=n("go35"),s=n.n(i),o={data:function(){return{menu:s.a}},methods:{handleOpen:function(t,e){console.log(t,e)},handleClose:function(t,e){console.log(t,e)}}},a={render:function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("el-row",{staticClass:"tac"},[n("el-col",{attrs:{span:24}},[n("el-menu",{staticClass:"el-menu-vertical-demo",attrs:{"default-active":"2",router:""},on:{open:t.handleOpen,close:t.handleClose}},t._l(t.menu,function(e){return n("el-menu-item",{key:e.id,attrs:{index:e.path}},[n("template",{slot:"title"},[n("icon",{attrs:{name:e.icon}}),t._v(" "),n("span",{domProps:{textContent:t._s(e.name)}})],1)],2)}),1)],1)],1)},staticRenderFns:[]};var l={render:function(){var t=this.$createElement,e=this._self._c||t;return e("el-row",[e("div",{staticClass:"head-wrap"},[this._v("Web-Terminal")])])},staticRenderFns:[]};var u={name:"App",components:{navmenu:n("VU/8")(o,a,!1,function(t){n("YvoH")},"data-v-28ac6478",null).exports,vheader:n("VU/8")(null,l,!1,function(t){n("PEjQ")},"data-v-f79b580a",null).exports}},c={render:function(){var t=this.$createElement,e=this._self._c||t;return e("div",{attrs:{id:"app"}},[e("el-container",[e("el-header",{staticClass:"header"},[e("vheader")],1),this._v(" "),e("el-container",[e("el-aside",{staticClass:"aside",attrs:{width:"200px"}},[e("navmenu")],1),this._v(" "),e("el-main",[e("router-view")],1)],1)],1)],1)},staticRenderFns:[]};var h=n("VU/8")(u,c,!1,function(t){n("4M7i")},null,null).exports,d=n("zL8q"),m=n.n(d),p=(n("tvR6"),n("/ocq")),f=n("RRo+"),v=n.n(f),g={name:"AddNode",data:function(){return{ruleForm:{pass:"",checkPass:"",port:22,ipaddress:"",username:"root"},rules:{port:[{validator:function(t,e,n){if(!e)return n(new Error("端口不能为空"));setTimeout(function(){v()(e)?e<20?n(new Error("必须大于20")):n():n(new Error("请输入数字值"))},1e3)},trigger:"blur"}]}}},methods:{submitForm:function(t){this.$refs[t].validate(function(t){if(!t)return console.log("error submit!!"),!1;alert("submit!")})},resetForm:function(t){this.$refs[t].resetFields()},goToWebssh:function(){var t='{"username":"'+this.ruleForm.username+'", "ipaddress":"'+this.ruleForm.ipaddress+'", "port":'+this.ruleForm.port+', "password":"'+this.ruleForm.pass+'"}',e=window.btoa(t);this.$router.push({path:"/webssh",name:"WebSSH",params:{msg:"msg",dataObj:e}})}}},w={render:function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",[n("el-form",{ref:"ruleForm",staticClass:"demo-ruleForm",attrs:{model:t.ruleForm,"status-icon":"",rules:t.rules,"label-width":"100px","label-position":"left"}},[n("el-form-item",{attrs:{label:"ip地址",prop:"ipaddress",required:""}},[n("el-input",{attrs:{type:"text"},model:{value:t.ruleForm.ipaddress,callback:function(e){t.$set(t.ruleForm,"ipaddress",e)},expression:"ruleForm.ipaddress"}})],1),t._v(" "),n("el-form-item",{attrs:{label:"用户名",prop:"username",required:""}},[n("el-input",{attrs:{type:"text"},model:{value:t.ruleForm.username,callback:function(e){t.$set(t.ruleForm,"username",e)},expression:"ruleForm.username"}})],1),t._v(" "),n("el-form-item",{attrs:{label:"密码",prop:"pass",required:""}},[n("el-input",{attrs:{type:"password",autocomplete:"off"},model:{value:t.ruleForm.pass,callback:function(e){t.$set(t.ruleForm,"pass",e)},expression:"ruleForm.pass"}})],1),t._v(" "),n("el-form-item",{attrs:{label:"端口",prop:"port",required:""}},[n("el-input",{model:{value:t.ruleForm.port,callback:function(e){t.$set(t.ruleForm,"port",t._n(e))},expression:"ruleForm.port"}})],1),t._v(" "),n("el-form-item",[n("el-button",{attrs:{type:"primary",plain:""},on:{click:function(e){return t.goToWebssh()}}},[t._v("连接")]),t._v(" "),n("el-button",{on:{click:function(e){return t.resetForm("ruleForm")}}},[t._v("重置")])],1)],1)],1)},staticRenderFns:[]},b=n("VU/8")(g,w,!1,null,null,null).exports,S=n("13sD"),x=n("6x4x"),y=n("AaoT");S.Terminal.applyAddon(x),S.Terminal.applyAddon(y);var F=S.Terminal,_={name:"Console",props:{msg:{type:String},username:{type:String},password:{type:String}},data:function(){return{term:null,terminalSocket:null}},methods:{runRealTerminal:function(){console.log("webSocket is finished")},errorRealTerminal:function(){console.log("error")},closeRealTerminal:function(){console.log("close")}},mounted:function(){var t=window.screen.height,e=(window.screen.width,Math.floor((t-30)/9)),n=Math.floor(window.innerHeight/17)-2;if(void 0===this.username)var r=("http:"===location.protocol?"ws":"wss")+"://"+location.hostname+":5001/ws?msg="+this.msg+"&rows="+n+"&cols="+e;else r=("http:"===location.protocol?"ws":"wss")+"://"+location.hostname+":5001/ws?msg="+this.msg+"&rows="+n+"&cols="+e+"&username="+this.username+"&password="+this.password;var i=document.getElementById("terminal");this.term=new F,this.term.open(i),this.terminalSocket=new WebSocket(r),this.terminalSocket.onopen=this.runRealTerminal,this.terminalSocket.onclose=this.closeRealTerminal,this.terminalSocket.onerror=this.errorRealTerminal,this.term.attach(this.terminalSocket),this.term._initialized=!0,console.log("mounted is going on")},beforeDestroy:function(){this.terminalSocket.close(),this.term.destroy()}},k={render:function(){var t=this.$createElement;return(this._self._c||t)("div",{staticClass:"console",attrs:{id:"terminal"}})},staticRenderFns:[]},$={name:"WebSSH",data:function(){return{msg:"",username:"",password:""}},components:{"my-terminal":n("VU/8")(_,k,!1,null,null,null).exports},methods:{getParams:function(){this.msg=this.$route.params.dataObj,this.username=this.$route.params.username,this.password=this.$route.params.password}},created:function(){this.getParams()}},T={render:function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"container"},[e("my-terminal",{attrs:{msg:this.msg,username:this.username,password:this.password}})],1)},staticRenderFns:[]};var R=n("VU/8")($,T,!1,function(t){n("Qxdp")},"data-v-ff0a9434",null).exports;r.default.use(p.a);var E=[{name:"AddNode",id:"addnode",icon:"desktop",path:"/",component:b,meta:{title:"AddNode"}},{name:"WebSSH",id:"webssh",path:"/webssh",component:R,meta:{title:"WebSSH"}}],H=new p.a({routes:E}),P=(n("uMhA"),n("D4uH"));n("D/PP"),n("fIPj");r.default.use(m.a),r.default.config.productionTip=!1,r.default.component("icon",P.a),new r.default({el:"#app",router:H,components:{App:h},template:""})},PEjQ:function(t,e){},Qxdp:function(t,e){},YvoH:function(t,e){},fIPj:function(t,e){},go35:function(t,e){t.exports=[{name:"主机",id:"addnode",icon:"desktop",path:"/"}]},tvR6:function(t,e){},uMhA:function(t,e){}},["NHnr"]);
2 | //# sourceMappingURL=app.882927472b97c9c72b3e.js.map
--------------------------------------------------------------------------------
/templates/static/js/app.882927472b97c9c72b3e.js.map:
--------------------------------------------------------------------------------
1 | {"version":3,"sources":["webpack:///node_modules/vue-awesome/components/Icon.vue","webpack:///./node_modules/vue-awesome/components/Icon.vue","webpack:///src/components/NavMenu.vue","webpack:///./src/components/NavMenu.vue?88a3","webpack:///./src/components/NavMenu.vue","webpack:///./src/components/Header.vue?ca05","webpack:///./src/components/Header.vue","webpack:///src/App.vue","webpack:///./src/App.vue?5a3e","webpack:///./src/App.vue","webpack:///src/components/AddNode.vue","webpack:///./src/components/AddNode.vue?e37b","webpack:///./src/components/AddNode.vue","webpack:///./src/components/Xterm.js","webpack:///src/components/Console.vue","webpack:///./src/components/Console.vue?ffda","webpack:///src/components/WebSSH.vue","webpack:///./src/components/Console.vue","webpack:///./src/components/WebSSH.vue?618d","webpack:///./src/components/WebSSH.vue","webpack:///./src/router/index.js","webpack:///./src/main.js","webpack:///./src/config/menu-config.js"],"names":["icons","Icon","name","props","type","String","validator","val","console","warn","title","scale","Number","spin","Boolean","inverse","pulse","flip","label","tabindex","data","id","getId","x","y","childrenWidth","childrenHeight","outerScale","computed","normalizedScale","this","isNaN","klass","defineProperty_default","fa-icon","fa-spin","fa-flip-horizontal","fa-flip-vertical","fa-inverse","fa-pulse","$options","icon","box","width","height","ratio","_icon","Math","max","style","fontSize","raw","ids","replace","match","quote","uniqueId","rawId","_","pointerId","focusable","parseInt","mounted","updateStack","updated","methods","_this","$children","length","forEach","child","render","h","options","class","attrs","role","$attrs","aria-label","aria-hidden","viewBox","titleId","html","c","ESCAPE_MAP","escapeHTML","domProps","innerHTML","content","concat","$slots","default","toConsumableArray_default","paths","map","path","i","key","polygons","polygon","register","_icon$paths","undefined","d","_icon$polygons","points","push","Icon_assign","obj","_len","arguments","sources","Array","_key","source","hasOwnProperty","cursor","toString","<",">","\"","&","Component","__webpack_require__","normalizeComponent","ssrContext","__webpack_exports__","NavMenu","menu","menu_config_default","a","handleOpen","keyPath","log","handleClose","components_NavMenu","_vm","_h","$createElement","_c","_self","staticClass","span","default-active","router","on","open","close","_l","item","index","slot","_v","textContent","_s","staticRenderFns","Header","App","components","navmenu","vheader","Header_normalizeComponent","selectortype_template_index_0_src_App","src_App","App_normalizeComponent","AddNode","ruleForm","pass","checkPass","port","ipaddress","username","rules","rule","value","callback","Error","setTimeout","is_integer_default","trigger","submitForm","formName","$refs","validate","valid","alert","resetForm","resetFields","goToWebssh","jsonStr","datMsg","window","btoa","$router","params","msg","dataObj","components_AddNode","ref","model","status-icon","label-width","label-position","prop","required","$$v","$set","expression","autocomplete","_n","plain","click","$event","src_components_AddNode","AddNode_normalizeComponent","Terminal","applyAddon","fit","attach","Console","password","term","terminalSocket","runRealTerminal","errorRealTerminal","closeRealTerminal","containerWidth","screen","cols","floor","rows","innerHeight","url","location","protocol","hostname","terminalContainer","document","getElementById","Xterm","WebSocket","onopen","onclose","onerror","_initialized","beforeDestroy","destroy","components_Console","WebSSH","my-terminal","Console_normalizeComponent","getParams","$route","created","components_WebSSH","src_components_WebSSH","WebSSH_normalizeComponent","Vue","use","Router","routes","component","meta","ElementUI","config","productionTip","el","template","module","exports"],"mappings":"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","file":"static/js/app.882927472b97c9c72b3e.js","sourcesContent":["\n\n\n\n\n\n// WEBPACK FOOTER //\n// node_modules/vue-awesome/components/Icon.vue","function injectStyle (ssrContext) {\n require(\"!!../../extract-text-webpack-plugin/dist/loader.js?{\\\"omit\\\":1,\\\"remove\\\":true}!vue-style-loader!css-loader?{\\\"sourceMap\\\":true}!../../vue-loader/lib/style-compiler/index?{\\\"vue\\\":true,\\\"id\\\":\\\"data-v-0c681150\\\",\\\"scoped\\\":false,\\\"hasInlineConfig\\\":false}!../../vue-loader/lib/selector?type=styles&index=0!./Icon.vue\")\n}\nvar normalizeComponent = require(\"!../../vue-loader/lib/component-normalizer\")\n/* script */\nexport * from \"!!babel-loader!../../vue-loader/lib/selector?type=script&index=0!./Icon.vue\"\nimport __vue_script__ from \"!!babel-loader!../../vue-loader/lib/selector?type=script&index=0!./Icon.vue\"\n/* template */\nvar __vue_template__ = null\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-awesome/components/Icon.vue\n// module id = null\n// module chunks = ","\r\n \r\n \r\n \r\n \r\n \r\n\r\n\r\n\r\n\r\n\r\n\n\n\n// WEBPACK FOOTER //\n// src/components/NavMenu.vue","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('el-row',{staticClass:\"tac\"},[_c('el-col',{attrs:{\"span\":24}},[_c('el-menu',{staticClass:\"el-menu-vertical-demo\",attrs:{\"default-active\":\"2\",\"router\":\"\"},on:{\"open\":_vm.handleOpen,\"close\":_vm.handleClose}},_vm._l((_vm.menu),function(item){return _c('el-menu-item',{key:item.id,attrs:{\"index\":item.path}},[_c('template',{slot:\"title\"},[_c('icon',{attrs:{\"name\":item.icon}}),_vm._v(\" \"),_c('span',{domProps:{\"textContent\":_vm._s(item.name)}})],1)],2)}),1)],1)],1)}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-28ac6478\",\"hasScoped\":true,\"transformToRequire\":{\"video\":[\"src\",\"poster\"],\"source\":\"src\",\"img\":\"src\",\"image\":\"xlink:href\"},\"buble\":{\"transforms\":{}}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/components/NavMenu.vue\n// module id = null\n// module chunks = ","function injectStyle (ssrContext) {\n require(\"!!../../node_modules/extract-text-webpack-plugin/dist/loader.js?{\\\"omit\\\":1,\\\"remove\\\":true}!vue-style-loader!css-loader?{\\\"sourceMap\\\":true}!../../node_modules/vue-loader/lib/style-compiler/index?{\\\"vue\\\":true,\\\"id\\\":\\\"data-v-28ac6478\\\",\\\"scoped\\\":true,\\\"hasInlineConfig\\\":false}!../../node_modules/vue-loader/lib/selector?type=styles&index=0!./NavMenu.vue\")\n}\nvar normalizeComponent = require(\"!../../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nexport * from \"!!babel-loader!../../node_modules/vue-loader/lib/selector?type=script&index=0!./NavMenu.vue\"\nimport __vue_script__ from \"!!babel-loader!../../node_modules/vue-loader/lib/selector?type=script&index=0!./NavMenu.vue\"\n/* template */\nimport __vue_template__ from \"!!../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-28ac6478\\\",\\\"hasScoped\\\":true,\\\"transformToRequire\\\":{\\\"video\\\":[\\\"src\\\",\\\"poster\\\"],\\\"source\\\":\\\"src\\\",\\\"img\\\":\\\"src\\\",\\\"image\\\":\\\"xlink:href\\\"},\\\"buble\\\":{\\\"transforms\\\":{}}}!../../node_modules/vue-loader/lib/selector?type=template&index=0!./NavMenu.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = \"data-v-28ac6478\"\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/NavMenu.vue\n// module id = null\n// module chunks = ","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('el-row',[_c('div',{staticClass:\"head-wrap\"},[_vm._v(\"Web-Terminal\")])])}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-f79b580a\",\"hasScoped\":true,\"transformToRequire\":{\"video\":[\"src\",\"poster\"],\"source\":\"src\",\"img\":\"src\",\"image\":\"xlink:href\"},\"buble\":{\"transforms\":{}}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/components/Header.vue\n// module id = null\n// module chunks = ","function injectStyle (ssrContext) {\n require(\"!!../../node_modules/extract-text-webpack-plugin/dist/loader.js?{\\\"omit\\\":1,\\\"remove\\\":true}!vue-style-loader!css-loader?{\\\"sourceMap\\\":true}!../../node_modules/vue-loader/lib/style-compiler/index?{\\\"vue\\\":true,\\\"id\\\":\\\"data-v-f79b580a\\\",\\\"scoped\\\":true,\\\"hasInlineConfig\\\":false}!../../node_modules/vue-loader/lib/selector?type=styles&index=0!./Header.vue\")\n}\nvar normalizeComponent = require(\"!../../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nvar __vue_script__ = null\n/* template */\nimport __vue_template__ from \"!!../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-f79b580a\\\",\\\"hasScoped\\\":true,\\\"transformToRequire\\\":{\\\"video\\\":[\\\"src\\\",\\\"poster\\\"],\\\"source\\\":\\\"src\\\",\\\"img\\\":\\\"src\\\",\\\"image\\\":\\\"xlink:href\\\"},\\\"buble\\\":{\\\"transforms\\\":{}}}!../../node_modules/vue-loader/lib/selector?type=template&index=0!./Header.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = \"data-v-f79b580a\"\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/Header.vue\n// module id = null\n// module chunks = ","\n \n \n \n \n \n \n \n \n \n \n \n \n
\n\n\n\n\n\n\n\n\n// WEBPACK FOOTER //\n// src/App.vue","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{attrs:{\"id\":\"app\"}},[_c('el-container',[_c('el-header',{staticClass:\"header\"},[_c('vheader')],1),_vm._v(\" \"),_c('el-container',[_c('el-aside',{staticClass:\"aside\",attrs:{\"width\":\"200px\"}},[_c('navmenu')],1),_vm._v(\" \"),_c('el-main',[_c('router-view')],1)],1)],1)],1)}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-77b452e5\",\"hasScoped\":false,\"transformToRequire\":{\"video\":[\"src\",\"poster\"],\"source\":\"src\",\"img\":\"src\",\"image\":\"xlink:href\"},\"buble\":{\"transforms\":{}}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/App.vue\n// module id = null\n// module chunks = ","function injectStyle (ssrContext) {\n require(\"!!../node_modules/extract-text-webpack-plugin/dist/loader.js?{\\\"omit\\\":1,\\\"remove\\\":true}!vue-style-loader!css-loader?{\\\"sourceMap\\\":true}!../node_modules/vue-loader/lib/style-compiler/index?{\\\"vue\\\":true,\\\"id\\\":\\\"data-v-77b452e5\\\",\\\"scoped\\\":false,\\\"hasInlineConfig\\\":false}!../node_modules/vue-loader/lib/selector?type=styles&index=0!./App.vue\")\n}\nvar normalizeComponent = require(\"!../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nexport * from \"!!babel-loader!../node_modules/vue-loader/lib/selector?type=script&index=0!./App.vue\"\nimport __vue_script__ from \"!!babel-loader!../node_modules/vue-loader/lib/selector?type=script&index=0!./App.vue\"\n/* template */\nimport __vue_template__ from \"!!../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-77b452e5\\\",\\\"hasScoped\\\":false,\\\"transformToRequire\\\":{\\\"video\\\":[\\\"src\\\",\\\"poster\\\"],\\\"source\\\":\\\"src\\\",\\\"img\\\":\\\"src\\\",\\\"image\\\":\\\"xlink:href\\\"},\\\"buble\\\":{\\\"transforms\\\":{}}}!../node_modules/vue-loader/lib/selector?type=template&index=0!./App.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/App.vue\n// module id = null\n// module chunks = ","\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n 连接\r\n 重置\r\n \r\n \r\n
\r\n\r\n\r\n\n\n\n// WEBPACK FOOTER //\n// src/components/AddNode.vue","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[_c('el-form',{ref:\"ruleForm\",staticClass:\"demo-ruleForm\",attrs:{\"model\":_vm.ruleForm,\"status-icon\":\"\",\"rules\":_vm.rules,\"label-width\":\"100px\",\"label-position\":\"left\"}},[_c('el-form-item',{attrs:{\"label\":\"ip地址\",\"prop\":\"ipaddress\",\"required\":\"\"}},[_c('el-input',{attrs:{\"type\":\"text\"},model:{value:(_vm.ruleForm.ipaddress),callback:function ($$v) {_vm.$set(_vm.ruleForm, \"ipaddress\", $$v)},expression:\"ruleForm.ipaddress\"}})],1),_vm._v(\" \"),_c('el-form-item',{attrs:{\"label\":\"用户名\",\"prop\":\"username\",\"required\":\"\"}},[_c('el-input',{attrs:{\"type\":\"text\"},model:{value:(_vm.ruleForm.username),callback:function ($$v) {_vm.$set(_vm.ruleForm, \"username\", $$v)},expression:\"ruleForm.username\"}})],1),_vm._v(\" \"),_c('el-form-item',{attrs:{\"label\":\"密码\",\"prop\":\"pass\",\"required\":\"\"}},[_c('el-input',{attrs:{\"type\":\"password\",\"autocomplete\":\"off\"},model:{value:(_vm.ruleForm.pass),callback:function ($$v) {_vm.$set(_vm.ruleForm, \"pass\", $$v)},expression:\"ruleForm.pass\"}})],1),_vm._v(\" \"),_c('el-form-item',{attrs:{\"label\":\"端口\",\"prop\":\"port\",\"required\":\"\"}},[_c('el-input',{model:{value:(_vm.ruleForm.port),callback:function ($$v) {_vm.$set(_vm.ruleForm, \"port\", _vm._n($$v))},expression:\"ruleForm.port\"}})],1),_vm._v(\" \"),_c('el-form-item',[_c('el-button',{attrs:{\"type\":\"primary\",\"plain\":\"\"},on:{\"click\":function($event){return _vm.goToWebssh()}}},[_vm._v(\"连接\")]),_vm._v(\" \"),_c('el-button',{on:{\"click\":function($event){return _vm.resetForm('ruleForm')}}},[_vm._v(\"重置\")])],1)],1)],1)}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-419c530e\",\"hasScoped\":false,\"transformToRequire\":{\"video\":[\"src\",\"poster\"],\"source\":\"src\",\"img\":\"src\",\"image\":\"xlink:href\"},\"buble\":{\"transforms\":{}}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/components/AddNode.vue\n// module id = null\n// module chunks = ","var normalizeComponent = require(\"!../../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nexport * from \"!!babel-loader!../../node_modules/vue-loader/lib/selector?type=script&index=0!./AddNode.vue\"\nimport __vue_script__ from \"!!babel-loader!../../node_modules/vue-loader/lib/selector?type=script&index=0!./AddNode.vue\"\n/* template */\nimport __vue_template__ from \"!!../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-419c530e\\\",\\\"hasScoped\\\":false,\\\"transformToRequire\\\":{\\\"video\\\":[\\\"src\\\",\\\"poster\\\"],\\\"source\\\":\\\"src\\\",\\\"img\\\":\\\"src\\\",\\\"image\\\":\\\"xlink:href\\\"},\\\"buble\\\":{\\\"transforms\\\":{}}}!../../node_modules/vue-loader/lib/selector?type=template&index=0!./AddNode.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = null\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/AddNode.vue\n// module id = null\n// module chunks = ","import { Terminal } from 'xterm'\r\nimport * as fit from 'xterm/lib/addons/fit/fit'\r\nimport * as attach from 'xterm/lib/addons/attach/attach'\r\nTerminal.applyAddon(fit)\r\nTerminal.applyAddon(attach)\r\n\r\nexport default Terminal\n\n\n// WEBPACK FOOTER //\n// ./src/components/Xterm.js","\r\n \r\n\r\n\n\n\n// WEBPACK FOOTER //\n// src/components/Console.vue","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"console\",attrs:{\"id\":\"terminal\"}})}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-4fd46d4d\",\"hasScoped\":false,\"transformToRequire\":{\"video\":[\"src\",\"poster\"],\"source\":\"src\",\"img\":\"src\",\"image\":\"xlink:href\"},\"buble\":{\"transforms\":{}}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/components/Console.vue\n// module id = null\n// module chunks = ","\r\n \r\n \r\n
\r\n\r\n\r\n\r\n\r\n\r\n\n\n\n// WEBPACK FOOTER //\n// src/components/WebSSH.vue","var normalizeComponent = require(\"!../../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nexport * from \"!!babel-loader!../../node_modules/vue-loader/lib/selector?type=script&index=0!./Console.vue\"\nimport __vue_script__ from \"!!babel-loader!../../node_modules/vue-loader/lib/selector?type=script&index=0!./Console.vue\"\n/* template */\nimport __vue_template__ from \"!!../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-4fd46d4d\\\",\\\"hasScoped\\\":false,\\\"transformToRequire\\\":{\\\"video\\\":[\\\"src\\\",\\\"poster\\\"],\\\"source\\\":\\\"src\\\",\\\"img\\\":\\\"src\\\",\\\"image\\\":\\\"xlink:href\\\"},\\\"buble\\\":{\\\"transforms\\\":{}}}!../../node_modules/vue-loader/lib/selector?type=template&index=0!./Console.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = null\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/Console.vue\n// module id = null\n// module chunks = ","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"container\"},[_c('my-terminal',{attrs:{\"msg\":_vm.msg,\"username\":_vm.username,\"password\":_vm.password}})],1)}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-ff0a9434\",\"hasScoped\":true,\"transformToRequire\":{\"video\":[\"src\",\"poster\"],\"source\":\"src\",\"img\":\"src\",\"image\":\"xlink:href\"},\"buble\":{\"transforms\":{}}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/components/WebSSH.vue\n// module id = null\n// module chunks = ","function injectStyle (ssrContext) {\n require(\"!!../../node_modules/extract-text-webpack-plugin/dist/loader.js?{\\\"omit\\\":1,\\\"remove\\\":true}!vue-style-loader!css-loader?{\\\"sourceMap\\\":true}!../../node_modules/vue-loader/lib/style-compiler/index?{\\\"vue\\\":true,\\\"id\\\":\\\"data-v-ff0a9434\\\",\\\"scoped\\\":true,\\\"hasInlineConfig\\\":false}!../../node_modules/vue-loader/lib/selector?type=styles&index=0!./WebSSH.vue\")\n}\nvar normalizeComponent = require(\"!../../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nexport * from \"!!babel-loader!../../node_modules/vue-loader/lib/selector?type=script&index=0!./WebSSH.vue\"\nimport __vue_script__ from \"!!babel-loader!../../node_modules/vue-loader/lib/selector?type=script&index=0!./WebSSH.vue\"\n/* template */\nimport __vue_template__ from \"!!../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-ff0a9434\\\",\\\"hasScoped\\\":true,\\\"transformToRequire\\\":{\\\"video\\\":[\\\"src\\\",\\\"poster\\\"],\\\"source\\\":\\\"src\\\",\\\"img\\\":\\\"src\\\",\\\"image\\\":\\\"xlink:href\\\"},\\\"buble\\\":{\\\"transforms\\\":{}}}!../../node_modules/vue-loader/lib/selector?type=template&index=0!./WebSSH.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = \"data-v-ff0a9434\"\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/WebSSH.vue\n// module id = null\n// module chunks = ","import Vue from 'vue'\nimport Router from 'vue-router'\nimport menus from '@/config/menu-config'\nimport AddNode from '@/components/AddNode'\nimport WebSSH from '@/components/WebSSH'\n\nVue.use(Router)\n\nvar routes = [\n {\n name: 'AddNode',\n id: 'addnode',\n icon: 'desktop',\n path: '/',\n component: AddNode,\n meta: {title: 'AddNode'}\n },\n {\n name: 'WebSSH',\n id: 'webssh',\n path: '/webssh',\n component: WebSSH,\n meta: {title: 'WebSSH'}\n },\n]\n\n\nexport default new Router({routes})\n\n\n\n// WEBPACK FOOTER //\n// ./src/router/index.js","// The Vue build version to load with the `import` command\n// (runtime-only or standalone) has been set in webpack.base.conf with an alias.\nimport Vue from 'vue'\nimport App from './App'\nimport ElementUI from 'element-ui'\nimport 'element-ui/lib/theme-chalk/index.css'\nimport router from './router'\nimport NormailizeCss from 'normalize.css'\nimport Icon from 'vue-awesome/components/Icon'\nimport 'vue-awesome/icons'\nimport 'xterm/dist/xterm.css'\n\nVue.use(ElementUI);\nVue.config.productionTip = false\nVue.component('icon', Icon)\n\n/* eslint-disable no-new */\nnew Vue({\n el: '#app',\n router,\n components: { App },\n template: ''\n})\n\n\n\n// WEBPACK FOOTER //\n// ./src/main.js","module.exports = [{\r\n name: '主机',\r\n id: 'addnode',\r\n icon: 'desktop',\r\n path: \"/\"\r\n}]\n\n\n// WEBPACK FOOTER //\n// ./src/config/menu-config.js"],"sourceRoot":""}
--------------------------------------------------------------------------------