webio-node/route/api/system.js
2017-04-05 11:26:30 +08:00

487 lines
17 KiB
JavaScript

const express = require('express');
const router = express.Router();
const rt = require('../ResTool');
const config = require('../../config.json');
const fs = require('fs');
const mysql = require('../../libs/mysql_pool');
const tool = require('../../includes/apiTool');
const exec = require('child_process').exec;
const so = require('../../includes/storeObject');
const crypt = require('../../libs/crypto');
router
.get('/', (req, res, n) => {
// res.db = new mysql();
// res.db.user = config.db.user;
// res.db.password = config.db.pass;
// res.db.host = config.db.host;
// res.db.port = config.db.port;
// res.db.database = config.db.db1;
// res.db.connect();
res.send({ name: 'WebIO System API' });
})
.post('*', async(req,res,n) => {
try{
res.db = await mysql.getConn();
}catch(e){
console.log(`Get DB Connection ERROR ${e}`);
return n('ERR8100');
}
n();
})
.post('/getnetwork', (req, res, n) => {
fs.exists(config.cmdpath.sysinfo, (exists) => {
if (!exists) return n('ERR0014');
fs.readFile(config.cmdpath.sysinfo, (err, d) => {
if (err) return n('ERR0014');
let str = d.toString().split(/\n/);
let arr = {};
for (var i in str) {
if (!str[i].trim()) continue;
let t = str[i].split(' ');
if (t.langth < 2) continue;
arr[t[0]] = t[1];
}
let data = {};
data.record = [arr];
res.api_res = data;
return n();
});
});
})
.post('/updatenetwork', (req, res, n) => {
let arr = req.body;
if (!tool.checkPermission(req)) return n('ERR9000');
if (!arr.data) return n('ERR0000');
if (!arr.data.type) return n('ERR0009');
if (arr.data.type == 'manual') {
if (!arr.data.ip) return n('ERR0010');
if (!arr.data.netmask) return n('ERR0011');
if (!arr.data.gateway) return n('ERR0012');
if (!arr.data.dns) return n('ERR0013');
}
let cmd = '';
if (arr.data.type == 'manual') {
cmd = `echo "${arr.data.ip}" "${arr.data.gateway}" "${arr.data.netmask}" "${arr.data.dns}" > ${config.cmdpath.manualip}`;
} else {
cmd = `touch ${config.cmdpath.dhcpip}`;
}
if (cmd.length > 0) {
exec(cmd, (err, sout, serr) => {
let data = {};
data.record = [];
res.api_res = data;
return n();
});
}
})
.post('/gettime', (req, res, n) => {
let cmd = 'date +%s';
exec(cmd, (err, sout, serr) => {
let time = parseInt(sout);
let data = {};
data.record = [{ time }];
res.api_res = data;
return n();
});
})
.post('/updatetime', (req, res, n) => {
let arr = req.body;
if (!tool.checkPermission(req)) return n('ERR9000');
if (!arr.data) return n('ERR0000');
if (!arr.data.time || !/^[0-9]{12}$/.test(arr.data.time)) return n('ERR0015');
let cmd = `echo "${arr.data.time}" > ${config.cmdpath.settime}`;
exec(cmd, (err, sout, serr) => {
let data = {};
data.record = [];
res.api_res = data;
return n();
});
})
.post('/login', (req, res, n) => {
let arr = req.body;
if (!arr.data) return n('ERR0000');
if (!arr.data.account) return n('ERR0016');
if (!arr.data.password) return n('ERR0017');
let query = "select * from ??.?? where `account` = ? and `user_password` = ?";
res.db.query(query, [config.db.db1, 'userlist', arr.data.account, arr.data.password], (err, row) => {
if (err) return rt.err(res, err, n, 'ERR8000');
if (row.length == 0) return n('ERR0019');
delete row[0]['user_password'];
let token = '';
while (true) {
token = crypt.random(15);
if (!so.chkKey(token)) break;
}
so.set(token, { user: row[0] });
let data = {};
data.record = row;
data.rt = {}
data.rt.permission = [];
let tmp = {};
for(let i in config.permission) {
if(config.permission[i]){
tmp[i] = true;
}
}
data.rt.permission.push(tmp);
data.token = token;
res.api_res = data;
return n();
});
})
.post('/logout', (req, res, n) => {
let token = req.headers['x-auth-token'];
if (token) {
so.del(token);
}
let data = {};
data.record = [];
res.api_res = data;
return n();
})
.post(['/getuserlist', '/getuser'], (req, res, n) => {
let s = false;
let arr = req.body;
if (req.url == '/getuser') {
s = true;
if (!arr.data) return n('ERR0000');
if (!arr.data.account) return n('ERR0016');
}
let query = "select * from ??.??";
let param = [config.db.db1, 'userlist']
if (s) {
query += " where `account` = ?";
param.push(arr.data.account);
}
res.db.query(query, param, (err, row) => {
if (err) return rt.err(res, err, n, 'ERR8000');
for (var i in row) {
delete row[i]['user_password'];
}
let data = {};
data.record = row;
res.api_res = data;
return n();
})
})
.post('/deluser', (req, res, n) => {
let arr = req.body;
if (!tool.checkPermission(req)) return n('ERR9000');
if (!arr.data) return n('ERR0000');
if (!arr.data.account) return n('ERR0016');
if (arr.data.account == 'admin') return n('ERR0037');
let query = "delete from ??.?? where `account` = ?";
let param = [config.db.db1, 'userlist', arr.data.account];
res.db.query(query, param, (err, row) => {
if (err) return rt.err(res,err, n, 'ERR0020');
let data = {};
data.record = [];
res.api_res = data;
return n();
});
})
.post('/edituser', (req, res, n) => {
let arr = req.body;
if (!tool.checkPermission(req)) return n('ERR9000');
if (!arr.data) return n('ERR0000');
if (!arr.data.account) return n('ERR0016');
let w = arr.data.write_privilege && arr.data.write_privilege == '1' ? 1 : 0;
let r = arr.data.read_privilege && arr.data.read_privilege == '1' ? 1 : 0;
let pass = typeof arr.data.password == 'string' && arr.data.password.length > 0 ? arr.data.password : '';
if(arr.data.account == 'admin') {
w = 1;
r = 1;
}
let query = "update ??.?? set `write_privilege` = ? , `read_privilege` = ? " +
(pass.length > 0 ? " , `user_password` = ? " : "") + " where `account` = ? ";
let param = [config.db.db1, 'userlist', w.toString(), r.toString()];
if (pass.length > 0) param.push(pass);
param.push(arr.data.account);
res.db.query(query, param, (err, row) => {
if (err) return rt.err(res,err,n,'ERR0021');
let data = {};
data.record = [];
res.api_res = data;
return n();
});
})
.post('/adduser', (req, res, n) => {
let arr = req.body;
if (!tool.checkPermission(req)) return n('ERR9000');
if (!arr.data) return n('ERR0000');
if (!arr.data.account) return n('ERR0016');
if (!arr.data.password) return n('ERR0017');
let w = arr.data.write_privilege && arr.data.write_privilege == '1' ? 1 : 0;
let r = arr.data.read_privilege && arr.data.read_privilege == '1' ? 1 : 0;
let query = "insert into ??.?? (`account`,`user_password`,`write_privilege`,`read_privilege`,`user_add_date`) values (?,?,?,?,unix_timestamp())";
let param = [config.db.db1, 'userlist', arr.data.account, arr.data.password, w.toString(), r.toString()];
res.db.query(query, param, (err, row) => {
if (err) return rt.err(res,err,n,'ERR0022');
let data = {};
data.record = [];
res.api_res = data;
return n();
});
})
.post('/dashboard', (req, res, n) => {
let data = {
record: [],
rt: {}
};
data.rt['time'] = [{
time: Date.now()
}];
res.api_res = data;
let pros = [];
pros.push(new Promise((resolve, reject) => {
fs.exists(config.cmdpath.sysinfo, exists => {
if (!exists) return resolve({ data: [], key: 'sysinfo' });
fs.readFile(config.cmdpath.sysinfo, (err, d) => {
if (err) return resolve({ data: [], key: 'sysinfo' });
let s = d.toString();
let tmp = s.split(/\n/);
for (let i in tmp) {
if (!tmp[i].trim()) continue;
let tt = tmp[i].split(' ');
if (tt.length > 1 && /^ip$/i.test(tt[0])) {
return resolve({ data: [{ ip: tt[1] }], key: 'sysinfo' });
}
}
});
});
}));
pros.push(new Promise((resolve, reject) => {
fs.exists(config.cmdpath.version, exists => {
if (!exists) return resolve({ data: [], key: 'version' });
fs.readFile(config.cmdpath.version, (err, d) => {
if (err) return resolve({ data: [], key: 'version' });
return resolve({ data: [{ version: d.toString().replace(/\n/, '') }], key: 'version' });
});
});
}));
if (config.permission.dio) {
pros.push(new Promise((resolve, reject) => {
let q = "select `diname`, `diid`, `diuid` from ??.?? ";
let p = [config.db.db1, 'dilist'];
res.db.query(q, p, (err, row) => {
if (err) return resolve({ data: [], key: 'di' });
let c = row.length;
let td = [];
! function chkdi(json) {
if (!json) return;
exec(`ditchk ${json.diid.replace(/^di([0-9]+)$/, '$1')}`, (err, sout, serr) => {
if (err) {
chkdi(row.pop());
if (!--c) return resolve({ data: td, key: 'di' });
return;
}
if (sout == 1) td.push(json);
chkdi(row.pop());
if (!--c) return resolve({ data: td, key: 'di' });
return;
});
}(row.pop());
});
}));
}
if (config.permission.leone) {
pros.push(new Promise((resolve, reject) => {
tool.getLeoneRT(rts => {
let ips = []
for (let i in rts) {
if (rts[i].mode == '9999') {
ips.push(rts[i].ip);
}
}
let q = "select * from ??.?? where `leoneip` in (?) order by `leonelistuid` desc ";
let p = [config.db.db1, 'leonelist', ips];
res.db.query(q, p, (err, row) => {
if (err) return resolve({ data: [], key: 'leone' });
return resolve({ data: row, key: 'leone' });
});
});
}));
}
Promise.all(pros)
.then(r => {
for (let i in r) {
if (r[i].key == 'di') {
data.rt.di = r[i].data;
} else if (r[i].key == 'leone') {
data.rt.leone = r[i].data;
} else if (r[i].key == 'sysinfo') {
data.rt.ip = r[i].data;
} else if (r[i].key == 'version') {
data.rt.version = r[i].data;
}
}
return n();
})
.catch(e => {
return rt.err(res, e, n);
});
})
.post('/getselectlist', (req, res, n) => {
let arr = req.body;
if (!arr.data) return n('ERR0000');
if (!arr.data.type) return n('ERR0009');
res.api_res = {
record: []
};
let pro = null;
let q, p;
switch (arr.data.type) {
case 'do':
if(!config.permission.dio) return n('ERR9000');
q = "select `doname` as name, `douid` as id from ??.??";
p = [config.db.db1, 'dolist'];
pro = tool.promiseQuery(res, q, p, '');
break;
case 'di':
if(!config.permission.dio) return n('ERR9000');
q = "select `diname` as name, `diuid` as id from ??.??";
p = [config.db.db1, 'dilist'];
pro = tool.promiseQuery(res, q, p, '');
break;
case 'leone':
if(!config.permission.leone) return n('ERR9000');
q = "select `leonename` as name, `leonelistuid` as id from ??.??";
p = [config.db.db1, 'leonelist'];
pro = tool.promiseQuery(res, q, p, '');
break;
case 'iogroup':
if(!config.permission.iogroup) return n('ERR9000');
q = "select `iogroupname` as name, `iogroupuid` as id from ??.??";
p = [config.db.db1, 'iogroup'];
pro = tool.promiseQuery(res, q, p, '');
break;
case 'modbus':
if(!config.permission.modbus) return n('ERR9000');
q = "select `name`, `uid` as id from ??.??";
p = [config.db.db5, 'device'];
pro = tool.promiseQuery(res,q,p, '');
break;
default:
return n();
}
pro.then(r => {
if('data' in r) {
res.api_res.record = tool.checkArray(r.data);
}
return n();
}).catch(e => {
return n();
})
})
.post('/chklogin', (req,res,n) => {
if(!tool.checkPermission(req)) return n('ERR9001');
res.api_res = {
record: []
}
n();
})
.post('/gettimezonelist', (req,res,n) => {
exec('timedatectl list-timezones', (err, stdout, stderr) => {
if(err) return n("ERR8000");
let zones = stdout.split(/\n/);
let json = {
zone: []
};
for(let i in zones){
let str = zones[i].trim();
if(!str) continue;
let tz = str.split('/');
if(tz.length != 2) continue;
let flag = false;
for(let j in json.zone){
if(json.zone[j].name == tz[0]) {
flag = true;
json.zone[j].location.push(tz[1]);
}
}
if(!flag) json.zone.push({name: tz[0], location: [tz[1]]})
}
res.api_res = {
record: tool.checkArray(json.zone)
}
n();
})
})
.post('/gettimezoneset', (req,res,n) => {
let query = "select * from ??.?? where `type` = ? limit 1";
let param = [config.db.db1, 'system', 'timezone'];
res.db.query(query, param, (err, row) => {
if(err) return rt.err(res,err,n, 'ERR8000');
res.api_res = {
record: tool.checkArray(row)
}
return n();
});
})
.post('/settimezone', (req,res,n) => {
if(!tool.checkPermission(req)) return n('ERR9000');
let arr = req.body;
if(!arr.data) return n('ERR0000');
if(!arr.data.timezone) return n('ERR0058');
let cmd = `timedatectl set-timezone ${arr.data.timezone}`;
exec(cmd, (err, stdout, stderr) => {
if(err) return rt.err(res,err, n, 'ERR0059');
let query = "update ??.?? set `value` = ? where `type` = ?";
let param = [config.db.db1, 'system', arr.data.timezone, 'timezone'];
res.db.query(query, param, (err, row) => {
if(err ) return rt.err(res, err, n, 'ERR8002');
res.api_res = {
record: []
}
n();
})
})
})
.all('*', rt.send);
module.exports = router;