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,74 @@
|
|
1
|
+
#Author: Piotr Wojcieszonek
|
2
|
+
#e-mail: piotr@wojcieszonek.pl
|
3
|
+
# Copyright 24.03.2016 by Piotr Wojcieszonek
|
4
|
+
|
5
|
+
|
6
|
+
require 'lib/dhcp'
|
7
|
+
|
8
|
+
module Lib
|
9
|
+
module DHCP
|
10
|
+
class Message
|
11
|
+
class Offer < Message
|
12
|
+
def initialize(htype: 1, hlen: 6, hops: 0, xid: nil, secs: 0, flags: 0, ciaddr: 0, yiaddr: 0, siaddr: 0, giaddr: 0, chaddr: , sname: '.', file: '.', options: nil)
|
13
|
+
super(
|
14
|
+
:op => BOOTREPLY,
|
15
|
+
:htype => htype,
|
16
|
+
:hlen => hlen,
|
17
|
+
:hops => hops,
|
18
|
+
:xid => xid,
|
19
|
+
:secs => secs,
|
20
|
+
:flags => flags,
|
21
|
+
:ciaddr => ciaddr,
|
22
|
+
:yiaddr => yiaddr,
|
23
|
+
:siaddr => siaddr,
|
24
|
+
:giaddr => giaddr,
|
25
|
+
:chaddr => chaddr,
|
26
|
+
:sname => sname,
|
27
|
+
:file => file
|
28
|
+
)
|
29
|
+
if options.is_a? Array or options.is_a? Lib::DHCP::Options
|
30
|
+
options.each { |option| self.options.add option unless option.oid.to_i == Option::MESSAGE_TYPE }
|
31
|
+
elsif options.is_a? Lib::DHCP::Option
|
32
|
+
self.options.add options
|
33
|
+
elsif !options.nil?
|
34
|
+
raise TypeError, "Can't convert #{options.class.name} to Lib::DHCP::Option"
|
35
|
+
end
|
36
|
+
self.options.add Lib::DHCP::Option53.new(OFFER)
|
37
|
+
end
|
38
|
+
|
39
|
+
def pack
|
40
|
+
# noinspection RubyResolve
|
41
|
+
self.option53 = OFFER
|
42
|
+
self.op = BOOTREPLY
|
43
|
+
sanity_check
|
44
|
+
super
|
45
|
+
end
|
46
|
+
|
47
|
+
def self.unpack(packet)
|
48
|
+
res = super(packet)
|
49
|
+
raise TypeError, "No implicit conversion of #{res.class.name} into #{self.class.name}" unless res.is_a? self.class
|
50
|
+
res
|
51
|
+
end
|
52
|
+
|
53
|
+
protected :op=
|
54
|
+
# noinspection RubyResolve
|
55
|
+
protected :option53=
|
56
|
+
|
57
|
+
protected
|
58
|
+
def sanity_check
|
59
|
+
raise Lib::DHCP::SanityCheck::Offer, "No YIADDR in DHCP Offer\n #{self.to_s}" if yiaddr.to_i == 0
|
60
|
+
# noinspection RubyResolve
|
61
|
+
raise Lib::DHCP::SanityCheck::Offer, "No Max Lease Time Option set for DHCP Offer Message\n #{self.to_s}" if option51.nil?
|
62
|
+
# noinspection RubyResolve
|
63
|
+
raise Lib::DHCP::SanityCheck::Offer, "No Server Identifier Option set for DHCP Offer Message\n #{self.to_s}" if option54.nil?
|
64
|
+
# noinspection RubyResolve
|
65
|
+
raise Lib::DHCP::SanityCheck::Offer, "Requested IP Address Option set for DHCP Offer Message\n #{self.to_s}" unless option50.nil?
|
66
|
+
# noinspection RubyResolve
|
67
|
+
raise Lib::DHCP::SanityCheck::Offer, "Parameter Request List Option set for DHCP Offer Message\n #{self.to_s}" unless option55.nil?
|
68
|
+
# noinspection RubyResolve
|
69
|
+
raise Lib::DHCP::SanityCheck::Offer, "Maximum Message Size Option set for DHCP Offer Message\n #{self.to_s}" unless option57.nil?
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
#Author: Piotr Wojcieszonek
|
2
|
+
#e-mail: piotr@wojcieszonek.pl
|
3
|
+
# Copyright 25.03.2016 by Piotr Wojcieszonek
|
4
|
+
|
5
|
+
|
6
|
+
require 'lib/dhcp'
|
7
|
+
|
8
|
+
module Lib
|
9
|
+
module DHCP
|
10
|
+
class Message
|
11
|
+
class Release < Message
|
12
|
+
def initialize(htype: 1, hlen: 6, hops: 0, xid: nil, secs: 0, flags: 0, ciaddr: 0, yiaddr: 0, siaddr: 0, giaddr: 0, chaddr: , sname: '.', file: '.', options: nil)
|
13
|
+
super(
|
14
|
+
:op => BOOTREQUEST,
|
15
|
+
:htype => htype,
|
16
|
+
:hlen => hlen,
|
17
|
+
:hops => hops,
|
18
|
+
:xid => xid,
|
19
|
+
:secs => secs,
|
20
|
+
:flags => flags,
|
21
|
+
:ciaddr => ciaddr,
|
22
|
+
:yiaddr => yiaddr,
|
23
|
+
:siaddr => siaddr,
|
24
|
+
:giaddr => giaddr,
|
25
|
+
:chaddr => chaddr,
|
26
|
+
:sname => sname,
|
27
|
+
:file => file
|
28
|
+
)
|
29
|
+
if options.is_a? Array or options.is_a? Lib::DHCP::Options
|
30
|
+
options.each { |option| self.options.add option unless option.oid.to_i == Option::MESSAGE_TYPE }
|
31
|
+
elsif options.is_a? Lib::DHCP::Option
|
32
|
+
self.options.add options
|
33
|
+
elsif !options.nil?
|
34
|
+
raise TypeError, "Can't convert #{options.class.name} to Lib::DHCP::Option"
|
35
|
+
end
|
36
|
+
self.options.add Lib::DHCP::Option53.new(RELEASE)
|
37
|
+
end
|
38
|
+
|
39
|
+
def pack
|
40
|
+
# noinspection RubyResolve
|
41
|
+
self.option53 = RELEASE
|
42
|
+
self.op = BOOTREQUEST
|
43
|
+
sanity_check
|
44
|
+
super
|
45
|
+
end
|
46
|
+
|
47
|
+
def self.unpack(packet)
|
48
|
+
res = super(packet)
|
49
|
+
raise TypeError, "No implicit conversion of #{res.class.name} into #{self.class.name}" unless res.is_a? self.class
|
50
|
+
res
|
51
|
+
end
|
52
|
+
|
53
|
+
protected :op=
|
54
|
+
# noinspection RubyResolve
|
55
|
+
protected :option53=
|
56
|
+
|
57
|
+
protected
|
58
|
+
def sanity_check
|
59
|
+
#TODO Release Sanity Check
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
#Author: Piotr Wojcieszonek
|
2
|
+
#e-mail: piotr@wojcieszonek.pl
|
3
|
+
# Copyright 24.03.2016 by Piotr Wojcieszonek
|
4
|
+
|
5
|
+
|
6
|
+
require 'lib/dhcp'
|
7
|
+
|
8
|
+
module Lib
|
9
|
+
module DHCP
|
10
|
+
class Message
|
11
|
+
class Request < Message
|
12
|
+
def initialize(htype: 1, hlen: 6, hops: 0, xid: nil, secs: 0, flags: 0, ciaddr: 0, yiaddr: 0, siaddr: 0, giaddr: 0, chaddr: , sname: '.', file: '.', options: nil)
|
13
|
+
super(
|
14
|
+
:op => BOOTREQUEST,
|
15
|
+
:htype => htype,
|
16
|
+
:hlen => hlen,
|
17
|
+
:hops => hops,
|
18
|
+
:xid => xid,
|
19
|
+
:secs => secs,
|
20
|
+
:flags => flags,
|
21
|
+
:ciaddr => ciaddr,
|
22
|
+
:yiaddr => yiaddr,
|
23
|
+
:siaddr => siaddr,
|
24
|
+
:giaddr => giaddr,
|
25
|
+
:chaddr => chaddr,
|
26
|
+
:sname => sname,
|
27
|
+
:file => file
|
28
|
+
)
|
29
|
+
if options.is_a? Array or options.is_a? Lib::DHCP::Options
|
30
|
+
options.each { |option| self.options.add option unless option.oid.to_i == Option::MESSAGE_TYPE }
|
31
|
+
elsif options.is_a? Lib::DHCP::Option
|
32
|
+
self.options.add options
|
33
|
+
elsif !options.nil?
|
34
|
+
raise TypeError, "Can't convert #{options.class.name} to Lib::DHCP::Option"
|
35
|
+
end
|
36
|
+
self.options.add Lib::DHCP::Option53.new(REQUEST)
|
37
|
+
end
|
38
|
+
|
39
|
+
def pack
|
40
|
+
# noinspection RubyResolve
|
41
|
+
self.option53 = REQUEST
|
42
|
+
self.op = BOOTREQUEST
|
43
|
+
sanity_check
|
44
|
+
super
|
45
|
+
end
|
46
|
+
|
47
|
+
def self.unpack(packet)
|
48
|
+
res = super(packet)
|
49
|
+
raise TypeError, "No implicit conversion of #{res.class.name} into #{self.class.name}" unless res.is_a? self.class
|
50
|
+
res
|
51
|
+
end
|
52
|
+
|
53
|
+
protected :op=
|
54
|
+
# noinspection RubyResolve
|
55
|
+
protected :option53=
|
56
|
+
|
57
|
+
protected
|
58
|
+
def sanity_check
|
59
|
+
raise Lib::DHCP::SanityCheck::Request, "YIADDR set in DHCP Request Message\n #{self.to_s}" unless yiaddr.to_i == 0
|
60
|
+
raise Lib::DHCP::SanityCheck::Request, "SIADDR set in DHCP Request Message\n #{self.to_s}" unless siaddr.to_i == 0
|
61
|
+
# noinspection RubyResolve
|
62
|
+
if option50.nil?
|
63
|
+
raise Lib::DHCP::SanityCheck::Request, "Not set Requested IP Address nor CIADDR for DHCP Request Message\n #{self.to_s}" if ciaddr.to_i == 0
|
64
|
+
else
|
65
|
+
raise Lib::DHCP::SanityCheck::Request, "Both Requested IP Address and CIADDR set for DHCP Request Message\n #{self.to_s}" unless ciaddr.to_i == 0
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
#Author: Piotr Wojcieszonek
|
2
|
+
#e-mail: piotr@wojcieszonek.pl
|
3
|
+
# Copyright 22.12.2017 by Piotr Wojcieszonek
|
4
|
+
|
5
|
+
require 'forwardable'
|
6
|
+
|
7
|
+
module Lib
|
8
|
+
module DHCP
|
9
|
+
class Options
|
10
|
+
|
11
|
+
attr_reader :options
|
12
|
+
|
13
|
+
extend Forwardable
|
14
|
+
|
15
|
+
def_delegators :@options, :map, :map!, :[], :each
|
16
|
+
|
17
|
+
def initialize(*options)
|
18
|
+
@options = []
|
19
|
+
options.each { |option| self.add option }
|
20
|
+
end
|
21
|
+
|
22
|
+
def pack
|
23
|
+
self.map{|option| option.pack}.join('')
|
24
|
+
end
|
25
|
+
|
26
|
+
def add(option)
|
27
|
+
if option.is_a? Array
|
28
|
+
@options << eval("Lib::DHCP::Option#{option[0]}").new(option[1])
|
29
|
+
elsif option.is_a? Option
|
30
|
+
@options << option
|
31
|
+
else
|
32
|
+
@options << Lib::DHCP::Option.unpack(option)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def []=(index, option)
|
37
|
+
if option.is_a? Array
|
38
|
+
@options[index] = eval("Lib::DHCP::Option#{option[0]}").new(option[1])
|
39
|
+
elsif option.is_a? Option
|
40
|
+
@options[index] = option
|
41
|
+
else
|
42
|
+
@options << Lib::DHCP::Option.unpack(option)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def select(oid)
|
47
|
+
@options.select {|option| option.oid.to_i == oid.to_i}
|
48
|
+
end
|
49
|
+
|
50
|
+
def del(oid)
|
51
|
+
@options.delete_if{|option| option.oid.to_i == oid.to_i}
|
52
|
+
end
|
53
|
+
|
54
|
+
alias_method :<<, :add
|
55
|
+
|
56
|
+
def self.unpack(packet)
|
57
|
+
size = packet.size
|
58
|
+
offset = 0
|
59
|
+
options = self.new
|
60
|
+
while offset < size
|
61
|
+
payload = packet.unpack("@#{offset}a*").first
|
62
|
+
option = Lib::DHCP::Option.unpack(payload)
|
63
|
+
options << option
|
64
|
+
break if option.oid == Lib::DHCP::Option::END_OPTION
|
65
|
+
offset += (option.len.to_i + 2)
|
66
|
+
#(option.oid == 0 or option.oid == 255) ? offset += (option.len.to_i + 1) : offset += (option.len.to_i + 2)
|
67
|
+
end
|
68
|
+
options
|
69
|
+
end
|
70
|
+
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
@@ -0,0 +1,249 @@
|
|
1
|
+
#Author: Piotr Wojcieszonek
|
2
|
+
#e-mail: piotr@wojcieszonek.pl
|
3
|
+
# Copyright 22.12.2017 by Piotr Wojcieszonek
|
4
|
+
|
5
|
+
require 'forwardable'
|
6
|
+
|
7
|
+
|
8
|
+
module Lib
|
9
|
+
module DHCP
|
10
|
+
class Option
|
11
|
+
|
12
|
+
extend Forwardable
|
13
|
+
include Comparable
|
14
|
+
|
15
|
+
def_delegators :@payload, :to_i, :to_s
|
16
|
+
|
17
|
+
attr_reader :oid
|
18
|
+
attr_accessor :payload
|
19
|
+
|
20
|
+
def initialize(oid, payload = nil)
|
21
|
+
@oid = oid
|
22
|
+
@payload = payload
|
23
|
+
end
|
24
|
+
|
25
|
+
def len
|
26
|
+
@len.to_i || 0
|
27
|
+
end
|
28
|
+
|
29
|
+
def <=>(other)
|
30
|
+
other.is_a?(Lib::DHCP::Option) ? self.value <=> other.value : self.value <=> other
|
31
|
+
end
|
32
|
+
|
33
|
+
def pack
|
34
|
+
@payload = '' if @value.nil?
|
35
|
+
[@oid, @len, @payload.to_s].pack("C2a#{@len.to_i}")
|
36
|
+
end
|
37
|
+
|
38
|
+
|
39
|
+
def to_s
|
40
|
+
@payload.to_s.unpack('C*').map{|item| item.to_i.to_s(16).rjust(2, '0') }.join(':')
|
41
|
+
end
|
42
|
+
|
43
|
+
def name
|
44
|
+
return 'Unknown Option Name' unless NAME.include? @oid.to_i
|
45
|
+
NAME[@oid.to_i]
|
46
|
+
end
|
47
|
+
|
48
|
+
def self.unpack(packet)
|
49
|
+
oid, len = packet.unpack('C2')
|
50
|
+
payload = nil
|
51
|
+
payload = packet.to_s.unpack("@2a#{len.to_s}").first unless oid.to_i == 0 or oid.to_i == 255
|
52
|
+
len = 0 if oid.to_i == 0 or oid.to_i == 255
|
53
|
+
raise ArgumentError "Wrong OID format for DHCP Option - #{oid}" unless oid.respond_to? :to_i
|
54
|
+
raise ArgumentError "Wrong OID for DHCP Option = #{oid}" unless oid.to_i >= 0 and oid.to_i < 256
|
55
|
+
begin
|
56
|
+
eval("Option#{oid.to_i.to_s}").send(:unpack, oid, len, payload.to_s)
|
57
|
+
rescue ArgumentError => e
|
58
|
+
raise ArgumentError, "OPTION #{oid} : #{e.message}"
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
alias_method :value, :payload
|
63
|
+
alias_method :value=, :payload=
|
64
|
+
|
65
|
+
PAD = 0x00
|
66
|
+
SUBNET_MASK = 0x01
|
67
|
+
TIME_OFFSET = 0x02
|
68
|
+
ROUTER = 0x03
|
69
|
+
TIME_SERVER = 0x04
|
70
|
+
NAME_SERVER = 0x05
|
71
|
+
DNS_SERVER = 0x06
|
72
|
+
LOG_SERVER = 0x07
|
73
|
+
COOKIE_SERVER = 0x08
|
74
|
+
QUOTE_SERVER = 0x08
|
75
|
+
LPR_SERVER = 0x09
|
76
|
+
IMP_SERVER = 0x0a
|
77
|
+
RES_SERVER = 0x0b
|
78
|
+
HOSTNAME = 0x0c
|
79
|
+
BOOT_FILE_SIZE = 0x0d
|
80
|
+
DUMP_FILE = 0x0e
|
81
|
+
DOMAIN_NAME = 0x0f
|
82
|
+
SWAP_SERVER = 0x10
|
83
|
+
ROOT_PATH = 0x11
|
84
|
+
EXTENSION_PATH = 0x12
|
85
|
+
IP_FORWARD = 0x13
|
86
|
+
SRC_ROUTE = 0x14
|
87
|
+
POLICY_FILTER = 0x15
|
88
|
+
MAX_REASSEMBLE_SIZE = 0x16
|
89
|
+
IP_TTL = 0x17
|
90
|
+
MTU_TIMEOUT = 0x18
|
91
|
+
MTU_TABLE = 0x19
|
92
|
+
MTU_SIZE = 0x1a
|
93
|
+
LOCAL_SUBNETS = 0x1b
|
94
|
+
BROADCAST_ADDR = 0x1c
|
95
|
+
DO_MASK_DISCOVER = 0x1d
|
96
|
+
MASK_SUPPLY = 0x1e
|
97
|
+
DO_ROUTE_DISCOVER = 0x1f
|
98
|
+
ROUTER_SOLICIT = 0x20
|
99
|
+
STATIC_ROUTE = 0x21
|
100
|
+
TRAILER_ENCAPSULATION = 0x22
|
101
|
+
ARP_TIMEOUT = 0x23
|
102
|
+
ETHERNET_ENCAPSULATION = 0x24
|
103
|
+
TCP_TTL = 0x25
|
104
|
+
TCP_KEEP_ALIVE = 0x26
|
105
|
+
TCP_ALIVE_GARBAGE =0x27
|
106
|
+
NIS_DOMAIN = 0x28
|
107
|
+
NIS_SERVERS = 0x29
|
108
|
+
NIS_TIME_SERVER = 0x2a
|
109
|
+
VENDOR_SPECIFIC = 0x2b
|
110
|
+
NBNS = 0x2c
|
111
|
+
NBDD= 0x2d
|
112
|
+
NETBIOS_TCP_IP= 0x2e
|
113
|
+
NETBIOS_TCP_SCOPE= 0x2f
|
114
|
+
XFONT= 0x30
|
115
|
+
XDISPLAY_MANAGER= 0x31
|
116
|
+
REQUESTED_ADDRESS= 0x32
|
117
|
+
LEASE_TIME= 0x33
|
118
|
+
OPTION_OVERLOAD= 0x34
|
119
|
+
MESSAGE_TYPE= 0x35
|
120
|
+
SERVER_IDENTIFIER= 0x36
|
121
|
+
PARAMETER_REQUEST= 0x37
|
122
|
+
MESSAGE= 0x38
|
123
|
+
MAX_MESSAGE_SIZE= 0x39
|
124
|
+
RENEW_TIME= 0x3a
|
125
|
+
REBIND_TIME= 0x3b
|
126
|
+
VENDOR_CLASS_IDENTIFIER= 0x3c
|
127
|
+
CLIENT_IDENTIFIER= 0x3d
|
128
|
+
NIS_DOMAIN_NAME= 0x40
|
129
|
+
NIS_SERVER= 0x41
|
130
|
+
TFTP_SERVER= 0x42
|
131
|
+
BOOT_FILE_NAME= 0x43
|
132
|
+
MOBILE_IP_AGENT= 0x44
|
133
|
+
SMTP_SERVER= 0x45
|
134
|
+
POP3_SERVER= 0x46
|
135
|
+
NNTP_SERVER= 0x47
|
136
|
+
WWW_SERVER= 0x48
|
137
|
+
FINGER_SERVER= 0x49
|
138
|
+
IRC_SERVER= 0x4a
|
139
|
+
STREET_TALK_SERVER= 0x4b
|
140
|
+
STREET_TALK_DIRECTORY_SERVER= 0x4c
|
141
|
+
USER_CLASS= 0x4d
|
142
|
+
RELAY_AGENT = 0x52
|
143
|
+
PRIVATE= 0xaf
|
144
|
+
END_OPTION = 0xff
|
145
|
+
|
146
|
+
NAME ={
|
147
|
+
0 => 'Pad',
|
148
|
+
1 => 'Subnet Mask',
|
149
|
+
2 => 'Time Offset',
|
150
|
+
3 => 'Router Option',
|
151
|
+
4 => 'Time Server Option',
|
152
|
+
5 => 'Name Server Option',
|
153
|
+
6 => 'Domain Name Server Option',
|
154
|
+
7 => 'Log Server Option',
|
155
|
+
8 => 'Cookie Server Option',
|
156
|
+
9 => 'LPR Server Option',
|
157
|
+
10 => 'Impress Server Option',
|
158
|
+
11 => 'Resource Location Server Option',
|
159
|
+
12 => 'Host Name Option',
|
160
|
+
13 => 'Boot File Size Option',
|
161
|
+
14 => 'Merit Dump File',
|
162
|
+
15 => 'Domain Name',
|
163
|
+
16 => 'Swap Server',
|
164
|
+
17 => 'Root Path',
|
165
|
+
18 => 'Extensions Path',
|
166
|
+
19 => 'IP Forwarding Enable/Disable Option',
|
167
|
+
20 => 'Non-Local Source Routing Enable/Disable Option',
|
168
|
+
21 => 'Policy Filter Option',
|
169
|
+
22 => 'Maximum Datagram Reassembly Size',
|
170
|
+
23 => 'Default IP Time-to-live',
|
171
|
+
24 => 'Path MTU Plateau Table Option',
|
172
|
+
25 => 'IP Layer Parameters per Interface',
|
173
|
+
26 => 'Interface MTU Option',
|
174
|
+
27 => 'All Subnets are Local Option',
|
175
|
+
28 => 'Broadcast Address Option',
|
176
|
+
29 => 'Perform Mask Discovery Option',
|
177
|
+
30 => 'Mask Supplier Option',
|
178
|
+
31 => 'Perform Router Discovery Option',
|
179
|
+
32 => 'Router Solicitation Address Option',
|
180
|
+
33 => 'Static Route Option',
|
181
|
+
34 => 'Trailer Encapsulation Option',
|
182
|
+
35 => 'ARP Cache Timeout Option',
|
183
|
+
36 => 'Ethernet Encapsulation Option',
|
184
|
+
37 => 'TCP Default TTL Option',
|
185
|
+
38 => 'TCP Keepalive Interval Option',
|
186
|
+
39 => 'TCP Keepalive Garbage Option',
|
187
|
+
40 => 'Network Information Service Domain Option',
|
188
|
+
41 => 'Network Information Servers Option',
|
189
|
+
42 => 'Network Time Protocol Servers Option',
|
190
|
+
43 => 'Vendor Specific Information',
|
191
|
+
44 => 'NetBIOS over TCP/IP Name Server Option',
|
192
|
+
45 => 'NetBIOS over TCP/IP Datagram Distribution Server Option',
|
193
|
+
46 => 'NetBIOS over TCP/IP Node Type Option',
|
194
|
+
47 => 'NetBIOS over TCP/IP Scope Option',
|
195
|
+
48 => 'X Window System Font Server Option',
|
196
|
+
49 => 'X Window System Display Manager Option',
|
197
|
+
50 => 'Requested IP Address',
|
198
|
+
51 => 'IP Address Lease Time',
|
199
|
+
52 => 'Option Overload',
|
200
|
+
53 => 'DHCP Message Type',
|
201
|
+
54 => 'Server Identifier',
|
202
|
+
55 => 'Parameter Request List',
|
203
|
+
56 => 'Message',
|
204
|
+
57 => 'Maximum DHCP Message Size',
|
205
|
+
58 => 'Renewal (T1) Time Value',
|
206
|
+
59 => 'Rebinding (T2) Time Value',
|
207
|
+
60 => 'Vendor class identifier',
|
208
|
+
61 => 'Client-identifier',
|
209
|
+
62 => 'NetWare/IP Domain Name',
|
210
|
+
63 => 'NetWare/IP information',
|
211
|
+
64 => 'Network Information Service+ Domain Option',
|
212
|
+
65 => 'Network Information Service+ Servers Option',
|
213
|
+
66 => 'TFTP server name',
|
214
|
+
67 => 'Bootfile name',
|
215
|
+
68 => 'Mobile IP Home Agent option',
|
216
|
+
69 => 'Simple Mail Transport Protocol (SMTP) Server Option',
|
217
|
+
70 => 'Post Office Protocol (POP3) Server Option',
|
218
|
+
71 => 'Network News Transport Protocol (NNTP) Server Option',
|
219
|
+
72 => 'Default World Wide Web (WWW) Server Option',
|
220
|
+
73 => 'Default Finger Server Option',
|
221
|
+
74 => 'Default Internet Relay Chat (IRC) Server Option',
|
222
|
+
75 => 'StreetTalk Server Option',
|
223
|
+
76 => 'StreetTalk Directory Assistance (STDA) Server Option',
|
224
|
+
77 => 'User Class Information',
|
225
|
+
78 => 'SLP Directory Agent',
|
226
|
+
79 => 'SLP Service Scope',
|
227
|
+
80 => 'Rapid Commit',
|
228
|
+
81 => 'FQDN, Fully Qualified Domain Name',
|
229
|
+
82 => 'Relay Agent Information',
|
230
|
+
83 => 'Internet Storage Name Service',
|
231
|
+
84 => '',
|
232
|
+
85 => 'NDS servers',
|
233
|
+
86 => 'NDS tree name',
|
234
|
+
87 => 'NDS context',
|
235
|
+
88 => 'BCMCS Controller Domain Name list',
|
236
|
+
89 => 'BCMCS Controller IPv4 address list.',
|
237
|
+
90 => 'Authentication',
|
238
|
+
91 => 'client-last-transaction-time',
|
239
|
+
92 => 'associated-ip',
|
240
|
+
93 => 'Client System Architecture Type',
|
241
|
+
119 => 'Domain Search',
|
242
|
+
121 => 'Classless Static Route Option',
|
243
|
+
122 => 'CCC, CableLabs Client Configuration',
|
244
|
+
125 => 'Vendor-Identifying Vendor Options',
|
245
|
+
255 => 'END'
|
246
|
+
}
|
247
|
+
end
|
248
|
+
end
|
249
|
+
end
|