ruby-jss 0.6.3

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.

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,148 @@
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
+ module JSS
27
+
28
+ #####################################
29
+ ### Module Variables
30
+ #####################################
31
+
32
+ #####################################
33
+ ### Module Methods
34
+ #####################################
35
+
36
+ #####################################
37
+ ### Classes
38
+ #####################################
39
+
40
+ ###
41
+ ### A NetBoot Server in the JSS
42
+ ###
43
+ ###
44
+ ### Only minimally implemented, mostly for access to the APIObject list methods
45
+ ###
46
+ ### @see JSS::APIObject
47
+ ###
48
+ class NetBootServer < JSS::APIObject
49
+
50
+ #####################################
51
+ ### Mix-Ins
52
+ #####################################
53
+
54
+ #####################################
55
+ ### Class Methods
56
+ #####################################
57
+
58
+ #####################################
59
+ ### Class Constants
60
+ #####################################
61
+
62
+ ### The base for REST resources of this class
63
+ RSRC_BASE = "netbootservers"
64
+
65
+ ### the hash key used for the JSON list output of all objects in the JSS
66
+ RSRC_LIST_KEY = :netboot_servers
67
+
68
+ ### The hash key used for the JSON object output.
69
+ ### It's also used in various error messages
70
+ RSRC_OBJECT_KEY = :netboot_server
71
+
72
+ ### these keys, as well as :id and :name, are present in valid API JSON data for this class
73
+ VALID_DATA_KEYS = [:protocol, :boot_args]
74
+
75
+ #####################################
76
+ ### Attributes
77
+ #####################################
78
+
79
+ ### @return [String] the nvram/bless args
80
+ attr_reader :boot_args
81
+
82
+ ### @return [String] the nvram/bless args
83
+ attr_reader :boot_device
84
+
85
+ ### @return [String] the nvram/bless args
86
+ attr_reader :boot_file
87
+
88
+ ### @return [Boolean]
89
+ attr_reader :configure_manually
90
+
91
+ ### @return [boolean] is this one default?
92
+ attr_reader :default_image
93
+
94
+ ### @return [String] the actual dmg name , eg "NetBoot.dmg"
95
+ attr_reader :image
96
+
97
+ ### @return [String] the server's IP address
98
+ attr_reader :ip_address
99
+
100
+ ### @return [String] "nfs" or "http"
101
+ attr_reader :protocol
102
+
103
+ ### @return [String] the nbi folder "MetroNB-test-10.9.3-1063.nbi"
104
+ attr_reader :set
105
+
106
+ ### @return [String] the tftp/protocol sharepoint name, usually "NetBootSP0"
107
+ attr_reader :share_point
108
+
109
+ ### @return [Boolean]
110
+ attr_reader :specific_image
111
+
112
+ ### @return [String] e.g."Intel/x86"
113
+ attr_reader :target_platform
114
+
115
+
116
+ #####################################
117
+ ### Constructor
118
+ #####################################
119
+
120
+ ###
121
+ ### See JSS::APIObject#initialize
122
+ ###
123
+
124
+ def initialize (args = {})
125
+ super
126
+ @boot_args = @init_data[:boot_args]
127
+ @boot_device = @init_data[:boot_device]
128
+ @boot_file = @init_data[:boot_file]
129
+ @configure_manually = @init_data[:configure_manually]
130
+ @default_image = @init_data[:default_image]
131
+ @image = @init_data[:image]
132
+ @ip_address = @init_data[:ip_address]
133
+ @protocol = @init_data[:protocol]
134
+ @set = @init_data[:set]
135
+ @share_point = @init_data[:share_point]
136
+ @specific_image = @init_data[:specific_image]
137
+ @target_platform = @init_data[:target_platform]
138
+
139
+ end
140
+
141
+ #####################################
142
+ ### Public Instance Methods
143
+ #####################################
144
+
145
+
146
+ end # class NetbootServer
147
+
148
+ end # module
@@ -0,0 +1,414 @@
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
+ module JSS
27
+
28
+ #####################################
29
+ ### Module Variables
30
+ #####################################
31
+
32
+ #####################################
33
+ ### Module Methods
34
+ #####################################
35
+
36
+ #####################################
37
+ ### Classes
38
+ #####################################
39
+
40
+ ###
41
+ ### A Network Segment in the JSS
42
+ ###
43
+ ### @see JSS::APIObject
44
+ ###
45
+ class NetworkSegment < JSS::APIObject
46
+
47
+ #####################################
48
+ ### Mix Ins
49
+ #####################################
50
+ include JSS::Creatable
51
+ include JSS::Updatable
52
+ include Comparable
53
+
54
+ #####################################
55
+ ### Class Constants
56
+ #####################################
57
+
58
+ ### the REST resource base
59
+ RSRC_BASE = "networksegments"
60
+
61
+ ### the hash key used for the JSON list output of all objects in the JSS
62
+ RSRC_LIST_KEY = :network_segments
63
+
64
+ ### The hash key used for the JSON object output.
65
+ ### It's also used in various error messages
66
+ RSRC_OBJECT_KEY = :network_segment
67
+
68
+ ### these keys, as well as :id and :name, are present in valid API JSON data for this class
69
+ VALID_DATA_KEYS = [:distribution_point, :starting_address, :override_departments ]
70
+
71
+ #####################################
72
+ ### Class Variables
73
+ #####################################
74
+
75
+ @@network_ranges = nil
76
+
77
+ #####################################
78
+ ### Class Methods
79
+ #####################################
80
+
81
+ ###
82
+ ### All NetworkSegments in the jss as IPAddr objects representing the
83
+ ### subnet as a masked IPv4 address.
84
+ ###
85
+ ### Using the #include? and #to_range methods on those
86
+ ### objects is very useful.
87
+ ###
88
+ ### @return [Hash{Integer => IPAddr}] the network segments as masked IPv4 addresses
89
+ ###
90
+ def self.network_ranges(refresh = false)
91
+ @@network_ranges = nil if refresh
92
+ return @@network_ranges if @@network_ranges
93
+ @@network_ranges = {}
94
+ self.all.each{|ns| @@network_ranges[ns[:id]] = IPAddr.jss_masked_v4addr(ns[:starting_address], ns[:ending_address])}
95
+ @@network_ranges
96
+ end # def network_segments
97
+
98
+ ###
99
+ ### An alias for {NetworkSegment.network_ranges}
100
+ ###
101
+ def self.subnets(refresh = false); self.network_ranges refresh; end
102
+
103
+ ###
104
+ ### Find the ids of the network segments that contain a given IP address.
105
+ ###
106
+ ### Even tho IPAddr.include? will take a String or an IPAddr
107
+ ### I convert the ip to an IPAddr so that an exception will be raised if
108
+ ### the ip isn't a valid ip.
109
+ ###
110
+ ### @param ip[String, IPAddr] the IP address to locate
111
+ ###
112
+ ### @return [Array<Integer>] the ids of the NetworkSegments containing the given ip
113
+ ###
114
+ def self.network_segment_for_ip(ip)
115
+ ok_ip = IPAddr.new(ip)
116
+ matches = []
117
+ self.network_ranges.each{ |id, subnet| matches << id if subnet.include?(ok_ip) }
118
+ matches
119
+ end
120
+
121
+ ###
122
+ ### Find the current network segment ids for the machine running this code
123
+ ###
124
+ ### @return [Array<Integer>] the NetworkSegment ids for this machine right now.
125
+ ###
126
+ def self.my_network_segment
127
+ network_segment_for_ip JSS::Client.my_ip_address
128
+ end
129
+
130
+
131
+
132
+ #####################################
133
+ ### Attributes
134
+ #####################################
135
+
136
+
137
+ ### @return [IPAddr] starting IP adresss
138
+ attr_reader :starting_address
139
+
140
+ ### @return [IPAddr] ending IP adresss
141
+ attr_reader :ending_address
142
+
143
+ ### @return [Integer] the CIDR
144
+ attr_reader :cidr
145
+
146
+ ### @return [String] building for this segment. Must be one of the buildings in the JSS
147
+ attr_reader :building
148
+
149
+ ### @return [String] department for this segment. Must be one of the depts in the JSS
150
+ attr_reader :department
151
+
152
+ ### @return [String] the name of the distribution point to be used from this network segment
153
+ attr_reader :distribution_point
154
+
155
+ ### @return [String] the mount url for the distribution point
156
+ attr_reader :url
157
+
158
+ ### @return [String] the netboot server for this segment
159
+ attr_reader :netboot_server
160
+
161
+ ### @return [String] the swupdate server for this segment.
162
+ attr_reader :swu_server
163
+
164
+ ### @return [Boolean] should machines checking in from this segment update their dept
165
+ attr_reader :override_departments
166
+
167
+ ### @return [Boolean] should machines checking in from this segment update their building
168
+ attr_reader :override_buildings
169
+
170
+ ### @return [String] the unique identifier for this subnet, regardless of the JSS id
171
+ attr_reader :uid
172
+
173
+ ### @return [IPAddr] the IPAddr object representing this network segment, created from the uid
174
+ attr_reader :subnet
175
+
176
+ ###
177
+ ### @see APIObject#initialize
178
+ ###
179
+ def initialize(args = {} )
180
+
181
+ super args
182
+
183
+ if args[:id] == :new
184
+ raise MissingDataError, "Missing :starting_address." unless args[:starting_address]
185
+ raise MissingDataError, "Missing :ending_address or :cidr." unless args[:ending_address] or args[:cidr]
186
+ @init_data[:starting_address] = args[:starting_address]
187
+ @init_data[:ending_address] = args[:ending_address]
188
+ @init_data[:cidr] = args[:cidr].to_i
189
+ end
190
+
191
+ @building = @init_data[:building]
192
+ @department = @init_data[:department]
193
+ @distribution_point = @init_data[:distribution_point]
194
+ @netboot_server = @init_data[:netboot_server]
195
+ @override_buildings = @init_data[:override_buildings]
196
+ @override_departments = @init_data[:override_departments]
197
+ @starting_address = IPAddr.new @init_data[:starting_address]
198
+ @swu_server = @init_data[:swu_server]
199
+ @url = @init_data[:url]
200
+
201
+ ### by now, we must have either an ending address or a cidr
202
+ ### along with a starting address, so figure out the other one.
203
+ if @init_data[:ending_address]
204
+ @ending_address = IPAddr.new @init_data[:ending_address]
205
+ @cidr = IPAddr.jss_cidr_from_ends(@starting_address,@ending_address)
206
+ else
207
+ @cidr = @init_data[:cidr].to_i if @init_data[:cidr]
208
+ @ending_address = IPAddr.jss_ending_address(@starting_address, @cidr)
209
+ end # if args[:cidr]
210
+
211
+ ### we now have all our data, make our unique identifier, the startingaddr/cidr
212
+ @uid = "#{@starting_address}/#{@cidr}"
213
+
214
+ ### the IPAddr object for this whole net segment
215
+ @subnet = IPAddr.new @uid
216
+
217
+ end #init
218
+
219
+ ###
220
+ ### Thanks to Comparable, we can tell if we're equal or not.
221
+ ###
222
+ ### See Comparable#<=>
223
+ ###
224
+ ### @return [-1,0,1] ar we less than, equal or greater than the other?
225
+ ###
226
+ def <=> (other)
227
+ self.subnet <=> other.subnet
228
+ end
229
+
230
+ ###
231
+ ### Set the building
232
+ ###
233
+ ### @param newval[String, Integer] the new building by name or id, must be in the JSS
234
+ ###
235
+ ### @return [void]
236
+ ###
237
+ def building= (newval)
238
+ new = JSS::Building.all.select{|b| b[:id] == newval or b[:name] == newval }[0]
239
+ raise JSS::MissingDataError, "No building matching '#{newval}'" unless new
240
+ @building = new[:name]
241
+ @need_to_update = true
242
+ end
243
+
244
+ ###
245
+ ### set the override buildings option
246
+ ###
247
+ ### @param newval[Boolean] the new override buildings option
248
+ ###
249
+ ### @return [void]
250
+ ###
251
+ def override_buildings= (newval)
252
+ raise JSS::InvalidDataError, "New value must be boolean true or false" unless JSS::TRUE_FALSE.include? newval
253
+ @override_buildings = newval
254
+ @need_to_update = true
255
+ end
256
+
257
+ ###
258
+ ### set the department
259
+ ###
260
+ ### @param newval[String, Integer] the new dept by name or id, must be in the JSS
261
+ ###
262
+ ### @return [void]
263
+ ###
264
+ def department= (newval)
265
+ new = JSS::Department.all.select{|b| b[:id] == newval or b[:name] == newval }[0]
266
+ raise JSS::MissingDataError, "No department matching '#{newval}' in the JSS" unless new
267
+ @department = new[:name]
268
+ @need_to_update = true
269
+ end
270
+
271
+ ###
272
+ ### set the override depts option
273
+ ###
274
+ ### @param newval[Boolean] the new setting
275
+ ###
276
+ ### @return [void]
277
+ ###
278
+ ###
279
+ def override_departments= (newval)
280
+ raise JSS::InvalidDataError, "New value must be boolean true or false" unless JSS::TRUE_FALSE.include? newval
281
+ @override_departments = newval
282
+ @need_to_update = true
283
+ end
284
+
285
+ ###
286
+ ### set the distribution_point
287
+ ###
288
+ ### @param newval[String, Integer] the new dist. point by name or id, must be in the JSS
289
+ ###
290
+ ### @return [void]
291
+ ###
292
+ def distribution_point= (newval)
293
+ new = JSS::DistributionPoint.all.select{|b| b[:id] == newval or b[:name] == newval }[0]
294
+ raise JSS::MissingDataError, "No distribution_point matching '#{newval}' in the JSS" unless new
295
+ @distribution_point = new[:name]
296
+ @need_to_update = true
297
+ end
298
+
299
+ ###
300
+ ### set the netboot_server
301
+ ###
302
+ ### @param newval[String, Integer] the new netboot server by name or id, must be in the JSS
303
+ ###
304
+ ### @return [void]
305
+ ###
306
+ def netboot_server= (newval)
307
+ new = JSS::NetbootServer.all.select{|b| b[:id] == newval or b[:name] == newval }[0]
308
+ raise JSS::MissingDataError, "No netboot_server matching '#{newval}' in the JSS" unless new
309
+ @netboot_server = new[:name]
310
+ @need_to_update = true
311
+ end
312
+
313
+ ###
314
+ ### set the sw update server
315
+ ###
316
+ ### @param newval[String, Integer] the new server by name or id, must be in the JSS
317
+ ###
318
+ ### @return [void]
319
+ ###
320
+ def swu_server= (newval)
321
+ new = JSS::SoftwareUpdateServer.all.select{|b| b[:id] == newval or b[:name] == newval }[0]
322
+ raise JSS::MissingDataError, "No swu_server matching '#{newval}' in the JSS" unless new
323
+ @swu_server = new[:name]
324
+ @need_to_update = true
325
+ end
326
+
327
+ ###
328
+ ### set the starting address
329
+ ###
330
+ ### @param newval[String, IPAddr] the new starting address
331
+ ###
332
+ ### @return [void]
333
+ ###
334
+ def starting_address= (newval)
335
+ @starting_address = IPAddr.new newval # this will raise an error if the IP addr isn't valid
336
+ raise JSS::InvalidDataError, "New starting address #{@starting_address} is higher than ending address #{@ending_address}" if @starting_address > @ending_address
337
+ @cidr = IPAddr.jss_cidr_from_ends(@starting_address ,@ending_address)
338
+ @uid = "#{@starting_address}/#{@cidr}"
339
+ @subnet = IPAddr.new @uid
340
+ @need_to_update = true
341
+ end
342
+
343
+ ###
344
+ ### set the ending address
345
+ ###
346
+ ### @param newval[String, IPAddr] the new ending address
347
+ ###
348
+ ### @return [void]
349
+ ###
350
+ def ending_address= (newval)
351
+ @ending_address = IPAddr.new newval # this will raise an error if the IP addr isn't valid
352
+ raise JSS::InvalidDataError, "New ending address #{@ending_address} is lower than starting address #{@starting_address}" if @ending_address < @starting_address
353
+ @cidr = IPAddr.jss_cidr_from_ends(@starting_address,@ending_address)
354
+ @uid = "#{@starting_address}/#{@cidr}"
355
+ @subnet = IPAddr.new @uid
356
+ @need_to_update = true
357
+ end
358
+
359
+ ###
360
+ ### set the cidr
361
+ ###
362
+ ### @param newval[String, IPAddr] the new cidr
363
+ ###
364
+ ### @return [void]
365
+ ###
366
+ def cidr= (newval)
367
+ @cidr = newval
368
+ @ending_address = IPAddr.jss_ending_address(@starting_address, @cidr)
369
+ @uid = "#{@starting_address}/#{@cidr}"
370
+ @subnet = IPAddr.new @uid
371
+ @need_to_update = true
372
+ end
373
+
374
+ ###
375
+ ### is a given address in this network segment?
376
+ ###
377
+ ### @param some_addr[IPAddr,String] the IP address to check
378
+ ###
379
+ ### @return [Boolean]
380
+ ###
381
+ def include? (some_addr)
382
+ @subnet.include? IPAddr.new(some_addr)
383
+ end
384
+
385
+
386
+ ### aliases
387
+ alias identifier uid
388
+ alias range subnet
389
+
390
+ ######################
391
+ ### private methods
392
+ private
393
+
394
+ ###
395
+ ### the xml formated data for adding or updating this in the JSS
396
+ ###
397
+ def rest_xml
398
+ doc = REXML::Document.new APIConnection::XML_HEADER
399
+ ns = doc.add_element "network_segment"
400
+ ns.add_element('building').text = @building
401
+ ns.add_element('department').text = @department
402
+ ns.add_element('distribution_point').text = @distribution_point
403
+ ns.add_element('ending_address').text = @ending_address
404
+ ns.add_element('name').text = @name
405
+ ns.add_element('netboot_server').text = @netboot_server
406
+ ns.add_element('override_buildings').text = @override_buildings
407
+ ns.add_element('override_departments').text = @override_departments
408
+ ns.add_element('starting_address').text = @starting_address
409
+ ns.add_element('swu_server').text = @swu_server
410
+ return doc.to_s
411
+ end #rest_xml
412
+
413
+ end # class NetworkSegment
414
+ end # module