in modules/backend/app/agentsHandler.js [144:204]
_collectSupportedAgents() {
const jarFilter = (file) => path.extname(file) === '.jar';
const agentArchives = fs.readdirSync(settings.agent.dists)
.filter((file) => path.extname(file) === '.zip');
const agentsPromises = _.map(agentArchives, (fileName) => {
const filePath = path.join(settings.agent.dists, fileName);
return JSZip.loadAsync(fs.readFileSync(filePath))
.then((zip) => {
const jarPath = _.find(_.keys(zip.files), jarFilter);
return JSZip.loadAsync(zip.files[jarPath].async('nodebuffer'))
.then((jar) => jar.files['META-INF/MANIFEST.MF'].async('string'))
.then((lines) =>
_.reduce(lines.split(/\s*\n+\s*/), (acc, line) => {
if (!_.isEmpty(line)) {
const arr = line.split(/\s*:\s*/);
acc[arr[0]] = arr[1];
}
return acc;
}, {}))
.then((manifest) => {
const ver = manifest['Implementation-Version'];
const buildTime = manifest['Build-Time'];
if (ver && buildTime)
return { fileName, filePath, ver, buildTime };
});
});
});
return Promise.all(agentsPromises)
.then((descs) => {
const agentDescs = _.keyBy(_.remove(descs, null), 'ver');
const latestVer = _.head(Object.keys(agentDescs).sort((a, b) => {
const aParts = a.split('.');
const bParts = b.split('.');
for (let i = 0; i < aParts.length; ++i) {
if (aParts[i] !== bParts[i])
return aParts[i] < bParts[i] ? 1 : -1;
}
if (aParts.length === bParts.length)
return 0;
return aParts.length < bParts.length ? 1 : -1;
}));
// Latest version of agent distribution.
if (latestVer)
agentDescs.current = agentDescs[latestVer];
return agentDescs;
});
}