collect logs using a sudo script

docker logs can only be read by root
This commit is contained in:
Girish Ramakrishnan
2015-08-08 19:04:56 -07:00
parent 8cd13bd43f
commit c4c463cbc2
4 changed files with 51 additions and 38 deletions
+8 -38
View File
@@ -7,53 +7,23 @@
// !! No console.log() allowed // !! No console.log() allowed
// !! Do not set DEBUG // !! Do not set DEBUG
var supervisor = require('supervisord-eventlistener'), var assert = require('assert'),
mailer = require('./src/mailer.js'),
safe = require('safetydance'), safe = require('safetydance'),
assert = require('assert'), supervisor = require('supervisord-eventlistener'),
exec = require('child_process').exec, path = require('path'),
util = require('util'), util = require('util');
mailer = require('./src/mailer.js');
var gLastNotifyTime = {}; var gLastNotifyTime = {};
var gCooldownTime = 1000 * 60 * 5; // 5 min var gCooldownTime = 1000 * 60 * 5; // 5 min
var COLLECT_LOGS_CMD = path.join(__dirname, 'src/scripts/collectlogs.sh');
function collectLogs(program, callback) { function collectLogs(program, callback) {
assert.strictEqual(typeof program, 'string'); assert.strictEqual(typeof program, 'string');
assert.strictEqual(typeof callback, 'function'); assert.strictEqual(typeof callback, 'function');
var logFilePath = util.format('/var/log/supervisor/%s.log', program); var logs = safe.child_process.execSync('sudo ' + COLLECT_LOGS_CMD + ' ' + program, { encoding: 'utf8' });
callback(null, logs);
var boxLogData = safe.fs.readFileSync(logFilePath, 'utf-8');
if (boxLogData === null) return callback(safe.error);
var boxLogLines = boxLogData.split('\n').slice(-100);
var dockerLogPath = '/var/log/upstart/docker.log';
var dockerLogData = safe.fs.readFileSync(dockerLogPath, 'utf-8');
if (dockerLogData === null) return callback(safe.error);
var dockerLogLines = dockerLogData.split('\n').slice(-100);
exec('dmesg', function (error, stdout /*, stderr */) {
if (error) console.error(error);
var lines = stdout.split('\n');
var dmesgLogLines = lines.slice(-100);
var result = '';
result += program + '.log\n';
result += '-------------------------------------\n';
result += boxLogLines.join('\n');
result += '\n\n';
result += 'dmesg\n';
result += '-------------------------------------\n';
result += dmesgLogLines.join('\n');
result += '\n\n';
result += 'docker\n';
result += '-------------------------------------\n';
result += dockerLogLines.join('\n');
callback(null, result);
});
} }
supervisor.on('PROCESS_STATE_EXITED', function (headers, data) { supervisor.on('PROCESS_STATE_EXITED', function (headers, data) {
+3
View File
@@ -24,3 +24,6 @@ yellowtent ALL=(root) NOPASSWD: /home/yellowtent/box/src/scripts/reloadcollectd.
Defaults!/home/yellowtent/box/src/scripts/backupswap.sh env_keep="HOME BOX_ENV" Defaults!/home/yellowtent/box/src/scripts/backupswap.sh env_keep="HOME BOX_ENV"
yellowtent ALL=(root) NOPASSWD: /home/yellowtent/box/src/scripts/backupswap.sh yellowtent ALL=(root) NOPASSWD: /home/yellowtent/box/src/scripts/backupswap.sh
Defaults!/home/yellowtent/box/src/scripts/collectlogs.sh env_keep="HOME BOX_ENV"
yellowtent ALL=(root) NOPASSWD: /home/yellowtent/box/src/scripts/collectlogs.sh
+39
View File
@@ -0,0 +1,39 @@
#!/bin/bash
set -eu -o pipefail
if [[ $EUID -ne 0 ]]; then
echo "This script should be run as root." >&2
exit 1
fi
if [[ $# == 1 && "$1" == "--check" ]]; then
echo "OK"
exit 0
fi
if [ $# -lt 1 ]; then
echo "Usage: collectlogs.sh <program>"
exit 1
fi
readonly program_name=$1
echo "${program_name}.log"
echo "-------------------"
tail --lines=100 /var/log/supervisor/${program_name}.log
echo
echo
echo "dmesg"
echo "-----"
dmesg | tail --lines=100
echo
echo
echo "docker"
echo "------"
tail --lines=100 /var/log/upstart/docker.log
echo
echo
+1
View File
@@ -16,6 +16,7 @@ scripts=("${SOURCE_DIR}/scripts/rmappdir.sh" \
"${SOURCE_DIR}/scripts/restoreapp.sh" \ "${SOURCE_DIR}/scripts/restoreapp.sh" \
"${SOURCE_DIR}/scripts/reboot.sh" \ "${SOURCE_DIR}/scripts/reboot.sh" \
"${SOURCE_DIR}/scripts/backupswap.sh" \ "${SOURCE_DIR}/scripts/backupswap.sh" \
"${SOURCE_DIR}/scripts/collectlogs.sh" \
"${SOURCE_DIR}/scripts/reloadcollectd.sh") "${SOURCE_DIR}/scripts/reloadcollectd.sh")
for script in "${scripts[@]}"; do for script in "${scripts[@]}"; do