From c4c463cbc2b6dc3488713710f006c9dc55bd4e7c Mon Sep 17 00:00:00 2001 From: Girish Ramakrishnan Date: Sat, 8 Aug 2015 19:04:56 -0700 Subject: [PATCH] collect logs using a sudo script docker logs can only be read by root --- crashnotifier.js | 46 +++++++------------------------------- setup/container/sudoers | 3 +++ src/scripts/collectlogs.sh | 39 ++++++++++++++++++++++++++++++++ src/test/checkInstall | 1 + 4 files changed, 51 insertions(+), 38 deletions(-) create mode 100755 src/scripts/collectlogs.sh diff --git a/crashnotifier.js b/crashnotifier.js index bfc6d46a6..48e8e40ff 100644 --- a/crashnotifier.js +++ b/crashnotifier.js @@ -7,53 +7,23 @@ // !! No console.log() allowed // !! Do not set DEBUG -var supervisor = require('supervisord-eventlistener'), +var assert = require('assert'), + mailer = require('./src/mailer.js'), safe = require('safetydance'), - assert = require('assert'), - exec = require('child_process').exec, - util = require('util'), - mailer = require('./src/mailer.js'); + supervisor = require('supervisord-eventlistener'), + path = require('path'), + util = require('util'); var gLastNotifyTime = {}; var gCooldownTime = 1000 * 60 * 5; // 5 min +var COLLECT_LOGS_CMD = path.join(__dirname, 'src/scripts/collectlogs.sh'); function collectLogs(program, callback) { assert.strictEqual(typeof program, 'string'); assert.strictEqual(typeof callback, 'function'); - var logFilePath = util.format('/var/log/supervisor/%s.log', program); - - 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); - }); + var logs = safe.child_process.execSync('sudo ' + COLLECT_LOGS_CMD + ' ' + program, { encoding: 'utf8' }); + callback(null, logs); } supervisor.on('PROCESS_STATE_EXITED', function (headers, data) { diff --git a/setup/container/sudoers b/setup/container/sudoers index e2ce8f7b3..5e4330109 100644 --- a/setup/container/sudoers +++ b/setup/container/sudoers @@ -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" 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 diff --git a/src/scripts/collectlogs.sh b/src/scripts/collectlogs.sh new file mode 100755 index 000000000..4aa922fe8 --- /dev/null +++ b/src/scripts/collectlogs.sh @@ -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 " + 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 + + + diff --git a/src/test/checkInstall b/src/test/checkInstall index c6f69dd33..3424d1037 100755 --- a/src/test/checkInstall +++ b/src/test/checkInstall @@ -16,6 +16,7 @@ scripts=("${SOURCE_DIR}/scripts/rmappdir.sh" \ "${SOURCE_DIR}/scripts/restoreapp.sh" \ "${SOURCE_DIR}/scripts/reboot.sh" \ "${SOURCE_DIR}/scripts/backupswap.sh" \ + "${SOURCE_DIR}/scripts/collectlogs.sh" \ "${SOURCE_DIR}/scripts/reloadcollectd.sh") for script in "${scripts[@]}"; do