ruby-jss 1.2.3 → 1.2.4a1

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.
Files changed (103) hide show
  1. checksums.yaml +4 -4
  2. data/lib/jamf.rb +169 -0
  3. data/lib/jamf/api/abstract_classes/collection_resource.rb +422 -0
  4. data/lib/jamf/api/abstract_classes/generic_reference.rb +145 -0
  5. data/lib/jamf/api/abstract_classes/json_object.rb +1074 -0
  6. data/lib/jamf/api/abstract_classes/prestage.rb +219 -0
  7. data/lib/jamf/api/abstract_classes/prestage_skip_setup_items.rb +126 -0
  8. data/lib/jamf/api/abstract_classes/resource.rb +250 -0
  9. data/lib/jamf/api/abstract_classes/singleton_resource.rb +87 -0
  10. data/lib/jamf/api/attribute_classes/ip_address.rb +66 -0
  11. data/lib/jamf/api/attribute_classes/timestamp.rb +144 -0
  12. data/lib/jamf/api/connection.rb +734 -0
  13. data/lib/jamf/api/connection/api_error.rb +111 -0
  14. data/lib/jamf/api/connection/api_error_styleguide.rb +96 -0
  15. data/lib/jamf/api/connection/token.rb +220 -0
  16. data/lib/jamf/api/json_objects/account_prefs.rb +79 -0
  17. data/lib/jamf/api/json_objects/android_details.rb +139 -0
  18. data/lib/jamf/api/json_objects/appletv_details.rb +110 -0
  19. data/lib/jamf/api/json_objects/attachment.rb +68 -0
  20. data/lib/jamf/api/json_objects/cellular_network.rb +151 -0
  21. data/lib/jamf/api/json_objects/change_log_entry.rb +77 -0
  22. data/lib/jamf/api/json_objects/computer_prestage_skip_setup_items.rb +67 -0
  23. data/lib/jamf/api/json_objects/country.rb +51 -0
  24. data/lib/jamf/api/json_objects/extension_attribute_value.rb +128 -0
  25. data/lib/jamf/api/json_objects/installed_application.rb +59 -0
  26. data/lib/jamf/api/json_objects/installed_certificate.rb +53 -0
  27. data/lib/jamf/api/json_objects/installed_configuration_profile.rb +67 -0
  28. data/lib/jamf/api/json_objects/installed_ebook.rb +58 -0
  29. data/lib/jamf/api/json_objects/installed_provisioning_profile.rb +59 -0
  30. data/lib/jamf/api/json_objects/inventory_preload_extension_attribute.rb +52 -0
  31. data/lib/jamf/api/json_objects/ios_details.rb +244 -0
  32. data/lib/jamf/api/json_objects/location.rb +95 -0
  33. data/lib/jamf/api/json_objects/md_prestage_name.rb +57 -0
  34. data/lib/jamf/api/json_objects/md_prestage_names.rb +82 -0
  35. data/lib/jamf/api/json_objects/md_prestage_skip_setup_items.rb +165 -0
  36. data/lib/jamf/api/json_objects/mobile_device_details.rb +219 -0
  37. data/lib/jamf/api/json_objects/mobile_device_security.rb +101 -0
  38. data/lib/jamf/api/json_objects/prestage_assignment.rb +61 -0
  39. data/lib/jamf/api/json_objects/prestage_location.rb +104 -0
  40. data/lib/jamf/api/json_objects/prestage_purchasing_data.rb +132 -0
  41. data/lib/jamf/api/json_objects/prestage_scope.rb +54 -0
  42. data/lib/jamf/api/json_objects/prestage_sync_status.rb +63 -0
  43. data/lib/jamf/api/json_objects/purchasing_data.rb +125 -0
  44. data/lib/jamf/api/mixins/abstract.rb +58 -0
  45. data/lib/jamf/api/mixins/bulk_deletable.rb +39 -0
  46. data/lib/jamf/api/mixins/change_log.rb +136 -0
  47. data/lib/jamf/api/mixins/extendable.rb +75 -0
  48. data/lib/jamf/api/mixins/immutable.rb +39 -0
  49. data/lib/jamf/api/mixins/locatable.rb +124 -0
  50. data/lib/jamf/api/mixins/lockable.rb +48 -0
  51. data/lib/jamf/api/mixins/referable.rb +92 -0
  52. data/lib/jamf/api/mixins/searchable.rb +202 -0
  53. data/lib/jamf/api/mixins/uncreatable.rb +40 -0
  54. data/lib/jamf/api/mixins/undeletable.rb +40 -0
  55. data/lib/jamf/api/resources/collection_resources/account.rb +163 -0
  56. data/lib/jamf/api/resources/collection_resources/building.rb +114 -0
  57. data/lib/jamf/api/resources/collection_resources/category.rb +82 -0
  58. data/lib/jamf/api/resources/collection_resources/computer.rb +49 -0
  59. data/lib/jamf/api/resources/collection_resources/computer_prestage.rb +80 -0
  60. data/lib/jamf/api/resources/collection_resources/department.rb +79 -0
  61. data/lib/jamf/api/resources/collection_resources/extension_attribute.rb +45 -0
  62. data/lib/jamf/api/resources/collection_resources/inventory_preload_record.rb +274 -0
  63. data/lib/jamf/api/resources/collection_resources/md_prestage.rb +139 -0
  64. data/lib/jamf/api/resources/collection_resources/mobile_device.rb +315 -0
  65. data/lib/jamf/api/resources/collection_resources/script.rb +190 -0
  66. data/lib/jamf/api/resources/collection_resources/site.rb +77 -0
  67. data/lib/jamf/api/resources/singleton_resources/app_store_country_codes.rb +131 -0
  68. data/lib/jamf/api/resources/singleton_resources/authorization.rb +88 -0
  69. data/lib/jamf/api/resources/singleton_resources/client_checkin_settings.rb +139 -0
  70. data/lib/jamf/api/resources/singleton_resources/reenrollment_settings.rb +95 -0
  71. data/lib/jamf/client.rb +301 -0
  72. data/lib/jamf/client/jamf_binary.rb +132 -0
  73. data/lib/jamf/client/jamf_helper.rb +298 -0
  74. data/lib/jamf/client/management_action.rb +114 -0
  75. data/lib/jamf/compatibility.rb +88 -0
  76. data/lib/jamf/composer.rb +190 -0
  77. data/lib/jamf/configuration.rb +281 -0
  78. data/lib/jamf/exceptions.rb +107 -0
  79. data/lib/jamf/ruby_extensions.rb +36 -0
  80. data/lib/jamf/ruby_extensions/array.rb +35 -0
  81. data/lib/jamf/ruby_extensions/array/predicates.rb +46 -0
  82. data/lib/jamf/ruby_extensions/array/utils.rb +47 -0
  83. data/lib/jamf/ruby_extensions/filetest.rb +32 -0
  84. data/lib/jamf/ruby_extensions/filetest/predicates.rb +46 -0
  85. data/lib/jamf/ruby_extensions/hash.rb +33 -0
  86. data/lib/jamf/ruby_extensions/hash/backports.rb +92 -0
  87. data/lib/jamf/ruby_extensions/ipaddr.rb +37 -0
  88. data/lib/jamf/ruby_extensions/ipaddr/utils.rb +95 -0
  89. data/lib/jamf/ruby_extensions/object.rb +30 -0
  90. data/lib/jamf/ruby_extensions/object/predicates.rb +51 -0
  91. data/lib/jamf/ruby_extensions/pathname.rb +39 -0
  92. data/lib/jamf/ruby_extensions/pathname/predicates.rb +50 -0
  93. data/lib/jamf/ruby_extensions/pathname/utils.rb +75 -0
  94. data/lib/jamf/ruby_extensions/string.rb +35 -0
  95. data/lib/jamf/ruby_extensions/string/backports.rb +66 -0
  96. data/lib/jamf/ruby_extensions/string/conversions.rb +65 -0
  97. data/lib/jamf/ruby_extensions/string/predicates.rb +47 -0
  98. data/lib/jamf/utility.rb +423 -0
  99. data/lib/jamf/validate.rb +224 -0
  100. data/lib/jamf/version.rb +32 -0
  101. data/lib/jpapi.rb +26 -0
  102. data/lib/jss/version.rb +1 -1
  103. metadata +104 -4
@@ -0,0 +1,139 @@
1
+ # Copyright 2019 Pixar
2
+
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "Apache License")
5
+ # with the following modification; you may not use this file except in
6
+ # compliance with the Apache License and the following modification to it:
7
+ # Section 6. Trademarks. is deleted and replaced with:
8
+ #
9
+ # 6. Trademarks. This License does not grant permission to use the trade
10
+ # names, trademarks, service marks, or product names of the Licensor
11
+ # and its affiliates, except as required to comply with Section 4(c) of
12
+ # the License and to reproduce the content of the NOTICE file.
13
+ #
14
+ # You may obtain a copy of the Apache License at
15
+ #
16
+ # http://www.apache.org/licenses/LICENSE-2.0
17
+ #
18
+ # Unless required by applicable law or agreed to in writing, software
19
+ # distributed under the Apache License with the above modification is
20
+ # distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
21
+ # KIND, either express or implied. See the Apache License for the specific
22
+ # language governing permissions and limitations under the Apache License.
23
+ #
24
+ #
25
+
26
+ module Jamf
27
+
28
+ # The client checkin settings for the Jamf Pro Server
29
+ #
30
+ class ClientCheckInSettings < Jamf::SingletonResource
31
+
32
+ # Mix-Ins
33
+ #####################################
34
+
35
+ extend Jamf::ChangeLog
36
+ include Jamf::ChangeLog
37
+
38
+ # Constants
39
+ #####################################
40
+
41
+ UPDATABLE = true
42
+
43
+ RSRC_VERSION = 'v1'.freeze
44
+
45
+ RSRC_PATH = 'check-in'.freeze
46
+
47
+ OBJECT_MODEL = {
48
+
49
+ # @!attribute checkInFrequency
50
+ # @return [integer]
51
+ checkInFrequency: {
52
+ class: :integer
53
+ },
54
+
55
+ # @!attribute isCreateHooks
56
+ # @return [Boolean]
57
+ isCreateHooks: {
58
+ class: :boolean
59
+ },
60
+
61
+ # @!attribute isHookLog
62
+ # @return [Boolean]
63
+ isHookLog: {
64
+ class: :boolean
65
+ },
66
+
67
+ # @!attribute isHookPolicies
68
+ # @return [Boolean]
69
+ isHookPolicies: {
70
+ class: :boolean
71
+ },
72
+
73
+ # @!attribute isHookHideRestore
74
+ # @return [Boolean]
75
+ isHookHideRestore: {
76
+ class: :boolean
77
+ },
78
+
79
+ # @!attribute isHookMCX
80
+ # @return [Boolean]
81
+ isHookMCX: {
82
+ class: :boolean
83
+ },
84
+
85
+ # @!attribute isBackgroundHooks
86
+ # @return [Boolean]
87
+ isBackgroundHooks: {
88
+ class: :boolean
89
+ },
90
+
91
+ # @!attribute isHookDisplayStatus
92
+ # @return [Boolean]
93
+ isHookDisplayStatus: {
94
+ class: :boolean
95
+ },
96
+
97
+ # @!attribute isCreateStartupScript
98
+ # @return [Boolean]
99
+ isCreateStartupScript: {
100
+ class: :boolean
101
+ },
102
+
103
+ # @!attribute isStartupLog
104
+ # @return [Boolean]
105
+ isStartupLog: {
106
+ class: :boolean
107
+ },
108
+
109
+ # @!attribute isStartupPolicies
110
+ # @return [Boolean]
111
+ isStartupPolicies: {
112
+ class: :boolean
113
+ },
114
+
115
+ # @!attribute isStartupSSH
116
+ # @return [Boolean]
117
+ isStartupSSH: {
118
+ class: :boolean
119
+ },
120
+
121
+ # @!attribute isStartupMCX
122
+ # @return [Boolean]
123
+ isStartupMCX: {
124
+ class: :boolean
125
+ },
126
+
127
+ # @!attribute isEnableLocalConfigurationProfiles
128
+ # @return [Boolean]
129
+ isEnableLocalConfigurationProfiles: {
130
+ class: :boolean
131
+ }
132
+
133
+ }.freeze # end OBJECT_MODEL
134
+
135
+ parse_object_model
136
+
137
+ end # class ClientCheckIn
138
+
139
+ end # module JAMF
@@ -0,0 +1,95 @@
1
+ # Copyright 2019 Pixar
2
+
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "Apache License")
5
+ # with the following modification; you may not use this file except in
6
+ # compliance with the Apache License and the following modification to it:
7
+ # Section 6. Trademarks. is deleted and replaced with:
8
+ #
9
+ # 6. Trademarks. This License does not grant permission to use the trade
10
+ # names, trademarks, service marks, or product names of the Licensor
11
+ # and its affiliates, except as required to comply with Section 4(c) of
12
+ # the License and to reproduce the content of the NOTICE file.
13
+ #
14
+ # You may obtain a copy of the Apache License at
15
+ #
16
+ # http://www.apache.org/licenses/LICENSE-2.0
17
+ #
18
+ # Unless required by applicable law or agreed to in writing, software
19
+ # distributed under the Apache License with the above modification is
20
+ # distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
21
+ # KIND, either express or implied. See the Apache License for the specific
22
+ # language governing permissions and limitations under the Apache License.
23
+ #
24
+ #
25
+
26
+ module Jamf
27
+
28
+ # The device re-enrollment settings for the Jamf Pro Server
29
+ #
30
+ class ReEnrollmentSettings < Jamf::SingletonResource
31
+
32
+ # Mix-Ins
33
+ #####################################
34
+
35
+ include Jamf::ChangeLog
36
+
37
+ # Constants
38
+ #####################################
39
+
40
+ RSRC_VERSION = 'v1'.freeze
41
+
42
+ RSRC_PATH = 'reenrollment'.freeze
43
+
44
+ FLUSH_MDM_QUEUE_NOTHING = 'DELETE_NOTHING'.freeze
45
+ FLUSH_MDM_QUEUE_ERRORS = 'DELETE_ERRORS'.freeze
46
+ FLUSH_MDM_QUEUE_NOT_ACKD = 'DELETE_EVERYTHING_EXCEPT_ACKNOWLEDGED'.freeze
47
+ FLUSH_MDM_QUEUE_EVERYTHING = 'DELETE_EVERYTHING'.freeze
48
+
49
+ FLUSH_MDM_QUEUE_OPTIONS = [
50
+ FLUSH_MDM_QUEUE_NOTHING,
51
+ FLUSH_MDM_QUEUE_ERRORS,
52
+ FLUSH_MDM_QUEUE_NOT_ACKD,
53
+ FLUSH_MDM_QUEUE_EVERYTHING
54
+ ].freeze
55
+
56
+ OBJECT_MODEL = {
57
+
58
+ # @!attribute isFlushPolicyHistoryEnabled
59
+ # @return [Boolean]
60
+ isFlushPolicyHistoryEnabled: {
61
+ class: :boolean
62
+ },
63
+
64
+ # @!attribute isFlushLocationInformationEnabled
65
+ # @return [Boolean]
66
+ isFlushLocationInformationEnabled: {
67
+ class: :boolean
68
+ },
69
+
70
+ # @!attribute isFlushLocationInformationHistoryEnabled
71
+ # @return [Boolean]
72
+ isFlushLocationInformationHistoryEnabled: {
73
+ class: :boolean
74
+ },
75
+
76
+ # @!attribute isFlushExtensionAttributesEnabled
77
+ # @return [Boolean]
78
+ isFlushExtensionAttributesEnabled: {
79
+ class: :boolean
80
+ },
81
+
82
+ # @!attribute flushMDMQueue
83
+ # @param [Symbol] a key from ReEnrollment::FLUSH_MDM_QUEUE_OPTIONS
84
+ # @return [Symbol]
85
+ flushMDMQueue: {
86
+ class: :string,
87
+ enum: FLUSH_MDM_QUEUE_OPTIONS
88
+ }
89
+
90
+ }.freeze # end OBJECT_MODEL
91
+ parse_object_model
92
+
93
+ end # class ReEnrollment
94
+
95
+ end # module JAMF
@@ -0,0 +1,301 @@
1
+ ### Copyright 2019 Pixar
2
+
3
+ ###
4
+ ### Licensed under the Apache License, Version 2.0 (the "Apache License")
5
+ ### with the following modification; you may not use this file except in
6
+ ### compliance with the Apache License and the following modification to it:
7
+ ### Section 6. Trademarks. is deleted and replaced with:
8
+ ###
9
+ ### 6. Trademarks. This License does not grant permission to use the trade
10
+ ### names, trademarks, service marks, or product names of the Licensor
11
+ ### and its affiliates, except as required to comply with Section 4(c) of
12
+ ### the License and to reproduce the content of the NOTICE file.
13
+ ###
14
+ ### You may obtain a copy of the Apache License at
15
+ ###
16
+ ### http://www.apache.org/licenses/LICENSE-2.0
17
+ ###
18
+ ### Unless required by applicable law or agreed to in writing, software
19
+ ### distributed under the Apache License with the above modification is
20
+ ### distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
21
+ ### KIND, either express or implied. See the Apache License for the specific
22
+ ### language governing permissions and limitations under the Apache License.
23
+ ###
24
+ ###
25
+
26
+ ###
27
+ module JSS
28
+
29
+ # This class represents a Jamf/JSS Client computer, on which
30
+ # this code is running.
31
+ #
32
+ # Since the class represents the current machine, there's no need
33
+ # to make an instance of it, all methods are class methods.
34
+ #
35
+ # At the moment, only Macintosh computers are supported.
36
+ #
37
+ # TODO: convert this to a module, since that's how it's used.
38
+ #
39
+ class Client
40
+
41
+ # Constants
42
+ #####################################
43
+
44
+ # The Pathname to the preferences plist used by the jamf binary
45
+ JAMF_PLIST = Pathname.new '/Library/Preferences/com.jamfsoftware.jamf.plist'
46
+
47
+ # The Pathname to the JAMF support folder
48
+ JAMF_SUPPORT_FOLDER = Pathname.new '/Library/Application Support/JAMF'
49
+
50
+ # The JAMF receipts folder, where package installs are tracked.
51
+ RECEIPTS_FOLDER = JAMF_SUPPORT_FOLDER + 'Receipts'
52
+
53
+ # The JAMF downloads folder
54
+ DOWNLOADS_FOLDER = JAMF_SUPPORT_FOLDER + 'Downloads'
55
+
56
+ # The bin folder inside the Jamf support folder
57
+ SUPPORT_BIN_FOLDER = JAMF_SUPPORT_FOLDER + 'bin'
58
+
59
+ # The bin folder with the jamf binary and a few other things
60
+ USR_LOCAL_BIN_FOLDER = Pathname.new '/usr/local/jamf/bin'
61
+
62
+ # This command gives raw info about console users
63
+ CONSOLE_USERS_SCUTIL_CMD = 'echo "show State:/Users/ConsoleUser" | /usr/sbin/scutil'.freeze
64
+
65
+ # ignore console user = root (loginwindow)
66
+ ROOT_USER = 'root'.freeze
67
+
68
+ # ignore primary console user loginwindow
69
+ LOGINWINDOW_USER = 'loginwindow'.freeze
70
+
71
+ # The end of the path to the Self Service Executable.
72
+ # Used to figure out who's running Self Service.app
73
+ SELF_SERVICE_EXECUTABLE_END = '/Self Service.app/Contents/MacOS/Self Service'.freeze
74
+
75
+ # the ps command used to figure out who's running Self Service
76
+ PS_USER_COMM = 'ps -A -o user,comm'.freeze
77
+
78
+ # the path to a users byhost folder from home
79
+ USER_PREFS_BYHOST_FOLDER = 'Library/Preferences/ByHost/'
80
+
81
+ # Class Methods
82
+ #####################################
83
+
84
+
85
+
86
+ # Get the current IP address as a String.
87
+ #
88
+ # This handy code doesn't acutally make a UDP connection,
89
+ # it just starts to set up the connection, then uses that to get
90
+ # the local IP.
91
+ #
92
+ # Lifted gratefully from
93
+ # http://coderrr.wordpress.com/2008/05/28/get-your-local-ip-address/
94
+ #
95
+ # @return [String] the current IP address.
96
+ #
97
+ def self.my_ip_address
98
+ # turn off reverse DNS resolution temporarily
99
+ # @note the 'socket' library has already been required by 'rest-client'
100
+ orig = Socket.do_not_reverse_lookup
101
+ Socket.do_not_reverse_lookup = true
102
+
103
+ UDPSocket.open do |s|
104
+ s.connect '192.168.0.0', 1
105
+ s.addr.last
106
+ end
107
+ ensure
108
+ Socket.do_not_reverse_lookup = orig
109
+ end
110
+
111
+ # Is the jamf binary installed?
112
+ #
113
+ # @return [Boolean] is the jamf binary installed?
114
+ #
115
+ def self.installed?
116
+ JAMF_BINARY.executable?
117
+ end
118
+
119
+ # What version of the jamf binary is installed?
120
+ #
121
+ # @return [String,nil] the version of the jamf binary installed on this client, nil if not installed
122
+ #
123
+ def self.jamf_version
124
+ installed? ? run_jamf(:version).chomp.split('=')[1] : nil
125
+ end
126
+
127
+ # the URL to the jss for this client
128
+ #
129
+ # @return [String] the url to the JSS for this client
130
+ #
131
+ def self.jss_url
132
+ @url = jamf_plist['jss_url']
133
+ return nil if @url.nil?
134
+ @url =~ %r{(https?)://(.+):(\d+)/}
135
+ @protocol = Regexp.last_match(1)
136
+ @server = Regexp.last_match(2)
137
+ @port = Regexp.last_match(3)
138
+ @url
139
+ end
140
+
141
+ # The JSS server hostname for this client
142
+ #
143
+ # @return [String] the JSS server for this client
144
+ #
145
+ def self.jss_server
146
+ jss_url
147
+ @server
148
+ end
149
+
150
+ # The protocol for JSS connections for this client
151
+ #
152
+ # @return [String] the protocol to the JSS for this client, "http" or "https"
153
+ #
154
+ def self.jss_protocol
155
+ jss_url
156
+ @protocol
157
+ end
158
+
159
+ # The port number for JSS connections for this client
160
+ #
161
+ # @return [Integer] the port to the JSS for this client
162
+ #
163
+ def self.jss_port
164
+ jss_url
165
+ @port
166
+ end
167
+
168
+ # The contents of the JAMF plist
169
+ #
170
+ # @return [Hash] the parsed contents of the JAMF_PLIST if it exists,
171
+ # an empty hash if not
172
+ #
173
+ def self.jamf_plist
174
+ return {} unless JAMF_PLIST.file?
175
+ JSS.parse_plist JAMF_PLIST
176
+ end
177
+
178
+ # All the JAMF receipts on this client
179
+ #
180
+ # @return [Array<Pathname>] an array of Pathnames for all regular files in the jamf receipts folder
181
+ #
182
+ def self.receipts
183
+ raise JSS::NoSuchItemError, "The JAMF Receipts folder doesn't exist on this computer." unless RECEIPTS_FOLDER.exist?
184
+ RECEIPTS_FOLDER.children.select(&:file?)
185
+ end
186
+
187
+ # Is the JSS available right now?
188
+ #
189
+ # @return [Boolean] is the JSS available now?
190
+ #
191
+ def self.jss_available?
192
+ run_jamf :checkJSSConnection, '-retry 1'
193
+ $CHILD_STATUS.exitstatus.zero?
194
+ end
195
+
196
+ # The JSS::Computer object for this computer
197
+ #
198
+ # @return [JSS::Computer,nil] The JSS record for this computer, nil if not in the JSS
199
+ #
200
+ def self.jss_record
201
+ JSS::Computer.fetch udid: udid
202
+ rescue JSS::NoSuchItemError
203
+ nil
204
+ end
205
+
206
+ # The UUID for this computer via system_profiler
207
+ #
208
+ # @return [String] the UUID/UDID for this computer
209
+ #
210
+ def self.udid
211
+ hardware_data['platform_UUID']
212
+ end
213
+
214
+ # The serial number for this computer via system_profiler
215
+ #
216
+ # @return [String] the serial number for this computer
217
+ #
218
+ def self.serial_number
219
+ hardware_data['serial_number']
220
+ end
221
+
222
+ # The parsed HardwareDataType output from system_profiler
223
+ #
224
+ # @return [Hash] the HardwareDataType data from the system_profiler command
225
+ #
226
+ def self.hardware_data
227
+ raw = `/usr/sbin/system_profiler SPHardwareDataType -xml 2>/dev/null`
228
+ JSS.parse_plist(raw)[0]['_items'][0]
229
+ end
230
+
231
+ # Who's currently got an active GUI session? - might be
232
+ # more than one if Fast User Switching is in use.
233
+ #
234
+ # @return [Array<String>] The current users with GUI sessions
235
+ #
236
+ def self.console_users
237
+ output = `#{CONSOLE_USERS_SCUTIL_CMD}`
238
+ userlines = output.lines.select { |l| l =~ /SessionUserNameKey\s*:/ }
239
+ userlines.map! { |ul| ul.split(':').last.strip }
240
+ userlines.reject { |un| un == ROOT_USER }
241
+ end
242
+
243
+ # Which console user is using the primary GUI console?
244
+ # Returns nil if the primary GUI console is at the login window.
245
+ #
246
+ # @return [String,nil] The login name of the user is using the primary
247
+ # GUI console, or nil if at the login window.
248
+ #
249
+ def self.primary_console_user
250
+ `#{CONSOLE_USERS_SCUTIL_CMD}` =~ /^\s*Name : (\S+)$/
251
+ user = Regexp.last_match(1)
252
+ user == LOGINWINDOW_USER ? nil : user
253
+ end
254
+
255
+ # alias for primary_console_user
256
+ def self.console_user
257
+ primary_console_user
258
+ end
259
+
260
+ # Who's currently running Self Service.app? - might be
261
+ # more than one if Fast User Switching is in use.
262
+ #
263
+ # @return [Array<String>] The current users running Self Service.app
264
+ #
265
+ def self.self_service_users
266
+ ss_userlines = `#{PS_USER_COMM}`.lines.select { |l| l.include? SELF_SERVICE_EXECUTABLE_END }
267
+ ss_userlines.map { |ssl| ssl.split(' ').first }
268
+ end
269
+
270
+ # @param user[String, nil] The user to query, the current user if nil.
271
+ #
272
+ # @return [Boolean, nil] Is 'Do Not Disturb' enabled for the user?
273
+ # nil if unknown/not-applicable
274
+ #
275
+ def self.do_not_disturb?(user = nil)
276
+ home = user ? homedir(user) : Dir.home
277
+ myudid = udid
278
+ nc_prefs_file = Pathname.new "#{home}/#{USER_PREFS_BYHOST_FOLDER}/com.apple.notificationcenterui.#{myudid}.plist"
279
+ return nil unless nc_prefs_file.readable?
280
+ JSS.parse_plist(nc_prefs_file)['doNotDisturb']
281
+ end
282
+
283
+ # The home dir of the specified user, nil if
284
+ # no homedir in local dscl.
285
+ #
286
+ # @param user[String] the user whose homedir to look up
287
+ #
288
+ # @return [Pathname, nil] The user's homedir or nil if no such user
289
+ #
290
+ def self.homedir(user)
291
+ dir = `/usr/bin/dscl . -read /Users/#{user} NFSHomeDirectory 2>/dev/null`.chomp.split(': ').last
292
+ dir ? Pathname.new(dir) : nil
293
+ end
294
+
295
+ end # class Client
296
+
297
+ end # module
298
+
299
+ require 'jamf-client/jamf_binary'
300
+ require 'jamf-client/jamf_helper'
301
+ require 'jamf-client/management_action'