This commit is contained in:
Fenris Wolf 2025-03-24 21:47:55 +00:00
parent 6e0ff08234
commit 7e3a1c1df5
15 changed files with 1942 additions and 685 deletions

View file

@ -1737,3 +1737,223 @@ declare var printf: typeof lib_plankton.string.printf;
declare var eml_log: any;
declare var track_exports: any;
declare var make_logger: (prefix: any, current_loglevel: any) => (obj: any, lvl: any) => void;
declare namespace lib_plankton.args {
/**
*/
enum enum_environment {
cli = "cli",
url = "url"
}
/**
*/
enum enum_kind {
positional = "positional",
volatile = "volatile"
}
/**
*/
enum enum_type {
boolean = "boolean",
integer = "int",
float = "float",
string = "string"
}
/**
*/
enum enum_mode {
replace = "replace",
accumulate = "accumulate"
}
}
declare namespace lib_plankton.args {
/**
* @author fenris
*/
class class_argument {
/**
* @author fenris
*/
protected name: string;
/**
* @author fenris
*/
protected kind: enum_kind;
/**
* @author fenris
*/
protected type: enum_type;
/**
* @author fenris
*/
protected mode: enum_mode;
/**
* @author fenris
*/
protected default_: any;
/**
* @author fenris
*/
protected info: string;
/**
* @author fenris
*/
protected parameters: Object;
/**
* @author fenris
*/
protected hidden: boolean;
/**
* @author fenris
*/
constructor({ "name": name, "type": type, "kind": kind, "mode": mode, "default": default_, "info": info, "parameters": parameters, "hidden": hidden, }: {
name: string;
type?: enum_type;
kind?: enum_kind;
mode?: enum_mode;
default?: any;
info?: string;
parameters?: Object;
hidden?: boolean;
});
/**
* @author fenris
*/
static positional({ "name": name, "type": type, "mode": mode, "default": default_, "info": info, "hidden": hidden, "index": index, }: {
name: string;
type?: enum_type;
mode?: enum_mode;
default?: any;
info?: string;
hidden?: boolean;
index: int;
}): class_argument;
/**
* @author fenris
*/
static volatile({ "name": name, "type": type, "mode": mode, "default": default_, "info": info, "hidden": hidden, "indicators_short": indicators_short, "indicators_long": indicators_long, }: {
name: string;
type?: enum_type;
mode?: enum_mode;
default?: any;
info?: string;
hidden?: boolean;
indicators_short: Array<string>;
indicators_long: Array<string>;
}): class_argument;
/**
* @author fenris
*/
check(): boolean;
/**
* @author fenris
*/
name_get(): string;
/**
* @author fenris
*/
kind_get(): enum_kind;
/**
* @author fenris
*/
type_get(): enum_type;
/**
* @author fenris
*/
mode_get(): enum_mode;
/**
* @author fenris
*/
default_get(): any;
/**
* @author fenris
*/
parameters_get(): Object;
/**
* @author fenris
*/
hidden_get(): boolean;
/**
* @author fenris
*/
toString(): string;
/**
* @author fenris
*/
indicator_main(): string;
/**
* @author fenris
*/
pattern_value(): string;
/**
* @author fenris
*/
extract(raw: string): any;
/**
* @author fenris
*/
assign(data: Object, target: string, raw: string): void;
/**
* @author fenris
*/
make(data: Object, target: string): string;
/**
* @author fenris
*/
generate_help(): string;
}
}
declare namespace lib_plankton.args {
/**
* @author fenris
*/
var verbosity: int;
/**
* @author fenris
* @todo check validity
*/
class class_handler {
/**
* @author fenris
*/
protected arguments_: {
[name: string]: class_argument;
};
/**
* @author fenris
*/
constructor(arguments_: {
[name: string]: class_argument;
});
/**
* @author fenris
*/
filter(kind: enum_kind): {
[name: string]: class_argument;
};
/**
* @author fenris
*/
read(environment: enum_environment, input: string, data?: {
[name: string]: any;
}): {
[name: string]: any;
};
/**
* @author fenris
* @todo handle if the data object doesn't have the required field or the type is wrong or sth.
*/
write(environment: enum_environment, data: {
[name: string]: any;
}): string;
/**
* @desc manpage-like info-sheet
* @author fenris
*/
generate_help({ "programname": programname, "author": author, "description": description, "executable": executable, }: {
programname?: string;
author?: string;
description?: string;
executable?: string;
}): string;
}
}

View file

@ -5586,3 +5586,783 @@ var make_logger = (function () {
}
return make_logger;
})();
/*
This file is part of »bacterio-plankton:args«.
Copyright 2016-2024 'Christian Fraß, Christian Neubauer, Martin Springwald GbR'
<info@greenscale.de>
»bacterio-plankton:args« is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
»bacterio-plankton:args« is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with »bacterio-plankton:args«. If not, see <http://www.gnu.org/licenses/>.
*/
var lib_plankton;
(function (lib_plankton) {
var args;
(function (args) {
/**
*/
var enum_environment;
(function (enum_environment) {
enum_environment["cli"] = "cli";
enum_environment["url"] = "url";
})(enum_environment = args.enum_environment || (args.enum_environment = {}));
;
/**
*/
var enum_kind;
(function (enum_kind) {
enum_kind["positional"] = "positional";
enum_kind["volatile"] = "volatile";
})(enum_kind = args.enum_kind || (args.enum_kind = {}));
;
/**
*/
var enum_type;
(function (enum_type) {
enum_type["boolean"] = "boolean";
enum_type["integer"] = "int";
enum_type["float"] = "float";
enum_type["string"] = "string";
})(enum_type = args.enum_type || (args.enum_type = {}));
;
/**
*/
var enum_mode;
(function (enum_mode) {
enum_mode["replace"] = "replace";
enum_mode["accumulate"] = "accumulate";
})(enum_mode = args.enum_mode || (args.enum_mode = {}));
;
})(args = lib_plankton.args || (lib_plankton.args = {}));
})(lib_plankton || (lib_plankton = {}));
/*
This file is part of »bacterio-plankton:args«.
Copyright 2016-2024 'Christian Fraß, Christian Neubauer, Martin Springwald GbR'
<info@greenscale.de>
»bacterio-plankton:args« is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
»bacterio-plankton:args« is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with »bacterio-plankton:args«. If not, see <http://www.gnu.org/licenses/>.
*/
var lib_plankton;
(function (lib_plankton) {
var args;
(function (args) {
/*
export enum_mode {
replace = "replace",
accumulate = "accumulate",
};
*/
/**
* @author fenris
*/
var class_argument = /** @class */ (function () {
/**
* @author fenris
*/
function class_argument(_a) {
var name = _a["name"], _b = _a["type"], type = _b === void 0 ? args.enum_type.string : _b, _c = _a["kind"], kind = _c === void 0 ? args.enum_kind.positional : _c, _d = _a["mode"], mode = _d === void 0 ? args.enum_mode.replace : _d, _e = _a["default"], default_ = _e === void 0 ? null : _e, _f = _a["info"], info = _f === void 0 ? null : _f, _g = _a["parameters"], parameters = _g === void 0 ? {} : _g, _h = _a["hidden"], hidden = _h === void 0 ? false : _h;
this.name = name;
this.type = type;
this.kind = kind;
this.mode = mode;
this.default_ = default_;
this.info = info;
this.parameters = parameters;
this.hidden = hidden;
if (!this.check()) {
throw (new Error("invalid argument-setup"));
}
}
/**
* @author fenris
*/
class_argument.positional = function (_a) {
var name = _a["name"], _b = _a["type"], type = _b === void 0 ? args.enum_type.string : _b, _c = _a["mode"], mode = _c === void 0 ? args.enum_mode.replace : _c, _d = _a["default"], default_ = _d === void 0 ? null : _d, _e = _a["info"], info = _e === void 0 ? null : _e, _f = _a["hidden"], hidden = _f === void 0 ? false : _f, index = _a["index"];
return (new class_argument({
"name": name,
"kind": args.enum_kind.positional,
"type": type,
"mode": mode,
"default": default_,
"info": info,
"hidden": hidden,
"parameters": {
"index": index
}
}));
};
/**
* @author fenris
*/
class_argument.volatile = function (_a) {
var name = _a["name"], _b = _a["type"], type = _b === void 0 ? args.enum_type.string : _b, _c = _a["mode"], mode = _c === void 0 ? args.enum_mode.replace : _c, _d = _a["default"], default_ = _d === void 0 ? null : _d, _e = _a["info"], info = _e === void 0 ? null : _e, _f = _a["hidden"], hidden = _f === void 0 ? false : _f, indicators_short = _a["indicators_short"], indicators_long = _a["indicators_long"];
return (new class_argument({
"name": name,
"kind": args.enum_kind.volatile,
"type": type,
"mode": mode,
"default": default_,
"info": info,
"hidden": hidden,
"parameters": {
"indicators_short": indicators_short,
"indicators_long": indicators_long
}
}));
};
/**
* @author fenris
*/
class_argument.prototype.check = function () {
var _this = this;
return [
function () { return ((!(_this.kind == args.enum_kind.volatile))
||
(("indicators_long" in _this.parameters)
&&
(_this.parameters["indicators_long"]["length"] >= 0))); },
].every(function (condition) { return condition(); });
};
/**
* @author fenris
*/
class_argument.prototype.name_get = function () {
return this.name;
};
/**
* @author fenris
*/
class_argument.prototype.kind_get = function () {
return this.kind;
};
/**
* @author fenris
*/
class_argument.prototype.type_get = function () {
return this.type;
};
/**
* @author fenris
*/
class_argument.prototype.mode_get = function () {
return this.mode;
};
/**
* @author fenris
*/
class_argument.prototype.default_get = function () {
return this.default_;
};
/**
* @author fenris
*/
class_argument.prototype.parameters_get = function () {
return this.parameters;
};
/**
* @author fenris
*/
class_argument.prototype.hidden_get = function () {
return this.hidden;
};
/**
* @author fenris
*/
class_argument.prototype.toString = function () {
return "<".concat(this.name, ">");
};
/**
* @author fenris
*/
class_argument.prototype.indicator_main = function () {
if (this.kind === args.enum_kind.volatile) {
return this.parameters["indicators_long"][0];
}
else {
return null;
}
};
/**
* @author fenris
*/
class_argument.prototype.pattern_value = function () {
switch (this.type) {
case args.enum_type.boolean: {
return "false|true";
break;
}
case args.enum_type.integer: {
return "[0-9]+";
break;
}
case args.enum_type.float: {
return "\\d*(?:\\.\\d+)?";
break;
}
case args.enum_type.string: {
return "\\S+";
break;
}
default: {
throw (new Error("unhandled type ".concat(this.type)));
break;
}
}
};
/**
* @author fenris
*/
class_argument.prototype.extract = function (raw) {
switch (this.type) {
case args.enum_type.boolean: {
return (raw != "false");
break;
}
case args.enum_type.integer: {
return parseInt(raw);
break;
}
case args.enum_type.float: {
return parseFloat(raw);
break;
}
case args.enum_type.string: {
return raw;
break;
}
default: {
throw (new Error("unhandled type ".concat(this.type)));
break;
}
}
};
/**
* @author fenris
*/
class_argument.prototype.assign = function (data, target, raw) {
var value = this.extract(raw);
switch (this.mode) {
case args.enum_mode.replace: {
data[target] = value;
break;
}
case args.enum_mode.accumulate: {
/*
if (! (this.name in data)) {
data[this.name] = [];
}
*/
data[target].push(value);
break;
}
default: {
throw (new Error("unhandled mode ".concat(this.mode)));
}
}
};
/**
* @author fenris
*/
class_argument.prototype.make = function (data, target) {
var value = data[target];
return value.toString();
};
/**
* @author fenris
*/
class_argument.prototype.generate_help = function () {
var _this = this;
var _a, _b, _c, _d;
var output = "";
{
switch (this.kind) {
case args.enum_kind.positional: {
var line = "";
line += "\t";
line += "<".concat(this.name, ">");
line += "\n";
output += line;
}
case args.enum_kind.volatile: {
var line = "";
line += "\t";
if (this.type === args.enum_type.boolean) {
line += ([]
.concat(((_a = this.parameters["indicators_short"]) !== null && _a !== void 0 ? _a : []).map(function (indicator) { return ("-" + indicator); }))
.concat(((_b = this.parameters["indicators_long"]) !== null && _b !== void 0 ? _b : []).map(function (indicator) { return ("--" + indicator); }))
.join(" | "));
}
else {
line += ([]
.concat(((_c = this.parameters["indicators_short"]) !== null && _c !== void 0 ? _c : []).map(function (indicator) { return ("-" + indicator + " " + ("<" + _this.name + ">")); }))
.concat(((_d = this.parameters["indicators_long"]) !== null && _d !== void 0 ? _d : []).map(function (indicator) { return ("--" + indicator + "=" + ("<" + _this.name + ">")); }))
.join(" | "));
}
line += "\n";
output += line;
}
}
}
{
var line = "";
line += "\t\t";
var infotext = ((this.info == null) ? "(no info available)" : this.info);
line += infotext;
if ((this.type != "boolean") && (this.default_ != null)) {
line += "; default: ".concat(this.default_.toString());
}
line += "\n";
output += line;
}
return output;
};
return class_argument;
}());
args.class_argument = class_argument;
})(args = lib_plankton.args || (lib_plankton.args = {}));
})(lib_plankton || (lib_plankton = {}));
/*
This file is part of »bacterio-plankton:args«.
Copyright 2016-2024 'Christian Fraß, Christian Neubauer, Martin Springwald GbR'
<info@greenscale.de>
»bacterio-plankton:args« is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
»bacterio-plankton:args« is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with »bacterio-plankton:args«. If not, see <http://www.gnu.org/licenses/>.
*/
var lib_plankton;
(function (lib_plankton) {
var args;
(function (args) {
/**
* @author fenris
*/
var settings = {
"environment": {
"cli": {
"symbols": {
"delimiter": " ",
"prefix": "--",
"assignment": "="
}
},
"url": {
"symbols": {
"delimiter": "&",
"prefix": "",
"assignment": "="
}
}
}
};
/**
* @author fenris
*/
args.verbosity = 0;
/**
* @author fenris
* @todo check validity
*/
var class_handler = /** @class */ (function () {
/**
* @author fenris
*/
function class_handler(arguments_) {
this.arguments_ = arguments_;
}
/**
* @author fenris
*/
class_handler.prototype.filter = function (kind) {
var arguments_ = {};
for (var _i = 0, _a = Object.entries(this.arguments_); _i < _a.length; _i++) {
var _b = _a[_i], name = _b[0], argument = _b[1];
if (argument.kind_get() == kind) {
arguments_[name] = argument;
}
}
return arguments_;
};
/**
* @author fenris
*/
class_handler.prototype.read = function (environment, input, data) {
var _this = this;
if (data === void 0) { data = {}; }
switch (environment) {
case args.enum_environment.cli:
case args.enum_environment.url: {
// default values
{
for (var _i = 0, _a = Object.entries(this.arguments_); _i < _a.length; _i++) {
var _b = _a[_i], name = _b[0], argument = _b[1];
data[name] = argument.default_get();
}
}
// preprocessing
{
// short indicators (lil hacky ...)
{
if (environment == args.enum_environment.cli) {
for (var _c = 0, _d = Object.entries(this.filter(args.enum_kind.volatile)); _c < _d.length; _c++) {
var _e = _d[_c], name = _e[0], argument = _e[1];
// console.info(argument.parameters_get()["indicators_short"].join("|"));
var pattern_from = "";
{
pattern_from += "(?:^|".concat(settings["environment"][environment]["symbols"]["delimiter"], ")");
pattern_from += "-".concat(argument.parameters_get()["indicators_short"].join("|"));
pattern_from += "(?:$|".concat(settings["environment"][environment]["symbols"]["delimiter"], ")");
}
var pattern_to = "";
{
pattern_to += settings["environment"][environment]["symbols"]["delimiter"];
pattern_to += settings["environment"][environment]["symbols"]["prefix"];
pattern_to += argument.indicator_main();
if (argument.type_get() == args.enum_type.boolean) {
pattern_to += settings["environment"][environment]["symbols"]["delimiter"];
}
else {
pattern_to += settings["environment"][environment]["symbols"]["assignment"];
}
}
var result = input.replace(new RegExp(pattern_from, "g"), pattern_to);
lib_plankton.log.debug("lib_args:read:replacing", {
"pattern_from": pattern_from,
"pattern_to": pattern_to,
"input": input,
"result": result
});
input = result;
}
}
}
lib_plankton.log.debug("lib_args:read:current_input", {
"input": input
});
}
// parsing
{
var parts = input
.split(settings["environment"][environment]["symbols"]["delimiter"])
.filter(function (x) { return (x != ""); });
var index_expected_1 = 0;
parts.forEach(function (part) {
lib_plankton.log.debug("lib_args:read:analyzing", {
"part": part
});
var found = [
function () {
lib_plankton.log.debug("lib_args:read:probing_as_volatile", {
"part": part
});
for (var _i = 0, _a = Object.entries(_this.filter(args.enum_kind.volatile)); _i < _a.length; _i++) {
var _b = _a[_i], name = _b[0], argument = _b[1];
lib_plankton.log.debug("lib_args:read:probing_as_volatile:trying", {
"part": part,
"argument": argument.toString()
});
var pattern = "";
{
var pattern_front = "";
pattern_front += "".concat(settings["environment"][environment]["symbols"]["prefix"]);
pattern_front += "(?:".concat(argument.parameters_get()["indicators_long"].join("|"), ")");
pattern += pattern_front;
}
{
var pattern_back = "";
pattern_back += "".concat(settings["environment"][environment]["symbols"]["assignment"]);
pattern_back += "(".concat(argument.pattern_value(), ")");
if (argument.type_get() == args.enum_type.boolean) {
pattern_back = "(?:".concat(pattern_back, ")?");
}
pattern += pattern_back;
}
lib_plankton.log.debug("lib_args:read:probing_as_volatile:pattern", {
"pattern": pattern
});
var regexp = new RegExp(pattern);
var matching = regexp.exec(part);
lib_plankton.log.debug("lib_args:read:probing_as_volatile:matching", {
"matching": matching
});
if (matching == null) {
// do nothing
}
else {
argument.assign(data, name, matching[1]);
return true;
}
}
return false;
},
function () {
lib_plankton.log.debug("lib_args:read:probing_as_positional", {
"part": part
});
var positional = _this.filter(args.enum_kind.positional);
for (var _i = 0, _a = Object.entries(positional); _i < _a.length; _i++) {
var _b = _a[_i], name = _b[0], argument = _b[1];
if (argument.parameters_get()['index'] !== index_expected_1) {
// do nothing
}
else {
lib_plankton.log.debug("lib_args:read:probing_as_positional:trying", {
"part": part,
"argument": argument.toString()
});
var pattern = "";
{
var pattern_back = "";
pattern_back += "(".concat(argument.pattern_value(), ")");
pattern += pattern_back;
}
lib_plankton.log.debug("lib_args:read:probing_as_positional:pattern", {
"pattern": pattern
});
var regexp = new RegExp(pattern);
var matching = regexp.exec(part);
lib_plankton.log.debug("lib_args:read:probing_as_positional:matching", {
"matching": matching
});
if (matching == null) {
return false;
}
else {
argument.assign(data, name, matching[1]);
index_expected_1 += 1;
return true;
}
}
}
return false;
},
].some(function (x) { return x(); });
if (!found) {
lib_plankton.log.warning("lib_args:read:could_not_parse", {
"part": part
});
}
});
}
return data;
break;
}
default: {
throw (new Error("unhandled environment ".concat(environment)));
break;
}
}
};
/**
* @author fenris
* @todo handle if the data object doesn't have the required field or the type is wrong or sth.
*/
class_handler.prototype.write = function (environment, data) {
switch (environment) {
case args.enum_environment.cli: {
return (([]
.concat(Object.entries(this.filter(args.enum_kind.volatile)).map(function (_a) {
var name = _a[0], argument = _a[1];
var values;
switch (argument.mode_get()) {
case args.enum_mode.replace: {
values = [data[argument.name_get()]];
break;
}
case args.enum_mode.accumulate: {
values = data[argument.name_get()];
break;
}
}
return (values
.map(function (value) { return ((settings["environment"][environment]["symbols"]["prefix"]
+
argument.parameters_get()["indicators_long"][0])
+
(settings["environment"][environment]["symbols"]["assignment"]
+
value.toString())); })
.join(" "));
}))
.concat(Object.entries(this.filter(args.enum_kind.positional)).map(function (_a) {
var name = _a[0], argument = _a[1];
var raw = "";
{
var raw_back = "";
raw_back += argument.make(data, name);
raw += raw_back;
}
return raw;
})))
.join(settings["environment"][environment]["symbols"]["delimiter"]));
break;
}
default: {
throw (new Error("unhandled environment ".concat(environment)));
break;
}
}
};
/**
* @desc manpage-like info-sheet
* @author fenris
*/
class_handler.prototype.generate_help = function (_a) {
var _b = _a["programname"], programname = _b === void 0 ? null : _b, _c = _a["author"], author = _c === void 0 ? null : _c, _d = _a["description"], description = _d === void 0 ? null : _d, _e = _a["executable"], executable = _e === void 0 ? null : _e;
var environment = args.enum_environment.cli;
var output = "";
{
var section = "";
{
var line = "";
line += "";
line += "INFO";
line += "\n";
section += line;
}
{
var line = "";
line += "\t";
line += "".concat(programname, " -- ").concat(description);
line += "\n";
section += line;
}
section += "\n";
output += section;
}
{
if (author != null) {
var section = "";
{
var line = "";
line += "";
line += "AUTHOR";
line += "\n";
section += line;
}
{
var line = "";
line += "\t";
line += "".concat(author);
line += "\n";
section += line;
}
section += "\n";
output += section;
}
}
{
var section = "";
{
var line = "";
line += "";
line += "SYNOPSIS";
line += "\n";
section += line;
}
{
var line = "";
line += "\t";
line += executable;
line += settings["environment"][environment]["symbols"]["delimiter"];
line += Object.entries(this.filter(args.enum_kind.positional))
.map(function (_a) {
var name = _a[0], argument = _a[1];
var part = "";
part += "<".concat(argument.name_get(), ">");
return part;
})
.join(settings["environment"][environment]["symbols"]["delimiter"]);
line += settings["environment"][environment]["symbols"]["delimiter"];
line += Object.entries(this.filter(args.enum_kind.volatile))
.filter(function (_a) {
var name = _a[0], argument = _a[1];
return (!argument.hidden_get());
})
.map(function (_a) {
var name = _a[0], argument = _a[1];
var part = "";
// part += settings["environment"][environment]["symbols"]["prefix"];
part += "-";
part += argument.parameters_get()["indicators_short"][0];
if (argument.type_get() != "boolean") {
/*
part += settings["environment"][environment]["symbols"]["assignment"];
part += `<${argument.name_get()}>`;
*/
part += " ";
part += "<".concat(argument.name_get(), ">");
}
part = "[".concat(part, "]");
return part;
})
.join(settings["environment"][environment]["symbols"]["delimiter"]);
line += "\n";
section += line;
}
section += "\n";
output += section;
}
{
var section = "";
{
var line = "";
line += "";
line += "OPTIONS";
line += "\n";
section += line;
}
{
section += (Object.entries(this.arguments_)
.filter(function (_a) {
var name = _a[0], argument = _a[1];
return (!argument.hidden_get());
})
.map(function (_a) {
var name = _a[0], argument = _a[1];
return argument.generate_help();
})
.join("\n"));
}
section += "\n";
output += section;
}
return output;
};
return class_handler;
}());
args.class_handler = class_handler;
})(args = lib_plankton.args || (lib_plankton.args = {}));
})(lib_plankton || (lib_plankton = {}));

View file

@ -1,218 +0,0 @@
#!/usr/bin/env nodejs
function string_coin(
template,
arguments_
)
{
let result = template;
Object.entries(arguments_).forEach(
([key, value]) => {
result = result.replace(new RegExp("{{" + key + "}}", "g"), value);
}
);
return result;
}
function borg_init(
repository_directory,
{
"encryption": encryption = "none",
} = {
}
)
{
return string_coin(
"borg init --encryption={{encryption}} {{repository_directory}}\n",
{
"repository_directory": repository_directory,
"encryption": encryption,
}
);
}
function borg_create(
repository_directory,
archive_name,
directories,
{
"compression": compression = "none",
} = {
}
)
{
return string_coin(
"borg create --compression={{compression}} {{repository_directory}}::{{archive_name}} {{directories}}\n",
{
"repository_directory": repository_directory,
"archive_name": archive_name,
"compression": compression,
"directories": directories.join(" "),
}
)
}
function borg_prune(
repository_directory,
age,
{
"keep_weekly": keep_weekly = null,
"keep_yearly": keep_yearly = null,
} = {
}
)
{
return string_coin(
"borg prune --keep-within=2w{{macro_keep_weekly}}{{macro_keep_yearly}} {{repository_directory}}\n",
{
"repository_directory": repository_directory,
"keep_within": age,
"macro_keep_weekly": ((keep_weekly === null) ? "" : string_coin(" --keep-weekly={{x}}", {"x": keep_weekly.toFixed(0)})),
"macro_keep_yearly": ((keep_yearly === null) ? "" : string_coin(" --keep-yearly={{x}}", {"x": keep_yearly.toFixed(0)})),
}
)
}
function get_conf(
)
{
const _fs = require("fs");
const conf = JSON.parse(_fs.readFileSync("conf.json"));
return conf;
}
function get_stamp(
)
{
const date = (new Date(Date.now()));
return string_coin(
"{{year}}{{month}}{{day}}",
{
"year": date.getFullYear().toFixed(0).padStart(4, "0"),
"month": (date.getMonth()+1).toFixed(0).padStart(2, "0"),
"day": date.getDate().toFixed(0).padStart(2, "0"),
}
);
}
function get_repository_directory(
conf
)
{
return conf.target.data.repository;
}
function init(
conf
)
{
const repository_directory = get_repository_directory(conf);
if (false) {
process.stdout.write(
string_coin(
"mkdir --parents {{repository_directory}}\n",
{
"repository_directory": repository_directory,
}
)
);
}
process.stdout.write(
borg_init(
repository_directory,
{
"encryption": "none",
}
)
);
}
function run(
conf,
stamp
)
{
const repository_directory = get_repository_directory(conf);
conf.concerns.forEach(
concern => {
process.stdout.write(
string_coin(
"## {{name}}\n",
{
"name": concern.name,
}
)
);
process.stdout.write(
borg_create(
repository_directory,
string_coin(
"{{concern_name}}-{{stamp}}",
{
"concern_name": concern.name,
"stamp": stamp,
}
),
[concern.source_directory],
{
"compression": conf.target.data.compression,
}
)
);
process.stdout.write(
borg_prune(
repository_directory,
"2w",
{
"keep_weekly": 7,
"keep_yearly": 2,
}
)
);
process.stdout.write(
"\n"
);
}
);
}
function main(
args
)
{
// args
const action = (args.shift() ?? "run");
// exec
switch (action) {
case "init": {
const conf = get_conf();
init(conf);
break;
}
case "run": {
const conf = get_conf();
const stamp = get_stamp();
run(conf, stamp);
break;
}
default: {
throw (new Error("unhandled action: " + action));
break;
}
}
}
main(process.argv.slice(2));

129
misc/conf-ramsch.mmr.json Normal file
View file

@ -0,0 +1,129 @@
{
"version": "1",
"target": {
"kind": "borg",
"parameters": {
"repository": "ssh://pv-fensalir-kvasir///home/kvasir/repos/ramsch.sx",
"compression": "lz4"
}
},
"concerns": [
{
"active": true,
"name": "espe-database",
"kind": "postgresql_dump",
"parameters": {
"credentials": {
"host": "localhost",
"port": 5432,
"username": "espe_user",
"password": "852a478ece1b66d04d107ae488dd476a5a43b317f62729e25152e4bfba096cac",
"schema": "espe"
},
"name": "espe-database"
}
},
{
"active": true,
"name": "zeitbild-files",
"kind": "files",
"parameters": {
"path": "/opt/zeitbild",
"name": "zeitbild-files"
}
},
{
"active": true,
"name": "synapse-database",
"kind": "postgresql_dump",
"parameters": {
"credentials": {
"host": "localhost",
"port": 5432,
"username": "synapse_user",
"password": "b810e5beca5358b8baa344a5a4a9cefa5afbc48f4850b5cbcee32e08b2092dd8",
"schema": "synapse"
},
"name": "synapse-database"
}
},
{
"active": true,
"name": "hedgedoc-database",
"kind": "postgresql_dump",
"parameters": {
"credentials": {
"host": "localhost",
"port": 5432,
"username": "hedgedoc_user",
"password": "a2bbdb2de53523b8099b37013f251546f3d65dbe7a0774fa41af0a4176992fd4",
"schema": "hedgedoc"
},
"name": "hedgedoc-database"
}
},
{
"active": true,
"name": "wiki_js-database",
"kind": "postgresql_dump",
"parameters": {
"credentials": {
"host": "localhost",
"port": 5432,
"username": "wiki_js_user",
"password": "4adc33bd9fe74303c344be46e5916d65182fb218e248fe80452ab3f025b06c64",
"schema": "wiki_js"
},
"name": "wiki_js-database"
}
},
{
"active": true,
"name": "vikunja-database",
"kind": "postgresql_dump",
"parameters": {
"credentials": {
"host": "localhost",
"port": 5432,
"username": "vikunja_user",
"password": "8e54b0ca18020275e4aef1ca0eb5e197e066c065c1864817652a8a39c55402cd",
"schema": "vikunja"
},
"name": "vikunja-database"
}
},
{
"active": true,
"name": "forgejo-database",
"kind": "postgresql_dump",
"parameters": {
"credentials": {
"host": "localhost",
"port": 5432,
"username": "forgejo_user",
"password": "9a271f2a916b0b6ee6cecb2426f0b3206ef074578be55d9bc94f6f3fe3ab86aa",
"schema": "forgejo"
},
"name": "forgejo-database"
}
},
{
"active": true,
"name": "forgejo-files",
"kind": "files",
"parameters": {
"path": "/var/forgejo",
"name": "forgejo-files"
}
},
{
"active": true,
"name": "ownloud-files",
"kind": "files",
"parameters": {
"path": "/opt/owncloud/.ocis/storage",
"name": "owncloud-files"
}
}
]
}

View file

@ -1,48 +0,0 @@
{
"target": {
"kind": "borg",
"data": {
"repository": "ssh://pv-fensalir-kvasir///home/kvasir/repos/ramsch.sx",
"compression": "lz4"
}
},
"concerns": [
{
"name": "espe-database",
"source_directory": "/tmp/backup/espe-database"
},
{
"name": "forgejo-database",
"source_directory": "/tmp/backup/forgejo-database"
},
{
"name": "forgejo-files",
"source_directory": "/tmp/backup/forgejo-files"
},
{
"name": "hedgedoc-database",
"source_directory": "/tmp/backup/hedgedoc-database"
},
{
"name": "owncloud-files",
"source_directory": "/tmp/backup/owncloud-files"
},
{
"name": "synapse-database",
"source_directory": "/tmp/backup/synapse-database"
},
{
"name": "vikunja-database",
"source_directory": "/tmp/backup/vikunja-database"
},
{
"name": "wiki_js-database",
"source_directory": "/tmp/backup/wiki_js-database"
},
{
"name": "zeitbild-files",
"source_directory": "/tmp/backup/zeitbild-files"
}
]
}

4
readme.md Normal file
View file

@ -0,0 +1,4 @@
- `tools/update-plankton`
- `tools/build`
- `/tmp/mimir/mimir -c misc/conf-ramsch.mmr.json borg-run`

295
source/conf.ts Normal file
View file

@ -0,0 +1,295 @@
namespace _mimir.conf
{
/**
*/
export const schema : lib_plankton.conf.type_schema = {
"nullable": false,
"type": "object",
"properties": {
"version": {
"nullable": false,
"type": "string"
},
"target": {
"anyOf": [
{
"nullable": false,
"type": "object",
"properties": {
"kind": {
"nullable": false,
"type": "string",
"enum": ["keep"]
},
"parameters": {
"nullable": false,
"type": "object",
"properties": {
},
"additionalProperties": false,
"required": [
]
},
},
"additionalProperties": false,
"required": [
"kind",
"parameters",
]
},
{
"nullable": false,
"type": "object",
"properties": {
"kind": {
"nullable": false,
"type": "string",
"enum": ["borg"]
},
"parameters": {
"nullable": false,
"type": "object",
"properties": {
"repository": {
"nullable": false,
"type": "string"
},
"compression": {
"nullable": false,
"type": "string",
"enum": [
"none",
"lz4",
"zlib",
"lzma",
],
"default": "lz4"
},
},
"required": [
"repository",
]
},
},
"additionalProperties": false,
"required": [
"kind",
"parameters",
]
}
]
},
/*
"defaults": {
},
*/
"concerns": {
"nullable": false,
"type": "array",
"items": {
"anyOf": [
{
"nullable": false,
"type": "object",
"properties": {
"active": {
"nullable": false,
"type": "boolean",
"default": true
},
"name": {
"nullable": false,
"type": "string"
},
"kind": {
"nullable": false,
"type": "string",
"enum": ["files"]
},
"parameters": {
"nullable": false,
"type": "object",
"properties": {
"path": {
"nullable": false,
"type": "string",
},
"name": {
"nullable": false,
"type": "string",
},
},
"additionalProperties": false,
"required": [
"path",
"name",
]
}
},
"additionalProperties": false,
"required": [
"name",
"kind",
"parameters",
]
},
{
"nullable": false,
"type": "object",
"properties": {
"active": {
"nullable": false,
"type": "boolean",
"default": true
},
"name": {
"nullable": false,
"type": "string"
},
"kind": {
"nullable": false,
"type": "string",
"enum": ["postgresql_dump"]
},
"parameters": {
"nullable": false,
"type": "object",
"properties": {
"credentials": {
"nullable": false,
"type": "object",
"properties": {
"host": {
"nullable": false,
"type": "string",
},
"port": {
"nullable": false,
"type": "integer",
"default": 5432
},
"username": {
"nullable": false,
"type": "string",
},
"password": {
"nullable": false,
"type": "string",
},
"schema": {
"nullable": false,
"type": "string",
},
},
"additionalProperties": false,
"required": [
"host",
"username",
"password",
"schema",
]
},
"name": {
"nullable": false,
"type": "string",
},
},
"additionalProperties": false,
"required": [
"credentials",
"name",
]
}
},
"additionalProperties": false,
"required": [
"name",
"kind",
"parameters",
]
},
]
}
},
},
"additionalProperties": false,
"required": [
"version",
"target",
"concerns",
]
};
/**
*/
export type type_target_parameters_keep = {
};
/**
*/
export type type_target_parameters_borg = {
repository : string;
compression : string;
};
/**
*/
export type type_concern_parameters_files = {
name : string;
path : string;
};
/**
*/
export type type_concern_parameters_postgresql_dump = {
credentials : {
host : string;
port : int;
username : string;
password : string;
schema : string;
};
};
/**
*/
export type type_conf = {
target : (
{
kind : "keep";
parameters : type_target_parameters_keep;
}
|
{
kind : "borg";
parameters : type_target_parameters_borg;
}
);
concerns : Array<
{
active ?: boolean;
name : string;
}
&
(
{
kind : "files";
parameters : type_concern_parameters_files;
}
|
{
kind : "postgresql_dump";
parameters : type_concern_parameters_postgresql_dump;
}
)
>;
};
}

101
source/helpers/borg.ts Normal file
View file

@ -0,0 +1,101 @@
/**
* @todo consider to outsource to plankton
*/
namespace _mimir.helpers.borg
{
/**
*/
export function init(
repository_directory : string,
{
"encryption": encryption = "none",
} : {
encryption ?: string;
} = {
}
) : string
{
return lib_plankton.string.coin(
"borg init --encryption={{encryption}} {{repository_directory}}",
{
"repository_directory": repository_directory,
"encryption": encryption,
}
);
}
/**
*/
export function create(
repository_directory : string,
archive_name : string,
directories : Array<string>,
{
"compression": compression = "none",
} : {
compression ?: string;
} = {
}
) : string
{
return lib_plankton.string.coin(
"borg create --compression={{compression}} {{repository_directory}}::{{archive_name}} {{directories}}",
{
"repository_directory": repository_directory,
"archive_name": archive_name,
"compression": compression,
"directories": directories.join(" "),
}
)
}
/**
*/
export function prune(
repository_directory : string,
age : string,
{
"keep_weekly": keep_weekly = null,
"keep_yearly": keep_yearly = null,
} : {
keep_weekly ?: (null | int);
keep_yearly ?: (null | int);
} = {
}
) : string
{
return lib_plankton.string.coin(
"borg prune --keep-within=2w{{macro_keep_weekly}}{{macro_keep_yearly}} {{repository_directory}}",
{
"repository_directory": repository_directory,
"keep_within": age,
"macro_keep_weekly": (
(keep_weekly === null)
?
""
:
lib_plankton.string.coin(
" --keep-weekly={{x}}",
{"x": keep_weekly.toFixed(0)}
)
),
"macro_keep_yearly": (
(keep_yearly === null)
?
""
:
lib_plankton.string.coin(
" --keep-yearly={{x}}",
{"x": keep_yearly.toFixed(0)}
)
),
}
)
}
}

View file

@ -0,0 +1,31 @@
namespace _mimir.serialization.files
{
/**
*/
export function execute(
parameters : _mimir.conf.type_concern_parameters_files,
directory : string
) : Array<string>
{
const result : Array<string> = [];
result.push(
lib_plankton.string.coin(
"tar --create --directory={{path}} . > {{target_path}}",
{
"path": parameters.path,
"target_path": lib_plankton.string.coin(
"{{directory}}/files.tar",
{
"directory": directory,
"name": parameters.name,
}
),
}
)
);
return result;
}
}

View file

@ -0,0 +1,60 @@
namespace _mimir.serialization.postgresql_dump
{
/**
*/
export function execute(
parameters : _mimir.conf.type_concern_parameters_postgresql_dump,
directory : string
) : Array<string>
{
const result : Array<string> = [];
const password_file_path: string = "${HOME}/.pgpass";
result.push(
lib_plankton.string.coin(
"echo '{{host}}:{{port}}:{{schema}}:{{username}}:{{password}}' > {{path}} && chmod 0600 {{path}}",
{
"path": password_file_path,
"host": parameters.credentials.host,
"port": parameters.credentials.port.toFixed(0),
"username": parameters.credentials.username,
"password": parameters.credentials.password,
"schema": parameters.credentials.schema,
}
)
);
/*
result.push(
lib_plankton.string.coin(
"mkdir --parents {{directory}}",
{
"directory": directory
}
)
);
*/
result.push(
lib_plankton.string.coin(
"pg_dump --host={{host}} --port={{port}} --username={{username}} {{schema}} > {{target_path}}",
{
"host": parameters.credentials.host,
"port": parameters.credentials.port.toFixed(0),
"username": parameters.credentials.username,
"schema": parameters.credentials.schema,
"target_path": (directory + "/dump.sql"),
}
)
);
result.push(
lib_plankton.string.coin(
"rm {{path}}",
{
"path": password_file_path,
}
)
);
return result;
}
}

View file

@ -0,0 +1,44 @@
namespace _mimir.transfer.borg
{
/**
*/
export function execute(
parameters : _mimir.conf.type_target_parameters_borg,
name : string,
stamp : string,
directory : string
) : Array<string>
{
const result : Array<string> = [];
result.push(
_mimir.helpers.borg.create(
parameters.repository,
lib_plankton.string.coin(
"{{stamp}}-{{name}}",
{
"name": name,
"stamp": stamp,
}
),
[directory],
{
"compression": parameters.compression,
}
)
);
result.push(
_mimir.helpers.borg.prune(
parameters.repository,
"2w",
{
"keep_weekly": 7,
"keep_yearly": 2,
}
)
);
return result;
}
}

View file

@ -0,0 +1,19 @@
namespace _mimir.transfer.keep
{
/**
*/
export function execute(
parameters : _mimir.conf.type_target_parameters_keep,
name : string,
stamp : string,
directory : string
) : Array<string>
{
const result : Array<string> = [];
// do noting
return result;
}
}

View file

@ -1,233 +1,10 @@
const _conf_schema : lib_plankton.conf.type_schema = {
"nullable": false,
"type": "object",
"properties": {
"version": {
"nullable": false,
"type": "string"
},
"target": {
"anyOf": [
{
"nullable": false,
"type": "object",
"properties": {
"kind": {
"nullable": false,
"type": "string",
"enum": ["plain"]
},
"parameters": {
"nullable": false,
"type": "object",
"properties": {
"directory": {
"nullable": false,
"type": "string"
},
},
"additionalProperties": false,
"required": [
"directory",
]
},
},
"additionalProperties": false,
"required": [
"kind",
"parameters",
]
},
{
"nullable": false,
"type": "object",
"properties": {
"kind": {
"nullable": false,
"type": "string",
"enum": ["borg"]
},
"parameters": {
"nullable": false,
"type": "object",
"properties": {
"repository": {
"nullable": false,
"type": "string"
},
"compression": {
"nullable": false,
"type": "string",
"enum": [
"none",
"lz4",
"zlib",
"lzma",
],
"default": "lz4"
},
},
"required": [
"repository",
]
},
},
"additionalProperties": false,
"required": [
"kind",
"parameters",
]
}
]
},
/*
"defaults": {
},
*/
"concerns": {
"nullable": false,
"type": "array",
"items": {
"anyOf": [
{
"nullable": false,
"type": "object",
"properties": {
"active": {
"nullable": false,
"type": "boolean",
"default": true
},
"name": {
"nullable": false,
"type": "string"
},
"kind": {
"nullable": false,
"type": "string",
"enum": ["files"]
},
"parameters": {
"nullable": false,
"type": "object",
"properties": {
"path": {
"nullable": false,
"type": "string",
},
"name": {
"nullable": false,
"type": "string",
},
},
"additionalProperties": false,
"required": [
"path",
"name",
]
}
},
"additionalProperties": false,
"required": [
"name",
"kind",
"parameters",
]
},
{
"nullable": false,
"type": "object",
"properties": {
"active": {
"nullable": false,
"type": "boolean",
"default": true
},
"name": {
"nullable": false,
"type": "string"
},
"kind": {
"nullable": false,
"type": "string",
"enum": ["postgresql_dump"]
},
"parameters": {
"nullable": false,
"type": "object",
"properties": {
"credentials": {
"nullable": false,
"type": "object",
"properties": {
"host": {
"nullable": false,
"type": "string",
},
"port": {
"nullable": false,
"type": "integer",
"default": 5432
},
"username": {
"nullable": false,
"type": "string",
},
"password": {
"nullable": false,
"type": "string",
},
"schema": {
"nullable": false,
"type": "string",
},
},
"additionalProperties": false,
"required": [
"host",
"username",
"password",
"schema",
]
},
"name": {
"nullable": false,
"type": "string",
},
},
"additionalProperties": false,
"required": [
"credentials",
"name",
]
}
},
"additionalProperties": false,
"required": [
"name",
"kind",
"parameters",
]
},
]
}
},
},
"additionalProperties": false,
"required": [
"version",
"target",
"concerns",
]
};
/**
*/
function get_stamp(): string
namespace _mimir
{
let date: Date = (new Date(Date.now()));
/**
*/
function get_stamp() : string
{
const date : Date = (new Date(Date.now()));
return lib_plankton.string.coin(
// "{{year}}{{month}}{{day}}T{{hour}}{{minute}}{{second}}",
"{{year}}-{{month}}-{{day}}",
@ -240,55 +17,128 @@ function get_stamp(): string
"second": date.getSeconds().toFixed(0).padStart(2, "0"),
}
);
}
}
/**
/**
*/
async function main(): Promise<void>
{
// const conf = lib_plankton.json.decode(await lib_plankton.file.read("conf.json"));
const conf : any = await lib_plankton.conf.load(
_conf_schema,
"conf.json"
export async function main(
args_raw : Array<string>
) : Promise<void>
{
// args
const arg_handler : lib_plankton.args.class_handler = new lib_plankton.args.class_handler({
"action": lib_plankton.args.class_argument.positional({
"index": 0,
"type": lib_plankton.args.enum_type.string,
"mode": lib_plankton.args.enum_mode.replace,
"default": "run",
"name": "action",
"info": lib_plankton.string.coin(
"{{description}}:\n{{options}}\n\t\t",
{
"description": "what to do",
"options": (
[
{
"name": "run",
"description": "run"
},
{
"name": "borg-init",
"description": "borg-init"
},
{
"name": "borg-run",
"description": "borg-run"
},
]
.map(
entry => lib_plankton.string.coin(
"\t\t- {{name}}\n\t\t\t{{description}}\n",
{
"name": entry.name,
"description": entry.description,
}
)
)
.join("")
),
}
),
}),
"conf_path": lib_plankton.args.class_argument.volatile({
"indicators_long": ["conf_path"],
"indicators_short": ["c"],
"type": lib_plankton.args.enum_type.string,
"mode": lib_plankton.args.enum_mode.replace,
"default": "conf.json",
"info": "conf_path",
"name": "conf-path",
}),
"help": lib_plankton.args.class_argument.volatile({
"indicators_long": ["help"],
"indicators_short": ["h"],
"type": lib_plankton.args.enum_type.boolean,
"mode": lib_plankton.args.enum_mode.replace,
"default": false,
"info": "help",
"name": "help",
}),
});
const args : Record<string, any> = arg_handler.read(lib_plankton.args.enum_environment.cli, args_raw.join(" "));
if (args.help) {
process.stdout.write(
arg_handler.generate_help(
{
"programname": "Mimir",
"description": "backup tool",
"executable": "mimir",
}
)
+
"\n"
);
}
else {
const conf : _mimir.conf.type_conf = await lib_plankton.conf.load(_mimir.conf.schema, args["conf_path"]);
// process.stdout.write(JSON.stringify(conf, undefined, "\t"));
const stamp: string = get_stamp();
/**
* @todo get from configuration
*/
const base_directory : string = "/tmp/mimir";
switch (conf.target.kind) {
case "plain": {
const target_directory = (conf.target.parameters.directory/* + "/" + stamp*/);
let commands: Array<string> = [];
const commands_add : (command: string) => void = (command) => {
switch (args["action"]) {
case "init": {
return Promise.reject(new Error("not implemented"));
break;
}
case "run": {
for await (const concern of conf.concerns) {
let commands : Array<string> = [];
const commands_add : ((command : string) => void) = (command) => {
commands.push(command);
};
const commands_apply : () => void = () => {
const commands_apply : (() => void) = () => {
// TODO
process.stdout.write(commands.join("\n") + "\n");
};
commands_add(
lib_plankton.string.coin(
"mkdir --parents {{directory}}",
{
"directory": target_directory,
}
)
);
commands_add(
""
);
for await (const concern of conf.concerns) {
if (! concern.active) {
// do nothing
}
else {
const directory : string = (base_directory + "/" + stamp + "/" + concern.name);
// prepare
{
commands_add(
lib_plankton.string.coin(
"# {{name}}",
"## {{name}}\n",
{
"name": concern.name,
"kind": concern.kind,
}
)
);
@ -301,124 +151,107 @@ async function main(): Promise<void>
}
)
);
switch (concern.kind) {
case "files": {
commands_add(
lib_plankton.string.coin(
"mkdir --parents {{directory}}",
{
"directory": lib_plankton.string.coin(
"{{directory}}/{{name}}",
{
"directory": target_directory,
"name": concern.parameters.name,
}
),
"directory": directory,
}
)
);
commands_add(
lib_plankton.string.coin(
"tar --create --directory={{path}} . > {{target_path}}",
{
"path": concern.parameters.path,
"target_path": lib_plankton.string.coin(
"{{directory}}/{{name}}/data.tar",
{
"directory": target_directory,
"name": concern.parameters.name,
}
),
}
// serialize
{
switch (concern.kind) {
case "files": {
commands = commands.concat(
_mimir.serialization.files.execute(
concern.parameters,
directory
)
);
break;
}
case "postgresql_dump": {
const password_file_path: string = "${HOME}/.pgpass";
commands_add(
lib_plankton.string.coin(
"echo '{{host}}:{{port}}:{{schema}}:{{username}}:{{password}}' > {{path}} && chmod 0600 {{path}}",
{
"path": password_file_path,
"host": concern.parameters.credentials.host,
"port": concern.parameters.credentials.port.toFixed(0),
"username": concern.parameters.credentials.username,
"password": concern.parameters.credentials.password,
"schema": concern.parameters.credentials.schema,
}
)
);
commands_add(
lib_plankton.string.coin(
"mkdir --parents {{directory}}",
{
"directory": lib_plankton.string.coin(
"{{directory}}/{{name}}",
{
"directory": target_directory,
"name": concern.parameters.name,
}
),
}
)
);
commands_add(
lib_plankton.string.coin(
"pg_dump --host={{host}} --port={{port}} --username={{username}} {{schema}} > {{target_path}}",
{
"host": concern.parameters.credentials.host,
"port": concern.parameters.credentials.port.toFixed(0),
"username": concern.parameters.credentials.username,
"schema": concern.parameters.credentials.schema,
"target_path": lib_plankton.string.coin(
"{{directory}}/{{name}}/data.sql",
{
"directory": target_directory,
"name": concern.parameters.name,
}
),
}
)
);
commands_add(
lib_plankton.string.coin(
"rm {{path}}",
{
"path": password_file_path,
}
commands = commands.concat(
_mimir.serialization.postgresql_dump.execute(
concern.parameters,
directory
)
);
break;
}
default: {
throw (new Error("unhandled kind: " + concern.kind));
throw (new Error("unhandled kind: " + concern["kind"]));
break;
}
}
}
// transfer
{
switch (conf.target.kind) {
case "keep": {
commands = commands.concat(
_mimir.transfer.keep.execute(
conf.target.parameters,
concern.name,
stamp,
directory
)
);
break;
}
case "borg": {
commands = commands.concat(
_mimir.transfer.borg.execute(
conf.target.parameters,
concern.name,
stamp,
directory
)
);
break;
}
default: {
throw (new Error("unhandled target kind: " + conf.target["kind"]));
break;
}
}
}
// clean
{
/**
* @todo
*/
}
commands_add(
""
);
}
}
commands_add(
lib_plankton.string.coin(
"echo '{{directory}}'",
{
"directory": target_directory,
}
)
""
);
commands_apply();
break;
}
default: {
throw (new Error("unhandled target kind: " + conf.target.kind));
break;
}
}
return Promise.resolve<void>(undefined);
break;
}
default: {
throw (new Error("invalid action: " + args["action"]));
return Promise.resolve<void>(undefined);
break;
}
}
}
}
}
main();
_mimir.main(process.argv.slice(2));

View file

@ -43,6 +43,12 @@ ${dir_temp}/head.js:
${dir_temp}/mimir-raw.js: \
${dir_lib}/plankton/plankton.d.ts \
${dir_source}/helpers/borg.ts \
${dir_source}/conf.ts \
${dir_source}/logic/serialization/files.ts \
${dir_source}/logic/serialization/postgresql_dump.ts \
${dir_source}/logic/transfer/keep.ts \
${dir_source}/logic/transfer/borg.ts \
${dir_source}/main.ts
@ ${cmd_log} "compile …"
@ ${cmd_mkdir} $(dir $@)

View file

@ -11,6 +11,7 @@ modules="${modules} file"
modules="${modules} call"
modules="${modules} json"
modules="${modules} string"
modules="${modules} args"
## exec