collect logs using a sudo script
docker logs can only be read by root
This commit is contained in:
+8
-38
@@ -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) {
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Executable
+39
@@ -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
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user