init
This commit is contained in:
commit
8f31113bdf
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
errors
|
89
README.md
Normal file
89
README.md
Normal file
@ -0,0 +1,89 @@
|
|||||||
|
# Adamocomp Data Parser
|
||||||
|
This library provides methods to interpret the adamocomp data file.
|
||||||
|
## Example Usage
|
||||||
|
``` javascript
|
||||||
|
const Parser = require('adamocomp/parser.js');
|
||||||
|
|
||||||
|
var parser = new Parser();
|
||||||
|
|
||||||
|
parser.get.data('gitlab repo').then(function(data){
|
||||||
|
// "data" contains all data for the gitlab deal
|
||||||
|
})
|
||||||
|
|
||||||
|
parser.get_formatted.data('gitlab repo').then(function(printable){
|
||||||
|
// Standard output as stringified json.
|
||||||
|
console.log(printable)
|
||||||
|
})
|
||||||
|
|
||||||
|
// parser.get_formatted.root('gitlab').then(function(str){
|
||||||
|
// console.log(str)
|
||||||
|
// }
|
||||||
|
// Output below
|
||||||
|
```
|
||||||
|
|
||||||
|
``` bash
|
||||||
|
node data_tool.js path "gitlab"
|
||||||
|
# ["gitlab"]
|
||||||
|
```
|
||||||
|
## Constructor Options
|
||||||
|
* `new Parser({options})`
|
||||||
|
|
||||||
|
| property | type | description | default |
|
||||||
|
|---|---|---|---|
|
||||||
|
| path | string | Path to data file | `${program_root}/data.json` |
|
||||||
|
## Methods
|
||||||
|
### `get.file()`
|
||||||
|
Type: async
|
||||||
|
|
||||||
|
Params: none
|
||||||
|
|
||||||
|
Returns: an object literal of the data file.
|
||||||
|
``` javascript
|
||||||
|
parser.get.file().then(function(file){
|
||||||
|
// 'file' is the entire data file
|
||||||
|
})
|
||||||
|
```
|
||||||
|
### `get.data(string)`
|
||||||
|
|
||||||
|
Type: async
|
||||||
|
|
||||||
|
| param | type | description |
|
||||||
|
|---|---|---|
|
||||||
|
| 1 | string | search string |
|
||||||
|
|
||||||
|
Returns: data tree underneath node corresponding to search string, if found, otherwise null.
|
||||||
|
``` javascript
|
||||||
|
parser.get.data(str).then(function(data){
|
||||||
|
console.log(JSON.stringify(data));
|
||||||
|
})
|
||||||
|
```
|
||||||
|
### `get.root(string)`
|
||||||
|
|
||||||
|
Type: async
|
||||||
|
|
||||||
|
| param | type | description |
|
||||||
|
|---|---|---|
|
||||||
|
| 1 | string | search string |
|
||||||
|
|
||||||
|
Returns: array of keys (directories) leading to deal, if found, or an empty array.
|
||||||
|
``` javascript
|
||||||
|
parser.get.root(str).then(function(nodes){
|
||||||
|
console.log(locations);
|
||||||
|
// ['gitlab']
|
||||||
|
})
|
||||||
|
```
|
||||||
|
### `get.list()`
|
||||||
|
|
||||||
|
Type: async
|
||||||
|
|
||||||
|
Params: none
|
||||||
|
|
||||||
|
Returns: array of all deployments in the environment.
|
||||||
|
``` javascript
|
||||||
|
parser.get.list().then(function(deployments){
|
||||||
|
console.log(location);
|
||||||
|
// ['gitlab', 'factorio/clusterio_host', 'factorio/factorio_host', etc.]
|
||||||
|
})
|
||||||
|
```
|
||||||
|
## Running Tests
|
||||||
|
`npm test`
|
191
data-tool.js
Executable file
191
data-tool.js
Executable file
@ -0,0 +1,191 @@
|
|||||||
|
#!/usr/bin/node
|
||||||
|
|
||||||
|
const Parser = require('./parser.js');
|
||||||
|
var parser = new Parser();
|
||||||
|
|
||||||
|
const yargs = require('yargs')
|
||||||
|
.scriptName("node data_tool.js")
|
||||||
|
.usage('$0 <cmd> [options] [args]')
|
||||||
|
.command(
|
||||||
|
'valid_deal [query]',
|
||||||
|
'Returns with exit code 0 if [query] matches'
|
||||||
|
+ ' at least one deal, otherwise 2.',
|
||||||
|
(yargs) => {
|
||||||
|
yargs.positional('query', {
|
||||||
|
type: 'string',
|
||||||
|
default: '',
|
||||||
|
describe: 'Key path.'
|
||||||
|
})
|
||||||
|
},
|
||||||
|
function(argv) {
|
||||||
|
parser.test
|
||||||
|
.valid_deal(argv.query)
|
||||||
|
.then(function(result) {
|
||||||
|
if (result) {
|
||||||
|
process.exit(0);
|
||||||
|
}
|
||||||
|
process.exit(2);
|
||||||
|
})
|
||||||
|
}
|
||||||
|
)
|
||||||
|
.command(
|
||||||
|
'valid_cluster [query]',
|
||||||
|
'Returns with exit code 0 if [query] matches'
|
||||||
|
+ ' at least one cluster, otherwise 2.',
|
||||||
|
(yargs) => {
|
||||||
|
yargs.positional('query', {
|
||||||
|
type: 'string',
|
||||||
|
default: '',
|
||||||
|
describe: 'Key path.'
|
||||||
|
})
|
||||||
|
},
|
||||||
|
function(argv) {
|
||||||
|
parser.test
|
||||||
|
.valid_cluster(argv.query)
|
||||||
|
.then(function(result) {
|
||||||
|
if (result) {
|
||||||
|
process.exit(0);
|
||||||
|
}
|
||||||
|
process.exit(2);
|
||||||
|
})
|
||||||
|
}
|
||||||
|
)
|
||||||
|
.command(
|
||||||
|
'valid_host [query]',
|
||||||
|
'Returns with exit code 0 if [query] matches'
|
||||||
|
+ ' at least one host, otherwise 2.',
|
||||||
|
(yargs) => {
|
||||||
|
yargs.positional('query', {
|
||||||
|
type: 'string',
|
||||||
|
default: '',
|
||||||
|
describe: 'Key path.'
|
||||||
|
})
|
||||||
|
},
|
||||||
|
function(argv) {
|
||||||
|
parser.test
|
||||||
|
.valid_host(argv.query)
|
||||||
|
.then(function(result) {
|
||||||
|
if (result) {
|
||||||
|
process.exit(0);
|
||||||
|
}
|
||||||
|
process.exit(2);
|
||||||
|
})
|
||||||
|
}
|
||||||
|
)
|
||||||
|
.command(
|
||||||
|
'get [query]',
|
||||||
|
'Prints an array of '.concat(
|
||||||
|
' paths matched by [query], or returns [].'
|
||||||
|
),
|
||||||
|
(yargs) => {
|
||||||
|
yargs.positional('query', {
|
||||||
|
type: 'string',
|
||||||
|
default: '',
|
||||||
|
describe: 'The key path to a datanode.'
|
||||||
|
})
|
||||||
|
},
|
||||||
|
function(argv) {
|
||||||
|
parser.get
|
||||||
|
.data(argv.query)
|
||||||
|
.then(function(arr) {
|
||||||
|
console.log(JSON.stringify(arr));
|
||||||
|
})
|
||||||
|
}
|
||||||
|
)
|
||||||
|
.command(
|
||||||
|
'root [query]',
|
||||||
|
'Returns json array of arrays of keys in order '.concat(
|
||||||
|
'locating query matches'
|
||||||
|
),
|
||||||
|
(yargs) => {
|
||||||
|
yargs.positional('query', {
|
||||||
|
type: 'string',
|
||||||
|
default: '',
|
||||||
|
describe: 'The key path to a datanode.'
|
||||||
|
})
|
||||||
|
},
|
||||||
|
function(argv) {
|
||||||
|
parser.get
|
||||||
|
.root(argv.query)
|
||||||
|
.then(function(arr) {
|
||||||
|
console.log(JSON.stringify(arr));
|
||||||
|
})
|
||||||
|
}
|
||||||
|
)
|
||||||
|
.command(
|
||||||
|
'path [query]',
|
||||||
|
'Returns array of paths under NAAS_HOME'
|
||||||
|
+ ' for each matching deal.',
|
||||||
|
(yargs) => {
|
||||||
|
yargs.positional('query', {
|
||||||
|
type: 'string',
|
||||||
|
default: '',
|
||||||
|
describe: 'The key path to a datanode.'
|
||||||
|
})
|
||||||
|
},
|
||||||
|
function(argv) {
|
||||||
|
parser.get
|
||||||
|
.path(argv.query)
|
||||||
|
.then(function(arr) {
|
||||||
|
console.log(JSON.stringify(arr));
|
||||||
|
})
|
||||||
|
}
|
||||||
|
)
|
||||||
|
.command(
|
||||||
|
'deals',
|
||||||
|
'Returns list of deals.',
|
||||||
|
function(argv) {
|
||||||
|
parser.get
|
||||||
|
.deals()
|
||||||
|
.then(function(arr) {
|
||||||
|
console.log(JSON.stringify(arr));
|
||||||
|
})
|
||||||
|
}
|
||||||
|
)
|
||||||
|
.command(
|
||||||
|
'hosts [query]',
|
||||||
|
'Returns list of hosts.',
|
||||||
|
(yargs) => {
|
||||||
|
yargs.positional('query', {
|
||||||
|
type: 'string',
|
||||||
|
default: '',
|
||||||
|
describe: 'The key path to a datanode.'
|
||||||
|
})
|
||||||
|
},
|
||||||
|
function(argv) {
|
||||||
|
parser.get
|
||||||
|
.host_list(argv.query)
|
||||||
|
.then(function(arr) {
|
||||||
|
console.log(JSON.stringify(arr));
|
||||||
|
})
|
||||||
|
}
|
||||||
|
)
|
||||||
|
.option(
|
||||||
|
'debug',
|
||||||
|
{
|
||||||
|
alias: 'd',
|
||||||
|
description: 'Print debug output (very verbose!)',
|
||||||
|
type: 'boolean',
|
||||||
|
global: true,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
.option(
|
||||||
|
'path',
|
||||||
|
{
|
||||||
|
alias: 'p',
|
||||||
|
description: 'Path to data file.',
|
||||||
|
type: 'string',
|
||||||
|
global: true,
|
||||||
|
default: "/etc/adamocomp/data.json"
|
||||||
|
}
|
||||||
|
)
|
||||||
|
.help()
|
||||||
|
.argv;
|
||||||
|
|
||||||
|
if (yargs.path) {
|
||||||
|
parser.params.path = yargs.path;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (yargs.debug) {
|
||||||
|
parser.params.debug_mode = yargs.debug;
|
||||||
|
}
|
200
data.json
Normal file
200
data.json
Normal file
@ -0,0 +1,200 @@
|
|||||||
|
{
|
||||||
|
"etc": {
|
||||||
|
"environment": [
|
||||||
|
"GITLAB_HOME=/opt/gitlab",
|
||||||
|
"ADAMOCOMP_HOME=/opt/adamocomp/",
|
||||||
|
"ADAMOCOMP_CONFDIR=/etc/adamocomp/"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"cmd": {
|
||||||
|
"shutdown": ["sudo shutdown now"]
|
||||||
|
},
|
||||||
|
"adamocomp": {
|
||||||
|
"repo": "sys/adamocomp.git",
|
||||||
|
"issue_path": "$ADAMOCOMP_HOME",
|
||||||
|
"suggest": [
|
||||||
|
"No git?"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"bash-logger": {
|
||||||
|
"repo": "sys/bash-logger.git",
|
||||||
|
"issue_path": "$ADAMOCOMP_HOME/bash-logger",
|
||||||
|
"run": "syslog.sh"
|
||||||
|
},
|
||||||
|
"gitlab": {
|
||||||
|
"repo": "sys/adamocomp.git",
|
||||||
|
"docker": {
|
||||||
|
"issue_path": "/opt/gitlab",
|
||||||
|
"image": "gitlab/gitlab-ce:latest",
|
||||||
|
"options": [
|
||||||
|
[
|
||||||
|
"--volume",
|
||||||
|
"/opt/gitlab/config:/etc/gitlab:Z",
|
||||||
|
"/opt/gitlab/logs:/var/log/gitlab:Z",
|
||||||
|
"/opt/gitlab/data:/var/opt/gitlab:Z"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"--publish",
|
||||||
|
"443:443",
|
||||||
|
"45000:45000",
|
||||||
|
"2222:22"
|
||||||
|
],
|
||||||
|
["--restart","always"],
|
||||||
|
["--hostname","gitlab.adamo.network"]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"suggest": [
|
||||||
|
"Running as a bootstrap."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"covid-data": {
|
||||||
|
"repo": "owid/covid-19-data/tree/master/public/data/ecdc",
|
||||||
|
"git_src": "https://github.com/",
|
||||||
|
"suggest": [
|
||||||
|
"Setup github retrieval."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"tmux-conf": {
|
||||||
|
"repo": "config/tmux-conf.git",
|
||||||
|
"issue_path": "~",
|
||||||
|
"issue_files": [".tmux.conf"]
|
||||||
|
},
|
||||||
|
"dictd": {
|
||||||
|
"apt": [
|
||||||
|
"install -y dict dictd dict-gcide dict-moby-thesaurus"
|
||||||
|
],
|
||||||
|
"systemctl": [
|
||||||
|
"enable dictd"
|
||||||
|
],
|
||||||
|
"bashrc": [
|
||||||
|
"alias thes='dict -d moby-thesaurus'",
|
||||||
|
"alias define='dict'"
|
||||||
|
],
|
||||||
|
"suggest": [
|
||||||
|
"Not debian?",
|
||||||
|
"No network?"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"list_matches": {
|
||||||
|
"repo": "function/list_matches.git",
|
||||||
|
"run": [
|
||||||
|
"list_matches.sh"
|
||||||
|
],
|
||||||
|
"suggest": [
|
||||||
|
"Use filenames.",
|
||||||
|
"One list element per line."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"adamonet": {
|
||||||
|
"britannia": {
|
||||||
|
"remote": {
|
||||||
|
"host": "britannia.adamonet",
|
||||||
|
"ports": {
|
||||||
|
"ssh": 22,
|
||||||
|
"znc": 31415
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"local": {
|
||||||
|
"host": "localhost",
|
||||||
|
"ipv4": "207.148.15.96"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"internum": {
|
||||||
|
"clusterio": {
|
||||||
|
"integer": {
|
||||||
|
"remote": {
|
||||||
|
"host": "internum.adamonet",
|
||||||
|
"ports": {
|
||||||
|
"factorio": 49000
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"local": {
|
||||||
|
"host": "factorarium.internum.adamonet",
|
||||||
|
"ports": {
|
||||||
|
"ssh": 22,
|
||||||
|
"factorio": 1000
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"vacatium": {
|
||||||
|
"host": "integer.internum.adamonet",
|
||||||
|
"remote": {
|
||||||
|
"host": "internum.adamonet",
|
||||||
|
"ports": {
|
||||||
|
"factorio": 49001
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"local": {
|
||||||
|
"host": "factorarium.internum.adamonet",
|
||||||
|
"ports": {
|
||||||
|
"ssh": 22,
|
||||||
|
"factorio": 1000
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"austr": {
|
||||||
|
"remote": {
|
||||||
|
"host": "internum.adamonet",
|
||||||
|
"ports": {
|
||||||
|
"ssh": 40000,
|
||||||
|
"resilio-sync": 40001
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"local": {
|
||||||
|
"host": "austr.internum.adamonet",
|
||||||
|
"ipv4": "192.168.6.150"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"syracusae": {
|
||||||
|
"remote": {
|
||||||
|
"host": "internum.adamonet",
|
||||||
|
"ports": {
|
||||||
|
"ssh": 46000,
|
||||||
|
"http": 46005
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"local": {
|
||||||
|
"host": "syracusae.internum.adamonet",
|
||||||
|
"ipv4": "192.168.6.10"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"melita": {
|
||||||
|
"remote": {
|
||||||
|
"host": "internum.adamonet",
|
||||||
|
"ports": {
|
||||||
|
"ssh": 46001
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"local": {
|
||||||
|
"ipv4": "192.168.6.20",
|
||||||
|
"host": "melita.internum.adamonet"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"factorarium": {
|
||||||
|
"remote": {
|
||||||
|
"host": "internum.adamonet",
|
||||||
|
"ports": {
|
||||||
|
"ssh": 46002
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"local": {
|
||||||
|
"ipv4": "192.168.6.101",
|
||||||
|
"host": "factorarium.internum.adamonet"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"dockerpad": {
|
||||||
|
"remote": {
|
||||||
|
"host": "internum.adamonet",
|
||||||
|
"ports": {
|
||||||
|
"ssh": 46003
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"local": {
|
||||||
|
"ipv4": "192.168.6.102",
|
||||||
|
"host": "dockerpad.internum.adamonet"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
19
package.json
Normal file
19
package.json
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
{
|
||||||
|
"name": "adamocomp",
|
||||||
|
"version": "0.0.1",
|
||||||
|
"description": "ballistic action library swiss-army knife",
|
||||||
|
"main": "parser.js",
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "caes@git.adamonet:sys/adamocomp.git"
|
||||||
|
},
|
||||||
|
"author": "",
|
||||||
|
"dependencies": {
|
||||||
|
"yargs": "^15.3.1"
|
||||||
|
},
|
||||||
|
"devDependencies": {},
|
||||||
|
"scripts": {
|
||||||
|
"test": "echo \"Error: no test specified\" && exit 1"
|
||||||
|
},
|
||||||
|
"license": "ISC"
|
||||||
|
}
|
274
parser.js
Normal file
274
parser.js
Normal file
@ -0,0 +1,274 @@
|
|||||||
|
'use strict';
|
||||||
|
const fs = require('fs');
|
||||||
|
|
||||||
|
function Parser(options) {
|
||||||
|
var self = this;
|
||||||
|
|
||||||
|
options = options || {};
|
||||||
|
|
||||||
|
function debug(message) {
|
||||||
|
if (self.params.debug_mode) {
|
||||||
|
console.log(`[DEBUG] ${message}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
this.defaults = {
|
||||||
|
path : './data.json',
|
||||||
|
query_delim : '/',
|
||||||
|
debug_mode : false
|
||||||
|
}
|
||||||
|
|
||||||
|
this.params = Object.assign({}, self.defaults, options);
|
||||||
|
|
||||||
|
this.data = null;
|
||||||
|
|
||||||
|
this.test = {
|
||||||
|
'valid_deal' : function(query) {
|
||||||
|
return self.get.deals(query)
|
||||||
|
.then(function(data) {
|
||||||
|
if (query == "") return false;
|
||||||
|
if (data.length > 0) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
})
|
||||||
|
},
|
||||||
|
'valid_cluster' : function(query) {
|
||||||
|
return self.test.has_hosts(query)
|
||||||
|
},
|
||||||
|
'valid_host' : function(query) {
|
||||||
|
return self.test.has_hosts(query)
|
||||||
|
},
|
||||||
|
'has_hosts' : function(query) {
|
||||||
|
return self.get.hosts(query)
|
||||||
|
.then(host_list => {
|
||||||
|
if (query == "") return false;
|
||||||
|
debug("Host list: "+host_list);
|
||||||
|
if (host_list.length > 0) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
})
|
||||||
|
},
|
||||||
|
'is_object' : function(obj) {
|
||||||
|
return (typeof obj === 'object' && obj !== null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
this.xform = {
|
||||||
|
'query_str_to_arr' : function(str = "") {
|
||||||
|
if (!str || str == "" || str == '') {
|
||||||
|
debug("Transforming empty search string.");
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
var arr = str.split(self.params.query_delim);
|
||||||
|
var split_str=""
|
||||||
|
arr.forEach(term => {
|
||||||
|
split_str = split_str + " " + term;
|
||||||
|
})
|
||||||
|
arr = split_str.split(" ");
|
||||||
|
arr = arr.filter(term => term != '.');
|
||||||
|
arr = arr.filter(term => term != '');
|
||||||
|
debug("Query arr: "+arr);
|
||||||
|
return arr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
this.reduce = {
|
||||||
|
'once' : function(data = {},name = "") {
|
||||||
|
const addressed = self.address(data,[...name]);
|
||||||
|
return addressed.data;
|
||||||
|
},
|
||||||
|
'fuzzy' : function(data = {},names = []) {
|
||||||
|
if (!Array.isArray(names) || names.length < 1) {
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
var name = names.shift();
|
||||||
|
var result = self.reduce.once(data,name);
|
||||||
|
names.forEach(name => { result = [...result.map(tree => {
|
||||||
|
const matches = self.reduce.once(tree,name)
|
||||||
|
debug(matches);
|
||||||
|
return matches;
|
||||||
|
})]})
|
||||||
|
result.filter(obj => obj);
|
||||||
|
return result;
|
||||||
|
},
|
||||||
|
'exact' : function(data = {},names = []) {
|
||||||
|
if (!Array.isArray(names) || names.length < 1) {
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
const addressed = self.address(data,names);
|
||||||
|
debug("Reduced exact data: "+addressed);
|
||||||
|
return addressed.data;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
this.address = function(data = {},names = []) {
|
||||||
|
if (!names || names.length < 1 || !data || data == {}) {
|
||||||
|
debug("nope");
|
||||||
|
return { paths: [['.']], data: [data] };
|
||||||
|
}
|
||||||
|
var match_paths = new Array();
|
||||||
|
var match_data = new Array();
|
||||||
|
var branches = new Array({
|
||||||
|
root: ".",
|
||||||
|
data: data
|
||||||
|
});
|
||||||
|
for(var i=0; i < branches.length; i++) {
|
||||||
|
const data = branches[i].data;
|
||||||
|
const root = branches[i].root;
|
||||||
|
for (const [name,value] of Object.entries(data)) {
|
||||||
|
if (self.test.is_object(value)) {
|
||||||
|
branches.push({
|
||||||
|
root: [...root,name],
|
||||||
|
data: value
|
||||||
|
});
|
||||||
|
}
|
||||||
|
if (name == names[0]) {
|
||||||
|
var match = data;
|
||||||
|
names.forEach(term => {
|
||||||
|
debug("Searching for term: "+term);
|
||||||
|
if (match && match[term]) {
|
||||||
|
match = match[term];
|
||||||
|
}
|
||||||
|
else { match = undefined }
|
||||||
|
});
|
||||||
|
if (match) {
|
||||||
|
const match_path=[...root]
|
||||||
|
match_paths.push(match_path)
|
||||||
|
match_data.push(match)
|
||||||
|
debug("match found:" +match_path+"; "+match);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return { paths: match_paths, data: match_data };
|
||||||
|
}
|
||||||
|
|
||||||
|
this.get = {
|
||||||
|
'raw' : function(){
|
||||||
|
return new Promise(function(resolve, reject){
|
||||||
|
if(!self.data){
|
||||||
|
fs.readFile(
|
||||||
|
self.params.path,
|
||||||
|
function(err, data) {
|
||||||
|
if(err) reject(err);
|
||||||
|
try {
|
||||||
|
JSON.parse(data);
|
||||||
|
self.data = JSON.parse(data)
|
||||||
|
resolve(self.data)
|
||||||
|
} catch(err){
|
||||||
|
reject(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
resolve(self.data);
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
'reduced' : function(names = [],ascent = [],descent = []) {
|
||||||
|
return self.get.raw().then(entire_data => {
|
||||||
|
debug(`ascent: ${ascent}`);
|
||||||
|
debug(`names: ${names}`);
|
||||||
|
debug(`descent: ${descent}`);
|
||||||
|
if (names.length+ascent.length+descent.length<1) {
|
||||||
|
return entire_data;
|
||||||
|
}
|
||||||
|
const domain = self.reduce.fuzzy(entire_data,ascent);
|
||||||
|
const fence = self.reduce.exact(domain,names);
|
||||||
|
const product = self.reduce.fuzzy(fence,descent);
|
||||||
|
return product;
|
||||||
|
//return self.reduce.exact(entire_data,names);
|
||||||
|
})
|
||||||
|
},
|
||||||
|
'addressed' : function(names) {
|
||||||
|
return self.get.raw().then(entire_data => {
|
||||||
|
debug(`Addressing raw: ${JSON.stringify(names)}`);
|
||||||
|
return self.address(entire_data,names);
|
||||||
|
})
|
||||||
|
},
|
||||||
|
'deals' : function(query){
|
||||||
|
return self.get.addressed(
|
||||||
|
[...(self.xform.query_str_to_arr(query)),"repo"]
|
||||||
|
).then(addressed => { return addressed.paths; })
|
||||||
|
},
|
||||||
|
'hosts' : function(query){
|
||||||
|
return self.get.addressed(
|
||||||
|
[...(self.xform.query_str_to_arr(query))]
|
||||||
|
).then(cluster_data => {
|
||||||
|
debug("Cluster search data: "
|
||||||
|
+JSON.stringify(cluster_data))
|
||||||
|
const host_matches = cluster_data.data.map(data =>{
|
||||||
|
debug("Data in cluster: "+JSON.stringify(data))
|
||||||
|
const hosts = self.address(
|
||||||
|
data,
|
||||||
|
["remote","host"]
|
||||||
|
);
|
||||||
|
return hosts.paths;
|
||||||
|
})
|
||||||
|
return host_matches;
|
||||||
|
})
|
||||||
|
},
|
||||||
|
'host_list': function(query) {
|
||||||
|
return self.get.hosts(query).then(paths => {
|
||||||
|
const host_list = paths.map(path_list => {
|
||||||
|
const return_queries = path_list.map(path_arr => {
|
||||||
|
var query_str = "";
|
||||||
|
path_arr = path_arr.filter(e => e != '.');
|
||||||
|
path_arr.forEach(e => { query_str += e+" "; })
|
||||||
|
return query_str.trim();
|
||||||
|
})
|
||||||
|
return return_queries;
|
||||||
|
})
|
||||||
|
return host_list;
|
||||||
|
})
|
||||||
|
},
|
||||||
|
'root' : function(query){
|
||||||
|
return self.get.addressed(
|
||||||
|
[...(self.xform.query_str_to_arr(query))]
|
||||||
|
).then(addressed => { return addressed.paths; })
|
||||||
|
},
|
||||||
|
'path' : function(query) {
|
||||||
|
return self.get.root(query).then(roots => {
|
||||||
|
var paths = new Array();
|
||||||
|
debug(`Roots found: ${roots}`);
|
||||||
|
roots.forEach (
|
||||||
|
function(root, i, array) {
|
||||||
|
var str = "";
|
||||||
|
debug(`Formatting ${root}`);
|
||||||
|
root.forEach(
|
||||||
|
function(key,j,arr) {
|
||||||
|
debug(`${j}: ${key}`);
|
||||||
|
str = str + "/" + key;
|
||||||
|
}
|
||||||
|
)
|
||||||
|
debug(str);
|
||||||
|
var query_arr = query.split(" ");
|
||||||
|
query_arr.forEach(
|
||||||
|
function(term,j,arr) {
|
||||||
|
str = str + "/" + term;
|
||||||
|
})
|
||||||
|
str = str.slice(3)
|
||||||
|
paths.push(str);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
return paths;
|
||||||
|
})
|
||||||
|
},
|
||||||
|
'cluster_data' : function(query) {
|
||||||
|
return self.get.reduced(
|
||||||
|
self.xform.query_str_to_arr(query),
|
||||||
|
["clusters"],
|
||||||
|
["ports","ssh"]
|
||||||
|
).then(data => { return data; })
|
||||||
|
},
|
||||||
|
'data' : function(query) {
|
||||||
|
return self.get.reduced(
|
||||||
|
self.xform.query_str_to_arr(query)
|
||||||
|
).then(data => { return data; })
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports = Parser;
|
21
test/test.js
Normal file
21
test/test.js
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
const assert = require('assert');
|
||||||
|
const chai = require('chai');
|
||||||
|
const expect = require('chai').expect;
|
||||||
|
const fs = require('fs');
|
||||||
|
|
||||||
|
const Parser = require('../parser.js');
|
||||||
|
|
||||||
|
var parser = new Parser();
|
||||||
|
|
||||||
|
describe('Running tests:' , function() {
|
||||||
|
|
||||||
|
describe('Data file:', function(){
|
||||||
|
it('Attempting to read data file at ' + parser.params.path, function(done){
|
||||||
|
parser.get.file().then(function(data){
|
||||||
|
done()
|
||||||
|
}).catch(function(error){
|
||||||
|
done(error);
|
||||||
|
})
|
||||||
|
});
|
||||||
|
})
|
||||||
|
})
|
Loading…
Reference in New Issue
Block a user