├── .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\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// 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\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\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\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":""} --------------------------------------------------------------------------------