FTP-server на node js
Всем привет. С толкнулся с проблемой при создании ftp сервера на node js.
Нашел библиотеку ftp-srv. В принципе она рабочая. Через клиент FileZilla подключается, файлы, каталоги все передается. Но есть проблемка, то что не все события прослушиваются . Рабочие только STOR,RETR, RNTO. Все остальные не слушаются. Начал писать без использования бибилиотеки с помощью модуля NET. Но столкнулся с проблемой, то что вроде как авторизовывается клиент, но каталог не показывается. Пишется невозможно построить каталог. Кто сталкивался с такой проблемой? Буду признателен, если укажите мне(неандертальцу) в чем может заключаться данная проблема |
const net = require('net'); const path = require('path'); const fs = require('fs') /** * DELE 250 Удалить файл RMD 250 Удалить директорию CWD 250 Перейти в директорию MKD 257 Создать директорию PWD 257 Узнать текущую директорию QUIT 221 Закончить работу TYPE 200 Установить тип передачи PORT 200 Перейти в активный режим PASV 227 Перейти в пассивный режим LIST 150,226 Получить содержимое каталога RETR 150,226 Скачать файл STOR 150,226 Залить файл ABOR 426,226 Отменить передачу RNFR 350 Выбрать файл для переименования RNTO 250 Переименовать файл * @type {Server} */ const server = net.createServer({pauseOnConnect: true}, (socket) => { console.log(socket.id) socket.setTimeout(0) // 'connection' listener. console.log('client connected'); socket.on('error', (err) => { console.log('Client error:', err) }); socket.on('connect', function (data) { console.log('connect:', data) }); socket.on('data', function (data) { console.log('data:', data.toString().split('\r\n')) const message = data.toString().split('\r\n'); if (message[0].substr(0,4) === 'AUTH') { socket.write('502\r\n 504 \r\n') } if (message[0] === 'USER anonymous') { socket.write('331 \r\n') } if (message[0] === 'PASS [email]anonymous@example.com[/email]') { socket.write('230 \r\n') } if (message[0] === 'FEAT') { socket.write('211 \r\n') } if (message[0] === 'SYST') { socket.write('230 \r\n') } if (message[0] === 'OPTS UTF8 ON') { socket.write('200 \r\n') } if (message[0] === 'PWD') { const command = '257 "\\" \r\n'; socket.write(command) } if (message[0].substr(0,4) === 'TYPE') { socket.write('200 \r\n') } if (message[0] === 'PASV') { const portByte1 = 21 / 256 | 0; const portByte2 = 21 % 256; socket.write(`227 PASV OK\r\n`) } if (message[0].substr(0,4) === 'PORT') { socket.write('200 \r\n') } if (message[0] === 'LIST') { socket.write('150\r\n 226\r\n', 'utf8') } if (message[0] === 'CDUP') { socket.write('250 \r\n') } if (message[0].substr(0,3) === 'CWD') { socket.write('250 \r\n') } }); socket.on('timeout', () => { console.log('Client timeout') }); socket.on('end', () => { console.log('client disconnected'); }); socket.write('220 Hello World!\n') socket.resume() }); server.on('error', (err) => { console.log(err) }); server.listen(21, '127.0.0.1', () => { console.log('opened server on', server.address()); }); |
Вот это не прослушивает
connection.on('MKD', (error, fileName) => { console.log('Создать каталог') }); в консоле не выводит , что отработало. |
require('dotenv').config() const FtpSrv = require('ftp-srv'); const User = require('./user') const winston = require('winston'); const ftpServer = new FtpSrv({ blacklist: [] }); const logger = winston.createLogger({ level: 'info', format: winston.format.json(), transports: [ new winston.transports.File({filename: 'src/storage/logs/events.log'}), ], }); ftpServer.on('login', ({connection, username, password}, resolve, reject) => { if (process.env.METHOD_AUTHORIZATION === 'normal') { const user = new User(username, password) // проверка | check if (user.isLogin()) { // Работа с файлами | Working with files // загрузка | upload connection.on('STOR', (error, fileName) => { logger.log('info', { event: "file:upload", path: fileName, src_ip: '', src_port: '' }); }); // скачивание | download connection.on('RETR', (error, fileName) => { logger.log('info', { event: "file:download", path: fileName, src_ip: '', src_port: '' }); }); // удаление | delete connection.on('DELE', (error, fileName) => { logger.log('info', { event: "file:delete", path: fileName, src_ip: '', src_port: '' }); }); // Работа с каталогами | Working with catalogs // создать | create connection.on('MKD', (error, fileName) => { console.log('Создать каталог') }); // удалить | delete connection.on('RMD', (error, fileName) => { console.log('Удалить каталог') }); // переименовать во что | rename connection.on('RNTO', (error, fileName) => { console.log('Переименовано') }); // Установить рабочий каталог | Install the working directory resolve({root: `src/storage/disk`}) } else { reject({message: user.getError()}) } } else { resolve({root: `src/disk`}) } }) ftpServer.on('client-error', ({connection, context, error}) => { console.log(error.message) }); ftpServer.listen().then(() => { }); |
А как их дописать, просто в документации ничего такого нет, что можно как то дописывать команды?
|
А в каком файле это дописать? как подгрузить свой модуль в либу?
|
Или это возможно только через клонирование самой либы ?
|
Спасибо за ответы решил проблемы через File System
|
Часовой пояс GMT +3, время: 06:13. |