feat(cli): add cli support for ftp-srv
This commit is contained in:
committed by
Tyler Stewart
parent
3a7b3d4570
commit
87f3ae79a1
10
README.md
10
README.md
@@ -258,6 +258,16 @@ __Used in:__ `STOU`
|
|||||||
|
|
||||||
See [CONTRIBUTING.md](CONTRIBUTING.md).
|
See [CONTRIBUTING.md](CONTRIBUTING.md).
|
||||||
|
|
||||||
|
## CLI
|
||||||
|
|
||||||
|
Command-line interface
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ ftp-srv [opts] [path]
|
||||||
|
$ ftp-srv --help
|
||||||
|
```
|
||||||
|
|
||||||
|
path => defaults to pwd
|
||||||
|
|
||||||
<!--[]-->
|
<!--[]-->
|
||||||
|
|
||||||
|
|||||||
98
bin/ftp-srv
Executable file
98
bin/ftp-srv
Executable file
@@ -0,0 +1,98 @@
|
|||||||
|
#!/usr/bin/env node
|
||||||
|
|
||||||
|
const yargs = require('yargs');
|
||||||
|
const path = require('path');
|
||||||
|
|
||||||
|
const FtpSrv = require('../src');
|
||||||
|
|
||||||
|
const args = setupYargs();
|
||||||
|
|
||||||
|
setupCredentials();
|
||||||
|
startFtpServer();
|
||||||
|
|
||||||
|
function setupYargs() {
|
||||||
|
return yargs
|
||||||
|
.option('address', {
|
||||||
|
alias: 'a',
|
||||||
|
default: 'ftp://0.0.0.0:9876',
|
||||||
|
describe: '{ftp|ftps}://{ip-address}:[port]',
|
||||||
|
type: 'string'
|
||||||
|
})
|
||||||
|
.option('username', {
|
||||||
|
describe: 'Blank for anonymous',
|
||||||
|
default: '',
|
||||||
|
type: 'string'
|
||||||
|
})
|
||||||
|
.option('password', {
|
||||||
|
default: '',
|
||||||
|
type: 'string'
|
||||||
|
})
|
||||||
|
.option('read-only', {
|
||||||
|
describe: 'Disable upload',
|
||||||
|
boolean: true,
|
||||||
|
default: false
|
||||||
|
})
|
||||||
|
.option('credentials', {
|
||||||
|
alias: 'c',
|
||||||
|
describe: 'Load user & pass from json file',
|
||||||
|
default: ''
|
||||||
|
})
|
||||||
|
.argv;
|
||||||
|
}
|
||||||
|
|
||||||
|
function setupCredentials() {
|
||||||
|
if (args.username.length === 0 && args.credentials.length > 0) {
|
||||||
|
const credentials = require(path.resolve(args.credentials));
|
||||||
|
if (credentials.username) {
|
||||||
|
args.username = credentials.username;
|
||||||
|
}
|
||||||
|
if (credentials.password) {
|
||||||
|
args.password = credentials.password;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function getPathToServe(args_) {
|
||||||
|
const path = args_['_'];
|
||||||
|
if (path.length === 0) {
|
||||||
|
return process.cwd();
|
||||||
|
} else {
|
||||||
|
return path[0];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function getBlacklistedForReadonlyCommands(isReadOnly) {
|
||||||
|
if (isReadOnly) {
|
||||||
|
return ['allo', 'appe', 'dele', 'mkd', 'rmd', 'rnfr', 'rnto', 'stor', 'stru']
|
||||||
|
.map(item => item.toUpperCase());
|
||||||
|
}
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
|
||||||
|
function startFtpServer() {
|
||||||
|
const ftpServer = new FtpSrv(args.address);
|
||||||
|
|
||||||
|
ftpServer.on('login', (data, resolve, reject) => {
|
||||||
|
const isAnonymous = args.username === '';
|
||||||
|
if (isAnonymous || (data.username === args.username && data.password === args.password)) {
|
||||||
|
resolve({
|
||||||
|
root: getPathToServe(args),
|
||||||
|
blacklist: getBlacklistedForReadonlyCommands(args.readOnly)
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
reject(new Error('Invalid username or password'));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
ftpServer.listen();
|
||||||
|
}
|
||||||
|
|
||||||
|
process.on('SIGINT', function () {
|
||||||
|
logger.info(colors.red('ftp-srv stopped.'));
|
||||||
|
process.exit();
|
||||||
|
});
|
||||||
|
|
||||||
|
process.on('SIGTERM', function () {
|
||||||
|
logger.info(colors.red('ftp-srv stopped.'));
|
||||||
|
process.exit();
|
||||||
|
});
|
||||||
@@ -14,6 +14,7 @@
|
|||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"files": [
|
"files": [
|
||||||
"src",
|
"src",
|
||||||
|
"bin",
|
||||||
"ftp-srv.d.ts"
|
"ftp-srv.d.ts"
|
||||||
],
|
],
|
||||||
"main": "ftp-srv.js",
|
"main": "ftp-srv.js",
|
||||||
@@ -38,6 +39,9 @@
|
|||||||
"verify:js:watch": "chokidar 'src/**/*.js' 'test/**/*.js' 'config/**/*.js' -c 'npm run verify:js:fix' --initial --silent",
|
"verify:js:watch": "chokidar 'src/**/*.js' 'test/**/*.js' 'config/**/*.js' -c 'npm run verify:js:fix' --initial --silent",
|
||||||
"verify:watch": "npm run verify:js:watch --silent"
|
"verify:watch": "npm run verify:js:watch --silent"
|
||||||
},
|
},
|
||||||
|
"bin": {
|
||||||
|
"ftp-srv": "./bin/ftp-srv"
|
||||||
|
},
|
||||||
"release": {
|
"release": {
|
||||||
"verifyConditions": "condition-circle"
|
"verifyConditions": "condition-circle"
|
||||||
},
|
},
|
||||||
@@ -55,7 +59,8 @@
|
|||||||
"ip": "^1.1.5",
|
"ip": "^1.1.5",
|
||||||
"lodash": "^4.17.10",
|
"lodash": "^4.17.10",
|
||||||
"moment": "^2.22.1",
|
"moment": "^2.22.1",
|
||||||
"uuid": "^3.2.1"
|
"uuid": "^3.2.1",
|
||||||
|
"yargs": "^11.0.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@icetee/ftp": "^1.0.2",
|
"@icetee/ftp": "^1.0.2",
|
||||||
|
|||||||
Reference in New Issue
Block a user