晋太元中,武陵人捕鱼为业。缘溪行,忘路之远近。忽逢桃花林,夹岸数百步,中无杂树,芳草鲜美,落英缤纷。渔人甚异之,复前行,欲穷其林。 林尽水源,便得一山,山有小口,仿佛若有光。便舍船,从口入。初极狭,才通人。复行数十步,豁然开朗。土地平旷,屋舍俨然,有良田、美池、桑竹之属。阡陌交通,鸡犬相闻。其中往来种作,男女衣着,悉如外人。黄发垂髫,并怡然自乐。 见渔人,乃大惊,问所从来。具答之。便要还家,设酒杀鸡作食。村中闻有此人,咸来问讯。自云先世避秦时乱,率妻子邑人来此绝境,不复出焉,遂与外人间隔。问今是何世,乃不知有汉,无论魏晋。此人一一为具言所闻,皆叹惋。余人各复延至其家,皆出酒食。停数日,辞去。此中人语云:“不足为外人道也。”(间隔 一作:隔绝) 既出,得其船,便扶向路,处处志之。及郡下,诣太守,说如此。太守即遣人随其往,寻向所志,遂迷,不复得路。 南阳刘子骥,高尚士也,闻之,欣然规往。未果,寻病终。后遂无问津者。
| DIR:/opt/imunify360/venv/lib64/python3.11/site-packages/defence360agent/utils/ |
| Current File : //opt/imunify360/venv/lib64/python3.11/site-packages/defence360agent/utils/validate.py |
from enum import Enum
from ipaddress import (
IPV4LENGTH,
IPV6LENGTH,
AddressValueError,
IPv4Address,
IPv4Network,
IPv6Address,
IPv6Network,
ip_address,
ip_network,
)
from typing import Literal, Optional, Union
IPVersion = Literal["ipv4", "ipv6"]
class LocalhostIP(str, Enum):
ipv4 = "127.0.0.1"
ipv6 = "::1"
def __str__(self):
return self.value
class NumericIPVersion(int, Enum):
"""Example: (IPListRecord.version==NumericIPVersion[ip_version])"""
ipv4 = 4
ipv6 = 6
def __str__(self):
return str(self.value)
@classmethod
def from_ip_version(
cls, ip_version: Optional[IPVersion]
) -> Optional["NumericIPVersion"]:
if ip_version is None:
return None
return cls.ipv4 if ip_version == IP.V4 else cls.ipv6
def is_valid_ipv4_addr(addr):
return IP.is_valid_ipv4_addr(addr)
def is_valid_ipv4_network(addr, strict=False):
return IP.is_valid_ipv4_network(addr, strict)
class IP:
V4: IPVersion = "ipv4"
V6: IPVersion = "ipv6"
@classmethod
def check_ip_ver(cls, version):
return any(version == ver for ver in [cls.V4, cls.V6])
@classmethod
def is_valid_ip(cls, addr):
try:
ip_address(addr)
except ValueError:
return False
return True
@classmethod
def is_valid_ip_network(cls, *args, **kwargs):
return cls.is_valid_ipv4_network(
*args, **kwargs
) or cls.is_valid_ipv6_network(*args, **kwargs)
@classmethod
def is_valid_ipv4_addr(cls, addr):
try:
IPv4Address(addr)
except AddressValueError:
return False
return True
@classmethod
def is_valid_ipv6_addr(cls, addr):
try:
IPv6Address(addr)
except AddressValueError:
return False
return True
@classmethod
def is_valid_ipv4_network(
cls, addr: Union[str, IPv4Network, IPv6Network], strict=False
):
try:
ip = IPv4Network(addr)
except ValueError:
return False
if strict:
# IPV4LENGTH - netmask for host
return ip.prefixlen != IPV4LENGTH
return True
@classmethod
def is_valid_ipv6_network(
cls, addr: Union[str, IPv4Network, IPv6Network], strict=False
):
try:
ip = IPv6Network(addr)
except ValueError:
return False
if strict:
# IPV6LENGTH - netmask for host
return ip.prefixlen != IPV6LENGTH
return True
@classmethod
def type_of(cls, addr):
if cls.is_valid_ipv4_network(addr):
return IP.V4
elif cls.is_valid_ipv6_network(addr):
return IP.V6
raise ValueError("Invalid ip address")
@classmethod
def convert_to_ipv6_network(cls, ip, mask="/64"):
"""Conver ipv6 addr to ipv6 network with mask
:param str ip: ip for converting
:param str mask: ip network mask
"""
network = IPv6Network(ip + mask, strict=False)
return str(network)
@staticmethod
def adopt_to_ipvX_network(
ip_arg: Union[str, IPv4Address, IPv4Network, IPv6Address, IPv6Network]
) -> Union[IPv4Network, IPv6Network]:
"""
Eliminate str from the Union
:raise ValueError: if cannot convert ip_arg str to ip network
"""
if isinstance(ip_arg, (IPv4Network, IPv6Network)):
return ip_arg
elif isinstance(ip_arg, (IPv4Address, IPv6Address)):
prefixlen = IPV4LENGTH if ip_arg.version == 4 else IPV6LENGTH
return ip_network((int(ip_arg), prefixlen))
return ip_network(ip_arg)
@classmethod
def ip_net_to_string(cls, net: Union[IPv4Network, IPv6Network]) -> str:
"""
IPv4Network('192.168.1.1/32') -> '192.168.1.1'
IPv4Network('192.168.1.0/24') -> '192.168.1.0/24'
"""
if not int(net.hostmask):
return str(net.network_address)
return str(net)
@classmethod
def ipv6_to_64network(
cls, ip: Union[IPv4Address, IPv6Address, str]
) -> Union[IPv4Address, IPv6Network]:
if isinstance(ip, IPv6Address):
return IPv6Network(cls.convert_to_ipv6_network(str(ip)))
return ip
|