68 lines
1.6 KiB
JavaScript
68 lines
1.6 KiB
JavaScript
const { FtpSrv } = require('@electerm/ftp-srv')
|
|
const path = require('path')
|
|
const fs = require('fs')
|
|
|
|
// Create FTP root directory if it doesn't exist
|
|
const ftpRoot = path.join(__dirname, 'ftp-root')
|
|
if (!fs.existsSync(ftpRoot)) {
|
|
fs.mkdirSync(ftpRoot)
|
|
}
|
|
|
|
const ftpServer = new FtpSrv({
|
|
url: 'ftp://0.0.0.0:21',
|
|
anonymous: false,
|
|
root: ftpRoot
|
|
})
|
|
|
|
// Handle user login
|
|
ftpServer.on('login', ({ username, password }, resolve, reject) => {
|
|
// Simple authentication
|
|
console.log('login', username, password)
|
|
if (username === 'test' && password === 'test123') {
|
|
return resolve({ root: ftpRoot })
|
|
}
|
|
return reject(new Error('Invalid username or password'))
|
|
})
|
|
|
|
// Log events
|
|
ftpServer.on('client-error', ({ connection, context, error }) => {
|
|
console.log('Client error', error)
|
|
})
|
|
|
|
ftpServer.on('STOR', (error, fileName) => {
|
|
if (error) {
|
|
console.log('Error uploading file:', error)
|
|
} else {
|
|
console.log('File uploaded:', fileName)
|
|
}
|
|
})
|
|
|
|
ftpServer.on('RETR', (error, fileName) => {
|
|
if (error) {
|
|
console.log('Error downloading file:', error)
|
|
} else {
|
|
console.log('File downloaded:', fileName)
|
|
}
|
|
})
|
|
|
|
// Start server
|
|
ftpServer.listen()
|
|
.then(() => {
|
|
console.log('FTP server is running at port 21')
|
|
console.log('Username: test')
|
|
console.log('Password: test123')
|
|
console.log('FTP root directory:', ftpRoot)
|
|
})
|
|
.catch(err => {
|
|
console.log('Error starting FTP server:', err)
|
|
})
|
|
|
|
// Handle shutdown
|
|
process.on('SIGTERM', () => {
|
|
ftpServer.close()
|
|
.then(() => {
|
|
console.log('FTP server closed')
|
|
process.exit(0)
|
|
})
|
|
})
|