marcattacks 2.0.0 → 2.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +25 -13
- package/dist/attacker.d.ts +2 -0
- package/dist/attacker.d.ts.map +1 -0
- package/dist/attacker.js +164 -0
- package/dist/attacker.js.map +1 -0
- package/dist/filestream.d.ts +4 -0
- package/dist/filestream.d.ts.map +1 -0
- package/dist/filestream.js +32 -0
- package/dist/filestream.js.map +1 -0
- package/dist/index.js +13 -175
- package/dist/index.js.map +1 -1
- package/dist/input/alephseq.d.ts +2 -2
- package/dist/input/alephseq.d.ts.map +1 -1
- package/dist/input/alephseq.js +46 -76
- package/dist/input/alephseq.js.map +1 -1
- package/dist/input/json.d.ts +2 -2
- package/dist/input/json.d.ts.map +1 -1
- package/dist/input/json.js +15 -27
- package/dist/input/json.js.map +1 -1
- package/dist/input/jsonl.d.ts +2 -2
- package/dist/input/jsonl.d.ts.map +1 -1
- package/dist/input/jsonl.js +27 -46
- package/dist/input/jsonl.js.map +1 -1
- package/dist/input/marc.d.ts +2 -2
- package/dist/input/marc.d.ts.map +1 -1
- package/dist/input/marc.js +18 -37
- package/dist/input/marc.js.map +1 -1
- package/dist/input/rdf.d.ts +2 -2
- package/dist/input/rdf.d.ts.map +1 -1
- package/dist/input/rdf.js +23 -10
- package/dist/input/rdf.js.map +1 -1
- package/dist/{transform/rdf.d.ts → input/tsv.d.ts} +1 -1
- package/dist/input/tsv.d.ts.map +1 -0
- package/dist/input/tsv.js +45 -0
- package/dist/input/tsv.js.map +1 -0
- package/dist/input/xml.d.ts +2 -2
- package/dist/input/xml.d.ts.map +1 -1
- package/dist/input/xml.js +28 -92
- package/dist/input/xml.js.map +1 -1
- package/dist/output/alephseq.d.ts +1 -1
- package/dist/output/alephseq.d.ts.map +1 -1
- package/dist/output/alephseq.js +2 -2
- package/dist/output/alephseq.js.map +1 -1
- package/dist/output/json.d.ts +1 -1
- package/dist/output/json.d.ts.map +1 -1
- package/dist/output/json.js +2 -2
- package/dist/output/json.js.map +1 -1
- package/dist/output/jsonl.d.ts +1 -1
- package/dist/output/jsonl.d.ts.map +1 -1
- package/dist/output/jsonl.js +3 -3
- package/dist/output/jsonl.js.map +1 -1
- package/dist/output/parquet.d.ts +7 -0
- package/dist/output/parquet.d.ts.map +1 -0
- package/dist/output/parquet.js +15 -0
- package/dist/output/parquet.js.map +1 -0
- package/dist/output/rdf.d.ts +1 -1
- package/dist/output/rdf.d.ts.map +1 -1
- package/dist/output/rdf.js +3 -4
- package/dist/output/rdf.js.map +1 -1
- package/dist/output/tsv.d.ts +3 -0
- package/dist/output/tsv.d.ts.map +1 -0
- package/dist/output/tsv.js +37 -0
- package/dist/output/tsv.js.map +1 -0
- package/dist/output/xml.d.ts +1 -1
- package/dist/output/xml.d.ts.map +1 -1
- package/dist/output/xml.js +3 -3
- package/dist/output/xml.js.map +1 -1
- package/dist/s3stream.d.ts +3 -2
- package/dist/s3stream.d.ts.map +1 -1
- package/dist/s3stream.js +55 -3
- package/dist/s3stream.js.map +1 -1
- package/dist/sftpstream.d.ts +3 -3
- package/dist/sftpstream.d.ts.map +1 -1
- package/dist/sftpstream.js +48 -5
- package/dist/sftpstream.js.map +1 -1
- package/dist/transform/avram.d.ts +6 -0
- package/dist/transform/avram.d.ts.map +1 -0
- package/dist/transform/avram.js +37 -0
- package/dist/transform/avram.js.map +1 -0
- package/dist/transform/jsonata.d.ts +1 -1
- package/dist/transform/jsonata.d.ts.map +1 -1
- package/dist/transform/jsonata.js +9 -6
- package/dist/transform/jsonata.js.map +1 -1
- package/dist/transform/marc2rdf.d.ts +1 -1
- package/dist/transform/marc2rdf.d.ts.map +1 -1
- package/dist/transform/marc2rdf.js +4 -2
- package/dist/transform/marc2rdf.js.map +1 -1
- package/dist/transform/marcids.d.ts +6 -0
- package/dist/transform/marcids.d.ts.map +1 -0
- package/dist/transform/marcids.js +22 -0
- package/dist/transform/marcids.js.map +1 -0
- package/dist/transform/notation3.d.ts +1 -1
- package/dist/transform/notation3.d.ts.map +1 -1
- package/dist/transform/notation3.js +3 -3
- package/dist/transform/notation3.js.map +1 -1
- package/dist/util/stream_helpers.d.ts +8 -0
- package/dist/util/stream_helpers.d.ts.map +1 -1
- package/dist/util/stream_helpers.js +77 -3
- package/dist/util/stream_helpers.js.map +1 -1
- package/package.json +11 -7
- package/dist/transform/json.d.ts +0 -3
- package/dist/transform/json.d.ts.map +0 -1
- package/dist/transform/json.js +0 -32
- package/dist/transform/json.js.map +0 -1
- package/dist/transform/rdf.d.ts.map +0 -1
- package/dist/transform/rdf.js +0 -370
- package/dist/transform/rdf.js.map +0 -1
package/README.md
CHANGED
|
@@ -24,31 +24,37 @@ npm link
|
|
|
24
24
|
Generate JSON:
|
|
25
25
|
|
|
26
26
|
```
|
|
27
|
-
marcattacks --to json
|
|
27
|
+
marcattacks --to json ./data/sample.xml
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
We can also do this for tar (and) gzipped files
|
|
31
|
+
|
|
32
|
+
```
|
|
33
|
+
marcattacks --to json ./data/sample.tar.gz
|
|
28
34
|
```
|
|
29
35
|
|
|
30
36
|
Generate Aleph sequential:
|
|
31
37
|
|
|
32
38
|
```
|
|
33
|
-
marcattacks --to alephseq
|
|
39
|
+
marcattacks --to alephseq ./data/sample.xml
|
|
34
40
|
```
|
|
35
41
|
|
|
36
42
|
Generate RDF:
|
|
37
43
|
|
|
38
44
|
```
|
|
39
|
-
marcattacks --to rdf --map marc2rdf
|
|
45
|
+
marcattacks --to rdf --map marc2rdf ./data/sample.xml
|
|
40
46
|
```
|
|
41
47
|
|
|
42
48
|
Generate XML:
|
|
43
49
|
|
|
44
50
|
```
|
|
45
|
-
marcattacks --to xml
|
|
51
|
+
marcattacks --from alephseq --to xml ./data/one.alephseq
|
|
46
52
|
```
|
|
47
53
|
|
|
48
54
|
Transform the MARC input using a [JSONata](https://docs.jsonata.org/overview.html) expression or file:
|
|
49
55
|
|
|
50
56
|
```
|
|
51
|
-
marcattacks
|
|
57
|
+
marcattacks --param fix=./demo/demo.jsonata ./data/sample.xml
|
|
52
58
|
```
|
|
53
59
|
|
|
54
60
|
## Remote files
|
|
@@ -88,6 +94,7 @@ use `s3s://...` for using an SSL layer.
|
|
|
88
94
|
- jsonl
|
|
89
95
|
- marc (ISO2709)
|
|
90
96
|
- rdf
|
|
97
|
+
- tsv
|
|
91
98
|
- xml (MARCXML)
|
|
92
99
|
|
|
93
100
|
### Output (--to)
|
|
@@ -95,25 +102,28 @@ use `s3s://...` for using an SSL layer.
|
|
|
95
102
|
- alephseq (Aleph sequential)
|
|
96
103
|
- json
|
|
97
104
|
- jsonl
|
|
105
|
+
- parquet
|
|
98
106
|
- rdf
|
|
107
|
+
- tsv
|
|
99
108
|
- xml (MARCXML)
|
|
100
109
|
|
|
101
110
|
### Transform (--map)
|
|
102
111
|
|
|
112
|
+
- avram : A mapper from MARC to [Avram](https://format.gbv.de/schema/avram/specification)
|
|
103
113
|
- jsonata : _default_ A jsonata fixer
|
|
104
|
-
-
|
|
114
|
+
- marcids : A mapper from MARC to a list of record ids
|
|
115
|
+
- marc2rdf : A mapper from MARC to RDF (demonstrator)
|
|
105
116
|
- notation3 : A [Notation3](https://w3c.github.io/N3/spec/) reasoner
|
|
106
117
|
|
|
107
118
|
Or, provide your own transformers using JavaScript plugins. See: ./plugin/demo.js for an example.
|
|
108
119
|
|
|
109
|
-
###
|
|
120
|
+
### Param (--param)
|
|
110
121
|
|
|
111
|
-
Provide a
|
|
122
|
+
Provide a params to the mapper, input and output. See examples:
|
|
112
123
|
|
|
113
124
|
- `npm run demo:jsonld`
|
|
114
125
|
- `npm run demo:n3`
|
|
115
126
|
- `npm run biblio:one`
|
|
116
|
-
- `npm run biblio:all`
|
|
117
127
|
|
|
118
128
|
### Writable (--out)
|
|
119
129
|
|
|
@@ -121,9 +131,8 @@ Provide a fix file to the mapper. See examples:
|
|
|
121
131
|
- _file path_
|
|
122
132
|
- sftp://username@host:port/path
|
|
123
133
|
- s3://accessKey:secretKey@host:port/bucket/key (or s3s://)
|
|
124
|
-
- stdin://local
|
|
125
134
|
|
|
126
|
-
### Logging (--info,--debug,--log)
|
|
135
|
+
### Logging (--info,--debug,--trace,--log)
|
|
127
136
|
|
|
128
137
|
Logging messages can be provided with the `--info`, `--debug` and `--trace` options.
|
|
129
138
|
|
|
@@ -133,6 +142,9 @@ Default the logging format is a text format that is written to stderr. This logg
|
|
|
133
142
|
- `--log stdout` : write logs to the stdout
|
|
134
143
|
- `--log json+stdout` : write logs in a JSON format and to the stdout
|
|
135
144
|
|
|
136
|
-
### Compression (
|
|
145
|
+
### Compression (--z,--tar)
|
|
146
|
+
|
|
147
|
+
Gzip and tar compression of input files can be automatically detected by file name extension. If no such extensions are provided the following flags can be set to force decompression:
|
|
137
148
|
|
|
138
|
-
-
|
|
149
|
+
- `--z` : the input file is gzipped
|
|
150
|
+
- `--tar` : the input file is tarred
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attacker.d.ts","sourceRoot":"","sources":["../src/attacker.ts"],"names":[],"mappings":"AAsBA,wBAAsB,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,GAAI,OAAO,CAAC,IAAI,CAAC,CA6JnE"}
|
package/dist/attacker.js
ADDED
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import log4js from 'log4js';
|
|
2
|
+
import { loadPlugin } from './plugin-loader.js';
|
|
3
|
+
import { sftpLatestFile, sftpReadStream, sftpWriteStream } from './sftpstream.js';
|
|
4
|
+
import { httpReadStream } from './httpstream.js';
|
|
5
|
+
import { Readable } from 'stream';
|
|
6
|
+
import { pathToFileURL } from "node:url";
|
|
7
|
+
import {} from 'node:stream';
|
|
8
|
+
import { SlowWritable } from './slow-writable.js';
|
|
9
|
+
import path from "node:path";
|
|
10
|
+
import fs from 'fs';
|
|
11
|
+
import { s3LatestObject, s3ReadStream, s3WriteStream } from './s3stream.js';
|
|
12
|
+
import { pipeline } from 'node:stream/promises';
|
|
13
|
+
import { createCountableSkippedStream, createUntarredStream, createUncompressedStream, createVerboseStream } from './util/stream_helpers.js';
|
|
14
|
+
import { fileLatestFile, fileReadStream } from './filestream.js';
|
|
15
|
+
const logger = log4js.getLogger();
|
|
16
|
+
export async function attack(url, opts) {
|
|
17
|
+
try {
|
|
18
|
+
let inputFile;
|
|
19
|
+
if (fs.existsSync(url)) {
|
|
20
|
+
const filePath = path.resolve(process.cwd(), url);
|
|
21
|
+
inputFile = pathToFileURL(filePath);
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
inputFile = new URL(url);
|
|
25
|
+
}
|
|
26
|
+
logger.info(`using: ${getCleanURL(inputFile)}`);
|
|
27
|
+
let readableStream;
|
|
28
|
+
if (inputFile.protocol.startsWith("http")) {
|
|
29
|
+
readableStream = await httpReadStream(inputFile.toString());
|
|
30
|
+
}
|
|
31
|
+
else if (inputFile.protocol.startsWith("s3")) {
|
|
32
|
+
// optional resolve @latest
|
|
33
|
+
inputFile = await s3LatestObject(inputFile, opts);
|
|
34
|
+
readableStream = await s3ReadStream(inputFile, opts);
|
|
35
|
+
}
|
|
36
|
+
else if (inputFile.protocol === 'sftp:') {
|
|
37
|
+
// optional resolve @latest
|
|
38
|
+
inputFile = await sftpLatestFile(inputFile, opts);
|
|
39
|
+
readableStream = await sftpReadStream(inputFile, opts);
|
|
40
|
+
}
|
|
41
|
+
else if (inputFile.protocol === 'stdin:') {
|
|
42
|
+
readableStream = process.stdin;
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
inputFile = await fileLatestFile(inputFile);
|
|
46
|
+
readableStream = await fileReadStream(inputFile);
|
|
47
|
+
}
|
|
48
|
+
const stages = [readableStream];
|
|
49
|
+
if (opts.z || inputFile.pathname.endsWith(".gz")) {
|
|
50
|
+
stages.push(createUncompressedStream());
|
|
51
|
+
}
|
|
52
|
+
if (opts.tar || inputFile.pathname.match(/.tar(.\w+$)?$/) || inputFile.pathname.endsWith(".tgz")) {
|
|
53
|
+
stages.push(await createUntarredStream());
|
|
54
|
+
}
|
|
55
|
+
if (opts.from) {
|
|
56
|
+
const mod = await loadPlugin(opts.from, 'input');
|
|
57
|
+
const transformer = await mod.transform(Object.assign({ path: inputFile }, opts.param));
|
|
58
|
+
transformer.on('error', (error) => {
|
|
59
|
+
if (error.code === 'ERR_STREAM_PREMATURE_CLOSE') {
|
|
60
|
+
stages[0]?.destroy();
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
logger.error("input stream processing error: ", error.message);
|
|
64
|
+
stages[0]?.destroy();
|
|
65
|
+
process.exitCode = 2;
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
transformer.on('finish', () => logger.debug('writeable finished'));
|
|
69
|
+
transformer.on('end', () => logger.debug('readable ended'));
|
|
70
|
+
transformer.on('close', () => logger.debug('stream closed'));
|
|
71
|
+
stages.push(transformer);
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
console.error(`Need --from`);
|
|
75
|
+
process.exit(1);
|
|
76
|
+
}
|
|
77
|
+
if (opts.count || opts.skip) {
|
|
78
|
+
stages.push(createCountableSkippedStream(opts.count, opts.skip));
|
|
79
|
+
}
|
|
80
|
+
stages.push(createVerboseStream());
|
|
81
|
+
if (opts.map) {
|
|
82
|
+
const mod = await loadPlugin(opts.map, 'transform');
|
|
83
|
+
const transformer = await mod.transform(opts.param);
|
|
84
|
+
stages.push(transformer);
|
|
85
|
+
}
|
|
86
|
+
let outStream;
|
|
87
|
+
if (isWritableStream(opts.out)) {
|
|
88
|
+
outStream = opts.out;
|
|
89
|
+
}
|
|
90
|
+
else if (opts.out === '@slow') {
|
|
91
|
+
outStream = new SlowWritable({ delayMs: 100 });
|
|
92
|
+
}
|
|
93
|
+
else if (opts.out === '@errors') {
|
|
94
|
+
outStream = new SlowWritable({ simulateErrorEveryN: 2 });
|
|
95
|
+
}
|
|
96
|
+
else if (opts.out) {
|
|
97
|
+
if (opts.out.startsWith("sftp")) {
|
|
98
|
+
const url = new URL(opts.out);
|
|
99
|
+
if (process.env.SFTP_USERNAME) {
|
|
100
|
+
url.username = process.env.SFTP_USERNAME;
|
|
101
|
+
}
|
|
102
|
+
if (process.env.SFTP_PASSWORD) {
|
|
103
|
+
url.password = process.env.SFTP_PASSWORD;
|
|
104
|
+
}
|
|
105
|
+
logger.info(`put ${getCleanURL(url)}`);
|
|
106
|
+
outStream = await sftpWriteStream(url, opts);
|
|
107
|
+
}
|
|
108
|
+
else if (opts.out.startsWith("s3")) {
|
|
109
|
+
const url = new URL(opts.out);
|
|
110
|
+
if (process.env.S3_ACCESS_KEY) {
|
|
111
|
+
url.username = process.env.S3_ACCESS_KEY;
|
|
112
|
+
}
|
|
113
|
+
if (process.env.S3_SECRET_KEY) {
|
|
114
|
+
url.password = process.env.S3_SECRET_KEY;
|
|
115
|
+
}
|
|
116
|
+
logger.info(`put ${getCleanURL(url)}`);
|
|
117
|
+
outStream = await s3WriteStream(url, {});
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
outStream = fs.createWriteStream(opts.out, { encoding: 'utf-8' });
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
else {
|
|
124
|
+
outStream = process.stdout;
|
|
125
|
+
}
|
|
126
|
+
if (opts.to) {
|
|
127
|
+
const mod = await loadPlugin(opts.to, 'output');
|
|
128
|
+
stages.push(await mod.transform(opts.param));
|
|
129
|
+
stages.push(outStream);
|
|
130
|
+
try {
|
|
131
|
+
await pipeline(stages);
|
|
132
|
+
logger.info("pipeline finished cleanly");
|
|
133
|
+
}
|
|
134
|
+
catch (err) {
|
|
135
|
+
if (err.code === 'ERR_STREAM_PREMATURE_CLOSE') {
|
|
136
|
+
logger.info("Stream closed by limiter.");
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
logger.error("pipeline error:", err);
|
|
140
|
+
process.exitCode = 3;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
catch (e) {
|
|
146
|
+
logger.error(`process crashed with: ${e}`);
|
|
147
|
+
process.exitCode = 8;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
function getCleanURL(url) {
|
|
151
|
+
const tempUrl = new URL(url.href); // Clone to avoid mutating original
|
|
152
|
+
tempUrl.username = '***';
|
|
153
|
+
tempUrl.password = '***';
|
|
154
|
+
return tempUrl;
|
|
155
|
+
}
|
|
156
|
+
function isWritableStream(obj) {
|
|
157
|
+
return (obj !== null &&
|
|
158
|
+
typeof obj === 'object' &&
|
|
159
|
+
typeof obj.write === 'function' &&
|
|
160
|
+
typeof obj.end === 'function' &&
|
|
161
|
+
// internal state check
|
|
162
|
+
obj.writable !== false);
|
|
163
|
+
}
|
|
164
|
+
//# sourceMappingURL=attacker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attacker.js","sourceRoot":"","sources":["../src/attacker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filestream.d.ts","sourceRoot":"","sources":["../src/filestream.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAKvC,wBAAsB,cAAc,CAAC,GAAG,EAAE,GAAG,GAAI,OAAO,CAAC,QAAQ,CAAC,CAEjE;AAED,wBAAsB,cAAc,CAAC,GAAG,EAAE,GAAG,GAAI,OAAO,CAAC,GAAG,CAAC,CA6B5D"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import fs from "fs";
|
|
2
|
+
import log4js from 'log4js';
|
|
3
|
+
const logger = log4js.getLogger();
|
|
4
|
+
export async function fileReadStream(url) {
|
|
5
|
+
return fs.createReadStream(url);
|
|
6
|
+
}
|
|
7
|
+
export async function fileLatestFile(url) {
|
|
8
|
+
return new Promise((resolve) => {
|
|
9
|
+
logger.debug(url.href);
|
|
10
|
+
if (!url.href.includes("@latest:")) {
|
|
11
|
+
resolve(url);
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
const directory = url.pathname.replaceAll(/@latest:.*/g, "");
|
|
15
|
+
const extension = url.pathname.replaceAll(/.*@latest:/g, "");
|
|
16
|
+
logger.debug(`directory: ${directory} ; extension: ${extension}`);
|
|
17
|
+
fs.readdir(directory, (err, files) => {
|
|
18
|
+
if (err) {
|
|
19
|
+
throw new Error("Error finding latest file:", err);
|
|
20
|
+
}
|
|
21
|
+
for (let i = 0; i < files.length; i++) {
|
|
22
|
+
if (files[i]?.toLowerCase().endsWith(extension)) {
|
|
23
|
+
logger.info(`resolved as file://${directory}${files[i]}`);
|
|
24
|
+
resolve(new URL("file://" + directory + files[i]));
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
throw new Error("No latest file found!");
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=filestream.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filestream.js","sourceRoot":"","sources":["../src/filestream.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AAEpB,OAAO,MAAM,MAAM,QAAQ,CAAC;AAE5B,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC;AAElC,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,GAAQ;IACzC,OAAO,EAAE,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,GAAQ;IACzC,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;QACjC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACvB,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;YACjC,OAAO,CAAC,GAAG,CAAC,CAAC;YACb,OAAO;QACX,CAAC;QAED,MAAM,SAAS,GAAG,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,aAAa,EAAC,EAAE,CAAC,CAAC;QAC5D,MAAM,SAAS,GAAG,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,aAAa,EAAC,EAAE,CAAC,CAAC;QAE5D,MAAM,CAAC,KAAK,CAAC,cAAc,SAAS,iBAAiB,SAAS,EAAE,CAAC,CAAC;QAElE,EAAE,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,GAAG,EAAC,KAAK,EAAE,EAAE;YACjC,IAAI,GAAG,EAAE,CAAC;gBACT,MAAM,IAAI,KAAK,CAAC,4BAA4B,EAAE,GAAG,CAAC,CAAC;YACpD,CAAC;YAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAG,CAAC,GAAG,KAAK,CAAC,MAAM,EAAG,CAAC,EAAE,EAAE,CAAC;gBACzC,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;oBAC9C,MAAM,CAAC,IAAI,CAAC,sBAAsB,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;oBAC1D,OAAO,CAAC,IAAI,GAAG,CAAC,SAAS,GAAG,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;oBACnD,OAAO;gBACX,CAAC;YACF,CAAC;YAED,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;QAC5C,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;AACP,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,19 +1,10 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import log4js from 'log4js';
|
|
3
3
|
import { program } from 'commander';
|
|
4
|
-
import { loadPlugin } from './plugin-loader.js';
|
|
5
|
-
import { sftpReadStream, sftpWriteStream, sftpLatestFile } from './sftpstream.js';
|
|
6
|
-
import { httpReadStream } from './httpstream.js';
|
|
7
|
-
import { Readable } from 'stream';
|
|
8
|
-
import { pathToFileURL } from "node:url";
|
|
9
|
-
import { SlowWritable } from './slow-writable.js';
|
|
10
4
|
import path from "node:path";
|
|
11
|
-
import fs from 'fs';
|
|
12
|
-
import { s3ReaderStream, s3WriterStream } from './s3stream.js';
|
|
13
5
|
import dotenv from 'dotenv';
|
|
14
|
-
import {
|
|
15
|
-
import {
|
|
16
|
-
import { createCountableSkippedStream, createVerboseStream } from './util/stream_helpers.js';
|
|
6
|
+
import { attack } from './attacker.js';
|
|
7
|
+
import { asyncWrapProviders } from 'node:async_hooks';
|
|
17
8
|
program.version('0.1.0')
|
|
18
9
|
.argument('<file>')
|
|
19
10
|
.option('-c,--config <config>', 'config .env', path.join(process.cwd(), '.env'))
|
|
@@ -21,8 +12,10 @@ program.version('0.1.0')
|
|
|
21
12
|
.option('-t,--to <output>', 'output type', 'json')
|
|
22
13
|
.option('-m,--map <map>', 'data mapper', 'jsonata')
|
|
23
14
|
.option('--fix <what>', 'jsonata')
|
|
15
|
+
.option('-p,--param <key=value>', 'repeated params', collect, {})
|
|
24
16
|
.option('-o,--out <file>', 'output file')
|
|
25
|
-
.option('
|
|
17
|
+
.option('--z', 'uncompress input')
|
|
18
|
+
.option('--tar', 'untar input')
|
|
26
19
|
.option('--count <num>', 'output only <num> records')
|
|
27
20
|
.option('--skip <num>', 'skip first <num> records')
|
|
28
21
|
.option('--key <keyfile>', 'private key file')
|
|
@@ -65,7 +58,6 @@ if (opts.trace) {
|
|
|
65
58
|
if (opts.config) {
|
|
66
59
|
dotenv.config({ path: opts.config, quiet: true });
|
|
67
60
|
}
|
|
68
|
-
logger.info('here');
|
|
69
61
|
main();
|
|
70
62
|
function configureDefaultLogger(output) {
|
|
71
63
|
log4js.configure({
|
|
@@ -117,175 +109,21 @@ async function main() {
|
|
|
117
109
|
console.error(`need an input file`);
|
|
118
110
|
process.exit(2);
|
|
119
111
|
}
|
|
120
|
-
|
|
121
|
-
if (fs.existsSync(url)) {
|
|
122
|
-
const filePath = path.resolve(process.cwd(), url);
|
|
123
|
-
inputFile = pathToFileURL(filePath);
|
|
124
|
-
}
|
|
125
|
-
else {
|
|
126
|
-
inputFile = new URL(url);
|
|
127
|
-
}
|
|
128
|
-
logger.info(`using: ${getCleanURL(inputFile)}`);
|
|
129
|
-
let readableStream;
|
|
130
|
-
if (inputFile.protocol.startsWith("http")) {
|
|
131
|
-
readableStream = await httpReadStream(inputFile.toString());
|
|
132
|
-
}
|
|
133
|
-
else if (inputFile.protocol.startsWith("s3")) {
|
|
134
|
-
readableStream = await s3ReaderStream(inputFile, {});
|
|
135
|
-
}
|
|
136
|
-
else if (inputFile.protocol === 'sftp:') {
|
|
137
|
-
const config = makeSftpConfig(inputFile, opts);
|
|
138
|
-
let remotePath;
|
|
139
|
-
if (inputFile.pathname.match(/\/@latest:\w+$/)) {
|
|
140
|
-
const remoteDir = inputFile.pathname.replace(/\/@latest.*/, "");
|
|
141
|
-
const extension = inputFile.pathname.replace(/.*\/@latest:/, "");
|
|
142
|
-
remotePath = await sftpLatestFile(config, remoteDir, extension);
|
|
143
|
-
}
|
|
144
|
-
else {
|
|
145
|
-
remotePath = inputFile.pathname;
|
|
146
|
-
}
|
|
147
|
-
readableStream = await sftpReadStream(remotePath, config);
|
|
148
|
-
}
|
|
149
|
-
else if (inputFile.protocol === 'stdin:') {
|
|
150
|
-
readableStream = process.stdin;
|
|
151
|
-
}
|
|
152
|
-
else {
|
|
153
|
-
readableStream = fs.createReadStream(inputFile);
|
|
154
|
-
}
|
|
155
|
-
let inputStream;
|
|
156
|
-
if (opts.z) {
|
|
157
|
-
inputStream = getDecompressedStream(readableStream);
|
|
158
|
-
}
|
|
159
|
-
else {
|
|
160
|
-
inputStream = readableStream;
|
|
161
|
-
}
|
|
162
|
-
let objectStream;
|
|
163
|
-
if (opts.from) {
|
|
164
|
-
const mod = await loadPlugin(opts.from, 'input');
|
|
165
|
-
objectStream = await mod.stream2readable(inputStream, {
|
|
166
|
-
path: inputFile
|
|
167
|
-
});
|
|
168
|
-
objectStream.on('error', (error) => {
|
|
169
|
-
if (error.code === 'ERR_STREAM_PREMATURE_CLOSE') {
|
|
170
|
-
inputStream.destroy();
|
|
171
|
-
}
|
|
172
|
-
else {
|
|
173
|
-
logger.error("input stream processing error: ", error.message);
|
|
174
|
-
inputStream.destroy();
|
|
175
|
-
process.exitCode = 2;
|
|
176
|
-
}
|
|
177
|
-
});
|
|
178
|
-
}
|
|
179
|
-
else {
|
|
180
|
-
console.error(`Need --from`);
|
|
181
|
-
process.exit(1);
|
|
182
|
-
}
|
|
183
|
-
const stages = [objectStream];
|
|
184
|
-
if (opts.count || opts.skip) {
|
|
185
|
-
stages.push(createCountableSkippedStream(opts.count, opts.skip));
|
|
186
|
-
}
|
|
187
|
-
stages.push(createVerboseStream());
|
|
188
|
-
if (opts.map) {
|
|
189
|
-
const mod = await loadPlugin(opts.map, 'transform');
|
|
190
|
-
const transformer = await mod.transform(opts.fix);
|
|
191
|
-
stages.push(transformer);
|
|
192
|
-
}
|
|
193
|
-
let outStream;
|
|
194
|
-
if (opts.out === '@slow') {
|
|
195
|
-
outStream = new SlowWritable({ delayMs: 100 });
|
|
196
|
-
}
|
|
197
|
-
else if (opts.out === '@errors') {
|
|
198
|
-
outStream = new SlowWritable({ simulateErrorEveryN: 2 });
|
|
199
|
-
}
|
|
200
|
-
else if (opts.out) {
|
|
201
|
-
if (opts.out.startsWith("sftp")) {
|
|
202
|
-
const url = new URL(opts.out);
|
|
203
|
-
if (process.env.SFTP_USERNAME) {
|
|
204
|
-
url.username = process.env.SFTP_USERNAME;
|
|
205
|
-
}
|
|
206
|
-
if (process.env.SFTP_PASSWORD) {
|
|
207
|
-
url.password = process.env.SFTP_PASSWORD;
|
|
208
|
-
}
|
|
209
|
-
const config = makeSftpConfig(url, opts);
|
|
210
|
-
logger.info(`put ${getCleanURL(url)}`);
|
|
211
|
-
outStream = await sftpWriteStream(url.href, config);
|
|
212
|
-
}
|
|
213
|
-
else if (opts.out.startsWith("s3")) {
|
|
214
|
-
const url = new URL(opts.out);
|
|
215
|
-
if (process.env.S3_ACCESS_KEY) {
|
|
216
|
-
url.username = process.env.S3_ACCESS_KEY;
|
|
217
|
-
}
|
|
218
|
-
if (process.env.S3_SECRET_KEY) {
|
|
219
|
-
url.password = process.env.S3_SECRET_KEY;
|
|
220
|
-
}
|
|
221
|
-
logger.info(`put ${getCleanURL(url)}`);
|
|
222
|
-
outStream = await s3WriterStream(url, {});
|
|
223
|
-
}
|
|
224
|
-
else {
|
|
225
|
-
outStream = fs.createWriteStream(opts.out, { encoding: 'utf-8' });
|
|
226
|
-
}
|
|
227
|
-
}
|
|
228
|
-
else {
|
|
229
|
-
outStream = process.stdout;
|
|
230
|
-
}
|
|
231
|
-
if (opts.to) {
|
|
232
|
-
const mod = await loadPlugin(opts.to, 'output');
|
|
233
|
-
stages.push(await mod.transform());
|
|
234
|
-
stages.push(outStream);
|
|
235
|
-
try {
|
|
236
|
-
await pipeline(stages);
|
|
237
|
-
logger.info("pipeline finished cleanly");
|
|
238
|
-
}
|
|
239
|
-
catch (err) {
|
|
240
|
-
if (err.code === 'ERR_STREAM_PREMATURE_CLOSE') {
|
|
241
|
-
logger.info("Stream closed by limiter.");
|
|
242
|
-
}
|
|
243
|
-
else {
|
|
244
|
-
logger.error("pipeline error:", err);
|
|
245
|
-
process.exitCode = 3;
|
|
246
|
-
}
|
|
247
|
-
}
|
|
248
|
-
}
|
|
112
|
+
await attack(url, opts);
|
|
249
113
|
}
|
|
250
114
|
catch (e) {
|
|
251
115
|
logger.error(`process crashed with: ${e}`);
|
|
252
116
|
process.exitCode = 8;
|
|
253
117
|
}
|
|
254
118
|
}
|
|
255
|
-
function
|
|
256
|
-
const
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
}
|
|
261
|
-
function makeSftpConfig(inputFile, opts) {
|
|
262
|
-
let privateKey = undefined;
|
|
263
|
-
if (opts.key) {
|
|
264
|
-
privateKey = fs.readFileSync(opts.key, { encoding: 'utf-8' });
|
|
119
|
+
function collect(value, previous) {
|
|
120
|
+
const keyval = value.split("=", 2);
|
|
121
|
+
if (keyval.length == 2 && keyval[0]) {
|
|
122
|
+
previous[keyval[0]] = keyval[1];
|
|
123
|
+
return previous;
|
|
265
124
|
}
|
|
266
|
-
else
|
|
267
|
-
|
|
268
|
-
}
|
|
269
|
-
let config = {
|
|
270
|
-
host: inputFile.hostname,
|
|
271
|
-
port: Number(inputFile.port) ?? 22,
|
|
272
|
-
username: inputFile.username
|
|
273
|
-
};
|
|
274
|
-
if (inputFile.password) {
|
|
275
|
-
config.password = inputFile.password;
|
|
276
|
-
}
|
|
277
|
-
if (privateKey) {
|
|
278
|
-
config.privateKey = privateKey;
|
|
125
|
+
else {
|
|
126
|
+
return previous;
|
|
279
127
|
}
|
|
280
|
-
return config;
|
|
281
|
-
}
|
|
282
|
-
function getDecompressedStream(sourceStream) {
|
|
283
|
-
const gunzip = createGunzip();
|
|
284
|
-
// Forward errors from the source to the gunzip stream
|
|
285
|
-
sourceStream.on('error', (err) => {
|
|
286
|
-
logger.error("gunzip error: ", err.message);
|
|
287
|
-
gunzip.emit('error', err);
|
|
288
|
-
});
|
|
289
|
-
return sourceStream.pipe(gunzip);
|
|
290
128
|
}
|
|
291
129
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/input/alephseq.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import {
|
|
2
|
-
export declare function
|
|
1
|
+
import { Transform } from "stream";
|
|
2
|
+
export declare function transform(_opts: any): Promise<Transform>;
|
|
3
3
|
//# sourceMappingURL=alephseq.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"alephseq.d.ts","sourceRoot":"","sources":["../../src/input/alephseq.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"alephseq.d.ts","sourceRoot":"","sources":["../../src/input/alephseq.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAA0B,MAAM,QAAQ,CAAC;AAK3D,wBAAsB,SAAS,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO,CAAC,SAAS,CAAC,CA8D9D"}
|