Skip to content

Commit

Permalink
fix(pkg) Upgrade for Node 14 from Node 12
Browse files Browse the repository at this point in the history
v2 was only compatible with Node 12. These changes upgrade the code to be compatible Node 14.
- Fix how to tail a file and utilize the upgraded fs
- Implemented modern eslint rules.
- Adding deprecation warning as `logdna-agent` will lose support
  • Loading branch information
esatterwhite authored and arani-sen committed May 31, 2022
1 parent c352dcd commit f0d219d
Show file tree
Hide file tree
Showing 18 changed files with 349 additions and 503 deletions.
26 changes: 0 additions & 26 deletions .circleci/config.yml

This file was deleted.

77 changes: 77 additions & 0 deletions Jenkinsfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
def TRIGGER_PATTERN = ".*@logdnabot.*"
def PROJECT_NAME = "logdna-agent"

pipeline {
agent {label 'ec2-fleet'}

options {
timestamps()
ansiColor 'xterm'
}

triggers {
issueCommentTrigger(TRIGGER_PATTERN)
}

environment {
NPM_CONFIG_CACHE = '.npm'
NPM_CONFIG_USERCONFIG = '.npmrc'
SPAWN_WRAP_SHIM_ROOT = '.npm'
}

stages {
stage('Test Suite') {
matrix {
axes {
axis {
name 'NODE_VERSION'
values '14', '16'
}
}

when {
not {
changelog '\\[skip ci\\]'
}
}


agent {
docker {
image "us.gcr.io/logdna-k8s/node:${NODE_VERSION}-ci"
customWorkspace "${PROJECT_NAME}-${BUILD_NUMBER}"
}
}

stages {
stage('Install') {
steps {
sh "mkdir -p ${NPM_CONFIG_CACHE} coverage"
sh 'npm install'
}
}

stage('Test') {
steps {
sh 'npm test'
}

post {
always {
publishHTML target: [
allowMissing: false,
alwaysLinkToLastBuild: false,
keepAll: true,
reportDir: 'coverage/lcov-report',
reportFiles: 'index.html',
reportName: "coverage-node-v${NODE_VERSION}"
]
}
}
}
}
}
}

}
}
3 changes: 2 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
# LogDNA Agent

LogDNA Agent streams from log files to your LogDNA account. Works with Linux, Windows, and macOS Servers.

## :warning: Deprecation Warning
logdna-agent will soon be deprecated and will cease to have support. Please refer to [LogDNA Agent V2](https://github.com/logdna/logdna-agent-v2) for all future implementations.
## Getting Started

### From an Official Release
Expand Down
140 changes: 101 additions & 39 deletions index.js
Original file line number Diff line number Diff line change
@@ -1,19 +1,20 @@
/* eslint-disable no-multi-str */ // Adding this to be able to better format the console logs
'use strict'

// External Modules
const fs = require('fs')
const os = require('os')
const async = require('async')
const debug = require('debug')('logdna:index')
const fs = require('fs')
const getos = require('getos')
const os = require('os')
const {Command} = require('commander')
const properties = require('properties')
const request = require('request')

// Internal Modules
const start = require('./lib/start.js')
const pkg = require('./package.json')
const utils = require('./lib/utils')
const utils = require('./lib/utils.js')

// Constants
const HOSTNAME_IP_REGEX = /[^0-9a-zA-Z\-.]/g
Expand All @@ -29,34 +30,76 @@ process.title = 'logdna-agent'
commander._name = 'logdna-agent'
commander
.version(pkg.version, '-v, --version')
.description('This agent collect and ship logs for processing. Defaults to /var/log if run without parameters.')
.option('-c, --config <file>', `uses alternate config file (default: ${config.DEFAULT_CONF_FILE})`)
.description(
'This agent collects and ships logs for processing.'
+ ' Defaults to /var/log if run without parameters.'
)
.option(
'-c, --config <file>'
, `Uses alternate config file (default: ${config.DEFAULT_CONF_FILE})`
)
.option('-k, --key <key>', 'sets your LogDNA Ingestion Key in the config')
.option('-d, --logdir <dir>', 'adds log directories to config, supports glob patterns', utils.appender(), [])
.option('-f, --logfile <file>', 'adds log files to config', utils.appender(), [])
.option('-e, --exclude <file>', 'exclude files from logdir', utils.appender(), [])
.option(
'-d, --logdir <dir>'
, 'Adds log directories to config, supports glob patterns'
, utils.appender()
, []
)
.option('-f, --logfile <file>', 'Adds log files to config', utils.appender(), [])
.option('-e, --exclude <file>', 'Exclude files from logdir', utils.appender(), [])
.option('-r, --exclude-regex <pattern>', 'filter out lines matching pattern')
.option('-n, --hostname <hostname>', `uses alternate hostname (default: ${os.hostname().replace('.ec2.internal', '')})`)
.option('-t, --tags <tags>', 'add tags for this host, separate multiple tags by comma', utils.appender(), [])
.option('-l, --list [params]', 'show the saved configuration (all unless params specified)', utils.appender(), false)
.option('-u, --unset <params>', 'clear some saved configurations (use "all" to unset all except key)', utils.appender(), [])
.option('-s, --set [key=value]', 'set config variables', utils.appender(), false)
.option(
'-n, --hostname <hostname>'
, `Uses alternate hostname (default: ${os.hostname().replace('.ec2.internal', '')})`
)
.option(
'-t, --tags <tags>',
'Add tags for this host, separate multiple tags by comma'
, utils.appender(),
[]
)
.option(
'-l, --list [params]'
, 'Show the saved configuration (all unless params specified)'
, utils.appender(),

false
)
.option(
'-u, --unset <params>'
, 'Clear some saved configurations (use "all" to unset all except key)'
, utils.appender(),

[]
)
.option('-s, --set [key=value]', 'Set config variables', utils.appender(), false)
.on('--help', () => {
console.log(' Examples:')
console.log()
console.log(' $ logdna-agent --key YOUR_INGESTION_KEY')
console.log(' $ logdna-agent -d /home/ec2-user/logs')
console.log(' $ logdna-agent -d /home/ec2-user/logs -d /path/to/another/log_dir # multiple logdirs in 1 go')
console.log(' $ logdna-agent -d "/var/log/*.txt" # supports glob patterns')
console.log(' $ logdna-agent -d "/var/log/**/myapp.log" # myapp.log in any subfolder')
console.log('\
$ logdna-agent -d /home/ec2-user/logs -d /path/to/another/log_dir\
# multiple logdirs in 1 go\
')
console.log(' $ logdna-agent -d "/var/log/*.txt" '
+ '# supports glob patterns')
console.log(' $ logdna-agent -d "/var/log/**/myapp.log" '
+ '# myapp.log in any subfolder')
console.log(' $ logdna-agent -f /usr/local/nginx/logs/access.log')
console.log(' $ logdna-agent -f /usr/local/nginx/logs/access.log -f /usr/local/nginx/logs/error.log')
console.log(' $ logdna-agent -t production # tags')
console.log(' $ logdna-agent -f /usr/local/nginx/logs/access.log '
+ '-f /usr/local/nginx/logs/error.log')
console.log(' $ logdna-agent -t production '
+ '# tags')
console.log(' $ logdna-agent -t staging,2ndtag')
console.log(' $ logdna-agent -l tags,key,logdir # show specific config parameters')
console.log(' $ logdna-agent -l # show all')
console.log(' $ logdna-agent -u tags,logdir # unset specific entries from config')
console.log(' $ logdna-agent -u all # unset all except LogDNA API Key')
console.log(' $ logdna-agent -l tags,key,logdir '
+ '# show specific config parameters')
console.log(' $ logdna-agent -l '
+ '# show all')
console.log(' $ logdna-agent -u tags,logdir '
+ '# unset specific entries from config')
console.log(' $ logdna-agent -u all '
+ '# unset all except LogDNA API Key')
console.log()
})

Expand Down Expand Up @@ -89,7 +132,8 @@ function loadConfig(program) {
}

if (!program.key && !parsedConfig.key) {
console.error('LogDNA Ingestion Key not set! Use -k to set or use environment variable LOGDNA_AGENT_KEY.')
console.error('LogDNA Ingestion Key not set! '
+ 'Use -k to set or use environment variable LOGDNA_AGENT_KEY.')
return
}

Expand All @@ -99,11 +143,15 @@ function loadConfig(program) {

if (!program.hostname && !parsedConfig.hostname) {
if (fs.existsSync(HOSTNAME_PATH) && fs.statSync(HOSTNAME_PATH).isFile()) {
parsedConfig.hostname = fs.readFileSync(HOSTNAME_PATH).toString().trim().replace(HOSTNAME_IP_REGEX, '')
parsedConfig.hostname = fs.readFileSync(HOSTNAME_PATH)
.toString()
.trim()
.replace(HOSTNAME_IP_REGEX, '')
} else if (os.hostname()) {
parsedConfig.hostname = os.hostname().replace('.ec2.internal', '')
} else {
console.error('Hostname information cannot be found! Use -n to set or use environment variable LOGDNA_HOSTNAME.')
console.error('Hostname information cannot be found! '
+ 'Use -n to set or use environment variable LOGDNA_HOSTNAME.')
return
}
}
Expand Down Expand Up @@ -140,7 +188,8 @@ function loadConfig(program) {
const kvPair = setOption.split('=')
if (kvPair.length === 2) {
parsedConfig[kvPair[0]] = kvPair[1]
saveMessages.push(`Config variable: ${kvPair[0]} = ${kvPair[1]} has been saved to config.`)
saveMessages.push(`Config variable: ${kvPair[0]} = ${kvPair[1]} `
+ 'has been saved to config.')
} else {
saveMessages.push(`Unknown setting: ${setOption}. Usage: -s [key=value]`)
}
Expand Down Expand Up @@ -191,7 +240,8 @@ function loadConfig(program) {
// a slash. The user should be forced to provide open and closing slashes,
// otherwise it's too hard to know what's part of the pattern text.
parsedConfig.exclude_regex = re.replace(/^\//, '').replace(/\/$/, '')
saveMessages.push(`Exclude pattern: /${parsedConfig.exclude_regex}/ been saved to config.`)
saveMessages
.push(`Exclude pattern: /${parsedConfig.exclude_regex}/ been saved to config.`)
}

if (program.hostname) {
Expand Down Expand Up @@ -260,15 +310,20 @@ function loadConfig(program) {
config.awstype = responseBody.instanceType
}

const networkInterface = Object.values(os.networkInterfaces()).reduce((networkData, interfaces) => {
interfaces.forEach(interfce => networkData.push(interfce))
return networkData
}, []).filter((interfce) => {
return interfce.family && interfce.family === 'IPv4' && interfce.mac && interfce.address && (
interfce.address.startsWith('10.')
|| interfce.address.startsWith('172.')
|| interfce.address.startsWith('192.168.'))
})[0]
const networkInterface = Object.values(os.networkInterfaces())
.reduce((networkData, interfaces) => {
interfaces.forEach((interfce) => { return networkData.push(interfce) })
return networkData
}, []).filter((interfce) => {
return interfce.family
&& interfce.family === 'IPv4'
&& interfce.mac && interfce.address
&& (
interfce.address.startsWith('10.')
|| interfce.address.startsWith('172.')
|| interfce.address.startsWith('192.168.')
)
})[0]

if (networkInterface) {
if (networkInterface.mac) { config.mac = networkInterface.mac }
Expand All @@ -287,14 +342,21 @@ function loadConfig(program) {
})
}

process.on('uncaughtException', err => utils.log(`uncaught error: ${(err.stack || '').split('\r\n')}`, 'error'))
process.on('uncaughtException', (err) => {
return utils.log(`uncaught error: ${(err.stack || '').split('\r\n')}`, 'error')
})

if (require.main === module) {
commander.parse(process.argv)
const isAdmin = os.platform() === 'win32' ? require('is-administrator')() : process.getuid() === 0
const isAdmin = os.platform() === 'win32'
? require('is-administrator')()
: process.getuid() === 0

if (!isAdmin) {
console.log('You must be an Administrator (root, sudo) to run this agent! See -h or --help for more info.')
console.log('You must be an Administrator (root, sudo) to run this agent! '
+ 'See -h or --help for more info.')

process.exitCode = 1
return
}

Expand Down
23 changes: 17 additions & 6 deletions lib/config.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,24 +5,35 @@ const os = require('os')
const path = require('path')

module.exports = {
AWS_INSTANCE_CHECK_URL: 'http://169.254.169.254/latest/dynamic/instance-identity/document/'
AWS_INSTANCE_CHECK_URL:
'http://169.254.169.254/latest/dynamic/instance-identity/document/'
, COMPRESS: isNaN(process.env.COMPRESS) || process.env.COMPRESS === '1'
, DEFAULT_CONF_FILE: os.platform() !== 'win32' ? '/etc/logdna.conf' : path.join(process.env.ALLUSERSPROFILE, '/logdna/logdna.conf')
, DEFAULT_LOG_PATH: os.platform() !== 'win32' ? '/var/log' : path.join(process.env.ALLUSERSPROFILE, '/logs')
, DEFAULT_WINTAIL_FILE: os.platform() !== 'win32' ? '/etc/winTail.ps1' : path.join(process.env.ALLUSERSPROFILE, '/logdna/winTail.ps1')
, DEFAULT_CONF_FILE: os.platform() !== 'win32'
? '/etc/logdna.conf'
: path.join(process.env.ALLUSERSPROFILE, '/logdna/logdna.conf')
, DEFAULT_LOG_PATH: os.platform() !== 'win32'
? '/var/log'
: path.join(process.env.ALLUSERSPROFILE, '/logs')
, DEFAULT_WINTAIL_FILE: os.platform() !== 'win32'
? '/etc/winTail.ps1'
: path.join(process.env.ALLUSERSPROFILE, '/logdna/winTail.ps1')
, FILEQUEUE_PATH: os.platform() !== 'win32'
? (process.env.FILEQUEUE_PATH || '/tmp')
: path.join(process.env.ALLUSERSPROFILE, (process.env.FILEQUEUE_PATH || '/tmp'))
, FLUSH_INTERVAL: process.env.FLUSH_INTERVAL || 1000
, FLUSH_LIMIT: process.env.FLUSH_LIMIT
, PROXY: process.env.HTTPS_PROXY || process.env.HTTP_PROXY
, LOGDNA_LOGENDPOINT: process.env.LDLOGPATH || process.env.INGESTION_ENDPOINT || '/logs/agent'
, LOGDNA_LOGENDPOINT: process.env.LDLOGPATH
|| process.env.INGESTION_ENDPOINT
|| '/logs/agent'
, LOGDNA_LOGHOST: process.env.LDLOGHOST || process.env.INGESTION_HOST || 'logs.logdna.com'
, LOGDNA_LOGPORT: process.env.LDLOGPORT || process.env.INGESTION_PORT || 443
, LOGDNA_LOGSSL: isNaN(process.env.LDLOGSSL) ? true : +process.env.LDLOGSSL
, RESCAN_INTERVAL: process.env.RESCAN_INTERVAL || 60000 // 1 min
, RESCAN_INTERVAL_K8S: process.RESCAN_INTERVAL_K8S || 10000 // 10 sec
, SOCKET_PATH: process.env.LOGDNA_DOCKER_SOCKET || process.env.DOCKER_SOCKET || '/var/run/docker.sock'
, SOCKET_PATH: process.env.LOGDNA_DOCKER_SOCKET
|| process.env.DOCKER_SOCKET
|| '/var/run/docker.sock'
, TAIL_MODE: process.env.TAIL_MODE || 'trs'
, TRS_READ_INTERVAL: process.env.TRS_READ_INTERVAL || 1000 // 1 sec
, TRS_READ_TIMEOUT: process.env.TRS_READ_TIMEOUT || 300000 // 5 min
Expand Down
Loading

0 comments on commit f0d219d

Please sign in to comment.