subnetica 1.0.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/LICENSE +11 -0
- data/README.md +3 -0
- data/bin/subnetica +42 -0
- data/lib/subnetica.rb +129 -0
- metadata +73 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 5b2ca2e2d0b21d4215a8ca9636a36fe3228e4dfa80300c83add93df140d47947
|
4
|
+
data.tar.gz: 18fde891686ff4430e109d5f7d7aa834bb016b0f682baaaab92d2735628ddf3d
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 9ed8ddc0891e8767a080656d65dc3138fc35b37adc650c783de5095ad5bfc308720ed60f1645cfa0fae62a4f16930b66d890fa037a29c01b17cd36a9f5f26cf9
|
7
|
+
data.tar.gz: 0cade32452264e2c2d8183f2f2b6b04fdbb99f34db60c12f03eea1a073a58dd3f107e3d3a15fe72227573a05ff8ccabb5b22d0c07a58924227c45a5fbb4345a0
|
data/LICENSE
ADDED
@@ -0,0 +1,11 @@
|
|
1
|
+
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
|
2
|
+
Version 2, December 2004
|
3
|
+
|
4
|
+
Copyright (C) 2004 Sam Hocevar <sam@hocevar.net>
|
5
|
+
|
6
|
+
Everyone is permitted to copy and distribute verbatim or modified copies of this license document, and changing it is allowed as long as the name is changed.
|
7
|
+
|
8
|
+
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
|
9
|
+
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
10
|
+
|
11
|
+
0. You just DO WHAT THE FUCK YOU WANT TO.
|
data/README.md
ADDED
data/bin/subnetica
ADDED
@@ -0,0 +1,42 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'ipaddr'
|
4
|
+
require 'subnetica'
|
5
|
+
|
6
|
+
if ARGV.length != 1
|
7
|
+
puts 'Usage: subnetica [ip address]'
|
8
|
+
exit!
|
9
|
+
end
|
10
|
+
|
11
|
+
ipaddr_str = ARGV[0].dup
|
12
|
+
ipaddr_str.strip!
|
13
|
+
|
14
|
+
begin
|
15
|
+
ipaddr = IPAddr.new ipaddr_str
|
16
|
+
rescue IPAddr::InvalidAddressError
|
17
|
+
puts 'Invalid address'
|
18
|
+
exit!
|
19
|
+
end
|
20
|
+
|
21
|
+
attributes, flags = Subnetica.getinfo ipaddr
|
22
|
+
|
23
|
+
max_len = 0
|
24
|
+
attributes.each_key do |key|
|
25
|
+
max_len = key.length if key.length > max_len
|
26
|
+
end
|
27
|
+
|
28
|
+
length = max_len + 1
|
29
|
+
attributes.each_pair do |key, value|
|
30
|
+
puts "#{key}#{' ' * (length - key.length)}= #{value}"
|
31
|
+
end
|
32
|
+
|
33
|
+
puts "Properties#{' ' * (length - 10)}="
|
34
|
+
flags.each do |flag|
|
35
|
+
if flag.is_a? Array
|
36
|
+
flag.each do |sub_flag|
|
37
|
+
puts "\t\t+ #{sub_flag}"
|
38
|
+
end
|
39
|
+
else
|
40
|
+
puts "\t- #{flag}"
|
41
|
+
end
|
42
|
+
end
|
data/lib/subnetica.rb
ADDED
@@ -0,0 +1,129 @@
|
|
1
|
+
|
2
|
+
module Subnetica
|
3
|
+
|
4
|
+
require 'ipaddr'
|
5
|
+
require 'meshname'
|
6
|
+
|
7
|
+
ADDRESSES_4 = [
|
8
|
+
[IPAddr.new('0.0.0.0/8'), 'Current network'],
|
9
|
+
[IPAddr.new('10.0.0.0/8'), 'Private address'],
|
10
|
+
[IPAddr.new('100.64.0.0/10'), 'CG-NAT'],
|
11
|
+
[IPAddr.new('127.0.0.0/8'), 'Loopback address'],
|
12
|
+
[IPAddr.new('169.254.0.0/16'), 'Link-local address'],
|
13
|
+
[IPAddr.new('172.16.0.0/12'), 'Private address'],
|
14
|
+
[IPAddr.new('192.0.0.0/24'), 'IETF Protocol Assignments'],
|
15
|
+
[IPAddr.new('192.0.2.0/24'), 'TEST-NET-1 (Documentation prefix)'],
|
16
|
+
[IPAddr.new('192.88.99.0/24'), 'Reserved'],
|
17
|
+
[IPAddr.new('192.168.0.0/16'), 'Private address'],
|
18
|
+
[IPAddr.new('198.18.0.0/15'), 'benchmark testing of inter-network communication'],
|
19
|
+
[IPAddr.new('198.51.100.0/24'), 'TEST-NET-2 (Documentation prefix)'],
|
20
|
+
[IPAddr.new('203.0.113.0/24'), 'TEST-NET-3 (Documentation prefix)'],
|
21
|
+
[IPAddr.new('224.0.0.0/4'), 'Multicast address'],
|
22
|
+
[IPAddr.new('233.252.0.0/24'), 'MCAST-TEST-NET (Documentation prefix)'],
|
23
|
+
[IPAddr.new('240.0.0.0/4'), 'Reserved for future use'],
|
24
|
+
[IPAddr.new('255.255.255.255/32'), 'Limited broadcast']
|
25
|
+
].freeze
|
26
|
+
|
27
|
+
ADDRESSES_6 = [
|
28
|
+
[IPAddr.new('::/96'), 'IPv4-mapped'],
|
29
|
+
[IPAddr.new('::/128'), 'Unspecified address'],
|
30
|
+
[IPAddr.new('::1/128'), 'Loopback address'],
|
31
|
+
[IPAddr.new('::ffff:0:0/96'), 'IPv4-mapped addresses'],
|
32
|
+
[IPAddr.new('::ffff:0:0:0/96'), 'IPv4 translated addresses'],
|
33
|
+
[IPAddr.new('64:ff9b::/96'), 'IPv4/IPv6 translation (RFC6052)'],
|
34
|
+
[IPAddr.new('64:ff9b:1::/48'), 'IPv4/IPv6 translation (RFC8215)'],
|
35
|
+
[IPAddr.new('100::/64'), 'Discard prefix (RFC6666)'],
|
36
|
+
[IPAddr.new('2000::/3'), 'Global Unicast Address (GUA)'],
|
37
|
+
[IPAddr.new('2001::/32'), 'Teredo tunneling'],
|
38
|
+
[IPAddr.new('2001:20::/28'), 'ORCHIDv2'],
|
39
|
+
[IPAddr.new('2001:db8::/32'), 'Documentation prefix (RFC3849)'],
|
40
|
+
[IPAddr.new('2002::/16'), '6to4 (deprecated)'],
|
41
|
+
[IPAddr.new('fc00::/7'), 'Unique local address (ULA)'],
|
42
|
+
[IPAddr.new('fe80::/10'), 'Link-local address'],
|
43
|
+
[IPAddr.new('ff00::/8'), 'Multicast address'],
|
44
|
+
[IPAddr.new('ff02::1:ff00:0/104'), 'Solicited-node multicast address'],
|
45
|
+
[IPAddr.new('ff02::2:ff00:0/104'), 'Node information queries'],
|
46
|
+
|
47
|
+
[IPAddr.new('ff01::1/128'), 'All nodes in the interface-local'],
|
48
|
+
[IPAddr.new('ff02::1/128'), 'All nodes in the link-local'],
|
49
|
+
[IPAddr.new('ff01::2/128'), 'All routers in the interface-local'],
|
50
|
+
[IPAddr.new('ff02::2/128'), 'All routers in the link-local'],
|
51
|
+
[IPAddr.new('ff05::2/128'), 'All routers in the site-local'],
|
52
|
+
[IPAddr.new('ff02::5/128'), 'OSPF'],
|
53
|
+
[IPAddr.new('ff02::6/128'), 'OSPF'],
|
54
|
+
[IPAddr.new('ff02::9/128'), 'RIP'],
|
55
|
+
[IPAddr.new('ff02::a/128'), 'EIGRP'],
|
56
|
+
[IPAddr.new('ff02::d/128'), 'RPL'],
|
57
|
+
[IPAddr.new('ff01::fb/128'), 'mDNSv6 in the interface-local'],
|
58
|
+
[IPAddr.new('ff02::fb/128'), 'mDNSv6 in the link-local'],
|
59
|
+
[IPAddr.new('ff03::fb/128'), 'mDNSv6 in the realm-local'],
|
60
|
+
[IPAddr.new('ff04::fb/128'), 'mDNSv6 in the admin-local'],
|
61
|
+
[IPAddr.new('ff05::fb/128'), 'mDNSv6 in the site-local'],
|
62
|
+
[IPAddr.new('ff08::fb/128'), 'mDNSv6 in the organization-local'],
|
63
|
+
[IPAddr.new('ff0e::fb/128'), 'mDNSv6 in the global'],
|
64
|
+
[IPAddr.new('ff01::101/128'), 'All NTP servers in the interface-local'],
|
65
|
+
[IPAddr.new('ff02::101/128'), 'All NTP servers in the link-local'],
|
66
|
+
[IPAddr.new('ff03::101/128'), 'All NTP servers in the realm-local'],
|
67
|
+
[IPAddr.new('ff04::101/128'), 'All NTP servers in the admin-local'],
|
68
|
+
[IPAddr.new('ff05::101/128'), 'All NTP servers in the site-local'],
|
69
|
+
[IPAddr.new('ff08::101/128'), 'All NTP servers in the organization-local'],
|
70
|
+
[IPAddr.new('ff0e::101/128'), 'All NTP servers in the global'],
|
71
|
+
[IPAddr.new('ff02::1:1/128'), 'Link name'],
|
72
|
+
[IPAddr.new('ff02::1:2/128'), 'All-dhcp-agents (DHCPv6) in the link-local'],
|
73
|
+
[IPAddr.new('ff02::1:3/128'), 'Link-local multicast name resolution'],
|
74
|
+
[IPAddr.new('ff05::1:3/128'), 'All-dhcp-agents (DHCPv6) in the site-local']
|
75
|
+
].freeze
|
76
|
+
|
77
|
+
def self.getinfo ipaddr
|
78
|
+
raise ArgumentError, 'IP address must be of type IPAddr' if ! ipaddr.is_a? IPAddr
|
79
|
+
|
80
|
+
flags = []
|
81
|
+
attributes = {}
|
82
|
+
|
83
|
+
attributes['Address'] = ipaddr
|
84
|
+
attributes['Network'] = "#{ipaddr.mask(ipaddr.prefix)} / #{ipaddr.prefix}"
|
85
|
+
attributes['Netmask'] = ipaddr.netmask
|
86
|
+
|
87
|
+
if ipaddr.ipv4?
|
88
|
+
flags << 'IPv4'
|
89
|
+
|
90
|
+
ADDRESSES_4.each do |ip, descr|
|
91
|
+
flags << descr if ip.include? ipaddr
|
92
|
+
end
|
93
|
+
|
94
|
+
attributes['IPv4-mapped IPv6'] = "::ffff:#{ipaddr}"
|
95
|
+
elsif ipaddr.ipv6?
|
96
|
+
flags << 'IPv6'
|
97
|
+
|
98
|
+
if ipaddr.ipv4_mapped?
|
99
|
+
attributes['IPv4'] = ipaddr.native
|
100
|
+
attributes['Alternative address'] = ":#{ipaddr.inspect[39...-41]}"
|
101
|
+
end
|
102
|
+
|
103
|
+
attributes['Meshname'] = "#{Meshname.getname ipaddr}.meship"
|
104
|
+
|
105
|
+
[128, 64, 56, 48].each do |mask|
|
106
|
+
bits = mask - ipaddr.prefix
|
107
|
+
if bits.positive?
|
108
|
+
num_prefix = 2**bits
|
109
|
+
calc_res = " = #{num_prefix}" if num_prefix <= 65_536
|
110
|
+
attributes["/#{mask}s"] = "2^#{bits}#{calc_res}"
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
ADDRESSES_6.each do |ip, descr|
|
115
|
+
flags << descr if ip.include? ipaddr
|
116
|
+
end
|
117
|
+
else
|
118
|
+
flags << 'Unknown IP version'
|
119
|
+
end
|
120
|
+
|
121
|
+
attributes['rDNS'] = ipaddr.reverse
|
122
|
+
|
123
|
+
range = ipaddr.to_range
|
124
|
+
attributes['Host Range'] = "{ #{range.first} - #{range.last} }"
|
125
|
+
|
126
|
+
return [attributes, flags]
|
127
|
+
end
|
128
|
+
|
129
|
+
end
|
metadata
ADDED
@@ -0,0 +1,73 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: subnetica
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Marek Küthe
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2023-04-20 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: base32
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0.3'
|
20
|
+
- - ">="
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: 0.3.4
|
23
|
+
type: :runtime
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
26
|
+
requirements:
|
27
|
+
- - "~>"
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0.3'
|
30
|
+
- - ">="
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: 0.3.4
|
33
|
+
description: Program that can display IPv4 and IPv6 address information like Network,
|
34
|
+
Netmask, rDNS address and Host Range.
|
35
|
+
email: m.k@mk16.de
|
36
|
+
executables:
|
37
|
+
- subnetica
|
38
|
+
extensions: []
|
39
|
+
extra_rdoc_files:
|
40
|
+
- LICENSE
|
41
|
+
- README.md
|
42
|
+
files:
|
43
|
+
- LICENSE
|
44
|
+
- README.md
|
45
|
+
- bin/subnetica
|
46
|
+
- lib/subnetica.rb
|
47
|
+
homepage: https://codeberg.org/mark22k/subnetica
|
48
|
+
licenses:
|
49
|
+
- WTFPL
|
50
|
+
metadata:
|
51
|
+
source_code_uri: https://codeberg.org/mark22k/subnetica
|
52
|
+
bug_tracker_uri: https://codeberg.org/mark22k/subnetica/issues
|
53
|
+
rubygems_mfa_required: 'true'
|
54
|
+
post_install_message:
|
55
|
+
rdoc_options: []
|
56
|
+
require_paths:
|
57
|
+
- lib
|
58
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
59
|
+
requirements:
|
60
|
+
- - ">="
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: '3.1'
|
63
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
64
|
+
requirements:
|
65
|
+
- - ">="
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: '0'
|
68
|
+
requirements: []
|
69
|
+
rubygems_version: 3.4.12
|
70
|
+
signing_key:
|
71
|
+
specification_version: 4
|
72
|
+
summary: Program that can display IPv4 and IPv6 address information.
|
73
|
+
test_files: []
|