balena-supervisor/src/utils.coffee

75 lines
2.5 KiB
CoffeeScript
Raw Normal View History

2013-12-23 04:22:54 +00:00
Promise = require 'bluebird'
2014-06-18 17:54:36 +01:00
_ = require 'lodash'
2013-12-23 04:22:54 +00:00
fs = Promise.promisifyAll require 'fs'
2014-06-18 17:54:36 +01:00
config = require './config'
mixpanel = require 'mixpanel'
2014-09-30 18:53:21 +01:00
request = Promise.promisifyAll require 'request'
2014-04-28 13:56:17 +03:00
# Parses package.json and returns resin-supervisor's version
exports.supervisorVersion = require('../package.json').version
mixpanelClient = mixpanel.init(config.mixpanelToken)
2014-06-18 17:54:36 +01:00
exports.mixpanelProperties = mixpanelProperties =
username: require('/boot/config.json').username
2014-09-15 12:31:14 +01:00
exports.mixpanelTrack = (event, properties = {}) ->
# Allow passing in an error directly and having it assigned to the error property.
if properties instanceof Error
properties = error: properties
# If the properties has an error argument that is an Error object then it treats it nicely,
# rather than letting it become `{}`
if properties.error instanceof Error
properties.error =
message: properties.error.message
stack: properties.error.stack
console.log('Event:', event, JSON.stringify(properties))
2014-06-18 17:54:36 +01:00
# Mutation is bad, and it should feel bad
properties = _.assign(_.cloneDeep(properties), mixpanelProperties)
mixpanelClient.track(event, properties)
# Returns an array of the host's ip address(es) by parsing the host /proc/net/fib_trie
exports.findIpAddrs = ->
fs.readFileAsync('/mnt/fib_trie', 'utf8')
.then (fibtrie) ->
prevLine = ''
fibtrie.split('\n')
.map (line) ->
line = line.trim()
# We only care about LOCAL routes (not UNICAST or BROADCAST)
if line.match(/LOCAL$/)
2014-09-15 15:04:38 +01:00
# Then we make sure the previous line was an ending branch (and hence contains an IP - 127.0.0.0 has
# BROADCAST and LOCAL entries)
if prevLine.match(/^\|--/)
# Then we remove the ending branch bit
maybeAddr = prevLine.replace(/^\|--/, '').trim()
# And ignore loopback/docker interfaces.
# TODO: Docker interface can technically be on another address range if 172.17
if !maybeAddr.match(/^(127.0.0.1|172.17.)/)
ipAddr = maybeAddr
prevLine = line
return ipAddr
.filter(Boolean)
# Helps in blinking the LED from the given end point.
exports.blink = (ms = 200) ->
fs.writeFileAsync(config.ledFile, 1)
.delay(ms)
.then -> fs.writeFileAsync(config.ledFile, 0)
2014-09-30 18:53:21 +01:00
# Helps in checking connectivity by pseudo-pinging our endpoint.
exports.checkConnectivity = ->
# We avoid using ICMP as this traffic is sometimes restricted/dropped. Good
# ol' port 80 HTTP should always be available :-)
request
.getAsync(config.heartbeatEndpoint)
2014-09-30 19:02:13 +01:00
.spread (response) ->
2014-09-30 18:53:21 +01:00
return response.statusCode in [ 200, 304 ]
.catch ->
return false