Packages
krug
1.1.47
2.0.36
2.0.35
2.0.34
2.0.33
2.0.32
2.0.31
2.0.30
2.0.29
2.0.27
2.0.26
2.0.25
2.0.24
2.0.23
2.0.22
2.0.20
2.0.19
2.0.18
2.0.17
2.0.16
2.0.15
2.0.14
2.0.13
2.0.12
2.0.11
2.0.10
2.0.9
2.0.8
2.0.7
2.0.6
2.0.5
2.0.4
2.0.1
2.0.0
1.1.53
1.1.52
1.1.50
1.1.49
1.1.48
1.1.47
1.1.46
1.1.45
1.1.44
1.1.43
1.1.42
1.1.41
1.1.40
1.1.39
1.1.38
1.1.37
1.1.36
1.1.35
1.1.34
1.1.33
1.1.32
1.1.31
1.1.30
1.1.29
1.1.28
1.1.27
1.1.26
1.1.25
1.1.24
1.1.23
1.1.22
1.1.21
1.1.20
1.1.19
1.1.18
1.1.17
1.1.16
1.1.15
1.1.14
1.1.12
1.1.10
1.1.9
1.1.8
1.1.7
1.1.6
1.1.5
1.1.4
1.1.3
1.1.2
1.1.1
1.1.0
1.0.9
1.0.8
1.0.7
1.0.6
1.0.5
1.0.4
1.0.3
1.0.2
1.0.1
1.0.0
0.5.5
0.5.4
0.5.3
0.5.2
0.5.1
0.5.0
0.4.31
0.4.30
0.4.29
0.4.28
0.4.27
0.4.26
0.4.25
0.4.24
0.4.23
0.4.22
0.4.20
0.4.19
0.4.18
0.4.17
0.4.16
0.4.15
0.4.14
0.4.13
0.4.12
0.4.11
0.4.10
0.4.9
0.4.8
0.4.7
0.4.6
0.4.5
0.4.4
0.4.3
0.4.2
0.4.1
0.4.0
0.3.9
0.3.8
0.3.7
0.3.6
0.3.5
0.3.4
0.3.3
0.3.2
0.3.1
0.3.0
0.2.1
0.2.0
0.1.0
A Utilitary package functionalities modules for improve a secure performatic development.
Current section
Files
Jump to
Current section
Files
lib/krug/util/network.util.ex
defmodule Krug.NetworkUtil do
@moduledoc """
Utilitary module to handle network info
"""
@moduledoc since: "1.1.17"
alias Krug.StringUtil
alias Krug.MapUtil
alias Krug.NumberUtil
@ip_regexp ~r/^\d+\.\d+\.\d+\.\d+$/
@exponent_a 256 * 256 * 256
@exponent_b 256 * 256
@exponent_c 256
@doc """
Start the local node from a cluster of nodes
"""
def start_local_node_to_cluster_ip_v4(cluster_name,cluster_cookie) do
local_node = "#{cluster_name}@#{get_local_wlan_ip_v4()}"
|> String.to_atom()
[
local_node,
:longnames
]
|> :net_kernel.start()
cluster_cookie
|> String.to_atom()
|> :erlang.set_cookie()
local_node
end
@doc """
Extract a list of valid ip v4 addresses from a "ips_string", splitted by the "ips_separator".
"""
def extract_valid_ip_v4_addresses(ips_string,ips_separator) do
ips_string
|> StringUtil.trim()
|> StringUtil.split(ips_separator)
|> Enum.filter(
fn
ip -> String.match?(ip,@ip_regexp)
end
)
end
@doc """
Obtains the local machine ipv4 local network IP (i.e: 192.168.1.2 | 172.0.0.2)
"""
def get_local_wlan_ip_v4() do
:inet.getifaddrs()
|> Tuple.to_list()
|> tl()
|> hd()
|> filter_local_wlan_ip()
end
@doc """
Obtains the local machine ipv4 local netmask (i.e: 255.255.0.0 | 255.255.255.0)
"""
def get_local_wlan_ip_v4_netmask() do
:inet.getifaddrs()
|> Tuple.to_list()
|> tl()
|> hd()
|> filter_local_wlan_ip(true)
end
@doc """
Based in a IP address and a netmask (subnet /16 or /24),
generates a list of IP addresses suposed by in a same network/VPC
For subnets /16 will be returned only a limit range of ≃10%
of all possible IP's. This will be IP's that are near neighboors
of given "ipv4_address".
Example given "ipv4_address" was 192.168.40.120, then
the first will be 192.168.30.0 and the last will be 192.168.50.255
"""
def generate_ipv4_netmask_16_24_ip_list(ipv4_address,ipv4_netmask) do
netmask_16 = ipv4_netmask
|> StringUtil.split(".")
|> Enum.at(2)
ip_array = ipv4_address
|> StringUtil.split(".")
|> Enum.reverse()
|> tl()
cond do
(netmask_16 == "0")
-> ip_array
|> tl()
|> Enum.reverse()
|> generate_ipv4_netmask_16_ip_list(
ip_array
|> hd()
|> netmask_16_calculate_start_range()
)
true
-> ip_array
|> Enum.reverse()
|> generate_ipv4_netmask_24_ip_list()
end
end
@doc """
Filter the nodes list (atom list on format :"my_cookie@ipv4") according IP address
and get the minor address.
"""
def get_minor_node(node_list) do
node_list
|> get_minor_node2()
end
@doc """
Filter the nodes list (atom list on format :"my_cookie@ipv4") according IP address
and get the major address.
"""
def get_major_node(node_list) do
node_list
|> get_major_node2()
end
###########################################
# Private functions
###########################################
defp netmask_16_calculate_start_range(ip_third_position) do
ip_third_position = ip_third_position
|> NumberUtil.to_integer()
cond do
(ip_third_position > 10)
-> ip_third_position - 11
true
-> 0
end
end
defp filter_local_wlan_ip(ips_list,netmask \\ false,local_ip \\ nil) do
cond do
(Enum.empty?(ips_list))
-> local_ip
true
-> ips_list
|> filter_local_wlan_ip2(netmask)
end
end
defp filter_local_wlan_ip2(ips_list,netmask) do
list = ips_list
|> hd()
|> Tuple.to_list()
cond do
(String.starts_with?("#{list |> hd()}","wl"))
-> filter_local_wlan_ip([],netmask,list |> extract_local_ip(netmask))
true
-> ips_list
|> tl()
|> filter_local_wlan_ip(netmask)
end
end
defp extract_local_ip(list,netmask) do
data = list
|> tl()
|> hd()
|> Enum.filter(
fn({k,v}) ->
(!netmask and k == :addr and :inet.is_ipv4_address(v))
or
(netmask and k == :netmask and :inet.is_ipv4_address(v))
end
)
cond do
(netmask)
-> data
|> Enum.into(%{})
|> MapUtil.get(:netmask)
|> :inet.ntoa()
true
-> data
|> Enum.into(%{})
|> MapUtil.get(:addr)
|> :inet.ntoa()
end
end
defp generate_ipv4_netmask_16_ip_list(ipv4_base_array,start_position,counter \\ 0,ipv4_array_list \\ []) do
cond do
(counter > 20)
-> ipv4_array_list
true
-> ipv4_base_array
|> generate_ipv4_netmask_16_ip_list(
start_position,
counter + 1,
ipv4_base_array
|> generate_ipv4_netmask_16_ip_list2(start_position + counter,ipv4_array_list)
)
end
end
defp generate_ipv4_netmask_16_ip_list2(ipv4_base_array,counter,ipv4_array_list) do
[
counter
| ipv4_base_array |> Enum.reverse()
]
|> Enum.reverse()
|> generate_ipv4_netmask_24_ip_list(0,ipv4_array_list)
end
defp generate_ipv4_netmask_24_ip_list(ipv4_base_array,counter \\ 0,ipv4_array_list \\ []) do
cond do
(counter > 255)
-> ipv4_array_list
true
-> ipv4_base_array
|> generate_ipv4_netmask_24_ip_list(
counter + 1,
add_ipv4_on_list(ipv4_base_array,ipv4_array_list,counter)
)
end
end
defp add_ipv4_on_list(ipv4_base_array,ipv4_array_list,counter) do
[
add_ipv4_block(ipv4_base_array,counter)
| ipv4_array_list
]
end
defp add_ipv4_block(ipv4_base_array,counter) do
[
counter
| ipv4_base_array |> Enum.reverse()
]
|> Enum.reverse()
|> Enum.join(".")
end
defp get_minor_node2(node_list,minor \\ nil) do
cond do
(Enum.empty?(node_list))
-> minor
(nil == minor)
-> node_list
|> tl()
|> get_minor_node2(node_list |> hd())
true
-> node_list
|> tl()
|> get_minor_node2(
get_minor_node_by_value(minor,node_list |> hd())
)
end
end
defp get_major_node2(node_list,major \\ nil) do
cond do
(Enum.empty?(node_list))
-> major
(nil == major)
-> node_list
|> tl()
|> get_major_node2(node_list |> hd())
true
-> node_list
|> tl()
|> get_major_node2(
get_major_node_by_value(major,node_list |> hd())
)
end
end
defp get_minor_node_by_value(current,candidate) do
[current_value,candidate_value] = current
|> extract_nodes_value(candidate)
cond do
(current_value <= candidate_value)
-> current
true
-> candidate
end
end
defp get_major_node_by_value(current,candidate) do
[current_value,candidate_value] = current
|> extract_nodes_value(candidate)
cond do
(current_value >= candidate_value)
-> current
true
-> candidate
end
end
defp extract_nodes_value(current,candidate) do
[
current
|> extract_node_ip_comparison_value(),
candidate
|> extract_node_ip_comparison_value()
]
end
defp extract_node_ip_comparison_value(node) do
[a,b,c,d] = node
|> Atom.to_string()
|> StringUtil.split("@")
|> tl()
|> hd()
|> StringUtil.split(".")
a = a
|> NumberUtil.to_integer()
b = b
|> NumberUtil.to_integer()
c = c
|> NumberUtil.to_integer()
d = d
|> NumberUtil.to_integer()
(a * @exponent_a) + (b * @exponent_b) + (c * @exponent_c) + d
end
end