Skip to content

Commit

Permalink
Merge pull request #69 from dappnode/v0.1.10
Browse files Browse the repository at this point in the history
v0.1.10
  • Loading branch information
eduadiez authored Aug 10, 2018
2 parents 4b58ead + 07e4714 commit c168a7c
Show file tree
Hide file tree
Showing 21 changed files with 343 additions and 63 deletions.
47 changes: 47 additions & 0 deletions build/src/src/calls/createGetUserActionLogs.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
const fs = require('fs');
const {promisify} = require('util');
const paramsDefault = require('params');

// CALL DOCUMENTATION:
// > kwargs: {
// id,
// isCore,
// options
// }
// > result: {
// id,
// logs: <String with escape codes> (string)
// }

function createGetUserActionLogs({
params = paramsDefault,
}) {
const getUserActionLogs = async ({
options,
}) => {
const readFileAsync = promisify(fs.readFile);
const {userActionLogsFilename} = params;

if (!fs.existsSync(userActionLogsFilename)) {
return {
message: 'UserActionLogs are still empty, returning black',
result: '',
};
}
const userActionLogs = await readFileAsync(
userActionLogsFilename,
{encoding: 'utf8'}
);

return {
message: 'Got userActionLogs',
result: userActionLogs,
};
};

// Expose main method
return getUserActionLogs;
}


module.exports = createGetUserActionLogs;
3 changes: 2 additions & 1 deletion build/src/src/calls/createInstallPackage.js
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,8 @@ function createInstallPackage({

return {
message: 'Installed ' + packageReq.name + ' version: ' + packageReq.ver,
log: true,
logMessage: true,
userAction: true,
};
};

Expand Down
1 change: 0 additions & 1 deletion build/src/src/calls/createListPackages.js
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,6 @@ function createListPackages({
return {
message: 'Listing ' + dnpList.length + ' packages',
result: dnpList,
logMessage: true,
};
};

Expand Down
54 changes: 54 additions & 0 deletions build/src/src/calls/createManagePorts.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
const dockerDefault = require('modules/docker');

// CALL DOCUMENTATION:
// > kwargs: { ports, logId }
// > result: -

function createManagePorts({
docker = dockerDefault,
}) {
const managePorts = async ({
action,
ports,
}) => {
// ports should be an array of numerical ports
// [5000, 5001]
if (!Array.isArray(ports)) {
throw Error('ports variable must be an array: '+JSON.stringify(ports));
}

let msg;
for (const port of ports) {
switch (action) {
case 'open':
await docker.openPort(port);
msg = 'Opened';
break;
case 'close':
await docker.closePort(port);
msg = 'Closed';
break;
default:
throw Error('Unkown manage ports action: '+action);
}
}

return {
message: msg+' ports '+ports.join(', '),
logMessage: true,
userAction: true,
};
};

// Expose main method
return managePorts;
}

// function getPorts(MANIFEST) {
// return (MANIFEST && MANIFEST.image && MANIFEST.image.ports)
// ? MANIFEST.image.ports.map((p) => p.split(':')[0])
// : [];
// }


module.exports = createManagePorts;
44 changes: 44 additions & 0 deletions build/src/src/calls/createManagePorts.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
const chai = require('chai');
const expect = require('chai').expect;
const createManagePorts = require('calls/createManagePorts');

chai.should();

describe('Call function: managePorts', function() {
const openedPorts = [];
const dockerMock = {
openPort: async (port) => {
openedPorts.push(port);
},
};

const managePorts = createManagePorts({
docker: dockerMock,
});

it('should open the requested ports', async () => {
const ports = [5000, 5001];
const res = await managePorts({
action: 'open',
ports,
});
// Check opened ports
expect(ports).to.deep.equal(openedPorts);
// Check response message
expect(res).to.be.ok;
expect(res).to.have.property('message');
});

it('should throw an error with wrong ports variable', async () => {
let error = '--- managePorts did not throw ---';
try {
await managePorts({
action: 'open',
ports: 'not an array',
});
} catch (e) {
error = e.message;
}
expect(error).to.include('ports variable must be an array');
});
});
20 changes: 2 additions & 18 deletions build/src/src/calls/createRemovePackage.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
const fs = require('fs');
const getPath = require('utils/getPath');
const shellSync = require('utils/shell');
const parse = require('utils/parse');
const logUI = require('utils/logUI');
const paramsDefault = require('params');
const dockerDefault = require('modules/docker');
Expand Down Expand Up @@ -34,15 +33,6 @@ function createRemovePackage({
throw Error('The installer cannot be restarted');
}

// Close ports
logUI({logId, pkg: 'all', msg: 'closing ports...'});
try {
await closePorts(dockerComposePath, docker);
} catch (e) {
logUI({logId, pkg: 'all', msg: 'Error closing ports '+(e ? e.message : '')});
}


// Remove container (and) volumes
logUI({logId, pkg: 'all', msg: 'Shutting down containers...'});
await docker.compose.down(dockerComposePath, {volumes: Boolean(deleteVolumes)});
Expand All @@ -52,20 +42,14 @@ function createRemovePackage({

return {
message: 'Removed package: ' + id,
log: true,
logMessage: true,
userAction: true,
};
};

// Expose main method
return removePackage;
}

async function closePorts(dockerComposePath, docker) {
const ports = parse.dockerComposePorts(dockerComposePath);
for (const port of ports) {
await docker.closePort(port);
}
}


module.exports = createRemovePackage;
1 change: 1 addition & 0 deletions build/src/src/calls/createRestartPackage.js
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ function createRestartPackage({
return {
message: 'Restarted package: ' + id,
logMessage: true,
userAction: true,
};
};

Expand Down
3 changes: 2 additions & 1 deletion build/src/src/calls/createRestartPackageVolumes.js
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,8 @@ function createRestartPackageVolumes({

return {
message: 'Restarted '+id+' volumes: ' + packageVolumes.join(', '),
log: true,
logMessage: true,
userAction: true,
};
};
}
Expand Down
3 changes: 2 additions & 1 deletion build/src/src/calls/createTogglePackage.js
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,8 @@ function createTogglePackage({

return {
message: 'successfully toggled package: ' + id,
log: true,
logMessage: true,
userAction: true,
};
};

Expand Down
6 changes: 4 additions & 2 deletions build/src/src/calls/createUpdatePackageEnv.js
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,8 @@ function createUpdatePackageEnv({
if (!restart) {
return {
message: 'Updated envs of ' + id,
log: true,
logMessage: true,
userAction: true,
};
}

Expand All @@ -49,7 +50,8 @@ function createUpdatePackageEnv({

return {
message: 'Updated envs and restarted ' + id,
log: true,
logMessage: true,
userAction: true,
};
};

Expand Down
13 changes: 13 additions & 0 deletions build/src/src/eventBus.js
Original file line number Diff line number Diff line change
@@ -1,12 +1,25 @@
const EventEmitter = require('events');

/* HOW TO:
- ON:
eventBus.on(eventBusTag.logUI, (data) => {
doStuff(data);
});
- EMIT:
eventBus.emit(eventBusTag.logUI, data);
*/

class MyEmitter extends EventEmitter {}

const eventBus = new MyEmitter();

const eventBusTag = {
logUI: 'EVENT_BUS_LOGUI',
call: 'EVENT_BUS_CALL',
logUserAction: 'EVENT_BUS_LOGUSERACTION',
};

module.exports = {
Expand Down
31 changes: 27 additions & 4 deletions build/src/src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
const autobahn = require('autobahn');
const {eventBus, eventBusTag} = require('eventBus');
const logs = require('logs.js')(module);
const logUserAction = require('logUserAction.js');

// import calls
const createInstallPackage = require('calls/createInstallPackage');
Expand All @@ -16,6 +17,8 @@ const createListPackages = require('calls/createListPackages');
const createFetchDirectory = require('calls/createFetchDirectory');
const createFetchPackageVersions = require('calls/createFetchPackageVersions');
const createFetchPackageData = require('calls/createFetchPackageData');
const createManagePorts = require('calls/createManagePorts');
const createGetUserActionLogs = require('calls/createGetUserActionLogs');

// import dependencies
const params = require('params');
Expand Down Expand Up @@ -48,6 +51,8 @@ const fetchDirectory = createFetchDirectory({getDirectory});
const fetchPackageVersions = createFetchPackageVersions({getManifest, apm});
const updatePackageEnv = createUpdatePackageEnv({});
const fetchPackageData = createFetchPackageData({getManifest});
const managePorts = createManagePorts({});
const getUserActionLogs = createGetUserActionLogs({});

// /////////////////////////////
// Connection helper functions
Expand All @@ -61,19 +66,23 @@ const register = (session, event, handler) => {
// 2. details: an object which provides call metadata
try {
const res = await handler(kwargs);

// Log internally
logUserAction.log({level: 'info', event, ...res, kwargs});
const eventShort = event.replace('.dappmanager.dnp.dappnode.eth', '');
if (res.log && res.result) logs.info('Result of '+eventShort+': '+JSON.stringify(res));
else if (res.log && !res.result) logs.info('Result of '+eventShort+': '+res.message);
else if (res.logMessage) logs.info('Result of '+eventShort+': '+res.message);
if (res.logMessage) {
logs.info('Call '+eventShort+' success: '+res.message);
}

// Return to crossbar
return JSON.stringify({
success: true,
message: res.message,
result: res.result || {},
});
} catch (err) {
logs.error(' Event: '+event+' Stack: '+err.stack);
logUserAction.log({level: 'error', event, ...error2obj(err), kwargs});
logs.error('Call '+event+' error: '+err.message+'\nStack: '+err.stack);
return JSON.stringify({
success: false,
message: err.message,
Expand All @@ -87,6 +96,10 @@ const register = (session, event, handler) => {
);
};

function error2obj(e) {
return {name: e.name, message: e.message, stack: e.stack, userAction: true};
}


// /////////////////////////////
// Configure connection:
Expand Down Expand Up @@ -114,6 +127,8 @@ connection.onopen = (session, details) => {
register(session, 'fetchDirectory.dappmanager.dnp.dappnode.eth', fetchDirectory);
register(session, 'fetchPackageVersions.dappmanager.dnp.dappnode.eth', fetchPackageVersions);
register(session, 'fetchPackageData.dappmanager.dnp.dappnode.eth', fetchPackageData);
register(session, 'managePorts.dappmanager.dnp.dappnode.eth', managePorts);
register(session, 'getUserActionLogs.dappmanager.dnp.dappnode.eth', getUserActionLogs);

eventBus.on(eventBusTag.call, (call, args, kwargs) => {
session.call(call, args, kwargs)
Expand All @@ -134,6 +149,14 @@ connection.onopen = (session, details) => {
session.publish(autobahnTag.DAppManagerLog, [data]);
logs.info('\x1b[35m%s\x1b[0m', JSON.stringify(data));
});

eventBus.on(eventBusTag.logUserAction, (data) => {
session.publish(autobahnTag.logUserAction, [data]);
});

session.subscribe(autobahnTag.logUserActionToDappmanager, (args) => {
logUserAction.log(args[0]);
});
};


Expand Down
Loading

0 comments on commit c168a7c

Please sign in to comment.