1
0
mirror of https://github.com/Ylianst/MeshAgent synced 2025-12-15 07:43:50 +00:00

Updated linux-dbus and lock/unlock detection for better support across different linux distros

This commit is contained in:
Bryan Roe
2020-03-13 22:29:29 -07:00
parent 8657342978
commit b42429a368
3 changed files with 298 additions and 270 deletions

View File

@@ -18,111 +18,90 @@ try { Object.defineProperty(Array.prototype, "peek", { value: function () { retu
function dbus(address, uid)
function dbus(address, uid, env)
{
console.log(address, uid, env);
this._ObjectID = 'linux-dbus';
require('events').EventEmitter.call(this, true)
.createEvent('signal');
Object.defineProperty(this, "uid", { value: uid });
this._child = require('child_process').execFile("/bin/sh", ["sh"], { type: require('child_process').SpawnTypes.TERM, uid: uid == null ? -1 : uid });
//this._child = require('child_process').execFile("/bin/sh", ["sh"], { type: require('child_process').SpawnTypes.TERM, uid: uid == null ? -1 : uid });
this._child = require('child_process').execFile("/bin/sh", ["sh"], { env: env, uid: uid == null ? -1 : uid });
this._child.stdin.write('dbus-monitor --session "type=\'signal\', interface=\'' + address + '\'" | ( while read X; do echo "$X"; done )\n');
this._child.stderr.on('data', function (c) { });
this._child.stdout.dbus = this;
this._child.stdout._str = '';
this._child.stdout._pending = [];
this._child.on('exit', function () { });
this._child.stdout._processPending = function _processPending()
{
//console.log(JSON.stringify(this._pending, null, 1));
this._pendingTimeout = null;
var sig = {};
var tmp, tmp2;
var info = this._pending[0].split(';');
for (i = 1; i < info.length; ++i)
{
var info2 = info[i].split('=');
sig[info2[0].trim()] = info2[1].trim();
}
for (i = 1; i < this._pending.length; ++i)
{
if (this._pending[i].startsWith('string '))
{
sig['value'] = this._pending[i].split('"')[1];
}
else if (this._pending[i].startsWith('boolean '))
{
sig['value'] = JSON.parse(this._pending[i].split(' ')[1]);
}
if (this._pending[i].startsWith('array '))
{
sig['data'] = [];
for (i = i + 1; i < this._pending.length; ++i)
{
if (this._pending[i].startsWith('string '))
{
tmp = this._pending[i].split('"')[1].split('=');
tmp2 = {};
tmp2[tmp[0].trim()] = tmp[1].trim();
sig['data'].push(tmp2);
}
}
break;
}
}
this._pending = [];
setImmediate(function (e, s)
{
e.dbus.emit('signal', s);
}, this, sig);
};
this._child.stdout.on('data', function (chunk)
{
// Parse DBUS Data
if (!this.ready) { this.ready = true; return; }
if (this._pendingTimeout) { clearTimeout(this._pendingTimeout); this._pendingTimeout = null; }
//console.log('=>' + chunk.toString() + '<=');
var lines = [];
var tokens = chunk.toString().split('\r\n');
for (var i in tokens)
var i;
var tokens = chunk.toString().split('\n');
for (i in tokens)
{
if (tokens[i] == '')
if (tokens[i].startsWith('signal '))
{
// End of record
this.dbus.preParseRecords(lines);
lines = [];
}
else
{
lines.push(tokens[i]);
if (this._pending.length > 0) { this._processPending(); }
}
this._pending.push(tokens[i]);
}
if (this._pending.length > 0)
{
this._pendingTimeout = setTimeout(function (self) { self._processPending(); }, 500, this);
}
});
this.preParseRecords = function (lines)
{
var record = [];
for (var i in lines)
{
if(lines[i].startsWith('signal '))
{
if(record.length>0)
{
this.parseRecords(record);
}
record = [];
}
record.push(lines[i]);
}
if (record.length > 0)
{
this.parseRecords(record);
}
}
this.parseRecords = function (lines)
{
if (lines[0].startsWith('signal '))
{
var signal = {};
var sigtokens = lines[0].split(' ');
sigtokens.shift();
for (var i in sigtokens) {
var sigitems = sigtokens[i].split('=');
if (sigitems.length == 2) {
signal[sigitems[0]] = sigitems[1];
}
}
lines.shift();
signal.data = lines;
this.parseSignal(signal);
}
}
this.parseSignal = function(signal)
{
var data = signal.data;
signal.data = [];
for(var i=0; i<data.length; ++i)
{
if (data[i].startsWith('array '))
{
signal.data.push([]);
for(i=i+1; i<data.length; ++i)
{
this.parseSignal2(data[i], signal.data.peek());
}
}
else
{
this.parseSignal2(data[i], signal.data);
}
}
this.emit('signal', signal);
}
this.parseSignal2 = function (inputStr, outArray)
{
if(inputStr.startsWith('string '))
{
outArray.push(JSON.parse(inputStr.slice(7)));
}
else if(inputStr.startsWith('boolean '))
{
outArray.push(JSON.parse(inputStr.slice(8)));
}
}
}
module.exports = dbus;
@@ -135,3 +114,49 @@ module.exports.hasService = function hasService(name)
child.waitExit();
return (child.stdout.str.trim() != '');
};
module.exports.getServices = function getServices()
{
var grep = null;
var options = null;
for (var ax in arguments)
{
if(typeof(arguments[ax])=='string')
{
grep = arguments[ax];
}
if(typeof(arguments[ax])=='object')
{
options = arguments[ax];
}
}
if (grep) { grep = ' | grep "' + grep + '"'; } else { grep = ''; }
var child = require('child_process').execFile('/bin/sh', ['sh'], options);
child.stderr.str = ''; child.stderr.on('data', function (c) { this.str += c.toString(); });
child.stdout.str = ''; child.stdout.on('data', function (c) { this.str += c.toString(); });
child.stdin.write('dbus-send --session --dest=org.freedesktop.DBus --type=method_call --print-reply /org/freedesktop/DBus org.freedesktop.DBus.ListNames' + grep + '\nexit\n');
child.waitExit();
var ret = [];
var i, tmp;
var tokens = child.stdout.str.trim().split('\n');
for (i = 0; i < tokens.length; ++i)
{
if ((tmp = tokens[i].trim()).startsWith('array '))
{
for (i = i + 1; i < tokens.length; ++i)
{
tmp = tokens[i].trim();
if (tmp.startsWith('string '))
{
ret.push(JSON.parse(tmp.split(' ')[1]));
}
}
}
else if(tmp.startsWith('string '))
{
ret.push(JSON.parse(tmp.split(' ')[1]));
}
}
return (ret);
}