mirror of
https://github.com/openstf/stf
synced 2025-10-04 18:29:17 +02:00
Add new stf doctor
command to check if the versions of external dependencies are correct.
Add a `--devices` option to show a list of USB connected devices and a list of the devices that ADB can see.
This commit is contained in:
parent
b2a62c415e
commit
8fc5f748d2
2 changed files with 255 additions and 0 deletions
|
@ -1298,4 +1298,13 @@ program
|
||||||
.done(run)
|
.done(run)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
program
|
||||||
|
.command('doctor')
|
||||||
|
.description('diagnose issues before starting')
|
||||||
|
.option('--devices'
|
||||||
|
, 'diagnose devices connected to stf')
|
||||||
|
.action(function(options) {
|
||||||
|
require('./util/doctor').run(options)
|
||||||
|
})
|
||||||
|
|
||||||
program.parse(process.argv)
|
program.parse(process.argv)
|
||||||
|
|
246
lib/util/doctor.js
Normal file
246
lib/util/doctor.js
Normal file
|
@ -0,0 +1,246 @@
|
||||||
|
var os = require('os')
|
||||||
|
var semver = require('semver')
|
||||||
|
var childProcess = require('child_process')
|
||||||
|
var rethinkdbPkg = require('rethinkdb/package')
|
||||||
|
var zmq = require('zmq')
|
||||||
|
|
||||||
|
var pkg = require('../../package')
|
||||||
|
var log = require('./logger').createLogger('util:doctor')
|
||||||
|
|
||||||
|
var doctor = module.exports = Object.create(null)
|
||||||
|
|
||||||
|
function unsupportedVersion(desc, ver, range, callback) {
|
||||||
|
if (!semver.satisfies(ver, range)) {
|
||||||
|
log.error(
|
||||||
|
'Current %s version is not supported, it has to be %s'
|
||||||
|
, desc
|
||||||
|
, range
|
||||||
|
)
|
||||||
|
if (callback) {
|
||||||
|
return callback()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function execHasErrors(error, stderr) {
|
||||||
|
if (error) {
|
||||||
|
if (error.code === 'ENOENT') {
|
||||||
|
log.warn('Executable was not found')
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
log.error(error)
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
if (stderr) {
|
||||||
|
log.error('There was an error with: %s', stderr)
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
function execCommand(command, param, desc, match, callback) {
|
||||||
|
childProcess.execFile(command, [param],
|
||||||
|
function(error, stdout, stderr) {
|
||||||
|
if (!execHasErrors(error, stderr)) {
|
||||||
|
if (stdout) {
|
||||||
|
var result = stdout.replace(match, '$1')
|
||||||
|
if (result) {
|
||||||
|
log.info('%s %s', desc, result)
|
||||||
|
if (callback) {
|
||||||
|
return callback(result)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
log.error('There was an error with: %s', stdout)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
doctor.checkOSArch = function() {
|
||||||
|
log.info('OS Arch: %s', os.arch())
|
||||||
|
}
|
||||||
|
|
||||||
|
doctor.checkOSPlatform = function() {
|
||||||
|
log.info('OS Platform: %s', os.platform())
|
||||||
|
if (os.platform() === 'win32') {
|
||||||
|
log.warn('STF has never been tested on Windows. Contributions are welcome!')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
doctor.checkOSRelease = function() {
|
||||||
|
log.info('OS Platform: %s', os.release())
|
||||||
|
}
|
||||||
|
|
||||||
|
doctor.checkNodeVersion = function() {
|
||||||
|
log.info('Using Node %s', process.versions.node)
|
||||||
|
if (pkg.engineStrict) {
|
||||||
|
unsupportedVersion('Node', process.versions.node, pkg.engines.node)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
doctor.checkRethinkDBClient = function() {
|
||||||
|
log.info('Using RethinkDB client %s', rethinkdbPkg.version)
|
||||||
|
}
|
||||||
|
|
||||||
|
doctor.checkLocalRethinkDBServer = function() {
|
||||||
|
execCommand(
|
||||||
|
'rethinkdb'
|
||||||
|
, '--version'
|
||||||
|
, 'Local RethinkDB server'
|
||||||
|
, /rethinkdb (.*?) \(.*\)\n?/gm
|
||||||
|
, function(ver) {
|
||||||
|
unsupportedVersion(
|
||||||
|
'Local RethinkDB server'
|
||||||
|
, ver
|
||||||
|
, pkg.externalDependencies.rethinkdb
|
||||||
|
)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
doctor.checkGraphicsMagick = function() {
|
||||||
|
execCommand(
|
||||||
|
'gm'
|
||||||
|
, '-version'
|
||||||
|
, 'GraphicsMagick'
|
||||||
|
, /GraphicsMagick ((.|\n)*?) (.|\n)*/g
|
||||||
|
, function(ver) {
|
||||||
|
unsupportedVersion('GraphicsMagick', ver, pkg.externalDependencies.gm)
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
doctor.checkZeroMQ = function() {
|
||||||
|
log.info('Using ZeroMQ %s', zmq.version)
|
||||||
|
|
||||||
|
unsupportedVersion('ZeroMQ', zmq.version, pkg.externalDependencies.zeromq)
|
||||||
|
}
|
||||||
|
|
||||||
|
doctor.checkProtoBuf = function() {
|
||||||
|
execCommand(
|
||||||
|
'protoc'
|
||||||
|
, '--version'
|
||||||
|
, 'ProtoBuf'
|
||||||
|
, /^libprotoc (.*)\n$/g
|
||||||
|
, function(ver) {
|
||||||
|
unsupportedVersion(
|
||||||
|
'ProtoBuf'
|
||||||
|
, ver
|
||||||
|
, pkg.externalDependencies.protobuf
|
||||||
|
)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
doctor.checkADB = function() {
|
||||||
|
execCommand(
|
||||||
|
'adb'
|
||||||
|
, 'version'
|
||||||
|
, 'Local ADB'
|
||||||
|
, /Android Debug Bridge version ((.|\n)*?)/g
|
||||||
|
, function(ver) {
|
||||||
|
unsupportedVersion('AD', ver, pkg.externalDependencies.adb)
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
doctor.checkDevices = function() {
|
||||||
|
// Show all connected USB devices, including hubs
|
||||||
|
if (os.platform() === 'darwin') {
|
||||||
|
childProcess.execFile('ioreg', ['-p', 'IOUSB', '-w0'],
|
||||||
|
function(error, stdout, stderr) {
|
||||||
|
log.info('USB devices connected including hubs:')
|
||||||
|
if (!execHasErrors(error, stderr)) {
|
||||||
|
var list = stdout.replace(/@.*|\+-o Root\s{2}.*\n|\+-o |^\s{2}/gm, '')
|
||||||
|
.split('\n')
|
||||||
|
list.forEach(function(device) {
|
||||||
|
log.info(device)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
else if (os.platform() === 'linux') {
|
||||||
|
childProcess.execFile('lsusb', [],
|
||||||
|
function(error, stdout, stderr) {
|
||||||
|
log.info('USB devices connected including hubs:')
|
||||||
|
if (!execHasErrors(error, stderr)) {
|
||||||
|
var list = stdout.replace(/Bus \d+ Device \d+: ID \w+:\w+ /gm, '')
|
||||||
|
.split('\n')
|
||||||
|
list.forEach(function(device) {
|
||||||
|
log.info(device)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Show all the devices seen by adb
|
||||||
|
childProcess.execFile('adb', ['devices'],
|
||||||
|
function(error, stdout, stderr) {
|
||||||
|
log.info('Devices that ADB can see:')
|
||||||
|
if (!execHasErrors(error, stderr)) {
|
||||||
|
var s = stdout.replace(/List of devices attached \n|^\s*/gm, '')
|
||||||
|
if (s.length === 0) {
|
||||||
|
log.error('No devices')
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
var list = s.split('\n')
|
||||||
|
list.forEach(function(device) {
|
||||||
|
log.info(device)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
doctor.run = function(options) {
|
||||||
|
// Check devices
|
||||||
|
if (options.devices) {
|
||||||
|
doctor.checkDevices()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check OS architecture
|
||||||
|
doctor.checkOSArch()
|
||||||
|
|
||||||
|
// Check OS platform
|
||||||
|
doctor.checkOSPlatform()
|
||||||
|
|
||||||
|
// Check OS release
|
||||||
|
doctor.checkOSRelease()
|
||||||
|
|
||||||
|
// Check node version
|
||||||
|
doctor.checkNodeVersion()
|
||||||
|
|
||||||
|
// Check rethinkdb client
|
||||||
|
doctor.checkRethinkDBClient()
|
||||||
|
|
||||||
|
// Check local rethinkdb server
|
||||||
|
doctor.checkLocalRethinkDBServer()
|
||||||
|
|
||||||
|
// Check graphicsmagick
|
||||||
|
doctor.checkGraphicsMagick()
|
||||||
|
|
||||||
|
// Check zeromq
|
||||||
|
doctor.checkZeroMQ()
|
||||||
|
|
||||||
|
// Check protobuf
|
||||||
|
doctor.checkProtoBuf()
|
||||||
|
|
||||||
|
// Check adb
|
||||||
|
doctor.checkADB()
|
||||||
|
|
||||||
|
// TODO:
|
||||||
|
// Check yasm
|
||||||
|
// Check pkg-config
|
||||||
|
// Check python2
|
||||||
|
// Exit on errors
|
||||||
|
// Run on stf local
|
||||||
|
|
||||||
|
// Only for stf local:
|
||||||
|
// Check if rethinkdb is running
|
||||||
|
// Check if adb server is running
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue