PackageChanger 0.2.0 → 0.3.0
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/.ruby-version +1 -0
- data/PackageChanger-0.2.0.gem +0 -0
- data/PackageChanger.gemspec +1 -1
- data/README.md +3 -1
- data/bin/PackageChanger +103 -39
- data/lib/PackageChanger/config.rb +5 -2
- data/lib/PackageChanger/connection.rb +103 -9
- data/lib/PackageChanger/log.rb +6 -10
- data/lib/PackageChanger/messages.rb +55 -3
- data/lib/PackageChanger/version.rb +3 -1
- metadata +8 -13
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 981f3ec735d35c942e1aa40e563b4406b1757757685f4c0786be321101976deb
|
4
|
+
data.tar.gz: 75bcad50ab045e12aab08ec90644ea7101a9ead338b6aa3847be8bb1cb31bc8a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b60ab714163bd9917ed5ef194f5c55ec017fadc24715bc47b9f8bb2f54c140fa0257efb36d6007656702362eccf8131cbeb454312f800cdf32367339ff75c9a5
|
7
|
+
data.tar.gz: ab4d87b6ee76e39b2994517721243e440f0f7b9a0544309b299d71dd0c087cf2754da111eb60985597c61114c628af5ec30cd17064477bd1f1a495d40d7df753
|
data/.ruby-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
2.6.3
|
Binary file
|
data/PackageChanger.gemspec
CHANGED
@@ -40,7 +40,7 @@ Gem::Specification.new do |spec|
|
|
40
40
|
|
41
41
|
spec.add_development_dependency 'bundler', '~> 2.0'
|
42
42
|
spec.add_development_dependency 'minitest', '~> 5.0'
|
43
|
-
spec.add_development_dependency 'rake', '
|
43
|
+
spec.add_development_dependency 'rake', '>= 12.3.3'
|
44
44
|
spec.add_development_dependency 'ruby-jss', '~> 1.0', '>= 1.2.3'
|
45
45
|
spec.add_runtime_dependency 'ruby-jss', '~> 1.0', '>= 1.2.3'
|
46
46
|
end
|
data/README.md
CHANGED
@@ -14,7 +14,9 @@ You can copy a sample file from the data folder inside the installation path of
|
|
14
14
|
|
15
15
|
Once configured, you can use it:
|
16
16
|
|
17
|
-
```packagechanger [--silent] --old OldPackageName --new NewPackageName || --list ListedPackage```
|
17
|
+
```packagechanger [--silent] [--policy PolicyID] --old OldPackageName --new NewPackageName || --list ListedPackage```
|
18
|
+
|
19
|
+
The PolicyID can be either the numeric ID of a JSS policy, or its name between quotes.
|
18
20
|
|
19
21
|
Run the first execution with sudo, or change the mode of the file `/private/var/log/packagechanger.log` so all users can write to it.
|
20
22
|
|
data/bin/PackageChanger
CHANGED
@@ -13,8 +13,8 @@ old_package = nil
|
|
13
13
|
new_package = nil
|
14
14
|
list_package = nil
|
15
15
|
target_policy = nil
|
16
|
-
|
17
|
-
|
16
|
+
app_title = nil
|
17
|
+
version = nil
|
18
18
|
silent = false
|
19
19
|
|
20
20
|
# The CLI options for GetoptLong
|
@@ -23,7 +23,11 @@ OPTS = GetoptLong.new(
|
|
23
23
|
['--old', '-o', GetoptLong::REQUIRED_ARGUMENT],
|
24
24
|
['--new', '-n', GetoptLong::REQUIRED_ARGUMENT],
|
25
25
|
['--list', '-l', GetoptLong::REQUIRED_ARGUMENT],
|
26
|
-
['--silent', '-s', GetoptLong::NO_ARGUMENT]
|
26
|
+
['--silent', '-s', GetoptLong::NO_ARGUMENT],
|
27
|
+
['--patch', '-x', GetoptLong::REQUIRED_ARGUMENT],
|
28
|
+
['--version', '-v', GetoptLong::REQUIRED_ARGUMENT],
|
29
|
+
['--test', '-t', GetoptLong::REQUIRED_ARGUMENT],
|
30
|
+
['--release', '-r', GetoptLong::REQUIRED_ARGUMENT]
|
27
31
|
)
|
28
32
|
|
29
33
|
logger = PackageChanger::Log.new
|
@@ -33,7 +37,7 @@ mode = 'change'
|
|
33
37
|
|
34
38
|
OPTS.each do |opt, arg|
|
35
39
|
case opt
|
36
|
-
when '--policy'
|
40
|
+
when '--policy', '-p'
|
37
41
|
if arg == ''
|
38
42
|
puts PackageChanger::USAGE
|
39
43
|
logger.write('Missing arguments.')
|
@@ -45,7 +49,7 @@ OPTS.each do |opt, arg|
|
|
45
49
|
mode = 'single'
|
46
50
|
end
|
47
51
|
|
48
|
-
when '--old'
|
52
|
+
when '--old', '-o'
|
49
53
|
if arg == ''
|
50
54
|
puts PackageChanger::USAGE
|
51
55
|
logger.write('Missing arguments.')
|
@@ -54,7 +58,7 @@ OPTS.each do |opt, arg|
|
|
54
58
|
old_package = arg
|
55
59
|
end
|
56
60
|
|
57
|
-
when '--new'
|
61
|
+
when '--new', '-n'
|
58
62
|
if arg == ''
|
59
63
|
puts PackageChanger::USAGE
|
60
64
|
logger.write('Missing arguments.')
|
@@ -63,7 +67,7 @@ OPTS.each do |opt, arg|
|
|
63
67
|
new_package = arg
|
64
68
|
end
|
65
69
|
|
66
|
-
when '--list'
|
70
|
+
when '--list', '-l'
|
67
71
|
if arg == ''
|
68
72
|
puts PackageChanger::USAGE
|
69
73
|
logger.write('Missing arguments.')
|
@@ -74,13 +78,52 @@ OPTS.each do |opt, arg|
|
|
74
78
|
# Change mode to list if flag is used
|
75
79
|
mode = 'list'
|
76
80
|
end
|
77
|
-
|
81
|
+
|
82
|
+
when '--silent', '-s'
|
78
83
|
silent = true
|
79
84
|
|
85
|
+
when '--patch', '-x'
|
86
|
+
if arg == ''
|
87
|
+
puts PackageChanger::PATCH_USAGE
|
88
|
+
logger.write('Missing arguments.')
|
89
|
+
exit 1
|
90
|
+
else
|
91
|
+
app_title = arg
|
92
|
+
mode = 'patch'
|
93
|
+
end
|
94
|
+
|
95
|
+
when '--version', '-v'
|
96
|
+
if arg == ''
|
97
|
+
puts PackageChanger::PATCH_USAGE
|
98
|
+
logger.write('Missing arguments.')
|
99
|
+
exit 1
|
100
|
+
else
|
101
|
+
version = arg
|
102
|
+
end
|
103
|
+
|
104
|
+
when '--test', '-t'
|
105
|
+
if arg == ''
|
106
|
+
puts PackageChanger::PATCH_USAGE
|
107
|
+
logger.write('Missing arguments.')
|
108
|
+
exit 1
|
109
|
+
else
|
110
|
+
app_title = arg
|
111
|
+
mode = 'test'
|
112
|
+
end
|
113
|
+
|
114
|
+
when '--release', '-r'
|
115
|
+
if arg == ''
|
116
|
+
puts PackageChanger::PATCH_USAGE
|
117
|
+
logger.write('Missing arguments.')
|
118
|
+
exit 1
|
119
|
+
else
|
120
|
+
app_title = arg
|
121
|
+
mode = 'release'
|
122
|
+
end
|
80
123
|
end
|
81
124
|
end
|
82
125
|
|
83
|
-
unless (old_package && new_package) || list_package
|
126
|
+
unless (old_package && new_package) || list_package || (app_title && new_package) || app_title
|
84
127
|
puts PackageChanger::USAGE
|
85
128
|
logger.write('Missing package names')
|
86
129
|
exit 1
|
@@ -88,6 +131,8 @@ end
|
|
88
131
|
|
89
132
|
begin
|
90
133
|
puts PackageChanger::STARTUP unless silent
|
134
|
+
|
135
|
+
# Check for configurations before starting
|
91
136
|
if PackageChanger::Configuration::DEFAULT_CONF_FILE.file?
|
92
137
|
@config_src = PackageChanger::Configuration::DEFAULT_CONF_FILE.to_s
|
93
138
|
elsif PackageChanger::Configuration::SAMPLE_CONF_FILE.file?
|
@@ -98,16 +143,17 @@ begin
|
|
98
143
|
|
99
144
|
PackageChanger.connect_to_jss(silent)
|
100
145
|
|
101
|
-
|
146
|
+
case mode
|
147
|
+
when 'list'
|
102
148
|
unless JSS::Package.valid_id list_package
|
103
149
|
logger.write("#{list_package} does not exist")
|
104
|
-
puts PackageChanger::
|
150
|
+
puts PackageChanger::MISSING_LIST_PACKAGE
|
105
151
|
exit 1
|
106
152
|
end
|
107
153
|
|
108
154
|
result_array = PackageChanger.get_policies_with(list_package, silent, logger)
|
109
155
|
|
110
|
-
if result_array.count
|
156
|
+
if result_array.count.positive?
|
111
157
|
puts "\u{1F3C1} The package #{list_package} is used on the following policies: "
|
112
158
|
result_array.each do |result|
|
113
159
|
puts "\t#{result[:id]} - #{result[:name]}"
|
@@ -117,16 +163,16 @@ begin
|
|
117
163
|
exit 0
|
118
164
|
end
|
119
165
|
|
120
|
-
|
166
|
+
when 'change'
|
121
167
|
unless JSS::Package.valid_id(old_package) && JSS::Package.valid_id(new_package)
|
122
168
|
logger.write("Either #{old_package} or #{new_package} do not exist")
|
123
|
-
puts PackageChanger::
|
169
|
+
puts PackageChanger::MISSING_PACKAGE
|
124
170
|
exit 1
|
125
171
|
end
|
126
172
|
|
127
173
|
result_array = PackageChanger.get_policies_with(old_package, silent)
|
128
174
|
|
129
|
-
if result_array.count
|
175
|
+
if result_array.count.positive?
|
130
176
|
puts "The package #{old_package} will be replaced with #{new_package}: "
|
131
177
|
logger.write("The package #{old_package} will be replaced with #{new_package}")
|
132
178
|
result_array.each do |result|
|
@@ -134,20 +180,9 @@ begin
|
|
134
180
|
logger.write("\t#{result[:id]} - #{result[:name]}")
|
135
181
|
end
|
136
182
|
|
137
|
-
|
138
|
-
|
139
|
-
while confirmation !~ /[yn]/i
|
140
|
-
puts 'Please confirm [y/n]:'
|
141
|
-
confirmation = gets.chomp.downcase
|
142
|
-
end
|
143
|
-
|
144
|
-
case confirmation
|
183
|
+
case PackageChanger.confirm
|
145
184
|
when 'y'
|
146
|
-
puts 'Processing changes.' unless silent
|
147
|
-
logger.write('Starting changes.')
|
148
185
|
PackageChanger.replace_packages(result_array, old_package, new_package, silent, logger)
|
149
|
-
puts "\u{1F3C1} Finished changing packages." unless silent
|
150
|
-
logger.write('Finished changing.')
|
151
186
|
exit 0
|
152
187
|
when 'n'
|
153
188
|
puts 'Cancelling changes.'
|
@@ -165,18 +200,54 @@ begin
|
|
165
200
|
exit 0
|
166
201
|
end
|
167
202
|
|
168
|
-
|
203
|
+
when 'patch'
|
204
|
+
patch_title = PackageChanger.check_patch(app_title, new_package, version, silent, logger)
|
205
|
+
|
206
|
+
case PackageChanger.confirm
|
207
|
+
when 'y'
|
208
|
+
PackageChanger.assign_patch(patch_title, new_package, version, silent, logger)
|
209
|
+
exit 0
|
210
|
+
when 'n'
|
211
|
+
puts "\u{1F519} Cancelling changes."
|
212
|
+
logger.write('User cancelled.')
|
213
|
+
exit 0
|
214
|
+
else
|
215
|
+
puts PackageChanger::ERROR
|
216
|
+
logger.write(PackageChanger::ERROR)
|
217
|
+
exit 1
|
218
|
+
end
|
219
|
+
|
220
|
+
when 'test', 'release'
|
221
|
+
patch_policy_id = PackageChanger.check_version_for_mode(app_title, version, mode, silent, logger)
|
222
|
+
|
223
|
+
puts "\u{1f3AB} #{app_title} has a #{mode} patch policy with ID #{patch_policy_id}" unless silent
|
224
|
+
logger.write("#{app_title} has a #{mode} patch policy with ID #{patch_policy_id}")
|
225
|
+
|
226
|
+
case PackageChanger.confirm
|
227
|
+
when 'y'
|
228
|
+
PackageChanger.activate_patch_for_mode(app_title, mode, version, patch_policy_id, silent, logger)
|
229
|
+
exit 0
|
230
|
+
when 'n'
|
231
|
+
puts "\u{1F519} Cancelling changes."
|
232
|
+
logger.write('User cancelled.')
|
233
|
+
exit 0
|
234
|
+
else
|
235
|
+
puts PackageChanger::ERROR
|
236
|
+
logger.write(PackageChanger::ERROR)
|
237
|
+
exit 1
|
238
|
+
end
|
239
|
+
|
240
|
+
when 'single'
|
169
241
|
unless JSS::Package.valid_id(old_package) && JSS::Package.valid_id(new_package)
|
170
242
|
logger.write("Either #{old_package} or #{new_package} does not exist")
|
171
|
-
puts PackageChanger::
|
243
|
+
puts PackageChanger::MISSING_PACKAGE
|
172
244
|
exit 1
|
173
245
|
end
|
174
246
|
|
175
|
-
|
176
247
|
target_policy = target_policy.match(/[^[:digit:]]+/) ? target_policy : target_policy.to_i
|
177
248
|
unless JSS::Policy.valid_id(target_policy)
|
178
249
|
logger.write("The policy with id #{target_policy} does not exist.")
|
179
|
-
puts PackageChanger::
|
250
|
+
puts PackageChanger::MISSING_POLICY
|
180
251
|
exit 1
|
181
252
|
end
|
182
253
|
|
@@ -185,14 +256,7 @@ begin
|
|
185
256
|
puts "\u{1F4E6} The package #{old_package}\n\u{27A1 FE0F} will be replaced with #{new_package}\n\u{1F4CC} in #{changed_pol.name}"
|
186
257
|
logger.write("The package #{old_package} will be replaced with #{new_package} in #{changed_pol.name}")
|
187
258
|
|
188
|
-
|
189
|
-
|
190
|
-
while confirmation !~ /[yn]/i
|
191
|
-
puts 'Please confirm [y/n]:'
|
192
|
-
confirmation = gets.chomp.downcase
|
193
|
-
end
|
194
|
-
|
195
|
-
case confirmation
|
259
|
+
case PackageChanger.confirm
|
196
260
|
when 'y'
|
197
261
|
puts "\u{1F3A2} Processing changes." unless silent
|
198
262
|
logger.write('Starting changes.')
|
@@ -18,7 +18,9 @@ module PackageChanger
|
|
18
18
|
jamf_port: :to_i,
|
19
19
|
jamf_use_ssl: nil,
|
20
20
|
jamf_user: nil,
|
21
|
-
jamf_password: nil
|
21
|
+
jamf_password: nil,
|
22
|
+
testers_keyword: nil,
|
23
|
+
release_keyword: nil
|
22
24
|
}.freeze
|
23
25
|
|
24
26
|
# automatically create accessors for all the CONF_KEYS
|
@@ -86,4 +88,5 @@ module PackageChanger
|
|
86
88
|
def self.config
|
87
89
|
PackageChanger::Configuration.instance
|
88
90
|
end
|
89
|
-
end
|
91
|
+
end
|
92
|
+
# module
|
@@ -39,6 +39,8 @@ module PackageChanger
|
|
39
39
|
|
40
40
|
def self.replace_packages_in(changed_pol, old_package, new_package, silent, logger)
|
41
41
|
puts 'Starting replacement process' unless silent
|
42
|
+
puts 'Processing changes.' unless silent
|
43
|
+
logger.write('Starting changes.')
|
42
44
|
|
43
45
|
puts "Changing #{changed_pol.name}" unless silent
|
44
46
|
logger.write("Changing #{changed_pol.name}")
|
@@ -50,6 +52,9 @@ module PackageChanger
|
|
50
52
|
puts "\u{1F6AB} Changed failed due to error: #{e.message}"
|
51
53
|
logger.write("Changed on #{changed_pol.name} failed due to error: #{e.message}")
|
52
54
|
end
|
55
|
+
puts "\u{1F3C1} Finished changing packages." unless silent
|
56
|
+
logger.write('Finished changing.')
|
57
|
+
|
53
58
|
end
|
54
59
|
|
55
60
|
def self.get_policies_with(list_package, silent, logger)
|
@@ -60,14 +65,7 @@ module PackageChanger
|
|
60
65
|
}
|
61
66
|
puts "\u{203C FE0F} There are #{all_policies.count} policies in your JSS…"
|
62
67
|
|
63
|
-
|
64
|
-
|
65
|
-
while confirmation !~ /[yn]/i
|
66
|
-
puts 'Would you like to continue? [y/n]:'
|
67
|
-
confirmation = gets.chomp.downcase
|
68
|
-
end
|
69
|
-
|
70
|
-
case confirmation
|
68
|
+
case confirm
|
71
69
|
when 'y'
|
72
70
|
pol_count = 1
|
73
71
|
all_policies.each do |policy|
|
@@ -95,4 +93,100 @@ module PackageChanger
|
|
95
93
|
end
|
96
94
|
end
|
97
95
|
|
98
|
-
|
96
|
+
def self.check_patch(app_title, new_package, version, silent, logger)
|
97
|
+
unless (patch_id = JSS::PatchTitle.valid_id(app_title))
|
98
|
+
logger.write("No patch management for #{app_title} exists")
|
99
|
+
puts PackageChanger::MISSING_PATCH_MGMT
|
100
|
+
exit 1
|
101
|
+
end
|
102
|
+
puts "\u{1f4bb} #{app_title} has a patch policy with ID #{patch_id}." unless silent
|
103
|
+
logger.write("Preparing change to #{app_title} with ID #{patch_id}.")
|
104
|
+
|
105
|
+
unless JSS::Package.valid_id(new_package)
|
106
|
+
logger.write("#{new_package} does not exist")
|
107
|
+
puts PackageChanger::MISSSING_ONE_PACKAGE
|
108
|
+
exit 1
|
109
|
+
end
|
110
|
+
puts "\u{1F4E6} #{new_package} is available in JSS." unless silent
|
111
|
+
logger.write("#{new_package} is available in JSS.")
|
112
|
+
|
113
|
+
patch_title = JSS::PatchTitle.fetch id: patch_id
|
114
|
+
unless patch_title.versions[version]
|
115
|
+
logger.write("#{app_title} does not have version #{version}")
|
116
|
+
puts PackageChanger::MISSING_VERSION
|
117
|
+
exit 1
|
118
|
+
end
|
119
|
+
puts "\u{1f516} #{app_title} has a version #{version}" unless silent
|
120
|
+
logger.write("#{app_title} has a version #{version}")
|
121
|
+
|
122
|
+
patch_title
|
123
|
+
end
|
124
|
+
# check_patch
|
125
|
+
|
126
|
+
def self.assign_patch(patch_title, new_package, version, silent, logger)
|
127
|
+
puts "\u{1F3A2} Updating patch policy." unless silent
|
128
|
+
logger.write("Setting #{new_package} for version #{version} of #{patch_title}")
|
129
|
+
patch_title.versions[version].package = new_package
|
130
|
+
patch_title.update
|
131
|
+
puts "\u{1F3C1} Finished changing patch policy." unless silent
|
132
|
+
logger.write("Patch definition of #{patch_title} updated")
|
133
|
+
end
|
134
|
+
# assign_patch
|
135
|
+
|
136
|
+
def self.check_version_for_mode(app_title, version, mode, silent, logger)
|
137
|
+
unless (patch_id = JSS::PatchTitle.valid_id(app_title))
|
138
|
+
logger.write("No patch management for #{app_title} exists")
|
139
|
+
puts PackageChanger::MISSING_PATCH_MGMT
|
140
|
+
exit 1
|
141
|
+
end
|
142
|
+
puts "\u{1f4bb} #{app_title} has a patch definition with ID #{patch_id}." unless silent
|
143
|
+
logger.write("Preparing change to enable #{mode} of #{app_title} with patch ID #{patch_id}.")
|
144
|
+
|
145
|
+
patch_title = JSS::PatchTitle.fetch id: patch_id
|
146
|
+
patch_version = patch_title.versions[version]
|
147
|
+
unless patch_version&.package_assigned?
|
148
|
+
logger.write("#{app_title} does not have version #{version}")
|
149
|
+
puts PackageChanger::MISSING_VERSION
|
150
|
+
exit 1
|
151
|
+
end
|
152
|
+
puts "\u{1f516} #{app_title} has a version #{version} and it has an assigned package" unless silent
|
153
|
+
logger.write("#{app_title} has a version #{version} and it has an assigned package")
|
154
|
+
|
155
|
+
policies = (JSS::PatchPolicy.all_for_title app_title) # Gets all with the title
|
156
|
+
case mode
|
157
|
+
when 'test'
|
158
|
+
keyword = PackageChanger.config.testers_keyword
|
159
|
+
when 'release'
|
160
|
+
keyword = PackageChanger.config.release_keyword
|
161
|
+
else
|
162
|
+
logger.write("Wrong mode introduced")
|
163
|
+
exit 1
|
164
|
+
end
|
165
|
+
|
166
|
+
begin
|
167
|
+
policies.find { |pol| pol[:name].include? keyword }[:id]
|
168
|
+
rescue StandardError => _e
|
169
|
+
puts PackageChanger::MISSING_POLICY
|
170
|
+
exit 1
|
171
|
+
end
|
172
|
+
end
|
173
|
+
# check_version_for_mode
|
174
|
+
|
175
|
+
def self.activate_patch_for_mode(app_title, mode, version, policy_id, silent, logger)
|
176
|
+
puts "\u{1F3A2} Updating #{mode} patch for #{app_title}." unless silent
|
177
|
+
logger.write("Assigning version #{version} to #{mode} group.")
|
178
|
+
policy = JSS::PatchPolicy.fetch policy_id
|
179
|
+
policy.disable
|
180
|
+
puts "\u{23F8} Patch policy temporary disabled." unless silent
|
181
|
+
policy.target_version = version
|
182
|
+
puts "\u{1F517} Version #{version} assigned." unless silent
|
183
|
+
policy.enable
|
184
|
+
puts "\u{25B6} Patch policy reenabled." unless silent
|
185
|
+
policy.update
|
186
|
+
puts "\u{1F3C1} Values updated." unless silent
|
187
|
+
logger.write("Patch of #{app_title} updated for testers")
|
188
|
+
end
|
189
|
+
# activate_patch_for_mode
|
190
|
+
|
191
|
+
end
|
192
|
+
# PackageChanger
|
data/lib/PackageChanger/log.rb
CHANGED
@@ -1,17 +1,13 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
2
|
module PackageChanger
|
3
|
-
|
4
3
|
class Log
|
5
|
-
|
6
4
|
DEFAULT_FILE = Pathname.new '/var/log/packagechanger.log'
|
7
5
|
|
8
6
|
# date and line format
|
9
7
|
DATE_FORMAT = '%Y-%m-%d %H:%M:%S'
|
10
8
|
|
11
9
|
def initialize
|
12
|
-
unless DEFAULT_FILE.file? && DEFAULT_FILE.writable?
|
13
|
-
File.write(DEFAULT_FILE, "≈≈≈ PackageChanger ≈≈≈\n", mode: 'a')
|
14
|
-
end
|
10
|
+
File.write(DEFAULT_FILE, "≈≈≈ PackageChanger ≈≈≈\n", mode: 'a') unless (DEFAULT_FILE.file? && DEFAULT_FILE.writable?)
|
15
11
|
end
|
16
12
|
|
17
13
|
def write(message)
|
@@ -22,7 +18,7 @@ module PackageChanger
|
|
22
18
|
puts message
|
23
19
|
write message
|
24
20
|
end
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
21
|
+
end
|
22
|
+
# Class Log
|
23
|
+
end
|
24
|
+
# MOdule
|
@@ -8,6 +8,13 @@ module PackageChanger
|
|
8
8
|
Usage: packagechanger [--silent] [--policy PolicyID] --old OldPackageName --new NewPackageName || --list ListedPackage
|
9
9
|
"
|
10
10
|
|
11
|
+
PATCH_USAGE = "
|
12
|
+
|
13
|
+
≈≈≈ PackageChanger ≈≈≈
|
14
|
+
|
15
|
+
Patch definition usage: packagechanger [--silent] --patch PatchDefinitionID --version PatchVersion --new NewPackageName
|
16
|
+
"
|
17
|
+
|
11
18
|
|
12
19
|
CONFIG_ERROR = "
|
13
20
|
|
@@ -20,21 +27,42 @@ module PackageChanger
|
|
20
27
|
|
21
28
|
"
|
22
29
|
|
23
|
-
|
30
|
+
MISSING_PACKAGE = "
|
24
31
|
|
25
32
|
≈≈≈ PackageChanger ≈≈≈
|
26
33
|
|
27
34
|
\u{1f4a9} Missing packages: One or both of the provided packages do not exist. Please verify.
|
28
35
|
"
|
29
36
|
|
30
|
-
|
37
|
+
MISSING_PATCH_MGMT = "
|
38
|
+
|
39
|
+
≈≈≈ PackageChanger ≈≈≈
|
40
|
+
|
41
|
+
\u{1f4a9} Missing patch definition: The provided software title does not have a patch definition. Please verify.
|
42
|
+
"
|
43
|
+
|
44
|
+
MISSING_ONE_PACKAGE = "
|
45
|
+
|
46
|
+
≈≈≈ PackageChanger ≈≈≈
|
47
|
+
|
48
|
+
\u{1f4a9} Missing package: The package provided does not exist in JAMF. Please verify.
|
49
|
+
"
|
50
|
+
|
51
|
+
MISSING_VERSION = "
|
52
|
+
|
53
|
+
≈≈≈ PackageChanger ≈≈≈
|
54
|
+
|
55
|
+
\u{1f4a9} Missing version: The patch definition for the title does not have the provided version registered.
|
56
|
+
"
|
57
|
+
|
58
|
+
MISSING_POLICY = "
|
31
59
|
|
32
60
|
≈≈≈ PackageChanger ≈≈≈
|
33
61
|
|
34
62
|
\u{1f4a9} Missing policy: The policy ID you provided does not exist. Please verify.
|
35
63
|
"
|
36
64
|
|
37
|
-
|
65
|
+
MISSING_LIST_PACKAGE = "
|
38
66
|
|
39
67
|
≈≈≈ PackageChanger ≈≈≈
|
40
68
|
|
@@ -59,4 +87,28 @@ module PackageChanger
|
|
59
87
|
STARTUP = "
|
60
88
|
≈≈≈ PackageChanger ≈≈≈
|
61
89
|
"
|
90
|
+
|
91
|
+
MISSING_TESTERS = "
|
92
|
+
|
93
|
+
≈≈≈ PackageChanger ≈≈≈
|
94
|
+
|
95
|
+
\u{1f4a9} Missing testers group: In order to start testing the patch, a patch policy with the word Testers in its name needs to exist for the title.
|
96
|
+
"
|
97
|
+
|
98
|
+
MISSING_PATCH_POLICY = "
|
99
|
+
|
100
|
+
≈≈≈ PackageChanger ≈≈≈
|
101
|
+
|
102
|
+
\u{1f4a9} Missing patch policy: The title you are trying to change does not have a patch policy with one of the keywords (test or release) in the title.
|
103
|
+
"
|
104
|
+
|
105
|
+
def self.confirm
|
106
|
+
confirmation = ''
|
107
|
+
while confirmation !~ /[yn]/i
|
108
|
+
puts 'Please confirm [y/n]:'
|
109
|
+
confirmation = gets.chomp.downcase
|
110
|
+
end
|
111
|
+
confirmation
|
112
|
+
end
|
113
|
+
|
62
114
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: PackageChanger
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Bernardo Prieto
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-08-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -42,16 +42,16 @@ dependencies:
|
|
42
42
|
name: rake
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- - "
|
45
|
+
- - ">="
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version:
|
47
|
+
version: 12.3.3
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- - "
|
52
|
+
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version:
|
54
|
+
version: 12.3.3
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: ruby-jss
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -102,18 +102,13 @@ executables:
|
|
102
102
|
extensions: []
|
103
103
|
extra_rdoc_files: []
|
104
104
|
files:
|
105
|
-
- ".DS_Store"
|
106
105
|
- ".gitignore"
|
107
|
-
- ".
|
108
|
-
- ".idea/PackageChanger.iml"
|
109
|
-
- ".idea/misc.xml"
|
110
|
-
- ".idea/modules.xml"
|
111
|
-
- ".idea/vcs.xml"
|
112
|
-
- ".idea/workspace.xml"
|
106
|
+
- ".ruby-version"
|
113
107
|
- ".travis.yml"
|
114
108
|
- Gemfile
|
115
109
|
- LICENSE.txt
|
116
110
|
- PackageChanger-0.1.0.gem
|
111
|
+
- PackageChanger-0.2.0.gem
|
117
112
|
- PackageChanger.gemspec
|
118
113
|
- README.md
|
119
114
|
- Rakefile
|