diff --git a/.rubocop.yml b/.rubocop.yml new file mode 100644 index 0000000..cf4b0f7 --- /dev/null +++ b/.rubocop.yml @@ -0,0 +1,2 @@ +inherit_from: + - rubocop_todo.yml \ No newline at end of file diff --git a/Gemfile b/Gemfile index 0d33f08..7a9e487 100644 --- a/Gemfile +++ b/Gemfile @@ -1,4 +1,4 @@ -source "http://rubygems.org" +source 'http://rubygems.org' # Specify your gem's dependencies in spacewalk.gemspec gemspec diff --git a/Rakefile b/Rakefile index 9e740ad..00c1229 100644 --- a/Rakefile +++ b/Rakefile @@ -1,6 +1,6 @@ -require 'bundler/gem_tasks' -require 'rake/testtask' - -task :default => [:test] - -Dir['tasks/**/*.rake'].each { |t| load t } +require 'bundler/gem_tasks' +require 'rake/testtask' + +task :default => [:test] + +Dir['tasks/**/*.rake'].each { |t| load t } diff --git a/bin/actions.rb b/bin/actions.rb index ed8ff4b..6dd4549 100644 --- a/bin/actions.rb +++ b/bin/actions.rb @@ -5,23 +5,23 @@ # # for testing: prefer local path -$: << File.expand_path(File.join(File.dirname(__FILE__),"..","lib")) +$LOAD_PATH << File.expand_path(File.join(File.dirname(__FILE__), '..', 'lib')) -require "spacewalk" -require File.expand_path(File.join(File.dirname(__FILE__),'client')) +require 'spacewalk' +require File.expand_path(File.join(File.dirname(__FILE__), 'client')) # # Usage # -def usage msg=nil +def usage(msg=nil) STDERR.puts "*** #{msg}" if msg - STDERR.puts "Usage:" - STDERR.puts " actions [] " - STDERR.puts " --server " - STDERR.puts " --future " - STDERR.puts "Checks server for client actions" - exit (msg ? 1 : 0) + STDERR.puts 'Usage:' + STDERR.puts ' actions [] ' + STDERR.puts ' --server ' + STDERR.puts ' --future ' + STDERR.puts 'Checks server for client actions' + exit(msg ? 1 : 0) end # @@ -31,20 +31,20 @@ def usage msg=nil def parse_args require 'getoptlong' opts = GetoptLong.new( - [ "--help", "-?", GetoptLong::NO_ARGUMENT ], - [ "--server", "-s", GetoptLong::REQUIRED_ARGUMENT ], - [ "--future", "-f", GetoptLong::REQUIRED_ARGUMENT ] + ['--help', '-?', GetoptLong::NO_ARGUMENT], + ['--server', '-s', GetoptLong::REQUIRED_ARGUMENT], + ['--future', '-f', GetoptLong::REQUIRED_ARGUMENT] ) result = {} - opts.each do |opt,arg| + opts.each do |opt, arg| result[opt[2..-1].to_sym] = arg end usage if result[:help] - usage("No server url given") unless result[:server] + usage('No server url given') unless result[:server] unless result[:solv] - usage("No given") if ARGV.empty? + usage('No given') if ARGV.empty? result[:fqdn] = ARGV.shift - usage("Multiple s given") unless ARGV.empty? + usage('Multiple s given') unless ARGV.empty? end result end @@ -52,26 +52,26 @@ def parse_args # convert action to promises # {"id"=>6434, "version"=>2, "action"=>["packages.remove", [[["accountsservice-devel", "0.6.38", "79.1", "", ""]]]]} # {"id"=>6437, "version"=>2, "action"=>["packages.update", [[["aalib-devel", "1.4.0", "503.1.3", "", ""]]]]} -# -def mk_promise action - id = action["id"] - task, packages = action["action"] - promise = "bundle agent " +# +def mk_promise(action) + id = action['id'] + task, packages = action['action'] + promise = 'bundle agent ' case task - when "packages.remove" - promise << "mgr_remove" - policy = "add" - when "packages.update" - promise << "mgr_update" - policy = "remove" + when 'packages.remove' + promise << 'mgr_remove' + policy = 'add' + when 'packages.update' + promise << 'mgr_update' + policy = 'remove' else - raise "Task '#{task}' not supported" + fail "Task '#{task}' not supported" end promise << "\n{\n vars:\n \"package_list\" slist => {\n " first = true packages[0].each do |package| name, version, release, epoch, arch = package - promise << ", " unless first + promise << ', ' unless first first = false promise << "\"#{name}-#{version}-#{release}\"" end @@ -89,7 +89,7 @@ def mk_promise action parms = parse_args rescue SystemExit raise -rescue Exception => e +rescue StandardError => e usage e.to_s end @@ -102,20 +102,20 @@ def mk_promise action unless File.exist? fqdn STDERR.puts "#{fqdn} must be registered first" end - + begin systemid = File.open(fqdn).read server = Spacewalk::Server.new :noconfig => true, :server => parms[:server], :systemid => systemid actions = parms[:future] ? server.future_actions(parms[:future].to_i) : server.actions if actions - actions = [ actions ] unless actions.is_a? Array + actions = [actions] unless actions.is_a? Array actions.each do |action| puts mk_promise action unless parms[:future] - server.submit_response parms[:action], "0", "Action converted to promise", { } + server.submit_response parms[:action], '0', 'Action converted to promise', { } end end - end + end rescue raise end diff --git a/bin/client.rb b/bin/client.rb index b22bc98..415cb12 100644 --- a/bin/client.rb +++ b/bin/client.rb @@ -9,8 +9,8 @@ class Client # # Dump result as XML to file # - def dump klass, result - File.open("#{klass}.xml", "w+") do |f| + def dump(klass, result) + File.open("#{klass}.xml", 'w+') do |f| f.write result.to_xml end end @@ -18,7 +18,7 @@ def dump klass, result # # Constructor # - def initialize host + def initialize(host) @host = host @data = {} end @@ -37,20 +37,19 @@ def packages IO.popen("rpm -qa --queryformat \"%{name} %{epoch} %{version} %{release} %{arch} %{installtime}\n\"") do |io| io.each do |rpm| - name,epoch,version,release,arch,installtime = rpm.split(" ") - next if name == "gpg-pubkey" - next if arch == "src" - package = { "name" => name, "epoch" => epoch, "version" => version, "release" => release, "arch" => arch, "installtime" => installtime.to_i } + name, epoch, version, release, arch, installtime = rpm.split(' ') + next if name == 'gpg-pubkey' + next if arch == 'src' + package = { 'name' => name, 'epoch' => epoch, 'version' => version, 'release' => release, 'arch' => arch, 'installtime' => installtime.to_i } puts package.inspect packages << package end end - + packages end - - def profile + def profile # assemble registration information # parse /etc/os-release # NAME=openSUSE @@ -64,26 +63,24 @@ def profile # HOME_URL="https://opensuse.org/" # ID_LIKE="suse" - data = { "architecture" => RUBY_PLATFORM.split("-")[0] } - File.open("/etc/os-release") do |f| + data = { 'architecture' => RUBY_PLATFORM.split('-')[0] } + File.open('/etc/os-release') do |f| f.each do |l| - key, val = l.chomp.split("=") - val = val[1,-2] if val[0][1] == '"' + key, val = l.chomp.split('=') + val = val[1, -2] if val[0][1] == '"' case key - when "VERSION_ID" - data["os_release"] = val - when "PRETTY_NAME" - data["release_name"] = val + when 'VERSION_ID' + data['os_release'] = val + when 'PRETTY_NAME' + data['release_name'] = val end end end data end - - end # client -if $0 == __FILE__ - client = Client.new "1.1.1.1" +if $PROGRAM_NAME == __FILE__ + client = Client.new '1.1.1.1' puts client.packages.inspect end diff --git a/bin/fakereg.rb b/bin/fakereg.rb index a80e6d9..cdd5161 100644 --- a/bin/fakereg.rb +++ b/bin/fakereg.rb @@ -3,19 +3,19 @@ # # for testing: prefer local path -$: << File.expand_path(File.join(File.dirname(__FILE__),"..","lib")) +$LOAD_PATH << File.expand_path(File.join(File.dirname(__FILE__), '..', 'lib')) -require "spacewalk" +require 'spacewalk' # # Usage # -def usage msg +def usage(msg) STDERR.puts "*** #{msg}" if msg - STDERR.puts "Usage:" - STDERR.puts " fakereg --server [--port ] --key [--description ] [--solv --yaml ] --arch --count " - exit( msg ? 1 : 0) + STDERR.puts 'Usage:' + STDERR.puts ' fakereg --server [--port ] --key [--description ] [--solv --yaml ] --arch --count ' + exit(msg ? 1 : 0) end # @@ -25,22 +25,22 @@ def usage msg def parse_args require 'getoptlong' opts = GetoptLong.new( - [ "--server", "-s", GetoptLong::REQUIRED_ARGUMENT ], - [ "--description", "-d", GetoptLong::REQUIRED_ARGUMENT ], - [ "--key", "-k", GetoptLong::REQUIRED_ARGUMENT ], - [ "--port", "-p", GetoptLong::REQUIRED_ARGUMENT ], - [ "--arch", "-a", GetoptLong::REQUIRED_ARGUMENT ], - [ "--solv", "-S", GetoptLong::REQUIRED_ARGUMENT ], - [ "--yaml", "-Y", GetoptLong::REQUIRED_ARGUMENT ], - [ "--count", "-c", GetoptLong::REQUIRED_ARGUMENT ] + ['--server', '-s', GetoptLong::REQUIRED_ARGUMENT], + ['--description', '-d', GetoptLong::REQUIRED_ARGUMENT], + ['--key', '-k', GetoptLong::REQUIRED_ARGUMENT], + ['--port', '-p', GetoptLong::REQUIRED_ARGUMENT], + ['--arch', '-a', GetoptLong::REQUIRED_ARGUMENT], + ['--solv', '-S', GetoptLong::REQUIRED_ARGUMENT], + ['--yaml', '-Y', GetoptLong::REQUIRED_ARGUMENT], + ['--count', '-c', GetoptLong::REQUIRED_ARGUMENT] ) result = {} - opts.each do |opt,arg| + opts.each do |opt, arg| result[opt[2..-1].to_sym] = arg end - usage("No server url given") unless result[:server] - usage("No activationkey given") unless result[:key] - usage("No given") if ARGV.empty? + usage('No server url given') unless result[:server] + usage('No activationkey given') unless result[:key] + usage('No given') if ARGV.empty? result[:name] = ARGV.shift result end @@ -48,16 +48,16 @@ def parse_args # # Convert Satsolver::Repo to profile list # -def repo_packages repo +def repo_packages(repo) packages = [] repo.each do |p| entry = {} - entry["name"] = p.name.to_s - entry["epoch"] = (p.epoch || "0").to_s - entry["version"] = p.version.to_s - entry["release"] = p.revision.to_s - entry["arch"] = p.arch.to_s - entry["installtime"] = p["solvable:installtime"] + entry['name'] = p.name.to_s + entry['epoch'] = (p.epoch || '0').to_s + entry['version'] = p.version.to_s + entry['release'] = p.revision.to_s + entry['arch'] = p.arch.to_s + entry['installtime'] = p['solvable:installtime'] packages << entry end packages @@ -65,11 +65,11 @@ def repo_packages repo def fake_profile # assemble registration information - + data = {} - data["os_release"] = "Fake testing" - data["release_name"] = "ruby-spacewalk" - data["architecture"] = "x86_64" + data['os_release'] = 'Fake testing' + data['release_name'] = 'ruby-spacewalk' + data['architecture'] = 'x86_64' data end #------------------------------------ @@ -77,25 +77,25 @@ def fake_profile begin parms = parse_args -rescue Exception => e +rescue StandardError => e usage e.to_s end if parms[:solv] require 'satsolver' pool = Satsolver::Pool.new - repo = pool.add_solv( parms[:solv] ) - raise "Invalid .solv file: #{parms[:solv]}" unless repo + repo = pool.add_solv(parms[:solv]) + fail "Invalid .solv file: #{parms[:solv]}" unless repo if parms[:yaml] require 'yaml' packages = repo_packages repo - File.open(parms[:yaml], "w") do |f| - f.puts "---" + File.open(parms[:yaml], 'w') do |f| + f.puts '---' # somehow, YAML::dump(packages, f) does not work packages.each do |p| first = true - p.each do |k,v| + p.each do |k, v| if first f.puts "- #{k}: #{v.inspect}" first = false @@ -111,16 +111,16 @@ def fake_profile else if parms[:yaml] require 'yaml' - packages = YAML::load_file(parms[:yaml]) + packages = YAML.load_file(parms[:yaml]) else - STDERR.puts "No --solv and no --yaml given, skipping packages" + STDERR.puts 'No --solv and no --yaml given, skipping packages' end end count = parms[:count].to_i rescue 1 profile = fake_profile -profile["packages"] = packages if packages +profile['packages'] = packages if packages start = Time.now puts "Start at #{start}, #{count} systems" @@ -130,25 +130,25 @@ def fake_profile count.times do |i| begin - + # get "os_release","release_name","architecture" - name = "%s%04d" % [parms[:name], i] + name = format('%s%04d', parms[:name], i) print "Registering #{name}\n" systemid = server.register parms[:key], name, profile - File.open("#{name}.systemid", "w+") do |f| + File.open("#{name}.systemid", 'w+') do |f| f.write systemid end print "#{name} successfully registered\n" good += 1 - rescue Exception => e + rescue StandardError => e STDERR.puts "*** #{name} failed: #{e}" end end stop = Time.now -elapsed = stop-start +elapsed = stop - start if good > 0 - puts "Registered #{good} of #{count} systems at #{parms[:server]} in #{elapsed} seconds (#{good/elapsed} systems/sec, #{elapsed/good} secs/system)" + puts "Registered #{good} of #{count} systems at #{parms[:server]} in #{elapsed} seconds (#{good / elapsed} systems/sec, #{elapsed / good} secs/system)" else - puts "Oops, no systems were registered" -end \ No newline at end of file + puts 'Oops, no systems were registered' +end diff --git a/bin/fakereg-threaded.rb b/bin/fakereg_threaded.rb similarity index 51% rename from bin/fakereg-threaded.rb rename to bin/fakereg_threaded.rb index c733d09..e105b7a 100644 --- a/bin/fakereg-threaded.rb +++ b/bin/fakereg_threaded.rb @@ -3,19 +3,19 @@ # # for testing: prefer local path -$: << File.expand_path(File.join(File.dirname(__FILE__),"..","lib")) +$LOAD_PATH << File.expand_path(File.join(File.dirname(__FILE__), '..', 'lib')) -require "spacewalk" +require 'spacewalk' # # Usage # -def usage msg +def usage(msg) STDERR.puts "*** #{msg}" if msg - STDERR.puts "Usage:" - STDERR.puts " fakereg --server [--port ] --key [--description ] [--solv --yaml ] --arch --count " - exit( msg ? 1 : 0) + STDERR.puts 'Usage:' + STDERR.puts ' fakereg --server [--port ] --key [--description ] [--solv --yaml ] --arch --count ' + exit(msg ? 1 : 0) end # @@ -25,22 +25,22 @@ def usage msg def parse_args require 'getoptlong' opts = GetoptLong.new( - [ "--server", "-s", GetoptLong::REQUIRED_ARGUMENT ], - [ "--description", "-d", GetoptLong::REQUIRED_ARGUMENT ], - [ "--key", "-k", GetoptLong::REQUIRED_ARGUMENT ], - [ "--port", "-p", GetoptLong::REQUIRED_ARGUMENT ], - [ "--arch", "-a", GetoptLong::REQUIRED_ARGUMENT ], - [ "--solv", "-S", GetoptLong::REQUIRED_ARGUMENT ], - [ "--yaml", "-Y", GetoptLong::REQUIRED_ARGUMENT ], - [ "--count", "-c", GetoptLong::REQUIRED_ARGUMENT ] + ['--server', '-s', GetoptLong::REQUIRED_ARGUMENT], + ['--description', '-d', GetoptLong::REQUIRED_ARGUMENT], + ['--key', '-k', GetoptLong::REQUIRED_ARGUMENT], + ['--port', '-p', GetoptLong::REQUIRED_ARGUMENT], + ['--arch', '-a', GetoptLong::REQUIRED_ARGUMENT], + ['--solv', '-S', GetoptLong::REQUIRED_ARGUMENT], + ['--yaml', '-Y', GetoptLong::REQUIRED_ARGUMENT], + ['--count', '-c', GetoptLong::REQUIRED_ARGUMENT] ) result = {} - opts.each do |opt,arg| + opts.each do |opt, arg| result[opt[2..-1].to_sym] = arg end - usage("No server url given") unless result[:server] - usage("No activationkey given") unless result[:key] - usage("No given") if ARGV.empty? + usage('No server url given') unless result[:server] + usage('No activationkey given') unless result[:key] + usage('No given') if ARGV.empty? result[:name] = ARGV.shift result end @@ -48,16 +48,16 @@ def parse_args # # Convert Satsolver::Repo to profile list # -def repo_packages repo +def repo_packages(repo) packages = [] repo.each do |p| entry = {} - entry["name"] = p.name.to_s - entry["epoch"] = (p.epoch || "0").to_s - entry["version"] = p.version.to_s - entry["release"] = p.revision.to_s - entry["arch"] = p.arch.to_s - entry["installtime"] = p["solvable:installtime"] + entry['name'] = p.name.to_s + entry['epoch'] = (p.epoch || '0').to_s + entry['version'] = p.version.to_s + entry['release'] = p.revision.to_s + entry['arch'] = p.arch.to_s + entry['installtime'] = p['solvable:installtime'] packages << entry end packages @@ -65,11 +65,11 @@ def repo_packages repo def fake_profile # assemble registration information - + data = {} - data["os_release"] = "Fake testing" - data["release_name"] = "ruby-spacewalk" - data["architecture"] = "x86_64" + data['os_release'] = 'Fake testing' + data['release_name'] = 'ruby-spacewalk' + data['architecture'] = 'x86_64' data end #------------------------------------ @@ -77,25 +77,25 @@ def fake_profile begin parms = parse_args -rescue Exception => e +rescue StandardError => e usage e.to_s end if parms[:solv] require 'satsolver' pool = Satsolver::Pool.new - repo = pool.add_solv( parms[:solv] ) - raise "Invalid .solv file: #{parms[:solv]}" unless repo + repo = pool.add_solv(parms[:solv]) + fail "Invalid .solv file: #{parms[:solv]}" unless repo if parms[:yaml] require 'yaml' packages = repo_packages repo - File.open(parms[:yaml], "w") do |f| - f.puts "---" + File.open(parms[:yaml], 'w') do |f| + f.puts '---' # somehow, YAML::dump(packages, f) does not work packages.each do |p| first = true - p.each do |k,v| + p.each do |k, v| if first f.puts "- #{k}: #{v.inspect}" first = false @@ -111,16 +111,16 @@ def fake_profile else if parms[:yaml] require 'yaml' - packages = YAML::load_file(parms[:yaml]) + packages = YAML.load_file(parms[:yaml]) else - STDERR.puts "No --solv and no --yaml given, skipping packages" + STDERR.puts 'No --solv and no --yaml given, skipping packages' end end count = parms[:count].to_i rescue 1 profile = fake_profile -profile["packages"] = packages +profile['packages'] = packages start = Time.now puts "Start at #{start}, #{count} systems" @@ -133,10 +133,10 @@ def fake_profile server = Spacewalk::Server.new :noconfig => true, :server => parms[:server] # get "os_release","release_name","architecture" - name = "%s%04d" % [parms[:name], i] + name = format('%s%04d', parms[:name], i) print "Registering #{name}\n" systemid = server.register parms[:key], name, profile - File.open("#{name}.systemid", "w+") do |f| + File.open("#{name}.systemid", 'w+') do |f| f.write systemid end print "#{name} successfully registered\n" @@ -146,9 +146,9 @@ def fake_profile end end end -puts "Waiting for threads" -threads.each { |t| t.join } +puts 'Waiting for threads' +threads.each(&:join) stop = Time.now -elapsed = stop-start -puts "Registered #{good} of #{count} systems in #{elapsed} seconds (#{good/elapsed} systems/sec)" +elapsed = stop - start +puts "Registered #{good} of #{count} systems in #{elapsed} seconds (#{good / elapsed} systems/sec)" diff --git a/bin/refresh.rb b/bin/refresh.rb index 7d762c4..6a6b23a 100644 --- a/bin/refresh.rb +++ b/bin/refresh.rb @@ -3,20 +3,20 @@ # # for testing: prefer local path -$: << File.expand_path(File.join(File.dirname(__FILE__),"..","lib")) +$LOAD_PATH << File.expand_path(File.join(File.dirname(__FILE__), '..', 'lib')) -require "spacewalk" -require File.expand_path(File.join(File.dirname(__FILE__),'windows')) +require 'spacewalk' +require File.expand_path(File.join(File.dirname(__FILE__), 'windows')) # # Usage # -def usage msg +def usage(msg) STDERR.puts "*** #{msg}" if msg - STDERR.puts "Usage:" - STDERR.puts " refresh [--packages] [--hardware] --server " - exit( msg ? 1 : 0) + STDERR.puts 'Usage:' + STDERR.puts ' refresh [--packages] [--hardware] --server ' + exit(msg ? 1 : 0) end # @@ -26,19 +26,19 @@ def usage msg def parse_args require 'getoptlong' opts = GetoptLong.new( - [ "--port", "-P", GetoptLong::REQUIRED_ARGUMENT ], - [ "--server", "-s", GetoptLong::REQUIRED_ARGUMENT ], - [ "--packages", "-p", GetoptLong::NO_ARGUMENT ], - [ "--hardware", "-h", GetoptLong::NO_ARGUMENT ] + ['--port', '-P', GetoptLong::REQUIRED_ARGUMENT], + ['--server', '-s', GetoptLong::REQUIRED_ARGUMENT], + ['--packages', '-p', GetoptLong::NO_ARGUMENT], + ['--hardware', '-h', GetoptLong::NO_ARGUMENT] ) result = {} - opts.each do |opt,arg| + opts.each do |opt, arg| result[opt[2..-1].to_sym] = arg end - usage("No server url given") unless result[:server] - usage("No given") if ARGV.empty? + usage('No server url given') unless result[:server] + usage('No given') if ARGV.empty? result[:fqdn] = ARGV.shift - usage("Multiple s given") unless ARGV.empty? + usage('Multiple s given') unless ARGV.empty? result end @@ -47,7 +47,6 @@ def parse_args parms = parse_args - # Already registered ? fqdn = parms[:fqdn] @@ -72,12 +71,12 @@ def parse_args packages = windows.packages # server.send_packages packages end - + if parms[:hardware] hardware = windows.hardware server.refresh_hardware hardware end - + rescue raise end diff --git a/bin/register_remote.rb b/bin/register_remote.rb index eb31335..c4bd005 100644 --- a/bin/register_remote.rb +++ b/bin/register_remote.rb @@ -5,29 +5,29 @@ # # for testing: prefer local path -$: << File.expand_path(File.join(File.dirname(__FILE__),"..","lib")) +$LOAD_PATH << File.expand_path(File.join(File.dirname(__FILE__), '..', 'lib')) -require "spacewalk" -require File.expand_path(File.join(File.dirname(__FILE__),'client')) +require 'spacewalk' +require File.expand_path(File.join(File.dirname(__FILE__), 'client')) # # Usage # -def usage msg=nil +def usage(msg=nil) STDERR.puts "*** #{msg}" if msg - STDERR.puts "Usage:" - STDERR.puts " register_remote [] " - STDERR.puts " --server " - STDERR.puts " --key " - STDERR.puts " --name " - STDERR.puts " --description " - STDERR.puts " --packages" - STDERR.puts " --hardware" - STDERR.puts " --solv " - STDERR.puts " --arch " + STDERR.puts 'Usage:' + STDERR.puts ' register_remote [] ' + STDERR.puts ' --server ' + STDERR.puts ' --key ' + STDERR.puts ' --name ' + STDERR.puts ' --description ' + STDERR.puts ' --packages' + STDERR.puts ' --hardware' + STDERR.puts ' --solv ' + STDERR.puts ' --arch ' STDERR.puts "Does a registration of a 'remote' client system" - exit (msg ? 1 : 0) + exit(msg ? 1 : 0) end # @@ -37,26 +37,26 @@ def usage msg=nil def parse_args require 'getoptlong' opts = GetoptLong.new( - [ "--help", "-?", GetoptLong::NO_ARGUMENT ], - [ "--server", "-s", GetoptLong::REQUIRED_ARGUMENT ], - [ "--name", "-n", GetoptLong::REQUIRED_ARGUMENT ], - [ "--description", "-d", GetoptLong::REQUIRED_ARGUMENT ], - [ "--key", "-k", GetoptLong::REQUIRED_ARGUMENT ], - [ "--arch", "-a", GetoptLong::REQUIRED_ARGUMENT ], - [ "--packages", "-p", GetoptLong::NO_ARGUMENT ], - [ "--hardware", "-h", GetoptLong::NO_ARGUMENT ], - [ "--solv", "-S", GetoptLong::REQUIRED_ARGUMENT ] + ['--help', '-?', GetoptLong::NO_ARGUMENT], + ['--server', '-s', GetoptLong::REQUIRED_ARGUMENT], + ['--name', '-n', GetoptLong::REQUIRED_ARGUMENT], + ['--description', '-d', GetoptLong::REQUIRED_ARGUMENT], + ['--key', '-k', GetoptLong::REQUIRED_ARGUMENT], + ['--arch', '-a', GetoptLong::REQUIRED_ARGUMENT], + ['--packages', '-p', GetoptLong::NO_ARGUMENT], + ['--hardware', '-h', GetoptLong::NO_ARGUMENT], + ['--solv', '-S', GetoptLong::REQUIRED_ARGUMENT] ) result = {} - opts.each do |opt,arg| + opts.each do |opt, arg| result[opt[2..-1].to_sym] = arg end usage if result[:help] - usage("No server url given") unless result[:server] + usage('No server url given') unless result[:server] unless result[:solv] - usage("No given") if ARGV.empty? + usage('No given') if ARGV.empty? result[:fqdn] = ARGV.shift - usage("Multiple s given") unless ARGV.empty? + usage('Multiple s given') unless ARGV.empty? end result end @@ -68,7 +68,7 @@ def parse_args parms = parse_args rescue SystemExit raise -rescue Exception => e +rescue StandardError => e usage e.to_s end @@ -92,20 +92,20 @@ def parse_args begin server = Spacewalk::Server.new :noconfig => true, :server => parms[:server], :systemid => systemid - puts " Computing profile" + puts ' Computing profile' # get "os_release","release_name","architecture" profile = client.profile # override with CLI arg - profile["architecture"] = parms[:arch] if parms[:arch] + profile['architecture'] = parms[:arch] if parms[:arch] # if empty, Spacewalk will create it - profile["description"] = parms[:description] + profile['description'] = parms[:description] unless systemid - puts "Must register" - usage("No activationkey given") unless parms[:key] - puts "Registering" - systemid = server.register parms[:key], parms[:name]||fqdn, profile - File.open(fqdn, "w+") do |f| + puts 'Must register' + usage('No activationkey given') unless parms[:key] + puts 'Registering' + systemid = server.register parms[:key], parms[:name] || fqdn, profile + File.open(fqdn, 'w+') do |f| f.write systemid end puts "#{fqdn} successfully registered" @@ -115,7 +115,7 @@ def parse_args packages = client.packages server.send_packages packages end - + # if parms[:hardware] # hardware = client.hardware # server.refresh_hardware hardware diff --git a/bin/register_windows.rb b/bin/register_windows.rb index cbffbdb..0129a8f 100644 --- a/bin/register_windows.rb +++ b/bin/register_windows.rb @@ -3,21 +3,21 @@ # # for testing: prefer local path -$: << File.expand_path(File.join(File.dirname(__FILE__),"..","lib")) +$LOAD_PATH << File.expand_path(File.join(File.dirname(__FILE__), '..', 'lib')) -require "spacewalk" -require File.expand_path(File.join(File.dirname(__FILE__),'windows')) +require 'spacewalk' +require File.expand_path(File.join(File.dirname(__FILE__), 'windows')) # # Usage # -def usage msg=nil +def usage(msg=nil) STDERR.puts "*** #{msg}" if msg - STDERR.puts "Usage:" - STDERR.puts " register_windows --server --key --name --description --solv --port --arch " - STDERR.puts "Does a registration of a remote Windows system (identified by and " - exit (msg ? 1 : 0) + STDERR.puts 'Usage:' + STDERR.puts ' register_windows --server --key --name --description --solv --port --arch ' + STDERR.puts 'Does a registration of a remote Windows system (identified by and ' + exit(msg ? 1 : 0) end # @@ -27,26 +27,26 @@ def usage msg=nil def parse_args require 'getoptlong' opts = GetoptLong.new( - [ "--help", "-?", GetoptLong::NO_ARGUMENT ], - [ "--server", "-s", GetoptLong::REQUIRED_ARGUMENT ], - [ "--name", "-n", GetoptLong::REQUIRED_ARGUMENT ], - [ "--description", "-d", GetoptLong::REQUIRED_ARGUMENT ], - [ "--key", "-k", GetoptLong::REQUIRED_ARGUMENT ], - [ "--port", "-p", GetoptLong::REQUIRED_ARGUMENT ], - [ "--arch", "-a", GetoptLong::REQUIRED_ARGUMENT ], - [ "--solv", "-S", GetoptLong::REQUIRED_ARGUMENT ] + ['--help', '-?', GetoptLong::NO_ARGUMENT], + ['--server', '-s', GetoptLong::REQUIRED_ARGUMENT], + ['--name', '-n', GetoptLong::REQUIRED_ARGUMENT], + ['--description', '-d', GetoptLong::REQUIRED_ARGUMENT], + ['--key', '-k', GetoptLong::REQUIRED_ARGUMENT], + ['--port', '-p', GetoptLong::REQUIRED_ARGUMENT], + ['--arch', '-a', GetoptLong::REQUIRED_ARGUMENT], + ['--solv', '-S', GetoptLong::REQUIRED_ARGUMENT] ) result = {} - opts.each do |opt,arg| + opts.each do |opt, arg| result[opt[2..-1].to_sym] = arg end usage if result[:help] - usage("No server url given") unless result[:server] - usage("No activationkey given") unless result[:key] + usage('No server url given') unless result[:server] + usage('No activationkey given') unless result[:key] unless result[:solv] - usage("No given") if ARGV.empty? + usage('No given') if ARGV.empty? result[:fqdn] = ARGV.shift - usage("Multiple s given") unless ARGV.empty? + usage('Multiple s given') unless ARGV.empty? end result end @@ -58,7 +58,7 @@ def parse_args parms = parse_args rescue SystemExit raise -rescue Exception => e +rescue StandardError => e usage e.to_s end @@ -83,17 +83,17 @@ def parse_args server = Spacewalk::Server.new :noconfig => true, :server => parms[:server], :systemid => systemid unless systemid - puts "Must register" - puts "Retrieving Windows profile" + puts 'Must register' + puts 'Retrieving Windows profile' # get "os_release","release_name","architecture" profile = windows.profile # override with CLI arg - profile["architecture"] = parms[:arch] if parms[:arch] + profile['architecture'] = parms[:arch] if parms[:arch] # if empty, Spacewalk will create it - profile["description"] = parms[:description] - puts "Registering" - systemid = server.register parms[:key], parms[:name]||fqdn, profile - File.open(fqdn, "w+") do |f| + profile['description'] = parms[:description] + puts 'Registering' + systemid = server.register parms[:key], parms[:name] || fqdn, profile + File.open(fqdn, 'w+') do |f| f.write systemid end puts "#{fqdn} successfully registered" diff --git a/bin/submit.rb b/bin/submit.rb index de96cfb..097de59 100644 --- a/bin/submit.rb +++ b/bin/submit.rb @@ -5,25 +5,25 @@ # # for testing: prefer local path -$: << File.expand_path(File.join(File.dirname(__FILE__),"..","lib")) +$LOAD_PATH << File.expand_path(File.join(File.dirname(__FILE__), '..', 'lib')) -require "spacewalk" -require File.expand_path(File.join(File.dirname(__FILE__),'client')) +require 'spacewalk' +require File.expand_path(File.join(File.dirname(__FILE__), 'client')) # # Usage # -def usage msg=nil +def usage(msg=nil) STDERR.puts "*** #{msg}" if msg - STDERR.puts "Usage:" - STDERR.puts " submit [] " - STDERR.puts " --server " - STDERR.puts " --action " - STDERR.puts " --message " - STDERR.puts " --result " - STDERR.puts "Submit action status back to server" - exit (msg ? 1 : 0) + STDERR.puts 'Usage:' + STDERR.puts ' submit [] ' + STDERR.puts ' --server ' + STDERR.puts ' --action ' + STDERR.puts ' --message ' + STDERR.puts ' --result ' + STDERR.puts 'Submit action status back to server' + exit(msg ? 1 : 0) end # @@ -33,31 +33,31 @@ def usage msg=nil def parse_args require 'getoptlong' opts = GetoptLong.new( - [ "--help", "-?", GetoptLong::NO_ARGUMENT ], - [ "--server", "-s", GetoptLong::REQUIRED_ARGUMENT ], - [ "--action", "-a", GetoptLong::REQUIRED_ARGUMENT ], - [ "--message", "-m", GetoptLong::REQUIRED_ARGUMENT ], - [ "--result", "-r", GetoptLong::REQUIRED_ARGUMENT ] + ['--help', '-?', GetoptLong::NO_ARGUMENT], + ['--server', '-s', GetoptLong::REQUIRED_ARGUMENT], + ['--action', '-a', GetoptLong::REQUIRED_ARGUMENT], + ['--message', '-m', GetoptLong::REQUIRED_ARGUMENT], + ['--result', '-r', GetoptLong::REQUIRED_ARGUMENT] ) result = {} - opts.each do |opt,arg| + opts.each do |opt, arg| result[opt[2..-1].to_sym] = arg end usage if result[:help] - usage("No server url given") unless result[:server] - usage("No action id given") unless result[:action] + usage('No server url given') unless result[:server] + usage('No action id given') unless result[:action] unless result[:solv] - usage("No given") if ARGV.empty? + usage('No given') if ARGV.empty? result[:fqdn] = ARGV.shift - usage("Multiple s given") unless ARGV.empty? + usage('Multiple s given') unless ARGV.empty? end result end # convert actions to promises # Actions => {"id"=>6434, "version"=>2, "action"=>["packages.remove", [[["accountsservice-devel", "0.6.38", "79.1", "", ""]]]]} -# -def mk_promise actions +# +def mk_promise(_actions) end #------------------------------------ @@ -67,7 +67,7 @@ def mk_promise actions parms = parse_args rescue SystemExit raise -rescue Exception => e +rescue StandardError => e usage e.to_s end @@ -80,11 +80,11 @@ def mk_promise actions unless File.exist? fqdn STDERR.puts "#{fqdn} must be registered first" end - + begin systemid = File.open(fqdn).read server = Spacewalk::Server.new :noconfig => true, :server => parms[:server], :systemid => systemid - server.submit_response parms[:action], "0", parms[:message], { } + server.submit_response parms[:action], '0', parms[:message], { } rescue raise end diff --git a/bin/windows.rb b/bin/windows.rb index 0493428..f5fe5ac 100644 --- a/bin/windows.rb +++ b/bin/windows.rb @@ -9,12 +9,12 @@ class Windows # mapping for Registry 'root' pointers HKEYS = { - :HKEY_CLASSES_ROOT => 2147483648, #(0x80000000) - :HKEY_CURRENT_USER => 2147483649, #(0x80000001) - :HKEY_LOCAL_MACHINE => 2147483650, #(0x80000002) - :HKEY_USERS => 2147483651, #(0x80000003) - :HKEY_CURRENT_CONFIG => 2147483653, #(0x80000005) - :HKEY_DYN_DATA => 2147483654 #(0x80000006) + :HKEY_CLASSES_ROOT => 2_147_483_648, # (0x80000000) + :HKEY_CURRENT_USER => 2_147_483_649, # (0x80000001) + :HKEY_LOCAL_MACHINE => 2_147_483_650, # (0x80000002) + :HKEY_USERS => 2_147_483_651, # (0x80000003) + :HKEY_CURRENT_CONFIG => 2_147_483_653, # (0x80000005) + :HKEY_DYN_DATA => 2_147_483_654 # (0x80000006) } TYPES = { 1 => :REG_SZ, # string @@ -24,13 +24,13 @@ class Windows 7 => :REG_MULTI_SZ, # multi string } - def dump klass, result - File.open("#{klass}.xml", "w+") do |f| + def dump(klass, result) + File.open("#{klass}.xml", 'w+') do |f| f.write result.to_xml end end - def initialize host, port = 5985 + def initialize(host, port = 5985) @data = {} port ||= 5985 # if an explicit nil is passed @wsurl = "http://wsman:secret@#{host}:#{port}/wsman" @@ -40,37 +40,37 @@ def initialize host, port = 5985 @wsopt = Openwsman::ClientOptions.new # @wsopt.set_dump_request # Openwsman.debug = -1 - + @wsopt.flags = Openwsman::FLAG_ENUMERATION_OPTIMIZATION @wsopt.max_elements = 999 end - def fault result = nil + def fault(result = nil) if result && result.fault? fault = Openwsman::Fault.new result STDERR.puts "Fault code #{fault.code}, subcode #{fault.subcode}" STDERR.puts "\treason #{fault.reason}" STDERR.puts "\tdetail #{fault.detail}" else - STDERR.puts "Generic fault" + STDERR.puts 'Generic fault' STDERR.puts "Client error #{@wsman.last_error}" STDERR.puts "Client msg #{@wsman.fault_string}" end end def packages - puts "Enumerating package information" + puts 'Enumerating package information' # Class uri # note the root/default namespace (not root/cimv2) # - uri = "http://schemas.microsoft.com/wbem/wsman/1/wmi/root/default/StdRegProv" + uri = 'http://schemas.microsoft.com/wbem/wsman/1/wmi/root/default/StdRegProv' # Selectors are for key/value pairs identifying instances # # StdRegProv is a Singleton, no selectors needed # # options.add_selector( "key", value ) - + # Properties add method parameters # (Marked with [in] in method definitions) # @@ -78,16 +78,16 @@ def packages # The sSubKeyName is the path name within the Registry # - uninstall_key = "Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall" + uninstall_key = 'Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall' properties = { - "hDefKey" => HKEYS[:HKEY_LOCAL_MACHINE].to_s, - "sSubKeyName" => uninstall_key + 'hDefKey' => HKEYS[:HKEY_LOCAL_MACHINE].to_s, + 'sSubKeyName' => uninstall_key } @wsopt.properties = properties - @wsopt.set_dump_request + @wsopt.set_dump_request # Name of method invoked on the class (resp. instrance) - method = "EnumKey" - result = @wsman.invoke( @wsopt, uri, method ) + method = 'EnumKey' + result = @wsman.invoke(@wsopt, uri, method) # dump method, result if result.nil? || result.fault? fault @@ -96,19 +96,19 @@ def packages puts result.to_xml # map Registry keys to package keys keymap = { - "DisplayName" => "name", - "DisplayVersion" => "version", - "InstallDate" => "installtime" + 'DisplayName' => 'name', + 'DisplayVersion' => 'version', + 'InstallDate' => 'installtime' } packages = [] - result.EnumKey_OUTPUT.each("sNames") do |node| + result.EnumKey_OUTPUT.each('sNames') do |node| puts "Node #{node.text.inspect}" - properties["sSubKeyName"] = uninstall_key + "\\" + CGI::escapeHTML(node.text) + properties['sSubKeyName'] = uninstall_key + '\\' + CGI.escapeHTML(node.text) puts "sSubKeyName >#{properties['sSubKeyName']}<" @wsopt.properties = properties - method = "EnumValues" - subresult = @wsman.invoke( @wsopt, uri, method ) + method = 'EnumValues' + subresult = @wsman.invoke(@wsopt, uri, method) if subresult.nil? || subresult.fault? fault break @@ -120,73 +120,73 @@ def packages subresult.Types.each do |key| types << key.text.to_i end - + package = { - "name" => node.text, - "epoch" => "", - "version" => "", - "release" => "", - "arch" => "i386" + 'name' => node.text, + 'epoch' => '', + 'version' => '', + 'release' => '', + 'arch' => 'i386' } subresult.sNames.each do |key| packagekey = keymap[key.text] next unless packagekey type = types.shift - raise "sName #{key} has no type" unless type + fail "sName #{key} has no type" unless type reg_type = TYPES[type] method, valuename = case reg_type when :REG_SZ - ["GetStringValue","sValue"] # string + %w(GetStringValue sValue) # string when :REG_EXPAND_SZ - ["GetExpandedStringValue","sValue"] # expanded string + %w(GetExpandedStringValue sValue) # expanded string when :REG_BINARY - ["GetBinaryValue","uValue"] # blob + %w(GetBinaryValue uValue) # blob when :REG_DWORD - ["GetDWORDValue","uValue"] # integer + %w(GetDWORDValue uValue) # integer when :REG_MULTI_SZ - ["GetMultiStringValue","sValue"] # multi string + %w(GetMultiStringValue sValue) # multi string else - raise "Unknown type #{type}" + fail "Unknown type #{type}" end subproperties = { - "hDefKey" => HKEYS[:HKEY_LOCAL_MACHINE].to_s, - "sSubKeyName" => uninstall_key + "\\" + node.text, - "sValueName" => key + 'hDefKey' => HKEYS[:HKEY_LOCAL_MACHINE].to_s, + 'sSubKeyName' => uninstall_key + '\\' + node.text, + 'sValueName' => key } @wsopt.properties = subproperties - value = @wsman.invoke( @wsopt, uri, method ) - package[packagekey] = value.send(valuename.to_sym).text rescue "" + value = @wsman.invoke(@wsopt, uri, method) + package[packagekey] = value.send(valuename.to_sym).text rescue '' end - time = package["installtime"] + time = package['installtime'] if time # convert Windows time (20101127) to Spacewalk-time (seconds since 1.1.1970) t = time.to_s - package["installtime"] = Time.local(t[0,4],t[4,2],t[6,2]).to_i + package['installtime'] = Time.local(t[0, 4], t[4, 2], t[6, 2]).to_i else - package["installtime"] = Time.local(1970,"Jan",1).to_i + package['installtime'] = Time.local(1970, 'Jan', 1).to_i end - package["version"] = "0" if package["version"].empty? - package["release"] = "0" if package["release"].empty? + package['version'] = '0' if package['version'].empty? + package['release'] = '0' if package['release'].empty? packages << package end - + packages end - + def bios - puts "Checking the BIOS" - uri = "http://schemas.microsoft.com/wbem/wsman/1/wmi/root/cimv2/" - klass = "Win32_BIOS" - result = @wsman.enumerate( @wsopt, nil, uri+klass) + puts 'Checking the BIOS' + uri = 'http://schemas.microsoft.com/wbem/wsman/1/wmi/root/cimv2/' + klass = 'Win32_BIOS' + result = @wsman.enumerate(@wsopt, nil, uri + klass) bios = result.body.EnumerateResponse.Items.send(klass.to_sym) # dump klass, result - return nil unless bios.SMBIOSPresent.to_s == "true" + return nil unless bios.SMBIOSPresent.to_s == 'true' result = {} # result["smbios.bios.vendor"] = bios. - result["smbios.system.serial"] = bios.SerialNumber - result["smbios.system.manufacturer"] = bios.Manufacturer - result["smbios.system.product"] = bios.Name -# result["smbios.system.uuid"] = + result['smbios.system.serial'] = bios.SerialNumber + result['smbios.system.manufacturer'] = bios.Manufacturer + result['smbios.system.product'] = bios.Name +# result["smbios.system.uuid"] = result end @@ -195,30 +195,30 @@ def bios # # Return hash of hashes { "" : { ... }, ... } # - def network only_enabled=true + def network(only_enabled=true) netinterfaces = nil - puts "Enumerating network configurations" - uri = "http://schemas.microsoft.com/wbem/wsman/1/wmi/root/cimv2/" - klass = "Win32_NetworkAdapterConfiguration" - result = @wsman.enumerate( @wsopt, nil, uri+klass) + puts 'Enumerating network configurations' + uri = 'http://schemas.microsoft.com/wbem/wsman/1/wmi/root/cimv2/' + klass = 'Win32_NetworkAdapterConfiguration' + result = @wsman.enumerate(@wsopt, nil, uri + klass) result.Items.each do |node| if only_enabled - next unless node.IPEnabled.to_s == "true" + next unless node.IPEnabled.to_s == 'true' end - unless @data["DNSDomain"] - @data["DNSDomain"] = node.DNSDomain.text + unless @data['DNSDomain'] + @data['DNSDomain'] = node.DNSDomain.text end - unless @data["DNSHostName"] - @data["DNSHostName"] = node.DNSHostName.text + unless @data['DNSHostName'] + @data['DNSHostName'] = node.DNSHostName.text end - unless @data["IPAddress"] - @data["IPAddress"] = node.IPAddress.text + unless @data['IPAddress'] + @data['IPAddress'] = node.IPAddress.text end netinterfaces ||= {} - netinterfaces["net#{node.Index}"] = { + netinterfaces["net#{node.Index}"] = { 'hwaddr' => node.MACAddress.text, 'module' => node.ServiceName.text, - 'broadcast' => "255.255.255.255", # FIXME, compute from ip+subnet + 'broadcast' => '255.255.255.255', # FIXME, compute from ip+subnet 'ipaddr' => node.IPAddress.text, 'netmask' => node.IPSubnet.text } @@ -231,23 +231,23 @@ def network only_enabled=true # def hardware hw = [] - if @data["TotalPhysicalMemory"] - hw << { "class" => "memory", "ram" => (@data["TotalPhysicalMemory"].to_i / (1024 * 1024)).to_s } + if @data['TotalPhysicalMemory'] + hw << { 'class' => 'memory', 'ram' => (@data['TotalPhysicalMemory'].to_i / (1024 * 1024)).to_s } end net_if = network - if @data["DNSHostName"] && @data["DNSDomain"] && @data["IPAddress"] - hw << { "class" => "netinfo", - "hostname" => @data["DNSHostName"]+"."+@data["DNSDomain"].split(" ").first, - "ipaddr" => @data["IPAddress"] + if @data['DNSHostName'] && @data['DNSDomain'] && @data['IPAddress'] + hw << { 'class' => 'netinfo', + 'hostname' => @data['DNSHostName'] + '.' + @data['DNSDomain'].split(' ').first, + 'ipaddr' => @data['IPAddress'] } end # enum Win32_SystemDevices # then get CIM_LogicalDevice REF PartComponent; - puts "Enumerating system devices" - uri = "http://schemas.microsoft.com/wbem/wsman/1/wmi/root/cimv2/" - klass = "Win32_SystemDevices" - result = @wsman.enumerate( @wsopt, nil, uri+klass) + puts 'Enumerating system devices' + uri = 'http://schemas.microsoft.com/wbem/wsman/1/wmi/root/cimv2/' + klass = 'Win32_SystemDevices' + result = @wsman.enumerate(@wsopt, nil, uri + klass) # dump klass, result # extract # @@ -267,96 +267,94 @@ def hardware uri = part.ResourceURI.text selectors = {} part.SelectorSet.each do |sel| - selectors[sel.attr.to_s] = CGI::escapeHTML(sel.text) + selectors[sel.attr.to_s] = CGI.escapeHTML(sel.text) end @wsopt.selectors = selectors # # Get device # - result = @wsman.get( @wsopt, uri ) + result = @wsman.get(@wsopt, uri) if result.nil? || result.fault? STDERR.puts "Can't get #{uri}:#{selectors['DeviceID'].split('')}" next end result.body.each do |node| case node.name - when "Win32_Processor" - hw << { "class" => "cpu", - 'architecture' => (node.Architecture.text == "9") ? "x86_64" : "i686", + when 'Win32_Processor' + hw << { 'class' => 'cpu', + 'architecture' => (node.Architecture.text == '9') ? 'x86_64' : 'i686', 'family' => node.Family.text, 'mhz' => node.MaxClockSpeed.text, 'stepping' => node.Stepping.text, 'model' => node.Name.text, 'vendor' => node.Manufacturer.text, - 'nrcpu' => result.body.size("Win32_Processor") + 'nrcpu' => result.body.size('Win32_Processor') } - when "Win32_NetworkAdapter" - when "Win32_PnPEntity" + when 'Win32_NetworkAdapter' + when 'Win32_PnPEntity' else STDERR.puts "Unhandled #{node.name}" end end if net_if - hw << net_if.merge({ 'class' => "netinterfaces" }) + hw << net_if.merge('class' => 'netinterfaces') end end - + @wsopt.selectors = {} puts "#{count} devices" hw end def profile - begin - puts "Asking for operating system" - uri = "http://schemas.microsoft.com/wbem/wsman/1/wmi/root/cimv2/" - klass = "Win32_OperatingSystem" - result = @wsman.enumerate( @wsopt, nil, uri+klass) + puts 'Asking for operating system' + uri = 'http://schemas.microsoft.com/wbem/wsman/1/wmi/root/cimv2/' + klass = 'Win32_OperatingSystem' + result = @wsman.enumerate(@wsopt, nil, uri + klass) # dump klass, result # puts result.to_xml os = result.body.EnumerateResponse.Items.send(klass.to_sym) # debug - #puts klass - #os.each do |node| + # puts klass + # os.each do |node| # puts " #{node.name}:\t#{node.text}" - #end - - puts "Asking for computer system" - klass = "Win32_ComputerSystem" - result = @wsman.enumerate( @wsopt, nil, uri+klass) + # end + + puts 'Asking for computer system' + klass = 'Win32_ComputerSystem' + result = @wsman.enumerate(@wsopt, nil, uri + klass) # dump klass, result hw = result.body.EnumerateResponse.Items.send(klass.to_sym) - @data["TotalPhysicalMemory"] = hw.TotalPhysicalMemory.text + @data['TotalPhysicalMemory'] = hw.TotalPhysicalMemory.text # debug - #puts klass - #hw.each do |node| + # puts klass + # hw.each do |node| # puts " #{node.name}:\t#{node.text}" - #end + # end rescue STDERR.puts "EnumerateResponse failed for #{klass}" fault result return {} end - - puts "Assembling Windows profile" + + puts 'Assembling Windows profile' # assemble registration information data = {} - data["os_release"] = os.CSDVersion.text + data['os_release'] = os.CSDVersion.text puts "OS Release #{os.CSDVersion.text}" - data["release_name"] = os.Caption.text + data['release_name'] = os.Caption.text puts "Release name #{os.Caption.text}" - data["architecture"] = case os.OSType.text.to_i - when 18 then "x86-microsoft-windows" # normalize architecture + data['architecture'] = case os.OSType.text.to_i + when 18 then 'x86-microsoft-windows' # normalize architecture else STDERR.puts "Can't map #{os.OSType} to a known value" - "x86-microsoft-windows" + 'x86-microsoft-windows' end puts "Windows.profile: #{data.inspect}" data end - end # windows diff --git a/lib/spacewalk.rb b/lib/spacewalk.rb index 34c6724..778552c 100644 --- a/lib/spacewalk.rb +++ b/lib/spacewalk.rb @@ -1,6 +1,6 @@ -$: << File.dirname(__FILE__) -require "spacewalk/config" -require "spacewalk/system_id" -require "spacewalk/capabilities" -require "spacewalk/status_report" -require "spacewalk/server" +$LOAD_PATH << File.dirname(__FILE__) +require 'spacewalk/config' +require 'spacewalk/system_id' +require 'spacewalk/capabilities' +require 'spacewalk/status_report' +require 'spacewalk/server' diff --git a/lib/spacewalk/capabilities.rb b/lib/spacewalk/capabilities.rb index 15e974e..3536ecc 100644 --- a/lib/spacewalk/capabilities.rb +++ b/lib/spacewalk/capabilities.rb @@ -1,17 +1,17 @@ module Spacewalk class Capabilities - # - def initialize client + # + def initialize(client) # hash of => @caps = {} - client.http_last_response["x-rhn-server-capability"].split(",").each do |caps| - caps.split(",").each do |cap| -# puts "#{cap}" - raise "Invalid cap '#{cap}'" unless cap =~ /(\s+)?(((\w+)|\.)+)\((\d(-\d)?)\)=(\d)/ - # name = [ version, value ] - @caps[$2] = [$5, $7] -# puts "#{$2}(#{$5})=#{$7}" - end + client.http_last_response['x-rhn-server-capability'].split(',').each do |caps| + caps.split(',').each do |cap| +# puts "#{cap}" + fail "Invalid cap '#{cap}'" unless cap =~ /(\s+)?(((\w+)|\.)+)\((\d(-\d)?)\)=(\d)/ + # name = [ version, value ] + @caps[Regexp.last_match(2)] = [Regexp.last_match(5), Regexp.last_match(7)] +# puts "#{$2}(#{$5})=#{$7}" + end end end end diff --git a/lib/spacewalk/config.rb b/lib/spacewalk/config.rb index 2a186c0..1ed5bbe 100644 --- a/lib/spacewalk/config.rb +++ b/lib/spacewalk/config.rb @@ -1,25 +1,25 @@ module Spacewalk class Config - def initialize path="/etc/sysconfig/rhn/up2date" + def initialize(path='/etc/sysconfig/rhn/up2date') @path = path @config = {} File.open path do |f| - while l = f.gets - # split =, drop everything else - next unless l =~ /(\w+)=(.*)/ - key = $1 - val = $2 - # fixme: handle array-type values - @config[key.downcase] = val.empty? ? nil : val - end + while l = f.gets + # split =, drop everything else + next unless l =~ /(\w+)=(.*)/ + key = Regexp.last_match(1) + val = Regexp.last_match(2) + # FIXME: handle array-type values + @config[key.downcase] = val.empty? ? nil : val + end end rescue nil end - - def [] key + + def [](key) @config[key.downcase] end - - def method_missing name + + def method_missing(name) @config[name.to_s.downcase] end end diff --git a/lib/spacewalk/server.rb b/lib/spacewalk/server.rb index 41805aa..0ce3821 100644 --- a/lib/spacewalk/server.rb +++ b/lib/spacewalk/server.rb @@ -5,56 +5,56 @@ def get_parser end end end - + module Spacewalk class Server # from /usr/sbin/rhn_check # action version we understand ACTION_VERSION = 2 - require "xmlrpc/client" + require 'xmlrpc/client' require 'openssl' require 'uri' require 'zlib' require 'base64' require 'rexml/document' -private - def call name, *args + private + + def call(name, *args) # puts "Call #{name}(#{args.inspect})" begin - # remove trailing nil values, nil is not supported in xmlrpc - while args.size > 0 && args[-1].nil? do - args.pop - end - result = @client.call(name, *args) - rescue Exception => e - raise e unless e.message =~ /Wrong content-type/ + # remove trailing nil values, nil is not supported in xmlrpc + args.pop while args.size > 0 && args[-1].nil? + result = @client.call(name, *args) + rescue StandardError => e + raise e unless e.message =~ /Wrong content-type/ end response = @client.http_last_response - raise "XMLRPC failed with #{response.code}" unless response.code == "200" + fail "XMLRPC failed with #{response.code}" unless response.code == '200' body = response.body - case response["content-type"] - when "text/base64" - body = Base64.decode64(body) - when "text/xml" - # fallthru + case response['content-type'] + when 'text/base64' + body = Base64.decode64(body) + when 'text/xml' + # fallthru else - STDERR.puts "Unhandled content-type #{response['content-type']}" + STDERR.puts "Unhandled content-type #{response['content-type']}" end - case response["content-encoding"] - when "x-zlib" - body = Zlib::Inflate.inflate(body) + case response['content-encoding'] + when 'x-zlib' + body = Zlib::Inflate.inflate(body) when nil - # fallthru + # fallthru else - STDERR.puts "Unhandled content-encoding #{response['content-encoding']}" + STDERR.puts "Unhandled content-encoding #{response['content-encoding']}" end ok, result = @client.get_parser.parseMethodResponse(body) - raise unless ok + fail unless ok result end -public + + public # # Initialize server xmlrpc port @@ -63,35 +63,35 @@ def call name, *args # :server => string - url of server (for initial registration) # :systemid => string # - def initialize options = {} + def initialize(options = {}) @config = Spacewalk::Config.new if options[:noconfig] - uri = URI.parse(options[:server]) - raise "Server '#{options[:server]}' is not proper URL" unless uri.host - uri.path = "/XMLRPC" + uri = URI.parse(options[:server]) + fail "Server '#{options[:server]}' is not proper URL" unless uri.host + uri.path = '/XMLRPC' else - uri = URI.parse(@config.serverurl) + uri = URI.parse(@config.serverurl) end - args = {:host=>uri.host, :path => uri.path, :use_ssl => (uri.scheme == "https"), :timeout => 120 } + args = {:host => uri.host, :path => uri.path, :use_ssl => (uri.scheme == 'https'), :timeout => 120 } unless options[:noconfig] - if @config.httpProxy - args[:proxy_host], clientargs[:proxy_port] = @config.httpProxy.split ":" - end + if @config.httpProxy + args[:proxy_host], clientargs[:proxy_port] = @config.httpProxy.split ':' + end end @client = XMLRPC::Client.new_from_hash args @client.http_header_extra = {} - @client.instance_variable_get("@http").verify_mode = OpenSSL::SSL::VERIFY_NONE + @client.instance_variable_get('@http').verify_mode = OpenSSL::SSL::VERIFY_NONE welcome # parse server capabilities @capabilities = Spacewalk::Capabilities.new @client - @client.http_header_extra["X-Up2date-Version"] = "1.6.42" # from rhn-client-tools.spec - @client.http_header_extra["X-RHN-Client-Capability"] = "packages.extended_profile(2)=1" + @client.http_header_extra['X-Up2date-Version'] = '1.6.42' # from rhn-client-tools.spec + @client.http_header_extra['X-RHN-Client-Capability'] = 'packages.extended_profile(2)=1' @systemid = options[:systemid] unless @systemid || options[:noconfig] @systemid = Spacewalk::SystemId.new(@client, @config).to_xml @@ -99,12 +99,11 @@ def initialize options = {} # check for distribution update # my_id = @systemid.os_release # server_id = osversion - end # welcome to/from server def welcome - result = call "registration.welcome_message" + result = call 'registration.welcome_message' # puts "Welcome => #{result.inspect}" end @@ -112,7 +111,7 @@ def welcome def osversion result = @config.versionOverride unless result - # find rpm provider of redhat-release or distribution-release, get its version + # find rpm provider of redhat-release or distribution-release, get its version end result end @@ -124,11 +123,12 @@ def actions # puts "report => #{report.inspect}" # puts "@systemid => #{@systemid.inspect}" - result = call "queue.get", @systemid, ACTION_VERSION, report + result = call 'queue.get', @systemid, ACTION_VERSION, report # puts "queue.get => #{result.inspect}" - if action = result["action"] - result["action"] = @client.get_parser.parseMethodCall(action) + action = result['action'] + if action + result['action'] = @client.get_parser.parseMethodCall(action) end # puts "Actions => #{result.inspect}" end @@ -138,16 +138,17 @@ def actions # # time_window: (int) number of hours to look forward # - def future_actions time_window + def future_actions(time_window) time_window = time_window.to_i unless time_window.is_a? Fixnum report = Spacewalk::StatusReport.status # puts "future_actions #{time_window}" - results = call "queue.get_future_actions", @systemid, time_window + results = call 'queue.get_future_actions', @systemid, time_window # puts "queue.get_future_actions => #{results.inspect}" results.map! do |result| - if action = result["action"] - result["action"] = @client.get_parser.parseMethodCall(action) + action = result['action'] + if action + result['action'] = @client.get_parser.parseMethodCall(action) end result end @@ -157,39 +158,39 @@ def future_actions time_window # # submit action result back to server # - def submit_response action_id, status, message, data - raise "Data must be hash" unless data.is_a? Hash - result = call "queue.submit", @systemid, action_id, status, message, data + def submit_response(action_id, status, message, data) + fail 'Data must be hash' unless data.is_a? Hash + result = call 'queue.submit', @systemid, action_id, status, message, data end # # register with activation key # profile_name is hash of "os_release" => version, "release_name" => name, "architecture" => arch } # - def register activationkey, profile_name, other = {} + def register(activationkey, profile_name, other = {}) auth_dict = {} - auth_dict["profile_name"] = profile_name + auth_dict['profile_name'] = profile_name # dict of other bits to send auth_dict.update other - auth_dict["token"] = activationkey + auth_dict['token'] = activationkey # auth_dict["username"] = username # auth_dict["password"] = password # if cfg['supportsSMBIOS']: - # auth_dict["smbios"] = _encode_characters(hardware.get_smbios()) + # auth_dict["smbios"] = _encode_characters(hardware.get_smbios()) # STDERR.puts "registration.new_system #{auth_dict.inspect}" - @systemid = call "registration.new_system", auth_dict + @systemid = call 'registration.new_system', auth_dict end # # send package list to server # - def send_packages packages - call "registration.add_packages", @systemid, packages + def send_packages(packages) + call 'registration.add_packages', @systemid, packages end # # send hardware details to server # - def refresh_hardware devices - call "registration.refresh_hw_profile", @systemid, devices + def refresh_hardware(devices) + call 'registration.refresh_hw_profile', @systemid, devices end end end diff --git a/lib/spacewalk/status_report.rb b/lib/spacewalk/status_report.rb index d046370..012dfb7 100644 --- a/lib/spacewalk/status_report.rb +++ b/lib/spacewalk/status_report.rb @@ -5,13 +5,13 @@ def self.status # Return a 5-tuple containing information identifying the current operating system. # The tuple contains 5 strings: (sysname, nodename, release, version, machine). # (uname -s, uname -n, uname -r, uname -v, uname -m) - status["uname"] = [`uname -s`.chomp, `uname -n`.chomp, `uname -r`.chomp, `uname -v`.chomp, `uname -m`.chomp] + status['uname'] = [`uname -s`.chomp, `uname -n`.chomp, `uname -r`.chomp, `uname -v`.chomp, `uname -m`.chomp] begin - File.open("/proc/uptime") do |f| - status["uptime"] = f.read.split(" ").map{|v| v.to_i} - end + File.open('/proc/uptime') do |f| + status['uptime'] = f.read.split(' ').map(&:to_i) + end rescue - nil + nil end # puts status.inspect status diff --git a/lib/spacewalk/system_id.rb b/lib/spacewalk/system_id.rb index b6bd685..9cf837c 100644 --- a/lib/spacewalk/system_id.rb +++ b/lib/spacewalk/system_id.rb @@ -1,10 +1,10 @@ module Spacewalk class SystemId require 'xmlrpc/client' - def initialize client, config - raise "Expecting a Spacewalk::Config parameter to #{self.class}.new" unless config.is_a?(Spacewalk::Config) - @path = config["systemIdPath"] - raise "systemIdPath is empty !" unless @path + def initialize(client, config) + fail "Expecting a Spacewalk::Config parameter to #{self.class}.new" unless config.is_a?(Spacewalk::Config) + @path = config['systemIdPath'] + fail 'systemIdPath is empty !' unless @path # # # @@ -14,13 +14,14 @@ def initialize client, config # admin # File.open(@path) do |f| - @raw = f.read - @members = client.get_parser.parseMethodResponse(@raw) + @raw = f.read + @members = client.get_parser.parseMethodResponse(@raw) end puts "SystemId => #{@members.inspect}" end + def to_xml @raw end end -end \ No newline at end of file +end diff --git a/lib/spacewalk/version.rb b/lib/spacewalk/version.rb index 55614f1..224b0b1 100644 --- a/lib/spacewalk/version.rb +++ b/lib/spacewalk/version.rb @@ -1,3 +1,3 @@ module Spacewalk - VERSION = "0.0.2" + VERSION = '0.0.2' end diff --git a/lib/spacewalk/xmlrpc.rb b/lib/spacewalk/xmlrpc.rb index 9d60ad0..72b47d0 100644 --- a/lib/spacewalk/xmlrpc.rb +++ b/lib/spacewalk/xmlrpc.rb @@ -1,38 +1,38 @@ module Spacewalk class Xmlrpc require 'rexml/document' -private - def self.value2ruby element + + def self.value2ruby(element) puts "value2ruby element #{element}" node = element[0] puts "value2ruby node #{node}" case node.name - when "string" - node.text - when "struct" - raise "value2ruby: not following " unless node[0].name == "member" - value = {} - puts "Struct #{node}" - node.each_element("member") do |e| - name = e.elements["member/name"].text - v = value2ruby m.elements["member/value"] - value[name] = v - end - value - when "array" - raise "value2ruby: not following " unless node[0].name == "data" - value = [] -# puts "Array #{node}" - node.each_element("data/value") do |e| -# puts "recursive #{e}" - value << value2ruby(e) - end - value + when 'string' + node.text + when 'struct' + fail 'value2ruby: not following ' unless node[0].name == 'member' + value = {} + puts "Struct #{node}" + node.each_element('member') do |e| + name = e.elements['member/name'].text + v = value2ruby m.elements['member/value'] + value[name] = v + end + value + when 'array' + fail 'value2ruby: not following ' unless node[0].name == 'data' + value = [] +# puts "Array #{node}" + node.each_element('data/value') do |e| +# puts "recursive #{e}" + value << value2ruby(e) + end + value else - raise "value2ruby: Can't handle element '#{element.name}'" + fail "value2ruby: Can't handle element '#{element.name}'" end end -public + # # # @@ -44,15 +44,15 @@ def self.value2ruby element # ... # ... # - def self.decode what - @doc.root.elements["params/param"] + def self.decode(_what) + @doc.root.elements['params/param'] initialize config - raise "Expecting a Spacewalk::Config parameter to #{self.class}.new" unless config.is_a?(Spacewalk::Config) - @path = config["systemIdPath"] - raise "systemIdPath is empty !" unless @path + fail "Expecting a Spacewalk::Config parameter to #{self.class}.new" unless config.is_a?(Spacewalk::Config) + @path = config['systemIdPath'] + fail 'systemIdPath is empty !' unless @path @doc = REXML::Document.new(File.open(@path)) - @members = @doc.root.elements["params/param"] + @members = @doc.root.elements['params/param'] end end -end \ No newline at end of file +end diff --git a/rubocop_todo.yml b/rubocop_todo.yml new file mode 100644 index 0000000..3b12c80 --- /dev/null +++ b/rubocop_todo.yml @@ -0,0 +1,105 @@ +# This configuration was generated by `rubocop --auto-gen-config` +# on 2015-03-12 11:03:52 +0100 using RuboCop version 0.28.0. +# The point is for the user to remove these configuration records +# one by one as the offenses are removed from the code base. +# Note that changes in the inspected code, or installation of new +# versions of RuboCop, may require this file to be generated again. + +# Offense count: 3 +# Configuration parameters: AllowSafeAssignment. +Lint/AssignmentInCondition: + Enabled: false + +# Offense count: 9 +Lint/UselessAssignment: + Enabled: false + +# Offense count: 16 +Metrics/AbcSize: + Max: 79 + +# Offense count: 2 +# Configuration parameters: CountComments. +Metrics/ClassLength: + Max: 266 + +# Offense count: 6 +Metrics/CyclomaticComplexity: + Max: 17 + +# Offense count: 42 +# Configuration parameters: AllowURI, URISchemes. +Metrics/LineLength: + Max: 181 + +# Offense count: 21 +# Configuration parameters: CountComments. +Metrics/MethodLength: + Max: 87 + +# Offense count: 4 +Metrics/PerceivedComplexity: + Max: 15 + +# Offense count: 1 +Style/AccessorMethodName: + Enabled: false + +# Offense count: 7 +# Cop supports --auto-correct. +# Configuration parameters: EnforcedHashRocketStyle, EnforcedColonStyle, EnforcedLastArgumentHashStyle, SupportedLastArgumentHashStyles. +Style/AlignHash: + Enabled: false + +# Offense count: 6 +# Configuration parameters: IndentWhenRelativeTo, SupportedStyles, IndentOneStep. +Style/CaseIndentation: + Enabled: false + +# Offense count: 31 +# Cop supports --auto-correct. +Style/CommentIndentation: + Enabled: false + +# Offense count: 10 +Style/Documentation: + Enabled: false + +# Offense count: 2 +# Configuration parameters: MinBodyLength. +Style/GuardClause: + Enabled: false + +# Offense count: 30 +# Cop supports --auto-correct. +# Configuration parameters: SupportedStyles. +Style/HashSyntax: + EnforcedStyle: hash_rockets + +# Offense count: 8 +# Configuration parameters: MaxLineLength. +Style/IfUnlessModifier: + Enabled: false + +# Offense count: 4 +Style/RescueModifier: + Enabled: false + +# Offense count: 6 +# Cop supports --auto-correct. +# Configuration parameters: EnforcedStyle, SupportedStyles. +Style/SpaceAroundEqualsInParameterDefault: + Enabled: false + +# Offense count: 3 +# Cop supports --auto-correct. +# Configuration parameters: EnforcedStyle, EnforcedStyleForEmptyBraces, SupportedStyles. +Style/SpaceInsideHashLiteralBraces: + Enabled: false + +# Offense count: 1 +# Cop supports --auto-correct. +# Configuration parameters: ExactNameMatch, AllowPredicates, AllowDSLWriters, Whitelist. +Style/TrivialAccessors: + Enabled: false + diff --git a/spacewalk.gemspec b/spacewalk.gemspec index 8aef6b2..8fc7827 100644 --- a/spacewalk.gemspec +++ b/spacewalk.gemspec @@ -1,20 +1,20 @@ # -*- encoding: utf-8 -*- -$:.push File.expand_path("../lib", __FILE__) -require "spacewalk/version" +$LOAD_PATH.push File.expand_path('../lib', __FILE__) +require 'spacewalk/version' Gem::Specification.new do |s| - s.name = "spacewalk" + s.name = 'spacewalk' s.version = Spacewalk::VERSION s.platform = Gem::Platform::RUBY - s.authors = ["Klaus Kämpf"] - s.email = ["kkaempf@suse.de"] - s.homepage = "https://github.com/kkaempf/ruby-spacewalk" - s.summary = %q{A pure-Ruby implementation of the Spacewalk client side} - s.description = %q{Can be used for testing or to attach 'foreign' -systems} - - s.rubyforge_project = "spacewalk" + s.authors = ['Klaus Kämpf'] + s.email = ['kkaempf@suse.de'] + s.homepage = 'https://github.com/kkaempf/ruby-spacewalk' + s.summary = 'A pure-Ruby implementation of the Spacewalk client side' + s.description = "Can be used for testing or to attach 'foreign' +systems" + + s.rubyforge_project = 'spacewalk' s.add_development_dependency('rake') s.add_development_dependency('bundler') @@ -23,6 +23,6 @@ systems} s.files.reject! { |fn| fn == '.gitignore' } s.extra_rdoc_files = Dir['README*', 'TODO*', 'CHANGELOG*', 'LICENSE'] s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n") - s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) } - s.require_paths = ["lib"] + s.executables = `git ls-files -- bin/*`.split("\n").map { |f| File.basename(f) } + s.require_paths = ['lib'] end diff --git a/tasks/doc.rake b/tasks/doc.rake index 5a22282..ebb9a6c 100644 --- a/tasks/doc.rake +++ b/tasks/doc.rake @@ -1,14 +1,14 @@ begin - require 'yard' + require 'yard' YARD::Rake::YardocTask.new(:doc) do |t| t.files = ['lib/**/*.rb'] t.options = ['--no-private'] end -rescue LoadError - STDERR.puts "Install yard if you want prettier docs" - require 'rdoc/task' - Rake::RDocTask.new(:doc) do |rdoc| - rdoc.rdoc_dir = "doc" - rdoc.title = "Spacewalk #{Spacewalk::VERSION}" - end + rescue LoadError + STDERR.puts 'Install yard if you want prettier docs' + require 'rdoc/task' + Rake::RDocTask.new(:doc) do |rdoc| + rdoc.rdoc_dir = 'doc' + rdoc.title = "Spacewalk #{Spacewalk::VERSION}" + end end