-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathserver.js
124 lines (111 loc) · 2.62 KB
/
server.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
var express = require('express')
var path = require('path')
var app = express()
var socket_io = require('socket.io')
var child_process = require('child_process')
var _ = require('lodash')
var fs = require('fs')
var config = require('./config')
var server, io
//process.title = 'Web CLI'
app.use('/', express.static(
path.resolve(__dirname, 'static')
))
app.use('/bower_components', express.static(
path.resolve(__dirname, 'bower_components')
))
app.listen = (function(fn){
return function(port, callback){
callback = (function(fn){
return function(){
initSocketIO()
return fn.apply(null, arguments)
}
})(callback)
return fn.apply(app, [port, callback])
}
})(app.listen)
// exports or listen
if (module.parent) {
module.exports = app
} else {
server = app.listen(config.port, function(err){
if (err) throw err
console.log('Listening at port %d', config.port)
})
}
function initSocketIO(){
io = socket_io(server)
io.on('connection', function(socket){
socket.data = {
user: null,
auth: false,
dir: config.dir
}
socket.on('dir', function(dir){
if (!socket.data.auth) return
var _dir = path.resolve(dir)
if (fs.existsSync(_dir)) {
socket.data.dir = _dir
} else {
_dir = socket.data.dir // roll back
}
if (_dir !== dir) {
socket.emit('dir', _dir)
}
})
socket.on('run', function(cmd){
if (!socket.data.auth) return
runCommand(cmd, socket)
})
if (config.users) {
socket.on('login', function(user){
if (checkAuth(user)) {
socket.data.user = user.username
socket.data.auth = true
socket.emit('auth', {
ok: true,
dir: socket.data.dir
})
} else {
socket.emit('auth', {
ok: false,
msg: 'Auth failed'
})
}
})
socket.emit('login')
} else {
socket.data.auth = true
socket.emit('auth', {
ok: true,
dir: socket.data.dir
})
}
})
console.log('socket.io binded')
}
function checkAuth(user){
return _.some(config.users, function(u){
return u.username === user.username &&
u.password === user.password
})
}
function runCommand(cmd, socket){
var segs = cmd.split(/\n/)
var opt = {
cwd: socket.data.dir
}
_.each(segs, function(seg){
child_process.exec(seg, opt, function(err, stdout, stderr){
var result = {
err: !!err,
seg: seg,
cwd: opt.cwd,
stdout: stdout,
stderr: stderr
}
socket.emit('respond', result)
})
})
}