mysqlExporter/index.js
2020-04-14 19:01:25 +02:00

92 lines
2.4 KiB
JavaScript

#!/usr/bin/env node
const express = require("express");
const fs = require("fs");
const mysql = require("mysql");
const opn = require('opn');
const app = express();
var apiOnly = false;
if(!fs.existsSync("./config.json")){
console.error("Config file missing!");
process.exit(1);
}
if(!fs.existsSync(__dirname + "/static/index.html")){
console.warn("View is missing, running in API only mode");
apiOnly = true
}
const config = JSON.parse(fs.readFileSync("./config.json", "utf-8"));
const pool = mysql.createPool(config.mysql);
function query(conn, data, params = []) {
return new Promise((resolve, reject) => {
conn.query(data, params, (err, resp, fields) => {
if(err)return reject(err);
resolve(resp);
});
});
};
if(!apiOnly)
app.use("/view", express.static(__dirname + '/static'))
app.get("/", (req, res) => {
res.json({
ping: true,
notice: "You're probably looking for /view/"
});
});
app.get("/database", (req, res) => {
res.json({
name: config.mysql.database,
host: config.mysql.host
});
});
app.get("/fieldsIgnored", (req, res) => {
var fi = config.fields_ignored;
if(!Array.isArray(fi)) fi = [];
res.json(fi);
});
app.get("/tables", (req, res) => {
pool.query("SHOW tables", async (err, resp, fields) => {
if(err) {
console.error(err);
return res.json({
error: "mysql_conn"
});
}
let result = resp.map(a => {
return a[Object.keys(a)[0]];
});
var obj = {};
for(var r of result) {
obj[r] = {
name: r,
comment: "",
columns: []
};
try {
obj[r].columns = await query(pool, "SHOW FULL COLUMNS FROM " + r);
obj[r].indexes = await query(pool, "SHOW INDEXES FROM " + r);
obj[r].comment = await query(pool, `SELECT table_comment
FROM INFORMATION_SCHEMA.TABLES
WHERE table_schema=?
AND table_name=?`, [config.mysql.database, r]);
} catch(e){
console.error(e);
}
}
res.json(obj);
})
});
app.listen(8877, "localhost", () => {
if(!apiOnly)
opn('http://localhost:8877/view');
console.log("Listening on port 8877");
});