487 lines
17 KiB
JavaScript
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; |