foreman_scc_manager 1.8.0 → 1.8.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +5 -0
- data/app/assets/javascripts/foreman_scc_manager/scc_accounts.js.coffee +1 -1
- data/app/controllers/scc_accounts_controller.rb +20 -1
- data/app/lib/actions/scc_manager/sync_products.rb +8 -7
- data/app/lib/actions/scc_manager/sync_repositories.rb +8 -7
- data/app/lib/scc_manager.rb +2 -2
- data/app/models/scc_account.rb +10 -6
- data/app/models/scc_product.rb +2 -0
- data/app/views/scc_accounts/_form.html.erb +3 -2
- data/app/views/scc_accounts/index.html.erb +4 -3
- data/app/views/scc_accounts/show.html.erb +3 -3
- data/config/routes.rb +2 -1
- data/db/migrate/20200520281300_fix_scc_permissions.rb +22 -0
- data/lib/foreman_scc_manager/engine.rb +38 -25
- data/lib/foreman_scc_manager/version.rb +1 -1
- data/lib/tasks/test.rake +1 -1
- data/locale/de/LC_MESSAGES/foreman_scc_manager.mo +0 -0
- data/locale/de/foreman_scc_manager.po +124 -121
- data/locale/en/foreman_scc_manager.po +86 -139
- data/locale/foreman_scc_manager.pot +17 -11
- data/test/fixtures/models/scc_products.yml +24 -0
- data/test/fixtures/models/scc_repositories.yml +15 -0
- data/test/models/scc_product_test.rb +56 -1
- data/test/support/fixtures_support.rb +3 -2
- metadata +22 -5
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: f4d297d61cfdedf0fb329cba44d7925c052c1c8e80f8f0ec58b1435b90b229fe
         | 
| 4 | 
            +
              data.tar.gz: 3b434307e158ce5b45ad3e719a7538895a8bcf8d01c98f449561c8d18d4ba87f
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: b31980bb5ef8302a4015ddc5338a7cbb217e666c271ae03781ba530d3823a8608e8afd9d686f80113280ed9033a033b9988fcf8a7a376e791ed2e4a30d7bf159
         | 
| 7 | 
            +
              data.tar.gz: 8ebaf1d499fbe65e28c61177ddfbbc6efdf6d1438dc854493686b3842d41ae8a0d9f3bb6ef66bede4ecb2c5c0c82a40da50221e376d96974e0bca18a684a6eb5
         | 
    
        data/README.md
    CHANGED
    
    | @@ -13,6 +13,8 @@ for how to install Foreman plugins | |
| 13 13 |  | 
| 14 14 | 
             
            | Foreman Version | Katello Version | Plugin Version |
         | 
| 15 15 | 
             
            | --------------- | --------------- | -------------- |
         | 
| 16 | 
            +
            | 2.1             | 3.16            | ~> 1.8.5       |
         | 
| 17 | 
            +
            | 2.0             | 3.16            | ~> 1.8.4       |
         | 
| 16 18 | 
             
            | 1.24            | 3.14            | ~> 1.8.0       |
         | 
| 17 19 | 
             
            | 1.22            | 3.12            | ~> 1.7.0       |
         | 
| 18 20 | 
             
            | 1.21            | 3.10            | ~> 1.6.0       |
         | 
| @@ -23,6 +25,9 @@ for how to install Foreman plugins | |
| 23 25 | 
             
            | 1.16            | 3.5             | <= 1.3.0       |
         | 
| 24 26 | 
             
            | 1.15            | 3.4             | ~> 1.1.0       |
         | 
| 25 27 |  | 
| 28 | 
            +
            ## Documentation
         | 
| 29 | 
            +
            The plugin documentation can be found at https://docs.orcharhino.com/sources/management_ui/the_content_menu/suse_subscriptions.html.
         | 
| 30 | 
            +
             | 
| 26 31 | 
             
            ## Contributing
         | 
| 27 32 |  | 
| 28 33 | 
             
            Fork and send a Pull Request. Thanks!
         | 
| @@ -1,4 +1,5 @@ | |
| 1 1 | 
             
            class SccAccountsController < ApplicationController
         | 
| 2 | 
            +
              helper_method :scc_filtered_products
         | 
| 2 3 | 
             
              before_action :find_organization
         | 
| 3 4 | 
             
              before_action :find_resource, only: %i[show edit update destroy sync bulk_subscribe]
         | 
| 4 5 | 
             
              include Foreman::Controller::AutoCompleteSearch
         | 
| @@ -7,6 +8,11 @@ class SccAccountsController < ApplicationController | |
| 7 8 | 
             
              def index
         | 
| 8 9 | 
             
                @scc_accounts = resource_base.search_for(params[:search], order: params[:order])
         | 
| 9 10 | 
             
                                             .paginate(page: params[:page])
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                # overwrite the product list with filtered products that do not include products with empty repositories
         | 
| 13 | 
            +
                @scc_accounts.each do |scc_account|
         | 
| 14 | 
            +
                  scc_account.scc_products_with_repos_count = scc_account.scc_products.only_products_with_repos.count
         | 
| 15 | 
            +
                end
         | 
| 10 16 | 
             
              end
         | 
| 11 17 |  | 
| 12 18 | 
             
              # GET /scc_accounts/new
         | 
| @@ -121,9 +127,22 @@ class SccAccountsController < ApplicationController | |
| 121 127 | 
             
                when 'sync', 'test_connection'
         | 
| 122 128 | 
             
                  :sync
         | 
| 123 129 | 
             
                when 'bulk_subscribe'
         | 
| 124 | 
            -
                  : | 
| 130 | 
            +
                  :use
         | 
| 125 131 | 
             
                else
         | 
| 126 132 | 
             
                  super
         | 
| 127 133 | 
             
                end
         | 
| 128 134 | 
             
              end
         | 
| 135 | 
            +
             | 
| 136 | 
            +
              # Function filters a product list and removes all products without valid repositories
         | 
| 137 | 
            +
              # The .order call is necessary to apply the ordering to repository that have already been loaded from the database.
         | 
| 138 | 
            +
              # Input parameters:
         | 
| 139 | 
            +
              # product_list: list of SccProduct
         | 
| 140 | 
            +
              # product_type: return only base products if type is set (default), else all
         | 
| 141 | 
            +
              def scc_filtered_products(product_list, product_type = 'base')
         | 
| 142 | 
            +
                if product_type == 'base'
         | 
| 143 | 
            +
                  product_list.only_products_with_repos.where(product_type: 'base').order(:friendly_name)
         | 
| 144 | 
            +
                else
         | 
| 145 | 
            +
                  product_list.only_products_with_repos.order(:friendly_name)
         | 
| 146 | 
            +
                end
         | 
| 147 | 
            +
              end
         | 
| 129 148 | 
             
            end
         | 
| @@ -1,12 +1,15 @@ | |
| 1 1 | 
             
            module Actions
         | 
| 2 2 | 
             
              module SccManager
         | 
| 3 3 | 
             
                class SyncProducts < Actions::EntryAction
         | 
| 4 | 
            +
                  include EncryptValue
         | 
| 5 | 
            +
             | 
| 4 6 | 
             
                  def plan(scc_account)
         | 
| 5 7 | 
             
                    action_subject(scc_account)
         | 
| 8 | 
            +
                    password = encrypt_field(scc_account.password)
         | 
| 6 9 | 
             
                    plan_self(id: scc_account.id,
         | 
| 7 10 | 
             
                              base_url: scc_account.base_url,
         | 
| 8 11 | 
             
                              login: scc_account.login,
         | 
| 9 | 
            -
                              password:  | 
| 12 | 
            +
                              password: password)
         | 
| 10 13 | 
             
                  end
         | 
| 11 14 |  | 
| 12 15 | 
             
                  def run
         | 
| @@ -15,9 +18,11 @@ module Actions | |
| 15 18 | 
             
                      products = ::SccManager.get_scc_data(input.fetch(:base_url),
         | 
| 16 19 | 
             
                                                           '/connect/organizations/products',
         | 
| 17 20 | 
             
                                                           input.fetch(:login),
         | 
| 18 | 
            -
                                                           input.fetch(:password))
         | 
| 21 | 
            +
                                                           decrypt_field(input.fetch(:password)))
         | 
| 19 22 | 
             
                      output[:data] = ::SccManager.sanitize_products(products).values
         | 
| 20 | 
            -
                    rescue StandardError
         | 
| 23 | 
            +
                    rescue StandardError => e
         | 
| 24 | 
            +
                      ::Foreman::Logging.logger('foreman_scc_manager').error "Error while syncronizing SCC-Products: #{e}"
         | 
| 25 | 
            +
                      output[:error] = e.to_s
         | 
| 21 26 | 
             
                      output[:status] = 'FAILURE'
         | 
| 22 27 | 
             
                    end
         | 
| 23 28 | 
             
                  end
         | 
| @@ -34,10 +39,6 @@ module Actions | |
| 34 39 | 
             
                    _('Sync SUSE subscriptions (Products)')
         | 
| 35 40 | 
             
                  end
         | 
| 36 41 |  | 
| 37 | 
            -
                  def humanized_input
         | 
| 38 | 
            -
                    input.dup.update(password: '***')
         | 
| 39 | 
            -
                  end
         | 
| 40 | 
            -
             | 
| 41 42 | 
             
                  def humanized_output
         | 
| 42 43 | 
             
                    output.dup.update(data: 'Trimmed')
         | 
| 43 44 | 
             
                  end
         | 
| @@ -1,11 +1,14 @@ | |
| 1 1 | 
             
            module Actions
         | 
| 2 2 | 
             
              module SccManager
         | 
| 3 3 | 
             
                class SyncRepositories < Actions::EntryAction
         | 
| 4 | 
            +
                  include EncryptValue
         | 
| 5 | 
            +
             | 
| 4 6 | 
             
                  def plan(scc_account)
         | 
| 5 7 | 
             
                    action_subject(scc_account)
         | 
| 8 | 
            +
                    password = encrypt_field(scc_account.password)
         | 
| 6 9 | 
             
                    plan_self(base_url: scc_account.base_url,
         | 
| 7 10 | 
             
                              login: scc_account.login,
         | 
| 8 | 
            -
                              password:  | 
| 11 | 
            +
                              password: password)
         | 
| 9 12 | 
             
                  end
         | 
| 10 13 |  | 
| 11 14 | 
             
                  def run
         | 
| @@ -14,9 +17,11 @@ module Actions | |
| 14 17 | 
             
                      output[:data] = ::SccManager.get_scc_data(input[:base_url],
         | 
| 15 18 | 
             
                                                                '/connect/organizations/repositories',
         | 
| 16 19 | 
             
                                                                input[:login],
         | 
| 17 | 
            -
                                                                input[:password])
         | 
| 20 | 
            +
                                                                decrypt_field(input[:password]))
         | 
| 18 21 | 
             
                      output[:status] = 'SUCCESS'
         | 
| 19 | 
            -
                    rescue StandardError
         | 
| 22 | 
            +
                    rescue StandardError => e
         | 
| 23 | 
            +
                      ::Foreman::Logging.logger('foreman_scc_manager').error "Error while syncronizing SCC-Repositories: #{e}"
         | 
| 24 | 
            +
                      output[:error] = e.to_s
         | 
| 20 25 | 
             
                      output[:status] = 'FAILURE'
         | 
| 21 26 | 
             
                    end
         | 
| 22 27 | 
             
                  end
         | 
| @@ -33,10 +38,6 @@ module Actions | |
| 33 38 | 
             
                    _('Sync SUSE subscriptions (Repositories)')
         | 
| 34 39 | 
             
                  end
         | 
| 35 40 |  | 
| 36 | 
            -
                  def humanized_input
         | 
| 37 | 
            -
                    input.dup.update(password: '***')
         | 
| 38 | 
            -
                  end
         | 
| 39 | 
            -
             | 
| 40 41 | 
             
                  def humanized_output
         | 
| 41 42 | 
             
                    output.dup.update(data: "Trimmed (got #{output[:data]&.length} repositories")
         | 
| 42 43 | 
             
                  end
         | 
    
        data/app/lib/scc_manager.rb
    CHANGED
    
    | @@ -8,8 +8,8 @@ module SccManager | |
| 8 8 | 
             
                  uri.scheme = URI.parse(proxy_config[:host]).scheme
         | 
| 9 9 | 
             
                  uri.host = URI.parse(proxy_config[:host]).host
         | 
| 10 10 | 
             
                  uri.port = proxy_config[:port].try(:to_s)
         | 
| 11 | 
            -
                  uri.user = proxy_config[:user] | 
| 12 | 
            -
                  uri.password = proxy_config[:password]. | 
| 11 | 
            +
                  uri.user = proxy_config[:user]
         | 
| 12 | 
            +
                  uri.password = proxy_config[:password] if uri.user.present?
         | 
| 13 13 |  | 
| 14 14 | 
             
                  RestClient.proxy = uri.to_s
         | 
| 15 15 | 
             
                end
         | 
    
        data/app/models/scc_account.rb
    CHANGED
    
    | @@ -2,6 +2,9 @@ class SccAccount < ApplicationRecord | |
| 2 2 | 
             
              include Authorizable
         | 
| 3 3 | 
             
              include Encryptable
         | 
| 4 4 | 
             
              include ForemanTasks::Concerns::ActionSubject
         | 
| 5 | 
            +
             | 
| 6 | 
            +
              attr_accessor :scc_products_with_repos_count
         | 
| 7 | 
            +
             | 
| 5 8 | 
             
              encrypts :password
         | 
| 6 9 |  | 
| 7 10 | 
             
              NEVER = 'never'.freeze
         | 
| @@ -166,7 +169,8 @@ class SccAccount < ApplicationRecord | |
| 166 169 | 
             
              def test_connection
         | 
| 167 170 | 
             
                get_scc_data('/connect/organizations/subscriptions')
         | 
| 168 171 | 
             
                true
         | 
| 169 | 
            -
              rescue StandardError
         | 
| 172 | 
            +
              rescue StandardError => e
         | 
| 173 | 
            +
                ::Foreman::Logging.logger('foreman_scc_manager').warn "Error occurred while testing SCC-Connection to Account #{self}: #{e}"
         | 
| 170 174 | 
             
                false
         | 
| 171 175 | 
             
              end
         | 
| 172 176 |  | 
| @@ -185,10 +189,10 @@ class SccAccount < ApplicationRecord | |
| 185 189 | 
             
                  cached_repository.save!
         | 
| 186 190 | 
             
                  upstream_repo_ids << ur['id']
         | 
| 187 191 | 
             
                end
         | 
| 188 | 
            -
                logger.debug "Found #{upstream_repo_ids.length} repositories"
         | 
| 192 | 
            +
                ::Foreman::Logging.logger('foreman_scc_manager').debug "Found #{upstream_repo_ids.length} repositories"
         | 
| 189 193 | 
             
                # delete repositories beeing removed upstream
         | 
| 190 194 | 
             
                to_delete = scc_repositories.where.not(scc_id: upstream_repo_ids)
         | 
| 191 | 
            -
                logger.debug "Deleting #{to_delete.count} old repositories"
         | 
| 195 | 
            +
                ::Foreman::Logging.logger('foreman_scc_manager').debug "Deleting #{to_delete.count} old repositories"
         | 
| 192 196 | 
             
                to_delete.destroy_all
         | 
| 193 197 | 
             
              end
         | 
| 194 198 |  | 
| @@ -208,10 +212,10 @@ class SccAccount < ApplicationRecord | |
| 208 212 | 
             
                  cached_product.save!
         | 
| 209 213 | 
             
                  upstream_product_ids << up['id']
         | 
| 210 214 | 
             
                end
         | 
| 211 | 
            -
                logger.debug "Found #{upstream_product_ids.length} products"
         | 
| 215 | 
            +
                ::Foreman::Logging.logger('foreman_scc_manager').debug "Found #{upstream_product_ids.length} products"
         | 
| 212 216 | 
             
                # delete products beeing removed upstream
         | 
| 213 217 | 
             
                to_delete = scc_products.where.not(scc_id: upstream_product_ids)
         | 
| 214 | 
            -
                logger.debug "Deleting #{to_delete.count} old products"
         | 
| 218 | 
            +
                ::Foreman::Logging.logger('foreman_scc_manager').debug "Deleting #{to_delete.count} old products"
         | 
| 215 219 | 
             
                to_delete.destroy_all
         | 
| 216 220 | 
             
                # rewire product to product relationships
         | 
| 217 221 | 
             
                upstream_products.each do |up|
         | 
| @@ -219,7 +223,7 @@ class SccAccount < ApplicationRecord | |
| 219 223 | 
             
                  begin
         | 
| 220 224 | 
             
                    scc_products.find_by!(scc_id: up['id']).update!(scc_extensions: extensions)
         | 
| 221 225 | 
             
                  rescue ActiveRecord::RecordNotFound
         | 
| 222 | 
            -
                    logger.info "Failed to find parent scc_product '#{up['name']}'."
         | 
| 226 | 
            +
                    ::Foreman::Logging.logger('foreman_scc_manager').info "Failed to find parent scc_product '#{up['name']}'."
         | 
| 223 227 | 
             
                  end
         | 
| 224 228 | 
             
                end
         | 
| 225 229 | 
             
              end
         | 
    
        data/app/models/scc_product.rb
    CHANGED
    
    
| @@ -13,7 +13,8 @@ | |
| 13 13 | 
             
                    <%= text_f f, :login, :help_block => _("Use your 'Organization credentials' obtained from the SUSE Customer Center.") %>
         | 
| 14 14 | 
             
                    <%= password_f f, :password %>
         | 
| 15 15 | 
             
                    <%= text_f f, :base_url, label: _('Base URL') %>
         | 
| 16 | 
            -
                    <%= selectable_f f, :interval, SccAccount::TYPES,  | 
| 16 | 
            +
                    <%= selectable_f f, :interval, SccAccount::TYPES, {},
         | 
| 17 | 
            +
                        { :label => _('Sync interval'), :help_block => _("The sync interval is used to periodically update the SCC authentication tokens of any imported products.") } %>
         | 
| 17 18 | 
             
                    <%= field f, :sync_date, label: _('Sync Date') do
         | 
| 18 19 | 
             
                      f.datetime_field :sync_date, placeholder: Time.now
         | 
| 19 20 | 
             
                    end %>
         | 
| @@ -25,7 +26,7 @@ | |
| 25 26 | 
             
                                               id: 'test_scc_connection_btn',
         | 
| 26 27 | 
             
                                               spinner_id: 'test_scc_connection_indicator',
         | 
| 27 28 | 
             
                                               class: 'btn-default',
         | 
| 28 | 
            -
                                               'data-url':  | 
| 29 | 
            +
                                               'data-url': @scc_account.id ? test_connection_scc_account_path : test_connection_scc_accounts_path ) %>
         | 
| 29 30 | 
             
                        </div>
         | 
| 30 31 | 
             
                        <div class='col-md-2'>
         | 
| 31 32 | 
             
                          <span id='connection_test_result'></span>
         | 
| @@ -17,15 +17,16 @@ | |
| 17 17 | 
             
                    <td class="display-two-pane ellipsis">
         | 
| 18 18 | 
             
                      <%= link_to_if_authorized(scc_account.name, hash_for_edit_scc_account_path(:id => scc_account).merge(:auth_object => scc_account, :authorizer => authorizer)) %>
         | 
| 19 19 | 
             
                    </td>
         | 
| 20 | 
            -
                    <td><%= scc_account. | 
| 20 | 
            +
                    <td><%= scc_account.scc_products_with_repos_count.to_s %></td>
         | 
| 21 21 | 
             
                    <td><%= link_to_if(scc_account.sync_task, scc_account.sync_status, scc_account.sync_task) %></td>
         | 
| 22 22 | 
             
                    <td>
         | 
| 23 23 | 
             
                      <%= action_buttons(
         | 
| 24 | 
            -
                        display_link_if_authorized(_("Select products"), hash_for_scc_account_path(:id => scc_account).merge(:auth_object => scc_account, :authorizer => authorizer)),
         | 
| 24 | 
            +
                        display_link_if_authorized(_("Select products"), hash_for_scc_account_path(:id => scc_account).merge(:auth_object => scc_account, :authorizer => authorizer, :permission => 'view_scc_accounts')),
         | 
| 25 25 | 
             
                        display_link_if_authorized(_("Sync"), hash_for_sync_scc_account_path(:id => scc_account).merge(:auth_object => scc_account, :authorizer => authorizer),
         | 
| 26 26 | 
             
                                                   :method => :put),
         | 
| 27 | 
            -
                        display_delete_if_authorized(hash_for_scc_account_path(:id => scc_account).merge(:auth_object => scc_account, :authorizer => authorizer),
         | 
| 27 | 
            +
                        display_delete_if_authorized(hash_for_scc_account_path(:id => scc_account).merge(:auth_object => scc_account, :authorizer => authorizer, :permission => 'delete_scc_accounts'),
         | 
| 28 28 | 
             
                                                     :data => { :confirm => _("Delete %s?") % scc_account.to_s })
         | 
| 29 | 
            +
             | 
| 29 30 | 
             
                      ) %>
         | 
| 30 31 | 
             
                    </td>
         | 
| 31 32 | 
             
                  </tr>
         | 
| @@ -11,8 +11,8 @@ | |
| 11 11 | 
             
                  </span>
         | 
| 12 12 | 
             
                  <%= scc_product.friendly_name %>
         | 
| 13 13 | 
             
                  <% if scc_product.scc_extensions.any? %>
         | 
| 14 | 
            -
                    <ul>
         | 
| 15 | 
            -
                      <% scc_product.scc_extensions | 
| 14 | 
            +
                    <ul style='padding-left: 20px;'>
         | 
| 15 | 
            +
                      <% scc_filtered_products(scc_product.scc_extensions, 'extension').each do |scc_extension| %>
         | 
| 16 16 | 
             
                        <% render_list_node(f, scc_extension, parent_id + "_" + scc_product.id.to_s) %>
         | 
| 17 17 | 
             
                      <% end %>
         | 
| 18 18 | 
             
                    </ul>
         | 
| @@ -29,7 +29,7 @@ | |
| 29 29 | 
             
                <div class="tab-pane active" id="primary">
         | 
| 30 30 | 
             
                  <ul>
         | 
| 31 31 | 
             
                    <% if @scc_account.synced %>
         | 
| 32 | 
            -
                      <% @scc_account.scc_products | 
| 32 | 
            +
                      <% scc_filtered_products(@scc_account.scc_products).each do |scc_product| %>
         | 
| 33 33 | 
             
                        <% render_list_node(f, scc_product) %>
         | 
| 34 34 | 
             
                      <% end %>
         | 
| 35 35 | 
             
                    <% else %>
         | 
    
        data/config/routes.rb
    CHANGED
    
    | @@ -2,10 +2,11 @@ Rails.application.routes.draw do | |
| 2 2 | 
             
              resources :scc_accounts do
         | 
| 3 3 | 
             
                collection do
         | 
| 4 4 | 
             
                  post 'test_connection'
         | 
| 5 | 
            +
                  put 'test_connection'
         | 
| 5 6 | 
             
                  get 'auto_complete_search'
         | 
| 6 7 | 
             
                end
         | 
| 7 8 | 
             
                member do
         | 
| 8 | 
            -
                   | 
| 9 | 
            +
                  patch 'test_connection'
         | 
| 9 10 | 
             
                  put 'sync'
         | 
| 10 11 | 
             
                  put 'bulk_subscribe'
         | 
| 11 12 | 
             
                end
         | 
| @@ -0,0 +1,22 @@ | |
| 1 | 
            +
            class FixSccPermissions < ActiveRecord::Migration[5.2]
         | 
| 2 | 
            +
              PERMISSION_NAMES = {
         | 
| 3 | 
            +
                :view_scc => :view_scc_accounts,
         | 
| 4 | 
            +
                :use_scc => :use_scc_accounts,
         | 
| 5 | 
            +
                :new_scc => :new_scc_accounts,
         | 
| 6 | 
            +
                :edit_scc => :edit_scc_accounts,
         | 
| 7 | 
            +
                :delete_scc => :delete_scc_accounts,
         | 
| 8 | 
            +
                :sync_scc => :sync_scc_accounts
         | 
| 9 | 
            +
              }.freeze
         | 
| 10 | 
            +
             | 
| 11 | 
            +
              def up
         | 
| 12 | 
            +
                PERMISSION_NAMES.each do |old_n, new_n|
         | 
| 13 | 
            +
                  Permission.find_by(name: old_n)&.update(name: new_n, resource_type: 'SccAccount')
         | 
| 14 | 
            +
                end
         | 
| 15 | 
            +
              end
         | 
| 16 | 
            +
             | 
| 17 | 
            +
              def down
         | 
| 18 | 
            +
                PERMISSION_NAMES.each do |old_n, new_n|
         | 
| 19 | 
            +
                  Permission.find_by(name: new_n)&.update(name: old_n, resource_type: nil)
         | 
| 20 | 
            +
                end
         | 
| 21 | 
            +
              end
         | 
| 22 | 
            +
            end
         | 
| @@ -29,34 +29,47 @@ module ForemanSccManager | |
| 29 29 |  | 
| 30 30 | 
             
                    # Add permissions
         | 
| 31 31 | 
             
                    security_block :foreman_scc_manager do
         | 
| 32 | 
            -
                      permission : | 
| 33 | 
            -
             | 
| 34 | 
            -
             | 
| 35 | 
            -
             | 
| 36 | 
            -
             | 
| 37 | 
            -
             | 
| 38 | 
            -
             | 
| 39 | 
            -
             | 
| 40 | 
            -
             | 
| 41 | 
            -
             | 
| 42 | 
            -
             | 
| 43 | 
            -
             | 
| 44 | 
            -
             | 
| 45 | 
            -
             | 
| 46 | 
            -
             | 
| 47 | 
            -
                       | 
| 48 | 
            -
             | 
| 49 | 
            -
             | 
| 50 | 
            -
             | 
| 51 | 
            -
             | 
| 52 | 
            -
                      permission : | 
| 53 | 
            -
             | 
| 54 | 
            -
             | 
| 55 | 
            -
             | 
| 32 | 
            +
                      permission :view_scc_accounts,
         | 
| 33 | 
            +
                                 { :scc_accounts => [:show, :index],
         | 
| 34 | 
            +
                                   :'api/v2/scc_accounts' => [:show, :index] },
         | 
| 35 | 
            +
                                 :resource_type => 'SccAccount'
         | 
| 36 | 
            +
             | 
| 37 | 
            +
                      permission :use_scc_accounts,
         | 
| 38 | 
            +
                                 { :scc_accounts => [:bulk_subscribe],
         | 
| 39 | 
            +
                                   :'api/v2/scc_accounts' => [:bulk_subscribe] },
         | 
| 40 | 
            +
                                 :resource_type => 'SccAccount'
         | 
| 41 | 
            +
             | 
| 42 | 
            +
                      permission :new_scc_accounts,
         | 
| 43 | 
            +
                                 { :scc_accounts => [:new, :create],
         | 
| 44 | 
            +
                                   :'api/v2/scc_accounts' => [:create] },
         | 
| 45 | 
            +
                                 :resource_type => 'SccAccount'
         | 
| 46 | 
            +
             | 
| 47 | 
            +
                      permission :edit_scc_accounts,
         | 
| 48 | 
            +
                                 { :scc_accounts => [:edit, :update],
         | 
| 49 | 
            +
                                   :'api/v2/scc_accounts' => [:update] },
         | 
| 50 | 
            +
                                 :resource_type => 'SccAccount'
         | 
| 51 | 
            +
             | 
| 52 | 
            +
                      permission :delete_scc_accounts,
         | 
| 53 | 
            +
                                 { :scc_accounts => [:destroy],
         | 
| 54 | 
            +
                                   :'api/v2/scc_accounts' => [:destroy] },
         | 
| 55 | 
            +
                                 :resource_type => 'SccAccount'
         | 
| 56 | 
            +
             | 
| 57 | 
            +
                      permission :sync_scc_accounts,
         | 
| 58 | 
            +
                                 { :scc_accounts => [:sync],
         | 
| 59 | 
            +
                                   :'api/v2/scc_accounts' => [:sync] },
         | 
| 60 | 
            +
                                 :resource_type => 'SccAccount'
         | 
| 56 61 | 
             
                    end
         | 
| 57 62 |  | 
| 58 63 | 
             
                    # Add a new role called 'SccManager' if it doesn't exist
         | 
| 59 | 
            -
                    role 'SccManager', | 
| 64 | 
            +
                    role 'SccManager',
         | 
| 65 | 
            +
                         %i[view_scc_accounts use_scc_accounts new_scc_accounts edit_scc_accounts delete_scc_accounts sync_scc_accounts],
         | 
| 66 | 
            +
                         'Role granting permissons to manage SUSE Subscriptions'
         | 
| 67 | 
            +
             | 
| 68 | 
            +
                    role 'SccViewer',
         | 
| 69 | 
            +
                         %i[view_scc_accounts use_scc_accounts sync_scc_accounts create_products view_products],
         | 
| 70 | 
            +
                         'Role granting permissons to view and use SUSE Subscriptions'
         | 
| 71 | 
            +
             | 
| 72 | 
            +
                    add_all_permissions_to_default_roles
         | 
| 60 73 |  | 
| 61 74 | 
             
                    # add menu entry
         | 
| 62 75 | 
             
                    menu :top_menu, :scc_manager,
         | 
    
        data/lib/tasks/test.rake
    CHANGED
    
    | @@ -14,7 +14,7 @@ end | |
| 14 14 |  | 
| 15 15 | 
             
            namespace :jenkins do
         | 
| 16 16 | 
             
              desc 'Test ForemanSccManager with XML output for jenkins'
         | 
| 17 | 
            -
              task 'foreman_scc_manager' do
         | 
| 17 | 
            +
              task 'foreman_scc_manager' => :environment do
         | 
| 18 18 | 
             
                Rake::Task['jenkins:setup:minitest'].invoke
         | 
| 19 19 | 
             
                Rake::Task['rake:test:foreman_scc_manager'].invoke
         | 
| 20 20 | 
             
              end
         | 
| Binary file | 
| @@ -2,7 +2,7 @@ | |
| 2 2 | 
             
            # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
         | 
| 3 3 | 
             
            # This file is distributed under the same license as the foreman_scc_manager package.
         | 
| 4 4 | 
             
            # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
         | 
| 5 | 
            -
            # | 
| 5 | 
            +
            #
         | 
| 6 6 | 
             
            # Translators:
         | 
| 7 7 | 
             
            # Wiederoder <stefanwiederoder@googlemail.com>, 2019
         | 
| 8 8 | 
             
            # Bryan Kearney <bryan.kearney@gmail.com>, 2019
         | 
| @@ -11,13 +11,11 @@ | |
| 11 11 | 
             
            # Michael Moll, 2019
         | 
| 12 12 | 
             
            # Lukas K. <kallies@puzzle.ch>, 2019
         | 
| 13 13 | 
             
            # Markus Bucher <bucher@atix.de>, 2019
         | 
| 14 | 
            -
            # | 
| 15 | 
            -
            #, fuzzy
         | 
| 14 | 
            +
            #
         | 
| 16 15 | 
             
            msgid ""
         | 
| 17 16 | 
             
            msgstr ""
         | 
| 18 17 | 
             
            "Project-Id-Version: foreman_scc_manager 1.7.0\n"
         | 
| 19 18 | 
             
            "Report-Msgid-Bugs-To: \n"
         | 
| 20 | 
            -
            "POT-Creation-Date: 2019-10-22 13:59+0000\n"
         | 
| 21 19 | 
             
            "PO-Revision-Date: 2019-10-17 13:28+0000\n"
         | 
| 22 20 | 
             
            "Last-Translator: Markus Bucher <bucher@atix.de>, 2019\n"
         | 
| 23 21 | 
             
            "Language-Team: German (https://www.transifex.com/foreman/teams/114/de/)\n"
         | 
| @@ -27,168 +25,173 @@ msgstr "" | |
| 27 25 | 
             
            "Language: de\n"
         | 
| 28 26 | 
             
            "Plural-Forms: nplurals=2; plural=(n != 1);\n"
         | 
| 29 27 |  | 
| 30 | 
            -
             | 
| 31 | 
            -
             | 
| 32 | 
            -
            msgstr "Sync Job gestartet."
         | 
| 33 | 
            -
             | 
| 34 | 
            -
            #: ../app/controllers/scc_accounts_controller.rb:66
         | 
| 35 | 
            -
            #: ../app/controllers/scc_accounts_controller.rb:86
         | 
| 36 | 
            -
            msgid "Failed to add task to queue: %s"
         | 
| 37 | 
            -
            msgstr "Aufgabe konnte nicht in die Warteschlange gestellt werden: %s"
         | 
| 38 | 
            -
             | 
| 39 | 
            -
            #: ../app/controllers/scc_accounts_controller.rb:68
         | 
| 40 | 
            -
            #: ../app/controllers/scc_accounts_controller.rb:88
         | 
| 41 | 
            -
            msgid "Lock on SCC account already taken: %s"
         | 
| 42 | 
            -
            msgstr "Lock für SCC Zugang bereits vergeben: %s"
         | 
| 28 | 
            +
            msgid "Actions"
         | 
| 29 | 
            +
            msgstr "Aktionen"
         | 
| 43 30 |  | 
| 44 | 
            -
             | 
| 45 | 
            -
             | 
| 46 | 
            -
            msgstr "Job zum abonnieren von Produkten gestartet."
         | 
| 31 | 
            +
            msgid "Add SCC account"
         | 
| 32 | 
            +
            msgstr "SCC Konto hinzufügen"
         | 
| 47 33 |  | 
| 48 | 
            -
             | 
| 49 | 
            -
             | 
| 50 | 
            -
            msgstr "Keine Produkte ausgewählt."
         | 
| 34 | 
            +
            msgid "Add SUSE Customer Center Account"
         | 
| 35 | 
            +
            msgstr "SUSE Customer Center Konto hinzufügen"
         | 
| 51 36 |  | 
| 52 | 
            -
             | 
| 53 | 
            -
             | 
| 54 | 
            -
            msgstr "Produkt wurde bereits abonniert!"
         | 
| 37 | 
            +
            msgid "Base URL"
         | 
| 38 | 
            +
            msgstr "Basis URL"
         | 
| 55 39 |  | 
| 56 | 
            -
             | 
| 57 | 
            -
             | 
| 58 | 
            -
            msgstr "SCC Produkt abonnieren"
         | 
| 40 | 
            +
            msgid "Bulk subscription of scc_products for scc_account"
         | 
| 41 | 
            +
            msgstr ""
         | 
| 59 42 |  | 
| 60 | 
            -
             | 
| 61 | 
            -
             | 
| 62 | 
            -
            msgstr "SUSE Abonnements synchronisieren"
         | 
| 43 | 
            +
            msgid "Create an scc_account"
         | 
| 44 | 
            +
            msgstr ""
         | 
| 63 45 |  | 
| 64 | 
            -
             | 
| 65 | 
            -
             | 
| 66 | 
            -
            msgstr "SUSE Repositorien %s aktualisieren"
         | 
| 46 | 
            +
            msgid "Cron expression is not valid!"
         | 
| 47 | 
            +
            msgstr "Cron-Ausdruck ungültig!"
         | 
| 67 48 |  | 
| 68 | 
            -
             | 
| 69 | 
            -
             | 
| 70 | 
            -
            msgstr "Unbekannt"
         | 
| 49 | 
            +
            msgid "Delete %s?"
         | 
| 50 | 
            +
            msgstr "%s löschen?"
         | 
| 71 51 |  | 
| 72 | 
            -
             | 
| 73 | 
            -
             | 
| 74 | 
            -
            msgid "Update SUSE repositories"
         | 
| 75 | 
            -
            msgstr "SUSE Repositorien aktualisieren"
         | 
| 52 | 
            +
            msgid "Delete scc_account"
         | 
| 53 | 
            +
            msgstr ""
         | 
| 76 54 |  | 
| 77 | 
            -
             | 
| 78 | 
            -
             | 
| 79 | 
            -
            msgstr "SUSE Abonnements (Produkte) synchronisieren"
         | 
| 55 | 
            +
            msgid "Edit %s"
         | 
| 56 | 
            +
            msgstr "%s bearbeiten"
         | 
| 80 57 |  | 
| 81 | 
            -
             | 
| 82 | 
            -
             | 
| 83 | 
            -
            msgstr "SUSE Abonnements (Repositorien) synchronisieren"
         | 
| 58 | 
            +
            msgid "Failed to add task to queue: %s"
         | 
| 59 | 
            +
            msgstr "Aufgabe konnte nicht in die Warteschlange gestellt werden: %s"
         | 
| 84 60 |  | 
| 85 | 
            -
             | 
| 86 | 
            -
             | 
| 87 | 
            -
            msgstr "Nie synchronisiert"
         | 
| 61 | 
            +
            msgid "Foreman plugin to sync SUSE Customer Center products and repositories into Katello."
         | 
| 62 | 
            +
            msgstr "Foreman Plugin um SUSE Customer Center Produkte und Repositorien in Katello zu importieren."
         | 
| 88 63 |  | 
| 89 | 
            -
            #: ../app/models/scc_account.rb:105
         | 
| 90 64 | 
             
            msgid "Interval cannot be nil"
         | 
| 91 65 | 
             
            msgstr "Intervall darf nicht Null sein"
         | 
| 92 66 |  | 
| 93 | 
            -
             | 
| 67 | 
            +
            msgid "Interval for syncing scc_account"
         | 
| 68 | 
            +
            msgstr ""
         | 
| 69 | 
            +
             | 
| 94 70 | 
             
            msgid "Interval not set correctly"
         | 
| 95 71 | 
             
            msgstr "Intervall nicht richtig gesetzt"
         | 
| 96 72 |  | 
| 97 | 
            -
             | 
| 98 | 
            -
             | 
| 99 | 
            -
            msgstr "Cron-Ausdruck ungültig!"
         | 
| 73 | 
            +
            msgid "Last Sync time of scc_account"
         | 
| 74 | 
            +
            msgstr ""
         | 
| 100 75 |  | 
| 101 | 
            -
             | 
| 102 | 
            -
             | 
| 103 | 
            -
            msgstr "SUSE Abonnement"
         | 
| 76 | 
            +
            msgid "Last synced"
         | 
| 77 | 
            +
            msgstr "Letzte Synchronisation"
         | 
| 104 78 |  | 
| 105 | 
            -
             | 
| 106 | 
            -
            msgid "SUSE Subscription: "
         | 
| 79 | 
            +
            msgid "List all products for scc_account"
         | 
| 107 80 | 
             
            msgstr ""
         | 
| 108 81 |  | 
| 109 | 
            -
             | 
| 110 | 
            -
            msgid "SUSE Customer Center account"
         | 
| 111 | 
            -
            msgstr "SUSE Customer Center Konto"
         | 
| 112 | 
            -
             | 
| 113 | 
            -
            #: ../app/views/scc_accounts/_form.html.erb:13
         | 
| 114 | 
            -
            msgid ""
         | 
| 115 | 
            -
            "Use your 'Organization credentials' obtained from the SUSE Customer Center."
         | 
| 82 | 
            +
            msgid "List all scc_accounts"
         | 
| 116 83 | 
             
            msgstr ""
         | 
| 117 | 
            -
            "Verwenden Sie die \"Organisationszugangsdaten\" aus dem SUSE Customer "
         | 
| 118 | 
            -
            "Center."
         | 
| 119 84 |  | 
| 120 | 
            -
             | 
| 121 | 
            -
             | 
| 122 | 
            -
            msgstr "Basis URL"
         | 
| 85 | 
            +
            msgid "Lock on SCC account already taken: %s"
         | 
| 86 | 
            +
            msgstr "Lock für SCC Zugang bereits vergeben: %s"
         | 
| 123 87 |  | 
| 124 | 
            -
             | 
| 125 | 
            -
             | 
| 126 | 
            -
            msgstr "Intervall"
         | 
| 88 | 
            +
            msgid "Login id of scc_account"
         | 
| 89 | 
            +
            msgstr ""
         | 
| 127 90 |  | 
| 128 | 
            -
             | 
| 129 | 
            -
             | 
| 130 | 
            -
            msgstr "Synchronisationsdatum"
         | 
| 91 | 
            +
            msgid "Name of the scc_account"
         | 
| 92 | 
            +
            msgstr ""
         | 
| 131 93 |  | 
| 132 | 
            -
             | 
| 133 | 
            -
             | 
| 134 | 
            -
            msgstr "Verbindung testen"
         | 
| 94 | 
            +
            msgid "No products selected."
         | 
| 95 | 
            +
            msgstr "Keine Produkte ausgewählt."
         | 
| 135 96 |  | 
| 136 | 
            -
             | 
| 137 | 
            -
             | 
| 138 | 
            -
            msgstr "%s bearbeiten"
         | 
| 97 | 
            +
            msgid "Password of scc_account"
         | 
| 98 | 
            +
            msgstr ""
         | 
| 139 99 |  | 
| 140 | 
            -
             | 
| 141 | 
            -
             | 
| 142 | 
            -
            msgstr "SUSE Abonnements"
         | 
| 100 | 
            +
            msgid "Please sync your SUSE subscriptions first."
         | 
| 101 | 
            +
            msgstr "Bitte synchronisieren Sie zuerst Ihre SUSE Abonnements."
         | 
| 143 102 |  | 
| 144 | 
            -
             | 
| 145 | 
            -
             | 
| 146 | 
            -
            msgstr "SCC Konto hinzufügen"
         | 
| 103 | 
            +
            msgid "Product already subscribed!"
         | 
| 104 | 
            +
            msgstr "Produkt wurde bereits abonniert!"
         | 
| 147 105 |  | 
| 148 | 
            -
            #: ../app/views/scc_accounts/index.html.erb:9
         | 
| 149 106 | 
             
            msgid "Products"
         | 
| 150 107 | 
             
            msgstr "Produkte"
         | 
| 151 108 |  | 
| 152 | 
            -
             | 
| 153 | 
            -
             | 
| 154 | 
            -
            msgstr "Letzte Synchronisation"
         | 
| 109 | 
            +
            msgid "SUSE Customer Center"
         | 
| 110 | 
            +
            msgstr "SUSE Customer Center"
         | 
| 155 111 |  | 
| 156 | 
            -
             | 
| 157 | 
            -
             | 
| 158 | 
            -
             | 
| 112 | 
            +
            msgid "SUSE Customer Center account"
         | 
| 113 | 
            +
            msgstr "SUSE Customer Center Konto"
         | 
| 114 | 
            +
             | 
| 115 | 
            +
            msgid "SUSE Subscription"
         | 
| 116 | 
            +
            msgstr "SUSE Abonnement"
         | 
| 117 | 
            +
             | 
| 118 | 
            +
            msgid "SUSE Subscription: "
         | 
| 119 | 
            +
            msgstr "SUSE Abonnement:"
         | 
| 120 | 
            +
             | 
| 121 | 
            +
            msgid "SUSE Subscriptions"
         | 
| 122 | 
            +
            msgstr "SUSE Abonnements"
         | 
| 123 | 
            +
             | 
| 124 | 
            +
            msgid "SUSE subscriptions"
         | 
| 125 | 
            +
            msgstr "SUSE Abonnements"
         | 
| 159 126 |  | 
| 160 | 
            -
            #: ../app/views/scc_accounts/index.html.erb:24
         | 
| 161 127 | 
             
            msgid "Select products"
         | 
| 162 128 | 
             
            msgstr "Produkte auswählen"
         | 
| 163 129 |  | 
| 164 | 
            -
             | 
| 130 | 
            +
            msgid "Show an scc_account product"
         | 
| 131 | 
            +
            msgstr ""
         | 
| 132 | 
            +
             | 
| 133 | 
            +
            msgid "Show scc_account"
         | 
| 134 | 
            +
            msgstr ""
         | 
| 135 | 
            +
             | 
| 136 | 
            +
            msgid "Subscribe SCC Product"
         | 
| 137 | 
            +
            msgstr "SCC Produkt abonnieren"
         | 
| 138 | 
            +
             | 
| 139 | 
            +
            msgid "Subscribe product"
         | 
| 140 | 
            +
            msgstr ""
         | 
| 141 | 
            +
             | 
| 165 142 | 
             
            msgid "Sync"
         | 
| 166 143 | 
             
            msgstr "Synchronisation"
         | 
| 167 144 |  | 
| 168 | 
            -
             | 
| 169 | 
            -
             | 
| 170 | 
            -
            msgstr "%s löschen?"
         | 
| 145 | 
            +
            msgid "Sync Date"
         | 
| 146 | 
            +
            msgstr "Synchronisationsdatum"
         | 
| 171 147 |  | 
| 172 | 
            -
             | 
| 173 | 
            -
             | 
| 174 | 
            -
            msgstr "SUSE Customer Center Konto hinzufügen"
         | 
| 148 | 
            +
            msgid "Sync SUSE subscriptions"
         | 
| 149 | 
            +
            msgstr "SUSE Abonnements synchronisieren"
         | 
| 175 150 |  | 
| 176 | 
            -
             | 
| 177 | 
            -
             | 
| 178 | 
            -
            msgstr "SUSE Customer Center"
         | 
| 151 | 
            +
            msgid "Sync SUSE subscriptions (Products)"
         | 
| 152 | 
            +
            msgstr "SUSE Abonnements (Produkte) synchronisieren"
         | 
| 179 153 |  | 
| 180 | 
            -
             | 
| 181 | 
            -
             | 
| 182 | 
            -
            msgstr "Bitte synchronisieren Sie zuerst Ihre SUSE Abonnements."
         | 
| 154 | 
            +
            msgid "Sync SUSE subscriptions (Repositories)"
         | 
| 155 | 
            +
            msgstr "SUSE Abonnements (Repositorien) synchronisieren"
         | 
| 183 156 |  | 
| 184 | 
            -
             | 
| 185 | 
            -
             | 
| 186 | 
            -
            msgstr "SUSE Abonnements"
         | 
| 157 | 
            +
            msgid "Sync interval"
         | 
| 158 | 
            +
            msgstr ""
         | 
| 187 159 |  | 
| 188 | 
            -
             | 
| 189 | 
            -
            msgid ""
         | 
| 190 | 
            -
            "Foreman plugin to sync SUSE Customer Center products and repositories into "
         | 
| 191 | 
            -
            "Katello."
         | 
| 160 | 
            +
            msgid "Sync scc_account"
         | 
| 192 161 | 
             
            msgstr ""
         | 
| 193 | 
            -
             | 
| 194 | 
            -
            " | 
| 162 | 
            +
             | 
| 163 | 
            +
            msgid "Sync task started."
         | 
| 164 | 
            +
            msgstr "Sync Job gestartet."
         | 
| 165 | 
            +
             | 
| 166 | 
            +
            msgid "Task to subscribe products started."
         | 
| 167 | 
            +
            msgstr "Job zum abonnieren von Produkten gestartet."
         | 
| 168 | 
            +
             | 
| 169 | 
            +
            msgid "Test Connection"
         | 
| 170 | 
            +
            msgstr "Verbindung testen"
         | 
| 171 | 
            +
             | 
| 172 | 
            +
            msgid "Test connection for scc_account"
         | 
| 173 | 
            +
            msgstr ""
         | 
| 174 | 
            +
             | 
| 175 | 
            +
            msgid "The sync interval is used to periodically update the SCC authentication tokens of any imported products."
         | 
| 176 | 
            +
            msgstr ""
         | 
| 177 | 
            +
             | 
| 178 | 
            +
            msgid "URL of SUSE for scc_account"
         | 
| 179 | 
            +
            msgstr ""
         | 
| 180 | 
            +
             | 
| 181 | 
            +
            msgid "Unknown"
         | 
| 182 | 
            +
            msgstr "Unbekannt"
         | 
| 183 | 
            +
             | 
| 184 | 
            +
            msgid "Update SUSE repositories"
         | 
| 185 | 
            +
            msgstr "SUSE Repositorien aktualisieren"
         | 
| 186 | 
            +
             | 
| 187 | 
            +
            msgid "Update SUSE repositories %s"
         | 
| 188 | 
            +
            msgstr "SUSE Repositorien %s aktualisieren"
         | 
| 189 | 
            +
             | 
| 190 | 
            +
            msgid "Update scc_account"
         | 
| 191 | 
            +
            msgstr ""
         | 
| 192 | 
            +
             | 
| 193 | 
            +
            msgid "Use your 'Organization credentials' obtained from the SUSE Customer Center."
         | 
| 194 | 
            +
            msgstr "Verwenden Sie die \"Organisationszugangsdaten\" aus dem SUSE Customer Center."
         | 
| 195 | 
            +
             | 
| 196 | 
            +
            msgid "never synced"
         | 
| 197 | 
            +
            msgstr "Nie synchronisiert"
         |