lib-dhcp 0.1.0
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 +7 -0
- data/.gitignore +10 -0
- data/.travis.yml +13 -0
- data/CODE_OF_CONDUCT.md +74 -0
- data/Gemfile +6 -0
- data/LICENSE.txt +21 -0
- data/README.md +33 -0
- data/Rakefile +10 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/exe/dhcp_dump +83 -0
- data/lib-dhcp.gemspec +31 -0
- data/lib/lib/dhcp.rb +276 -0
- data/lib/lib/dhcp/exception.rb +34 -0
- data/lib/lib/dhcp/messages/ack.rb +65 -0
- data/lib/lib/dhcp/messages/decline.rb +77 -0
- data/lib/lib/dhcp/messages/discover.rb +70 -0
- data/lib/lib/dhcp/messages/inform.rb +64 -0
- data/lib/lib/dhcp/messages/lease_active.rb +65 -0
- data/lib/lib/dhcp/messages/lease_query.rb +64 -0
- data/lib/lib/dhcp/messages/lease_unassigned.rb +64 -0
- data/lib/lib/dhcp/messages/lease_unknown.rb +64 -0
- data/lib/lib/dhcp/messages/message.rb +285 -0
- data/lib/lib/dhcp/messages/nack.rb +64 -0
- data/lib/lib/dhcp/messages/offer.rb +74 -0
- data/lib/lib/dhcp/messages/release.rb +64 -0
- data/lib/lib/dhcp/messages/request.rb +71 -0
- data/lib/lib/dhcp/options.rb +73 -0
- data/lib/lib/dhcp/options/option.rb +249 -0
- data/lib/lib/dhcp/options/option0.rb +34 -0
- data/lib/lib/dhcp/options/option1.rb +24 -0
- data/lib/lib/dhcp/options/option10.rb +20 -0
- data/lib/lib/dhcp/options/option100.rb +17 -0
- data/lib/lib/dhcp/options/option101.rb +17 -0
- data/lib/lib/dhcp/options/option102.rb +17 -0
- data/lib/lib/dhcp/options/option103.rb +17 -0
- data/lib/lib/dhcp/options/option104.rb +17 -0
- data/lib/lib/dhcp/options/option105.rb +17 -0
- data/lib/lib/dhcp/options/option106.rb +17 -0
- data/lib/lib/dhcp/options/option107.rb +17 -0
- data/lib/lib/dhcp/options/option108.rb +17 -0
- data/lib/lib/dhcp/options/option109.rb +17 -0
- data/lib/lib/dhcp/options/option11.rb +20 -0
- data/lib/lib/dhcp/options/option110.rb +17 -0
- data/lib/lib/dhcp/options/option111.rb +17 -0
- data/lib/lib/dhcp/options/option112.rb +17 -0
- data/lib/lib/dhcp/options/option113.rb +17 -0
- data/lib/lib/dhcp/options/option114.rb +17 -0
- data/lib/lib/dhcp/options/option115.rb +17 -0
- data/lib/lib/dhcp/options/option116.rb +17 -0
- data/lib/lib/dhcp/options/option117.rb +17 -0
- data/lib/lib/dhcp/options/option118.rb +17 -0
- data/lib/lib/dhcp/options/option119.rb +17 -0
- data/lib/lib/dhcp/options/option12.rb +20 -0
- data/lib/lib/dhcp/options/option120.rb +17 -0
- data/lib/lib/dhcp/options/option121.rb +17 -0
- data/lib/lib/dhcp/options/option122.rb +341 -0
- data/lib/lib/dhcp/options/option123.rb +17 -0
- data/lib/lib/dhcp/options/option124.rb +17 -0
- data/lib/lib/dhcp/options/option125.rb +17 -0
- data/lib/lib/dhcp/options/option126.rb +17 -0
- data/lib/lib/dhcp/options/option127.rb +17 -0
- data/lib/lib/dhcp/options/option128.rb +17 -0
- data/lib/lib/dhcp/options/option129.rb +17 -0
- data/lib/lib/dhcp/options/option13.rb +43 -0
- data/lib/lib/dhcp/options/option130.rb +17 -0
- data/lib/lib/dhcp/options/option131.rb +17 -0
- data/lib/lib/dhcp/options/option132.rb +17 -0
- data/lib/lib/dhcp/options/option133.rb +17 -0
- data/lib/lib/dhcp/options/option134.rb +17 -0
- data/lib/lib/dhcp/options/option135.rb +17 -0
- data/lib/lib/dhcp/options/option136.rb +17 -0
- data/lib/lib/dhcp/options/option137.rb +17 -0
- data/lib/lib/dhcp/options/option138.rb +17 -0
- data/lib/lib/dhcp/options/option139.rb +17 -0
- data/lib/lib/dhcp/options/option14.rb +21 -0
- data/lib/lib/dhcp/options/option140.rb +17 -0
- data/lib/lib/dhcp/options/option141.rb +17 -0
- data/lib/lib/dhcp/options/option142.rb +17 -0
- data/lib/lib/dhcp/options/option143.rb +17 -0
- data/lib/lib/dhcp/options/option144.rb +17 -0
- data/lib/lib/dhcp/options/option145.rb +17 -0
- data/lib/lib/dhcp/options/option146.rb +17 -0
- data/lib/lib/dhcp/options/option147.rb +17 -0
- data/lib/lib/dhcp/options/option148.rb +17 -0
- data/lib/lib/dhcp/options/option149.rb +17 -0
- data/lib/lib/dhcp/options/option15.rb +20 -0
- data/lib/lib/dhcp/options/option150.rb +17 -0
- data/lib/lib/dhcp/options/option151.rb +17 -0
- data/lib/lib/dhcp/options/option152.rb +17 -0
- data/lib/lib/dhcp/options/option153.rb +17 -0
- data/lib/lib/dhcp/options/option154.rb +17 -0
- data/lib/lib/dhcp/options/option155.rb +17 -0
- data/lib/lib/dhcp/options/option156.rb +17 -0
- data/lib/lib/dhcp/options/option157.rb +17 -0
- data/lib/lib/dhcp/options/option158.rb +17 -0
- data/lib/lib/dhcp/options/option159.rb +17 -0
- data/lib/lib/dhcp/options/option16.rb +19 -0
- data/lib/lib/dhcp/options/option160.rb +17 -0
- data/lib/lib/dhcp/options/option161.rb +17 -0
- data/lib/lib/dhcp/options/option162.rb +17 -0
- data/lib/lib/dhcp/options/option163.rb +17 -0
- data/lib/lib/dhcp/options/option164.rb +17 -0
- data/lib/lib/dhcp/options/option165.rb +17 -0
- data/lib/lib/dhcp/options/option166.rb +17 -0
- data/lib/lib/dhcp/options/option167.rb +17 -0
- data/lib/lib/dhcp/options/option168.rb +17 -0
- data/lib/lib/dhcp/options/option169.rb +17 -0
- data/lib/lib/dhcp/options/option17.rb +22 -0
- data/lib/lib/dhcp/options/option170.rb +17 -0
- data/lib/lib/dhcp/options/option171.rb +17 -0
- data/lib/lib/dhcp/options/option172.rb +17 -0
- data/lib/lib/dhcp/options/option173.rb +17 -0
- data/lib/lib/dhcp/options/option174.rb +17 -0
- data/lib/lib/dhcp/options/option175.rb +17 -0
- data/lib/lib/dhcp/options/option176.rb +17 -0
- data/lib/lib/dhcp/options/option177.rb +17 -0
- data/lib/lib/dhcp/options/option178.rb +17 -0
- data/lib/lib/dhcp/options/option179.rb +17 -0
- data/lib/lib/dhcp/options/option18.rb +23 -0
- data/lib/lib/dhcp/options/option180.rb +17 -0
- data/lib/lib/dhcp/options/option181.rb +17 -0
- data/lib/lib/dhcp/options/option182.rb +17 -0
- data/lib/lib/dhcp/options/option183.rb +17 -0
- data/lib/lib/dhcp/options/option184.rb +17 -0
- data/lib/lib/dhcp/options/option185.rb +17 -0
- data/lib/lib/dhcp/options/option186.rb +17 -0
- data/lib/lib/dhcp/options/option187.rb +17 -0
- data/lib/lib/dhcp/options/option188.rb +17 -0
- data/lib/lib/dhcp/options/option189.rb +17 -0
- data/lib/lib/dhcp/options/option19.rb +20 -0
- data/lib/lib/dhcp/options/option190.rb +17 -0
- data/lib/lib/dhcp/options/option191.rb +17 -0
- data/lib/lib/dhcp/options/option192.rb +17 -0
- data/lib/lib/dhcp/options/option193.rb +17 -0
- data/lib/lib/dhcp/options/option194.rb +17 -0
- data/lib/lib/dhcp/options/option195.rb +17 -0
- data/lib/lib/dhcp/options/option196.rb +17 -0
- data/lib/lib/dhcp/options/option197.rb +17 -0
- data/lib/lib/dhcp/options/option198.rb +17 -0
- data/lib/lib/dhcp/options/option199.rb +17 -0
- data/lib/lib/dhcp/options/option2.rb +45 -0
- data/lib/lib/dhcp/options/option20.rb +22 -0
- data/lib/lib/dhcp/options/option200.rb +17 -0
- data/lib/lib/dhcp/options/option201.rb +17 -0
- data/lib/lib/dhcp/options/option202.rb +17 -0
- data/lib/lib/dhcp/options/option203.rb +17 -0
- data/lib/lib/dhcp/options/option204.rb +17 -0
- data/lib/lib/dhcp/options/option205.rb +17 -0
- data/lib/lib/dhcp/options/option206.rb +17 -0
- data/lib/lib/dhcp/options/option207.rb +17 -0
- data/lib/lib/dhcp/options/option208.rb +17 -0
- data/lib/lib/dhcp/options/option209.rb +17 -0
- data/lib/lib/dhcp/options/option21.rb +87 -0
- data/lib/lib/dhcp/options/option210.rb +17 -0
- data/lib/lib/dhcp/options/option211.rb +17 -0
- data/lib/lib/dhcp/options/option212.rb +17 -0
- data/lib/lib/dhcp/options/option213.rb +17 -0
- data/lib/lib/dhcp/options/option214.rb +17 -0
- data/lib/lib/dhcp/options/option215.rb +17 -0
- data/lib/lib/dhcp/options/option216.rb +17 -0
- data/lib/lib/dhcp/options/option217.rb +17 -0
- data/lib/lib/dhcp/options/option218.rb +17 -0
- data/lib/lib/dhcp/options/option219.rb +17 -0
- data/lib/lib/dhcp/options/option22.rb +43 -0
- data/lib/lib/dhcp/options/option220.rb +17 -0
- data/lib/lib/dhcp/options/option221.rb +17 -0
- data/lib/lib/dhcp/options/option222.rb +17 -0
- data/lib/lib/dhcp/options/option223.rb +17 -0
- data/lib/lib/dhcp/options/option224.rb +17 -0
- data/lib/lib/dhcp/options/option225.rb +17 -0
- data/lib/lib/dhcp/options/option226.rb +17 -0
- data/lib/lib/dhcp/options/option227.rb +17 -0
- data/lib/lib/dhcp/options/option228.rb +17 -0
- data/lib/lib/dhcp/options/option229.rb +17 -0
- data/lib/lib/dhcp/options/option23.rb +44 -0
- data/lib/lib/dhcp/options/option230.rb +17 -0
- data/lib/lib/dhcp/options/option231.rb +17 -0
- data/lib/lib/dhcp/options/option232.rb +17 -0
- data/lib/lib/dhcp/options/option233.rb +17 -0
- data/lib/lib/dhcp/options/option234.rb +17 -0
- data/lib/lib/dhcp/options/option235.rb +17 -0
- data/lib/lib/dhcp/options/option236.rb +17 -0
- data/lib/lib/dhcp/options/option237.rb +17 -0
- data/lib/lib/dhcp/options/option238.rb +17 -0
- data/lib/lib/dhcp/options/option239.rb +17 -0
- data/lib/lib/dhcp/options/option24.rb +45 -0
- data/lib/lib/dhcp/options/option240.rb +17 -0
- data/lib/lib/dhcp/options/option241.rb +17 -0
- data/lib/lib/dhcp/options/option242.rb +17 -0
- data/lib/lib/dhcp/options/option243.rb +17 -0
- data/lib/lib/dhcp/options/option244.rb +17 -0
- data/lib/lib/dhcp/options/option245.rb +17 -0
- data/lib/lib/dhcp/options/option246.rb +17 -0
- data/lib/lib/dhcp/options/option247.rb +17 -0
- data/lib/lib/dhcp/options/option248.rb +17 -0
- data/lib/lib/dhcp/options/option249.rb +17 -0
- data/lib/lib/dhcp/options/option25.rb +20 -0
- data/lib/lib/dhcp/options/option250.rb +17 -0
- data/lib/lib/dhcp/options/option251.rb +17 -0
- data/lib/lib/dhcp/options/option252.rb +17 -0
- data/lib/lib/dhcp/options/option253.rb +17 -0
- data/lib/lib/dhcp/options/option254.rb +17 -0
- data/lib/lib/dhcp/options/option255.rb +29 -0
- data/lib/lib/dhcp/options/option26.rb +45 -0
- data/lib/lib/dhcp/options/option27.rb +16 -0
- data/lib/lib/dhcp/options/option28.rb +21 -0
- data/lib/lib/dhcp/options/option29.rb +16 -0
- data/lib/lib/dhcp/options/option3.rb +22 -0
- data/lib/lib/dhcp/options/option30.rb +16 -0
- data/lib/lib/dhcp/options/option31.rb +16 -0
- data/lib/lib/dhcp/options/option32.rb +18 -0
- data/lib/lib/dhcp/options/option33.rb +20 -0
- data/lib/lib/dhcp/options/option34.rb +16 -0
- data/lib/lib/dhcp/options/option35.rb +43 -0
- data/lib/lib/dhcp/options/option36.rb +16 -0
- data/lib/lib/dhcp/options/option37.rb +43 -0
- data/lib/lib/dhcp/options/option38.rb +43 -0
- data/lib/lib/dhcp/options/option39.rb +16 -0
- data/lib/lib/dhcp/options/option4.rb +21 -0
- data/lib/lib/dhcp/options/option40.rb +18 -0
- data/lib/lib/dhcp/options/option41.rb +18 -0
- data/lib/lib/dhcp/options/option42.rb +22 -0
- data/lib/lib/dhcp/options/option43.rb +16 -0
- data/lib/lib/dhcp/options/option44.rb +17 -0
- data/lib/lib/dhcp/options/option45.rb +18 -0
- data/lib/lib/dhcp/options/option46.rb +43 -0
- data/lib/lib/dhcp/options/option47.rb +17 -0
- data/lib/lib/dhcp/options/option48.rb +17 -0
- data/lib/lib/dhcp/options/option49.rb +17 -0
- data/lib/lib/dhcp/options/option5.rb +23 -0
- data/lib/lib/dhcp/options/option50.rb +16 -0
- data/lib/lib/dhcp/options/option51.rb +43 -0
- data/lib/lib/dhcp/options/option52.rb +45 -0
- data/lib/lib/dhcp/options/option53.rb +50 -0
- data/lib/lib/dhcp/options/option54.rb +16 -0
- data/lib/lib/dhcp/options/option55.rb +52 -0
- data/lib/lib/dhcp/options/option56.rb +20 -0
- data/lib/lib/dhcp/options/option57.rb +52 -0
- data/lib/lib/dhcp/options/option58.rb +45 -0
- data/lib/lib/dhcp/options/option59.rb +45 -0
- data/lib/lib/dhcp/options/option6.rb +23 -0
- data/lib/lib/dhcp/options/option60.rb +16 -0
- data/lib/lib/dhcp/options/option61.rb +37 -0
- data/lib/lib/dhcp/options/option62.rb +16 -0
- data/lib/lib/dhcp/options/option63.rb +16 -0
- data/lib/lib/dhcp/options/option64.rb +20 -0
- data/lib/lib/dhcp/options/option65.rb +17 -0
- data/lib/lib/dhcp/options/option66.rb +20 -0
- data/lib/lib/dhcp/options/option67.rb +20 -0
- data/lib/lib/dhcp/options/option68.rb +19 -0
- data/lib/lib/dhcp/options/option69.rb +17 -0
- data/lib/lib/dhcp/options/option7.rb +22 -0
- data/lib/lib/dhcp/options/option70.rb +17 -0
- data/lib/lib/dhcp/options/option71.rb +17 -0
- data/lib/lib/dhcp/options/option72.rb +17 -0
- data/lib/lib/dhcp/options/option73.rb +17 -0
- data/lib/lib/dhcp/options/option74.rb +17 -0
- data/lib/lib/dhcp/options/option75.rb +17 -0
- data/lib/lib/dhcp/options/option76.rb +17 -0
- data/lib/lib/dhcp/options/option77.rb +16 -0
- data/lib/lib/dhcp/options/option78.rb +16 -0
- data/lib/lib/dhcp/options/option79.rb +16 -0
- data/lib/lib/dhcp/options/option8.rb +22 -0
- data/lib/lib/dhcp/options/option80.rb +16 -0
- data/lib/lib/dhcp/options/option81.rb +16 -0
- data/lib/lib/dhcp/options/option82.rb +20 -0
- data/lib/lib/dhcp/options/option83.rb +16 -0
- data/lib/lib/dhcp/options/option84.rb +16 -0
- data/lib/lib/dhcp/options/option85.rb +16 -0
- data/lib/lib/dhcp/options/option86.rb +17 -0
- data/lib/lib/dhcp/options/option87.rb +16 -0
- data/lib/lib/dhcp/options/option88.rb +16 -0
- data/lib/lib/dhcp/options/option89.rb +16 -0
- data/lib/lib/dhcp/options/option9.rb +21 -0
- data/lib/lib/dhcp/options/option90.rb +16 -0
- data/lib/lib/dhcp/options/option91.rb +17 -0
- data/lib/lib/dhcp/options/option92.rb +17 -0
- data/lib/lib/dhcp/options/option93.rb +17 -0
- data/lib/lib/dhcp/options/option94.rb +17 -0
- data/lib/lib/dhcp/options/option95.rb +17 -0
- data/lib/lib/dhcp/options/option96.rb +17 -0
- data/lib/lib/dhcp/options/option97.rb +17 -0
- data/lib/lib/dhcp/options/option98.rb +17 -0
- data/lib/lib/dhcp/options/option99.rb +17 -0
- data/lib/lib/dhcp/options/sub_option.rb +32 -0
- data/lib/lib/dhcp/options/type/bool.rb +55 -0
- data/lib/lib/dhcp/options/type/ip_address.rb +73 -0
- data/lib/lib/dhcp/options/type/ip_array.rb +41 -0
- data/lib/lib/dhcp/options/type/netmask.rb +56 -0
- data/lib/lib/dhcp/options/type/raw.rb +51 -0
- data/lib/lib/dhcp/options/type/string.rb +49 -0
- data/lib/lib/dhcp/options/type/sub_option.rb +83 -0
- data/lib/lib/dhcp/packet.rb +96 -0
- data/lib/lib/dhcp/version.rb +5 -0
- metadata +409 -0
@@ -0,0 +1,55 @@
|
|
1
|
+
#Author: Piotr Wojcieszonek
|
2
|
+
#e-mail: piotr@wojcieszonek.pl
|
3
|
+
# Copyright 22.03.2016 by Piotr Wojcieszonek
|
4
|
+
|
5
|
+
|
6
|
+
module Lib
|
7
|
+
module DHCP
|
8
|
+
class Option
|
9
|
+
module Type
|
10
|
+
module BOOL
|
11
|
+
def self.included(base)
|
12
|
+
base.send :include, InstanceMethods
|
13
|
+
base.extend ClassMethods
|
14
|
+
end
|
15
|
+
|
16
|
+
def initialize(option)
|
17
|
+
if option
|
18
|
+
option = (option > 0) ? 1 : 0
|
19
|
+
else
|
20
|
+
option = 0
|
21
|
+
end
|
22
|
+
oid = self.class.name.split('::').last.sub(/Option/, '').to_i
|
23
|
+
super oid, option
|
24
|
+
end
|
25
|
+
|
26
|
+
module InstanceMethods
|
27
|
+
def pack
|
28
|
+
[@oid, 1, @payload.to_i].pack('C3')
|
29
|
+
end
|
30
|
+
|
31
|
+
def len
|
32
|
+
1
|
33
|
+
end
|
34
|
+
|
35
|
+
def payload=(option)
|
36
|
+
if option
|
37
|
+
@payload = (option > 0) ? 1 : 0
|
38
|
+
else
|
39
|
+
@payload = 0
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
module ClassMethods
|
45
|
+
private
|
46
|
+
def unpack(oid, len, payload)
|
47
|
+
raise ArgumentError, "Wrong #{Lib::DHCP::Option::NAME[oid]} length = #{len}" unless len == 1
|
48
|
+
self.new payload.unpack('C').first.to_i
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
#Author: Piotr Wojcieszonek
|
2
|
+
#e-mail: piotr@wojcieszonek.pl
|
3
|
+
# Copyright 22.03.2016 by Piotr Wojcieszonek
|
4
|
+
|
5
|
+
|
6
|
+
require 'net/address'
|
7
|
+
|
8
|
+
module Lib
|
9
|
+
module DHCP
|
10
|
+
class Option
|
11
|
+
module Type
|
12
|
+
module IPAddress
|
13
|
+
def self.included(base)
|
14
|
+
base.extend ClassMethods
|
15
|
+
end
|
16
|
+
|
17
|
+
def initialize(*address)
|
18
|
+
raise ArgumentError, 'To few argument - nil' if address.nil?
|
19
|
+
oid = self.class.name.split('::').last.sub(/Option/, '').to_i
|
20
|
+
if address.size == 1
|
21
|
+
address = address.first.split(',') if address.first.is_a? ::String
|
22
|
+
end
|
23
|
+
case address.size
|
24
|
+
when 0
|
25
|
+
raise ArgumentError, 'To few argument - 0'
|
26
|
+
when 1
|
27
|
+
address = address.first
|
28
|
+
super oid, (address.is_a? Net::Address::IPv4) ? address : Net::Address::IPv4.new(address)
|
29
|
+
else
|
30
|
+
super oid, address.map {|ip| (ip.is_a? Net::Address::IPv4) ? ip : Net::Address::IPv4.new(ip)}
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def to_s
|
35
|
+
@payload.to_s
|
36
|
+
end
|
37
|
+
|
38
|
+
def pack
|
39
|
+
if @payload.is_a? Array
|
40
|
+
#len = @payload.size * 4
|
41
|
+
[@oid, len, @payload.map(&:to_i)].flatten.pack('C2N*')
|
42
|
+
else
|
43
|
+
raise ArgumentError, 'Argument must be a IP ' unless @payload.is_a? Net::Address::IPv4
|
44
|
+
[@oid, 4, @payload.to_i].pack('C2N')
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def len
|
49
|
+
if @payload.is_a? Array
|
50
|
+
@payload.size * 4
|
51
|
+
else
|
52
|
+
4
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def payload=(address)
|
57
|
+
(address.is_a? Net::Address::IPv4) ? @payload = address : @payload = Net::Address::IPv4.new(address)
|
58
|
+
end
|
59
|
+
|
60
|
+
|
61
|
+
module ClassMethods
|
62
|
+
private
|
63
|
+
def unpack(oid, len, payload)
|
64
|
+
raise ArgumentError, "Wrong #{Lib::DHCP::Option::NAME[oid]} Option length - #{len}" unless (len % 4) == 0
|
65
|
+
self.new *payload.unpack('N*')
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
#Author: Piotr Wojcieszonek
|
2
|
+
#e-mail: piotrk@wojcieszonek.pl
|
3
|
+
# Copyright 22.03.2016 by Piotr Wojcieszonek
|
4
|
+
|
5
|
+
|
6
|
+
require 'lib/dhcp/options/type/ip_address'
|
7
|
+
require 'net/address'
|
8
|
+
|
9
|
+
#TODO Implement :each
|
10
|
+
|
11
|
+
module Lib
|
12
|
+
module DHCP
|
13
|
+
class Option
|
14
|
+
module Type
|
15
|
+
module IPArray
|
16
|
+
|
17
|
+
def self.included(base)
|
18
|
+
base.send :include, Lib::DHCP::Option::Type::IPAddress
|
19
|
+
end
|
20
|
+
|
21
|
+
def <<(address)
|
22
|
+
unless @payload.is_a? Array
|
23
|
+
payload = @payload
|
24
|
+
@payload = [] #Array.new
|
25
|
+
@payload << payload
|
26
|
+
end
|
27
|
+
@payload << (address.is_a? Net::Address::IPv4) ? address : Net::Address::IPv4.new(address)
|
28
|
+
end
|
29
|
+
|
30
|
+
def payload=(*address)
|
31
|
+
address = address.split(',') if address.is_a? String
|
32
|
+
@payload = address.map { |ip| (ip.is_a? Net::Address::IPv4) ? ip : Net::Address::IPv4.new(ip) }
|
33
|
+
end
|
34
|
+
|
35
|
+
alias_method :add, :<<
|
36
|
+
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
#Author: Piotr Wojcieszonek
|
2
|
+
#e-mail: piotr@wojcieszonek.pl
|
3
|
+
# Copyright 21.03.2016 by Piotr Wojcieszonek
|
4
|
+
|
5
|
+
|
6
|
+
require 'net/address'
|
7
|
+
|
8
|
+
module Lib
|
9
|
+
module DHCP
|
10
|
+
class Option
|
11
|
+
module Type
|
12
|
+
module Netmask
|
13
|
+
def self.included(base)
|
14
|
+
base.send :include, InstanceMethods
|
15
|
+
base.extend ClassMethods
|
16
|
+
end
|
17
|
+
|
18
|
+
def initialize(netmask)
|
19
|
+
oid = self.class.name.split('::').last.sub(/Option/, '').to_i
|
20
|
+
payload = (netmask.is_a?(Net::Address::Mask)) ? netmask : Net::Address::Mask.new(netmask)
|
21
|
+
super oid, payload
|
22
|
+
end
|
23
|
+
|
24
|
+
module InstanceMethods
|
25
|
+
def pack
|
26
|
+
[@oid, 4, @payload.to_i].pack('C2N')
|
27
|
+
end
|
28
|
+
|
29
|
+
def len
|
30
|
+
4
|
31
|
+
end
|
32
|
+
|
33
|
+
def to_s
|
34
|
+
@payload.to_s
|
35
|
+
end
|
36
|
+
|
37
|
+
def payload=(netmask)
|
38
|
+
(netmask.is_a? Net::Address::Mask) ? @payload = netmask : @payload = Net::Address::Mask.new(netmask)
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
|
43
|
+
module ClassMethods
|
44
|
+
|
45
|
+
private
|
46
|
+
def unpack(oid, len, payload)
|
47
|
+
raise ArgumentError, "Wrong #{Lib::DHCP::Option::NAME[oid]} Option length - #{len}" unless len == 4
|
48
|
+
self.new *payload.unpack('N*')
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
#Author: Piotr Wojcieszonek
|
2
|
+
#e-mail: piotr@wojcieszonek.pl
|
3
|
+
# Copyright 22.03.2016 by Piotr Wojcieszonek
|
4
|
+
|
5
|
+
module Lib
|
6
|
+
module DHCP
|
7
|
+
class Option
|
8
|
+
module Type
|
9
|
+
module Raw
|
10
|
+
|
11
|
+
def self.included(base)
|
12
|
+
base.extend ClassMethods
|
13
|
+
end
|
14
|
+
|
15
|
+
|
16
|
+
|
17
|
+
def len=(len)
|
18
|
+
@len = len.to_i
|
19
|
+
end
|
20
|
+
|
21
|
+
def len
|
22
|
+
@len.to_i
|
23
|
+
end
|
24
|
+
|
25
|
+
def pack
|
26
|
+
@payload = '' if @value.nil?
|
27
|
+
[@oid, @len, @payload.to_s].pack("C2a#{@len.to_i}")
|
28
|
+
end
|
29
|
+
|
30
|
+
|
31
|
+
def to_s
|
32
|
+
@payload.unpack('C*').map{|item| item.to_i.to_s(16).rjust(2, '0') }.join(':')
|
33
|
+
end
|
34
|
+
|
35
|
+
|
36
|
+
|
37
|
+
module ClassMethods
|
38
|
+
private
|
39
|
+
def unpack(oid, len, payload)
|
40
|
+
option = self.new oid, payload
|
41
|
+
option.len = len.to_i
|
42
|
+
option
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
#Author: Piotr Wojcieszonek
|
2
|
+
#e-mail: piotr@wojcieszonek.pl
|
3
|
+
# Copyright 22.03.2016 by Piotr Wojcieszonek
|
4
|
+
|
5
|
+
|
6
|
+
module Lib
|
7
|
+
module DHCP
|
8
|
+
class Option
|
9
|
+
module Type
|
10
|
+
module String
|
11
|
+
def self.included(base)
|
12
|
+
base.send :include, InstanceMethods
|
13
|
+
base.extend ClassMethods
|
14
|
+
end
|
15
|
+
|
16
|
+
def initialize(message)
|
17
|
+
oid = self.class.name.split('::').last.sub(/Option/, '').to_i
|
18
|
+
super oid, message.to_s
|
19
|
+
end
|
20
|
+
|
21
|
+
module InstanceMethods
|
22
|
+
def pack
|
23
|
+
[@oid, @payload.size, @payload.to_s].pack('C2a*')
|
24
|
+
end
|
25
|
+
|
26
|
+
def len
|
27
|
+
@payload.size
|
28
|
+
end
|
29
|
+
|
30
|
+
def to_s
|
31
|
+
@payload.to_s
|
32
|
+
end
|
33
|
+
|
34
|
+
def payload=(message)
|
35
|
+
@payload = message.to_s
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
module ClassMethods
|
40
|
+
def unpack(oid, len, payload)
|
41
|
+
raise ArgumentError, "Wrong #{Lib::DHCP::Option::NAME[oid]} Option length - #{len}" unless len > 0
|
42
|
+
self.new payload#.unpack('a*').first.to_s
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,83 @@
|
|
1
|
+
#Author: Piotr Wojcieszonek
|
2
|
+
#e-mail: piotr@wojcieszonek.pl
|
3
|
+
# Copyright 22.03.2016 by Piotr Wojcieszonek
|
4
|
+
|
5
|
+
|
6
|
+
require 'lib/dhcp/options/sub_option'
|
7
|
+
|
8
|
+
|
9
|
+
module Lib
|
10
|
+
module DHCP
|
11
|
+
class Option
|
12
|
+
module Type
|
13
|
+
module SubOption
|
14
|
+
|
15
|
+
def self.included(base)
|
16
|
+
base.extend ClassMethods
|
17
|
+
end
|
18
|
+
|
19
|
+
def initialize(*sub_option)
|
20
|
+
oid = self.class.name.split('::').last.sub(/Option/, '').to_i
|
21
|
+
sub_options = []
|
22
|
+
sub_option.each do |sub|
|
23
|
+
if sub.is_a? Lib::DHCP::SubOption
|
24
|
+
opt = sub
|
25
|
+
elsif sub.is_a? Array
|
26
|
+
opt = Lib::DHCP::SubOption.new(sub[0], sub[1])
|
27
|
+
else
|
28
|
+
raise ArgumentError, 'Unknown SubOption parameter type'
|
29
|
+
end
|
30
|
+
sub_options << opt
|
31
|
+
define_singleton_method("option#{opt.oid.to_i}".to_sym) { opt }
|
32
|
+
#define_singleton_method(:option1) {opt}
|
33
|
+
end
|
34
|
+
super oid, sub_options
|
35
|
+
end
|
36
|
+
|
37
|
+
def to_s
|
38
|
+
s =''
|
39
|
+
@payload.each do |sub_option|
|
40
|
+
s += "Option #{sub_option.oid}, LEN #{sub_option.len}, Value #{@payload.to_s} \n\r"
|
41
|
+
end
|
42
|
+
s
|
43
|
+
end
|
44
|
+
|
45
|
+
def len
|
46
|
+
l = 0
|
47
|
+
@payload.each do |sub_option|
|
48
|
+
l += (sub_option.len.to_i + 2).to_i
|
49
|
+
end
|
50
|
+
l
|
51
|
+
end
|
52
|
+
|
53
|
+
def pack
|
54
|
+
option_pack = ''
|
55
|
+
sub_len = 2
|
56
|
+
@payload.each do |sub_option|
|
57
|
+
sub_len += sub_option.len
|
58
|
+
option_pack += sub_option.pack
|
59
|
+
end
|
60
|
+
[@oid, self.len, option_pack].pack('C2a*')
|
61
|
+
end
|
62
|
+
|
63
|
+
module ClassMethods
|
64
|
+
|
65
|
+
def unpack(oid, len, payload)
|
66
|
+
raise ArgumentError, "Wrong Option #{Lib::DHCP::Option::NAME[oid]} length - #{len}" unless len > 0
|
67
|
+
i = 0
|
68
|
+
sub_options = []
|
69
|
+
while i < len
|
70
|
+
sub_oid, sub_len = payload.unpack("@#{i}C2")
|
71
|
+
sub_payload = payload.unpack("@#{i+2}a#{sub_len}").first.to_s
|
72
|
+
sub_options << [sub_oid, sub_payload]
|
73
|
+
i += (sub_len + 2)
|
74
|
+
end
|
75
|
+
self.new *sub_options
|
76
|
+
end
|
77
|
+
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
@@ -0,0 +1,96 @@
|
|
1
|
+
#Author: Piotr Wojcieszonek
|
2
|
+
#e-mail: piotr@wojcieszonek.pl
|
3
|
+
# Copyright 22.12.2017 by Piotr Wojcieszonek
|
4
|
+
|
5
|
+
require 'lib/bootp'
|
6
|
+
require 'forwardable'
|
7
|
+
|
8
|
+
|
9
|
+
module Lib
|
10
|
+
module DHCP
|
11
|
+
class Packet < Lib::BOOTP::Packet
|
12
|
+
|
13
|
+
MAGICK_COOKIE = 0x63825363
|
14
|
+
|
15
|
+
(1..254).each do |i|
|
16
|
+
|
17
|
+
define_method("option#{i}") do
|
18
|
+
self.options.select(i.to_i).first
|
19
|
+
end
|
20
|
+
|
21
|
+
define_method("option#{i}=") do |payload|
|
22
|
+
self.options.del(i) if self.options.select(i)
|
23
|
+
if payload.is_a? Lib::DHCP::Option
|
24
|
+
self.options.add payload
|
25
|
+
else
|
26
|
+
self.options.add [i,payload]
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
|
32
|
+
def option0
|
33
|
+
self.options.select 0
|
34
|
+
end
|
35
|
+
|
36
|
+
def option255
|
37
|
+
self.options.select 255
|
38
|
+
end
|
39
|
+
|
40
|
+
def to_s
|
41
|
+
str = super()
|
42
|
+
str += "\nMAGICK-COOKIE : 0x#{MAGICK_COOKIE.to_s(16)}"
|
43
|
+
str += "\n\n --- DHCP OPTIONS ---\n"
|
44
|
+
options.each do |o|
|
45
|
+
if o.value.is_a? Array
|
46
|
+
value = o.value.map(&:to_s).join(',')
|
47
|
+
else
|
48
|
+
value = o.value
|
49
|
+
end
|
50
|
+
str += "\nOption #{o.oid.to_s.ljust(3,' ')} : LEN #{o.len.to_s.ljust(3, ' ')} #{o.name.to_s.ljust(40, ' ')} : #{value}"
|
51
|
+
end
|
52
|
+
str += "\n\n"
|
53
|
+
str
|
54
|
+
end
|
55
|
+
|
56
|
+
def options
|
57
|
+
@options ||= Lib::DHCP::Options.new
|
58
|
+
end
|
59
|
+
|
60
|
+
def self.unpack(packet)
|
61
|
+
bootp, cookie, options = packet.unpack('a236Na*')
|
62
|
+
raise RuntimeError, "Magick-Cookie mismatch #{cookie.to_i.to_s(16)}" unless cookie.to_i == MAGICK_COOKIE.to_i
|
63
|
+
dhcp = super bootp
|
64
|
+
dhcp.instance_variable_set(:@options, Lib::DHCP::Options.unpack(options))
|
65
|
+
dhcp
|
66
|
+
end
|
67
|
+
|
68
|
+
def pack
|
69
|
+
# TODO Max Message Size support
|
70
|
+
dhcp_message = super # BOOTP Header
|
71
|
+
dhcp_message += [MAGICK_COOKIE].pack('N')
|
72
|
+
raise ArgumentError, "Can't pack DHCP Packet without DHCP Message Type" if self.option53.nil?
|
73
|
+
dhcp_message += self.option53.pack # Option 53 (DHCP MESSAGE TYPE) must be first in message
|
74
|
+
|
75
|
+
len = 240 # 236 BOOTP HEADER + 3 (Option 53) + 1 (Option 255)
|
76
|
+
self.options.each do |option|
|
77
|
+
unless option.oid.to_i == 0 or option.oid.to_i == 255 or option.oid.to_i == 53
|
78
|
+
# TODO Pack RAW Option
|
79
|
+
# TODO Need to test RAW Option packing
|
80
|
+
# next if option.is_a? Lib::DHCP::Option::Type::Raw # Don't pack not implemented Option type
|
81
|
+
dhcp_message += option.pack
|
82
|
+
len += (option.len.to_i + 2) # Option ID + Option LEN + Option PAYLOAD
|
83
|
+
end
|
84
|
+
end
|
85
|
+
dhcp_message += Lib::DHCP::Option255.new.pack
|
86
|
+
while len < 300 # Minimal DHCP MESSAGE SIZE
|
87
|
+
dhcp_message += Lib::DHCP::Option0.new.pack
|
88
|
+
len += 1
|
89
|
+
end
|
90
|
+
dhcp_message
|
91
|
+
end
|
92
|
+
|
93
|
+
end
|
94
|
+
|
95
|
+
end
|
96
|
+
end
|