diff --git a/lib/www/server/lib/version.js b/lib/www/server/lib/version.js index e39b3e2..d10470c 100644 --- a/lib/www/server/lib/version.js +++ b/lib/www/server/lib/version.js @@ -1,6 +1,11 @@ const semver = require("semver"); const { exec } = require("child_process"); +const { readFileSync } = require('fs'); +const { pool } = require('./db/connection'); +const { info } = require('./db'); +const api = require('../api'); const pkg = require("../package.json"); +const { ALERT, ERROR, WARNING, NOTICE, INFO, DEBUG } = require('DOUGAL_ROOT/debug')(__filename); function compatible () { @@ -23,9 +28,8 @@ function compatible () { * false otherwise. */ function compatible_schema () { - const { info } = require('./db'); return new Promise ( async (resolve, reject) => { - const current = await info.get(null, "version/db_schema"); + const current = await schema_version(); const wanted = pkg.config.db_schema; const component = "schema"; if (semver.satisfies(current, wanted)) { @@ -37,9 +41,8 @@ function compatible_schema () { } function compatible_api () { - const api = require('../api'); return new Promise ( async (resolve, reject) => { - const current = api.locals.version; + const current = api_version(); const wanted = pkg.config.api; const component = "api"; if (semver.satisfies(current, wanted)) { @@ -50,12 +53,51 @@ function compatible_api () { }); } +async function db_version () { + const client = await pool.connect(); + let res; + try { + res = (await client.query("SELECT version(), PostGIS_Version();"))?.rows[0]; + } catch (err) { + ERROR(err); + } finally { + client.release(); + } + return res; +} + +async function os_version () { + try { + return Object.fromEntries( + readFileSync("/etc/os-release") + .toString("utf-8") + .split("\n") + .map(i => + i.split("=", 2) + .map(i => i.replace(/^"|"$/g, "")) + ) + .filter(i => + ["ID", "NAME", "PRETTY_NAME", "VERSION", "VERSION_ID"].includes(i[0]) + ) + ); + } catch (err) { + ERROR(err); + } +} + +async function schema_version () { + return await info.get(null, "version/db_schema"); +} + +function api_version () { + return api.locals.version; +} + /** Return software name. * */ -function name () { - const pkg = require("../package.json"); +function app_name () { return pkg.name ?? pkg.description ?? "Unknown"; } @@ -81,11 +123,36 @@ async function describe () { }); } -function version () { +function version_old () { return pkg.version; } + +async function version () { + const name = app_name(); + const server = pkg.version; + const tag = await describe(); + const api = await api_version(); + const schema = await schema_version(); + const db = await db_version(); + const os = await os_version(); + const compatibility = [ + await compatible_schema(), + await compatible_api() + ] + + return { + name, + server, + tag, + api, + schema, + db, + os, + compatibility + } +} version.compatible = compatible; -version.name = name; +version.name = app_name; version.describe = describe; module.exports = version;