marcattacks 2.1.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 +22 -10
- 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 +11 -163
- package/dist/index.js.map +1 -1
- package/dist/input/tsv.d.ts +3 -0
- 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/output/alephseq.d.ts +1 -1
- package/dist/output/alephseq.d.ts.map +1 -1
- package/dist/output/alephseq.js +1 -1
- 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 +1 -1
- 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 +1 -1
- 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 +1 -1
- 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 +1 -1
- 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/package.json +7 -5
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,20 +102,24 @@ 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`
|
|
@@ -120,9 +131,8 @@ Provide a fix file to the mapper. See examples:
|
|
|
120
131
|
- _file path_
|
|
121
132
|
- sftp://username@host:port/path
|
|
122
133
|
- s3://accessKey:secretKey@host:port/bucket/key (or s3s://)
|
|
123
|
-
- stdin://local
|
|
124
134
|
|
|
125
|
-
### Logging (--info,--debug,--log)
|
|
135
|
+
### Logging (--info,--debug,--trace,--log)
|
|
126
136
|
|
|
127
137
|
Logging messages can be provided with the `--info`, `--debug` and `--trace` options.
|
|
128
138
|
|
|
@@ -134,5 +144,7 @@ Default the logging format is a text format that is written to stderr. This logg
|
|
|
134
144
|
|
|
135
145
|
### Compression (--z,--tar)
|
|
136
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:
|
|
148
|
+
|
|
137
149
|
- `--z` : the input file is gzipped
|
|
138
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,18 +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 {
|
|
6
|
+
import { attack } from './attacker.js';
|
|
7
|
+
import { asyncWrapProviders } from 'node:async_hooks';
|
|
16
8
|
program.version('0.1.0')
|
|
17
9
|
.argument('<file>')
|
|
18
10
|
.option('-c,--config <config>', 'config .env', path.join(process.cwd(), '.env'))
|
|
@@ -20,6 +12,7 @@ program.version('0.1.0')
|
|
|
20
12
|
.option('-t,--to <output>', 'output type', 'json')
|
|
21
13
|
.option('-m,--map <map>', 'data mapper', 'jsonata')
|
|
22
14
|
.option('--fix <what>', 'jsonata')
|
|
15
|
+
.option('-p,--param <key=value>', 'repeated params', collect, {})
|
|
23
16
|
.option('-o,--out <file>', 'output file')
|
|
24
17
|
.option('--z', 'uncompress input')
|
|
25
18
|
.option('--tar', 'untar input')
|
|
@@ -116,166 +109,21 @@ async function main() {
|
|
|
116
109
|
console.error(`need an input file`);
|
|
117
110
|
process.exit(2);
|
|
118
111
|
}
|
|
119
|
-
|
|
120
|
-
if (fs.existsSync(url)) {
|
|
121
|
-
const filePath = path.resolve(process.cwd(), url);
|
|
122
|
-
inputFile = pathToFileURL(filePath);
|
|
123
|
-
}
|
|
124
|
-
else {
|
|
125
|
-
inputFile = new URL(url);
|
|
126
|
-
}
|
|
127
|
-
logger.info(`using: ${getCleanURL(inputFile)}`);
|
|
128
|
-
let readableStream;
|
|
129
|
-
if (inputFile.protocol.startsWith("http")) {
|
|
130
|
-
readableStream = await httpReadStream(inputFile.toString());
|
|
131
|
-
}
|
|
132
|
-
else if (inputFile.protocol.startsWith("s3")) {
|
|
133
|
-
readableStream = await s3ReaderStream(inputFile, {});
|
|
134
|
-
}
|
|
135
|
-
else if (inputFile.protocol === 'sftp:') {
|
|
136
|
-
const config = makeSftpConfig(inputFile, opts);
|
|
137
|
-
let remotePath;
|
|
138
|
-
if (inputFile.pathname.match(/\/@latest:\w+$/)) {
|
|
139
|
-
const remoteDir = inputFile.pathname.replace(/\/@latest.*/, "");
|
|
140
|
-
const extension = inputFile.pathname.replace(/.*\/@latest:/, "");
|
|
141
|
-
remotePath = await sftpLatestFile(config, remoteDir, extension);
|
|
142
|
-
}
|
|
143
|
-
else {
|
|
144
|
-
remotePath = inputFile.pathname;
|
|
145
|
-
}
|
|
146
|
-
readableStream = await sftpReadStream(remotePath, config);
|
|
147
|
-
}
|
|
148
|
-
else if (inputFile.protocol === 'stdin:') {
|
|
149
|
-
readableStream = process.stdin;
|
|
150
|
-
}
|
|
151
|
-
else {
|
|
152
|
-
readableStream = fs.createReadStream(inputFile);
|
|
153
|
-
}
|
|
154
|
-
const stages = [readableStream];
|
|
155
|
-
if (opts.z) {
|
|
156
|
-
stages.push(createUncompressedStream());
|
|
157
|
-
}
|
|
158
|
-
if (opts.tar) {
|
|
159
|
-
stages.push(await createUntarredStream());
|
|
160
|
-
}
|
|
161
|
-
if (opts.from) {
|
|
162
|
-
const mod = await loadPlugin(opts.from, 'input');
|
|
163
|
-
const transformer = await mod.transform({ path: inputFile });
|
|
164
|
-
transformer.on('error', (error) => {
|
|
165
|
-
if (error.code === 'ERR_STREAM_PREMATURE_CLOSE') {
|
|
166
|
-
stages[0]?.destroy();
|
|
167
|
-
}
|
|
168
|
-
else {
|
|
169
|
-
logger.error("input stream processing error: ", error.message);
|
|
170
|
-
stages[0]?.destroy();
|
|
171
|
-
process.exitCode = 2;
|
|
172
|
-
}
|
|
173
|
-
});
|
|
174
|
-
transformer.on('finish', () => logger.debug('writeable finished'));
|
|
175
|
-
transformer.on('end', () => logger.debug('readable ended'));
|
|
176
|
-
transformer.on('close', () => logger.debug('stream closed'));
|
|
177
|
-
stages.push(transformer);
|
|
178
|
-
}
|
|
179
|
-
else {
|
|
180
|
-
console.error(`Need --from`);
|
|
181
|
-
process.exit(1);
|
|
182
|
-
}
|
|
183
|
-
if (opts.count || opts.skip) {
|
|
184
|
-
stages.push(createCountableSkippedStream(opts.count, opts.skip));
|
|
185
|
-
}
|
|
186
|
-
stages.push(createVerboseStream());
|
|
187
|
-
if (opts.map) {
|
|
188
|
-
const mod = await loadPlugin(opts.map, 'transform');
|
|
189
|
-
const transformer = await mod.transform(opts.fix);
|
|
190
|
-
stages.push(transformer);
|
|
191
|
-
}
|
|
192
|
-
let outStream;
|
|
193
|
-
if (opts.out === '@slow') {
|
|
194
|
-
outStream = new SlowWritable({ delayMs: 100 });
|
|
195
|
-
}
|
|
196
|
-
else if (opts.out === '@errors') {
|
|
197
|
-
outStream = new SlowWritable({ simulateErrorEveryN: 2 });
|
|
198
|
-
}
|
|
199
|
-
else if (opts.out) {
|
|
200
|
-
if (opts.out.startsWith("sftp")) {
|
|
201
|
-
const url = new URL(opts.out);
|
|
202
|
-
if (process.env.SFTP_USERNAME) {
|
|
203
|
-
url.username = process.env.SFTP_USERNAME;
|
|
204
|
-
}
|
|
205
|
-
if (process.env.SFTP_PASSWORD) {
|
|
206
|
-
url.password = process.env.SFTP_PASSWORD;
|
|
207
|
-
}
|
|
208
|
-
const config = makeSftpConfig(url, opts);
|
|
209
|
-
logger.info(`put ${getCleanURL(url)}`);
|
|
210
|
-
outStream = await sftpWriteStream(url.href, config);
|
|
211
|
-
}
|
|
212
|
-
else if (opts.out.startsWith("s3")) {
|
|
213
|
-
const url = new URL(opts.out);
|
|
214
|
-
if (process.env.S3_ACCESS_KEY) {
|
|
215
|
-
url.username = process.env.S3_ACCESS_KEY;
|
|
216
|
-
}
|
|
217
|
-
if (process.env.S3_SECRET_KEY) {
|
|
218
|
-
url.password = process.env.S3_SECRET_KEY;
|
|
219
|
-
}
|
|
220
|
-
logger.info(`put ${getCleanURL(url)}`);
|
|
221
|
-
outStream = await s3WriterStream(url, {});
|
|
222
|
-
}
|
|
223
|
-
else {
|
|
224
|
-
outStream = fs.createWriteStream(opts.out, { encoding: 'utf-8' });
|
|
225
|
-
}
|
|
226
|
-
}
|
|
227
|
-
else {
|
|
228
|
-
outStream = process.stdout;
|
|
229
|
-
}
|
|
230
|
-
if (opts.to) {
|
|
231
|
-
const mod = await loadPlugin(opts.to, 'output');
|
|
232
|
-
stages.push(await mod.transform());
|
|
233
|
-
stages.push(outStream);
|
|
234
|
-
try {
|
|
235
|
-
await pipeline(stages);
|
|
236
|
-
logger.info("pipeline finished cleanly");
|
|
237
|
-
}
|
|
238
|
-
catch (err) {
|
|
239
|
-
if (err.code === 'ERR_STREAM_PREMATURE_CLOSE') {
|
|
240
|
-
logger.info("Stream closed by limiter.");
|
|
241
|
-
}
|
|
242
|
-
else {
|
|
243
|
-
logger.error("pipeline error:", err);
|
|
244
|
-
process.exitCode = 3;
|
|
245
|
-
}
|
|
246
|
-
}
|
|
247
|
-
}
|
|
112
|
+
await attack(url, opts);
|
|
248
113
|
}
|
|
249
114
|
catch (e) {
|
|
250
115
|
logger.error(`process crashed with: ${e}`);
|
|
251
116
|
process.exitCode = 8;
|
|
252
117
|
}
|
|
253
118
|
}
|
|
254
|
-
function
|
|
255
|
-
const
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
}
|
|
260
|
-
function makeSftpConfig(inputFile, opts) {
|
|
261
|
-
let privateKey = undefined;
|
|
262
|
-
if (opts.key) {
|
|
263
|
-
privateKey = fs.readFileSync(opts.key, { encoding: 'utf-8' });
|
|
264
|
-
}
|
|
265
|
-
else if (opts.keyEnv) {
|
|
266
|
-
privateKey = process.env[opts.keyEnv];
|
|
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;
|
|
267
124
|
}
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
port: Number(inputFile.port) ?? 22,
|
|
271
|
-
username: inputFile.username
|
|
272
|
-
};
|
|
273
|
-
if (inputFile.password) {
|
|
274
|
-
config.password = inputFile.password;
|
|
275
|
-
}
|
|
276
|
-
if (privateKey) {
|
|
277
|
-
config.privateKey = privateKey;
|
|
125
|
+
else {
|
|
126
|
+
return previous;
|
|
278
127
|
}
|
|
279
|
-
return config;
|
|
280
128
|
}
|
|
281
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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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tsv.d.ts","sourceRoot":"","sources":["../../src/input/tsv.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAA0B,MAAM,QAAQ,CAAC;AAK3D,wBAAsB,SAAS,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO,CAAC,SAAS,CAAC,CAgD9D"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { Transform } from "stream";
|
|
2
|
+
import log4js from 'log4js';
|
|
3
|
+
const logger = log4js.getLogger();
|
|
4
|
+
export async function transform(_opts) {
|
|
5
|
+
let recordNum = 0;
|
|
6
|
+
let tail = "";
|
|
7
|
+
let keys;
|
|
8
|
+
return new Transform({
|
|
9
|
+
objectMode: true,
|
|
10
|
+
transform(chunk, _encoding, callback) {
|
|
11
|
+
const lines = (tail + chunk.toString()).split(/\r?\n/);
|
|
12
|
+
tail = lines.pop() || "";
|
|
13
|
+
for (const line of lines) {
|
|
14
|
+
recordNum++;
|
|
15
|
+
if (!line.trim())
|
|
16
|
+
continue;
|
|
17
|
+
const fields = line.split("\t");
|
|
18
|
+
if (!keys) {
|
|
19
|
+
keys = fields;
|
|
20
|
+
continue;
|
|
21
|
+
}
|
|
22
|
+
if (keys.length != fields.length) {
|
|
23
|
+
logger.error(`Error on line ${recordNum}, unexpected columns`);
|
|
24
|
+
continue;
|
|
25
|
+
}
|
|
26
|
+
let data = {};
|
|
27
|
+
for (let i = 0; i < keys.length; i++) {
|
|
28
|
+
data[keys[i]] = fields[i];
|
|
29
|
+
}
|
|
30
|
+
this.push(data);
|
|
31
|
+
}
|
|
32
|
+
callback();
|
|
33
|
+
},
|
|
34
|
+
flush(callback) {
|
|
35
|
+
if (tail.trim()) {
|
|
36
|
+
try {
|
|
37
|
+
this.push(JSON.parse(tail));
|
|
38
|
+
}
|
|
39
|
+
catch (e) { /* ignore trailing whitespace */ }
|
|
40
|
+
}
|
|
41
|
+
callback();
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=tsv.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tsv.js","sourceRoot":"","sources":["../../src/input/tsv.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAA0B,MAAM,QAAQ,CAAC;AAC3D,OAAO,MAAM,MAAM,QAAQ,CAAC;AAE5B,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC;AAElC,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,KAAU;IACtC,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,IAAI,GAAG,EAAE,CAAC;IACd,IAAI,IAAe,CAAC;IAEpB,OAAO,IAAI,SAAS,CAAC;QACjB,UAAU,EAAE,IAAI;QAChB,SAAS,CAAC,KAAU,EAAE,SAAiB,EAAG,QAA2B;YACjE,MAAM,KAAK,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACvD,IAAI,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;YAEzB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACvB,SAAS,EAAE,CAAC;gBAEZ,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;oBAAE,SAAS;gBAE3B,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAEhC,IAAI,CAAC,IAAI,EAAE,CAAC;oBACR,IAAI,GAAG,MAAM,CAAC;oBACd,SAAS;gBACb,CAAC;gBAED,IAAI,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;oBAC/B,MAAM,CAAC,KAAK,CAAC,iBAAiB,SAAS,sBAAsB,CAAC,CAAC;oBAC/D,SAAS;gBACb,CAAC;gBAED,IAAI,IAAI,GAAS,EAAE,CAAC;gBAEpB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAG,CAAC,GAAG,IAAI,CAAC,MAAM,EAAG,CAAC,EAAE,EAAE,CAAC;oBACrC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;gBAC/B,CAAC;gBAED,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACpB,CAAC;YAED,QAAQ,EAAE,CAAC;QACf,CAAC;QACD,KAAK,CAAC,QAAQ;YACV,IAAI,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;gBACd,IAAI,CAAC;oBACD,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;gBAChC,CAAC;gBAAC,OAAO,CAAC,EAAE,CAAC,CAAC,gCAAgC,CAAC,CAAC;YACpD,CAAC;YACD,QAAQ,EAAE,CAAC;QACf,CAAC;KACJ,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"alephseq.d.ts","sourceRoot":"","sources":["../../src/output/alephseq.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAMnC,wBAAsB,SAAS,
|
|
1
|
+
{"version":3,"file":"alephseq.d.ts","sourceRoot":"","sources":["../../src/output/alephseq.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAMnC,wBAAsB,SAAS,CAAC,MAAM,EAAC,GAAG,GAAI,OAAO,CAAC,SAAS,CAAC,CAwC/D"}
|
package/dist/output/alephseq.js
CHANGED
|
@@ -2,7 +2,7 @@ import { Transform } from 'stream';
|
|
|
2
2
|
import { marcmap } from '../marcmap.js';
|
|
3
3
|
import log4js from 'log4js';
|
|
4
4
|
const logger = log4js.getLogger();
|
|
5
|
-
export async function transform() {
|
|
5
|
+
export async function transform(_param) {
|
|
6
6
|
return new Transform({
|
|
7
7
|
objectMode: true,
|
|
8
8
|
transform(data, _encoding, callback) {
|