webio-node/app.js

138 lines
4.3 KiB
JavaScript

const express = require('express');
const bodyParser = require('body-parser');
const cookieParser = require('cookie-parser');
const session = require('express-session');
const cors = require('cors');
const logger = require('morgan');
const path = require('path');
const config = require('./config');
const so = require('./includes/storeObject');
const exec = require('child_process').exec;
const fs = require('fs');
const archiver = require('archiver');
const app = express();
const api_route = require('./route/api');
// storeObject interval clear
const clearStore = setInterval(() => {
so.clear();
}, 30000)
app.set('port', process.env.PORT || config.system.port);
app.use(logger('short'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(session({
resave: false,
saveUninitialized: true,
secret: '6520833345e05e0dcfce'
}));
app.use(cors());
app.use(express.static(path.resolve(__dirname, 'public')));
app.use('/semantic', express.static(path.resolve(__dirname, 'node_modules', 'semantic-ui-css')));
app.use('/react-datetime', express.static(path.resolve(__dirname, 'node_modules', 'react-datetime', 'css')));
app.use(/\/locales\/(\w+).json/, (req, res, n) => {
res.sendFile(path.resolve(__dirname, 'public', 'locales', 'zh.json'));
})
const server = app.listen(app.get('port'), () => {
console.log(`Server start on port ${server.address().port}`);
});
// use route
app.use('/api', api_route);
app.get('/', (req, res) => {
res.sendFile(path.resolve(__dirname, 'views', 'index.html'));
});
app.get(['/admin', '/admin/*'], (req, res) => {
res.sendFile(path.resolve(__dirname, 'views', 'admin.html'));
});
app.get('/camevent', (req, res) => {
let ip = req.headers['x-forwarded-for'] || req.connection.remoteAddress;
ip = ip.split(':').pop();
let cmd = `camcam ${ip} ${Math.floor(Date.now() / 1000)}`;
exec(cmd, (err, sout, serr) => {
res.send({ ip });
});
})
app.get(['/viewcamimg/:dir/:file', '/dlcamvideo/:dir/:file'], async(req, res) => {
let dir = req.params.dir;
let file = req.params.file;
if (!dir || !file) return res.sendStatus(404);
try {
let stat = await new Promise((resolve, reject) => {
fs.stat(path.resolve(config.cmdpath.ipcamsave, dir, file), (err, stats) => {
if (err) return reject(err);
return resolve(stats);
})
})
if (!stat.isFile()) return res.sendStatus(404);
} catch (e) {
return res.sendStatus(404);
}
res.sendfile(path.resolve(config.cmdpath.ipcamsave, dir, file))
})
app.get('/dlevent/:dir', async(req, res) => {
let dir = req.params.dir;
if (!dir) return res.sendStatus(404);
let list = [];
try {
let stat = await new Promise((resolve, reject) => {
fs.stat(path.resolve(config.cmdpath.ipcamsave, dir), (err, stats) => {
if (err) return reject(err);
return resolve(stats);
})
});
if (!stat.isDirectory()) return res.sendStatus(404);
list = await new Promise((resolve, reject) => {
fs.readdir(path.resolve(config.cmdpath.ipcamsave, dir), (err, fis) => {
if (err) return reject(err);
return resolve(fis);
})
})
} catch (e) {
return res.sendStatus(404);
}
res.writeHead(200, {
'Content-Type': 'application/zip',
'Content-disposition': 'attachment; filename=cam_event.zip'
});
let zip = archiver('zip', { store: true });
zip.pipe(res);
for (let i of list) {
zip.file(path.resolve(config.cmdpath.ipcamsave, dir, i), { name: i })
}
zip.finalize();
})
app.get('/servcmd', (req, res) => {
res.send({ status: `exit time ${(new Date()).toString()}` });
setTimeout(() => { process.exit(1) }, 2000);
});
app.get('/fixmysql', (req, res) => {
exec('systemctl stop mysqld', (err, sout, serr) => {
let cmd = 'rm /home/www/mydb/aria*';
let json = {
rm: '',
restart: ''
};
exec(cmd, (err, stdout, stderr) => {
let cmd = 'systemctl start mysqld';
json.rm = stdout;
exec(cmd, (err, sout, serr) => {
json.restart = sout;
res.send(json);
})
})
})
});