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.
Files changed (296) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +10 -0
  3. data/.travis.yml +13 -0
  4. data/CODE_OF_CONDUCT.md +74 -0
  5. data/Gemfile +6 -0
  6. data/LICENSE.txt +21 -0
  7. data/README.md +33 -0
  8. data/Rakefile +10 -0
  9. data/bin/console +14 -0
  10. data/bin/setup +8 -0
  11. data/exe/dhcp_dump +83 -0
  12. data/lib-dhcp.gemspec +31 -0
  13. data/lib/lib/dhcp.rb +276 -0
  14. data/lib/lib/dhcp/exception.rb +34 -0
  15. data/lib/lib/dhcp/messages/ack.rb +65 -0
  16. data/lib/lib/dhcp/messages/decline.rb +77 -0
  17. data/lib/lib/dhcp/messages/discover.rb +70 -0
  18. data/lib/lib/dhcp/messages/inform.rb +64 -0
  19. data/lib/lib/dhcp/messages/lease_active.rb +65 -0
  20. data/lib/lib/dhcp/messages/lease_query.rb +64 -0
  21. data/lib/lib/dhcp/messages/lease_unassigned.rb +64 -0
  22. data/lib/lib/dhcp/messages/lease_unknown.rb +64 -0
  23. data/lib/lib/dhcp/messages/message.rb +285 -0
  24. data/lib/lib/dhcp/messages/nack.rb +64 -0
  25. data/lib/lib/dhcp/messages/offer.rb +74 -0
  26. data/lib/lib/dhcp/messages/release.rb +64 -0
  27. data/lib/lib/dhcp/messages/request.rb +71 -0
  28. data/lib/lib/dhcp/options.rb +73 -0
  29. data/lib/lib/dhcp/options/option.rb +249 -0
  30. data/lib/lib/dhcp/options/option0.rb +34 -0
  31. data/lib/lib/dhcp/options/option1.rb +24 -0
  32. data/lib/lib/dhcp/options/option10.rb +20 -0
  33. data/lib/lib/dhcp/options/option100.rb +17 -0
  34. data/lib/lib/dhcp/options/option101.rb +17 -0
  35. data/lib/lib/dhcp/options/option102.rb +17 -0
  36. data/lib/lib/dhcp/options/option103.rb +17 -0
  37. data/lib/lib/dhcp/options/option104.rb +17 -0
  38. data/lib/lib/dhcp/options/option105.rb +17 -0
  39. data/lib/lib/dhcp/options/option106.rb +17 -0
  40. data/lib/lib/dhcp/options/option107.rb +17 -0
  41. data/lib/lib/dhcp/options/option108.rb +17 -0
  42. data/lib/lib/dhcp/options/option109.rb +17 -0
  43. data/lib/lib/dhcp/options/option11.rb +20 -0
  44. data/lib/lib/dhcp/options/option110.rb +17 -0
  45. data/lib/lib/dhcp/options/option111.rb +17 -0
  46. data/lib/lib/dhcp/options/option112.rb +17 -0
  47. data/lib/lib/dhcp/options/option113.rb +17 -0
  48. data/lib/lib/dhcp/options/option114.rb +17 -0
  49. data/lib/lib/dhcp/options/option115.rb +17 -0
  50. data/lib/lib/dhcp/options/option116.rb +17 -0
  51. data/lib/lib/dhcp/options/option117.rb +17 -0
  52. data/lib/lib/dhcp/options/option118.rb +17 -0
  53. data/lib/lib/dhcp/options/option119.rb +17 -0
  54. data/lib/lib/dhcp/options/option12.rb +20 -0
  55. data/lib/lib/dhcp/options/option120.rb +17 -0
  56. data/lib/lib/dhcp/options/option121.rb +17 -0
  57. data/lib/lib/dhcp/options/option122.rb +341 -0
  58. data/lib/lib/dhcp/options/option123.rb +17 -0
  59. data/lib/lib/dhcp/options/option124.rb +17 -0
  60. data/lib/lib/dhcp/options/option125.rb +17 -0
  61. data/lib/lib/dhcp/options/option126.rb +17 -0
  62. data/lib/lib/dhcp/options/option127.rb +17 -0
  63. data/lib/lib/dhcp/options/option128.rb +17 -0
  64. data/lib/lib/dhcp/options/option129.rb +17 -0
  65. data/lib/lib/dhcp/options/option13.rb +43 -0
  66. data/lib/lib/dhcp/options/option130.rb +17 -0
  67. data/lib/lib/dhcp/options/option131.rb +17 -0
  68. data/lib/lib/dhcp/options/option132.rb +17 -0
  69. data/lib/lib/dhcp/options/option133.rb +17 -0
  70. data/lib/lib/dhcp/options/option134.rb +17 -0
  71. data/lib/lib/dhcp/options/option135.rb +17 -0
  72. data/lib/lib/dhcp/options/option136.rb +17 -0
  73. data/lib/lib/dhcp/options/option137.rb +17 -0
  74. data/lib/lib/dhcp/options/option138.rb +17 -0
  75. data/lib/lib/dhcp/options/option139.rb +17 -0
  76. data/lib/lib/dhcp/options/option14.rb +21 -0
  77. data/lib/lib/dhcp/options/option140.rb +17 -0
  78. data/lib/lib/dhcp/options/option141.rb +17 -0
  79. data/lib/lib/dhcp/options/option142.rb +17 -0
  80. data/lib/lib/dhcp/options/option143.rb +17 -0
  81. data/lib/lib/dhcp/options/option144.rb +17 -0
  82. data/lib/lib/dhcp/options/option145.rb +17 -0
  83. data/lib/lib/dhcp/options/option146.rb +17 -0
  84. data/lib/lib/dhcp/options/option147.rb +17 -0
  85. data/lib/lib/dhcp/options/option148.rb +17 -0
  86. data/lib/lib/dhcp/options/option149.rb +17 -0
  87. data/lib/lib/dhcp/options/option15.rb +20 -0
  88. data/lib/lib/dhcp/options/option150.rb +17 -0
  89. data/lib/lib/dhcp/options/option151.rb +17 -0
  90. data/lib/lib/dhcp/options/option152.rb +17 -0
  91. data/lib/lib/dhcp/options/option153.rb +17 -0
  92. data/lib/lib/dhcp/options/option154.rb +17 -0
  93. data/lib/lib/dhcp/options/option155.rb +17 -0
  94. data/lib/lib/dhcp/options/option156.rb +17 -0
  95. data/lib/lib/dhcp/options/option157.rb +17 -0
  96. data/lib/lib/dhcp/options/option158.rb +17 -0
  97. data/lib/lib/dhcp/options/option159.rb +17 -0
  98. data/lib/lib/dhcp/options/option16.rb +19 -0
  99. data/lib/lib/dhcp/options/option160.rb +17 -0
  100. data/lib/lib/dhcp/options/option161.rb +17 -0
  101. data/lib/lib/dhcp/options/option162.rb +17 -0
  102. data/lib/lib/dhcp/options/option163.rb +17 -0
  103. data/lib/lib/dhcp/options/option164.rb +17 -0
  104. data/lib/lib/dhcp/options/option165.rb +17 -0
  105. data/lib/lib/dhcp/options/option166.rb +17 -0
  106. data/lib/lib/dhcp/options/option167.rb +17 -0
  107. data/lib/lib/dhcp/options/option168.rb +17 -0
  108. data/lib/lib/dhcp/options/option169.rb +17 -0
  109. data/lib/lib/dhcp/options/option17.rb +22 -0
  110. data/lib/lib/dhcp/options/option170.rb +17 -0
  111. data/lib/lib/dhcp/options/option171.rb +17 -0
  112. data/lib/lib/dhcp/options/option172.rb +17 -0
  113. data/lib/lib/dhcp/options/option173.rb +17 -0
  114. data/lib/lib/dhcp/options/option174.rb +17 -0
  115. data/lib/lib/dhcp/options/option175.rb +17 -0
  116. data/lib/lib/dhcp/options/option176.rb +17 -0
  117. data/lib/lib/dhcp/options/option177.rb +17 -0
  118. data/lib/lib/dhcp/options/option178.rb +17 -0
  119. data/lib/lib/dhcp/options/option179.rb +17 -0
  120. data/lib/lib/dhcp/options/option18.rb +23 -0
  121. data/lib/lib/dhcp/options/option180.rb +17 -0
  122. data/lib/lib/dhcp/options/option181.rb +17 -0
  123. data/lib/lib/dhcp/options/option182.rb +17 -0
  124. data/lib/lib/dhcp/options/option183.rb +17 -0
  125. data/lib/lib/dhcp/options/option184.rb +17 -0
  126. data/lib/lib/dhcp/options/option185.rb +17 -0
  127. data/lib/lib/dhcp/options/option186.rb +17 -0
  128. data/lib/lib/dhcp/options/option187.rb +17 -0
  129. data/lib/lib/dhcp/options/option188.rb +17 -0
  130. data/lib/lib/dhcp/options/option189.rb +17 -0
  131. data/lib/lib/dhcp/options/option19.rb +20 -0
  132. data/lib/lib/dhcp/options/option190.rb +17 -0
  133. data/lib/lib/dhcp/options/option191.rb +17 -0
  134. data/lib/lib/dhcp/options/option192.rb +17 -0
  135. data/lib/lib/dhcp/options/option193.rb +17 -0
  136. data/lib/lib/dhcp/options/option194.rb +17 -0
  137. data/lib/lib/dhcp/options/option195.rb +17 -0
  138. data/lib/lib/dhcp/options/option196.rb +17 -0
  139. data/lib/lib/dhcp/options/option197.rb +17 -0
  140. data/lib/lib/dhcp/options/option198.rb +17 -0
  141. data/lib/lib/dhcp/options/option199.rb +17 -0
  142. data/lib/lib/dhcp/options/option2.rb +45 -0
  143. data/lib/lib/dhcp/options/option20.rb +22 -0
  144. data/lib/lib/dhcp/options/option200.rb +17 -0
  145. data/lib/lib/dhcp/options/option201.rb +17 -0
  146. data/lib/lib/dhcp/options/option202.rb +17 -0
  147. data/lib/lib/dhcp/options/option203.rb +17 -0
  148. data/lib/lib/dhcp/options/option204.rb +17 -0
  149. data/lib/lib/dhcp/options/option205.rb +17 -0
  150. data/lib/lib/dhcp/options/option206.rb +17 -0
  151. data/lib/lib/dhcp/options/option207.rb +17 -0
  152. data/lib/lib/dhcp/options/option208.rb +17 -0
  153. data/lib/lib/dhcp/options/option209.rb +17 -0
  154. data/lib/lib/dhcp/options/option21.rb +87 -0
  155. data/lib/lib/dhcp/options/option210.rb +17 -0
  156. data/lib/lib/dhcp/options/option211.rb +17 -0
  157. data/lib/lib/dhcp/options/option212.rb +17 -0
  158. data/lib/lib/dhcp/options/option213.rb +17 -0
  159. data/lib/lib/dhcp/options/option214.rb +17 -0
  160. data/lib/lib/dhcp/options/option215.rb +17 -0
  161. data/lib/lib/dhcp/options/option216.rb +17 -0
  162. data/lib/lib/dhcp/options/option217.rb +17 -0
  163. data/lib/lib/dhcp/options/option218.rb +17 -0
  164. data/lib/lib/dhcp/options/option219.rb +17 -0
  165. data/lib/lib/dhcp/options/option22.rb +43 -0
  166. data/lib/lib/dhcp/options/option220.rb +17 -0
  167. data/lib/lib/dhcp/options/option221.rb +17 -0
  168. data/lib/lib/dhcp/options/option222.rb +17 -0
  169. data/lib/lib/dhcp/options/option223.rb +17 -0
  170. data/lib/lib/dhcp/options/option224.rb +17 -0
  171. data/lib/lib/dhcp/options/option225.rb +17 -0
  172. data/lib/lib/dhcp/options/option226.rb +17 -0
  173. data/lib/lib/dhcp/options/option227.rb +17 -0
  174. data/lib/lib/dhcp/options/option228.rb +17 -0
  175. data/lib/lib/dhcp/options/option229.rb +17 -0
  176. data/lib/lib/dhcp/options/option23.rb +44 -0
  177. data/lib/lib/dhcp/options/option230.rb +17 -0
  178. data/lib/lib/dhcp/options/option231.rb +17 -0
  179. data/lib/lib/dhcp/options/option232.rb +17 -0
  180. data/lib/lib/dhcp/options/option233.rb +17 -0
  181. data/lib/lib/dhcp/options/option234.rb +17 -0
  182. data/lib/lib/dhcp/options/option235.rb +17 -0
  183. data/lib/lib/dhcp/options/option236.rb +17 -0
  184. data/lib/lib/dhcp/options/option237.rb +17 -0
  185. data/lib/lib/dhcp/options/option238.rb +17 -0
  186. data/lib/lib/dhcp/options/option239.rb +17 -0
  187. data/lib/lib/dhcp/options/option24.rb +45 -0
  188. data/lib/lib/dhcp/options/option240.rb +17 -0
  189. data/lib/lib/dhcp/options/option241.rb +17 -0
  190. data/lib/lib/dhcp/options/option242.rb +17 -0
  191. data/lib/lib/dhcp/options/option243.rb +17 -0
  192. data/lib/lib/dhcp/options/option244.rb +17 -0
  193. data/lib/lib/dhcp/options/option245.rb +17 -0
  194. data/lib/lib/dhcp/options/option246.rb +17 -0
  195. data/lib/lib/dhcp/options/option247.rb +17 -0
  196. data/lib/lib/dhcp/options/option248.rb +17 -0
  197. data/lib/lib/dhcp/options/option249.rb +17 -0
  198. data/lib/lib/dhcp/options/option25.rb +20 -0
  199. data/lib/lib/dhcp/options/option250.rb +17 -0
  200. data/lib/lib/dhcp/options/option251.rb +17 -0
  201. data/lib/lib/dhcp/options/option252.rb +17 -0
  202. data/lib/lib/dhcp/options/option253.rb +17 -0
  203. data/lib/lib/dhcp/options/option254.rb +17 -0
  204. data/lib/lib/dhcp/options/option255.rb +29 -0
  205. data/lib/lib/dhcp/options/option26.rb +45 -0
  206. data/lib/lib/dhcp/options/option27.rb +16 -0
  207. data/lib/lib/dhcp/options/option28.rb +21 -0
  208. data/lib/lib/dhcp/options/option29.rb +16 -0
  209. data/lib/lib/dhcp/options/option3.rb +22 -0
  210. data/lib/lib/dhcp/options/option30.rb +16 -0
  211. data/lib/lib/dhcp/options/option31.rb +16 -0
  212. data/lib/lib/dhcp/options/option32.rb +18 -0
  213. data/lib/lib/dhcp/options/option33.rb +20 -0
  214. data/lib/lib/dhcp/options/option34.rb +16 -0
  215. data/lib/lib/dhcp/options/option35.rb +43 -0
  216. data/lib/lib/dhcp/options/option36.rb +16 -0
  217. data/lib/lib/dhcp/options/option37.rb +43 -0
  218. data/lib/lib/dhcp/options/option38.rb +43 -0
  219. data/lib/lib/dhcp/options/option39.rb +16 -0
  220. data/lib/lib/dhcp/options/option4.rb +21 -0
  221. data/lib/lib/dhcp/options/option40.rb +18 -0
  222. data/lib/lib/dhcp/options/option41.rb +18 -0
  223. data/lib/lib/dhcp/options/option42.rb +22 -0
  224. data/lib/lib/dhcp/options/option43.rb +16 -0
  225. data/lib/lib/dhcp/options/option44.rb +17 -0
  226. data/lib/lib/dhcp/options/option45.rb +18 -0
  227. data/lib/lib/dhcp/options/option46.rb +43 -0
  228. data/lib/lib/dhcp/options/option47.rb +17 -0
  229. data/lib/lib/dhcp/options/option48.rb +17 -0
  230. data/lib/lib/dhcp/options/option49.rb +17 -0
  231. data/lib/lib/dhcp/options/option5.rb +23 -0
  232. data/lib/lib/dhcp/options/option50.rb +16 -0
  233. data/lib/lib/dhcp/options/option51.rb +43 -0
  234. data/lib/lib/dhcp/options/option52.rb +45 -0
  235. data/lib/lib/dhcp/options/option53.rb +50 -0
  236. data/lib/lib/dhcp/options/option54.rb +16 -0
  237. data/lib/lib/dhcp/options/option55.rb +52 -0
  238. data/lib/lib/dhcp/options/option56.rb +20 -0
  239. data/lib/lib/dhcp/options/option57.rb +52 -0
  240. data/lib/lib/dhcp/options/option58.rb +45 -0
  241. data/lib/lib/dhcp/options/option59.rb +45 -0
  242. data/lib/lib/dhcp/options/option6.rb +23 -0
  243. data/lib/lib/dhcp/options/option60.rb +16 -0
  244. data/lib/lib/dhcp/options/option61.rb +37 -0
  245. data/lib/lib/dhcp/options/option62.rb +16 -0
  246. data/lib/lib/dhcp/options/option63.rb +16 -0
  247. data/lib/lib/dhcp/options/option64.rb +20 -0
  248. data/lib/lib/dhcp/options/option65.rb +17 -0
  249. data/lib/lib/dhcp/options/option66.rb +20 -0
  250. data/lib/lib/dhcp/options/option67.rb +20 -0
  251. data/lib/lib/dhcp/options/option68.rb +19 -0
  252. data/lib/lib/dhcp/options/option69.rb +17 -0
  253. data/lib/lib/dhcp/options/option7.rb +22 -0
  254. data/lib/lib/dhcp/options/option70.rb +17 -0
  255. data/lib/lib/dhcp/options/option71.rb +17 -0
  256. data/lib/lib/dhcp/options/option72.rb +17 -0
  257. data/lib/lib/dhcp/options/option73.rb +17 -0
  258. data/lib/lib/dhcp/options/option74.rb +17 -0
  259. data/lib/lib/dhcp/options/option75.rb +17 -0
  260. data/lib/lib/dhcp/options/option76.rb +17 -0
  261. data/lib/lib/dhcp/options/option77.rb +16 -0
  262. data/lib/lib/dhcp/options/option78.rb +16 -0
  263. data/lib/lib/dhcp/options/option79.rb +16 -0
  264. data/lib/lib/dhcp/options/option8.rb +22 -0
  265. data/lib/lib/dhcp/options/option80.rb +16 -0
  266. data/lib/lib/dhcp/options/option81.rb +16 -0
  267. data/lib/lib/dhcp/options/option82.rb +20 -0
  268. data/lib/lib/dhcp/options/option83.rb +16 -0
  269. data/lib/lib/dhcp/options/option84.rb +16 -0
  270. data/lib/lib/dhcp/options/option85.rb +16 -0
  271. data/lib/lib/dhcp/options/option86.rb +17 -0
  272. data/lib/lib/dhcp/options/option87.rb +16 -0
  273. data/lib/lib/dhcp/options/option88.rb +16 -0
  274. data/lib/lib/dhcp/options/option89.rb +16 -0
  275. data/lib/lib/dhcp/options/option9.rb +21 -0
  276. data/lib/lib/dhcp/options/option90.rb +16 -0
  277. data/lib/lib/dhcp/options/option91.rb +17 -0
  278. data/lib/lib/dhcp/options/option92.rb +17 -0
  279. data/lib/lib/dhcp/options/option93.rb +17 -0
  280. data/lib/lib/dhcp/options/option94.rb +17 -0
  281. data/lib/lib/dhcp/options/option95.rb +17 -0
  282. data/lib/lib/dhcp/options/option96.rb +17 -0
  283. data/lib/lib/dhcp/options/option97.rb +17 -0
  284. data/lib/lib/dhcp/options/option98.rb +17 -0
  285. data/lib/lib/dhcp/options/option99.rb +17 -0
  286. data/lib/lib/dhcp/options/sub_option.rb +32 -0
  287. data/lib/lib/dhcp/options/type/bool.rb +55 -0
  288. data/lib/lib/dhcp/options/type/ip_address.rb +73 -0
  289. data/lib/lib/dhcp/options/type/ip_array.rb +41 -0
  290. data/lib/lib/dhcp/options/type/netmask.rb +56 -0
  291. data/lib/lib/dhcp/options/type/raw.rb +51 -0
  292. data/lib/lib/dhcp/options/type/string.rb +49 -0
  293. data/lib/lib/dhcp/options/type/sub_option.rb +83 -0
  294. data/lib/lib/dhcp/packet.rb +96 -0
  295. data/lib/lib/dhcp/version.rb +5 -0
  296. 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