dhcpsapi 0.0.7 → 0.0.8

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: eab370b485c2d24997d56b50fac94077e398180c
4
- data.tar.gz: b353650fc66eff961b3830c7e889e45c505a6618
3
+ metadata.gz: 8aa52005e543e55ac0af399ce937ade44dbfe74a
4
+ data.tar.gz: acaade242dcd8c290c26c056a4933f71199d3e05
5
5
  SHA512:
6
- metadata.gz: 564ad7fc55c3e81878c45c6aa120a45dbc8c91fb1f1a269576b47eade09d9e1182b168575ad76d01e7dc72361e136e2b0d40f193a1d70807a89b1a127d83e7e1
7
- data.tar.gz: 3cf3391b10eabfb292d181d14e41ace4ca3498e9a3e4d8bb931a9a39aa68a520f9a3da1ad60f06cbefb9cbb42b35cb61c40a74d7a9604f6299c4ee2947427421
6
+ metadata.gz: ba5318e348a9936bc493bd711a73ccbcd8df4d7ef76fba6578dd4d0aaad7074d23e5a02b00cbef36ebf9252fa2ff9ceae534bcc329c58d4cb1c6a93788ddee48
7
+ data.tar.gz: 35894f52b25644e6a9b3795e8fafc17b84b56f175b8552f2f6dcb1c071899d22c9918585e8f149f2ceb151ee00ccc0d4a8cc28ad53f6657363c68307b9191702
data/lib/dhcpsapi.rb CHANGED
@@ -11,4 +11,5 @@ require 'dhcpsapi/option'
11
11
  require 'dhcpsapi/option_value'
12
12
  require 'dhcpsapi/reservation'
13
13
  require 'dhcpsapi/subnet'
14
+ require 'dhcpsapi/subnet_element'
14
15
  require 'dhcpsapi/server'
@@ -522,6 +522,11 @@ typedef struct _DHCP_OPTION_ARRAY {
522
522
  layout :reserved_ip_address, :uint32,
523
523
  :reserved_for_client, :pointer,
524
524
  :b_allowed_client_types, :uint8 # see ClientType
525
+
526
+ ruby_struct_attr :uint32_to_ip, :reserved_ip_address
527
+ def reserved_for_client_as_ruby_struct_attr
528
+ DHCP_CLIENT_UID.new(self[:reserved_for_client]).as_ruby_struct
529
+ end
525
530
  end
526
531
 
527
532
  =begin
@@ -547,6 +552,69 @@ typedef struct _DHCP_OPTION_ARRAY {
547
552
  class DHCP_SUBNET_ELEMENT_DATA_V4 < DHCPS_Struct
548
553
  layout :element_type, :uint32,
549
554
  :element, DHCP_SUBNET_ELEMENT
555
+
556
+ def self.build_for_reservation(reservation_ip, reservation_mac, client_type = DhcpsApi::ClientType::CLIENT_TYPE_DHCP)
557
+ subnet_element = DhcpsApi::DHCP_SUBNET_ELEMENT_DATA_V4.new
558
+ subnet_element[:element_type] = DhcpsApi::DHCP_SUBNET_ELEMENT_TYPE::DhcpReservedIps
559
+ subnet_element[:element][:reserved_ip] = (reserved_ip = DhcpsApi::DHCP_IP_RESERVATION_V4.new).pointer
560
+
561
+ reserved_ip[:reserved_ip_address] = reserved_ip.ip_to_uint32(reservation_ip)
562
+ reserved_ip[:reserved_for_client] = DhcpsApi::DHCP_CLIENT_UID.from_mac_address(reservation_mac).pointer
563
+ reserved_ip[:b_allowed_client_types] = client_type
564
+
565
+ subnet_element
566
+ end
567
+
568
+ def self.build_for_subnet_range(start_ip_address, end_ip_address)
569
+ subnet_element = DhcpsApi::DHCP_SUBNET_ELEMENT_DATA_V4.new
570
+ subnet_element[:element_type] = DhcpsApi::DHCP_SUBNET_ELEMENT_TYPE::DhcpIpRanges
571
+ subnet_element[:element][:ip_range] = (ip_range = DhcpsApi::DHCP_IP_RANGE.new).pointer
572
+ ip_range[:start_address] = ip_range.ip_to_uint32(start_ip_address)
573
+ ip_range[:end_address] = ip_range.ip_to_uint32(end_ip_address)
574
+
575
+ subnet_element
576
+ end
577
+
578
+ def element_as_ruby_struct_attr
579
+ case self[:element_type]
580
+ when DHCP_SUBNET_ELEMENT_TYPE::DhcpIpRanges
581
+ DHCP_IP_RANGE.new(self[:element][:ip_range]).as_ruby_struct
582
+ when DHCP_SUBNET_ELEMENT_TYPE::DhcpSecondaryHosts
583
+ DHCP_HOST_INFO.new(self[:element][:secondary_host]).as_ruby_struct
584
+ when DHCP_SUBNET_ELEMENT_TYPE::DhcpReservedIps
585
+ DHCP_IP_RESERVATION_V4.new(self[:element][:reserved_ip]).as_ruby_struct
586
+ when DHCP_SUBNET_ELEMENT_TYPE::DhcpExcludedIpRanges
587
+ DHCP_IP_RANGE.new(self[:element][:exclude_ip_range]).as_ruby_struct
588
+ else
589
+ self[:element]
590
+ end
591
+ end
592
+ end
593
+
594
+ =begin
595
+ typedef struct _DHCP_SUBNET_ELEMENT_INFO_ARRAY_V4 {
596
+ DWORD NumElements;
597
+ LPDHCP_SUBNET_ELEMENT_DATA_V4 Elements;
598
+ } DHCP_SUBNET_ELEMENT_INFO_ARRAY_V4, *LPDHCP_SUBNET_ELEMENT_INFO_ARRAY_V4;
599
+ =end
600
+ #
601
+ # DHCP_SUBNET_ELEMENT_INFO_ARRAY_V4 defines a list of DHCP subnet elements.
602
+ #
603
+ # Available fields:
604
+ # :bum_elements [Fixnum], The number of option values in the list
605
+ # :values [Array<DHCP_SUBNET_ELEMENT_DATA_V4>], Array of subnet elements
606
+ #
607
+ # @see https://msdn.microsoft.com/en-us/library/windows/desktop/ee460931(v=vs.85).aspx
608
+ #
609
+ class DHCP_SUBNET_ELEMENT_INFO_ARRAY_V4 < DHCPS_Struct
610
+ layout :num_elements, :uint32,
611
+ :values, :pointer
612
+
613
+ def as_ruby_struct
614
+ 0.upto(self[:num_elements]-1).inject([]) do |all, offset|
615
+ all << DhcpsApi::DHCP_SUBNET_ELEMENT_DATA_V4.new(self[:values] + offset*DHCP_SUBNET_ELEMENT_DATA_V4.size).as_ruby_struct
616
+ end
617
+ end
550
618
  end
551
619
 
552
620
  =begin
@@ -581,7 +649,7 @@ typedef struct _DHCP_OPTION_ARRAY {
581
649
  layout :start_address, :uint32,
582
650
  :end_address, :uint32
583
651
 
584
- ruby_struct_attr :uint32_to_ip, :subnet_address, :subnet_mask
652
+ ruby_struct_attr :uint32_to_ip, :start_address, :end_address
585
653
  end
586
654
 
587
655
  #
@@ -38,24 +38,14 @@ module DhcpsApi
38
38
  # @see ClientType ClientType documentation for the list of available client types.
39
39
  #
40
40
  def create_reservation(reservation_ip, reservation_subnet_mask, reservation_mac, reservation_name, reservation_comment = '', client_type = DhcpsApi::ClientType::CLIENT_TYPE_DHCP)
41
- subnet_element = DhcpsApi::DHCP_SUBNET_ELEMENT_DATA_V4.new
42
- subnet_element[:element_type] = DhcpsApi::DHCP_SUBNET_ELEMENT_TYPE::DhcpReservedIps
43
- subnet_element[:element][:reserved_ip] = (reserved_ip = DhcpsApi::DHCP_IP_RESERVATION_V4.new).pointer
44
-
45
- reserved_ip[:reserved_ip_address] = ip_to_uint32(reservation_ip)
46
- reserved_ip[:reserved_for_client] = DhcpsApi::DHCP_CLIENT_UID.from_mac_address(reservation_mac).pointer
47
- reserved_ip[:b_allowed_client_types] = client_type
48
-
49
41
  ip_as_octets = reservation_ip.split('.').map {|octet| octet.to_i}
50
42
  mask_as_octets = reservation_subnet_mask.split('.').map {|octet| octet.to_i}
51
43
  subnet_address = (0..3).inject([]) {|all, i| all << (ip_as_octets[i] & mask_as_octets[i])}.join('.')
52
44
 
53
- error = DhcpsApi::Win2008::SubnetElement.DhcpAddSubnetElementV4(to_wchar_string(server_ip_address), ip_to_uint32(subnet_address), subnet_element.pointer)
54
- raise DhcpsApi::Error.new("Error creating reservation.", error) if error != 0
55
-
45
+ subnet_element = create_reservation_subnet_element(subnet_address, reservation_ip, reservation_mac, client_type)
56
46
  modify_client(reservation_ip, reservation_subnet_mask, reservation_mac, reservation_name, reservation_comment, 0, client_type)
57
47
 
58
- subnet_element.as_ruby_struct
48
+ subnet_element
59
49
  end
60
50
 
61
51
  # Deletes subnet reservations.
@@ -70,21 +60,9 @@ module DhcpsApi
70
60
  #
71
61
  # @return [void]
72
62
  #
73
- def delete_reservation(reservation_ip, subnet_address, reservation_mac)
74
- to_delete = DhcpsApi::DHCP_SUBNET_ELEMENT_DATA_V4.new
75
- to_delete[:element_type] = DhcpsApi::DHCP_SUBNET_ELEMENT_TYPE::DhcpReservedIps
76
- to_delete[:element][:reserved_ip] = (reserved_ip = DhcpsApi::DHCP_IP_RESERVATION_V4.new).pointer
77
-
78
- reserved_ip[:reserved_ip_address] = ip_to_uint32(reservation_ip)
79
- reserved_ip[:reserved_for_client] = DhcpsApi::DHCP_CLIENT_UID.from_mac_address(reservation_mac).pointer
80
- reserved_ip[:b_allowed_client_types] = DhcpsApi::ClientType::CLIENT_TYPE_NONE
81
-
82
- error = DhcpsApi::Win2008::SubnetElement.DhcpRemoveSubnetElementV4(
83
- to_wchar_string(server_ip_address),
84
- ip_to_uint32(subnet_address),
85
- to_delete.pointer,
86
- DhcpsApi::DHCP_FORCE_FLAG::DhcpNoForce)
87
- raise DhcpsApi::Error.new("Error deleting reservation.", error) if error != 0
63
+ def delete_reservation(reservation_ip, subnet_address, reservation_mac, client_type = DhcpsApi::ClientType::CLIENT_TYPE_DHCP)
64
+ delete_subnet_element(subnet_address, DhcpsApi::DHCP_SUBNET_ELEMENT_DATA_V4.build_for_reservation(
65
+ reservation_ip, reservation_mac, client_type))
88
66
  end
89
67
 
90
68
  # Sets dns configuration for a reservation.
@@ -115,6 +93,13 @@ module DhcpsApi
115
93
  set_reserved_option_value(81, reservation_ip, subnet_address, DhcpsApi::DHCP_OPTION_DATA_TYPE::DhcpDWordOption, [value])
116
94
  end
117
95
 
96
+ def create_reservation_subnet_element(subnet_address, reservation_ip_address, reservation_mac_address, client_type = DhcpsApi::ClientType::CLIENT_TYPE_DHCP)
97
+ add_subnet_element(subnet_address,
98
+ DhcpsApi::DHCP_SUBNET_ELEMENT_DATA_V4.build_for_reservation(
99
+ reservation_ip_address, reservation_mac_address, client_type)
100
+ )
101
+ end
102
+
118
103
  def dhcp_v4_enum_subnet_reservations(subnet_address, preferred_maximum, resume_handle)
119
104
  resume_handle_ptr = FFI::MemoryPointer.new(:uint32).put_uint32(0, resume_handle)
120
105
  enum_element_info_ptr_ptr = FFI::MemoryPointer.new(:pointer)
@@ -1,8 +1,8 @@
1
1
  module DhcpsApi
2
2
  class Server
3
- DHCPS_WIN2008_API = Object,new
4
- DHCPS_WIN2012_API = Object,new
5
- DHCPS_NONE = Object,new
3
+ DHCPS_WIN2008_API = Object.new
4
+ DHCPS_WIN2012_API = Object.new
5
+ DHCPS_NONE = Object.new
6
6
 
7
7
  include RubyStructAttrHelpers
8
8
  include CommonMethods
@@ -14,6 +14,7 @@ module DhcpsApi
14
14
  include OptionValue
15
15
  include Reservation
16
16
  include Subnet
17
+ include SubnetElement
17
18
 
18
19
  attr_reader :server_ip_address
19
20
 
@@ -32,6 +33,7 @@ module DhcpsApi
32
33
  require 'dhcpsapi/win2008/option_value'
33
34
  require 'dhcpsapi/win2008/subnet_element'
34
35
  require 'dhcpsapi/win2008/subnet'
36
+ require 'dhcpsapi/win2008/subnet_element'
35
37
 
36
38
  level = :win2008
37
39
 
@@ -83,17 +83,8 @@ module DhcpsApi
83
83
  # @return [Hash]
84
84
  #
85
85
  # @see DHCP_SUBNET_ELEMENT_DATA_V4 DHCP_SUBNET_ELEMENT_DATA_V4 documentation for the list of available fields.
86
- def add_subnet_ip_range(subnet_address, start_address, end_address)
87
- subnet_element = DhcpsApi::DHCP_SUBNET_ELEMENT_DATA_V4.new
88
- subnet_element[:element_type] = DhcpsApi::DHCP_SUBNET_ELEMENT_TYPE::DhcpIpRanges
89
- subnet_element[:element][:ip_range] = (ip_range = DhcpsApi::DHCP_IP_RANGE.new).pointer
90
- ip_range[:start_address] = ip_to_uint32(start_address)
91
- ip_range[:end_address] = ip_to_uint32(end_address)
92
-
93
- error = DhcpsApi::Win2008::SubnetElement.DhcpAddSubnetElementV4(to_wchar_string(server_ip_address), ip_to_uint32(subnet_address), subnet_element.pointer)
94
- raise DhcpsApi::Error.new("Error adding a subnet range to '%s'." % [subnet_address], error) if error != 0
95
-
96
- subnet_element.as_ruby_struct
86
+ def create_subnet_ip_range(subnet_address, start_address, end_address)
87
+ add_subnet_element(subnet_address, DhcpsApi::DHCP_SUBNET_ELEMENT_DATA_V4.build_for_subnet_range(start_address, end_address))
97
88
  end
98
89
 
99
90
  # Deletes a subnet ip address range.
@@ -108,18 +99,7 @@ module DhcpsApi
108
99
  #
109
100
  # @return [void]
110
101
  def delete_subnet_ip_range(subnet_address, start_address, end_address)
111
- to_delete = DhcpsApi::DHCP_SUBNET_ELEMENT_DATA_V4.new
112
- to_delete[:element_type] = DhcpsApi::DHCP_SUBNET_ELEMENT_TYPE::DhcpIpRanges
113
- to_delete[:element][:ip_range] = (ip_range = DhcpsApi::DHCP_IP_RANGE.new).pointer
114
- ip_range[:start_address] = ip_to_uint32(start_address)
115
- ip_range[:end_address] = ip_to_uint32(end_address)
116
-
117
- error = DhcpsApi::Win2008::SubnetElement.DhcpRemoveSubnetElementV4(
118
- to_wchar_string(server_ip_address),
119
- ip_to_uint32(subnet_address),
120
- to_delete.pointer,
121
- DhcpsApi::DHCP_FORCE_FLAG::DhcpNoForce)
122
- raise DhcpsApi::Error.new("Error deleting reservation.", error) if error != 0
102
+ delete_subnet_element(subnet_address, DhcpsApi::DHCP_SUBNET_ELEMENT_DATA_V4.build_for_subnet_range(start_address, end_address))
123
103
  end
124
104
 
125
105
  private
@@ -0,0 +1,85 @@
1
+ module DhcpsApi
2
+ module SubnetElement
3
+ # Returns a a list of subnet elements.
4
+ #
5
+ # @example List subnet elements
6
+ #
7
+ # api.list_subnet_elements('192.168.42.0', DhcpsApi::DHCP_SUBNET_ELEMENT_TYPE::DhcpReservedIps)
8
+ #
9
+ # @param subnet_address [String] Subnet ip address
10
+ # @param element_type [DHCP_SUBNET_ELEMENT_TYPE] Subnet element type
11
+ #
12
+ # @return [Array<Hash>]
13
+ #
14
+ # @see DHCP_SUBNET_ELEMENT_DATA_V4 DHCP_SUBNET_ELEMENT_DATA_V4 documentation for the list of available fields.
15
+ #
16
+ def list_subnet_elements(subnet_address, element_type)
17
+ items, _ = retrieve_items(:dhcp_enum_subnet_elements_v4, subnet_address, element_type, 1024, 0)
18
+ items
19
+ end
20
+
21
+ # Creates a new subnet element.
22
+ #
23
+ # @example Create a new subnet element
24
+ #
25
+ # api.add_subnet_element('192.168.42.0', a_subnet_element)
26
+ #
27
+ # @param subnet_ip_address [String] Subnet ip address
28
+ # @param subnet_element [DHCP_SUBNET_ELEMENT_DATA_V4] Subnet element
29
+ #
30
+ # @return [Hash]
31
+ #
32
+ # @see DHCP_SUBNET_ELEMENT_DATA_V4 DHCP_SUBNET_ELEMENT_DATA_V4 documentation for the list of available fields.
33
+ #
34
+ def add_subnet_element(subnet_address, subnet_element)
35
+ error = DhcpsApi::Win2008::SubnetElement.DhcpAddSubnetElementV4(to_wchar_string(server_ip_address), ip_to_uint32(subnet_address), subnet_element.pointer)
36
+ raise DhcpsApi::Error.new("Error creating subnet element.", error) if error != 0
37
+ subnet_element.as_ruby_struct
38
+ end
39
+
40
+ # Deletes subnet element.
41
+ #
42
+ # @example Delete a subnet element
43
+ #
44
+ # api.delete_subnet_element('192.168.42.0', an_existing_subnet_element)
45
+ #
46
+ # @param subnet_ip_address [String] Subnet ip address
47
+ # @param subnet_element [DHCP_SUBNET_ELEMENT_DATA_V4] Subnet element
48
+ #
49
+ # @return [void]
50
+ #
51
+ def delete_subnet_element(subnet_address, subnet_element)
52
+ error = DhcpsApi::Win2008::SubnetElement.DhcpRemoveSubnetElementV4(
53
+ to_wchar_string(server_ip_address),
54
+ ip_to_uint32(subnet_address),
55
+ subnet_element.pointer,
56
+ DhcpsApi::DHCP_FORCE_FLAG::DhcpNoForce)
57
+ raise DhcpsApi::Error.new("Error deleting subnet element.", error) if error != 0
58
+ end
59
+
60
+ def dhcp_enum_subnet_elements_v4(subnet_address, element_type, preferred_maximum, resume_handle)
61
+ resume_handle_ptr = FFI::MemoryPointer.new(:uint32).put_uint32(0, resume_handle)
62
+ subnet_element_info_ptr_ptr = FFI::MemoryPointer.new(:pointer)
63
+ elements_read_ptr = FFI::MemoryPointer.new(:uint32).put_uint32(0, 0)
64
+ elements_total_ptr = FFI::MemoryPointer.new(:uint32).put_uint32(0, 0)
65
+
66
+ error = DhcpsApi::Win2008::SubnetElement.DhcpEnumSubnetElementsV4(
67
+ to_wchar_string(server_ip_address), ip_to_uint32(subnet_address), element_type, resume_handle_ptr, preferred_maximum,
68
+ subnet_element_info_ptr_ptr, elements_read_ptr, elements_total_ptr)
69
+ return empty_response if error == 259
70
+ if is_error?(error)
71
+ unless (subnet_element_info_ptr_ptr.null? || (to_free = subnet_element_info_ptr_ptr.read_pointer).null?)
72
+ free_memory(DhcpsApi::DHCP_SUBNET_ELEMENT_INFO_ARRAY_V4.new(to_free))
73
+ end
74
+ raise DhcpsApi::Error.new("Error retrieving subnet elements for subnet '%s'." % [subnet_address], error)
75
+ end
76
+
77
+ subnet_elements_array = DhcpsApi::DHCP_SUBNET_ELEMENT_INFO_ARRAY_V4.new(subnet_element_info_ptr_ptr.read_pointer)
78
+ subnet_elements = subnet_elements_array.as_ruby_struct
79
+ free_memory(subnet_elements_array)
80
+
81
+ [subnet_elements, resume_handle_ptr.get_uint32(0), elements_read_ptr.get_uint32(0), elements_total_ptr.get_uint32(0)]
82
+ end
83
+ end
84
+ end
85
+
@@ -1,3 +1,3 @@
1
1
  module DhcpsApi
2
- VERSION = "0.0.7"
2
+ VERSION = "0.0.8"
3
3
  end
@@ -22,5 +22,20 @@ module DhcpsApi::Win2008
22
22
  );
23
23
  =end
24
24
  attach_function :DhcpRemoveSubnetElementV4, [:pointer, :uint32, :pointer, :uint32], :uint32
25
+
26
+ =begin
27
+ DWORD DHCP_API_FUNCTION DhcpEnumSubnetElementsV4(
28
+ _In_ DHCP_CONST WCHAR *ServerIpAddress,
29
+ _In_ DHCP_IP_ADDRESS SubnetAddress,
30
+ _In_ DHCP_SUBNET_ELEMENT_TYPE EnumElementType,
31
+ _Inout_ DHCP_RESUME_HANDLE *ResumeHandle,
32
+ _In_ DWORD PreferredMaximum,
33
+ _Out_ LPDHCP_SUBNET_ELEMENT_INFO_ARRAY_V4 *EnumElementInfo,
34
+ _Out_ DWORD *ElementsRead,
35
+ _Out_ DWORD *ElementsTotal
36
+ );
37
+ =end
38
+ attach_function :DhcpEnumSubnetElementsV4, [:pointer, :uint32, :uint32, :pointer, :uint32, :pointer, :pointer, :pointer], :uint32
25
39
  end
26
40
  end
41
+
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dhcpsapi
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.7
4
+ version: 0.0.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dmitri Dolguikh
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-10-12 00:00:00.000000000 Z
11
+ date: 2016-10-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ffi
@@ -88,6 +88,7 @@ files:
88
88
  - lib/dhcpsapi/reservation.rb
89
89
  - lib/dhcpsapi/server.rb
90
90
  - lib/dhcpsapi/subnet.rb
91
+ - lib/dhcpsapi/subnet_element.rb
91
92
  - lib/dhcpsapi/version.rb
92
93
  - lib/dhcpsapi/win2008/class.rb
93
94
  - lib/dhcpsapi/win2008/client.rb