ruby-jss 1.2.10 → 1.5.2
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of ruby-jss might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/CHANGES.md +208 -1
- data/lib/jamf.rb +18 -16
- data/lib/jamf/api/base_classes/collection_resource.rb +613 -0
- data/lib/jamf/api/{abstract_classes → base_classes}/json_object.rb +110 -102
- data/lib/jamf/api/{abstract_classes → base_classes}/prestage.rb +56 -31
- data/lib/jamf/api/{abstract_classes → base_classes}/resource.rb +10 -6
- data/lib/jamf/api/{abstract_classes → base_classes}/singleton_resource.rb +4 -3
- data/lib/jamf/api/connection.rb +20 -12
- data/lib/jamf/api/connection/api_error.rb +8 -8
- data/lib/jamf/api/connection/token.rb +36 -15
- data/lib/jamf/api/json_objects/device_enrollment_device.rb +14 -7
- data/lib/jamf/api/json_objects/{location.rb → device_enrollment_device_sync_state.rb} +27 -41
- data/lib/jamf/api/json_objects/device_enrollment_sync_status.rb +1 -1
- data/lib/jamf/api/json_objects/{attachment.rb → locale.rb} +14 -23
- data/lib/jamf/api/json_objects/md_prestage_name.rb +1 -1
- data/lib/jamf/api/json_objects/md_prestage_names.rb +2 -2
- data/lib/jamf/api/json_objects/md_prestage_skip_setup_items.rb +50 -1
- data/lib/jamf/api/json_objects/prestage_assignment.rb +2 -2
- data/lib/jamf/api/json_objects/prestage_location.rb +3 -3
- data/lib/jamf/api/json_objects/prestage_purchasing_data.rb +7 -7
- data/lib/jamf/api/json_objects/prestage_scope.rb +1 -1
- data/lib/jamf/api/{resources/collection_resources → json_objects}/time_zone.rb +9 -23
- data/lib/jamf/api/mixins/{abstract.rb → base_class.rb} +34 -16
- data/lib/jamf/api/mixins/bulk_deletable.rb +27 -6
- data/lib/jamf/api/mixins/change_log.rb +201 -51
- data/lib/jamf/api/{resources/collection_resources/extension_attribute.rb → mixins/filterable.rb} +20 -14
- data/lib/jamf/api/mixins/pageable.rb +208 -0
- data/lib/jamf/api/{json_objects/installed_application.rb → mixins/sortable.rb} +33 -33
- data/lib/jamf/api/resources/collection_resources/building.rb +16 -9
- data/lib/jamf/api/resources/collection_resources/category.rb +5 -4
- data/lib/jamf/api/resources/collection_resources/computer_prestage.rb +12 -5
- data/lib/jamf/api/resources/collection_resources/department.rb +1 -3
- data/lib/jamf/api/resources/collection_resources/device_enrollment.rb +13 -13
- data/lib/jamf/api/resources/collection_resources/inventory_preload_record.rb +11 -3
- data/lib/jamf/api/resources/collection_resources/mobile_device_prestage.rb +25 -23
- data/lib/jamf/api/resources/collection_resources/script.rb +61 -25
- data/lib/jamf/api/resources/singleton_resources/app_store_country_codes.rb +15 -5
- data/lib/jamf/api/resources/singleton_resources/locales.rb +155 -0
- data/lib/jamf/api/resources/singleton_resources/time_zones.rb +213 -0
- data/lib/jamf/configuration.rb +7 -9
- data/lib/jamf/ruby_extensions.rb +1 -0
- data/lib/jamf/ruby_extensions/array.rb +1 -1
- data/lib/jamf/ruby_extensions/array/utils.rb +3 -3
- data/lib/jamf/{api/resources/collection_resources/computer.rb → ruby_extensions/dig.rb} +22 -19
- data/lib/jamf/validate.rb +63 -24
- data/lib/jamf/version.rb +1 -1
- data/lib/jss.rb +4 -1
- data/lib/jss/api_connection.rb +111 -433
- data/lib/jss/api_object.rb +16 -13
- data/lib/jss/api_object/advanced_search.rb +27 -26
- data/lib/jss/api_object/app_store_country_codes.rb +298 -0
- data/lib/jss/api_object/categorizable.rb +1 -1
- data/lib/jss/api_object/computer.rb +13 -0
- data/lib/jss/api_object/configuration_profile.rb +60 -4
- data/lib/jss/api_object/directory_binding.rb +273 -0
- data/lib/jss/api_object/directory_binding_type.rb +96 -0
- data/lib/jss/api_object/directory_binding_type/active_directory.rb +539 -0
- data/lib/jss/api_object/directory_binding_type/admitmac.rb +594 -0
- data/lib/jss/api_object/directory_binding_type/centrify.rb +226 -0
- data/lib/jss/api_object/directory_binding_type/open_directory.rb +178 -0
- data/lib/jss/api_object/directory_binding_type/powerbroker_identity_services.rb +73 -0
- data/lib/jss/api_object/disk_encryption_configurations.rb +114 -0
- data/lib/jss/api_object/distribution_point.rb +97 -37
- data/lib/jss/api_object/dock_item.rb +143 -0
- data/lib/jss/api_object/ebook.rb +1 -2
- data/lib/jss/api_object/extendable.rb +1 -1
- data/lib/jss/api_object/extension_attribute.rb +4 -3
- data/lib/jss/api_object/group.rb +33 -2
- data/lib/jss/api_object/mac_application.rb +107 -8
- data/lib/jss/api_object/mobile_device_application.rb +12 -0
- data/lib/jss/api_object/network_segment.rb +195 -70
- data/lib/jss/api_object/package.rb +105 -40
- data/lib/jss/api_object/patch_source.rb +10 -9
- data/lib/jss/api_object/policy.rb +596 -32
- data/lib/jss/api_object/printer.rb +446 -0
- data/lib/jss/api_object/scopable.rb +10 -15
- data/lib/jss/api_object/scopable/scope.rb +371 -55
- data/lib/jss/api_object/self_servable.rb +17 -9
- data/lib/jss/api_object/uploadable.rb +1 -1
- data/lib/jss/api_object/user.rb +42 -1
- data/lib/jss/api_object/vpp_account.rb +209 -0
- data/lib/jss/api_object/vppable.rb +169 -13
- data/lib/jss/composer.rb +1 -1
- data/lib/jss/exceptions.rb +3 -0
- data/lib/jss/server.rb +15 -0
- data/lib/jss/utility.rb +143 -52
- data/lib/jss/validate.rb +53 -10
- data/lib/jss/version.rb +1 -1
- metadata +56 -61
- data/lib/jamf/api/abstract_classes/advanced_search.rb +0 -86
- data/lib/jamf/api/abstract_classes/collection_resource.rb +0 -433
- data/lib/jamf/api/abstract_classes/generic_reference.rb +0 -145
- data/lib/jamf/api/abstract_classes/prestage_skip_setup_items.rb +0 -126
- data/lib/jamf/api/json_objects/account_prefs.rb +0 -79
- data/lib/jamf/api/json_objects/android_details.rb +0 -139
- data/lib/jamf/api/json_objects/appletv_details.rb +0 -110
- data/lib/jamf/api/json_objects/cellular_network.rb +0 -151
- data/lib/jamf/api/json_objects/computer_prestage_skip_setup_items.rb +0 -67
- data/lib/jamf/api/json_objects/criterion.rb +0 -152
- data/lib/jamf/api/json_objects/extension_attribute_value.rb +0 -128
- data/lib/jamf/api/json_objects/installed_certificate.rb +0 -53
- data/lib/jamf/api/json_objects/installed_configuration_profile.rb +0 -67
- data/lib/jamf/api/json_objects/installed_ebook.rb +0 -58
- data/lib/jamf/api/json_objects/installed_provisioning_profile.rb +0 -59
- data/lib/jamf/api/json_objects/ios_details.rb +0 -244
- data/lib/jamf/api/json_objects/mobile_device_details.rb +0 -219
- data/lib/jamf/api/json_objects/mobile_device_security.rb +0 -101
- data/lib/jamf/api/json_objects/purchasing_data.rb +0 -125
- data/lib/jamf/api/mixins/locatable.rb +0 -124
- data/lib/jamf/api/mixins/referable.rb +0 -92
- data/lib/jamf/api/resources/collection_resources/account.rb +0 -163
- data/lib/jamf/api/resources/collection_resources/advanced_mobile_device_search.rb +0 -52
- data/lib/jamf/api/resources/collection_resources/advanced_user_search.rb +0 -52
- data/lib/jamf/api/resources/collection_resources/mobile_device.rb +0 -315
- data/lib/jamf/api/resources/collection_resources/site.rb +0 -77
- data/lib/jamf/api/resources/singleton_resources/authorization.rb +0 -88
- data/lib/jamf/api/resources/singleton_resources/client_checkin_settings.rb +0 -139
- data/lib/jamf/api/resources/singleton_resources/reenrollment_settings.rb +0 -95
data/lib/jss/composer.rb
CHANGED
@@ -147,7 +147,7 @@ module JSS
|
|
147
147
|
|
148
148
|
### now build the pkg
|
149
149
|
begin
|
150
|
-
it_built = system "#{PKGBUILD} --identifier '#{pkg_id}' --version '#{version}' --ownership #{pkg_ownership} --install-location / --root '#{root}' #{signing} #{comp_plist_arg} '#{pkg_out}'
|
150
|
+
it_built = system "#{PKGBUILD} --identifier '#{pkg_id}' --version '#{version}' --ownership #{pkg_ownership} --install-location / --root '#{root}' #{signing} #{comp_plist_arg} '#{pkg_out}'"
|
151
151
|
|
152
152
|
raise 'There was an error building the .pkg' unless it_built
|
153
153
|
ensure
|
data/lib/jss/exceptions.rb
CHANGED
data/lib/jss/server.rb
CHANGED
@@ -110,6 +110,21 @@ module JSS
|
|
110
110
|
@act_code_data[:code]
|
111
111
|
end
|
112
112
|
|
113
|
+
# Update the activation code and organization name for this server
|
114
|
+
#
|
115
|
+
# @param org: [String] the organization to which the server is licensed
|
116
|
+
# @param code: [String ] the activation code for the server licence
|
117
|
+
#
|
118
|
+
# @return [void]
|
119
|
+
def update_activation_code(org:, code:)
|
120
|
+
xml = REXML::Document.new JSS::APIConnection::XML_HEADER
|
121
|
+
acode = xml.add_element ACTIVATION_CODE_KEY.to_s
|
122
|
+
acode.add_element('organization_name').text = org
|
123
|
+
acode.add_element('code').text = code
|
124
|
+
|
125
|
+
@api.put_rsrc ACTIVATION_CODE_RSRC, xml.to_s
|
126
|
+
end
|
127
|
+
|
113
128
|
# Remove the api object from
|
114
129
|
# the instance_variables used to create
|
115
130
|
# pretty-print (pp) output.
|
data/lib/jss/utility.rb
CHANGED
@@ -23,73 +23,157 @@
|
|
23
23
|
#
|
24
24
|
#
|
25
25
|
|
26
|
-
#
|
27
26
|
module JSS
|
28
27
|
|
29
28
|
# A collection of useful utility methods. Mostly for
|
30
29
|
# converting values between formats, parsing data, and
|
31
30
|
# user interaction.
|
32
31
|
|
33
|
-
#
|
32
|
+
# Hash of 'minor' => 'maint'
|
33
|
+
# The maximum maint release for macOS 10.minor.maint
|
34
|
+
# e.g the highest release of 10.6 was 10.6.8, the highest release of
|
35
|
+
# 10.15 was 10.15.7
|
36
|
+
#
|
37
|
+
# 12 is the default for the current OS and higher
|
38
|
+
# (and hoping apple doesn't release 10.16.13)
|
39
|
+
OS_TEN_MAXS = {
|
40
|
+
2 => 8,
|
41
|
+
3 => 9,
|
42
|
+
4 => 11,
|
43
|
+
5 => 8,
|
44
|
+
6 => 8,
|
45
|
+
7 => 5,
|
46
|
+
8 => 5,
|
47
|
+
9 => 5,
|
48
|
+
10 => 5,
|
49
|
+
11 => 6,
|
50
|
+
12 => 6,
|
51
|
+
13 => 6,
|
52
|
+
14 => 6,
|
53
|
+
15 => 7,
|
54
|
+
16 => 12
|
55
|
+
}
|
56
|
+
|
57
|
+
# Hash of 'major' => 'minor'
|
58
|
+
# The maximum minor release for macOS major.minor
|
59
|
+
# e.g. the highest release of 11 is 11.12
|
60
|
+
#
|
61
|
+
# 12 is the default for the current OS and higher
|
62
|
+
# (and hoping apple doesn't release 11.13)
|
63
|
+
MAC_OS_MAXS = {
|
64
|
+
11 => 12,
|
65
|
+
12 => 12,
|
66
|
+
13 => 12,
|
67
|
+
14 => 12,
|
68
|
+
15 => 12,
|
69
|
+
16 => 12,
|
70
|
+
17 => 12,
|
71
|
+
18 => 12,
|
72
|
+
19 => 12,
|
73
|
+
20 => 12
|
74
|
+
}
|
75
|
+
|
76
|
+
# Converts an OS Version into an Array of equal or higher OS versions, up to
|
77
|
+
# some non-existant max, hopefully far in the future, currently 20.12
|
78
|
+
#
|
79
|
+
# This array can then be joined with commas and used as the value of the
|
80
|
+
# os_requirements for Packages and Scripts.
|
81
|
+
#
|
82
|
+
# It's unlikely that this method, as written, will still be in use by
|
83
|
+
# the release of macOS 20.12, but currently thats the upper limit.
|
84
|
+
#
|
85
|
+
# Hopefully well before then JAMF will implement a "minimum OS" in Jamf Pro
|
86
|
+
# itself, then we could avoid the inherant limitations in using a method like
|
87
|
+
# this.
|
34
88
|
#
|
35
|
-
#
|
36
|
-
#
|
89
|
+
# When the highest maint. release of an OS version is not known, because its
|
90
|
+
# the currently released OS version or higher, then this method assumes '12'
|
91
|
+
# e.g. '10.16.12', '11.12', '12.12', etc.
|
37
92
|
#
|
38
|
-
#
|
93
|
+
# Apple has never released more than 11 updates to a version of macOS
|
94
|
+
# (that being 10.4), so hopefully 12 is enough
|
39
95
|
#
|
40
|
-
#
|
96
|
+
# Since Big Sur might report itself as either '10.16.x' or '11.x', this method
|
97
|
+
# will allow for both possibilities, and the array will contain whatever
|
98
|
+
# iterations needed for both version numbers
|
99
|
+
#
|
100
|
+
# @param min_os [String] the mimimum OS version to expand, e.g. ">=10.9.4" or "11.1"
|
101
|
+
#
|
102
|
+
# @return [Array] Nearly all potential OS versions from the minimum to 20.12
|
41
103
|
#
|
42
104
|
# @example
|
43
|
-
# JSS.expand_min_os ">=10.
|
44
|
-
# # ["10.
|
45
|
-
# # "10.
|
46
|
-
# # "10.
|
47
|
-
# #
|
48
|
-
# # "10.6.11",
|
49
|
-
# # "10.6.12",
|
50
|
-
# # "10.6.13",
|
51
|
-
# # "10.6.14",
|
52
|
-
# # "10.6.15",
|
53
|
-
# # "10.7.x",
|
54
|
-
# # "10.8.x",
|
55
|
-
# # "10.9.x",
|
56
|
-
# # "10.10.x",
|
57
|
-
# # "10.11.x",
|
58
|
-
# # "10.12.x",
|
59
|
-
# # "10.13.x",
|
60
|
-
# # "10.14.x",
|
61
|
-
# # "10.15.x",
|
105
|
+
# JSS.expand_min_os ">=10.9.4" # => returns this array
|
106
|
+
# # ["10.9.4",
|
107
|
+
# # "10.9.5",
|
108
|
+
# # "10.10.x"
|
109
|
+
# # ...
|
62
110
|
# # "10.16.x",
|
63
|
-
# # "
|
64
|
-
# # "
|
65
|
-
# #
|
111
|
+
# # "11.x",
|
112
|
+
# # "12.x",
|
113
|
+
# # ...
|
114
|
+
# # "20.x"]
|
66
115
|
#
|
67
116
|
#
|
68
117
|
def self.expand_min_os(min_os)
|
69
118
|
min_os = min_os.delete '>='
|
70
119
|
|
71
120
|
# split the version into major, minor and maintenance release numbers
|
72
|
-
|
121
|
+
major, minor, maint = min_os.split('.')
|
73
122
|
maint = 'x' if maint.nil? || maint == '0'
|
74
123
|
|
75
|
-
|
76
|
-
|
77
|
-
|
124
|
+
ok_oses = []
|
125
|
+
|
126
|
+
# if major == 11 e.g. big sur, e.g. 10.16,
|
127
|
+
# reset major & min so that we get coverage for both
|
128
|
+
# 10.16 and 11, since clients may report it as either
|
129
|
+
if major == '11'
|
130
|
+
major = '10'
|
131
|
+
maint = minor
|
132
|
+
minor = '16'
|
133
|
+
end
|
134
|
+
|
135
|
+
# Deal with 10.x.x up to 10.16
|
136
|
+
if major == '10'
|
137
|
+
# if the maint release number is an "x" just start the list of OK OS's with it
|
138
|
+
if maint == 'x'
|
139
|
+
ok_oses << min_os
|
140
|
+
|
141
|
+
# otherwise, start with it and explicitly add all maint releases for
|
142
|
+
# that maint version. if unknown because its a current or future OS,
|
143
|
+
# go as h
|
144
|
+
else
|
145
|
+
max_maint_for_minor = OS_TEN_MAXS[minor.to_i]
|
146
|
+
(maint.to_i..max_maint_for_minor).each do |m|
|
147
|
+
ok_oses << "#{major}.#{minor}.#{m}"
|
148
|
+
end # each m
|
149
|
+
end
|
150
|
+
|
151
|
+
# now account for all macOS versions starting with 10.
|
152
|
+
# up to 10.16.x
|
153
|
+
((minor.to_i + 1)..16).each do |v|
|
154
|
+
ok_oses << "#{major}.#{v}.x"
|
155
|
+
end # each v
|
156
|
+
|
157
|
+
# now reset major to 11, so we can continue with BigSur and up
|
158
|
+
major = '11'
|
159
|
+
minor = minor == '16' ? maint : 'x'
|
160
|
+
end # if major == 10
|
78
161
|
|
79
|
-
#
|
80
|
-
|
162
|
+
# Now deal with Big Sur and higher, macOS 10.16/11
|
163
|
+
if minor == 'x'
|
164
|
+
ok_oses << "#{major}.#{minor}"
|
81
165
|
else
|
82
|
-
|
83
|
-
(
|
84
|
-
ok_oses <<
|
166
|
+
max_minor_for_major = MAC_OS_MAXS[major.to_i]
|
167
|
+
(minor.to_i..max_minor_for_major).each do |m|
|
168
|
+
ok_oses << "#{major}.#{m}"
|
85
169
|
end # each m
|
86
|
-
end
|
170
|
+
end # if minor == x
|
87
171
|
|
88
|
-
# now account for all
|
89
|
-
|
90
|
-
|
91
|
-
ok_oses << maj + '.' + v.to_s + '.x'
|
172
|
+
# now account for all macOS versions 11 and up
|
173
|
+
((major.to_i + 1)..MAC_OS_MAXS.keys.max).each do |v|
|
174
|
+
ok_oses << "#{v}.x"
|
92
175
|
end # each v
|
176
|
+
|
93
177
|
ok_oses
|
94
178
|
end
|
95
179
|
|
@@ -109,6 +193,7 @@ module JSS
|
|
109
193
|
#
|
110
194
|
def self.processor_ok?(requirement, processor = nil)
|
111
195
|
return true if requirement.to_s.empty? || requirement =~ /none/i
|
196
|
+
|
112
197
|
processor ||= `/usr/bin/uname -p`
|
113
198
|
requirement == (processor.to_s.include?('86') ? 'x86' : 'ppc')
|
114
199
|
end
|
@@ -129,6 +214,7 @@ module JSS
|
|
129
214
|
def self.os_ok?(requirement, os_to_check = nil)
|
130
215
|
return true if requirement.to_s =~ /none/i
|
131
216
|
return true if requirement.to_s == 'n'
|
217
|
+
|
132
218
|
requirement = JSS.to_s_and_a(requirement)[:arrayform]
|
133
219
|
return true if requirement.empty?
|
134
220
|
|
@@ -201,6 +287,7 @@ module JSS
|
|
201
287
|
case plist
|
202
288
|
when String
|
203
289
|
return Plist.parse_xml plist if plist.include? '</plist>'
|
290
|
+
|
204
291
|
plist = Pathname.new plist
|
205
292
|
when Pathname
|
206
293
|
true
|
@@ -237,9 +324,7 @@ module JSS
|
|
237
324
|
|
238
325
|
# if the UTC offset of the datetime is zero, make a new one with the correct local offset
|
239
326
|
# (which might also be zero if we happen to be in GMT)
|
240
|
-
if the_dt.offset.zero?
|
241
|
-
the_dt = DateTime.new(the_dt.year, the_dt.month, the_dt.day, the_dt.hour, the_dt.min, the_dt.sec, JSS::TIME_ZONE_OFFSET)
|
242
|
-
end
|
327
|
+
the_dt = DateTime.new(the_dt.year, the_dt.month, the_dt.day, the_dt.hour, the_dt.min, the_dt.sec, JSS::TIME_ZONE_OFFSET) if the_dt.offset.zero?
|
243
328
|
# now convert it to a Time and return it
|
244
329
|
Time.at the_dt.strftime('%s').to_i, usec
|
245
330
|
end # parse_time
|
@@ -261,6 +346,7 @@ module JSS
|
|
261
346
|
#
|
262
347
|
def self.epoch_to_time(epoch)
|
263
348
|
return nil if NIL_DATES.include? epoch
|
349
|
+
|
264
350
|
Time.at(epoch.to_i / 1000.0)
|
265
351
|
end # parse_date
|
266
352
|
|
@@ -280,6 +366,7 @@ module JSS
|
|
280
366
|
def self.api_object_class(name)
|
281
367
|
klass = api_object_names[name.downcase.to_sym]
|
282
368
|
raise JSS::InvalidDataError, "Unknown API Object Class: #{name}" unless klass
|
369
|
+
|
283
370
|
klass
|
284
371
|
end
|
285
372
|
|
@@ -297,11 +384,13 @@ module JSS
|
|
297
384
|
#
|
298
385
|
def self.api_object_names
|
299
386
|
return @api_object_names if @api_object_names
|
387
|
+
|
300
388
|
@api_object_names ||= {}
|
301
389
|
JSS.constants.each do |const|
|
302
390
|
klass = JSS.const_get const
|
303
391
|
next unless klass.is_a? Class
|
304
392
|
next unless klass.ancestors.include? JSS::APIObject
|
393
|
+
|
305
394
|
@api_object_names[klass.const_get(:RSRC_LIST_KEY).to_sym] = klass if klass.constants.include? :RSRC_LIST_KEY
|
306
395
|
@api_object_names[klass.const_get(:RSRC_OBJECT_KEY).to_sym] = klass if klass.constants.include? :RSRC_OBJECT_KEY
|
307
396
|
end
|
@@ -338,6 +427,7 @@ module JSS
|
|
338
427
|
#
|
339
428
|
def self.array_to_rexml_array(element, list)
|
340
429
|
raise JSS::InvalidDataError, 'Arg. must be an Array.' unless list.is_a? Array
|
430
|
+
|
341
431
|
element = element.to_s
|
342
432
|
list.map do |v|
|
343
433
|
e = REXML::Element.new(element)
|
@@ -364,6 +454,7 @@ module JSS
|
|
364
454
|
#
|
365
455
|
def self.hash_to_rexml_array(hash)
|
366
456
|
raise InvalidDataError, 'Arg. must be a Hash.' unless hash.is_a? Hash
|
457
|
+
|
367
458
|
ary = []
|
368
459
|
hash.each_pair do |k, v|
|
369
460
|
el = REXML::Element.new k.to_s
|
@@ -442,11 +533,11 @@ module JSS
|
|
442
533
|
|
443
534
|
{
|
444
535
|
major: major.to_i,
|
445
|
-
minor:
|
446
|
-
revision:
|
447
|
-
maint:
|
448
|
-
patch:
|
449
|
-
build:
|
536
|
+
minor: minor.to_i,
|
537
|
+
revision: revision.to_i,
|
538
|
+
maint: revision.to_i,
|
539
|
+
patch: revision.to_i,
|
540
|
+
build: build,
|
450
541
|
version: Gem::Version.new("#{major}.#{minor}.#{revision}")
|
451
542
|
}
|
452
543
|
end
|
@@ -471,6 +562,7 @@ module JSS
|
|
471
562
|
@stdin_lines ||= ($stdin.tty? ? [] : $stdin.read.lines.map { |l| l.chomp("\n") })
|
472
563
|
|
473
564
|
return @stdin_lines.join("\n") if line <= 0
|
565
|
+
|
474
566
|
idx = line - 1
|
475
567
|
@stdin_lines[idx]
|
476
568
|
end
|
@@ -503,10 +595,9 @@ module JSS
|
|
503
595
|
# @return [Boolean] The new state of devmode
|
504
596
|
#
|
505
597
|
def self.devmode(setting)
|
506
|
-
@devmode = setting == :on
|
598
|
+
@devmode = setting == :on
|
507
599
|
end
|
508
600
|
|
509
|
-
|
510
601
|
# is devmode currently on?
|
511
602
|
#
|
512
603
|
# @return [Boolean]
|
data/lib/jss/validate.rb
CHANGED
@@ -111,8 +111,8 @@ module JSS
|
|
111
111
|
|
112
112
|
# Confirm that the given value is a boolean value, accepting
|
113
113
|
# strings and symbols and returning real booleans as needed
|
114
|
-
# Accepts: true, false, 'true', 'false',
|
115
|
-
#
|
114
|
+
# Accepts: true, false, 'true', 'false', 'yes', 'no', 't','f', 'y', or 'n'
|
115
|
+
# as strings or symbols, case insensitive
|
116
116
|
#
|
117
117
|
# TODO: use this throughout ruby-jss
|
118
118
|
#
|
@@ -123,11 +123,11 @@ module JSS
|
|
123
123
|
# @return [Boolean] the valid boolean
|
124
124
|
#
|
125
125
|
def self.boolean(bool, msg = nil)
|
126
|
-
msg ||= 'Value must be boolean true or false'
|
127
126
|
return bool if JSS::TRUE_FALSE.include? bool
|
128
|
-
return true if bool.to_s =~ /^(
|
129
|
-
return false if bool.to_s =~ /^(
|
127
|
+
return true if bool.to_s =~ /^(t(rue)?|y(es)?)$/i
|
128
|
+
return false if bool.to_s =~ /^(f(alse)?|no?)$/i
|
130
129
|
|
130
|
+
msg ||= 'Value must be boolean true or false, or an equivalent string or symbol'
|
131
131
|
raise JSS::InvalidDataError, msg
|
132
132
|
end
|
133
133
|
|
@@ -176,10 +176,10 @@ module JSS
|
|
176
176
|
# @return [String] the valid uuid string
|
177
177
|
#
|
178
178
|
def self.uuid(val, msg = nil)
|
179
|
-
|
180
|
-
raise JSS::InvalidDataError, msg unless val.is_a?(String) && val =~ UUID_RE
|
179
|
+
return val if val.is_a?(String) && val =~ UUID_RE
|
181
180
|
|
182
|
-
|
181
|
+
msg ||= 'value must be valid uuid'
|
182
|
+
raise JSS::InvalidDataError, msg
|
183
183
|
end
|
184
184
|
|
185
185
|
# validate that the given value is an integer in the JSS::IBeacon::MAJOR_MINOR_RANGE
|
@@ -191,13 +191,56 @@ module JSS
|
|
191
191
|
# @return [String] the valid integer
|
192
192
|
#
|
193
193
|
def self.ibeacon_major_minor(val, msg = nil)
|
194
|
-
msg ||= "value must be an integer in the range #{JSS::IBeacon::MAJOR_MINOR_RANGE}"
|
195
194
|
val = val.to_i if val.is_a?(String) && val.jss_integer?
|
196
195
|
ok = val.is_a? Integer
|
197
196
|
ok = JSS::IBeacon::MAJOR_MINOR_RANGE.include? val if ok
|
197
|
+
return val if ok
|
198
|
+
|
199
|
+
msg ||= "value must be an integer in the range #{JSS::IBeacon::MAJOR_MINOR_RANGE}"
|
198
200
|
raise JSS::InvalidDataError, msg unless ok
|
201
|
+
end
|
199
202
|
|
200
|
-
|
203
|
+
# validate a country name or code from JSS::APP_STORE_COUNTRY_CODES
|
204
|
+
# returning the validated code, or raising an error
|
205
|
+
#
|
206
|
+
# @param country[String] The country name or code
|
207
|
+
#
|
208
|
+
# @param msg[String] A custom error message when the value is invalid
|
209
|
+
#
|
210
|
+
# @return [String] the valid two-letter country code
|
211
|
+
#
|
212
|
+
def self.app_store_country_code(country, msg = nil)
|
213
|
+
country = country.to_s.upcase
|
214
|
+
return country if JSS::APP_STORE_COUNTRY_CODES.value? country
|
215
|
+
|
216
|
+
JSS::APP_STORE_COUNTRY_CODES.each do |name, code|
|
217
|
+
return code if name.upcase == country
|
218
|
+
end
|
219
|
+
|
220
|
+
msg ||= 'Unknown country name or code. See JSS::APP_STORE_COUNTRY_CODES or JSS.country_code_match(str)'
|
221
|
+
raise JSS::InvalidDataError, msg
|
222
|
+
end
|
223
|
+
|
224
|
+
# validate an email address - must match the RegEx /^\S+@\S+\.\S+$/
|
225
|
+
# i.e.:
|
226
|
+
# 1 or more non-whitespace chars, followed by
|
227
|
+
# an @ character, followed by
|
228
|
+
# 1 or more non-whitespace chars, followed by
|
229
|
+
# a dot, followed by
|
230
|
+
# 1 or more non-whitespace chars
|
231
|
+
#
|
232
|
+
# @param email[String] The email address
|
233
|
+
#
|
234
|
+
# @param msg[String] A custom error message when the value is invalid
|
235
|
+
#
|
236
|
+
# @return [String] the validly formatted email address
|
237
|
+
#
|
238
|
+
def self.email_address(email, msg = nil)
|
239
|
+
msg ||= "'#{email}' is not formatted as a valid email address"
|
240
|
+
email = email.to_s
|
241
|
+
return email if email =~ /^\S+@\S+\.\S+$/
|
242
|
+
|
243
|
+
raise JSS::InvalidDataError, msg
|
201
244
|
end
|
202
245
|
|
203
246
|
end # module validate
|