1 | 'use strict'
|
2 |
|
3 | const fs = require('fs')
|
4 | const async = require('async')
|
5 | const rimraf = require('rimraf')
|
6 | const events = require('events')
|
7 | const ClinicDoctor = require('../index.js')
|
8 | const getLoggingPaths = require('@nearform/clinic-common').getLoggingPaths('doctor')
|
9 | const SystemInfoDecoder = require('../format/system-info-decoder.js')
|
10 | const TraceEventDecoder = require('../format/trace-event-decoder.js')
|
11 | const ProcessStatDecoder = require('../format/process-stat-decoder.js')
|
12 |
|
13 | class CollectAndRead extends events.EventEmitter {
|
14 | constructor (options, ...args) {
|
15 | super()
|
16 | const self = this
|
17 | const tool = this.tool = new ClinicDoctor(options)
|
18 |
|
19 | tool.collect([process.execPath, ...args], function (err, dirname) {
|
20 | self.files = getLoggingPaths({ path: dirname })
|
21 | if (err) return self.emit('error', err)
|
22 |
|
23 | self.noError = true
|
24 |
|
25 | const systemInfo = fs.createReadStream(self.files['/systeminfo'])
|
26 | .pipe(new SystemInfoDecoder())
|
27 | const traceEvent = fs.createReadStream(self.files['/traceevent'])
|
28 | .pipe(new TraceEventDecoder(systemInfo))
|
29 | const processStat = fs.createReadStream(self.files['/processstat'])
|
30 | .pipe(new ProcessStatDecoder())
|
31 |
|
32 | self.systemInfo = systemInfo
|
33 | self.traceEvent = traceEvent
|
34 | self.processStat = processStat
|
35 |
|
36 | self._setupAutoCleanup()
|
37 | self.emit('ready')
|
38 | })
|
39 | }
|
40 |
|
41 | cleanup () {
|
42 | rimraf.sync(this.files['/'])
|
43 | }
|
44 |
|
45 | _setupAutoCleanup () {
|
46 | const self = this
|
47 |
|
48 | async.parallel({
|
49 | systemInfo (done) {
|
50 | self.systemInfo.once('end', function () {
|
51 | fs.unlink(self.files['/systeminfo'], function (err) {
|
52 | if (err) return done(err)
|
53 | done(null)
|
54 | })
|
55 | })
|
56 | },
|
57 | traceEvent (done) {
|
58 | self.traceEvent.once('end', function () {
|
59 | fs.unlink(self.files['/traceevent'], function (err) {
|
60 | if (err) return done(err)
|
61 | done(null)
|
62 | })
|
63 | })
|
64 | },
|
65 | processStat (done) {
|
66 | self.processStat.once('end', function () {
|
67 | fs.unlink(self.files['/processstat'], function (err) {
|
68 | if (err) return done(err)
|
69 | done(null)
|
70 | })
|
71 | })
|
72 | }
|
73 | }, function (err, output) {
|
74 | if (err) return self.emit('error', err)
|
75 |
|
76 | fs.rmdir(self.files['/'], function (err) {
|
77 | if (err) return self.emit('error', err)
|
78 | })
|
79 | })
|
80 | }
|
81 | }
|
82 |
|
83 | module.exports = CollectAndRead
|