ruby-amt 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (46) hide show
  1. data/AUTHORS +1 -0
  2. data/COPYING +15 -0
  3. data/ChangeLog +392 -0
  4. data/GPL +674 -0
  5. data/Rakefile +292 -0
  6. data/VERSION +1 -0
  7. data/doc/default.css +211 -0
  8. data/doc/default.template +78 -0
  9. data/doc/documentation.page +40 -0
  10. data/doc/img/bg.jpg +0 -0
  11. data/doc/img/image.jpg +0 -0
  12. data/doc/img/line.jpg +0 -0
  13. data/doc/img/shadow.jpg +0 -0
  14. data/doc/index.page +61 -0
  15. data/doc/installation.page +115 -0
  16. data/doc/news.page +25 -0
  17. data/doc/news/release_0_1_0.page +16 -0
  18. data/doc/virtual +2 -0
  19. data/lib/amt/pt_status.rb +59 -0
  20. data/lib/amt/service.rb +16 -0
  21. data/lib/amt/service/basic.rb +159 -0
  22. data/lib/amt/service/hardware_asset.rb +83 -0
  23. data/lib/amt/service/hardware_asset/amt_information_table.rb +49 -0
  24. data/lib/amt/service/hardware_asset/asset.rb +118 -0
  25. data/lib/amt/service/hardware_asset/baseboard.rb +31 -0
  26. data/lib/amt/service/hardware_asset/bios.rb +65 -0
  27. data/lib/amt/service/hardware_asset/computer_system.rb +30 -0
  28. data/lib/amt/service/hardware_asset/fru.rb +37 -0
  29. data/lib/amt/service/hardware_asset/media_device.rb +63 -0
  30. data/lib/amt/service/hardware_asset/memory_module.rb +91 -0
  31. data/lib/amt/service/hardware_asset/portable_battery.rb +80 -0
  32. data/lib/amt/service/hardware_asset/processor.rb +123 -0
  33. data/lib/amt/service/hardware_asset/vpro_verification_table.rb +120 -0
  34. data/lib/amt/service/network_administration.rb +181 -0
  35. data/lib/amt/service/network_administration/structures.rb +29 -0
  36. data/lib/amt/service/remote_control.rb +73 -0
  37. data/lib/amt/service/remote_control/structures.rb +120 -0
  38. data/lib/amt/service/security_administration.rb +430 -0
  39. data/lib/amt/service/security_administration/structures.rb +117 -0
  40. data/lib/amt/system.rb +134 -0
  41. data/lib/amt/utility.rb +33 -0
  42. data/lib/amt/utility/bit_struct.rb +164 -0
  43. data/lib/amt/utility/enum.rb +119 -0
  44. data/lib/amt/version.rb +8 -0
  45. data/setup.rb +1585 -0
  46. metadata +125 -0
@@ -0,0 +1,29 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ require 'amt/utility'
4
+ require 'amt/service/network_administration'
5
+
6
+ module AMT
7
+ module Service
8
+ class NetworkAdministration
9
+
10
+ # Struct class containing the response to the #get_vlan_parameters method.
11
+ VlanParameters = Struct.new(:enabled, :tag)
12
+
13
+ # The link policy of a network interface.
14
+ class LinkPolicy < AMT::Utility::BitStruct
15
+ boolean 0, :available_on_ac_s0, 'Link is available if ME is operational and power state is S0 while on AC power'
16
+ mboolean 0x0E, :available_on_ac_sx, 'Link is available if ME is operational and power state is Sx while on AC power'
17
+ boolean 4, :available_on_dc_s0, 'Link is available if ME is operational and power state is S0 while on DC power'
18
+ mboolean 0xE0, :available_on_dc_sx, 'Link is available if ME is operational and power state is Sx while on DC power'
19
+ end
20
+
21
+ # Struct class containing the response to the #get_interface_settings method.
22
+ InterfaceDescriptor = Struct.new(:hardware_description, :mac, :interface_mode, :link_policy, :dhcp_enabled, :ip_parameters)
23
+
24
+ # Struct class containing IP information of an AMT network interface.
25
+ IPParameters = Struct.new(:ip, :mask, :gateway, :primary_dns, :secondary_dns)
26
+
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,73 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ require 'amt/service/basic'
4
+
5
+ module AMT
6
+
7
+ module Service
8
+
9
+ # AMT service for getting information about the current power state of the system managed by the
10
+ # AMT device and for controlling its power and booting state.
11
+ class RemoteControl < Basic
12
+
13
+ require 'amt/service/remote_control/structures'
14
+
15
+ # Return the remote control capabilities supported by the device as instance of the
16
+ # RemoteControlCapabilities class.
17
+ #
18
+ # Supported by AMT 1.0 and later.
19
+ def get_remote_control_capabilities()
20
+ soap_call("GetRemoteControlCapabilities", 'Status').process do |node|
21
+ rcp = RemoteControlCapabilities.new
22
+ rcp.iana_oem_number = node.xpath('./ns:IanaOemNumber/text()').to_i
23
+ rcp.oem_defined_capabilities = OemDefinedCapabilities.new(node.xpath('./ns:OemDefinedCapabilities/text()').to_i)
24
+ rcp.special_commands_supported = SpecialCommandsSupported.new(node.xpath('./ns:SpecialCommandsSupported/text()').to_i)
25
+ rcp.system_capabilities_supported = SystemCapabilitiesSupported.new(node.xpath('./ns:SystemCapabilitiesSupported/text()').to_i)
26
+ rcp.system_firmware_capabilities = SystemFirmwareCapabilities.new(node.xpath('./ns:SystemFirmwareCapabilities/text()').to_i)
27
+ rcp
28
+ end
29
+ end
30
+
31
+
32
+ # Return the current power state of the device as instance of the SystePowerState class.
33
+ #
34
+ # Supported AMT 1.0 and later.
35
+ def get_system_power_state()
36
+ soap_call("GetSystemPowerState", 'Status').process do |node|
37
+ SystemPowerState.new(node.xpath('./ns:SystemPowerState/text()').to_i)
38
+ end
39
+ end
40
+
41
+
42
+ # Control the boot and power state of the device.
43
+ #
44
+ # [+command+] The command that should be executed (instance of RemoteControlCommand).
45
+ # [+iana_number+] The IANA-assigned Enterprise Number specifying the execution context.
46
+ # Default value of +343+ is Intel IANA, also possible is 4542 (ASF IANA).
47
+ # [+options+] A hash specifying optional control options. See more below.
48
+ #
49
+ # The +options+ hash can be used to these provide additional options:
50
+ #
51
+ # [<tt>:special_command</tt>] Define a modification of the boot behaviour (instance of
52
+ # SpecialCommand).
53
+ # [<tt>:special_command_parameter</tt>] Parameter for special command. Has to be an Integer.
54
+ # [<tt>:boot_options</tt>] Array of boot option names or an instance of BootOptions
55
+ # [<tt>:oem_parameters</tt>] Additional OEM parameters (instance of OemParameter).q
56
+ #
57
+ # Supported AMT 1.0 and later.
58
+ def remote_control(command, iana_number = 343, options = {})
59
+ soap_call("RemoteControl", 'Status') do |msg|
60
+ msg.add('ns:Command', RemoteControlCommand.for(command).value)
61
+ msg.add('ns:IanaOemNumber', iana_number)
62
+ msg.add('ns:SpecialCommand', SpecialCommand.for(options[:special_command]).value) if options.has_key?(:special_command)
63
+ msg.add('ns:SpecialCommandParameter', options[:special_command_parameter]) if options.has_key?(:special_command_parameter)
64
+ msg.add('ns:BootOptions', BootOptions.new(options[:boot_options]).value) if options.has_key?(:boot_options)
65
+ msg.add('ns:OemParameter', OemParameter.for(options[:oem_parameters])) if options.has_key?(:oem_parameter)
66
+ end.process
67
+ end
68
+
69
+ end
70
+
71
+ end
72
+
73
+ end
@@ -0,0 +1,120 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ require 'amt/utility'
4
+ require 'amt/service/remote_control'
5
+
6
+ module AMT
7
+ module Service
8
+ class RemoteControl
9
+
10
+ # Struct class containing the response to the #get_remote_control_capabilities method.
11
+ RemoteControlCapabilities = Struct.new(:iana_oem_number, :oem_defined_capabilities,
12
+ :special_commands_supported, :system_capabilities_supported,
13
+ :system_firmware_capabilities)
14
+
15
+ # Defines a set of bit flags that represent the proprietary boot options that the AMT device
16
+ # supports. This structure lists only the flags for AMT 2.0 and later.
17
+ class OemDefinedCapabilities < AMT::Utility::BitStruct
18
+ boolean 0, :ider, 'IDE Redirection supported'
19
+ boolean 1, :sol, 'Serial over LAN supported'
20
+ boolean 2, :bios_reflash, 'BIOS reflash supported'
21
+ boolean 3, :bios_setup, 'BIOS boot into setup screen supported'
22
+ boolean 4, :bios_pause, 'BIOS pause before booting operating system is supported'
23
+ end
24
+
25
+ # Defines a set of bit flags that represent the special commands that the AMT device supports.
26
+ # The corresponding commands used for the <tt>:special_command</tt> option in the
27
+ # RemoteControl#remote_control method are the keys of the SPECIAL_COMMAND hash.
28
+ class SpecialCommandsSupported < AMT::Utility::BitStruct
29
+ boolean 8, :pxe_boot, 'Force PXE Boot command supported'
30
+ boolean 9, :hard_drive_boot, 'Force Hard-drive Boot command supported'
31
+ boolean 10, :hard_drive_safe_mode_boot, 'Force Hard-drive Safe-mode Boot command supported'
32
+ boolean 11, :diagnostic_boot, 'Force Diagnostic Boot command supported'
33
+ boolean 12, :cd_boot, 'Force CD/DVD Boot command supported'
34
+ end
35
+
36
+ # Defines a set of bit flags that represent the remote control commands that the AMT device
37
+ # supports. These flags indicate what commands are supported for the +command+ parameter in
38
+ # the RemoteControl#remote_control method.
39
+ class SystemCapabilitiesSupported < AMT::Utility::BitStruct
40
+ boolean 0, :power_cycle, 'Power Cycle Reset supported'
41
+ boolean 1, :power_down, 'Power Down supported'
42
+ boolean 2, :power_up, 'Power Up supported'
43
+ boolean 3, :reset, 'Reset supported'
44
+ end
45
+
46
+ # Defines a set of bit flags that represent the standard firmware boot options that the AMT
47
+ # device supports. These flags indicate which flags are supported for the
48
+ # <tt>:boot_options</tt> option in the RemoteControl#remote_control method.
49
+ class SystemFirmwareCapabilities < AMT::Utility::BitStruct
50
+ boolean 0, :verbosity_screen_blank, 'Firmware Verbosity/Screen Blank supported'
51
+ boolean 1, :power_button_lock, 'Power Button Lock supported'
52
+ boolean 2, :reset_button_lock, 'Reset Button Lock supported'
53
+ boolean 5, :keyboard_lock, 'Lock Keyboard supported'
54
+ boolean 6, :sleep_button_lock, 'Sleep Button Lock supported'
55
+ boolean 11, :user_password_bypass, 'User Password Bypass supported'
56
+ boolean 12, :forced_progress_events, 'Forced Progress Events supported'
57
+ boolean 13, :verbosity_verbose, 'Firmware Verbosity Verbose supported'
58
+ boolean 14, :verbosity_quiet, 'Firmware Verbosity Quiet supported'
59
+ boolean 15, :configuration_data_reset, 'Configuration Data Reset supported'
60
+ end
61
+
62
+ # Contains power state information about the AMT-managed computer.
63
+ class SystemPowerState < AMT::Utility::BitStruct
64
+ enum 0..3, :power_state, {0 => :s0, 1 => :s1, 2 => :s2, 3 => :s3, 4 => :s4, 5 => :s5,
65
+ 6 => :s4s5, 7 => :g3, 8 => :sleeping, 9 => :g1_sleeping, 10 => :s5_override,
66
+ 11 => :legacy_on, 12 => :legacy_off, 14 => :unknown}, 'System power state'
67
+ boolean 8, :watchdog_expired, 'Watchdog Timer has expired'
68
+ enum 9..9, :power_source, {0 => :ac, 1 => :dc}, 'Power source'
69
+ end
70
+
71
+ # Available remote control commands. Used for RemoteControl#remote_control.
72
+ class RemoteControlCommand < AMT::Utility::Enum
73
+ add 0x10, :reset, 'Cause a low latency reset'
74
+ add 0x11, :power_up, 'Bring the system into S0/G0 state'
75
+ add 0x12, :power_down, 'Force the system into an S5 state'
76
+ add 0x13, :power_cycle, 'Cause a hard reset of the system'
77
+ add 0x21, :set_boot_options, 'Set boot options for the next boot'
78
+ end
79
+
80
+ # Available special commands. Used for RemoteControl#remote_control.
81
+ class SpecialCommand < AMT::Utility::Enum
82
+ add 0x00, :nop, 'No special command'
83
+ add 0x01, :pxe_boot, 'Special command parameter is used to specify a PXE parameter'
84
+ add 0x02, :hard_drive_boot, 'Special command parameter defines the boot-media index'
85
+ add 0x03, :hard_drive_safe_mode_boot, 'Special command parameter defines the boot-media index'
86
+ add 0x04, :diagnostic_boot, 'Special command parameter is used to specify a diagnostic parameter'
87
+ add 0x05, :cd_boot, 'Special command parameter defines the boot-media index'
88
+ add 0xC1, :intel_oem_command, 'Special command parameter defines the Intel boot options'
89
+ end
90
+
91
+ # Available special command parameters for SpecialCommand <tt>:intel_oem_command</tt>. Used
92
+ # for RemoteControl#remote_control.
93
+ class IntelSpecialCommandParameter < AMT::Utility::BitStruct
94
+ boolean 0, :use_ider, 'Use IDE redirection as boot device'
95
+ boolean 2, :reflash_bios, 'Reflash the BIOS using IDE redirection'
96
+ boolean 3, :bios_setup, 'Boot into BIOS setup screen'
97
+ boolean 4, :bios_pause, 'Boot till operating system load and pause'
98
+ enum 8..8, :ider_boot_device, {0 => :floppy, 1 => :cd}, 'Device to use on IDE redirection'
99
+ end
100
+
101
+ # Defines a set of bit flags that represent the boot options supported for RemoteControl#remote_control.
102
+ class BootOptions < AMT::Utility::BitStruct
103
+ boolean 1, :lock_power_button, 'Disable power button'
104
+ boolean 2, :lock_reset_button, 'Disable reset button'
105
+ boolean 5, :lock_keyboard, 'Disallow keyboard during boot'
106
+ boolean 6, :lock_sleep_button, 'Disable sleep button'
107
+ boolean 11, :user_password_bypass, 'Bypass any user or boot passwords'
108
+ boolean 12, :force_progress_events, 'Transmit all progress PET events to alert-sending device'
109
+ enum 13..14, :firmware_verbosity, {0 => :default, 1 => :quiet, 2 => :verbose, 3 => :blank}, 'Control the verbosity'
110
+ boolean 15, :configuration_data_reset, 'Reset configuration data'
111
+ end
112
+
113
+ # Available OEM parameters. Used for RemoteControl#remote_control.
114
+ class OemParameters < AMT::Utility::Enum
115
+ add 0x01, :use_sol, 'Use Serial over LAN redirection on next boot'
116
+ end
117
+
118
+ end
119
+ end
120
+ end
@@ -0,0 +1,430 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ require 'amt/service/basic'
4
+ require 'digest/md5'
5
+
6
+ module AMT
7
+
8
+ module Service
9
+
10
+ # AMT Service for managing security control and data structures.
11
+ #
12
+ # The following service methods are currently not implemented:
13
+ #
14
+ # * set_kerberos_options, get_kerberos_options, set_tls_psk, get_pki_capabilities
15
+ # * All methods specified unter 7.1.3 Certificate Management
16
+ # * All methods specified under 7.1.5 Environment Detection & VPN Connectivity
17
+ # * All methods specified under 7.1.6 User Notification
18
+ # * All methods specified under 7.1.7 Provisioning
19
+ class SecurityAdministration < Basic
20
+
21
+ require 'amt/service/security_administration/structures'
22
+
23
+ # Set the state of credential caching for Kerberos.
24
+ #
25
+ # [+enabled+] If set to +true+, then the credential cache will be enabled, else disabled.
26
+ #
27
+ # Supported by AMT 3.2 and later.
28
+ def set_credential_cache_state(enabled)
29
+ soap_call("SetCredentialCacheState") do |msg|
30
+ msg.add('ns:Enabled', enabled)
31
+ end.process
32
+ end
33
+
34
+
35
+ # Return whether the credential cache for Kerberos is enabled.
36
+ #
37
+ # Supported by AMT 3.2 and later.
38
+ def get_credential_cache_state
39
+ soap_call("GetCredentialCacheState").process do |node|
40
+ node.xpath('./ns:Enabled/text()').to_boolean
41
+ end
42
+ end
43
+
44
+
45
+ # Enable or disable various features or interfaces of the AMT device.
46
+ #
47
+ # [+interfaces+] An array of EnabledInterface instances that should be enabled. Interfaces
48
+ # that are not specified will be disabled.
49
+ #
50
+ # Supported by AMT 2.0 and later.
51
+ def set_enabled_interfaces(interfaces)
52
+ soap_call("SetEnabledInterfaces") do |msg|
53
+ interfaces.each do |iface|
54
+ raise ArgumentError, "interface name #{iface} is not valid" unless EnabledInterface.for(iface)
55
+ msg.add('ns:EnabledInterfaces', EnabledInterface.for(iface).value)
56
+ end
57
+ end.process
58
+ end
59
+
60
+
61
+ # Return the enabled interfaces of the AMT device as array of EnabledInterface instances.
62
+ # Interfaces that are not in the array are disabled.
63
+ #
64
+ # See #set_enabled_interfaces for a list of possible interface names.
65
+ #
66
+ # Supported by AMT 2.0 and later.
67
+ def get_enabled_interfaces
68
+ soap_call("GetEnabledInterfaces").process do |node|
69
+ node.xpath('./ns:EnabledInterfaces/text()').collect {|n| EnabledInterface.for(n.to_s)}
70
+ end
71
+ end
72
+
73
+
74
+ # Set various TLS modes such as enablement and authentication for network interfaces.
75
+ #
76
+ # [+tls_options+] A hash containing associations from Interface types to TlsAuthentication
77
+ # types. Interfaces that are not specified will operate in +NoAuth+ mode.
78
+ #
79
+ # *Note*: You also need to call #commit_changes for the changes to actually take effect.
80
+ #
81
+ # Supported by AMT 2.0 and later.
82
+ def set_tls_options(tls_options)
83
+ soap_call("SetTlsOptions") do |msg|
84
+ tls_options.each do |it, at|
85
+ raise ArgumentError, "interface type #{it} is not valid" unless Interface.for(it)
86
+ raise ArgumentError, "authentication type #{at} is not valid" unless TlsAuthentication.for(at)
87
+ msg.add('ns:TlsOptions') do |tmsg|
88
+ tmsg.add('ns:Interface', Interface.for(it).value)
89
+ tmsg.add('ns:TlsAuthentication', TlsAuthentication.for(at).value)
90
+ end
91
+ end
92
+ end.process
93
+ end
94
+
95
+
96
+ # Return the currently used authentication modes of TLS as a hash containing associations from
97
+ # Interface types to TlsAuthentication types. Interface types that are not returned should be
98
+ # treated as in +NoAuth+ mode.
99
+ #
100
+ # Supported by AMT 2.0 and later.
101
+ def get_tls_options
102
+ soap_call("GetTlsOptions").process do |node|
103
+ ifaces = {}
104
+ node.xpath('./ns:TlsOptions').each do |tnode|
105
+ ifaces[Interface.for(tnode.xpath('./ns:Interface/text()').to_s)] =
106
+ TlsAuthentication.for(tnode.xpath('./ns:TlsAuthentication/text()').to_s)
107
+ end
108
+ ifaces
109
+ end
110
+ end
111
+
112
+
113
+ # Commit the pending configuration commands.
114
+ #
115
+ # Commands that require calling this method have been documented. Also note that pending
116
+ # changes may cause a restart sequence of the AMT, so you need to wait a bit before issuing
117
+ # the next command.
118
+ #
119
+ # Supported by AMT 1.0 and later.
120
+ def commit_changes
121
+ soap_call("CommitChanges").process
122
+ end
123
+
124
+
125
+ # Reset the wear-out protection to the initial state for all protected flash sectors.
126
+ #
127
+ # Supported by AMT 1.0 and later.
128
+ def reset_flash_wear_out_protection
129
+ soap_call("ResetFlashWearOutProtection").process
130
+ end
131
+
132
+
133
+ # Return the core version of the AMT device as an instance of CoreVersion.
134
+ #
135
+ # Supported by AMT 1.0 and later.
136
+ def get_core_version
137
+ soap_call("GetCoreVersion").process do |node|
138
+ CoreVersion.new(*node.xpath('./ns:Version/text()').to_s.scan(/^(\d+)\.(\d+)\.(\d+)$/).first)
139
+ end
140
+ end
141
+
142
+
143
+ # Unprovision the AMT device to default factory settings.
144
+ #
145
+ # [+mode+] The provisioning mode the device should enter after completing the command
146
+ # (instance of ProvisioningMode).
147
+ #
148
+ # Supported by AMT 1.0 and later.
149
+ def unprovision(mode)
150
+ soap_call("Unprovision") do |msg|
151
+ msg.add('ns:ProvisioningMode', ProvisioningMode.for(mode).value)
152
+ end.process
153
+ end
154
+
155
+
156
+ # Put the AMT device into a partially-unprovisioned state.
157
+ #
158
+ # Supported by AMT 2.0 and later.
159
+ def partial_unprovision(mode)
160
+ soap_call("PartialUnprovision").process
161
+ end
162
+
163
+
164
+ # Return the current provisiong mode of the AMT device as Symbol (one of the PROVISIONING_MODE
165
+ # keys).
166
+ #
167
+ # Supported by AMT 1.0 and later.
168
+ def get_provisioning_mode
169
+ soap_call("GetProvisioningMode").process do |node|
170
+ ProvisioningMode.for(node.xpath('./ns:ProvisioningMode/text()').to_i)
171
+ end
172
+ end
173
+
174
+
175
+ # Return the components that blocked the last full or partial unprovisioning request as array
176
+ # of Symbols.
177
+ #
178
+ # Supported by AMT 4.0 and later.
179
+ def get_unprovisioning_blocking_components
180
+ soap_call("GetUnprovisioningBlockingComponents").process do |node|
181
+ (node.xpath('./ns:Components/text()').to_i & 1 == 1 ? [:audit_log] : [])
182
+ end
183
+ end
184
+
185
+
186
+ # Add a user entry to the AMT device and return the handle to it.
187
+ #
188
+ # [+entry+] An instance of UserAclEntryEx containing the information about the user that
189
+ # should be added.
190
+ #
191
+ # Supported by AMT 2.0 and later.
192
+ def add_user_acl_entry_ex(entry)
193
+ soap_call("AddUserAclEntryEx") do |msg|
194
+ msg.add('ns:EntryEx') {|msge| add_user_acl_entry_ex_to_message(entry, msge)}
195
+ end.process do |node|
196
+ node.xpath('./ns:Handle/text()').to_i
197
+ end
198
+ end
199
+
200
+ def add_user_acl_entry_ex_to_message(entry, msg)
201
+ if entry.user.kind_of?(String)
202
+ msg.add('ns:KerberosUser') {|krb| krb.add('ns:Sid', entry.user)}
203
+ else
204
+ msg.add('ns:DigestUser') {|digest| add_user_to_message(entry.user, digest)}
205
+ end
206
+ msg.add('ns:AccessPermission', AccessPermission.for(entry.access_permission).value)
207
+ msg.add('ns:Realms') do |realm|
208
+ entry.realms.each {|r| realm.add('ns:Realm', UserAclRealm.for(r).value)}
209
+ end
210
+ end
211
+ private :add_user_acl_entry_ex_to_message
212
+
213
+ def add_user_to_message(user, msg)
214
+ msg.add('ns:Username', user.username)
215
+ pwd = user.hashed_password
216
+ if pwd.nil?
217
+ raise ArgumentError, "No password and no hashed password set" if user.password.nil?
218
+ pwd = Digest::MD5.digest("#{user.username}:#{get_digest_realm}:#{user.password}")
219
+ end
220
+ msg.add('ns:DigestPassword', [pwd].pack('m*'))
221
+ end
222
+ private :add_user_to_message
223
+
224
+
225
+ # Enumerate the handles of User ACLs. An array is returned of which the first entry is the
226
+ # total number of handles available and the second one an array of returned handles.
227
+ #
228
+ # [+start_index+] The index indicating the first User ACL handle to be returned.
229
+ #
230
+ # *Note*: this method does not return all handles at once. See the official documentation for
231
+ # *more information.
232
+ #
233
+ # Supported by AMT 1.0 and later.
234
+ def enumerate_user_acl_entries(start_index = 1)
235
+ soap_call("EnumerateUserAclEntries") do |msg|
236
+ msg.add('ns:StartIndex', start_index)
237
+ end.process do |node|
238
+ tc = node.xpath('./ns:TotalCount/text()').to_i
239
+ handles = node.xpath('./ns:Handles/ns:Handle/text()').collect {|h| h.to_i}
240
+ [tc, handles]
241
+ end
242
+ end
243
+
244
+
245
+ # Return a user ACL entry from the AMT device as instance of UserAclEntryEx.
246
+ #
247
+ # [+handle+] Specifies the ACL entry to read.
248
+ #
249
+ # Supported by AMT 2.0 and later.
250
+ def get_user_acl_entry_ex(handle)
251
+ soap_call("GetUserAclEntryEx") do |msg|
252
+ msg.add('ns:Handle', handle)
253
+ end.process do |node|
254
+ node = node.xpath('./ns:EntryEx')
255
+ entry = UserAclEntryEx.new
256
+ if !(krb = node.xpath('./ns:KerberosUser/ns:Sid/text()')).empty?
257
+ entry.user = krb.to_s
258
+ else
259
+ entry.user = User.new(node.xpath('./ns:DigestUser/ns:Username/text()').to_s)
260
+ end
261
+ entry.access_permission = AccessPermission.for(node.xpath('./ns:AccessPermission/text()').to_s)
262
+ entry.realms = node.xpath('./ns:Realms/ns:Realm/text()').collect {|r| UserAclRealm.for(r.to_i)}
263
+ entry
264
+ end
265
+ end
266
+
267
+
268
+ # Update a user entry in the AMT device.
269
+ #
270
+ # [+handle+] Specifies the ACL entry to update.
271
+ # [+entry+] An instance of UserAclEntryEx containing the information about the
272
+ # user that should be updated.
273
+ #
274
+ # Supported by AMT 2.0 and later.
275
+ def update_user_acl_entry_ex(handle, entry)
276
+ soap_call("UpdateUserAclEntryEx") do |msg|
277
+ msg.add('ns:Handle', handle)
278
+ msg.add('ns:EntryEx') {|msge| add_user_acl_entry_ex_to_message(entry, msge)}
279
+ end.process
280
+ end
281
+
282
+
283
+ # Remove the user ACL entry identified by +handle+ from the AMT device.
284
+ #
285
+ # [+handle+] Specifies the ACL entry to remove.
286
+ #
287
+ # Supported by AMT 1.0 and later.
288
+ def remove_user_acl_entry(handle)
289
+ soap_call("RemoveUserAclEntry") do |msg|
290
+ msg.add('ns:Handle', handle)
291
+ end.process
292
+ end
293
+
294
+
295
+
296
+ # Update the Admin ACL entry in the AMT device.
297
+ #
298
+ # [+entry+] An instance of User.
299
+ #
300
+ # Supported by AMT 2.0 and later.
301
+ def set_admin_acl_entry_ex(entry)
302
+ soap_call("SetAdminAclEntryEx") do |msg|
303
+ msg.add('ns:EntryEx') {|ex| add_user_to_message(entry, ex)}
304
+ end.process
305
+ end
306
+
307
+
308
+ # Return the username of the Admin ACL entry.
309
+ #
310
+ # Supported by AMT 1.0 and later.
311
+ def get_admin_acl_entry
312
+ soap_call("GetAdminAclEntry").process do |node|
313
+ node.xpath('./ns:Username/text()').to_s
314
+ end
315
+ end
316
+
317
+
318
+ # Return the digest authentication realm of the AMT device (RFC 2617).
319
+ #
320
+ # Supported by AMT 2.0 and later.
321
+ def get_digest_realm
322
+ soap_call("GetDigestRealm").process do |node|
323
+ node.xpath('./ns:DigestRealm/text()').to_s
324
+ end
325
+ end
326
+
327
+
328
+ # Enable or disable an user ACL entry.
329
+ #
330
+ # [+handle+] Specifies the ACL entry that should be enabled or disabled.
331
+ # [+enabled+] If set to +true+, then the ACL entry will be enabled, else disabled.
332
+ #
333
+ # Supported by AMT 3.0 and later.
334
+ def set_acl_enabled_state(handle, enabled)
335
+ soap_call("SetAclEnabledState") do |msg|
336
+ msg.add('ns:Handle', handle)
337
+ msg.add('ns:Enabled', enabled)
338
+ end.process
339
+ end
340
+
341
+
342
+ # Return the enabled/disabled state of an user ACL entry as boolean value.
343
+ #
344
+ # [+handle+] Specifies the ACL entry for which the state should be returned.
345
+ #
346
+ # Supported by AMT 3.0 and later.
347
+ def get_acl_enabled_state(handle)
348
+ soap_call("GetAclEnabledState") do |msg|
349
+ msg.add('ns:Handle', handle)
350
+ end.process do |node|
351
+ node.xpath('./ns:Enabled/text()').to_boolean
352
+ end
353
+ end
354
+
355
+
356
+ # Return the guids for all power packages supported by the AMT device.
357
+ #
358
+ # Supported by AMT 2.5 and later.
359
+ def enumerate_power_packages
360
+ soap_call("EnumeratePowerPackages").process do |node|
361
+ node.xpath('./ns:PolicyGUID/text()').collect {|uuid| AMT::Utility.binary_to_uuid(uuid.to_s.unpack('m*').first)}
362
+ end
363
+ end
364
+
365
+
366
+ # Return the GUID of the currently active power package.
367
+ #
368
+ # Supported by AMT 2.5 and later.
369
+ def get_active_power_package
370
+ soap_call("GetActivePowerPackage").process do |node|
371
+ AMT::Utility.binary_to_uuid(node.xpath('./ns:PolicyGUID/text()').to_s.unpack('m*').first)
372
+ end
373
+ end
374
+
375
+
376
+ # Return the policy descriptor string associated with a power package.
377
+ #
378
+ # [+power_package+] A power package GUID string.
379
+ #
380
+ # Supported by AMT 2.5 and later.
381
+ def get_power_package(power_package)
382
+ soap_call("GetPowerPackage") do |msg|
383
+ msg.add('ns:PolicyGUID', [AMT::Utility.uuid_to_binary(power_package)].pack('m*'))
384
+ end.process do |node|
385
+ node.xpath('./ns:PolicyDescriptor/text()').to_s
386
+ end
387
+ end
388
+
389
+
390
+ # Set the active power package to the one defined by the power package GUID.
391
+ #
392
+ # [+power_package+] A power package GUID string.
393
+ #
394
+ # Supported by AMT 2.5 and later.
395
+ def set_active_power_package(power_package)
396
+ soap_call("SetActivePowerPackage") do |msg|
397
+ msg.add('ns:PolicyGUID', [AMT::Utility.uuid_to_binary(power_package)].pack('m*'))
398
+ end.process
399
+ end
400
+
401
+
402
+ # Set power policy options that apply independent of the selected power package.
403
+ #
404
+ # [+power_policy+] The power policy to use (instance of GlobalPowerPolicy).
405
+ #
406
+ # Supported by AMT 2.5 and later.
407
+ def set_global_power_policy(power_policy)
408
+ soap_call("SetGlobalPowerPolicy") do |msg|
409
+ msg.add('ns:GlobalPowerPolicy') do |gpp|
410
+ gpp.add('ns:IdleWakeTimeout', power_policy.idle_wake_timeout)
411
+ end
412
+ end.process
413
+ end
414
+
415
+
416
+ # Get current global power policy as instance of GlobalPowerPolicy.
417
+ #
418
+ # Supported by AMT 2.5 and later.
419
+ def get_global_power_policy
420
+ soap_call("GetGlobalPowerPolicy").process do |node|
421
+ GlobalPowerPolicy.new(node.xpath('./ns:GlobalPowerPolicy/ns:IdleWakeTimeout/text()').to_i)
422
+ end
423
+ end
424
+
425
+
426
+ end
427
+
428
+ end
429
+
430
+ end