knife-pkg 0.1.1 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 693eb26a2679a69e02ec7c5e401f658fe0bf1f7a
4
+ data.tar.gz: 234e8b042f480d0b6b9f25ce67a5c3a623b6a059
5
+ SHA512:
6
+ metadata.gz: 43f34e39548c1a7e3c06e6e916a0b1207047b06443d29bd27ff5a017b0a8d964a58389d081d5dc2b774bfc620e0f74f010d52aceffbede87687f6342380d6357
7
+ data.tar.gz: 4ea377499214e59d5e453caed9cd68f13f45e053cf35c4dd0e2f8fa2b2cc176fc0a80677b2427a3f164701b5b622fd56d6eb75c59177b60adf3d3d068e575bfe
data/README.md CHANGED
@@ -106,6 +106,31 @@ $ knife pkg install updates "roles:webserver" -U "libxml2,gpgv,gnupg"
106
106
  ...
107
107
  ```
108
108
 
109
+ - install all updates, don't ask
110
+
111
+ ```sh
112
+ $ knife pkg install updates "*:*" -y
113
+ ===> s10.example.com
114
+ Updating libwbclient0 (3.6.6-6+deb7u1~bpo60+1)
115
+ Updating samba-common (3.6.6-6+deb7u1~bpo60+1)
116
+ Updating samba-common-bin (3.6.6-6+deb7u1~bpo60+1)
117
+ Updating smbclient (3.6.6-6+deb7u1~bpo60+1)
118
+ ===> s11.example.com
119
+ Updating libwbclient0 (3.6.6-6+deb7u1~bpo60+1)
120
+ Updating samba-common (3.6.6-6+deb7u1~bpo60+1)
121
+ Updating samba-common-bin (3.6.6-6+deb7u1~bpo60+1)
122
+ Updating smbclient (3.6.6-6+deb7u1~bpo60+1)
123
+ ===> s12.example.com
124
+ Updating libwbclient0 (3.6.6-6+deb7u1~bpo60+1)
125
+ Updating samba-common (3.6.6-6+deb7u1~bpo60+1)
126
+ Updating samba-common-bin (3.6.6-6+deb7u1~bpo60+1)
127
+ ===> s13.example.com
128
+ Updating libwbclient0 (3.6.6-6+deb7u1~bpo60+1)
129
+ Updating samba-common (3.6.6-6+deb7u1~bpo60+1)
130
+ Updating samba-common-bin (3.6.6-6+deb7u1~bpo60+1)
131
+ Updating smbclient (3.6.6-6+deb7u1~bpo60+1)
132
+ ```
133
+
109
134
  ## Supported Packet Managers
110
135
 
111
136
  * apt
@@ -43,6 +43,7 @@ class Chef
43
43
  pkg_options[:sudo] = config[:sudo_required]
44
44
  pkg_options[:verbose] = config[:verbose] || config[:dry_run] || config[:pkg_verbose]
45
45
  pkg_options[:dry_run] = config[:dry_run]
46
+ pkg_options[:yes] = config[:yes]
46
47
  pkg_options
47
48
  end
48
49
 
@@ -101,6 +101,13 @@ class Chef
101
101
  :description => "QUERY is a space separated list of servers",
102
102
  :default => false
103
103
 
104
+ option :dry_run,
105
+ :short => "-D",
106
+ :long => "--dry-run",
107
+ :boolean => true,
108
+ :description => "Simulates package installation. Actually this is only supported by 'apt'",
109
+ :default => false
110
+
104
111
 
105
112
  def run
106
113
  super
@@ -22,6 +22,7 @@ module Knife
22
22
 
23
23
  def initialize(node, session, opts = {})
24
24
  super(node, session, opts)
25
+ @installed_packages = Array.new
25
26
  end
26
27
 
27
28
  def dry_run_supported?
@@ -33,11 +34,9 @@ module Knife
33
34
  end
34
35
 
35
36
  def last_pkg_cache_update
36
- raise_update_notifier_missing! unless update_notifier_installed?
37
-
38
37
  result = nil
39
38
  begin
40
- result = exec("stat -c %y /var/lib/apt/periodic/update-success-stamp")
39
+ result = exec("#{sudo} stat -c %y /var/lib/apt/lists")
41
40
  Time.parse(result.stdout.chomp)
42
41
  rescue RuntimeError => e
43
42
  e.backtrace.each { |l| Chef::Log.debug(l) }
@@ -47,7 +46,14 @@ module Knife
47
46
  end
48
47
 
49
48
  def installed_version(package)
50
- exec("dpkg -p #{package.name} | grep -i Version: | awk '{print $2}' | head -1").stdout.chomp
49
+ package = @installed_packages.select { |p| p.name == package.name }.first || Package.new("")
50
+ if !package.name.empty?
51
+ version = package.version
52
+ else
53
+ # fallback
54
+ version = exec("dpkg -p #{package.name} | grep -i Version: | awk '{print $2}' | head -1").stdout.chomp
55
+ end
56
+ version
51
57
  end
52
58
 
53
59
  def update_version(package)
@@ -55,15 +61,25 @@ module Knife
55
61
  end
56
62
 
57
63
  def available_updates
58
- packages = Array.new
59
- raise_update_notifier_missing! unless update_notifier_installed?
60
- result = exec("#{sudo}/usr/lib/update-notifier/apt_check.py -p")
61
- result.stderr.split("\n").each do |item|
62
- package = Package.new(item)
63
- package.version = update_version(package)
64
- packages << package
64
+ parse_upgrade(exec("#{sudo} apt-get dist-upgrade -V -s | egrep -v \"^(Conf|Inst)\"").stdout)
65
+ end
66
+
67
+ def parse_upgrade(upgrade_line)
68
+ result = Array.new
69
+ rx = Regexp.new(/\s+(?<name>\S+)\s\((?<installed>.+)\s=>\s(?<new>.+)\)/)
70
+ found = false
71
+ upgrade_line.split("\n").each do |line|
72
+ unless found
73
+ found = true if line.match(/will be upgraded/)
74
+ next
75
+ end
76
+ match = rx.match(line)
77
+ unless match.nil?
78
+ result << Package.new(match[:name], match[:new])
79
+ @installed_packages << Package.new(match[:name], match[:installed])
80
+ end
65
81
  end
66
- packages.sort { |n,m| n.name <=> m.name }
82
+ result
67
83
  end
68
84
 
69
85
  def update_package!(package)
@@ -71,14 +87,6 @@ module Knife
71
87
  cmd_string += " -s" if @options[:dry_run]
72
88
  exec(cmd_string)
73
89
  end
74
-
75
- def update_notifier_installed?
76
- exec("dpkg-query -W update-notifier-common 2>/dev/null || echo 'false'").stdout.chomp != 'false'
77
- end
78
-
79
- def raise_update_notifier_missing!
80
- raise RuntimeError, "No update-notifier(-common) installed!? Install it and try again!"
81
- end
82
90
  end
83
91
  end
84
92
  end
@@ -34,20 +34,79 @@ module Knife
34
34
  @options = opts
35
35
  end
36
36
 
37
- def self.ui
38
- @ui ||= Chef::Knife::UI.new(STDOUT, STDERR, STDIN, {})
39
- end
37
+
38
+ class << self
40
39
 
41
- def sudo
42
- @options[:sudo] ? 'sudo ' : ''
43
- end
40
+ def list_available_updates(updates)
41
+ updates.each do |update|
42
+ ui.info(ui.color("\t" + update.to_s, :yellow))
43
+ end
44
+ end
44
45
 
45
- def exec(cmd)
46
- ShellCommand.exec(cmd, @session)
47
- end
46
+ def ui
47
+ @ui ||= Chef::Knife::UI.new(STDOUT, STDERR, STDIN, {})
48
+ end
48
49
 
49
- def max_pkg_cache_age
50
- options[:max_pkg_cache_age] || ONE_DAY_IN_SECS
50
+ # Connects to the node, updates packages (defined with param `packages`) without confirmation, all other available updates with confirmation
51
+ # @param [Hash] node the node
52
+ # @option node [String] :platform_family platform of the node, e.g. `debian`. if not set, `ohai` will be executed
53
+ # @param [Session] session the ssh session to be used to connect to the node
54
+ # @param [Array<String>] packages name of the packages which should be updated without confirmation
55
+ # @param [Hash] opts the options
56
+ # @option opts [Boolean] :dry_run whether the update should only be simulated (if supported by the package manager)
57
+ # @option opts [Boolean] :verbose whether the update process should be more verbose
58
+ # @option opts [Boolean] :yes whether all available updates should be installed without confirmation
59
+ def update!(node, session, packages, opts)
60
+ ctrl = self.init_controller(node, session, opts)
61
+
62
+ auto_updates = packages.map { |u| Package.new(u) }
63
+ updates_for_dialog = Array.new
64
+
65
+ ctrl.try_update_pkg_cache
66
+ available_updates = ctrl.available_updates
67
+
68
+ # install all available packages
69
+ if opts[:yes]
70
+ auto_updates = available_updates
71
+ end
72
+
73
+ # install packages in auto_updates without confirmation,
74
+ # but only if they are available as update
75
+ # don't install packages which aren't installed
76
+ available_updates.each do |avail|
77
+ if auto_updates.select { |p| p.name == avail.name }.count == 0
78
+ updates_for_dialog << avail
79
+ else
80
+ ui.info("\tUpdating #{avail.to_s}")
81
+ ctrl.update_package_verbose!(avail)
82
+ end
83
+ end
84
+
85
+ ctrl.update_dialog(updates_for_dialog)
86
+ end
87
+
88
+ def available_updates(node, session, opts = {})
89
+ ctrl = self.init_controller(node, session, opts)
90
+ ctrl.try_update_pkg_cache
91
+ updates = ctrl.available_updates
92
+ list_available_updates(ctrl.update_info(updates))
93
+ end
94
+
95
+ def init_controller(node, session, opts)
96
+ platform_family = node[:platform_family] || self.platform_family_by_local_ohai(session, opts)
97
+ ctrl_name = PlatformFamily.map_to_pkg_ctrl(platform_family)
98
+ raise NotImplementedError, "I'm sorry, but #{node[:platform_family]} is not supported!" if ctrl_name == 'unknown'
99
+
100
+ Chef::Log.debug("Platform Family #{platform_family} detected, using #{ctrl_name}")
101
+ require File.join(File.dirname(__FILE__), ctrl_name)
102
+ ctrl = Object.const_get('Knife').const_get('Pkg').const_get("#{ctrl_name.capitalize}PackageController").new(node, session, opts)
103
+ ctrl.ui = self.ui
104
+ ctrl
105
+ end
106
+
107
+ def platform_family_by_local_ohai(session, opts)
108
+ ShellCommand.exec("ohai platform_family| grep \\\"", session).stdout.strip.gsub(/\"/,'')
109
+ end
51
110
  end
52
111
 
53
112
  ## ++ methods to implement
@@ -91,6 +150,19 @@ module Knife
91
150
  end
92
151
 
93
152
  ## ++ methods to implement
153
+
154
+
155
+ def sudo
156
+ @options[:sudo] ? 'sudo ' : ''
157
+ end
158
+
159
+ def exec(cmd)
160
+ ShellCommand.exec(cmd, @session)
161
+ end
162
+
163
+ def max_pkg_cache_age
164
+ options[:max_pkg_cache_age] || ONE_DAY_IN_SECS
165
+ end
94
166
 
95
167
  def update_info(packages)
96
168
  result = []
@@ -107,7 +179,7 @@ module Knife
107
179
  result = update_package!(package)
108
180
  if @options[:dry_run] || @options[:verbose]
109
181
  ui.info(result.stdout)
110
- ui.error(result.stderr)
182
+ ui.error(result.stderr) unless result.stderr.empty?
111
183
  end
112
184
  end
113
185
 
@@ -121,8 +193,8 @@ module Knife
121
193
  def update_dialog(packages)
122
194
  return if packages.count == 0
123
195
 
124
- ui.info("\tThe following updates are available:") if packages.count > 0
125
- PackageController::list_available_updates(update_info(packages))
196
+ ui.info("\tThe following updates are available:")
197
+ PackageController.list_available_updates(update_info(packages))
126
198
 
127
199
  if UserDecision.yes?("\tDo you want to update all packages? [y|n]: ")
128
200
  ui.info("\tupdating...")
@@ -139,67 +211,6 @@ module Knife
139
211
  end
140
212
  end
141
213
  end
142
-
143
- def self.list_available_updates(updates)
144
- updates.each do |update|
145
- ui.info(ui.color("\t" + update.to_s, :yellow))
146
- end
147
- end
148
-
149
- # Connects to the node, updates packages (defined with param `packages`) without confirmation, all other available updates with confirmation
150
- # @param [Hash] node the node
151
- # @option node [String] :platform_family platform of the node, e.g. `debian`. if not set, `ohai` will be executed
152
- # @param [Session] session the ssh session to be used to connect to the node
153
- # @param [Array<String>] packages name of the packages which should be updated without confirmation
154
- # @param [Hash] opts the options
155
- # @option opts [Boolean] :dry_run wether the update should only be simulated (if supported by the package manager)
156
- # @option opts [Boolean] :verbose wether the update process should be more verbose
157
- def self.update!(node, session, packages, opts)
158
- ctrl = self.init_controller(node, session, opts)
159
-
160
- auto_updates = packages.map { |u| Package.new(u) }
161
- updates_for_dialog = Array.new
162
-
163
- ctrl.try_update_pkg_cache
164
- available_updates = ctrl.available_updates
165
-
166
- # install packages in auto_updates without confirmation,
167
- # but only if they are available as update
168
- # don't install packages which aren't installed
169
- available_updates.each do |avail|
170
- if auto_updates.select { |p| p.name == avail.name }.count == 0
171
- updates_for_dialog << avail
172
- else
173
- ui.info("\tUpdating #{avail.to_s}")
174
- ctrl.update_package_verbose!(avail)
175
- end
176
- end
177
-
178
- ctrl.update_dialog(updates_for_dialog)
179
- end
180
-
181
- def self.available_updates(node, session, opts = {})
182
- ctrl = self.init_controller(node, session, opts)
183
- ctrl.try_update_pkg_cache
184
- updates = ctrl.available_updates
185
- list_available_updates(ctrl.update_info(updates))
186
- end
187
-
188
- def self.init_controller(node, session, opts)
189
- platform_family = node[:platform_family] || self.platform_family_by_local_ohai(session, opts)
190
- ctrl_name = PlatformFamily.map_to_pkg_ctrl(platform_family)
191
- raise NotImplementedError, "I'm sorry, but #{node[:platform_family]} is not supported!" if ctrl_name == 'unknown'
192
-
193
- Chef::Log.debug("Platform Family #{platform_family} detected, using #{ctrl_name}")
194
- require File.join(File.dirname(__FILE__), ctrl_name)
195
- ctrl = Object.const_get('Knife').const_get('Pkg').const_get("#{ctrl_name.capitalize}PackageController").new(node, session, opts)
196
- ctrl.ui = self.ui
197
- ctrl
198
- end
199
-
200
- def self.platform_family_by_local_ohai(session, opts)
201
- ShellCommand.exec("ohai platform_family| grep \\\"", session).stdout.strip.gsub(/\"/,'')
202
- end
203
214
  end
204
215
  end
205
216
  end
@@ -1,5 +1,5 @@
1
1
  module Knife
2
2
  module Pkg
3
- VERSION = '0.1.1'
3
+ VERSION = '0.2.0'
4
4
  end
5
5
  end
@@ -34,26 +34,90 @@ describe 'AptPackageController' do
34
34
  end
35
35
 
36
36
  describe "#available_updates" do
37
- it 'should raise an error if update-notifier is not installed' do
37
+ it 'should return an array' do
38
38
  p = AptPackageController.new(nil, nil)
39
- p.stub(:update_notifier_installed?).and_return(false)
40
- expect{p.available_updates}.to raise_error(/update-notifier/)
39
+ result = ShellCommandResult.new(nil,"will be upgraded\n base-files2 (7.1wheezy1 => 7.1wheezy2)\nbla",nil,nil)
40
+ p.stub(:exec).and_return(result)
41
+ packages = p.available_updates
42
+ expect(packages).to be_an_instance_of Array
43
+ expect(packages[0].name).to eq("base-files2")
44
+ expect(packages[0].version).to eq("7.1wheezy2")
41
45
  end
46
+ end
42
47
 
43
- it 'should return an array' do
44
- result = ShellCommandResult.new(nil, nil, "b\na\nc", nil)
48
+ describe "#installed_version" do
49
+ it 'should return the installed version from internal list' do
45
50
  p = AptPackageController.new(nil, nil)
46
- p.stub(:exec).and_return(result)
47
- p.stub(:update_notifier_installed?).and_return(true)
48
- p.stub(:installed_version).and_return("1.0.0")
49
- p.stub(:update_version).and_return("2.0.0")
50
-
51
- updates = p.available_updates
52
- expect(updates).to be_an_instance_of Array
53
- expect(updates.count).to eq(3)
54
- expect(updates[0].name).to eq("a")
55
- expect(updates[1].name).to eq("b")
56
- expect(updates[2].name).to eq("c")
51
+ output = "will be upgraded\n base-files (7.1wheezy1 => 7.1wheezy2)\nbla"
52
+ p.parse_upgrade(output)
53
+ expect(p).not_to receive(:exec)
54
+ expect(p.installed_version(Package.new("base-files"))).to eq("7.1wheezy1")
55
+ end
56
+
57
+ it 'should return the installed version from dpkg' do
58
+ p = AptPackageController.new(nil, nil)
59
+ output = "bla\n base-files (7.1wheezy1 => 7.1wheezy2)\nbla"
60
+ p.parse_upgrade(output)
61
+ r = Struct.new(:stdout)
62
+ output_exec = r.new("1.0.0\n")
63
+ p.stub(:exec).and_return(output_exec)
64
+ expect(p).to receive(:exec)
65
+ expect(p.installed_version(Package.new("bla"))).to eq("1.0.0")
66
+ end
67
+ end
68
+
69
+ describe "#parse_upgrade" do
70
+ it 'should parse output from apt-get upgrade and return an array of packages' do
71
+ stdout = <<-END.gsub(/^ {6}/, '')
72
+ Reading package lists...
73
+ Building dependency tree...
74
+ Reading state information...
75
+ The following packages have been kept back:
76
+ esl-erlang (16.b-2~debian~squeeze => 16.b.2-1)
77
+ postgresql-client-9.2 (9.2.4-1.pgdg60+1 => 9.2.5-1.pgdg60+1)
78
+ The following packages will be upgraded:
79
+ base-files (7.1wheezy1 => 7.1wheezy2)
80
+ curl (7.26.0-1+wheezy3 => 7.26.0-1+wheezy4)
81
+ dmsetup (1.02.74-7 => 1.02.74-8)
82
+ dpkg (1.16.10 => 1.16.12)
83
+ gnupg (1.4.12-7+deb7u1 => 1.4.12-7+deb7u2)
84
+ gpgv (1.4.12-7+deb7u1 => 1.4.12-7+deb7u2)
85
+ grub-common (1.99-27+deb7u1 => 1.99-27+deb7u2)
86
+ grub-pc (1.99-27+deb7u1 => 1.99-27+deb7u2)
87
+ grub-pc-bin (1.99-27+deb7u1 => 1.99-27+deb7u2)
88
+ grub2-common (1.99-27+deb7u1 => 1.99-27+deb7u2)
89
+ initscripts (2.88dsf-41 => 2.88dsf-41+deb7u1)
90
+ libcurl3 (7.26.0-1+wheezy3 => 7.26.0-1+wheezy4)
91
+ libdevmapper-event1.02.1 (1.02.74-7 => 1.02.74-8)
92
+ libdevmapper1.02.1 (1.02.74-7 => 1.02.74-8)
93
+ libxml2 (2.8.0+dfsg1-7+nmu1 => 2.8.0+dfsg1-7+nmu2)
94
+ linux-headers-3.2.0-4-amd64 (3.2.46-1+deb7u1 => 3.2.51-1)
95
+ linux-headers-3.2.0-4-common (3.2.46-1+deb7u1 => 3.2.51-1)
96
+ linux-image-3.2.0-4-amd64 (3.2.46-1+deb7u1 => 3.2.51-1)
97
+ linux-libc-dev (3.2.46-1+deb7u1 => 3.2.51-1)
98
+ lvm2 (2.02.95-7 => 2.02.95-8)
99
+ mutt (1.5.21-6.2 => 1.5.21-6.2+deb7u1)
100
+ perl (5.14.2-21 => 5.14.2-21+deb7u1)
101
+ perl-base (5.14.2-21 => 5.14.2-21+deb7u1)
102
+ perl-modules (5.14.2-21 => 5.14.2-21+deb7u1)
103
+ python (2.7.3-4 => 2.7.3-4+deb7u1)
104
+ python-minimal (2.7.3-4 => 2.7.3-4+deb7u1)
105
+ sysv-rc (2.88dsf-41 => 2.88dsf-41+deb7u1)
106
+ sysvinit (2.88dsf-41 => 2.88dsf-41+deb7u1)
107
+ sysvinit-utils (2.88dsf-41 => 2.88dsf-41+deb7u1)
108
+ tzdata (2013c-0wheezy1 => 2013d-0wheezy1)
109
+ 30 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
110
+ Need to get 49.9 MB of archives.
111
+ After this operation, 864 kB disk space will be freed.
112
+ Do you want to continue [Y/n]? Abort.
113
+ END
114
+ p = AptPackageController.new(nil, nil)
115
+ packages = p.parse_upgrade(stdout)
116
+ expect(packages.count).to eq(30)
117
+ expect(packages[0].name).to eq("base-files")
118
+ expect(packages[0].version).to eq("7.1wheezy2")
119
+ expect(packages[29].name).to eq("tzdata")
120
+ expect(packages[29].version).to eq("2013d-0wheezy1")
57
121
  end
58
122
  end
59
123
  end
metadata CHANGED
@@ -1,20 +1,18 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: knife-pkg
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
5
- prerelease:
4
+ version: 0.2.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - Holger Amann
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2013-10-17 00:00:00.000000000 Z
11
+ date: 2013-10-19 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: chef
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
17
  - - '>='
20
18
  - !ruby/object:Gem::Version
@@ -22,7 +20,6 @@ dependencies:
22
20
  type: :runtime
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
24
  - - '>='
28
25
  - !ruby/object:Gem::Version
@@ -30,7 +27,6 @@ dependencies:
30
27
  - !ruby/object:Gem::Dependency
31
28
  name: bundler
32
29
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
30
  requirements:
35
31
  - - ~>
36
32
  - !ruby/object:Gem::Version
@@ -38,7 +34,6 @@ dependencies:
38
34
  type: :development
39
35
  prerelease: false
40
36
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
37
  requirements:
43
38
  - - ~>
44
39
  - !ruby/object:Gem::Version
@@ -46,7 +41,6 @@ dependencies:
46
41
  - !ruby/object:Gem::Dependency
47
42
  name: rake
48
43
  requirement: !ruby/object:Gem::Requirement
49
- none: false
50
44
  requirements:
51
45
  - - '>='
52
46
  - !ruby/object:Gem::Version
@@ -54,7 +48,6 @@ dependencies:
54
48
  type: :development
55
49
  prerelease: false
56
50
  version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
51
  requirements:
59
52
  - - '>='
60
53
  - !ruby/object:Gem::Version
@@ -62,7 +55,6 @@ dependencies:
62
55
  - !ruby/object:Gem::Dependency
63
56
  name: rspec
64
57
  requirement: !ruby/object:Gem::Requirement
65
- none: false
66
58
  requirements:
67
59
  - - '>='
68
60
  - !ruby/object:Gem::Version
@@ -70,7 +62,6 @@ dependencies:
70
62
  type: :development
71
63
  prerelease: false
72
64
  version_requirements: !ruby/object:Gem::Requirement
73
- none: false
74
65
  requirements:
75
66
  - - '>='
76
67
  - !ruby/object:Gem::Version
@@ -111,33 +102,26 @@ files:
111
102
  homepage: https://github.com/hamann/knife-pkg
112
103
  licenses:
113
104
  - Apache 2.0
105
+ metadata: {}
114
106
  post_install_message:
115
107
  rdoc_options: []
116
108
  require_paths:
117
109
  - lib
118
110
  required_ruby_version: !ruby/object:Gem::Requirement
119
- none: false
120
111
  requirements:
121
112
  - - '>='
122
113
  - !ruby/object:Gem::Version
123
114
  version: '0'
124
- segments:
125
- - 0
126
- hash: 3505602516276971978
127
115
  required_rubygems_version: !ruby/object:Gem::Requirement
128
- none: false
129
116
  requirements:
130
117
  - - '>='
131
118
  - !ruby/object:Gem::Version
132
119
  version: '0'
133
- segments:
134
- - 0
135
- hash: 3505602516276971978
136
120
  requirements: []
137
121
  rubyforge_project:
138
- rubygems_version: 1.8.25
122
+ rubygems_version: 2.1.8
139
123
  signing_key:
140
- specification_version: 3
124
+ specification_version: 4
141
125
  summary: A plugin for chef's knife to manage package updates
142
126
  test_files:
143
127
  - spec/controllers/apt_spec.rb