Class: Lib::DHCP::Packet
- Inherits:
-
BOOTP::Packet
- Object
- BOOTP::Packet
- Lib::DHCP::Packet
- Defined in:
- lib/lib/dhcp/packet.rb
Direct Known Subclasses
Constant Summary collapse
- MAGICK_COOKIE =
0x63825363
Class Method Summary collapse
Instance Method Summary collapse
- #option0 ⇒ Object
- #option255 ⇒ Object
- #options ⇒ Object
- #options=(opt) ⇒ Object
-
#pack ⇒ Object
def self.from_json(json) #json = json.is_a?(Hash) ? json : JSON.parse(json) super #self.options = json end.
- #to_h ⇒ Object
- #to_s ⇒ Object
Class Method Details
.unpack(packet) ⇒ Object
74 75 76 77 78 79 80 |
# File 'lib/lib/dhcp/packet.rb', line 74 def self.unpack(packet) bootp, , = packet.unpack('a236Na*') raise RuntimeError, "Magick-Cookie mismatch #{.to_i.to_s(16)}" unless .to_i == MAGICK_COOKIE.to_i dhcp = super bootp dhcp.instance_variable_set(:@options, Lib::DHCP::Options.unpack()) dhcp end |
Instance Method Details
#option0 ⇒ Object
36 37 38 |
# File 'lib/lib/dhcp/packet.rb', line 36 def option0 self..select 0 end |
#option255 ⇒ Object
40 41 42 |
# File 'lib/lib/dhcp/packet.rb', line 40 def option255 self..select 255 end |
#options ⇒ Object
60 61 62 |
# File 'lib/lib/dhcp/packet.rb', line 60 def @options ||= Lib::DHCP::Options.new end |
#options=(opt) ⇒ Object
64 65 66 67 68 69 70 71 72 |
# File 'lib/lib/dhcp/packet.rb', line 64 def (opt) if opt.respond_to? :each opt.each do |option| self..add(option) end else self..add opt end end |
#pack ⇒ Object
def self.from_json(json)
#json = json.is_a?(Hash) ? json : JSON.parse(json)
super
#self.options = json['options']
end
88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 |
# File 'lib/lib/dhcp/packet.rb', line 88 def pack # TODO Max Message Size support = super # BOOTP Header += [MAGICK_COOKIE].pack('N') raise ArgumentError, "Can't pack DHCP Packet without DHCP Message Type" if self.option53.nil? += self.option53.pack # Option 53 (DHCP MESSAGE TYPE) must be first in message len = 240 # 236 BOOTP HEADER + 3 (Option 53) + 1 (Option 255) self..each do |option| unless option.oid.to_i == 0 or option.oid.to_i == 255 or option.oid.to_i == 53 # TODO Pack RAW Option # TODO Need to test RAW Option packing # next if option.is_a? Lib::DHCP::Option::Type::Raw # Don't pack not implemented Option type += option.pack len += (option.len.to_i + 2) # Option ID + Option LEN + Option PAYLOAD end end += Lib::DHCP::Option255.new.pack while len < 300 # Minimal DHCP MESSAGE SIZE += Lib::DHCP::Option0.new.pack len += 1 end end |
#to_h ⇒ Object
32 33 34 |
# File 'lib/lib/dhcp/packet.rb', line 32 def to_h super.merge({ options: self..map(&:to_h) }) end |
#to_s ⇒ Object
44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
# File 'lib/lib/dhcp/packet.rb', line 44 def to_s str = super() str += "\nMAGICK-COOKIE : 0x#{MAGICK_COOKIE.to_s(16)}" str += "\n\n --- DHCP OPTIONS ---\n" .each do |o| if o.value.is_a? Array value = o.value.map(&:to_s).join(',') else value = o.value end str += "\nOption #{o.oid.to_s.ljust(3,' ')} : LEN #{o.len.to_s.ljust(3, ' ')} #{o.name.to_s.ljust(40, ' ')} : #{value}" end str += "\n\n" str end |