1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 |
|
10 |
|
11 |
|
12 |
|
13 |
|
14 | const
|
15 | appc = require('node-appc'),
|
16 | async = require('async'),
|
17 | fs = require('fs'),
|
18 | magik = require('./utilities').magik,
|
19 | path = require('path'),
|
20 | __ = appc.i18n(__dirname).__,
|
21 | LIST_RE = /^([^:]+):\s+(.*)$/;
|
22 |
|
23 | exports.list = list;
|
24 | exports.find = find;
|
25 |
|
26 |
|
27 |
|
28 |
|
29 |
|
30 |
|
31 |
|
32 |
|
33 |
|
34 |
|
35 |
|
36 |
|
37 |
|
38 | function list(options, callback) {
|
39 | return magik(options, callback, function (emitter, options, callback) {
|
40 | appc.subprocess.run(options.tasklist || 'tasklist', ['/FO', 'LIST', '/V'], function (code, out, err) {
|
41 | var processes = [];
|
42 |
|
43 | if (code) {
|
44 | var ex = new Error(__('Failed to run "%s"', 'tasklist'));
|
45 | emitter.emit('error', ex);
|
46 | return callback(ex);
|
47 | }
|
48 |
|
49 | out.trim().split(/\r\n\r\n|\n\n/).forEach(function (chunk) {
|
50 | var obj = parseProcessOutput(chunk);
|
51 | processes.push(obj);
|
52 | });
|
53 |
|
54 | emitter.emit('processes', processes);
|
55 | callback(null, processes);
|
56 | });
|
57 | });
|
58 | };
|
59 |
|
60 |
|
61 |
|
62 |
|
63 |
|
64 |
|
65 |
|
66 |
|
67 |
|
68 |
|
69 |
|
70 |
|
71 |
|
72 |
|
73 | function find(pid, options, callback) {
|
74 | return magik(options, callback, function (emitter, options, callback) {
|
75 | appc.subprocess.run(options.tasklist || 'tasklist', ['/FI', 'PID eq ' + pid, '/FO', 'LIST', '/V'], function (code, out, err) {
|
76 | var processes = [];
|
77 |
|
78 | if (code) {
|
79 | var ex = new Error(__('Failed to run "%s"', 'tasklist'));
|
80 | emitter.emit('error', ex);
|
81 | return callback(ex);
|
82 | }
|
83 |
|
84 | if (out.indexOf('PID:') == -1) {
|
85 |
|
86 | return callback();
|
87 | }
|
88 | var obj = parseProcessOutput(out.trim());
|
89 | emitter.emit('process', obj);
|
90 | callback(null, obj);
|
91 | });
|
92 | });
|
93 | };
|
94 |
|
95 | function parseProcessOutput(chunk) {
|
96 | var obj = {};
|
97 | chunk.split(/\r\n|\n/).forEach(function (line) {
|
98 | var m = line.match(LIST_RE);
|
99 | if (!m) return;
|
100 |
|
101 | switch (m[1].toLowerCase()) {
|
102 | case 'image name': obj.name = m[2]; break;
|
103 | case 'pid': obj.pid = ~~m[2]; break;
|
104 | case 'window title': obj.title = m[2]; break;
|
105 | }
|
106 | });
|
107 | return obj;
|
108 | }
|