ruby-jss 0.6.3

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.

Files changed (73) hide show
  1. checksums.yaml +7 -0
  2. data/.yardopts +7 -0
  3. data/CHANGES.md +112 -0
  4. data/LICENSE.txt +174 -0
  5. data/README.md +426 -0
  6. data/THANKS.md +6 -0
  7. data/bin/cgrouper +485 -0
  8. data/bin/subnet-update +400 -0
  9. data/lib/jss-api.rb +2 -0
  10. data/lib/jss.rb +190 -0
  11. data/lib/jss/api_connection.rb +410 -0
  12. data/lib/jss/api_object.rb +616 -0
  13. data/lib/jss/api_object/advanced_search.rb +389 -0
  14. data/lib/jss/api_object/advanced_search/advanced_computer_search.rb +95 -0
  15. data/lib/jss/api_object/advanced_search/advanced_mobile_device_search.rb +96 -0
  16. data/lib/jss/api_object/advanced_search/advanced_user_search.rb +95 -0
  17. data/lib/jss/api_object/building.rb +92 -0
  18. data/lib/jss/api_object/category.rb +147 -0
  19. data/lib/jss/api_object/computer.rb +852 -0
  20. data/lib/jss/api_object/creatable.rb +98 -0
  21. data/lib/jss/api_object/criteriable.rb +189 -0
  22. data/lib/jss/api_object/criteriable/criteria.rb +231 -0
  23. data/lib/jss/api_object/criteriable/criterion.rb +228 -0
  24. data/lib/jss/api_object/department.rb +93 -0
  25. data/lib/jss/api_object/distribution_point.rb +560 -0
  26. data/lib/jss/api_object/extendable.rb +221 -0
  27. data/lib/jss/api_object/extension_attribute.rb +466 -0
  28. data/lib/jss/api_object/extension_attribute/computer_extension_attribute.rb +362 -0
  29. data/lib/jss/api_object/extension_attribute/mobile_device_extension_attribute.rb +189 -0
  30. data/lib/jss/api_object/extension_attribute/user_extension_attribute.rb +117 -0
  31. data/lib/jss/api_object/group.rb +380 -0
  32. data/lib/jss/api_object/group/computer_group.rb +124 -0
  33. data/lib/jss/api_object/group/mobile_device_group.rb +139 -0
  34. data/lib/jss/api_object/group/user_group.rb +139 -0
  35. data/lib/jss/api_object/ldap_server.rb +535 -0
  36. data/lib/jss/api_object/locatable.rb +286 -0
  37. data/lib/jss/api_object/matchable.rb +97 -0
  38. data/lib/jss/api_object/mobile_device.rb +556 -0
  39. data/lib/jss/api_object/netboot_server.rb +148 -0
  40. data/lib/jss/api_object/network_segment.rb +414 -0
  41. data/lib/jss/api_object/osx_configuration_profile.rb +262 -0
  42. data/lib/jss/api_object/package.rb +839 -0
  43. data/lib/jss/api_object/peripheral.rb +335 -0
  44. data/lib/jss/api_object/peripheral_type.rb +295 -0
  45. data/lib/jss/api_object/policy.rb +898 -0
  46. data/lib/jss/api_object/purchasable.rb +316 -0
  47. data/lib/jss/api_object/removable_macaddr.rb +98 -0
  48. data/lib/jss/api_object/scopable.rb +136 -0
  49. data/lib/jss/api_object/scopable/scope.rb +621 -0
  50. data/lib/jss/api_object/script.rb +631 -0
  51. data/lib/jss/api_object/self_servable.rb +356 -0
  52. data/lib/jss/api_object/site.rb +93 -0
  53. data/lib/jss/api_object/software_update_server.rb +109 -0
  54. data/lib/jss/api_object/updatable.rb +117 -0
  55. data/lib/jss/api_object/uploadable.rb +138 -0
  56. data/lib/jss/api_object/user.rb +272 -0
  57. data/lib/jss/client.rb +504 -0
  58. data/lib/jss/compatibility.rb +66 -0
  59. data/lib/jss/composer.rb +185 -0
  60. data/lib/jss/configuration.rb +306 -0
  61. data/lib/jss/db_connection.rb +298 -0
  62. data/lib/jss/exceptions.rb +95 -0
  63. data/lib/jss/ruby_extensions.rb +35 -0
  64. data/lib/jss/ruby_extensions/filetest.rb +43 -0
  65. data/lib/jss/ruby_extensions/hash.rb +79 -0
  66. data/lib/jss/ruby_extensions/ipaddr.rb +91 -0
  67. data/lib/jss/ruby_extensions/pathname.rb +77 -0
  68. data/lib/jss/ruby_extensions/string.rb +59 -0
  69. data/lib/jss/ruby_extensions/time.rb +63 -0
  70. data/lib/jss/server.rb +108 -0
  71. data/lib/jss/utility.rb +478 -0
  72. data/lib/jss/version.rb +31 -0
  73. metadata +187 -0
@@ -0,0 +1,400 @@
1
+ #!/usr/bin/ruby
2
+
3
+ ### Copyright 2016 Pixar
4
+ ###
5
+ ### Licensed under the Apache License, Version 2.0 (the "Apache License")
6
+ ### with the following modification; you may not use this file except in
7
+ ### compliance with the Apache License and the following modification to it:
8
+ ### Section 6. Trademarks. is deleted and replaced with:
9
+ ###
10
+ ### 6. Trademarks. This License does not grant permission to use the trade
11
+ ### names, trademarks, service marks, or product names of the Licensor
12
+ ### and its affiliates, except as required to comply with Section 4(c) of
13
+ ### the License and to reproduce the content of the NOTICE file.
14
+ ###
15
+ ### You may obtain a copy of the Apache License at
16
+ ###
17
+ ### http://www.apache.org/licenses/LICENSE-2.0
18
+ ###
19
+ ### Unless required by applicable law or agreed to in writing, software
20
+ ### distributed under the Apache License with the above modification is
21
+ ### distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
22
+ ### KIND, either express or implied. See the Apache License for the specific
23
+ ### language governing permissions and limitations under the Apache License.
24
+
25
+ ##############################
26
+ # == Synopsis
27
+ # Add, remove, or change the Network Segments in the JSS based on data from an input file
28
+ # in CSV, tab, or other delimited format.
29
+ #
30
+ # == Usage
31
+ # subnet-update [-t | -d delimiter] [-h] file
32
+ #
33
+ #
34
+ # == Author
35
+ # Chris Lasell <chrisl@pixar.com>
36
+ #
37
+ # == Copyright
38
+ # Copyright (c) 2014 Pixar Animation Studios
39
+
40
+ ##############################
41
+ # Libraries
42
+ require 'jss-api'
43
+ require 'getoptlong'
44
+
45
+ ##############################
46
+ # The app object
47
+ class App
48
+
49
+ ##############################
50
+ # Constants
51
+
52
+ USAGE = "Usage: #{File.basename($0)} [-d delim] [--header] [-c col1,col2,col3 ] [-m manual-prefix] [--help] /path/to/file"
53
+
54
+ POTENTIAL_COLUMNS = [:name, :starting, :ending, :cidr]
55
+
56
+ # Whenever we process a file, we store it here. The next time we
57
+ # run, if the input file is identical to this, we exit witout doing anything.
58
+ DEFAULT_CACHE_FILE = Pathname.new("~/.last_subnet_update").expand_path
59
+
60
+ DEFAULT_DELIMITER = "\t"
61
+ DEFAULT_COLUMNS = [:name, :starting, :ending]
62
+ DEFAULT_MANUAL_PREFIX = "Manual-"
63
+
64
+
65
+ attr_reader :debug
66
+
67
+ ###############
68
+ # set up
69
+ def initialize(args)
70
+
71
+ # set defaults
72
+ @debug = false
73
+
74
+ @delim = DEFAULT_DELIMITER
75
+ @header = false
76
+ @columns = DEFAULT_COLUMNS
77
+ @cache_file = DEFAULT_CACHE_FILE
78
+ @manual_prefix = DEFAULT_MANUAL_PREFIX
79
+
80
+
81
+ #define the cli opts
82
+ cli_opts = GetoptLong.new(
83
+ [ '--help', '-H', GetoptLong::NO_ARGUMENT ],
84
+ [ '--delimiter', '--delim', '-d', GetoptLong::REQUIRED_ARGUMENT],
85
+ [ '--header', '-h', GetoptLong::NO_ARGUMENT],
86
+ [ '--columns', '-c', GetoptLong::OPTIONAL_ARGUMENT],
87
+ [ '--manual-prefix', '-m', GetoptLong::OPTIONAL_ARGUMENT],
88
+ [ '--cache', GetoptLong::REQUIRED_ARGUMENT ],
89
+ [ '--debug', GetoptLong::NO_ARGUMENT],
90
+ [ '--server', '-S', GetoptLong::OPTIONAL_ARGUMENT],
91
+ [ '--port', '-P', GetoptLong::OPTIONAL_ARGUMENT],
92
+ [ '--user', '-U', GetoptLong::OPTIONAL_ARGUMENT],
93
+ [ '--no-verify-cert', '-V', GetoptLong::NO_ARGUMENT],
94
+ [ '--timeout', '-T', GetoptLong::OPTIONAL_ARGUMENT]
95
+ )
96
+
97
+ # parse the cli opts
98
+ cli_opts.each do |opt, arg|
99
+ case opt
100
+ when '--help' then show_help
101
+ when '--delimiter' then @delim = arg
102
+ when '--header' then @header = true
103
+ when '--columns' then @columns = arg.split(',').map{|c| c.to_sym}
104
+ when '--manual-prefix' then @manual_prefix = arg
105
+ when '--cache' then @cache_file = Pathname.new arg
106
+ when '--debug' then @debug = true
107
+ when '--server'
108
+ @server = arg
109
+
110
+ when '--port'
111
+ @port = arg
112
+
113
+ when '--user'
114
+ @user = arg
115
+
116
+ when '--no-verify-cert'
117
+ @verify_cert = false
118
+
119
+ when '--timeout'
120
+ @timeout = arg
121
+
122
+ end # case
123
+ end # each opt arg
124
+
125
+
126
+ @columns = nil if @columns and @columns.empty?
127
+
128
+ @file = args.shift
129
+
130
+
131
+ end # init
132
+
133
+ ###############
134
+ # Go!
135
+ def run
136
+
137
+ unless @file
138
+ puts "No input file specified."
139
+ puts USAGE
140
+ return
141
+ end
142
+
143
+ @file = Pathname.new @file
144
+
145
+ unless parse_file
146
+ puts "File hasn't changed since last time, no changes to make!"
147
+ return
148
+ end
149
+
150
+ # use any config settings defined....
151
+ @user ||= JSS::CONFIG.api_username
152
+ @server ||= JSS::CONFIG.api_server_name
153
+ @getpass = $stdin.tty? ? :prompt : :stdin
154
+
155
+ raise JSS::MissingDataError, "No JSS Username provided or found in the JSS gem config." unless @user
156
+ raise JSS::MissingDataError, "No JSS Server provided or found in the JSS gem config." unless @server
157
+
158
+ JSS::API.connect( :server => @server,
159
+ :port => @port,
160
+ :verify_cert => @verify_cert,
161
+ :user => @user,
162
+ :pw => @getpass,
163
+ :stdin_line => 1,
164
+ :timeout => @timeout
165
+ )
166
+
167
+ update_network_segments
168
+
169
+ end # run
170
+
171
+ #####################################
172
+ ###
173
+ ### Show Help
174
+ ###
175
+ def show_help
176
+ puts <<-FULLHELP
177
+ Update the JSS Network Segments from a delimited file of subnet information.
178
+
179
+ #{USAGE}
180
+
181
+ Options:
182
+ -d, --delimiter - The field delimiter in the file, defaults to tab.
183
+ -c, --columns [col1,col2,col3]
184
+ - The column order in file, must include 'name', 'starting',
185
+ and either 'ending' or 'cidr'
186
+ -h, --header - The first line of the file is a header line,
187
+ possibly defining the columns
188
+ -m, --manual-prefix - Network Segment names in the JSS with this prefix are ignored.
189
+ Defaults to 'Manual-'
190
+ --cache /path/.. - Where read/save the input data for comparison between runs.
191
+ Defaults to ~/.last_subnet_update
192
+ -S, --server srvr - specify the JSS API server name
193
+ -P, --port portnum - specify the JSS API port
194
+ -U, --user username - specify the JSS API user
195
+ -V, --no-verify-cert - Allow self-signed, unverified SSL certificate
196
+ -T, --timeout secs - specify the JSS API timeout
197
+ -H, --help - show this help
198
+ --debug - show the ruby backtrace when errors occur
199
+
200
+ This program parses the input file line by line (possibly accounting for a header line).
201
+ Each line defines the name and IP-range of a subnet/network segment.
202
+
203
+ - If a segment doesn't exist in the JSS, it is created.
204
+ - If a segment's range has changed, it is updated in the JSS.
205
+ - If a JSS segment doesn't exist in the file, it is deleted from the JSS
206
+ unless its name starts with the --manual-prefix
207
+
208
+ Input File:
209
+ - The file must contain three columns, separated by the --delimiter,
210
+ with these names, in any order:
211
+ - 'name' (the network segment name)
212
+ - 'starting' (the starting IP address of the network segment)
213
+ - EITHER of:
214
+ - 'ending' (the ending IP address of the network segment)
215
+ - 'cidr' (the network range of the segment as a CIDR bitmask, e.g. '24')
216
+ Notes:
217
+ - The --columns option is a comma-separted list of the three
218
+ column names aboveindicating the column-order in the file.
219
+
220
+ - If --columns are not provided, and --header is specified, the first line
221
+ is assumed to contain the column names, separated by the delimiter
222
+
223
+ - If --header is provided with --columns, the first line of the file is ignored.
224
+
225
+ - The raw data from the file is cached and compared to the input file at
226
+ the next run. If the data is identical, no JSS connection is made.
227
+
228
+ - If no API settings are provided, they will be read from /etc/jss_gem.conf
229
+ and ~/.jss_gem.conf. See the JSS Gem docs for details.
230
+
231
+ - The password for the connection will be read from STDIN or prompted if needed
232
+
233
+ FULLHELP
234
+ exit 0
235
+ end
236
+
237
+ ########################
238
+ # parse the incoming data file.
239
+ # If the file hasn't changed from the last time we processed it
240
+ # then return false
241
+ # otherwise parse it into @parsed_data and return true
242
+ # @parsed_data is an array of hashes, each with :name, :starting, and :ending
243
+ #
244
+ def parse_file
245
+
246
+ raise "'#{@file}' is not readable, or not a regular file" unless @file.readable? and @file.file?
247
+
248
+ # read in the file
249
+ @raw_data = @file.read
250
+
251
+ # compare it to the one we used last time
252
+ if @cache_file.readable?
253
+ return false if @raw_data == @cache_file.read
254
+ end
255
+
256
+ # split the data into an array by newlines
257
+ lines = @raw_data.split "\n"
258
+
259
+ # remove the first line if its a header, and parse it into the columns
260
+ # if needed
261
+ if @header
262
+ header = lines.shift
263
+ @columns ||= header.split(/\s*#{@delim}\s*/).map{|c| c.to_sym}
264
+ end
265
+
266
+ # check some state
267
+ raise "Columns must include 'name' and 'starting'" unless @columns.include?(:name) and @columns.include?(:starting)
268
+ raise "Columns must include either 'ending' or 'cidr'" unless @columns.include?(:ending) or @columns.include?(:cidr)
269
+
270
+ @use_cidr = @columns.include? :cidr
271
+
272
+
273
+ # which columns are which in the file?
274
+ name = @columns.index :name
275
+ starting = @columns.index :starting
276
+ ending = @use_cidr ? @columns.index(:cidr) : @columns.index(:ending)
277
+
278
+ # split each line and convert it into a hash
279
+ @parsed_data = lines.map do |line|
280
+
281
+ parts = line.split(@delim).map{|f| f.strip }
282
+
283
+ unless parts[name] and parts[starting] and parts[ending]
284
+ puts "Skipping invalid line: #{line}"
285
+ next
286
+ end
287
+
288
+
289
+ {:name => parts[name], :starting => parts[starting], :ending => parts[ending]}
290
+ end
291
+
292
+ # parsed data is now an array of hashes
293
+ return true
294
+ end
295
+
296
+ #############################################
297
+ #############################################
298
+ # Update the JSS Network Segments from GIT_NETBLOCKS_URL, q.v.
299
+ def update_network_segments
300
+
301
+ # CREATE any that are in the parsed data but not yet in the JSS,
302
+ # and UPDATE any that exist but have modified ranges.
303
+ # While looping through, make a hash of JSS::NetworkSegment objects, keyed by their name.
304
+ segs_from_data = {}
305
+
306
+ @parsed_data.each do |pd|
307
+
308
+ # skip anthing with the manual prefix
309
+ next if pd[:name].start_with? @manual_prefix
310
+
311
+ ender = @use_cidr ? :cidr : :ending_address
312
+
313
+ begin
314
+ this_seg = JSS::NetworkSegment.new(:id => :new, :name => pd[:name], :starting_address => pd[:starting], ender => pd[:ending])
315
+
316
+ # If the new netsegment should have other settings (dist. point, netboot server, etc...)
317
+ # here's where you should apply those settings.
318
+
319
+ this_seg.create
320
+ puts "Added Network Segment '#{this_seg.name}' to the JSS"
321
+
322
+ # it already exists, so see if it needs any changes
323
+ rescue JSS::AlreadyExistsError
324
+
325
+ # there's already one with this name, so just grab it.
326
+ this_seg = JSS::NetworkSegment.new( :name => pd[:name])
327
+
328
+ # does the startng addres need to be changed?
329
+ needs_update = this_seg.starting_address.to_s != pd[:starting].to_s
330
+
331
+ # even if we don't need to update the starting, we might need to update
332
+ # the ending...
333
+ unless needs_update
334
+ if @use_cidr
335
+ needs_update = this_seg.cidr.to_i != pd[:ending].to_i
336
+ else
337
+ needs_update = this_seg.ending_address.to_s != pd[:ending].to_s
338
+ end # if @use_cidr
339
+ end #unless needs update
340
+
341
+ # did we decide we need an update?
342
+ if needs_update
343
+ this_seg.starting_address = pd[:starting]
344
+ if @use_cidr
345
+ this_seg.cidr = pd[:ending].to_i
346
+ else
347
+ this_seg.ending_address = pd[:ending]
348
+ end # if @use_cidr
349
+ this_seg.update
350
+ puts "Updated IP range for Network Segment '#{this_seg.name}'"
351
+
352
+ else # doesn't need update
353
+ puts "Network Segment '#{this_seg.name}' doesn't have any changes."
354
+ end # if needs update
355
+
356
+ # rescue other errors
357
+ rescue
358
+ raise "There was an error with NetworkSegment #{pd[:name]}: #{$!}"
359
+ end # begin
360
+
361
+ segs_from_data[this_seg.name] = this_seg
362
+ end
363
+
364
+
365
+ # DELETE those in jss, but not in parsed data,
366
+ # unless the name starts with @manual_prefix
367
+ JSS::NetworkSegment.map_all_ids_to(:name).each do |id,name|
368
+
369
+ next if name.start_with? @manual_prefix
370
+
371
+ unless segs_from_data.keys.include? name
372
+ JSS::NetworkSegment.new(:id => id).delete
373
+ puts "Deleted Network Segment '#{name}' from the JSS"
374
+ end # unless
375
+
376
+ end # jss_uids.each seg
377
+
378
+ # save the data into a file for comparison next time
379
+ @cache_file.jss_save @raw_data
380
+
381
+ # all done
382
+ return true
383
+ end # update_network_segments
384
+
385
+ end # app
386
+
387
+ ##############################
388
+ # create the app and go
389
+ begin
390
+ app = App.new(ARGV)
391
+ app.run
392
+ rescue
393
+ # handle exceptions not handled elsewhere
394
+ puts "An error occurred: #{$!}"
395
+ puts "Backtrace:" if app.debug
396
+ puts $@ if app.debug
397
+
398
+ ensure
399
+
400
+ end
@@ -0,0 +1,2 @@
1
+ # backward compatility for 'require "jss-api"'
2
+ require 'jss'
@@ -0,0 +1,190 @@
1
+ ### Copyright 2016 Pixar
2
+ ###
3
+ ### Licensed under the Apache License, Version 2.0 (the "Apache License")
4
+ ### with the following modification; you may not use this file except in
5
+ ### compliance with the Apache License and the following modification to it:
6
+ ### Section 6. Trademarks. is deleted and replaced with:
7
+ ###
8
+ ### 6. Trademarks. This License does not grant permission to use the trade
9
+ ### names, trademarks, service marks, or product names of the Licensor
10
+ ### and its affiliates, except as required to comply with Section 4(c) of
11
+ ### the License and to reproduce the content of the NOTICE file.
12
+ ###
13
+ ### You may obtain a copy of the Apache License at
14
+ ###
15
+ ### http://www.apache.org/licenses/LICENSE-2.0
16
+ ###
17
+ ### Unless required by applicable law or agreed to in writing, software
18
+ ### distributed under the Apache License with the above modification is
19
+ ### distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
20
+ ### KIND, either express or implied. See the Apache License for the specific
21
+ ### language governing permissions and limitations under the Apache License.
22
+ ###
23
+ ###
24
+
25
+ ###
26
+ ### JSS, A Ruby module for interacting with the JAMF Software Server via it's REST API.
27
+ ###
28
+ module JSS
29
+
30
+ #####################################
31
+ ### Required Libraries, etc
32
+ #####################################
33
+
34
+ ###################
35
+ ### Standard Libraries
36
+ require 'date'
37
+ require 'singleton'
38
+ require 'pathname'
39
+ require 'fileutils'
40
+ require 'uri'
41
+ require "ipaddr"
42
+ require "rexml/document"
43
+ require "base64"
44
+ require "shellwords"
45
+ require "digest"
46
+ require 'yaml'
47
+
48
+ ###################
49
+ ### Gems
50
+ require 'rest-client'
51
+ require 'json'
52
+ require 'plist'
53
+
54
+
55
+
56
+ #####################################
57
+ ### Constants
58
+ #####################################
59
+
60
+ ### The minimum JSS version that works with this gem, as returned by the API
61
+ ### in the deprecated 'jssuser' resource
62
+ MINIMUM_SERVER_VERSION = "9.4"
63
+
64
+ ### The current local UTC offset as a fraction of a day (Time.now.utc_offset is the offset in seconds,
65
+ ### 60*60*24 is the seconds in a day)
66
+ TIME_ZONE_OFFSET = Rational(Time.now.utc_offset, 60*60*24)
67
+
68
+ ### These are handy for testing values without making new arrays, strings, etc every time.
69
+ TRUE_FALSE = [true, false]
70
+
71
+ ### When parsing a date/time data into a Time object, these will return nil
72
+ NIL_DATES = [0, nil, '', '0']
73
+
74
+
75
+ #####################################
76
+ ### Module Variables
77
+ #####################################
78
+
79
+ ### The contents of anything piped to stdin, split into lines. See {JSS.stdin}
80
+ @@stdin_lines = nil
81
+
82
+ #####################################
83
+ ### Module Methods
84
+ #####################################
85
+
86
+
87
+ ###
88
+ ### Define classes and submodules here so that they don't
89
+ ### generate errors when referenced during the loading of
90
+ ### the library.
91
+ ###
92
+
93
+ #####################################
94
+ ### Sub Modules
95
+ #####################################
96
+
97
+ module Composer ; end
98
+
99
+ ### Mix-in Sub Modules
100
+
101
+ module Creatable ; end
102
+ module FileUpload ; end
103
+ module Locatable ; end
104
+ module Matchable ; end
105
+ module Purchasable ; end
106
+ module Updatable ; end
107
+ module Extendable ; end
108
+
109
+ ### Mix-in Sub Modules with Classes
110
+
111
+ module Criteriable ; end
112
+ class Criteriable::Criteria ; end
113
+ class Criteriable::Criterion ; end
114
+
115
+ module Scopable ; end
116
+ class Scopable::Scope ; end
117
+
118
+ #####################################
119
+ ### Classes
120
+ #####################################
121
+
122
+ class APIObject ; end
123
+ class APIConnection ; end
124
+ class Client ; end
125
+ class DBConnection ; end
126
+ class Server ; end
127
+ class Preferences ; end
128
+
129
+ #####################################
130
+ ### SubClasses
131
+ #####################################
132
+
133
+ ### APIObject Classes with SubClasses
134
+
135
+ class AdvancedSearch < JSS::APIObject ; end
136
+ class AdvancedComputerSearch < JSS::AdvancedSearch ; end
137
+ class AdvancedMobileDeviceSearch < JSS::AdvancedSearch ; end
138
+ class AdvancedUserSearch < JSS::AdvancedSearch ; end
139
+
140
+
141
+ class ExtensionAttribute < JSS::APIObject ; end
142
+ class ComputerExtensionAttribute < JSS::ExtensionAttribute ; end
143
+ class MobileDeviceExtensionAttribute < JSS::ExtensionAttribute ; end
144
+ class UserExtensionAttribute < JSS::ExtensionAttribute ; end
145
+
146
+ class Group < JSS::APIObject ; end
147
+ class ComputerGroup < JSS::Group ; end
148
+ class MobileDeviceGroup < JSS::Group ; end
149
+ class UserGroup < JSS::Group ; end
150
+
151
+ ### APIObject Classes without SubClasses
152
+
153
+ class Building < JSS::APIObject ; end
154
+ class Category < JSS::APIObject ; end
155
+ class Computer < JSS::APIObject ; end
156
+ class Department < JSS::APIObject ; end
157
+ class DistributionPoint < JSS::APIObject ; end
158
+ class LDAPServer < JSS::APIObject ; end
159
+ class MobileDevice < JSS::APIObject ; end
160
+ class NetBootServer < JSS::APIObject ; end
161
+ class NetworkSegment < JSS::APIObject ; end
162
+ class Package < JSS::APIObject ; end
163
+ class PeripheralType < JSS::APIObject ; end
164
+ class Peripheral < JSS::APIObject ; end
165
+ class Policy < JSS::APIObject ; end
166
+ class RemovableMacAddress < JSS::APIObject ; end
167
+ class Script < JSS::APIObject ; end
168
+ class Site < JSS::APIObject ; end
169
+ class SoftwareUpdateServer < JSS::APIObject ; end
170
+ class User < JSS::APIObject ; end
171
+
172
+
173
+ end # module JSS
174
+
175
+
176
+ ##################
177
+ ### Load the rest of the module
178
+
179
+ require "jss/utility"
180
+ require "jss/composer"
181
+ require "jss/compatibility"
182
+ require "jss/ruby_extensions"
183
+ require "jss/exceptions"
184
+ require "jss/api_connection"
185
+ require "jss/api_object"
186
+ require "jss/server"
187
+ require "jss/client"
188
+ require "jss/configuration"
189
+ require "jss/db_connection"
190
+ require "jss/version"