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,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