Skip to content

Commit f0d219d

Browse files
esatterwhitearani-sen
authored andcommitted
fix(pkg) Upgrade for Node 14 from Node 12
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
1 parent c352dcd commit f0d219d

File tree

18 files changed

+349
-503
lines changed

18 files changed

+349
-503
lines changed

.circleci/config.yml

Lines changed: 0 additions & 26 deletions
This file was deleted.

Jenkinsfile

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
def TRIGGER_PATTERN = ".*@logdnabot.*"
2+
def PROJECT_NAME = "logdna-agent"
3+
4+
pipeline {
5+
agent {label 'ec2-fleet'}
6+
7+
options {
8+
timestamps()
9+
ansiColor 'xterm'
10+
}
11+
12+
triggers {
13+
issueCommentTrigger(TRIGGER_PATTERN)
14+
}
15+
16+
environment {
17+
NPM_CONFIG_CACHE = '.npm'
18+
NPM_CONFIG_USERCONFIG = '.npmrc'
19+
SPAWN_WRAP_SHIM_ROOT = '.npm'
20+
}
21+
22+
stages {
23+
stage('Test Suite') {
24+
matrix {
25+
axes {
26+
axis {
27+
name 'NODE_VERSION'
28+
values '14', '16'
29+
}
30+
}
31+
32+
when {
33+
not {
34+
changelog '\\[skip ci\\]'
35+
}
36+
}
37+
38+
39+
agent {
40+
docker {
41+
image "us.gcr.io/logdna-k8s/node:${NODE_VERSION}-ci"
42+
customWorkspace "${PROJECT_NAME}-${BUILD_NUMBER}"
43+
}
44+
}
45+
46+
stages {
47+
stage('Install') {
48+
steps {
49+
sh "mkdir -p ${NPM_CONFIG_CACHE} coverage"
50+
sh 'npm install'
51+
}
52+
}
53+
54+
stage('Test') {
55+
steps {
56+
sh 'npm test'
57+
}
58+
59+
post {
60+
always {
61+
publishHTML target: [
62+
allowMissing: false,
63+
alwaysLinkToLastBuild: false,
64+
keepAll: true,
65+
reportDir: 'coverage/lcov-report',
66+
reportFiles: 'index.html',
67+
reportName: "coverage-node-v${NODE_VERSION}"
68+
]
69+
}
70+
}
71+
}
72+
}
73+
}
74+
}
75+
76+
}
77+
}

README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
# LogDNA Agent
22

33
LogDNA Agent streams from log files to your LogDNA account. Works with Linux, Windows, and macOS Servers.
4-
4+
## :warning: Deprecation Warning
5+
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.
56
## Getting Started
67

78
### From an Official Release

index.js

Lines changed: 101 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,20 @@
1+
/* eslint-disable no-multi-str */ // Adding this to be able to better format the console logs
12
'use strict'
23

34
// External Modules
5+
const fs = require('fs')
6+
const os = require('os')
47
const async = require('async')
58
const debug = require('debug')('logdna:index')
6-
const fs = require('fs')
79
const getos = require('getos')
8-
const os = require('os')
910
const {Command} = require('commander')
1011
const properties = require('properties')
1112
const request = require('request')
1213

1314
// Internal Modules
1415
const start = require('./lib/start.js')
1516
const pkg = require('./package.json')
16-
const utils = require('./lib/utils')
17+
const utils = require('./lib/utils.js')
1718

1819
// Constants
1920
const HOSTNAME_IP_REGEX = /[^0-9a-zA-Z\-.]/g
@@ -29,34 +30,76 @@ process.title = 'logdna-agent'
2930
commander._name = 'logdna-agent'
3031
commander
3132
.version(pkg.version, '-v, --version')
32-
.description('This agent collect and ship logs for processing. Defaults to /var/log if run without parameters.')
33-
.option('-c, --config <file>', `uses alternate config file (default: ${config.DEFAULT_CONF_FILE})`)
33+
.description(
34+
'This agent collects and ships logs for processing.'
35+
+ ' Defaults to /var/log if run without parameters.'
36+
)
37+
.option(
38+
'-c, --config <file>'
39+
, `Uses alternate config file (default: ${config.DEFAULT_CONF_FILE})`
40+
)
3441
.option('-k, --key <key>', 'sets your LogDNA Ingestion Key in the config')
35-
.option('-d, --logdir <dir>', 'adds log directories to config, supports glob patterns', utils.appender(), [])
36-
.option('-f, --logfile <file>', 'adds log files to config', utils.appender(), [])
37-
.option('-e, --exclude <file>', 'exclude files from logdir', utils.appender(), [])
42+
.option(
43+
'-d, --logdir <dir>'
44+
, 'Adds log directories to config, supports glob patterns'
45+
, utils.appender()
46+
, []
47+
)
48+
.option('-f, --logfile <file>', 'Adds log files to config', utils.appender(), [])
49+
.option('-e, --exclude <file>', 'Exclude files from logdir', utils.appender(), [])
3850
.option('-r, --exclude-regex <pattern>', 'filter out lines matching pattern')
39-
.option('-n, --hostname <hostname>', `uses alternate hostname (default: ${os.hostname().replace('.ec2.internal', '')})`)
40-
.option('-t, --tags <tags>', 'add tags for this host, separate multiple tags by comma', utils.appender(), [])
41-
.option('-l, --list [params]', 'show the saved configuration (all unless params specified)', utils.appender(), false)
42-
.option('-u, --unset <params>', 'clear some saved configurations (use "all" to unset all except key)', utils.appender(), [])
43-
.option('-s, --set [key=value]', 'set config variables', utils.appender(), false)
51+
.option(
52+
'-n, --hostname <hostname>'
53+
, `Uses alternate hostname (default: ${os.hostname().replace('.ec2.internal', '')})`
54+
)
55+
.option(
56+
'-t, --tags <tags>',
57+
'Add tags for this host, separate multiple tags by comma'
58+
, utils.appender(),
59+
[]
60+
)
61+
.option(
62+
'-l, --list [params]'
63+
, 'Show the saved configuration (all unless params specified)'
64+
, utils.appender(),
65+
66+
false
67+
)
68+
.option(
69+
'-u, --unset <params>'
70+
, 'Clear some saved configurations (use "all" to unset all except key)'
71+
, utils.appender(),
72+
73+
[]
74+
)
75+
.option('-s, --set [key=value]', 'Set config variables', utils.appender(), false)
4476
.on('--help', () => {
4577
console.log(' Examples:')
4678
console.log()
4779
console.log(' $ logdna-agent --key YOUR_INGESTION_KEY')
4880
console.log(' $ logdna-agent -d /home/ec2-user/logs')
49-
console.log(' $ logdna-agent -d /home/ec2-user/logs -d /path/to/another/log_dir # multiple logdirs in 1 go')
50-
console.log(' $ logdna-agent -d "/var/log/*.txt" # supports glob patterns')
51-
console.log(' $ logdna-agent -d "/var/log/**/myapp.log" # myapp.log in any subfolder')
81+
console.log('\
82+
$ logdna-agent -d /home/ec2-user/logs -d /path/to/another/log_dir\
83+
# multiple logdirs in 1 go\
84+
')
85+
console.log(' $ logdna-agent -d "/var/log/*.txt" '
86+
+ '# supports glob patterns')
87+
console.log(' $ logdna-agent -d "/var/log/**/myapp.log" '
88+
+ '# myapp.log in any subfolder')
5289
console.log(' $ logdna-agent -f /usr/local/nginx/logs/access.log')
53-
console.log(' $ logdna-agent -f /usr/local/nginx/logs/access.log -f /usr/local/nginx/logs/error.log')
54-
console.log(' $ logdna-agent -t production # tags')
90+
console.log(' $ logdna-agent -f /usr/local/nginx/logs/access.log '
91+
+ '-f /usr/local/nginx/logs/error.log')
92+
console.log(' $ logdna-agent -t production '
93+
+ '# tags')
5594
console.log(' $ logdna-agent -t staging,2ndtag')
56-
console.log(' $ logdna-agent -l tags,key,logdir # show specific config parameters')
57-
console.log(' $ logdna-agent -l # show all')
58-
console.log(' $ logdna-agent -u tags,logdir # unset specific entries from config')
59-
console.log(' $ logdna-agent -u all # unset all except LogDNA API Key')
95+
console.log(' $ logdna-agent -l tags,key,logdir '
96+
+ '# show specific config parameters')
97+
console.log(' $ logdna-agent -l '
98+
+ '# show all')
99+
console.log(' $ logdna-agent -u tags,logdir '
100+
+ '# unset specific entries from config')
101+
console.log(' $ logdna-agent -u all '
102+
+ '# unset all except LogDNA API Key')
60103
console.log()
61104
})
62105

@@ -89,7 +132,8 @@ function loadConfig(program) {
89132
}
90133

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

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

100144
if (!program.hostname && !parsedConfig.hostname) {
101145
if (fs.existsSync(HOSTNAME_PATH) && fs.statSync(HOSTNAME_PATH).isFile()) {
102-
parsedConfig.hostname = fs.readFileSync(HOSTNAME_PATH).toString().trim().replace(HOSTNAME_IP_REGEX, '')
146+
parsedConfig.hostname = fs.readFileSync(HOSTNAME_PATH)
147+
.toString()
148+
.trim()
149+
.replace(HOSTNAME_IP_REGEX, '')
103150
} else if (os.hostname()) {
104151
parsedConfig.hostname = os.hostname().replace('.ec2.internal', '')
105152
} else {
106-
console.error('Hostname information cannot be found! Use -n to set or use environment variable LOGDNA_HOSTNAME.')
153+
console.error('Hostname information cannot be found! '
154+
+ 'Use -n to set or use environment variable LOGDNA_HOSTNAME.')
107155
return
108156
}
109157
}
@@ -140,7 +188,8 @@ function loadConfig(program) {
140188
const kvPair = setOption.split('=')
141189
if (kvPair.length === 2) {
142190
parsedConfig[kvPair[0]] = kvPair[1]
143-
saveMessages.push(`Config variable: ${kvPair[0]} = ${kvPair[1]} has been saved to config.`)
191+
saveMessages.push(`Config variable: ${kvPair[0]} = ${kvPair[1]} `
192+
+ 'has been saved to config.')
144193
} else {
145194
saveMessages.push(`Unknown setting: ${setOption}. Usage: -s [key=value]`)
146195
}
@@ -191,7 +240,8 @@ function loadConfig(program) {
191240
// a slash. The user should be forced to provide open and closing slashes,
192241
// otherwise it's too hard to know what's part of the pattern text.
193242
parsedConfig.exclude_regex = re.replace(/^\//, '').replace(/\/$/, '')
194-
saveMessages.push(`Exclude pattern: /${parsedConfig.exclude_regex}/ been saved to config.`)
243+
saveMessages
244+
.push(`Exclude pattern: /${parsedConfig.exclude_regex}/ been saved to config.`)
195245
}
196246

197247
if (program.hostname) {
@@ -260,15 +310,20 @@ function loadConfig(program) {
260310
config.awstype = responseBody.instanceType
261311
}
262312

263-
const networkInterface = Object.values(os.networkInterfaces()).reduce((networkData, interfaces) => {
264-
interfaces.forEach(interfce => networkData.push(interfce))
265-
return networkData
266-
}, []).filter((interfce) => {
267-
return interfce.family && interfce.family === 'IPv4' && interfce.mac && interfce.address && (
268-
interfce.address.startsWith('10.')
269-
|| interfce.address.startsWith('172.')
270-
|| interfce.address.startsWith('192.168.'))
271-
})[0]
313+
const networkInterface = Object.values(os.networkInterfaces())
314+
.reduce((networkData, interfaces) => {
315+
interfaces.forEach((interfce) => { return networkData.push(interfce) })
316+
return networkData
317+
}, []).filter((interfce) => {
318+
return interfce.family
319+
&& interfce.family === 'IPv4'
320+
&& interfce.mac && interfce.address
321+
&& (
322+
interfce.address.startsWith('10.')
323+
|| interfce.address.startsWith('172.')
324+
|| interfce.address.startsWith('192.168.')
325+
)
326+
})[0]
272327

273328
if (networkInterface) {
274329
if (networkInterface.mac) { config.mac = networkInterface.mac }
@@ -287,14 +342,21 @@ function loadConfig(program) {
287342
})
288343
}
289344

290-
process.on('uncaughtException', err => utils.log(`uncaught error: ${(err.stack || '').split('\r\n')}`, 'error'))
345+
process.on('uncaughtException', (err) => {
346+
return utils.log(`uncaught error: ${(err.stack || '').split('\r\n')}`, 'error')
347+
})
291348

292349
if (require.main === module) {
293350
commander.parse(process.argv)
294-
const isAdmin = os.platform() === 'win32' ? require('is-administrator')() : process.getuid() === 0
351+
const isAdmin = os.platform() === 'win32'
352+
? require('is-administrator')()
353+
: process.getuid() === 0
295354

296355
if (!isAdmin) {
297-
console.log('You must be an Administrator (root, sudo) to run this agent! See -h or --help for more info.')
356+
console.log('You must be an Administrator (root, sudo) to run this agent! '
357+
+ 'See -h or --help for more info.')
358+
359+
process.exitCode = 1
298360
return
299361
}
300362

lib/config.js

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,24 +5,35 @@ const os = require('os')
55
const path = require('path')
66

77
module.exports = {
8-
AWS_INSTANCE_CHECK_URL: 'http://169.254.169.254/latest/dynamic/instance-identity/document/'
8+
AWS_INSTANCE_CHECK_URL:
9+
'http://169.254.169.254/latest/dynamic/instance-identity/document/'
910
, COMPRESS: isNaN(process.env.COMPRESS) || process.env.COMPRESS === '1'
10-
, DEFAULT_CONF_FILE: os.platform() !== 'win32' ? '/etc/logdna.conf' : path.join(process.env.ALLUSERSPROFILE, '/logdna/logdna.conf')
11-
, DEFAULT_LOG_PATH: os.platform() !== 'win32' ? '/var/log' : path.join(process.env.ALLUSERSPROFILE, '/logs')
12-
, DEFAULT_WINTAIL_FILE: os.platform() !== 'win32' ? '/etc/winTail.ps1' : path.join(process.env.ALLUSERSPROFILE, '/logdna/winTail.ps1')
11+
, DEFAULT_CONF_FILE: os.platform() !== 'win32'
12+
? '/etc/logdna.conf'
13+
: path.join(process.env.ALLUSERSPROFILE, '/logdna/logdna.conf')
14+
, DEFAULT_LOG_PATH: os.platform() !== 'win32'
15+
? '/var/log'
16+
: path.join(process.env.ALLUSERSPROFILE, '/logs')
17+
, DEFAULT_WINTAIL_FILE: os.platform() !== 'win32'
18+
? '/etc/winTail.ps1'
19+
: path.join(process.env.ALLUSERSPROFILE, '/logdna/winTail.ps1')
1320
, FILEQUEUE_PATH: os.platform() !== 'win32'
1421
? (process.env.FILEQUEUE_PATH || '/tmp')
1522
: path.join(process.env.ALLUSERSPROFILE, (process.env.FILEQUEUE_PATH || '/tmp'))
1623
, FLUSH_INTERVAL: process.env.FLUSH_INTERVAL || 1000
1724
, FLUSH_LIMIT: process.env.FLUSH_LIMIT
1825
, PROXY: process.env.HTTPS_PROXY || process.env.HTTP_PROXY
19-
, LOGDNA_LOGENDPOINT: process.env.LDLOGPATH || process.env.INGESTION_ENDPOINT || '/logs/agent'
26+
, LOGDNA_LOGENDPOINT: process.env.LDLOGPATH
27+
|| process.env.INGESTION_ENDPOINT
28+
|| '/logs/agent'
2029
, LOGDNA_LOGHOST: process.env.LDLOGHOST || process.env.INGESTION_HOST || 'logs.logdna.com'
2130
, LOGDNA_LOGPORT: process.env.LDLOGPORT || process.env.INGESTION_PORT || 443
2231
, LOGDNA_LOGSSL: isNaN(process.env.LDLOGSSL) ? true : +process.env.LDLOGSSL
2332
, RESCAN_INTERVAL: process.env.RESCAN_INTERVAL || 60000 // 1 min
2433
, RESCAN_INTERVAL_K8S: process.RESCAN_INTERVAL_K8S || 10000 // 10 sec
25-
, SOCKET_PATH: process.env.LOGDNA_DOCKER_SOCKET || process.env.DOCKER_SOCKET || '/var/run/docker.sock'
34+
, SOCKET_PATH: process.env.LOGDNA_DOCKER_SOCKET
35+
|| process.env.DOCKER_SOCKET
36+
|| '/var/run/docker.sock'
2637
, TAIL_MODE: process.env.TAIL_MODE || 'trs'
2738
, TRS_READ_INTERVAL: process.env.TRS_READ_INTERVAL || 1000 // 1 sec
2839
, TRS_READ_TIMEOUT: process.env.TRS_READ_TIMEOUT || 300000 // 5 min

0 commit comments

Comments
 (0)