Files
2025-09-29 00:52:08 +02:00

187 lines
6.3 KiB
Ruby
Executable File

#
# File:: MachineAnalysis.rb
# Description:: Checks the state of a machine.
# Including harware, software and it's configuration.
# erroring if s/w is not up to date and reporting versions fo installed s/w.
# Primarily for use to support multiple Cruise control machines.
#
# Author:: Derek Ward <derek.ward@rockstarnorth.com>
# Date:: 14th July 2010
#
#-----------------------------------------------------------------------------
# Uses
#-----------------------------------------------------------------------------
require 'pipeline/config/projects'
require 'pipeline/config/project'
require 'pipeline/os/getopt'
require 'pipeline/os/path'
include Pipeline
require 'rbconfig'
#-----------------------------------------------------------------------------
# Constants
#-----------------------------------------------------------------------------
OPTIONS = [
[ '--help', '-h', OS::Getopt::BOOLEAN, 'show usage information' ],
[ '--cruisecontrol', '-c', OS::Getopt::BOOLEAN, 'make output pretty for cruise control' ],
[ '--project', '-p', OS::Getopt::REQUIRED, 'specify project key (e.g. gta5, jimmy)' ],
[ '--branch', '-b', OS::Getopt::REQUIRED, 'specify project branch (e.g. dev, dev_migrate)' ]
]
INFO = "[colourise=black]INFO_MSG: "
INFO_BLUE = "[colourise=blue]INFO_MSG: "
INDENT = " "
PAD = 22
#----------------------------------------------------------------------------------------------
def check( name, val, acceptable_values = [], unacceptable_values = [] )
ok = true
cc_str = $cc ? "#{INFO_BLUE}" : ""
output = "#{INDENT}#{cc_str}#{name.ljust(PAD," ")}#{val}"
if ( (acceptable_values.length > 0) and (not acceptable_values.include?(val) ) )
ok = false
$stderr.puts "#{output} : Error : Not an acceptable value."
end
if ( unacceptable_values.include?(val) )
ok = false
$stderr.puts "#{output} : Error : Unacceptable value."
end
puts output
$num_errors += 1 if not ok
ok
end
#----------------------------------------------------------------------------------------------
def header( name )
cc_str = $cc ? "#{INFO_BLUE}" : ""
puts "#{cc_str}#{name}"
end
#----------------------------------------------------------------------------------------------
def check_ruby_version()
header( "Ruby" )
check( "RUBY_VERSION", RUBY_VERSION )
check( "RUBYLIB", ENV['RUBYLIB'] )
end
#----------------------------------------------------------------------------------------------
def check_dot_net()
dot_net_version_x86, dot_net_version_x64 = "not installed", "not installed"
dot_net_versions = [ "1.0.3705", "1.1.4322", "2.0.50727", "3.0", "3.5", "4.0.30319" ]
dot_net_versions.each { | version | dot_net_version_x86 = version if File.exist? "#{ENV['WINDIR']}/Microsoft.Net/Framework/v#{version}/mscorlib.dll" }
dot_net_versions.each { | version | dot_net_version_x64 = version if File.exist? "#{ENV['WINDIR']}/Microsoft.Net/Framework64/v#{version}/mscorlib.dll" }
check( ".Net(x86)", dot_net_version_x86 )
check( ".Net(x64)", dot_net_version_x64 )
end
#----------------------------------------------------------------------------------------------
def check_os()
header( "OS" )
check( "OS" , ENV['OS'] )
check( "RUBY_PLATFORM", RUBY_PLATFORM )
check( "target_cpu", Config::CONFIG['target_cpu'] )
check( "target_os", Config::CONFIG['target_os'] )
check( "host_cpu", Config::CONFIG['host_cpu'] )
check( "host_os", Config::CONFIG['host_os'] )
check_dot_net()
end
#----------------------------------------------------------------------------------------------
def check_basic()
header( "Basic")
check( "COMPUTERNAME", ENV['COMPUTERNAME'] )
check( "USERNAME", ENV['USERNAME'] )
check( "RS_PROJECT", ENV['RS_PROJECT'] )
end
#----------------------------------------------------------------------------------------------
def check_sw()
header( "Software")
check( "XEDK", ENV['XEDK'] )
end
#----------------------------------------------------------------------------------------------
def check_hw()
header( "Hardware")
check( "NUMBER_OF_PROCESSORS", ENV['NUMBER_OF_PROCESSORS'])
end
#----------------------------------------------------------------------------------------------
#----------------------------------------------------------------------------------------------
#----------------------------------------------------------------------------------------------
begin
#-------------------------------------------------------------------------
# Entry-Point
#-------------------------------------------------------------------------
g_AppName = File::basename( __FILE__, '.rb' )
g_ProjectName = ''
g_BranchName = ''
g_Project = nil
g_Config = Pipeline::Config.instance()
$num_errors = 0
#-------------------------------------------------------------------------
# Parse Command Line
#-------------------------------------------------------------------------
opts, trailing = OS::Getopt.getopts( OPTIONS )
if ( opts['help'] ) then
puts OS::Getopt.usage( OPTIONS )
Process.exit( 1 )
end
g_ProjectName = ( nil == opts['project'] ) ? '' : opts['project']
project_exists = ( g_Config.projects.has_key?( g_ProjectName ) )
if ( not project_exists ) then
puts OS::Getopt.usage( OPTIONS )
puts "\nError project: #{g_ProjectName} does not exist or its configuration is unreadable."
exit( 2 )
end
g_Project = g_Config.projects[ g_ProjectName ]
g_Project.load_config( )
if ( not g_Project.enabled ) then
puts "\nError project: #{g_ProjectName} is not enabled on this machine. Re-run installer."
exit( 3 )
end
g_BranchName = ( nil == opts['branch'] ) ? g_Project.default_branch : opts['branch']
if ( not g_Project.branches.has_key?( g_BranchName ) ) then
puts "\nError project: #{g_ProjectName} does not have branch #{g_BranchName} defined."
exit( 4 )
end
$cc = opts['cruisecontrol']
#-------------------------------------------------------------------------
# Analysis
#-------------------------------------------------------------------------
check_basic()
check_hw()
check_os()
check_ruby_version()
check_sw()
rescue Exception => ex
puts "#{g_AppName} unhandled exception: #{ex.message}"
puts "Call stack:"
puts ex.backtrace.join( "\n\t" )
end
Process.exit $num_errors
# End of MachineAnalysis.rb