ruby-jss 0.10.0 → 0.10.1a2
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.
- checksums.yaml +4 -4
- data/lib/jss/api_object.rb +102 -0
- data/lib/jss/api_object/advanced_search/advanced_computer_search.rb +4 -0
- data/lib/jss/api_object/advanced_search/advanced_mobile_device_search.rb +5 -0
- data/lib/jss/api_object/advanced_search/advanced_user_search.rb +5 -0
- data/lib/jss/api_object/building.rb +5 -0
- data/lib/jss/api_object/category.rb +5 -0
- data/lib/jss/api_object/computer.rb +7 -2
- data/lib/jss/api_object/computer_invitation.rb +5 -0
- data/lib/jss/api_object/department.rb +26 -21
- data/lib/jss/api_object/distribution_point.rb +5 -0
- data/lib/jss/api_object/ebook.rb +5 -0
- data/lib/jss/api_object/extendable.rb +123 -148
- data/lib/jss/api_object/extension_attribute.rb +242 -301
- data/lib/jss/api_object/extension_attribute/computer_extension_attribute.rb +5 -0
- data/lib/jss/api_object/extension_attribute/mobile_device_extension_attribute.rb +14 -9
- data/lib/jss/api_object/extension_attribute/user_extension_attribute.rb +40 -35
- data/lib/jss/api_object/group/computer_group.rb +11 -6
- data/lib/jss/api_object/group/mobile_device_group.rb +11 -6
- data/lib/jss/api_object/group/user_group.rb +16 -11
- data/lib/jss/api_object/ldap_server.rb +5 -0
- data/lib/jss/api_object/mac_application.rb +5 -0
- data/lib/jss/api_object/mobile_device.rb +5 -0
- data/lib/jss/api_object/mobile_device_application.rb +5 -0
- data/lib/jss/api_object/mobile_device_configuration_profile.rb +5 -0
- data/lib/jss/api_object/netboot_server.rb +11 -6
- data/lib/jss/api_object/network_segment.rb +5 -0
- data/lib/jss/api_object/osx_configuration_profile.rb +4 -0
- data/lib/jss/api_object/package.rb +5 -0
- data/lib/jss/api_object/peripheral.rb +4 -0
- data/lib/jss/api_object/peripheral_type.rb +11 -6
- data/lib/jss/api_object/policy.rb +5 -0
- data/lib/jss/api_object/removable_macaddr.rb +28 -23
- data/lib/jss/api_object/restricted_software.rb +5 -0
- data/lib/jss/api_object/script.rb +5 -0
- data/lib/jss/api_object/site.rb +29 -24
- data/lib/jss/api_object/software_update_server.rb +11 -6
- data/lib/jss/api_object/user.rb +5 -0
- data/lib/jss/api_object/webhook.rb +5 -0
- data/lib/jss/version.rb +1 -1
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cbc35fe360debd8ec27b382a0bacb3437a2a2bdd
|
4
|
+
data.tar.gz: '08e688dae6471d1075b582e544635dc0710f7b2c'
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b2875e1733f3c187248d4a0e17e6ca3fe795231d2391b7764f60d627c9f7fafe2a9c44d4b38e941633eab9cf604db8b7d36cb89ef4ce13af2c69976345405be5
|
7
|
+
data.tar.gz: 9e7d9a29bfe5c6e88ea1c79674d5dc8fa8588a5f6c5793fb733e9a30c1f3105bc5c98da4b16c3f457715dd7b31cfaf26db1fb662edb6357470a7e9e8c3ab4aba
|
data/lib/jss/api_object.rb
CHANGED
@@ -524,6 +524,11 @@ module JSS
|
|
524
524
|
name: { rsrc_key: :name, list: :all_names }
|
525
525
|
}.freeze
|
526
526
|
|
527
|
+
# This table holds the object history for JSS objects.
|
528
|
+
# Object history is not available via the API,
|
529
|
+
# only MySQL.
|
530
|
+
OBJECT_HISTORY_TABLE = 'object_history'.freeze
|
531
|
+
|
527
532
|
# Attributes
|
528
533
|
#####################################
|
529
534
|
|
@@ -726,10 +731,107 @@ module JSS
|
|
726
731
|
vars
|
727
732
|
end
|
728
733
|
|
734
|
+
# Make an entry in this object's Object History.
|
735
|
+
# For this to work, the APIObject subclass must define
|
736
|
+
# OBJECT_HISTORY_OBJECT_TYPE, an integer indicating the
|
737
|
+
# object type in the OBJECT_HISTORY_TABLE in the database
|
738
|
+
# (e.g. for computers, the object type is 1)
|
739
|
+
#
|
740
|
+
# NOTE: Object history is not available via the API,
|
741
|
+
# so access is only available through direct MySQL
|
742
|
+
# connections
|
743
|
+
#
|
744
|
+
# Also: the 'details' column in the table shows up in the
|
745
|
+
# 'notes' column of the Web UI. and the 'object_description'
|
746
|
+
# column of the table shows up in the 'details' column of
|
747
|
+
# the UI, under the 'details' button.
|
748
|
+
#
|
749
|
+
# The params below reflect the UI, not the table.
|
750
|
+
#
|
751
|
+
# @param user[String] the username creating the entry.
|
752
|
+
#
|
753
|
+
# @param notes[String] A string that appears as a 'note' in the history
|
754
|
+
#
|
755
|
+
# @param details[String] A string that appears as the 'details' in the history
|
756
|
+
#
|
757
|
+
# @return [void]
|
758
|
+
#
|
759
|
+
def add_object_history_entry(user: nil, notes: nil, details: nil)
|
760
|
+
validate_object_history_available
|
761
|
+
|
762
|
+
raise JSS::MissingDataError, 'A user: must be provided to make the entry' unless user
|
763
|
+
|
764
|
+
raise JSS::MissingDataError, 'Either notes: must be provided to make the entry' unless notes
|
765
|
+
|
766
|
+
user = "'#{Mysql.quote user.to_s}'"
|
767
|
+
notes = "'#{Mysql.quote notes.to_s}'"
|
768
|
+
obj_type = self.class::OBJECT_HISTORY_OBJECT_TYPE
|
769
|
+
|
770
|
+
field_list = 'object_type, object_id, username, details, timestamp_epoch'
|
771
|
+
value_list = "#{obj_type}, #{@id}, #{user}, #{notes}, #{Time.now.to_jss_epoch}"
|
772
|
+
|
773
|
+
if details
|
774
|
+
field_list << ', object_description'
|
775
|
+
value_list << ", '#{Mysql.quote details.to_s}'"
|
776
|
+
end # if details
|
777
|
+
|
778
|
+
q = "INSERT INTO #{OBJECT_HISTORY_TABLE}
|
779
|
+
(#{field_list})
|
780
|
+
VALUES
|
781
|
+
(#{value_list})"
|
782
|
+
|
783
|
+
JSS::DB_CNX.db.query q
|
784
|
+
end
|
785
|
+
|
786
|
+
# the object history for this object, an array of hashes
|
787
|
+
# one per history entry, in order of creation.
|
788
|
+
# Each hash contains:
|
789
|
+
# user: String, the username that created the entry
|
790
|
+
# notes: String, the notes for the entry
|
791
|
+
# date: Time, the timestamp for the entry
|
792
|
+
# details: String or nil, any details provided for the entry
|
793
|
+
#
|
794
|
+
# @return [Array<Hash>] the object history
|
795
|
+
#
|
796
|
+
def object_history
|
797
|
+
validate_object_history_available
|
798
|
+
|
799
|
+
q = "SELECT username, details, timestamp_epoch, object_description
|
800
|
+
FROM #{OBJECT_HISTORY_TABLE}
|
801
|
+
WHERE object_type = #{self.class::OBJECT_HISTORY_OBJECT_TYPE}
|
802
|
+
AND object_id = #{@id}
|
803
|
+
ORDER BY object_history_id ASC"
|
804
|
+
|
805
|
+
result = JSS::DB_CNX.db.query q
|
806
|
+
history = []
|
807
|
+
result.each do |entry|
|
808
|
+
history << {
|
809
|
+
user: entry[0],
|
810
|
+
notes: entry[1],
|
811
|
+
date: JSS.epoch_to_time(entry[2]),
|
812
|
+
details: entry[3]
|
813
|
+
}
|
814
|
+
end # each do entry
|
815
|
+
history
|
816
|
+
end
|
817
|
+
|
729
818
|
# Private Instance Methods
|
730
819
|
#####################################
|
731
820
|
private
|
732
821
|
|
822
|
+
# Raise an exception if object history is not
|
823
|
+
# available for this object
|
824
|
+
#
|
825
|
+
# @return [void]
|
826
|
+
#
|
827
|
+
def validate_object_history_available
|
828
|
+
raise JSS::NoSuchItemError, 'Object not yet created' unless @id && @in_jss
|
829
|
+
|
830
|
+
raise JSS::InvalidConnectionError, 'Not connected to MySQL' unless JSS::DB_CNX.connected?
|
831
|
+
|
832
|
+
raise JSS::UnsupportedError, "Object History access is not supported for #{self.class} objects at this time" unless defined? self.class::OBJECT_HISTORY_OBJECT_TYPE
|
833
|
+
end
|
834
|
+
|
733
835
|
# If we were passed pre-lookedup API data, validate it,
|
734
836
|
# raising exceptions if not valid.
|
735
837
|
#
|
@@ -75,6 +75,10 @@ module JSS
|
|
75
75
|
# for each computer?
|
76
76
|
RESULT_ID_FIELDS = [:id, :name, :udid].freeze
|
77
77
|
|
78
|
+
# the object type for this object in
|
79
|
+
# the object history table.
|
80
|
+
# See {APIObject#add_object_history_entry}
|
81
|
+
OBJECT_HISTORY_OBJECT_TYPE = 70
|
78
82
|
|
79
83
|
# Attributes
|
80
84
|
#####################################
|
@@ -69,6 +69,11 @@ module JSS
|
|
69
69
|
# for each mobiledevices?
|
70
70
|
RESULT_ID_FIELDS = [:id, :name, :udid].freeze
|
71
71
|
|
72
|
+
# the object type for this object in
|
73
|
+
# the object history table.
|
74
|
+
# See {APIObject#add_object_history_entry}
|
75
|
+
OBJECT_HISTORY_OBJECT_TYPE = 71
|
76
|
+
|
72
77
|
# Attributes
|
73
78
|
#####################################
|
74
79
|
|
@@ -69,6 +69,11 @@ module JSS
|
|
69
69
|
# for each user?
|
70
70
|
RESULT_ID_FIELDS = [:id, :name].freeze
|
71
71
|
|
72
|
+
# the object type for this object in
|
73
|
+
# the object history table.
|
74
|
+
# See {APIObject#add_object_history_entry}
|
75
|
+
OBJECT_HISTORY_OBJECT_TYPE = 55
|
76
|
+
|
72
77
|
# Attributes
|
73
78
|
#####################################
|
74
79
|
|
@@ -66,6 +66,11 @@ module JSS
|
|
66
66
|
# these keys, as well as :id and :name, are present in valid API JSON data for this class
|
67
67
|
VALID_DATA_KEYS = [].freeze
|
68
68
|
|
69
|
+
# the object type for this object in
|
70
|
+
# the object history table.
|
71
|
+
# See {APIObject#add_object_history_entry}
|
72
|
+
OBJECT_HISTORY_OBJECT_TYPE = 41
|
73
|
+
|
69
74
|
# Attributes
|
70
75
|
#####################################
|
71
76
|
|
@@ -85,6 +85,11 @@ module JSS
|
|
85
85
|
# The Default Priority
|
86
86
|
DEFAULT_PRIORITY = 5
|
87
87
|
|
88
|
+
# the object type for this object in
|
89
|
+
# the object history table.
|
90
|
+
# See {APIObject#add_object_history_entry}
|
91
|
+
OBJECT_HISTORY_OBJECT_TYPE = 72
|
92
|
+
|
88
93
|
# Attributes
|
89
94
|
#####################################
|
90
95
|
|
@@ -331,6 +331,12 @@ module JSS
|
|
331
331
|
|
332
332
|
POLICY_STATUS_PENDING = 'Pending'.freeze
|
333
333
|
|
334
|
+
# the object type for this object in
|
335
|
+
# the object history table.
|
336
|
+
# See {APIObject#add_object_history_entry}
|
337
|
+
OBJECT_HISTORY_OBJECT_TYPE = 1
|
338
|
+
|
339
|
+
|
334
340
|
# Class Methods
|
335
341
|
#####################################
|
336
342
|
|
@@ -808,8 +814,7 @@ module JSS
|
|
808
814
|
# @return [Hash, nil] The hardware[:storage] hash of the boot drive
|
809
815
|
#
|
810
816
|
def boot_drive
|
811
|
-
drives.
|
812
|
-
nil
|
817
|
+
drives.select { |d| d[:partition] && d[:partition][:type] == 'boot' }.first
|
813
818
|
end
|
814
819
|
|
815
820
|
# @return [Array<Hash>] each printer on this computer
|
@@ -83,6 +83,11 @@ module JSS
|
|
83
83
|
invitation: {rsrc_key: :invitation, list: :all_invitations}
|
84
84
|
}.freeze
|
85
85
|
|
86
|
+
# the object type for this object in
|
87
|
+
# the object history table.
|
88
|
+
# See {APIObject#add_object_history_entry}
|
89
|
+
OBJECT_HISTORY_OBJECT_TYPE = 84
|
90
|
+
|
86
91
|
# Attributes
|
87
92
|
#####################################
|
88
93
|
|
@@ -1,31 +1,31 @@
|
|
1
1
|
### Copyright 2017 Pixar
|
2
2
|
|
3
|
-
###
|
3
|
+
###
|
4
4
|
### Licensed under the Apache License, Version 2.0 (the "Apache License")
|
5
5
|
### with the following modification; you may not use this file except in
|
6
6
|
### compliance with the Apache License and the following modification to it:
|
7
7
|
### Section 6. Trademarks. is deleted and replaced with:
|
8
|
-
###
|
8
|
+
###
|
9
9
|
### 6. Trademarks. This License does not grant permission to use the trade
|
10
10
|
### names, trademarks, service marks, or product names of the Licensor
|
11
11
|
### and its affiliates, except as required to comply with Section 4(c) of
|
12
12
|
### the License and to reproduce the content of the NOTICE file.
|
13
|
-
###
|
13
|
+
###
|
14
14
|
### You may obtain a copy of the Apache License at
|
15
|
-
###
|
15
|
+
###
|
16
16
|
### http://www.apache.org/licenses/LICENSE-2.0
|
17
|
-
###
|
17
|
+
###
|
18
18
|
### Unless required by applicable law or agreed to in writing, software
|
19
19
|
### distributed under the Apache License with the above modification is
|
20
20
|
### distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
21
21
|
### KIND, either express or implied. See the Apache License for the specific
|
22
22
|
### language governing permissions and limitations under the Apache License.
|
23
|
-
###
|
23
|
+
###
|
24
24
|
###
|
25
25
|
|
26
26
|
###
|
27
27
|
module JSS
|
28
|
-
|
28
|
+
|
29
29
|
#####################################
|
30
30
|
### Module Variables
|
31
31
|
#####################################
|
@@ -33,25 +33,25 @@ module JSS
|
|
33
33
|
#####################################
|
34
34
|
### Module Methods
|
35
35
|
#####################################
|
36
|
-
|
36
|
+
|
37
37
|
#####################################
|
38
38
|
### Classes
|
39
39
|
#####################################
|
40
40
|
|
41
|
-
###
|
41
|
+
###
|
42
42
|
### A department in the JSS.
|
43
43
|
### These are simple, in that they only have an ID and a name
|
44
44
|
###
|
45
45
|
### @see JSS::APIObject
|
46
46
|
###
|
47
47
|
class Department < JSS::APIObject
|
48
|
-
|
48
|
+
|
49
49
|
#####################################
|
50
50
|
### Mix-Ins
|
51
51
|
#####################################
|
52
52
|
include JSS::Creatable
|
53
53
|
include JSS::Updatable
|
54
|
-
|
54
|
+
|
55
55
|
#####################################
|
56
56
|
### Class Methods
|
57
57
|
#####################################
|
@@ -59,28 +59,33 @@ module JSS
|
|
59
59
|
#####################################
|
60
60
|
### Class Constants
|
61
61
|
#####################################
|
62
|
-
|
62
|
+
|
63
63
|
### The base for REST resources of this class
|
64
64
|
RSRC_BASE = "departments"
|
65
|
-
|
65
|
+
|
66
66
|
### the hash key used for the JSON list output of all objects in the JSS
|
67
67
|
RSRC_LIST_KEY = :departments
|
68
|
-
|
68
|
+
|
69
69
|
### The hash key used for the JSON object output.
|
70
70
|
### It's also used in various error messages
|
71
71
|
RSRC_OBJECT_KEY = :department
|
72
|
-
|
72
|
+
|
73
73
|
### these keys, as well as :id and :name, are present in valid API JSON data for this class
|
74
74
|
VALID_DATA_KEYS = []
|
75
|
-
|
75
|
+
|
76
|
+
# the object type for this object in
|
77
|
+
# the object history table.
|
78
|
+
# See {APIObject#add_object_history_entry}
|
79
|
+
OBJECT_HISTORY_OBJECT_TYPE = 42
|
80
|
+
|
76
81
|
#####################################
|
77
82
|
### Attributes
|
78
83
|
#####################################
|
79
|
-
|
84
|
+
|
80
85
|
#####################################
|
81
|
-
### Constructor
|
86
|
+
### Constructor
|
82
87
|
#####################################
|
83
|
-
|
88
|
+
|
84
89
|
###
|
85
90
|
### See JSS::APIObject#initialize
|
86
91
|
###
|
@@ -88,7 +93,7 @@ module JSS
|
|
88
93
|
#####################################
|
89
94
|
### Public Instance Methods
|
90
95
|
#####################################
|
91
|
-
|
96
|
+
|
92
97
|
end # class department
|
93
|
-
|
98
|
+
|
94
99
|
end # module
|
@@ -85,6 +85,11 @@ module JSS
|
|
85
85
|
|
86
86
|
DEFAULT_MOUNTPOINT_PREFIX = "CasperDistribution-id"
|
87
87
|
|
88
|
+
# the object type for this object in
|
89
|
+
# the object history table.
|
90
|
+
# See {APIObject#add_object_history_entry}
|
91
|
+
OBJECT_HISTORY_OBJECT_TYPE = 76
|
92
|
+
|
88
93
|
### Class Methods
|
89
94
|
#####################################
|
90
95
|
|
data/lib/jss/api_object/ebook.rb
CHANGED
@@ -16,6 +16,11 @@ module JSS
|
|
16
16
|
### It's also used in various error messages
|
17
17
|
RSRC_OBJECT_KEY = :ebook
|
18
18
|
|
19
|
+
# the object type for this object in
|
20
|
+
# the object history table.
|
21
|
+
# See {APIObject#add_object_history_entry}
|
22
|
+
OBJECT_HISTORY_OBJECT_TYPE = 24
|
23
|
+
|
19
24
|
end
|
20
25
|
|
21
26
|
end
|
@@ -1,119 +1,97 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
1
|
+
# Copyright 2017 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
27
|
module JSS
|
28
28
|
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
### For Example, {JSS::Computer} sets this:
|
62
|
-
### EXT_ATTRIB_CLASS = JSS::ComputerExtensionAttribute
|
63
|
-
###
|
64
|
-
###
|
65
|
-
### Parsing also populates @ext_attrs which is a Hash of name => value for each EA.
|
66
|
-
###
|
67
|
-
### When updating or creating, those classes must add the REXML output of {#ext_attr_xml} to their
|
68
|
-
### rest_xml output.
|
69
|
-
###
|
29
|
+
# Sub-Modules
|
30
|
+
###################################
|
31
|
+
|
32
|
+
# A mix-in module for handling extension attribute data for objects in the JSS.
|
33
|
+
#
|
34
|
+
# This module provides standardized ways to deal with Extension Attribute data
|
35
|
+
# in objects that gather that data ({JSS::Computer}s, {JSS::MobileDevice}s,
|
36
|
+
# and {JSS::User}s). For working with the Extension Attributes themselves, see
|
37
|
+
# {JSS::ExtensionAttribute} and its subclasses.
|
38
|
+
#
|
39
|
+
# API objects that have Extension Attribute data return it in an Array of Hashes,
|
40
|
+
# one for each defined ExtensionAttribute for the class;
|
41
|
+
# i.e. a {JSS::Computer}'s Array has one Hash for each {JSS::ComputerExtensionAttribute}
|
42
|
+
# defined in the JSS.
|
43
|
+
#
|
44
|
+
# The Hash keys are:
|
45
|
+
# * :id => the ExtAttr id
|
46
|
+
# * :name => the ExtAttr name
|
47
|
+
# * :type => the data type of the ExtAttr value
|
48
|
+
# * :value => the value for the ExtAttr for this object as of the last report.
|
49
|
+
#
|
50
|
+
# Classes including this module must define the constant EXT_ATTRIB_CLASS
|
51
|
+
# specifying which {JSS::ExtensionAttribute} subclass defines the relevant extension attributes.
|
52
|
+
# For Example, {JSS::Computer} sets this:
|
53
|
+
# EXT_ATTRIB_CLASS = JSS::ComputerExtensionAttribute
|
54
|
+
#
|
55
|
+
#
|
56
|
+
# Parsing also populates @ext_attrs which is a Hash of name => value for each EA.
|
57
|
+
#
|
58
|
+
# When updating or creating, those classes must add the REXML output of {#ext_attr_xml} to their
|
59
|
+
# rest_xml output.
|
60
|
+
#
|
70
61
|
module Extendable
|
71
62
|
|
72
|
-
|
73
|
-
|
74
|
-
#####################################
|
63
|
+
# Constants
|
64
|
+
###################################
|
75
65
|
|
76
|
-
###
|
77
66
|
EXTENDABLE = true
|
78
67
|
|
68
|
+
# ExtensionAttributes refer to the numeric data type as "Integer"
|
69
|
+
# but the ext. attr values that come with extendable objects refer to
|
70
|
+
# that data type as "Number". Here's an array with both, so we can
|
71
|
+
# work with ether more easily.
|
72
|
+
NUMERIC_TYPES = %w[Number Integer].freeze
|
79
73
|
|
80
|
-
|
81
|
-
|
82
|
-
### that data type as "Number". Here's an array with both, so we can
|
83
|
-
### work with ether more easily.
|
84
|
-
NUMERIC_TYPES = ["Number", "Integer"]
|
74
|
+
# Attribtues
|
75
|
+
###################################
|
85
76
|
|
86
|
-
|
87
|
-
### Variables
|
88
|
-
#####################################
|
89
|
-
|
90
|
-
#####################################
|
91
|
-
### Attribtues
|
92
|
-
#####################################
|
93
|
-
|
94
|
-
### @return [Array<Hash>] The extension attribute values for the object
|
77
|
+
# @return [Array<Hash>] The extension attribute values for the object
|
95
78
|
attr_reader :extension_attributes
|
96
79
|
|
97
|
-
|
80
|
+
# @return [Hash] A mapping of Ext Attrib names to their values
|
98
81
|
attr_reader :ext_attrs
|
99
82
|
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
### Classes including this module should call this in #initialize
|
112
|
-
###
|
113
|
-
### @return [void]
|
114
|
-
###
|
83
|
+
# Mixed-in Instance Methods
|
84
|
+
###################################
|
85
|
+
|
86
|
+
# Populate @extension_attributes (the Array of Hashes that comes from the API)
|
87
|
+
# and @ext_attr_names, which is a Hash mapping the EA names to their
|
88
|
+
# index in the @extension_attributes Array.
|
89
|
+
#
|
90
|
+
# Classes including this module should call this in #initialize
|
91
|
+
#
|
92
|
+
# @return [void]
|
93
|
+
#
|
115
94
|
def parse_ext_attrs
|
116
|
-
|
117
95
|
unless @init_data[:extension_attributes]
|
118
96
|
@extension_attributes = []
|
119
97
|
@ext_attrs = {}
|
@@ -126,83 +104,79 @@ module JSS
|
|
126
104
|
@extension_attributes.each do |ea|
|
127
105
|
case ea[:type]
|
128
106
|
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
107
|
+
when 'Date'
|
108
|
+
begin # if there's random non-date data, the parse will fail
|
109
|
+
ea[:value] = JSS.parse_datetime ea[:value]
|
110
|
+
rescue
|
111
|
+
end
|
134
112
|
|
135
|
-
|
136
|
-
|
113
|
+
when *NUMERIC_TYPES
|
114
|
+
ea[:value] = ea[:value].to_i unless ea[:value].to_s.empty?
|
137
115
|
end # case
|
138
116
|
|
139
117
|
@ext_attrs[ea[:name]] = ea[:value]
|
140
|
-
|
141
118
|
end # each do ea
|
142
119
|
|
143
120
|
# remember changes as they happen so
|
144
121
|
# we only send changes back to the server.
|
145
122
|
@changed_eas = []
|
146
|
-
|
147
123
|
end
|
148
124
|
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
125
|
+
# Set the value of an extension attribute
|
126
|
+
#
|
127
|
+
# If the extension attribute is defined as a popup menu, the value must be one of the
|
128
|
+
# defined popup choices, or an empty string
|
129
|
+
#
|
130
|
+
# If the ext. attrib. is defined with a data type of Integer, the value must be an Integer.
|
131
|
+
#
|
132
|
+
# If the ext. attrib. is defined with a data type of Date, the value will be converted to a Time
|
133
|
+
#
|
134
|
+
# Note that while the Jamf Pro Web interface does not allow editing the values of
|
135
|
+
# Extension Attributes populated by Scripts or LDAP, the API does allow it.
|
136
|
+
# Bear in mind however that those values will be reset again at the next recon.
|
137
|
+
#
|
138
|
+
# @param name[String] the name of the extension attribute to set
|
139
|
+
#
|
140
|
+
# @param value[String,Time,Time,Integer] the new value for the extension attribute for this user
|
141
|
+
#
|
142
|
+
# @return [void]
|
143
|
+
#
|
165
144
|
def set_ext_attr(name, value)
|
166
|
-
|
167
145
|
# if we don't currently have any need to update(cuz we have recently), reset the list of changes to push
|
168
146
|
@changed_eas = [] unless @need_to_update
|
169
147
|
|
170
148
|
# this will raise an exception if the name doesn't exist
|
171
|
-
ea_def = self.class::EXT_ATTRIB_CLASS.new :
|
149
|
+
ea_def = self.class::EXT_ATTRIB_CLASS.new name: name
|
172
150
|
|
173
|
-
|
174
|
-
raise JSS::UnsupportedError, "The value for #{name} cannot be modified. It is gathered during inventory updates."
|
175
|
-
end
|
176
|
-
|
177
|
-
if ea_def.input_type == "Pop-up Menu" and (not ea_def.popup_choices.include? value.to_s)
|
151
|
+
if ea_def.input_type == 'Pop-up Menu' && (!ea_def.popup_choices.include? value.to_s)
|
178
152
|
raise JSS::UnsupportedError, "The value for #{name} must be one of: '#{ea_def.popup_choices.join("' '")}'"
|
179
153
|
end
|
180
154
|
|
181
|
-
|
182
|
-
|
183
|
-
|
155
|
+
unless value == JSS::BLANK
|
156
|
+
case ea_def.data_type
|
157
|
+
when 'Date'
|
184
158
|
value = JSS.parse_datetime value
|
185
159
|
|
186
160
|
when *NUMERIC_TYPES
|
187
|
-
raise
|
161
|
+
raise JSS::InvalidDataError, "The value for #{name} must be an integer" unless value.is_a? Integer
|
188
162
|
|
189
|
-
|
163
|
+
end # case
|
164
|
+
end # unless blank
|
190
165
|
|
191
166
|
@extension_attributes.each do |ea|
|
192
167
|
ea[:value] = value if ea[:name] == name
|
193
168
|
end
|
169
|
+
|
194
170
|
@ext_attrs[name] = value
|
195
171
|
@changed_eas << name
|
196
172
|
@need_to_update = true
|
197
|
-
|
198
173
|
end
|
199
174
|
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
###
|
175
|
+
# @api private
|
176
|
+
#
|
177
|
+
# @return [REXML::Element] An <extension_attribute> element to be
|
178
|
+
# included in the rest_xml of objects that mix-in this module.
|
179
|
+
#
|
206
180
|
def ext_attr_xml
|
207
181
|
@changed_eas ||= []
|
208
182
|
eaxml = REXML::Element.new('extension_attributes')
|
@@ -211,7 +185,7 @@ module JSS
|
|
211
185
|
ea_el = eaxml.add_element('extension_attribute')
|
212
186
|
ea_el.add_element('name').text = ea[:name]
|
213
187
|
|
214
|
-
if ea[:type] ==
|
188
|
+
if ea[:type] == 'Date'
|
215
189
|
begin
|
216
190
|
ea_el.add_element('value').text = ea[:value].to_jss_date
|
217
191
|
rescue
|
@@ -222,8 +196,9 @@ module JSS
|
|
222
196
|
end # if
|
223
197
|
end # each do ea
|
224
198
|
|
225
|
-
|
199
|
+
eaxml
|
226
200
|
end
|
227
201
|
|
228
202
|
end # module Purchasable
|
203
|
+
|
229
204
|
end # module JSS
|