mirror of
https://gitlab.com/wgp/dougal/software.git
synced 2025-12-06 10:07:08 +00:00
925 lines
17 KiB
JavaScript
925 lines
17 KiB
JavaScript
|
|
#!/usr/bin/node
|
|||
|
|
|
|||
|
|
const path = require('path');
|
|||
|
|
const fs = require('fs');
|
|||
|
|
const YAML = dougal_require("yaml");
|
|||
|
|
const db = dougal_require("db");
|
|||
|
|
const { deepSet } = dougal_require("utils");
|
|||
|
|
|
|||
|
|
function dougal_require(id) {
|
|||
|
|
try {
|
|||
|
|
return require(path.join(__dirname, "../lib/www/server/lib", id));
|
|||
|
|
} catch (err) {
|
|||
|
|
if (err.code == "MODULE_NOT_FOUND") {
|
|||
|
|
console.log("Trying alternative path");
|
|||
|
|
return require(path.join(__dirname, "../lib/www/server/node_modules", id));
|
|||
|
|
} else {
|
|||
|
|
console.error(err);
|
|||
|
|
throw err;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
//
|
|||
|
|
// https://gitlab.com/wgp/dougal/software/-/work_items/291
|
|||
|
|
//
|
|||
|
|
|
|||
|
|
function check_asaqc (cfg) {
|
|||
|
|
if (!cfg.cloud?.asaqc?.id) {
|
|||
|
|
return apply_cloud_asaqc;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function apply_cloud_asaqc (cfg) {
|
|||
|
|
const asaqc = cfg.asaqc;
|
|||
|
|
if (asaqc) {
|
|||
|
|
console.log("Applying ASAQC changes");
|
|||
|
|
deepSet(cfg, [ "cloud", "asaqc" ], asaqc);
|
|||
|
|
} else {
|
|||
|
|
console.log("ASAQC configuration not found. Will create empty ASAQC object");
|
|||
|
|
deepSet(cfg, [ "cloud", "asaqc" ], {
|
|||
|
|
id: null,
|
|||
|
|
imo: null,
|
|||
|
|
mmsi: null
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
return cfg;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
//
|
|||
|
|
// https://gitlab.com/wgp/dougal/software/-/work_items/296
|
|||
|
|
//
|
|||
|
|
|
|||
|
|
function check_asaqc_subscription_key (cfg) {
|
|||
|
|
if (!cfg.cloud?.asaqc?.subscriptionKey) {
|
|||
|
|
return apply_asaqc_subscription_key;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function apply_asaqc_subscription_key (cfg) {
|
|||
|
|
console.log("Adding subscriptionKey to ASAQC configuration");
|
|||
|
|
const subscriptionKey = process.env.DOUGAL_ASAQC_SUBSCRIPTION_KEY;
|
|||
|
|
if (subscriptionKey) {
|
|||
|
|
deepSet(cfg, [ "cloud", "asaqc", "subscriptionKey" ] , subscriptionKey);
|
|||
|
|
} else {
|
|||
|
|
throw new Error("The ASAQC subscription key must be supplied via the DOUGAL_ASAQC_SUBSCRIPTION_KEY environment variable");
|
|||
|
|
}
|
|||
|
|
return cfg;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
//
|
|||
|
|
// https://gitlab.com/wgp/dougal/software/-/work_items/297
|
|||
|
|
//
|
|||
|
|
|
|||
|
|
function check_online_line_name_info (cfg) {
|
|||
|
|
if (!cfg.online?.line?.lineNameInfo?.fields) {
|
|||
|
|
return apply_online_line_name_info;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function apply_online_line_name_info (cfg) {
|
|||
|
|
console.log("Applying online line name info changes");
|
|||
|
|
let lineNameInfo = {
|
|||
|
|
example: null,
|
|||
|
|
fields: {
|
|||
|
|
line: {
|
|||
|
|
offset: null,
|
|||
|
|
length: 4,
|
|||
|
|
type: "int",
|
|||
|
|
},
|
|||
|
|
sequence: {
|
|||
|
|
offset: null,
|
|||
|
|
length: 3,
|
|||
|
|
type: "int"
|
|||
|
|
},
|
|||
|
|
incr: {
|
|||
|
|
offset: null,
|
|||
|
|
length: 2,
|
|||
|
|
type: "bool",
|
|||
|
|
enum: {}
|
|||
|
|
},
|
|||
|
|
attempt: {
|
|||
|
|
offset: null,
|
|||
|
|
length: 1,
|
|||
|
|
type: "int"
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
switch (process.env.HOST) {
|
|||
|
|
case "dougal04":
|
|||
|
|
lineNameInfo = {
|
|||
|
|
"example": "EQ22200-2213130-007",
|
|||
|
|
"fields": {
|
|||
|
|
"line": {
|
|||
|
|
"length": 4,
|
|||
|
|
"type": "int",
|
|||
|
|
"offset": 10
|
|||
|
|
},
|
|||
|
|
"sequence": {
|
|||
|
|
"length": 3,
|
|||
|
|
"type": "int",
|
|||
|
|
"offset": 16
|
|||
|
|
},
|
|||
|
|
"incr": {
|
|||
|
|
"enum": {
|
|||
|
|
"1": true,
|
|||
|
|
"2": false
|
|||
|
|
},
|
|||
|
|
"length": 1,
|
|||
|
|
"type": "bool",
|
|||
|
|
"offset": 8
|
|||
|
|
},
|
|||
|
|
"attempt": {
|
|||
|
|
"length": 1,
|
|||
|
|
"type": "int",
|
|||
|
|
"offset": 14
|
|||
|
|
},
|
|||
|
|
"file_no": {
|
|||
|
|
"length": 3,
|
|||
|
|
"type": "int",
|
|||
|
|
"offset": 20
|
|||
|
|
},
|
|||
|
|
"year": {
|
|||
|
|
"offset": 2,
|
|||
|
|
"length": 2,
|
|||
|
|
"type": "int"
|
|||
|
|
},
|
|||
|
|
"survey_type": {
|
|||
|
|
"enum": {
|
|||
|
|
"0": "Marine",
|
|||
|
|
"2": "OBS/PRM"
|
|||
|
|
},
|
|||
|
|
"offset": 4,
|
|||
|
|
"length": 1,
|
|||
|
|
"default": "Unknown",
|
|||
|
|
"type": "str"
|
|||
|
|
},
|
|||
|
|
"project_number": {
|
|||
|
|
"offset": 5,
|
|||
|
|
"length": 2,
|
|||
|
|
"type": "int"
|
|||
|
|
},
|
|||
|
|
"num_sources": {
|
|||
|
|
"enum": {
|
|||
|
|
"0": "2",
|
|||
|
|
"1": "1",
|
|||
|
|
"2": "3"
|
|||
|
|
},
|
|||
|
|
"offset": 9,
|
|||
|
|
"length": 1,
|
|||
|
|
"type": "int"
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
case "dougal03":
|
|||
|
|
// Don't know what they use
|
|||
|
|
break;
|
|||
|
|
case "dougal02":
|
|||
|
|
case "dougal01":
|
|||
|
|
default: // Includes dev servers
|
|||
|
|
lineNameInfo = {
|
|||
|
|
example: "1054282180S00000",
|
|||
|
|
fields: {
|
|||
|
|
line: {
|
|||
|
|
offset: 2,
|
|||
|
|
length: 4,
|
|||
|
|
type: "int",
|
|||
|
|
},
|
|||
|
|
sequence: {
|
|||
|
|
offset: 7,
|
|||
|
|
length: 3,
|
|||
|
|
type: "int"
|
|||
|
|
},
|
|||
|
|
incr: {
|
|||
|
|
offset: 0,
|
|||
|
|
length: 2,
|
|||
|
|
type: "bool",
|
|||
|
|
enum: {
|
|||
|
|
"10": true,
|
|||
|
|
"20": false
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
attempt: {
|
|||
|
|
offset: 6,
|
|||
|
|
length: 1,
|
|||
|
|
type: "int"
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
deepSet(cfg, [ "online", "line", "lineNameInfo" ], lineNameInfo);
|
|||
|
|
return cfg;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
//
|
|||
|
|
// https://gitlab.com/wgp/dougal/software/-/work_items/292
|
|||
|
|
//
|
|||
|
|
|
|||
|
|
function check_raw_p111_line_name_info (cfg) {
|
|||
|
|
if (!cfg.raw?.p111?.lineNameInfo?.fields) {
|
|||
|
|
return apply_raw_p111_line_name_info;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function apply_raw_p111_line_name_info (cfg) {
|
|||
|
|
console.log("Applying raw P1/11 name info changes");
|
|||
|
|
let lineNameInfo = {
|
|||
|
|
example: null,
|
|||
|
|
fields: {
|
|||
|
|
line: {
|
|||
|
|
offset: null,
|
|||
|
|
length: 4,
|
|||
|
|
type: "int",
|
|||
|
|
},
|
|||
|
|
sequence: {
|
|||
|
|
offset: null,
|
|||
|
|
length: 3,
|
|||
|
|
type: "int"
|
|||
|
|
},
|
|||
|
|
incr: {
|
|||
|
|
offset: null,
|
|||
|
|
length: 2,
|
|||
|
|
type: "bool",
|
|||
|
|
enum: {}
|
|||
|
|
},
|
|||
|
|
attempt: {
|
|||
|
|
offset: null,
|
|||
|
|
length: 1,
|
|||
|
|
type: "int"
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
switch (process.env.HOST) {
|
|||
|
|
case "dougal04":
|
|||
|
|
lineNameInfo = {
|
|||
|
|
"example": "EQ22200-2213130-007.000.P111",
|
|||
|
|
"fields": {
|
|||
|
|
"line": {
|
|||
|
|
"length": 4,
|
|||
|
|
"type": "int",
|
|||
|
|
"offset": 10
|
|||
|
|
},
|
|||
|
|
"sequence": {
|
|||
|
|
"length": 3,
|
|||
|
|
"type": "int",
|
|||
|
|
"offset": 16
|
|||
|
|
},
|
|||
|
|
"incr": {
|
|||
|
|
"enum": {
|
|||
|
|
"1": true,
|
|||
|
|
"2": false
|
|||
|
|
},
|
|||
|
|
"length": 1,
|
|||
|
|
"type": "bool",
|
|||
|
|
"offset": 8
|
|||
|
|
},
|
|||
|
|
"attempt": {
|
|||
|
|
"length": 1,
|
|||
|
|
"type": "int",
|
|||
|
|
"offset": 14
|
|||
|
|
},
|
|||
|
|
"file_no": {
|
|||
|
|
"length": 3,
|
|||
|
|
"type": "int",
|
|||
|
|
"offset": 20
|
|||
|
|
},
|
|||
|
|
"year": {
|
|||
|
|
"offset": 2,
|
|||
|
|
"length": 2,
|
|||
|
|
"type": "int"
|
|||
|
|
},
|
|||
|
|
"survey_type": {
|
|||
|
|
"enum": {
|
|||
|
|
"0": "Marine",
|
|||
|
|
"2": "OBS/PRM"
|
|||
|
|
},
|
|||
|
|
"offset": 4,
|
|||
|
|
"length": 1,
|
|||
|
|
"default": "Unknown",
|
|||
|
|
"type": "str"
|
|||
|
|
},
|
|||
|
|
"project_number": {
|
|||
|
|
"offset": 5,
|
|||
|
|
"length": 2,
|
|||
|
|
"type": "int"
|
|||
|
|
},
|
|||
|
|
"num_sources": {
|
|||
|
|
"enum": {
|
|||
|
|
"0": "2",
|
|||
|
|
"1": "1",
|
|||
|
|
"2": "3"
|
|||
|
|
},
|
|||
|
|
"offset": 9,
|
|||
|
|
"length": 1,
|
|||
|
|
"type": "int"
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
case "dougal03":
|
|||
|
|
// Don't know what they use
|
|||
|
|
break;
|
|||
|
|
case "dougal02":
|
|||
|
|
case "dougal01":
|
|||
|
|
default: // Includes dev servers
|
|||
|
|
lineNameInfo = {
|
|||
|
|
example: "1054282180S00000.000.p111",
|
|||
|
|
fields: {
|
|||
|
|
line: {
|
|||
|
|
offset: 2,
|
|||
|
|
length: 4,
|
|||
|
|
type: "int",
|
|||
|
|
},
|
|||
|
|
sequence: {
|
|||
|
|
offset: 7,
|
|||
|
|
length: 3,
|
|||
|
|
type: "int"
|
|||
|
|
},
|
|||
|
|
incr: {
|
|||
|
|
offset: 0,
|
|||
|
|
length: 2,
|
|||
|
|
type: "bool",
|
|||
|
|
enum: {
|
|||
|
|
"10": true,
|
|||
|
|
"20": false
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
attempt: {
|
|||
|
|
offset: 6,
|
|||
|
|
length: 1,
|
|||
|
|
type: "int"
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
deepSet(cfg, [ "raw", "p111", "lineNameInfo" ], lineNameInfo);
|
|||
|
|
return cfg;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
//
|
|||
|
|
// https://gitlab.com/wgp/dougal/software/-/work_items/293
|
|||
|
|
//
|
|||
|
|
|
|||
|
|
function check_final_p111_line_name_info (cfg) {
|
|||
|
|
if (!cfg.final?.p111?.lineNameInfo?.fields) {
|
|||
|
|
return apply_final_p111_line_name_info;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function apply_final_p111_line_name_info (cfg) {
|
|||
|
|
console.log("Applying final P1/11 name info changes");
|
|||
|
|
let lineNameInfo = {
|
|||
|
|
example: null,
|
|||
|
|
fields: {
|
|||
|
|
line: {
|
|||
|
|
offset: null,
|
|||
|
|
length: 4,
|
|||
|
|
type: "int",
|
|||
|
|
},
|
|||
|
|
sequence: {
|
|||
|
|
offset: null,
|
|||
|
|
length: 3,
|
|||
|
|
type: "int"
|
|||
|
|
},
|
|||
|
|
incr: {
|
|||
|
|
offset: null,
|
|||
|
|
length: 2,
|
|||
|
|
type: "bool",
|
|||
|
|
enum: {}
|
|||
|
|
},
|
|||
|
|
attempt: {
|
|||
|
|
offset: null,
|
|||
|
|
length: 1,
|
|||
|
|
type: "int"
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
switch (process.env.HOST) {
|
|||
|
|
case "dougal04":
|
|||
|
|
lineNameInfo = {
|
|||
|
|
"example": "EQ22200-2213130-007.000.P111",
|
|||
|
|
"fields": {
|
|||
|
|
"line": {
|
|||
|
|
"length": 4,
|
|||
|
|
"type": "int",
|
|||
|
|
"offset": 10
|
|||
|
|
},
|
|||
|
|
"sequence": {
|
|||
|
|
"length": 3,
|
|||
|
|
"type": "int",
|
|||
|
|
"offset": 16
|
|||
|
|
},
|
|||
|
|
"incr": {
|
|||
|
|
"enum": {
|
|||
|
|
"1": true,
|
|||
|
|
"2": false
|
|||
|
|
},
|
|||
|
|
"length": 1,
|
|||
|
|
"type": "bool",
|
|||
|
|
"offset": 8
|
|||
|
|
},
|
|||
|
|
"attempt": {
|
|||
|
|
"length": 1,
|
|||
|
|
"type": "int",
|
|||
|
|
"offset": 14
|
|||
|
|
},
|
|||
|
|
"file_no": {
|
|||
|
|
"length": 3,
|
|||
|
|
"type": "int",
|
|||
|
|
"offset": 20
|
|||
|
|
},
|
|||
|
|
"year": {
|
|||
|
|
"offset": 2,
|
|||
|
|
"length": 2,
|
|||
|
|
"type": "int"
|
|||
|
|
},
|
|||
|
|
"survey_type": {
|
|||
|
|
"enum": {
|
|||
|
|
"0": "Marine",
|
|||
|
|
"2": "OBS/PRM"
|
|||
|
|
},
|
|||
|
|
"offset": 4,
|
|||
|
|
"length": 1,
|
|||
|
|
"default": "Unknown",
|
|||
|
|
"type": "str"
|
|||
|
|
},
|
|||
|
|
"project_number": {
|
|||
|
|
"offset": 5,
|
|||
|
|
"length": 2,
|
|||
|
|
"type": "int"
|
|||
|
|
},
|
|||
|
|
"num_sources": {
|
|||
|
|
"enum": {
|
|||
|
|
"0": "2",
|
|||
|
|
"1": "1",
|
|||
|
|
"2": "3"
|
|||
|
|
},
|
|||
|
|
"offset": 9,
|
|||
|
|
"length": 1,
|
|||
|
|
"type": "int"
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
case "dougal03":
|
|||
|
|
// Don't know what they use
|
|||
|
|
break;
|
|||
|
|
case "dougal02":
|
|||
|
|
case "dougal01":
|
|||
|
|
default: // Includes dev servers
|
|||
|
|
lineNameInfo = {
|
|||
|
|
example: "1054282180S00000.000.p111",
|
|||
|
|
fields: {
|
|||
|
|
line: {
|
|||
|
|
offset: 2,
|
|||
|
|
length: 4,
|
|||
|
|
type: "int",
|
|||
|
|
},
|
|||
|
|
sequence: {
|
|||
|
|
offset: 7,
|
|||
|
|
length: 3,
|
|||
|
|
type: "int"
|
|||
|
|
},
|
|||
|
|
incr: {
|
|||
|
|
offset: 0,
|
|||
|
|
length: 2,
|
|||
|
|
type: "bool",
|
|||
|
|
enum: {
|
|||
|
|
"10": true,
|
|||
|
|
"20": false
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
attempt: {
|
|||
|
|
offset: 6,
|
|||
|
|
length: 1,
|
|||
|
|
type: "int"
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
deepSet(cfg, [ "final", "p111", "lineNameInfo" ], lineNameInfo);
|
|||
|
|
return cfg;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
//
|
|||
|
|
// https://gitlab.com/wgp/dougal/software/-/work_items/294
|
|||
|
|
//
|
|||
|
|
|
|||
|
|
function check_smsrc_headers_glob_path (cfg) {
|
|||
|
|
if (!cfg.raw?.source?.smsrc?.header?.glob?.length) {
|
|||
|
|
return apply_smsrc_headers_glob_path;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function apply_smsrc_headers_glob_path (cfg) {
|
|||
|
|
console.log("Copying Smartsource header glob and path values to new location");
|
|||
|
|
|
|||
|
|
const globs = cfg?.raw?.smsrc?.globs;
|
|||
|
|
const paths = cfg?.raw?.smsrc?.paths;
|
|||
|
|
|
|||
|
|
if (globs) {
|
|||
|
|
deepSet(cfg, [ "raw", "source", "smsrc", "header", "globs" ], globs);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (paths) {
|
|||
|
|
deepSet(cfg, [ "raw", "source", "smsrc", "header", "paths" ], paths);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return cfg;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
//
|
|||
|
|
// https://gitlab.com/wgp/dougal/software/-/work_items/294
|
|||
|
|
//
|
|||
|
|
|
|||
|
|
function check_smsrc_headers_line_name_info (cfg) {
|
|||
|
|
if (!cfg.raw?.source?.smsrc?.header?.lineNameInfo?.fields) {
|
|||
|
|
return apply_smsrc_headers_line_name_info;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function apply_smsrc_headers_line_name_info (cfg) {
|
|||
|
|
console.log("Applying raw P1/11 name info changes");
|
|||
|
|
let lineNameInfo = {
|
|||
|
|
example: null,
|
|||
|
|
fields: {
|
|||
|
|
line: {
|
|||
|
|
offset: null,
|
|||
|
|
length: 4,
|
|||
|
|
type: "int",
|
|||
|
|
},
|
|||
|
|
sequence: {
|
|||
|
|
offset: null,
|
|||
|
|
length: 3,
|
|||
|
|
type: "int"
|
|||
|
|
},
|
|||
|
|
incr: {
|
|||
|
|
offset: null,
|
|||
|
|
length: 2,
|
|||
|
|
type: "bool",
|
|||
|
|
enum: {}
|
|||
|
|
},
|
|||
|
|
attempt: {
|
|||
|
|
offset: null,
|
|||
|
|
length: 1,
|
|||
|
|
type: "int"
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
switch (process.env.HOST) {
|
|||
|
|
case "dougal04":
|
|||
|
|
lineNameInfo = {
|
|||
|
|
"example": "EQ22200-2213130-007.000.P111",
|
|||
|
|
"fields": {
|
|||
|
|
"line": {
|
|||
|
|
"length": 4,
|
|||
|
|
"type": "int",
|
|||
|
|
"offset": 10
|
|||
|
|
},
|
|||
|
|
"sequence": {
|
|||
|
|
"length": 3,
|
|||
|
|
"type": "int",
|
|||
|
|
"offset": 16
|
|||
|
|
},
|
|||
|
|
"incr": {
|
|||
|
|
"enum": {
|
|||
|
|
"1": true,
|
|||
|
|
"2": false
|
|||
|
|
},
|
|||
|
|
"length": 1,
|
|||
|
|
"type": "bool",
|
|||
|
|
"offset": 8
|
|||
|
|
},
|
|||
|
|
"attempt": {
|
|||
|
|
"length": 1,
|
|||
|
|
"type": "int",
|
|||
|
|
"offset": 14
|
|||
|
|
},
|
|||
|
|
"file_no": {
|
|||
|
|
"length": 3,
|
|||
|
|
"type": "int",
|
|||
|
|
"offset": 20
|
|||
|
|
},
|
|||
|
|
"year": {
|
|||
|
|
"offset": 2,
|
|||
|
|
"length": 2,
|
|||
|
|
"type": "int"
|
|||
|
|
},
|
|||
|
|
"survey_type": {
|
|||
|
|
"enum": {
|
|||
|
|
"0": "Marine",
|
|||
|
|
"2": "OBS/PRM"
|
|||
|
|
},
|
|||
|
|
"offset": 4,
|
|||
|
|
"length": 1,
|
|||
|
|
"default": "Unknown",
|
|||
|
|
"type": "str"
|
|||
|
|
},
|
|||
|
|
"project_number": {
|
|||
|
|
"offset": 5,
|
|||
|
|
"length": 2,
|
|||
|
|
"type": "int"
|
|||
|
|
},
|
|||
|
|
"num_sources": {
|
|||
|
|
"enum": {
|
|||
|
|
"0": "2",
|
|||
|
|
"1": "1",
|
|||
|
|
"2": "3"
|
|||
|
|
},
|
|||
|
|
"offset": 9,
|
|||
|
|
"length": 1,
|
|||
|
|
"type": "int"
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
case "dougal03":
|
|||
|
|
// Don't know what they use
|
|||
|
|
break;
|
|||
|
|
case "dougal02":
|
|||
|
|
case "dougal01":
|
|||
|
|
default: // Includes dev servers
|
|||
|
|
lineNameInfo = {
|
|||
|
|
example: "1054282180S00000.HDR",
|
|||
|
|
fields: {
|
|||
|
|
line: {
|
|||
|
|
offset: 2,
|
|||
|
|
length: 4,
|
|||
|
|
type: "int",
|
|||
|
|
},
|
|||
|
|
sequence: {
|
|||
|
|
offset: 7,
|
|||
|
|
length: 3,
|
|||
|
|
type: "int"
|
|||
|
|
},
|
|||
|
|
incr: {
|
|||
|
|
offset: 0,
|
|||
|
|
length: 2,
|
|||
|
|
type: "bool",
|
|||
|
|
enum: {
|
|||
|
|
"10": true,
|
|||
|
|
"20": false
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
attempt: {
|
|||
|
|
offset: 6,
|
|||
|
|
length: 1,
|
|||
|
|
type: "int"
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
deepSet(cfg, [ "raw", "source", "smsrc", "header", "lineNameInfo" ], lineNameInfo);
|
|||
|
|
return cfg;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
//
|
|||
|
|
// https://gitlab.com/wgp/dougal/software/-/work_items/295
|
|||
|
|
//
|
|||
|
|
|
|||
|
|
function check_smsrc_segy (cfg) {
|
|||
|
|
// We only do this on installations where we know there is, or there
|
|||
|
|
// might be, SEG-Y data available.
|
|||
|
|
const supported_hosts = [
|
|||
|
|
"dougal02",
|
|||
|
|
"dougal01"
|
|||
|
|
];
|
|||
|
|
if (supported_hosts.includes(process.env.HOST)) {
|
|||
|
|
if (!cfg.raw?.source?.smsrc?.segy?.lineNameInfo?.fields) {
|
|||
|
|
return apply_smsrc_segy;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function apply_smsrc_segy (cfg) {
|
|||
|
|
// We don't need to run a switch() for hosts here, since
|
|||
|
|
// we've already done that in check_smsrc_segy().
|
|||
|
|
|
|||
|
|
// Use the paths for *.HDR files as a reference
|
|||
|
|
const paths = cfg.raw?.source?.smsrc?.header?.paths?.map( p =>
|
|||
|
|
path.join(path.dirname(p), "10 SEG-Y"));
|
|||
|
|
const globs = [ "**/*-hyd.sgy" ];
|
|||
|
|
const lineNameInfo = {
|
|||
|
|
"example": "1051460070S00000-hyd.sgy",
|
|||
|
|
"fields": {
|
|||
|
|
"sequence": {
|
|||
|
|
"length": 3,
|
|||
|
|
"type": "int",
|
|||
|
|
"offset": 7
|
|||
|
|
},
|
|||
|
|
"line": {
|
|||
|
|
"length": 4,
|
|||
|
|
"offset": 2
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
const segy = { paths, globs, lineNameInfo };
|
|||
|
|
|
|||
|
|
deepSet(cfg, [ "raw", "source", "smsrc", "segy" ], segy);
|
|||
|
|
|
|||
|
|
return cfg;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
//
|
|||
|
|
// https://gitlab.com/wgp/dougal/software/-/work_items/298
|
|||
|
|
//
|
|||
|
|
|
|||
|
|
function check_preplots_fields (cfg) {
|
|||
|
|
if (cfg.preplots?.length) {
|
|||
|
|
const indices = [];
|
|||
|
|
for (const idx in cfg.preplots) {
|
|||
|
|
const preplot = cfg.preplots[idx];
|
|||
|
|
if (!preplot?.fields?.line_name) {
|
|||
|
|
indices.push(idx);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
if (indices.length) {
|
|||
|
|
return apply_preplots_fieldsλ(indices);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function apply_preplots_fieldsλ (indices) {
|
|||
|
|
function fix_preplot (preplot) {
|
|||
|
|
const names = preplot.format.names;
|
|||
|
|
const types = preplot.format.types;
|
|||
|
|
const widths = preplot.format.widths;
|
|||
|
|
const offsets_widths = widths.reduce ((acc, cur) => {
|
|||
|
|
if (cur < 0) {
|
|||
|
|
acc.p -= cur; // Advances the position by -cur
|
|||
|
|
} else {
|
|||
|
|
acc.f.push({offset: acc.p, width: cur});
|
|||
|
|
acc.p += cur;
|
|||
|
|
}
|
|||
|
|
return acc;
|
|||
|
|
}, {f: [], p: 0})
|
|||
|
|
|
|||
|
|
const fields = {};
|
|||
|
|
names.forEach( (name, ι) => {
|
|||
|
|
const field = {
|
|||
|
|
type: types[ι],
|
|||
|
|
...offsets_widths[ι]
|
|||
|
|
};
|
|||
|
|
fields[name] = field;
|
|||
|
|
});
|
|||
|
|
preplot.fields = fields;
|
|||
|
|
return preplot;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return function apply_preplots_fields (cfg) {
|
|||
|
|
for (const idx of indices) {
|
|||
|
|
console.log("Fixing preplot", idx);
|
|||
|
|
const preplot = fix_preplot(cfg.preplots[idx]);
|
|||
|
|
cfg.preplots.splice(idx, 1, preplot);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
/* Template for more upgrade actions
|
|||
|
|
|
|||
|
|
//
|
|||
|
|
// https://gitlab.com/wgp/dougal/software/-/work_items/
|
|||
|
|
//
|
|||
|
|
|
|||
|
|
function check_ (cfg) {
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function apply_ (cfg) {
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
*/
|
|||
|
|
|
|||
|
|
|
|||
|
|
const checkers = [
|
|||
|
|
check_asaqc,
|
|||
|
|
check_asaqc_subscription_key,
|
|||
|
|
check_online_line_name_info,
|
|||
|
|
check_raw_p111_line_name_info,
|
|||
|
|
check_final_p111_line_name_info,
|
|||
|
|
check_smsrc_headers_glob_path,
|
|||
|
|
check_smsrc_headers_line_name_info,
|
|||
|
|
check_smsrc_segy,
|
|||
|
|
check_preplots_fields
|
|||
|
|
]
|
|||
|
|
|
|||
|
|
const now = new Date();
|
|||
|
|
const tstamp = now.toISOString().substr(0, 19)+"Z";
|
|||
|
|
|
|||
|
|
function fnames(pid) {
|
|||
|
|
return {
|
|||
|
|
backup: `${pid}-configuration-${tstamp}.yaml`,
|
|||
|
|
upgrade: `NEW-${pid}-configuration-${tstamp}.yaml`
|
|||
|
|
};
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function save_scripts (pid) {
|
|||
|
|
const cwd = process.cwd();
|
|||
|
|
const fn_backup = path.resolve(path.join(cwd, fnames(pid).backup));
|
|||
|
|
const fn_upgrade = path.resolve(path.join(cwd, fnames(pid).upgrade));
|
|||
|
|
|
|||
|
|
console.log("Creating script to restore old / new configurations");
|
|||
|
|
const backup = `# Restore pre-upgrade configuration for ${pid}
|
|||
|
|
curl -vs "http://localhost:3000/api/project/${pid}/configuration" -X PUT -H "Content-Type: application/yaml" --data-binary @${fn_backup}\n`;
|
|||
|
|
const upgrade = `# Restore post-upgrade configuration for ${pid}
|
|||
|
|
curl -vs "http://localhost:3000/api/project/${pid}/configuration" -X PUT -H "Content-Type: application/yaml" --data-binary @${fn_upgrade}\n`;
|
|||
|
|
|
|||
|
|
fs.writeFileSync(`restore-20231113-pre-${pid}.sh`, backup);
|
|||
|
|
fs.writeFileSync(`restore-20231113-post-${pid}.sh`, upgrade);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
async function backup (pid, cfg) {
|
|||
|
|
const fname = fnames(pid).backup;
|
|||
|
|
console.log(`Backing up configuration for ${pid} as ${fname} into current directory`);
|
|||
|
|
const text = YAML.stringify(cfg);
|
|||
|
|
fs.writeFileSync(fname, text);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
async function save_configuration (pid, cfg) {
|
|||
|
|
console.log("Saving configuration for", pid);
|
|||
|
|
|
|||
|
|
console.log("Saving copy of NEW configuration to file");
|
|||
|
|
const fname = fnames(pid).upgrade;
|
|||
|
|
const text = YAML.stringify(cfg);
|
|||
|
|
fs.writeFileSync(fname, text);
|
|||
|
|
save_scripts(pid);
|
|||
|
|
|
|||
|
|
//console.log("Uploading configuration to server");
|
|||
|
|
try {
|
|||
|
|
//await db.project.configuration.put(pid);
|
|||
|
|
} catch (err) {
|
|||
|
|
console.log("Configuration upload failed");
|
|||
|
|
console.error(err);
|
|||
|
|
throw err;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
async function upgrade_configuration (pid) {
|
|||
|
|
const configuration = await db.project.configuration.get(pid);
|
|||
|
|
|
|||
|
|
console.log(`Checking configuration for ${configuration.id} (${configuration.schema})`);
|
|||
|
|
|
|||
|
|
const appliers = checkers.map( checker => checker(configuration) ).filter( i => !!i );
|
|||
|
|
|
|||
|
|
if (appliers.length) {
|
|||
|
|
console.log("Configuration needs changes.");
|
|||
|
|
await backup(pid, configuration);
|
|||
|
|
|
|||
|
|
console.log("Applying changes");
|
|||
|
|
console.log(appliers);
|
|||
|
|
for (const applier of appliers) {
|
|||
|
|
applier(configuration);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
await save_configuration(pid, configuration);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
async function main () {
|
|||
|
|
|
|||
|
|
const cla = process.argv.slice(2).map(i => i.toLowerCase());
|
|||
|
|
|
|||
|
|
function project_filter (project) {
|
|||
|
|
if (cla.length == 0)
|
|||
|
|
return true;
|
|||
|
|
return cla.includes(project.pid.toLowerCase());
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
const projects = (await db.project.get()).filter(project_filter);
|
|||
|
|
|
|||
|
|
projects.sort( (a, b) =>
|
|||
|
|
a.pid > b.pid
|
|||
|
|
? 1
|
|||
|
|
: a.pid < b.pid
|
|||
|
|
? -1
|
|||
|
|
: 0);
|
|||
|
|
|
|||
|
|
console.log(projects);
|
|||
|
|
|
|||
|
|
for (const project of projects) {
|
|||
|
|
await upgrade_configuration(project.pid);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
console.log("All done");
|
|||
|
|
process.exit(0);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
main();
|