lib-dhcp 0.1.4 → 0.2.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 +4 -4
- data/.github/workflows/gem-push.yml +19 -6
- data/.github/workflows/run-test.yml +20 -0
- data/.ruby-version +1 -1
- data/lib/lib/dhcp/messages/ack.rb +14 -9
- data/lib/lib/dhcp/messages/decline.rb +14 -9
- data/lib/lib/dhcp/messages/discover.rb +13 -9
- data/lib/lib/dhcp/messages/inform.rb +13 -9
- data/lib/lib/dhcp/messages/lease_active.rb +13 -9
- data/lib/lib/dhcp/messages/lease_query.rb +13 -10
- data/lib/lib/dhcp/messages/lease_unassigned.rb +13 -9
- data/lib/lib/dhcp/messages/lease_unknown.rb +13 -9
- data/lib/lib/dhcp/messages/message.rb +0 -5
- data/lib/lib/dhcp/messages/nack.rb +13 -9
- data/lib/lib/dhcp/messages/offer.rb +13 -9
- data/lib/lib/dhcp/messages/release.rb +13 -9
- data/lib/lib/dhcp/messages/request.rb +13 -9
- data/lib/lib/dhcp/options/option.rb +18 -0
- data/lib/lib/dhcp/options/option53.rb +0 -2
- data/lib/lib/dhcp/options.rb +14 -4
- data/lib/lib/dhcp/packet.rb +20 -0
- data/lib/lib/dhcp/version.rb +1 -1
- data/lib-dhcp.gemspec +2 -2
- metadata +11 -10
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 43a9da83b7dd82429f766e5d142f0918a2f5bd823695d54583e04e8be6293bd4
|
4
|
+
data.tar.gz: 3b5b782fddf0c68f0949ebf02b3e5d5f5c7cc3b1c04a5a21cd8a4c248be42c24
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8c099424600a5bf373a0518ca8f5ad0687db9a42ee7f1f687664826bce04d193b38812238334e6a0ce11eec93a0d2eb4ea1996df657fd2989a9ed48830dd3edf
|
7
|
+
data.tar.gz: 99e3916d6e1a28792408f4885528ba1b00573aff88bef6336ed6033eb1818a83ea00d59cfbfd371811306100817c57b0c86dc98ee75be6a32925c46d57b9807b
|
@@ -1,20 +1,33 @@
|
|
1
1
|
name: Ruby Gem
|
2
|
+
|
2
3
|
on:
|
3
4
|
push:
|
4
|
-
branches:
|
5
|
-
|
6
|
-
|
5
|
+
branches:
|
6
|
+
- master
|
7
|
+
|
7
8
|
jobs:
|
8
|
-
|
9
|
-
|
9
|
+
create-tag:
|
10
|
+
runs-on: ubuntu-latest
|
11
|
+
steps:
|
12
|
+
- uses: actions/checkout@v3
|
13
|
+
|
14
|
+
- name: Create Git tag
|
15
|
+
run: |
|
16
|
+
VERSION=$(ruby -e "require 'rubygems'; spec = Gem::Specification.load(Dir.glob('*.gemspec').first); puts spec.version")
|
17
|
+
git tag v$VERSION
|
18
|
+
git push origin v$VERSION
|
19
|
+
|
20
|
+
build-and-publish:
|
10
21
|
runs-on: ubuntu-latest
|
11
22
|
permissions:
|
12
23
|
contents: read
|
13
24
|
packages: write
|
14
25
|
steps:
|
15
26
|
- uses: actions/checkout@v3
|
27
|
+
|
16
28
|
- name: Set up Ruby
|
17
29
|
uses: ruby/setup-ruby@v1
|
30
|
+
|
18
31
|
- name: Publish to RubyGems
|
19
32
|
run: |
|
20
33
|
mkdir -p $HOME/.gem
|
@@ -24,4 +37,4 @@ jobs:
|
|
24
37
|
gem build *.gemspec
|
25
38
|
gem push *.gem
|
26
39
|
env:
|
27
|
-
GEM_HOST_API_KEY: "${{secrets.RUBYGEMS_AUTH_TOKEN}}"
|
40
|
+
GEM_HOST_API_KEY: "${{secrets.RUBYGEMS_AUTH_TOKEN}}"
|
@@ -0,0 +1,20 @@
|
|
1
|
+
name: Run Tests
|
2
|
+
|
3
|
+
on: [ push, pull_request ]
|
4
|
+
|
5
|
+
jobs:
|
6
|
+
test:
|
7
|
+
runs-on: ubuntu-latest
|
8
|
+
|
9
|
+
steps:
|
10
|
+
- name: Checkout code
|
11
|
+
uses: actions/checkout@v3
|
12
|
+
|
13
|
+
- name: Set up Ruby
|
14
|
+
uses: ruby/setup-ruby@v1
|
15
|
+
|
16
|
+
- name: Install dependencies
|
17
|
+
run: bundle install
|
18
|
+
|
19
|
+
- name: Run tests
|
20
|
+
run: bundle exec rake test
|
data/.ruby-version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
truffleruby-22.3.1
|
@@ -4,13 +4,17 @@
|
|
4
4
|
|
5
5
|
|
6
6
|
require 'lib/dhcp'
|
7
|
+
require 'json'
|
7
8
|
|
8
9
|
module Lib
|
9
10
|
module DHCP
|
10
11
|
class Message
|
11
12
|
class ACK < 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
|
-
|
13
|
+
def initialize(htype: 1, hlen: 6, hops: 0, xid: nil, secs: 0, flags: 0, ciaddr: 0, yiaddr: 0, siaddr: 0, giaddr: 0, chaddr: 0, sname: '.', file: '.', options: nil)
|
14
|
+
if block_given?
|
15
|
+
yield self
|
16
|
+
else
|
17
|
+
super(
|
14
18
|
:op => BOOTREPLY,
|
15
19
|
:htype => htype,
|
16
20
|
:hlen => hlen,
|
@@ -25,13 +29,14 @@ module Lib
|
|
25
29
|
:chaddr => chaddr,
|
26
30
|
:sname => sname,
|
27
31
|
:file => file
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
32
|
+
)
|
33
|
+
if options.is_a? Array or options.is_a? Lib::DHCP::Options
|
34
|
+
options.each { |option| self.options.add option unless option.oid.to_i == Option::MESSAGE_TYPE }
|
35
|
+
elsif options.is_a? Lib::DHCP::Option
|
36
|
+
self.options.add options
|
37
|
+
elsif !options.nil?
|
38
|
+
raise TypeError, "Can't convert #{options.class.name} to Lib::DHCP::Option"
|
39
|
+
end
|
35
40
|
end
|
36
41
|
|
37
42
|
self.options.add Lib::DHCP::Option53.new(ACKNOWLEDGE)
|
@@ -9,8 +9,11 @@ module Lib
|
|
9
9
|
module DHCP
|
10
10
|
class Message
|
11
11
|
class Decline < 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
|
-
|
12
|
+
def initialize(htype: 1, hlen: 6, hops: 0, xid: nil, secs: 0, flags: 0, ciaddr: 0, yiaddr: 0, siaddr: 0, giaddr: 0, chaddr: 0, sname: '.', file: '.', options: nil)
|
13
|
+
if block_given?
|
14
|
+
yield self
|
15
|
+
else
|
16
|
+
super(
|
14
17
|
:op => BOOTREQUEST,
|
15
18
|
:htype => htype,
|
16
19
|
:hlen => hlen,
|
@@ -25,14 +28,16 @@ module Lib
|
|
25
28
|
:chaddr => chaddr,
|
26
29
|
:sname => sname,
|
27
30
|
:file => file
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
31
|
+
)
|
32
|
+
if options.is_a? Array or options.is_a? Lib::DHCP::Options
|
33
|
+
options.each { |option| self.options.add option unless option.oid.to_i == Option::MESSAGE_TYPE }
|
34
|
+
elsif options.is_a? Lib::DHCP::Option
|
35
|
+
self.options.add options
|
36
|
+
elsif !options.nil?
|
37
|
+
raise TypeError, "Can't convert #{options.class.name} to Lib::DHCP::Option"
|
38
|
+
end
|
35
39
|
end
|
40
|
+
|
36
41
|
self.options.add Lib::DHCP::Option53.new(DECLINE)
|
37
42
|
end
|
38
43
|
|
@@ -9,8 +9,11 @@ module Lib
|
|
9
9
|
module DHCP
|
10
10
|
class Message
|
11
11
|
class Discover < 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
|
-
|
12
|
+
def initialize(htype: 1, hlen: 6, hops: 0, xid: nil, secs: 0, flags: 0, ciaddr: 0, yiaddr: 0, siaddr: 0, giaddr: 0, chaddr: 0, sname: '.', file: '.', options: nil)
|
13
|
+
if block_given?
|
14
|
+
yield self
|
15
|
+
else
|
16
|
+
super(
|
14
17
|
:op => BOOTREQUEST,
|
15
18
|
:htype => htype,
|
16
19
|
:hlen => hlen,
|
@@ -25,13 +28,14 @@ module Lib
|
|
25
28
|
:chaddr => chaddr,
|
26
29
|
:sname => sname,
|
27
30
|
:file => file
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
31
|
+
)
|
32
|
+
if options.is_a? Array or options.is_a? Lib::DHCP::Options
|
33
|
+
options.each { |option| self.options.add option unless option.oid.to_i == Option::MESSAGE_TYPE }
|
34
|
+
elsif options.is_a? Lib::DHCP::Option
|
35
|
+
self.options.add options
|
36
|
+
elsif !options.nil?
|
37
|
+
raise TypeError, "Can't convert #{options.class.name} to Lib::DHCP::Option"
|
38
|
+
end
|
35
39
|
end
|
36
40
|
self.options.add Lib::DHCP::Option53.new(DISCOVER)
|
37
41
|
end
|
@@ -9,8 +9,11 @@ module Lib
|
|
9
9
|
module DHCP
|
10
10
|
class Message
|
11
11
|
class Inform < 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
|
-
|
12
|
+
def initialize(htype: 1, hlen: 6, hops: 0, xid: nil, secs: 0, flags: 0, ciaddr: 0, yiaddr: 0, siaddr: 0, giaddr: 0, chaddr: 0, sname: '.', file: '.', options: nil)
|
13
|
+
if block_given?
|
14
|
+
yield self
|
15
|
+
else
|
16
|
+
super(
|
14
17
|
:op => BOOTREQUEST,
|
15
18
|
:htype => htype,
|
16
19
|
:hlen => hlen,
|
@@ -25,13 +28,14 @@ module Lib
|
|
25
28
|
:chaddr => chaddr,
|
26
29
|
:sname => sname,
|
27
30
|
:file => file
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
31
|
+
)
|
32
|
+
if options.is_a? Array or options.is_a? Lib::DHCP::Options
|
33
|
+
options.each { |option| self.options.add option unless option.oid.to_i == Option::MESSAGE_TYPE }
|
34
|
+
elsif options.is_a? Lib::DHCP::Option
|
35
|
+
self.options.add options
|
36
|
+
elsif !options.nil?
|
37
|
+
raise TypeError, "Can't convert #{options.class.name} to Lib::DHCP::Option"
|
38
|
+
end
|
35
39
|
end
|
36
40
|
self.options.add Lib::DHCP::Option53.new(INFORM)
|
37
41
|
end
|
@@ -9,8 +9,11 @@ module Lib
|
|
9
9
|
module DHCP
|
10
10
|
class Message
|
11
11
|
class LeaseActive < 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
|
-
|
12
|
+
def initialize(htype: 1, hlen: 6, hops: 0, xid: nil, secs: 0, flags: 0, ciaddr: 0, yiaddr: 0, siaddr: 0, giaddr: 0, chaddr: 0, sname: '.', file: '.', options: nil)
|
13
|
+
if block_given?
|
14
|
+
yield self
|
15
|
+
else
|
16
|
+
super(
|
14
17
|
:op => BOOTREPLY,
|
15
18
|
:htype => htype,
|
16
19
|
:hlen => hlen,
|
@@ -25,13 +28,14 @@ module Lib
|
|
25
28
|
:chaddr => chaddr,
|
26
29
|
:sname => sname,
|
27
30
|
:file => file
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
31
|
+
)
|
32
|
+
if options.is_a? Array or options.is_a? Lib::DHCP::Options
|
33
|
+
options.each { |option| self.options.add option unless option.oid.to_i == Option::MESSAGE_TYPE }
|
34
|
+
elsif options.is_a? Lib::DHCP::Option
|
35
|
+
self.options.add options
|
36
|
+
elsif !options.nil?
|
37
|
+
raise TypeError, "Can't convert #{options.class.name} to Lib::DHCP::Option"
|
38
|
+
end
|
35
39
|
end
|
36
40
|
|
37
41
|
self.options.add Lib::DHCP::Option53.new(LEASE_ACTIVE)
|
@@ -9,8 +9,11 @@ module Lib
|
|
9
9
|
module DHCP
|
10
10
|
class Message
|
11
11
|
class LeaseQuery < 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
|
-
|
12
|
+
def initialize(htype: 1, hlen: 6, hops: 0, xid: nil, secs: 0, flags: 0, ciaddr: 0, yiaddr: 0, siaddr: 0, giaddr: 0, chaddr: 0, sname: '.', file: '.', options: nil)
|
13
|
+
if block_given?
|
14
|
+
yield self
|
15
|
+
else
|
16
|
+
super(
|
14
17
|
:op => BOOTREQUEST,
|
15
18
|
:htype => htype,
|
16
19
|
:hlen => hlen,
|
@@ -25,16 +28,16 @@ module Lib
|
|
25
28
|
:chaddr => chaddr,
|
26
29
|
:sname => sname,
|
27
30
|
:file => file
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
31
|
+
)
|
32
|
+
if options.is_a? Array or options.is_a? Lib::DHCP::Options
|
33
|
+
options.each { |option| self.options.add option unless option.oid.to_i == Option::MESSAGE_TYPE }
|
34
|
+
elsif options.is_a? Lib::DHCP::Option
|
35
|
+
self.options.add options
|
36
|
+
elsif !options.nil?
|
37
|
+
raise TypeError, "Can't convert #{options.class.name} to Lib::DHCP::Option"
|
38
|
+
end
|
35
39
|
end
|
36
40
|
self.options.add Lib::DHCP::Option53.new(LEASE_QUERY)
|
37
|
-
|
38
41
|
end
|
39
42
|
|
40
43
|
def pack
|
@@ -9,8 +9,11 @@ module Lib
|
|
9
9
|
module DHCP
|
10
10
|
class Message
|
11
11
|
class LeaseUnassigned < 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
|
-
|
12
|
+
def initialize(htype: 1, hlen: 6, hops: 0, xid: nil, secs: 0, flags: 0, ciaddr: 0, yiaddr: 0, siaddr: 0, giaddr: 0, chaddr: 0, sname: '.', file: '.', options: nil)
|
13
|
+
if block_given?
|
14
|
+
yield self
|
15
|
+
else
|
16
|
+
super(
|
14
17
|
:op => BOOTREPLY,
|
15
18
|
:htype => htype,
|
16
19
|
:hlen => hlen,
|
@@ -25,13 +28,14 @@ module Lib
|
|
25
28
|
:chaddr => chaddr,
|
26
29
|
:sname => sname,
|
27
30
|
:file => file
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
31
|
+
)
|
32
|
+
if options.is_a? Array or options.is_a? Lib::DHCP::Options
|
33
|
+
options.each { |option| self.options.add option unless option.oid.to_i == Option::MESSAGE_TYPE }
|
34
|
+
elsif options.is_a? Lib::DHCP::Option
|
35
|
+
self.options.add options
|
36
|
+
elsif !options.nil?
|
37
|
+
raise TypeError, "Can't convert #{options.class.name} to Lib::DHCP::Option"
|
38
|
+
end
|
35
39
|
end
|
36
40
|
self.options.add Lib::DHCP::Option53.new(LEASE_UNASSIGNED)
|
37
41
|
end
|
@@ -9,8 +9,11 @@ module Lib
|
|
9
9
|
module DHCP
|
10
10
|
class Message
|
11
11
|
class LeaseUnknown < 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
|
-
|
12
|
+
def initialize(htype: 1, hlen: 6, hops: 0, xid: nil, secs: 0, flags: 0, ciaddr: 0, yiaddr: 0, siaddr: 0, giaddr: 0, chaddr: 0, sname: '.', file: '.', options: nil)
|
13
|
+
if block_given?
|
14
|
+
yield self
|
15
|
+
else
|
16
|
+
super(
|
14
17
|
:op => BOOTREPLY,
|
15
18
|
:htype => htype,
|
16
19
|
:hlen => hlen,
|
@@ -25,13 +28,14 @@ module Lib
|
|
25
28
|
:chaddr => chaddr,
|
26
29
|
:sname => sname,
|
27
30
|
:file => file
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
31
|
+
)
|
32
|
+
if options.is_a? Array or options.is_a? Lib::DHCP::Options
|
33
|
+
options.each { |option| self.options.add option unless option.oid.to_i == Option::MESSAGE_TYPE }
|
34
|
+
elsif options.is_a? Lib::DHCP::Option
|
35
|
+
self.options.add options
|
36
|
+
elsif !options.nil?
|
37
|
+
raise TypeError, "Can't convert #{options.class.name} to Lib::DHCP::Option"
|
38
|
+
end
|
35
39
|
end
|
36
40
|
self.options.add Lib::DHCP::Option53.new(LEASE_UNKNOWN)
|
37
41
|
end
|
@@ -9,8 +9,11 @@ module Lib
|
|
9
9
|
module DHCP
|
10
10
|
class Message
|
11
11
|
class NACK < 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
|
-
|
12
|
+
def initialize(htype: 1, hlen: 6, hops: 0, xid: nil, secs: 0, flags: 0, ciaddr: 0, yiaddr: 0, siaddr: 0, giaddr: 0, chaddr: 0, sname: '.', file: '.', options: nil)
|
13
|
+
if block_given?
|
14
|
+
yield self
|
15
|
+
else
|
16
|
+
super(
|
14
17
|
:op => BOOTREPLY,
|
15
18
|
:htype => htype,
|
16
19
|
:hlen => hlen,
|
@@ -25,13 +28,14 @@ module Lib
|
|
25
28
|
:chaddr => chaddr,
|
26
29
|
:sname => sname,
|
27
30
|
:file => file
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
31
|
+
)
|
32
|
+
if options.is_a? Array or options.is_a? Lib::DHCP::Options
|
33
|
+
options.each { |option| self.options.add option unless option.oid.to_i == Option::MESSAGE_TYPE }
|
34
|
+
elsif options.is_a? Lib::DHCP::Option
|
35
|
+
self.options.add options
|
36
|
+
elsif !options.nil?
|
37
|
+
raise TypeError, "Can't convert #{options.class.name} to Lib::DHCP::Option"
|
38
|
+
end
|
35
39
|
end
|
36
40
|
self.options.add Lib::DHCP::Option53.new(NOT_ACKNOWLEDGE)
|
37
41
|
end
|
@@ -9,8 +9,11 @@ module Lib
|
|
9
9
|
module DHCP
|
10
10
|
class Message
|
11
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
|
-
|
12
|
+
def initialize(htype: 1, hlen: 6, hops: 0, xid: nil, secs: 0, flags: 0, ciaddr: 0, yiaddr: 0, siaddr: 0, giaddr: 0, chaddr: 0, sname: '.', file: '.', options: nil)
|
13
|
+
if block_given?
|
14
|
+
yield self
|
15
|
+
else
|
16
|
+
super(
|
14
17
|
:op => BOOTREPLY,
|
15
18
|
:htype => htype,
|
16
19
|
:hlen => hlen,
|
@@ -25,13 +28,14 @@ module Lib
|
|
25
28
|
:chaddr => chaddr,
|
26
29
|
:sname => sname,
|
27
30
|
:file => file
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
31
|
+
)
|
32
|
+
if options.is_a? Array or options.is_a? Lib::DHCP::Options
|
33
|
+
options.each { |option| self.options.add option unless option.oid.to_i == Option::MESSAGE_TYPE }
|
34
|
+
elsif options.is_a? Lib::DHCP::Option
|
35
|
+
self.options.add options
|
36
|
+
elsif !options.nil?
|
37
|
+
raise TypeError, "Can't convert #{options.class.name} to Lib::DHCP::Option"
|
38
|
+
end
|
35
39
|
end
|
36
40
|
self.options.add Lib::DHCP::Option53.new(OFFER)
|
37
41
|
end
|
@@ -9,8 +9,11 @@ module Lib
|
|
9
9
|
module DHCP
|
10
10
|
class Message
|
11
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
|
-
|
12
|
+
def initialize(htype: 1, hlen: 6, hops: 0, xid: nil, secs: 0, flags: 0, ciaddr: 0, yiaddr: 0, siaddr: 0, giaddr: 0, chaddr: 0, sname: '.', file: '.', options: nil)
|
13
|
+
if block_given?
|
14
|
+
yield self
|
15
|
+
else
|
16
|
+
super(
|
14
17
|
:op => BOOTREQUEST,
|
15
18
|
:htype => htype,
|
16
19
|
:hlen => hlen,
|
@@ -25,13 +28,14 @@ module Lib
|
|
25
28
|
:chaddr => chaddr,
|
26
29
|
:sname => sname,
|
27
30
|
:file => file
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
31
|
+
)
|
32
|
+
if options.is_a? Array or options.is_a? Lib::DHCP::Options
|
33
|
+
options.each { |option| self.options.add option unless option.oid.to_i == Option::MESSAGE_TYPE }
|
34
|
+
elsif options.is_a? Lib::DHCP::Option
|
35
|
+
self.options.add options
|
36
|
+
elsif !options.nil?
|
37
|
+
raise TypeError, "Can't convert #{options.class.name} to Lib::DHCP::Option"
|
38
|
+
end
|
35
39
|
end
|
36
40
|
self.options.add Lib::DHCP::Option53.new(RELEASE)
|
37
41
|
end
|
@@ -9,8 +9,11 @@ module Lib
|
|
9
9
|
module DHCP
|
10
10
|
class Message
|
11
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
|
-
|
12
|
+
def initialize(htype: 1, hlen: 6, hops: 0, xid: nil, secs: 0, flags: 0, ciaddr: 0, yiaddr: 0, siaddr: 0, giaddr: 0, chaddr: 0, sname: '.', file: '.', options: nil)
|
13
|
+
if block_given?
|
14
|
+
yield self
|
15
|
+
else
|
16
|
+
super(
|
14
17
|
:op => BOOTREQUEST,
|
15
18
|
:htype => htype,
|
16
19
|
:hlen => hlen,
|
@@ -25,13 +28,14 @@ module Lib
|
|
25
28
|
:chaddr => chaddr,
|
26
29
|
:sname => sname,
|
27
30
|
:file => file
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
31
|
+
)
|
32
|
+
if options.is_a? Array or options.is_a? Lib::DHCP::Options
|
33
|
+
options.each { |option| self.options.add option unless option.oid.to_i == Option::MESSAGE_TYPE }
|
34
|
+
elsif options.is_a? Lib::DHCP::Option
|
35
|
+
self.options.add options
|
36
|
+
elsif !options.nil?
|
37
|
+
raise TypeError, "Can't convert #{options.class.name} to Lib::DHCP::Option"
|
38
|
+
end
|
35
39
|
end
|
36
40
|
self.options.add Lib::DHCP::Option53.new(REQUEST)
|
37
41
|
end
|
@@ -45,6 +45,24 @@ module Lib
|
|
45
45
|
NAME[@oid.to_i]
|
46
46
|
end
|
47
47
|
|
48
|
+
def to_json(*params)
|
49
|
+
self.to_h.to_json
|
50
|
+
end
|
51
|
+
|
52
|
+
def to_h
|
53
|
+
{
|
54
|
+
name: self.name,
|
55
|
+
oid: self.oid.to_i,
|
56
|
+
len: self.len,
|
57
|
+
value: self.value.respond_to?(:map) ? self.value.map { |v| v.respond_to?(:to_h) ? v.to_h : v } : self.value
|
58
|
+
}
|
59
|
+
end
|
60
|
+
|
61
|
+
def self.from_json(json)
|
62
|
+
json = json.is_a?(Hash) ? json : JSON.parse(json)
|
63
|
+
self.new(json.transform_keys(&:to_sym)[:oid], json.transform_keys(&:to_sym)[:value])
|
64
|
+
end
|
65
|
+
|
48
66
|
def self.unpack(packet)
|
49
67
|
oid, len = packet.unpack('C2')
|
50
68
|
payload = nil
|
@@ -11,8 +11,6 @@ module Lib
|
|
11
11
|
# DHCP MESSAGE TYPE - This option is used to convey the type of the DHCP message.
|
12
12
|
# The code for this option is 53, and its length is 1.
|
13
13
|
|
14
|
-
def_delegators :@payload, :to_s
|
15
|
-
|
16
14
|
def initialize(message_type)
|
17
15
|
raise ArgumentError, "Illegal value for DHCP Message Type = #{message_type}" unless (1..255).include? message_type.to_i
|
18
16
|
super MESSAGE_TYPE, message_type.to_i
|
data/lib/lib/dhcp/options.rb
CHANGED
@@ -3,6 +3,7 @@
|
|
3
3
|
# Copyright 22.12.2017 by Piotr Wojcieszonek
|
4
4
|
|
5
5
|
require 'forwardable'
|
6
|
+
require 'json'
|
6
7
|
|
7
8
|
module Lib
|
8
9
|
module DHCP
|
@@ -24,7 +25,15 @@ module Lib
|
|
24
25
|
end
|
25
26
|
|
26
27
|
def add(option)
|
27
|
-
|
28
|
+
option = begin
|
29
|
+
JSON.parse(option)
|
30
|
+
rescue JSON::ParserError
|
31
|
+
option
|
32
|
+
rescue TypeError
|
33
|
+
option
|
34
|
+
end
|
35
|
+
option = create_option(option)
|
36
|
+
@options << option unless self.include? option
|
28
37
|
end
|
29
38
|
|
30
39
|
def []=(index, option)
|
@@ -63,7 +72,6 @@ module Lib
|
|
63
72
|
options << option
|
64
73
|
break if option.oid == Lib::DHCP::Option::END_OPTION
|
65
74
|
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
75
|
end
|
68
76
|
options
|
69
77
|
end
|
@@ -72,11 +80,13 @@ module Lib
|
|
72
80
|
|
73
81
|
def create_option(option)
|
74
82
|
if option.is_a? Array
|
75
|
-
|
83
|
+
Lib::DHCP.const_get("Option#{option[0].to_i}").new(option[1])
|
76
84
|
elsif option.is_a? Option
|
77
85
|
option
|
78
86
|
elsif option.is_a?(Integer) and (option == 0 or option == 255)
|
79
|
-
|
87
|
+
Lib::DHCP.const_get("Option#{option.to_i}").new
|
88
|
+
elsif option.is_a? Hash
|
89
|
+
Lib::DHCP.const_get("Option#{option.transform_keys(&:to_sym)[:oid].to_i}").new(option.transform_keys(&:to_sym)[:value])
|
80
90
|
else
|
81
91
|
Lib::DHCP::Option.unpack(option)
|
82
92
|
end
|
data/lib/lib/dhcp/packet.rb
CHANGED
@@ -29,6 +29,10 @@ module Lib
|
|
29
29
|
|
30
30
|
end
|
31
31
|
|
32
|
+
def to_h
|
33
|
+
super.merge({ options: self.options.map(&:to_h) })
|
34
|
+
end
|
35
|
+
|
32
36
|
def option0
|
33
37
|
self.options.select 0
|
34
38
|
end
|
@@ -57,6 +61,16 @@ module Lib
|
|
57
61
|
@options ||= Lib::DHCP::Options.new
|
58
62
|
end
|
59
63
|
|
64
|
+
def options=(opt)
|
65
|
+
if opt.respond_to? :each
|
66
|
+
opt.each do |option|
|
67
|
+
self.options.add(option)
|
68
|
+
end
|
69
|
+
else
|
70
|
+
self.options.add opt
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
60
74
|
def self.unpack(packet)
|
61
75
|
bootp, cookie, options = packet.unpack('a236Na*')
|
62
76
|
raise RuntimeError, "Magick-Cookie mismatch #{cookie.to_i.to_s(16)}" unless cookie.to_i == MAGICK_COOKIE.to_i
|
@@ -65,6 +79,12 @@ module Lib
|
|
65
79
|
dhcp
|
66
80
|
end
|
67
81
|
|
82
|
+
# def self.from_json(json)
|
83
|
+
# #json = json.is_a?(Hash) ? json : JSON.parse(json)
|
84
|
+
# super
|
85
|
+
# #self.options = json['options']
|
86
|
+
# end
|
87
|
+
|
68
88
|
def pack
|
69
89
|
# TODO Max Message Size support
|
70
90
|
dhcp_message = super # BOOTP Header
|
data/lib/lib/dhcp/version.rb
CHANGED
data/lib-dhcp.gemspec
CHANGED
@@ -26,6 +26,6 @@ Gem::Specification.new do |spec|
|
|
26
26
|
spec.add_development_dependency 'rake'
|
27
27
|
spec.add_development_dependency 'minitest'
|
28
28
|
|
29
|
-
spec.add_dependency 'lib-bootp', '~> 0.
|
30
|
-
spec.add_dependency 'net-address', '~> 0.
|
29
|
+
spec.add_dependency 'lib-bootp', '~> 0.2.5'
|
30
|
+
spec.add_dependency 'net-address', '~> 0.2.2'
|
31
31
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: lib-dhcp
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Piotr Wojcieszonek
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-08-
|
11
|
+
date: 2023-08-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -58,28 +58,28 @@ dependencies:
|
|
58
58
|
requirements:
|
59
59
|
- - "~>"
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version:
|
61
|
+
version: 0.2.5
|
62
62
|
type: :runtime
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
66
|
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version:
|
68
|
+
version: 0.2.5
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: net-address
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
73
|
- - "~>"
|
74
74
|
- !ruby/object:Gem::Version
|
75
|
-
version:
|
75
|
+
version: 0.2.2
|
76
76
|
type: :runtime
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
80
|
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
|
-
version:
|
82
|
+
version: 0.2.2
|
83
83
|
description: Set of classes to low level handle the BOOTP protocol.
|
84
84
|
email:
|
85
85
|
- piotr@wojcieszonek.pl
|
@@ -89,6 +89,7 @@ extensions: []
|
|
89
89
|
extra_rdoc_files: []
|
90
90
|
files:
|
91
91
|
- ".github/workflows/gem-push.yml"
|
92
|
+
- ".github/workflows/run-test.yml"
|
92
93
|
- ".gitignore"
|
93
94
|
- ".ruby-gemset"
|
94
95
|
- ".ruby-version"
|
@@ -388,7 +389,7 @@ homepage: https://github.com/pwojcieszonek/lib-dhcp
|
|
388
389
|
licenses:
|
389
390
|
- MIT
|
390
391
|
metadata: {}
|
391
|
-
post_install_message:
|
392
|
+
post_install_message:
|
392
393
|
rdoc_options: []
|
393
394
|
require_paths:
|
394
395
|
- lib
|
@@ -403,8 +404,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
403
404
|
- !ruby/object:Gem::Version
|
404
405
|
version: '0'
|
405
406
|
requirements: []
|
406
|
-
rubygems_version: 3.
|
407
|
-
signing_key:
|
407
|
+
rubygems_version: 3.2.32
|
408
|
+
signing_key:
|
408
409
|
specification_version: 4
|
409
410
|
summary: DHCP protocol library.
|
410
411
|
test_files: []
|