Hello community, here is the log from the commit of package SUSEConnect for openSUSE:Factory checked in at 2018-03-16 10:34:57 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/SUSEConnect (Old) and /work/SRC/openSUSE:Factory/.SUSEConnect.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "SUSEConnect" Fri Mar 16 10:34:57 2018 rev:9 rq:587487 version:0.3.8 Changes: -------- --- /work/SRC/openSUSE:Factory/SUSEConnect/SUSEConnect.changes 2018-02-03 15:36:25.358409900 +0100 +++ /work/SRC/openSUSE:Factory/.SUSEConnect.new/SUSEConnect.changes 2018-03-16 10:35:01.590453555 +0100 @@ -1,0 +2,9 @@ +Thu Mar 13 12:54:57 UTC 2018 - fschnizl...@suse.com + +- Update to 0.3.8 + - Fix list-extensions to show the full SLE 15 tree (bsc#1064264) + - Enable automatic activation of recommended extensions/modules + - Automatically deregister all installed extensions/modules when + deregistering a system + +------------------------------------------------------------------- Old: ---- suse-connect-0.3.7.gem New: ---- suse-connect-0.3.8.gem ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ SUSEConnect.spec ++++++ --- /var/tmp/diff_new_pack.rKfw1B/_old 2018-03-16 10:35:02.938405021 +0100 +++ /var/tmp/diff_new_pack.rKfw1B/_new 2018-03-16 10:35:02.946404733 +0100 @@ -16,7 +16,7 @@ # Name: SUSEConnect -Version: 0.3.7 +Version: 0.3.8 Release: 0 %define mod_name suse-connect %define mod_full_name %{mod_name}-%{version} ++++++ suse-connect-0.3.7.gem -> suse-connect-0.3.8.gem ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/README.md new/README.md --- old/README.md 2018-01-30 15:28:44.000000000 +0100 +++ new/README.md 2018-03-14 15:36:57.000000000 +0100 @@ -18,7 +18,6 @@ # Rake tasks ``` -rake build # build locally (see PACKAGE.md for details) rake bump # increase version of a gem rake console # Run console loaded with gem rake rubocop # Run Rubocop @@ -31,38 +30,44 @@ For SLES12SP0 -* `docker build -t connect .` +* `docker build -t connect.12sp0 -f Dockerfile.12sp0 .` For SLES12SP1 -* `docker build -t connect.sp1 -f Dockerfile.sp1 .` +* `docker build -t connect.12sp1 -f Dockerfile.12sp1 .` For SLES12SP2 -* `docker build -t connect.sp2 -f Dockerfile.sp2 .` +* `docker build -t connect.12sp2 -f Dockerfile.12sp2 .` For SLES12SP3 -* `docker build -t connect.sp3 -f Dockerfile.sp3 .` +* `docker build -t connect.12sp3 -f Dockerfile.12sp3 .` + +For SLES15SP0 + +* `docker build -t connect.15sp0 -f Dockerfile.15sp0 .` ## Run commands +Note: Substitute `connect.12sp0` with the respective image you've built above. + Open a console -* `docker run --privileged --rm -ti connect /bin/bash` +* `docker run --privileged --rm -ti connect.12sp0 /bin/bash` Run RSpec -* `docker run --privileged --rm -t connect su nobody -c rspec` +* `docker run --privileged --rm -t connect.12sp0 su nobody -c rspec` Run Cucumber -* `docker run --privileged --rm -t connect cucumber` +* `docker run --privileged --rm -t connect.12sp0 cucumber` Run Rubocop -* `docker run --privileged --rm -t connect su nobody -c rubocop` +* `docker run --privileged --rm -t connect.12sp0 su nobody -c rubocop` Or run whole set of tests together -* `docker run --privileged --rm -t connect sh docker/runall.sh` +* `docker run --privileged --rm -t connect.12sp0 sh docker/runall.sh` Binary files old/checksums.yaml.gz and new/checksums.yaml.gz differ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/suse/connect/cli.rb new/lib/suse/connect/cli.rb --- old/lib/suse/connect/cli.rb 2018-01-30 15:28:44.000000000 +0100 +++ new/lib/suse/connect/cli.rb 2018-03-14 15:36:57.000000000 +0100 @@ -204,7 +204,7 @@ @opts.on('--version', 'Print program version.') do puts VERSION - exit + exit 0 end @opts.on('--debug', 'Provide debug output.') do |opt| @@ -214,7 +214,7 @@ @opts.on_tail('-h', '--help', 'Show this message.') do puts @opts - exit + exit 0 end @opts.set_summary_width(24) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/suse/connect/client.rb new/lib/suse/connect/client.rb --- old/lib/suse/connect/client.rb 2018-01-30 15:28:44.000000000 +0100 +++ new/lib/suse/connect/client.rb 2018-03-14 15:36:57.000000000 +0100 @@ -25,10 +25,33 @@ def register! announce_or_update product = @config.product || Zypper.base_product + + register_product(product, @config.product ? true : false) + + # Only register recommended packages for base products + if product.isbase + tree = show_product(product) + recommended = flatten_tree(tree).select { |e| e[:recommended] == true } + + recommended.each do |extension| + register_product(extension) + end + end + + log.info 'Successfully registered system.' + end + + # Activate the product, add the service and install the relase package + def register_product(product, install_release_package = true) service = activate_product(product, @config.email) + System.add_service(service) - Zypper.install_release_package(product.identifier) if @config.product - print_success_message product + + if install_release_package + Zypper.refresh_services + Zypper.install_release_package(product.identifier) + end + print_success_message(product) end # Deregisters a whole system or a single product @@ -37,18 +60,35 @@ def deregister! raise SystemNotRegisteredError unless registered? if @config.product - raise BaseProductDeactivationError if @config.product == Zypper.base_product - service = deactivate_product @config.product - remove_or_refresh_service(service) - Zypper.remove_release_package @config.product.identifier - print_success_message @config.product, action: 'Deregistered' + deregister_product(@config.product) else + tree = show_product(Zypper.base_product) + installed = Zypper.installed_products.map(&:identifier) + dependencies = flatten_tree(tree).select { |e| installed.include? e[:identifier] } + + dependencies.reverse.each do |product| + deregister_product(product) + end @api.deregister(system_auth) System.cleanup! log.info 'Successfully deregistered system.' end end + # Flatten a product tree into an array + # + # @param tree Remote::Product + # + # @returns an array of the flattend tree + def flatten_tree(tree) + result = [] + tree.extensions.each do |extension| + result.push(extension) + result += flatten_tree(extension) + end + result + end + # Announce system via SCC/Registration Proxy # # @returns: [Array] login, password tuple. Those credentials are given by SCC/Registration Proxy @@ -168,6 +208,14 @@ private + def deregister_product(product) + raise BaseProductDeactivationError if product == Zypper.base_product + service = deactivate_product product + remove_or_refresh_service(service) + Zypper.remove_release_package product.identifier + print_success_message product, action: 'Deregistered' + end + # Announces the system to the server, receiving and storing its credentials. # When already announced, sends the current hardware details to the server def announce_or_update diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/suse/connect/connection.rb new/lib/suse/connect/connection.rb --- old/lib/suse/connect/connection.rb 2018-01-30 15:28:44.000000000 +0100 +++ new/lib/suse/connect/connection.rb 2018-03-14 15:36:57.000000000 +0100 @@ -22,8 +22,11 @@ uri = URI.parse(endpoint) http = Net::HTTP.new(uri.host, uri.port) if http.proxy? - http.proxy_user = SUSE::Toolkit::CurlrcDotfile.new.username - http.proxy_pass = SUSE::Toolkit::CurlrcDotfile.new.password + proxy_address = http.proxy_uri.hostname + proxy_port = http.proxy_uri.port + proxy_user = SUSE::Toolkit::CurlrcDotfile.new.username + proxy_pass = SUSE::Toolkit::CurlrcDotfile.new.password + http = Net::HTTP.new(uri.host, uri.port, proxy_address, proxy_port, proxy_user, proxy_pass) end http.use_ssl = uri.is_a? URI::HTTPS http.verify_mode = insecure ? OpenSSL::SSL::VERIFY_NONE : OpenSSL::SSL::VERIFY_PEER diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/suse/connect/status.rb new/lib/suse/connect/status.rb --- old/lib/suse/connect/status.rb 2018-01-30 15:28:44.000000000 +0100 +++ new/lib/suse/connect/status.rb 2018-03-14 15:36:57.000000000 +0100 @@ -77,10 +77,6 @@ extensions end - def grouped_extensions - @grouped_extensions ||= available_system_extensions.group_by { |ext| ext[:free] } - end - def build_product_activation_code(product) "#{product.identifier}/#{product.version}/#{product.arch}" end diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/suse/connect/templates/extension.text.erb new/lib/suse/connect/templates/extension.text.erb --- old/lib/suse/connect/templates/extension.text.erb 1970-01-01 01:00:00.000000000 +0100 +++ new/lib/suse/connect/templates/extension.text.erb 2018-03-14 15:36:57.000000000 +0100 @@ -0,0 +1,4 @@ +<%= render 'extension_item.text', { extension: extension, any_installed: any_installed, level: level} %> +<% extension.fetch(:extensions, []).sort_by { |ext| ext[:name] }.each do |sub_extension| -%> +<%= render 'extension.text', { extension: sub_extension, any_installed: any_installed, level: level + 1} -%> +<% end -%> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/suse/connect/templates/extension_item.text.erb new/lib/suse/connect/templates/extension_item.text.erb --- old/lib/suse/connect/templates/extension_item.text.erb 2018-01-30 15:28:44.000000000 +0100 +++ new/lib/suse/connect/templates/extension_item.text.erb 2018-03-14 15:36:57.000000000 +0100 @@ -1,11 +1,11 @@ -\e[1m<%= extension[:name] %>\e[0m<% +<%= indent(level) %>\e[1m<%= extension[:name] %>\e[0m<% if extension[:installed] %> \e[32m(Installed)\e[0m - <%= ' ' if defined?(nested) %>De-Install with: <%= ' ' unless defined?(nested) %>SUSEConnect \e[31m-d\e[0m -p <%= extension[:activation_code] %><% +<%= indent(level) %>Deactivate with: SUSEConnect \e[31m-d\e[0m -p <%= extension[:activation_code] %><% else %><% if extension[:activated] %> \e[33m(Activated)\e[0m<% end %> - <%= ' ' if defined?(nested) %>Install with: <%= ' ' unless defined?(nested) %>SUSEConnect<%= ' ' if any_installed %> -p <%= extension[:activation_code] %><% unless extension[:free] %> -r \e[32m\e[1mREGCODE\e[0m<% +<%= indent(level) %>Activate with: SUSEConnect<%= ' ' if any_installed %> -p <%= extension[:activation_code] %><% unless extension[:free] %> -r \e[32m\e[1mADDITIONAL REGCODE\e[0m<% end %><% end %> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/suse/connect/templates/extensions_list.text.erb new/lib/suse/connect/templates/extensions_list.text.erb --- old/lib/suse/connect/templates/extensions_list.text.erb 2018-01-30 15:28:44.000000000 +0100 +++ new/lib/suse/connect/templates/extensions_list.text.erb 2018-03-14 15:36:57.000000000 +0100 @@ -1,19 +1,9 @@ \e[1mAVAILABLE EXTENSIONS AND MODULES\e[0m -<% -any_installed = installed_products.select {|x| !x.isbase }.any? -{ true => 'FREE EXTENSIONS', false => 'PAID EXTENSIONS' }.each do |type_key, title| - if grouped_extensions[type_key] %> -\e[1m<%= title %>\e[0m - -<% grouped_extensions[type_key].each do |extension| -%> - <%= render 'extension_item.text', locals: { extension: extension, any_installed: any_installed } %> -<% extension[:extensions].each do |extension| -%> - <%= render 'extension_item.text', locals: { extension: extension, nested: true, any_installed: any_installed } %> -<% end - end - end -end %> +<% any_installed = installed_products.select {|x| !x.isbase }.any? -%> +<% available_system_extensions.sort_by { |ext| ext[:name] }.each do |extension| -%> +<%= render 'extension.text', { extension: extension, any_installed: any_installed, level: 1 } -%> +<% end -%> \e[1mMORE INFORMATION\e[0m You can find more information about available modules here: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/suse/connect/version.rb new/lib/suse/connect/version.rb --- old/lib/suse/connect/version.rb 2018-01-30 15:28:44.000000000 +0100 +++ new/lib/suse/connect/version.rb 2018-03-14 15:36:57.000000000 +0100 @@ -1,6 +1,6 @@ module SUSE # Provides access to version number of a gem module Connect - VERSION = '0.3.7' + VERSION = '0.3.8' end end diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/suse/toolkit/renderer.rb new/lib/suse/toolkit/renderer.rb --- old/lib/suse/toolkit/renderer.rb 2018-01-30 15:28:44.000000000 +0100 +++ new/lib/suse/toolkit/renderer.rb 2018-03-14 15:36:57.000000000 +0100 @@ -7,11 +7,21 @@ super end - def render(filename, locals: binding) - bind = locals.is_a?(Binding) ? locals : OpenStruct.new(locals).instance_eval { binding } - @templates[filename] ||= ERB.new File.read(File.expand_path("../../connect/templates/#{filename}.erb", __FILE__)), 0, '-<>' + def render(filename, locals = {}) + bind = binding + path = "../../connect/templates/#{filename}.erb" + + locals.each_pair do |key, value| + bind.local_variable_set(key, value) + end + + @templates[filename] ||= ERB.new File.read(File.expand_path(path, __FILE__)), 0, '-<>' @templates[filename].result(bind).gsub('\e', "\e") end + + def indent(level) + ' ' * (level * 4) + end end end end diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/tasks/package.rake new/lib/tasks/package.rake --- old/lib/tasks/package.rake 1970-01-01 01:00:00.000000000 +0100 +++ new/lib/tasks/package.rake 2018-03-14 15:36:57.000000000 +0100 @@ -0,0 +1,120 @@ +require 'tempfile' +require 'English' + +def version_from_spec(spec_glob) + version = `grep '^Version:' #{spec_glob}` + version[/(\d\.\d\.\d)/, 0] +end + +def upstream_file(name, file_type, obs_project, package_name) + file = Tempfile.new(name.to_s) + file.close + `osc -A 'https://api.opensuse.org' cat '#{obs_project}' '#{package_name}' '#{package_name}#{file_type}' > #{file.path}` + file +end + +namespace :package do + package_dir = 'package/' + package_name = 'SUSEConnect' + obs_project = 'systemsmanagement:SCC' + local_spec_file = "#{package_name}.spec" + root_path = File.join(File.dirname(__FILE__), '../..') + + desc 'Check local checkout for uncommitted changes' + task :check_git do + modified = `git ls-files -m -o --exclude-standard .` + if modified.empty? + puts 'No uncommitted changes detected.' + else + raise "Warning: uncommitted or untracked changes!\n\n#{modified}\n" + end + end + + desc 'Checkout from OBS' + task :checkout do + Dir.chdir "#{root_path}/#{package_dir}" do + unless Dir['.osc'].any? + sh 'mkdir .tmp; mv * .tmp/' + sh "osc co #{obs_project} #{package_name} -o ." + puts 'Checkout successful.' if $CHILD_STATUS.exitstatus.zero? + end + `rm *suse-connect-*.gem` if Dir['*.gem'].any? + end + end + + desc 'Build gem and copy to package' + task :build_gem do + Dir.chdir root_path.to_s + gemfilename = "suse-connect-#{SUSE::Connect::VERSION}.gem" + + `rm suse-connect-*.gem` if Dir['*.gem'].any? + `gem build suse-connect.gemspec` + + raise 'Gem build failed.' unless $CHILD_STATUS.exitstatus.zero? + + sh "cp #{gemfilename} #{package_dir}" + puts "Gem built and copied to #{package_dir}." if $CHILD_STATUS.exitstatus.zero? + end + + desc 'Generate man pages' + task :generate_manpages do + Dir.chdir root_path.to_s + sh 'ronn --roff --manual SUSEConnect --pipe SUSEConnect.8.ronn > package/SUSEConnect.8' + sh 'ronn --roff --manual SUSEConnect --pipe SUSEConnect.5.ronn > package/SUSEConnect.5' + end + + desc 'Check for changelog update' + task :changelog do + Dir.chdir "#{root_path}/#{package_dir}" do + file = upstream_file('connect-changes-rake', '.changes', obs_project, package_name) + if FileUtils.compare_file("#{package_name}.changes", file.path) + raise 'Upstream changelog identical. Please run `osc vc` to log new changes.' + elsif !IO.read("#{package_name}.changes").include? "Update to #{SUSE::Connect::VERSION}" + raise 'Please run `osc vc` to add changelog about version bump.' + else + modified = `osc status | grep -Po 'M\s+SUSEConnect\.changes'` + puts 'Changelog updated.' if modified + end + end + end + + desc 'Check for version bump in specfile' + task :check_specfile_version do + Dir.chdir "#{root_path}/#{package_dir}" do + file = upstream_file('connect-spec-rake', '.spec', obs_project, package_name) + original_version = version_from_spec(file.path) + new_version = version_from_spec(local_spec_file) + + if new_version == original_version + raise "Version in #{package_name}.spec not changed. Please change to the latest version before committing.\n" + else + puts "Version change to #{new_version} in #{package_name}.spec detected." + end + end + end + + desc 'Prepare package for checking in to OBS' + task :prepare do + puts '== Step 1: check for uncommitted changes' + Rake::Task['package:check_git'].invoke + ## + puts '== Step 2: Checkout from OBS' + Rake::Task['package:checkout'].invoke + ## + puts '== Step 3: Build gem and copy to package' + Rake::Task['package:build_gem'].invoke + ## + puts '== Step 4: Generate man pages' + Rake::Task['package:generate_manpages'].invoke + ## + puts "== Step 5: Check changelog update in #{package_name}.changes" + Rake::Task['package:changelog'].invoke + ## + puts '== Step 6: check for version bump in specfile' + Rake::Task['package:check_specfile_version'].invoke + ## + puts 'Package preparation complete. Run `osc ar` to add changes and `osc ci` to check in package to OBS.' + Dir.chdir "#{root_path}/#{package_dir}" + sh 'osc status' + end +end diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/metadata new/metadata --- old/metadata 2018-01-30 15:28:44.000000000 +0100 +++ new/metadata 2018-03-14 15:36:57.000000000 +0100 @@ -1,14 +1,14 @@ --- !ruby/object:Gem::Specification name: suse-connect version: !ruby/object:Gem::Version - version: 0.3.7 + version: 0.3.8 platform: ruby authors: - SUSE Customer Center Team autorequire: bindir: bin cert_chain: [] -date: 2018-01-30 00:00:00.000000000 Z +date: 2018-03-14 00:00:00.000000000 Z dependencies: [] description: This package provides a command line tool and rubygem library for connecting a client system to the SUSE Customer Center. It will connect the system to your @@ -49,6 +49,7 @@ - lib/suse/connect/ssl_certificate.rb - lib/suse/connect/status.rb - lib/suse/connect/system.rb +- lib/suse/connect/templates/extension.text.erb - lib/suse/connect/templates/extension_item.text.erb - lib/suse/connect/templates/extensions_list.text.erb - lib/suse/connect/templates/product_statuses.text.erb @@ -63,6 +64,7 @@ - lib/suse/toolkit/renderer.rb - lib/suse/toolkit/system_calls.rb - lib/suse/toolkit/utilities.rb +- lib/tasks/package.rake homepage: https://github.com/SUSE/connect licenses: - LGPL-2.1 @@ -83,7 +85,7 @@ version: '0' requirements: [] rubyforge_project: -rubygems_version: 2.2.2 +rubygems_version: 2.7.6 signing_key: specification_version: 4 summary: SUSE Connect utility to register a system with the SUSE Customer Center