forked from groundwater/node-bin-nsh
-
Notifications
You must be signed in to change notification settings - Fork 2
/
server.js
executable file
·131 lines (95 loc) · 2.26 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
125
126
127
128
129
130
131
#!/usr/bin/env node
const readFile = require('fs').readFile
const concat = require('concat-stream')
const eachSeries = require('async/eachSeries')
const Nsh = require('.')
const PROFILE_FILES = ['/etc/profile', process.env.HOME+'/.profile']
const stdio = [process.stdin, process.stdout, process.stderr]
function eval(data)
{
// Re-adjust arguments
process.argv = process.argv.concat(argv)
Nsh.eval(stdio, data, function(error)
{
if(error) onerror(error)
})
}
function interactiveShell()
{
Nsh(stdio)
.on('SIGINT', function()
{
this.write('^C')
this.clearLine()
this.prompt()
})
}
function loadCommands()
{
switch(argv[0])
{
case '-c':
argv.shift()
const command_string = argv.shift()
if(!command_string) return onerror('-c requires an argument')
const command_name = argv.shift()
if(command_name) process.argv[0] = command_name
return eval(command_string)
case '-s':
argv.shift()
return process.stdin.pipe(concat(function(data)
{
eval(data.toString())
}))
.on('error', onerror)
break
default:
const command_file = argv.shift()
if(command_file)
return readFile(command_file, 'utf-8', function(error, data)
{
if(error) return onerror(error)
eval(data)
})
}
//
// Start an interactive shell
//
// Re-adjust arguments
process.argv = process.argv.concat(argv)
const ENV = process.env.ENV
if(!ENV) return interactiveShell()
readFile(ENV, 'utf-8', function(error, data)
{
if(error) return onerror(error)
Nsh.eval(stdio, data, function(error)
{
if(error) return onerror(error)
interactiveShell()
})
})
}
function onerror(error)
{
console.error(process.argv0+': '+error)
process.exit(2)
}
// Get arguments
const argv = process.argv.slice(2)
process.argv = [process.argv[1]]
if(argv[0] != '-l') return loadCommands()
// Login shell
argv.shift()
eachSeries(PROFILE_FILES, function(file, callback)
{
readFile(file, 'utf-8', function(error, data)
{
if(error) return callback(error.code !== 'ENOENT' ? error : null)
Nsh.eval(stdio, data, callback)
})
},
function(error)
{
if(error) return onerror(error)
loadCommands()
})