1
1
# encoding: utf-8
2
+ # frozen_string_literal: true
3
+
2
4
# copyright: 2016, Christoph Hartmann
3
5
# copyright: 2016, Dominik Richter
4
6
# license: MPLv2
@@ -25,6 +27,7 @@ class LinuxUpdateManager < Inspec.resource(1)
25
27
26
28
# Since Amazon Linux is based on RedHat, they may use the same method.
27
29
def initialize
30
+ super
28
31
case inspec . os [ :family ]
29
32
when 'redhat' , 'amazon'
30
33
@update_mgmt = RHELUpdateFetcher . new ( inspec )
@@ -99,17 +102,17 @@ def parse_json(script)
99
102
begin
100
103
JSON . parse ( cmd . stdout )
101
104
rescue JSON ::ParserError => _e
102
- return [ ]
105
+ [ ]
103
106
end
104
107
end
105
108
end
106
109
107
110
PatchEntry = Struct . new ( :name , :version , :arch , :category , :severity ) do
108
111
def to_s
109
112
r = "System Patch #{ name } (v#{ version } #{ arch } "
110
- r += ", #{ category } " unless category . nil?
111
- r += ", #{ severity } " unless severity . nil?
112
- r + ')'
113
+ r += ", #{ category } " unless category . nil?
114
+ r += ", #{ severity } " unless severity . nil?
115
+ " #{ r } )"
113
116
end
114
117
end
115
118
@@ -135,10 +138,8 @@ def updates
135
138
private
136
139
137
140
def zypper_xml ( cmd )
138
- out = @inspec . command ( 'zypper --xmlout ' +cmd )
139
- if out . exit_status != 0
140
- fail_resource ( 'Cannot retrieve package updates from the OS: ' +out . stderr )
141
- end
141
+ out = @inspec . command ( "zypper --xmlout #{ cmd } " )
142
+ fail_resource ( "Cannot retrieve package updates from the OS: #{ out . stderr } " ) if out . exit_status != 0
142
143
out . stdout . force_encoding ( 'UTF-8' )
143
144
end
144
145
@@ -149,7 +150,7 @@ def extract_xml_updates(updates_el)
149
150
REXML ::XPath . each ( updates_el , 'update' ) do |el |
150
151
a = el . attributes
151
152
res . push (
152
- PatchEntry . new ( a [ 'name' ] , a [ 'edition' ] , a [ 'arch' ] , a [ 'category' ] , a [ 'severity' ] ) ,
153
+ PatchEntry . new ( a [ 'name' ] , a [ 'edition' ] , a [ 'arch' ] , a [ 'category' ] , a [ 'severity' ] )
153
154
)
154
155
end
155
156
res
@@ -158,65 +159,66 @@ def extract_xml_updates(updates_el)
158
159
159
160
class DebianUpdateFetcher < UpdateFetcher
160
161
def packages
161
- debian_packages = debian_base + <<- PRINT_JSON
162
- echo -n '{"installed":['
163
- dpkg-query -W -f='${Status}\\ t${Package}\\ t${Version}\\ t${Architecture}\\ n' |\\
164
- grep '^install ok installed\\ s' |\\
165
- awk '{ printf "{\\ "name\\ ":\\ ""$4"\\ ",\\ "version\\ ":\\ ""$5"\\ ",\\ "arch\\ ":\\ ""$6"\\ "}," }' | rev | cut -c 2- | rev | tr -d '\\ n'
166
- echo -n ']}'
162
+ debian_packages = debian_base + <<~ PRINT_JSON
163
+ echo -n '{"installed":['
164
+ dpkg-query -W -f='${Status}\\ t${Package}\\ t${Version}\\ t${Architecture}\\ n' |\\
165
+ grep '^install ok installed\\ s' |\\
166
+ awk '{ printf "{\\ "name\\ ":\\ ""$4"\\ ",\\ "version\\ ":\\ ""$5"\\ ",\\ "arch\\ ":\\ ""$6"\\ "}," }' | rev | cut -c 2- | rev | tr -d '\\ n'
167
+ echo -n ']}'
167
168
PRINT_JSON
168
169
parse_json ( debian_packages )
169
170
end
170
171
171
172
def updates
172
- debian_updates = debian_base + <<- PRINT_JSON
173
- echo -n '{"available":['
174
- DEBIAN_FRONTEND=noninteractive apt upgrade --dry-run | grep Inst | tr -d '[]()' |\\
175
- awk '{ printf "{\\ "name\\ ":\\ ""$2"\\ ",\\ "version\\ ":\\ ""$4"\\ ",\\ "repo\\ ":\\ ""$5"\\ ",\\ "arch\\ ":\\ ""$6"\\ "}," }' | rev | cut -c 2- | rev | tr -d '\\ n'
176
- echo -n ']}'
173
+ debian_updates = debian_base + <<~ PRINT_JSON
174
+ echo -n '{"available":['
175
+ DEBIAN_FRONTEND=noninteractive apt upgrade --dry-run | grep Inst | tr -d '[]()' |\\
176
+ awk '{ printf "{\\ "name\\ ":\\ ""$2"\\ ",\\ "version\\ ":\\ ""$4"\\ ",\\ "repo\\ ":\\ ""$5"\\ ",\\ "arch\\ ":\\ ""$6"\\ "}," }' | rev | cut -c 2- | rev | tr -d '\\ n'
177
+ echo -n ']}'
177
178
PRINT_JSON
178
179
parse_json ( debian_updates )
179
180
end
180
181
181
182
private
182
183
183
184
def debian_base
184
- base = <<- PRINT_JSON
185
- #!/bin/sh
186
- COMMAND="DEBIAN_FRONTEND=noninteractive apt update >>/dev/null 2>&1"
187
- eval $COMMAND
188
- while [ $? -ne 0 ]
189
- do
190
- sleep 30s
191
- eval $COMMAND
192
- done
193
- echo " "
185
+ <<~ PRINT_JSON
186
+ #!/bin/sh
187
+ COMMAND="DEBIAN_FRONTEND=noninteractive apt update >>/dev/null 2>&1"
188
+ eval $COMMAND
189
+ while [ $? -ne 0 ]
190
+ do
191
+ sleep 30s
192
+ eval $COMMAND
193
+ done
194
+ echo " "
194
195
PRINT_JSON
195
- base
196
196
end
197
197
end
198
198
199
199
class RHELUpdateFetcher < UpdateFetcher
200
200
def packages
201
- rhel_packages = <<-PRINT_JSON
202
- sleep 2 && echo " "
203
- echo -n '{"installed":['
204
- rpm -qa --queryformat '"name":"%{NAME}","version":"%{VERSION}-%{RELEASE}","arch":"%{ARCH}"\\ n' |\\
205
- awk '{ printf "{"$1"}," }' | rev | cut -c 2- | rev | tr -d '\\ n'
206
- echo -n ']}'
201
+ # rubocop:disable Style/FormatStringToken
202
+ rhel_packages = <<~PRINT_JSON
203
+ sleep 2 && echo " "
204
+ echo -n '{"installed":['
205
+ rpm -qa --queryformat '"name":"%{NAME}","version":"%{VERSION}-%{RELEASE}","arch":"%{ARCH}"\\ n' |\\
206
+ awk '{ printf "{"$1"}," }' | rev | cut -c 2- | rev | tr -d '\\ n'
207
+ echo -n ']}'
207
208
PRINT_JSON
208
209
parse_json ( rhel_packages )
210
+ # rubocop:enable Style/FormatStringToken
209
211
end
210
212
211
213
def updates
212
- rhel_updates = <<- PRINT_JSON
213
- #!/bin/sh
214
- python -c 'import sys; sys.path.insert(0, "/usr/share/yum-cli"); import cli; ybc = cli.YumBaseCli(); ybc.setCacheDir("/tmp"); list = ybc.returnPkgLists(["updates"]);res = ["{\\ "name\\ ":\\ ""+x.name+"\\ ", \\ "version\\ ":\\ ""+x.version+"-"+x.release+"\\ ",\\ "arch\\ ":\\ ""+x.arch+"\\ ",\\ "repository\\ ":\\ ""+x.repo.id+"\\ "}" for x in list.updates]; print "{\\ "available\\ ":["+",".join(res)+"]}"'
214
+ rhel_updates = <<~ PRINT_JSON
215
+ #!/bin/sh
216
+ python -c 'import sys; sys.path.insert(0, "/usr/share/yum-cli"); import cli; ybc = cli.YumBaseCli(); ybc.setCacheDir("/tmp"); list = ybc.returnPkgLists(["updates"]);res = ["{\\ "name\\ ":\\ ""+x.name+"\\ ", \\ "version\\ ":\\ ""+x.version+"-"+x.release+"\\ ",\\ "arch\\ ":\\ ""+x.arch+"\\ ",\\ "repository\\ ":\\ ""+x.repo.id+"\\ "}" for x in list.updates]; print "{\\ "available\\ ":["+",".join(res)+"]}"'
215
217
PRINT_JSON
216
218
cmd = @inspec . bash ( rhel_updates )
217
- unless cmd . exit_status == 0
219
+ unless cmd . exit_status . zero?
218
220
# essentially we want https://github.com/chef/inspec/issues/1205
219
- STDERR . puts 'Could not determine patch status.'
221
+ warn 'Could not determine patch status.'
220
222
return nil
221
223
end
222
224
@@ -225,7 +227,7 @@ def updates
225
227
begin
226
228
JSON . parse ( res )
227
229
rescue JSON ::ParserError => _e
228
- return [ ]
230
+ [ ]
229
231
end
230
232
end
231
233
end
0 commit comments