%PDF- %PDF-
Mini Shell

Mini Shell

Direktori : /snap/core20/2599/usr/lib/python3/dist-packages/cloudinit/net/__pycache__/
Upload File :
Create Path :
Current File : //snap/core20/2599/usr/lib/python3/dist-packages/cloudinit/net/__pycache__/sysconfig.cpython-38.pyc

U

Ӈg��@s6ddlZddlZddlZddlZddlZddlZddlmZmZddl	m
Z
mZddlm
Z
mZddlmZmZmZmZmZddlmZe�e�Zddd	d
ddd
dddddddgZd,dd�Zdd�Zdd�ZGdd�d�ZGdd�de�ZGd d!�d!e�Z Gd"d#�d#ej!�Z!d$d%�Z"d-d&d'�Z#d.d(d)�Z$d/d*d+�Z%dS)0�N)�Dict�Optional)�subp�util)�networkmanager_conf�resolv_conf)�IPV6_DYNAMIC_TYPES�is_ipv6_address�net_prefix_to_ipv4_mask�renderer�subnet_is_ipv6)�NetworkStateZ	almalinuxZcentosZ
cloudlinuxZ	eurolinuxZfedoraZmiraclelinuxZ	openeulerZOpenCloudOSZopenmandriva�rhelZrocky�suseZ	TencentOSZ	virtuozzo�#cCsJddg}tt|��D]*}||r6|d||||<q|||<qd�|�S)Nz1Created by cloud-init automatically, do not edit.�� �
)�range�len�join)�sep�lines�i�r�9/usr/lib/python3/dist-packages/cloudinit/net/sysconfig.py�_make_header)s�
rcCsd}|ddko|d|kS)N)z::z0.0.0.0�prefixr�networkr)�routeZdefault_netsrrr�_is_default_route6sr cCs6t�d|�r.|�d�r$|�d�r$|Sd|Sn|SdS)Nz\s�"z"%s")�re�search�
startswith�endswith)�valuerrr�_quote_value;s

r'c@sjeZdZdZddd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dd�Zdd�Zdd�Z
dd�ZdS)�	ConfigMapz!Sysconfig like dictionary object.�yesZno)TFcCs
i|_dS�N��_conf��selfrrr�__init__OszConfigMap.__init__cCs||j|<dSr*r+)r.�keyr&rrr�__setitem__RszConfigMap.__setitem__cCs
|j|Sr*r+�r.r0rrr�__getitem__UszConfigMap.__getitem__cCs|j�|�Sr*)r,�getr2rrrr4Xsz
ConfigMap.getcCs
||jkSr*r+r2rrr�__contains__[szConfigMap.__contains__cCs|j�|d�dSr*)r,�popr2rrr�drop^szConfigMap.dropcCs
t|j�Sr*)rr,r-rrr�__len__aszConfigMap.__len__cCsdS)z6Skip the pair key, value if it matches a certain rule.Fr�r.r0�valrrr�skip_key_valuedszConfigMap.skip_key_valuecCs�t��}|�t��|jr$|�d�t|j���D]X}|j|}|�||�rNq2t|t	�rb|j
|}t|t�stt|�}|�d|t|�f�q2|�
�S)Nr�%s=%s
)�io�StringIO�writerr,�sorted�keysr;�
isinstance�bool�	_bool_map�strr'�getvalue)r.�bufr0r&rrr�	to_stringhs




zConfigMap.to_stringcCs|j�|�dSr*)r,�update)r.ZupdatesrrrrIxszConfigMap.updateN)�__name__�
__module__�__qualname__�__doc__rDr/r1r3r4r5r7r8r;rHrIrrrrr(Fs�r(csReZdZdZ�fdd�Zdd�Zedd��Zedd	��Zd
d�Z	dd
d�Z
�ZS)�Routez!Represents a route configuration.cs<tt|���d|_d|_d|_||_||_||_||_	dS)N�F)
�superrNr/�last_idx�has_set_default_ipv4�has_set_default_ipv6�_route_name�_base_sysconf_dir�route_fn_tpl_ipv4�route_fn_tpl_ipv6)r.Z
route_name�base_sysconf_dir�ipv4_tpl�ipv6_tpl��	__class__rrr/szRoute.__init__cCs>t|j|j|j|j�}|j��|_|j|_|j|_|j	|_	|Sr*)
rNrTrUrVrWr,�copyrQrRrS)r.�rrrrr]�s�z
Route.copycCs|j|j|jd�S�N)�base�name)rVrUrTr-rrr�	path_ipv4�s�zRoute.path_ipv4cCs|j|j|jd�Sr_)rWrUrTr-rrr�	path_ipv6�s�zRoute.path_ipv6cCsd|kS)N�:r)r.�addressrrr�
is_ipv6_route�szRoute.is_ipv6_route�ipv4c	Cs�|dkrtdt|���t��}|�t��|jr<|�d�d}t|j���D�]p}d|kr^qN|�	dd�}t|j|�}t|jd|�}|dk�rV|�
|��sVt|jd	|�}|d
}|�ddt|�t|�f�|�ddt|�t|�f�|�dd	t|�t|�f�d|}	|	|jk�r�t|j|	�}
|�ddt|�t|
�f�qN|d
krN|�
|�rNt|jd|���}d||jk�r�dt|jd|�nd}
|�d||||
|jf�qN|�
�S)N)rg�ipv6zUnknown protocol '%s'r����ADDRESSr�GATEWAYrg�NETMASKrOr<�METRICrh�PREFIXzmetric z%s/%s via %s %s dev %s
)�
ValueErrorrEr=r>r?rr,r@rA�replacerfr'rTrF)r.�protorGZreindexr0�indexZ
address_valueZ
gateway_valueZ
netmask_valueZ
metric_keyZmetric_valueZprefix_valuerrrrH�sp
�������������zRoute.to_string)rg)rJrKrLrMr/r]�propertyrbrcrfrH�
__classcell__rrr[rrN|s



rNcs�eZdZdZdddddd�Zd�fd	d
�	Zedd��Zejd
d��Zedd��Z	e	jdd��Z	edd��Z
ddd�Zdd�Z�Z
S)�NetInterfacezERepresents a sysconfig/networking-script (and its config + children).ZEthernetZBondZBridgeZ
InfiniBand�Vlan)�ethernet�bond�bridge�
infiniband�vlanrwcsrtt|���g|_||_|j�d�}t|||�d�|�d�d�|_|j�d�|_||_	||_
||jd<||_dS)N�route_templatesrgrh)rYrZ�iface_templates�DEVICE)
rPrur/�children�	templatesr4rN�routes�iface_fn_tpl�kind�_iface_namer,rU)r.�
iface_namerXr�r�Z	route_tplr[rrr/�s�
zNetInterface.__init__cCs|jSr*)r�r-rrrra	szNetInterface.namecCs||_||jd<dS)Nr~)r�r,)r.r�rrrra
scCs|jSr*)�_kindr-rrrr�szNetInterface.kindcCs,||jkrt|��||_|j||jd<dS)N�TYPE)�iface_typesror�r,)r.r�rrrr�s
cCs|j|j|jd�Sr_)r�rUrar-rrr�paths�zNetInterface.pathFcCsHt|j|j|j|jd�}|j��|_|r4t|j�|_|rD|j	��|_	|S)N)r�)
rurarUr�r�r,r]�listrr�)r.Z
copy_childrenZcopy_routes�crrrr]#s�zNetInterface.copycCs|dkr|dkrdSdS)Nr�rvTFrr9rrrr;.szNetInterface.skip_key_value)rw)FF)rJrKrLrMr�r/rsra�setterr�r�r]r;rtrrr[rru�s*�	�





ruc@sDeZdZUdZdddd�ddd�d	�Zd
ddd
ddd�dddddd�d	�Zeddddddddddd d!d"d#d$g�ZiZe	e
d%<dEd'd(�Zed)d*��Z
ed+d,��Zed-d.��Zed/d0��Zed1d2��Zed3d4��Zed5d6��ZedFd7d8��ZedGd9d:��Zeed;�d<d=��Zed>d?��ZedHed;�d@dA��ZdIeee	d&dB�dCdD�Zd&S)J�Rendererz7Renders network information in a /etc/sysconfig format.TF�none)�ONBOOTZUSERCTL�	BOOTPROTO�static�auto)r��	STARTMODE)rr�IPV6_FORCE_ACCEPT_RAZSTPZAGEINGZPRIOZHWADDR�MTU)�	accept-ra�
bridge_stp�
bridge_ageing�bridge_bridgeprio�mac_address�mtu�
BRIDGE_STPZBRIDGE_AGEINGTIMEZBRIDGE_PRIORITY�LLADDR)r�r�r�r�r�)Z	bond_modezmode=%s)Zbond_xmit_hash_policyzxmit_hash_policy=%s)Zbond_miimonz	miimon=%s)Zbond_min_linkszmin_links=%s)Zbond_arp_intervalzarp_interval=%s)Zbond_arp_ip_targetzarp_ip_target=%s)Zbond_arp_validatezarp_validate=%s)Zbond_ad_selectzad_select=%s)Zbond_num_grat_arpznum_grat_arp=%s)Zbond_downdelayzdowndelay=%s)Zbond_updelayz
updelay=%s)Zbond_lacp_ratezlacp_rate=%s)Zbond_fail_over_maczfail_over_mac=%s)Zbond_primaryz
primary=%s)Zbond_primary_reselectzprimary_reselect=%sr�NcCsv|si}|�dd�|_|�dd�|_|�dd�|_d}|�d|�|_|�d	�|�d
�|�d�d�|_|�d
d�|_dS)N�sysconf_dirz
etc/sysconfig�
netrules_pathz(etc/udev/rules.d/70-persistent-net.rules�dns_pathzetc/resolv.confz,etc/NetworkManager/conf.d/99-cloud-init.conf�networkmanager_conf_path�controlr}r|)r�r}r|�flavorr)r4r�r�r�r�r�r�)r.Zconfig�nm_conf_pathrrrr/ps$���zRenderer.__init__cCs�t�|j�|i��}|�|�dD]H}|�|�}|dk	r"|dkrN|ddkrNq"|j|�|�}|r"|||<q"d|kr�|dr�|ddkr�d|d<dS)	N)r�r�r�r��type)�physicalrzZ	wakeonlanr�zwol gZETHTOOL_OPTS)r]�deepcopy�iface_defaultsr4rI�cfg_key_maps)�cls�iface�	iface_cfgr�Zflavor_defaults�old_key�	old_value�new_keyrrr�_render_iface_shared�s"


��
�zRenderer._render_iface_sharedcCs�|dkr,d|d<d|kr4d|d<|�d�nd|d<t|t|j�d�D�]�\}}d}|�d	�}|d
ksn|dkr�|dkr�|ddkr�d|d<nd
|d<d
|d<nB|dkr�|dkr�d|d<d|d<d|d<d|d<nd|d<d|d<�n�|dk�rF|dk�r"|ddk�rd|d<nd
|d<d|d<n d|d<d|d<d|d<d|d<�n�|dk�r�|dk�r�|ddk�rrd|d<nd
|d<d|d<nd|d<d|d<�nD|dk�r�|d}	d|d<|dk�r�|	dk�r�d|d<�n
|dk�r�t|��r�|dk�r�d}d|d<d|k�rtt||k�o |d||k�}
|
�rDt�d |j	|||d�t|��rh|dk�rZn|d||<n|d||<t|��r�|dk�r�d|d!<d|d<nB|d"k�r�|dk�r�t�
d#|�n||k|d$<ntd%||j	f��|�d&�d"krF|dk�r�d"|d'<qFd|d$<qFd(}d(}t|t|j�d�D�]x\}}|�d	�}d)|k�r�|dk�rpt|��rb|d)|d*<n|d)|d+<n|dk�r�|d)|d,<|d-k�r�|dk�r"|�r"|ddk�r"d|d.<�q"�q"|tk�rАq"�q"|dk�r"t|��r~|d/}d0|d1|d2f}
|d3k�r(|dk�r|
|d4<n|
|d5<nT|d/k�rP|dk�rF|
|d6<n|
|d7<n,|dk�rh|
|d8|<n|d7d9|
7<nB|d/}|d3k�r�d:nt
|�}|d1|d;|<t|d2�|d<|<d=|k�r|dk�rd|d><t|d=��r�|d=|d?<n|d=|d@<dA|k�r*|dk�r*d9�|dA�|dB<dC|k�r"|dk�r"t|dC�dDk�rht�
dE|j	t|dC��t|dCddD�d/�D]\}}||dFt
|�<�q~�q"dS)GNrr�r��BRIDGE�dhcpr���startr�r��dhcp6zipv6_dhcpv6-stateful)�dhcp4r�ZmanagedZDHCLIENT6_MODErTZDHCPV6CZIPV6INITFZ
IPV6_AUTOCONFZIPV6_FAILURE_FATALzipv6_dhcpv6-stateless�infoz-SZDHCPV6C_OPTIONSZ
ipv6_slaac)r�r�r�)r�Zstatic6ZIPV6_MTUr�zZNetwork config: ignoring %s device-level mtu:%s because ipv4 subnet-level mtu:%s provided.r�Zmanualz Unknown subnet type setting "%s"r�z1Unknown subnet type '%s' found for interface '%s'r�r�ri�metric�IPV6_ROUTE_METRIC�IPV4_ROUTE_METRICrm�r�r��DHCLIENT_SET_DEFAULT_ROUTErOz%s/%srerrZIPADDR6ZIPV6ADDRZ	IPADDR6_1ZIPV6ADDR_SECONDARIESz
IPADDR6_%drrZIPADDRrl�gateway�DEFROUTE�IPV6_DEFAULTGWrk�
dns_searchZDOMAIN�dns_nameservers�z6%s has %d entries in dns_nameservers. Only 3 are used.ZDNS)r7�	enumeraterrr4rrC�LOGZwarningra�debugrorrEr
r	r)r�r��subnets�has_default_router�r�subnetZmtu_key�subnet_typeZbootproto_inZmtu_mismatchZ
ipv4_indexZ
ipv6_indexZ	ipv6_cidrZsuff�krrr�_render_subnets�s


�














��




��





















��
�zRenderer._render_subnetsc
Cs||dkrdSt|t|j�d�D�]V\}}|�d�}|�dg�D�]4}|�d�pXt|d�}	t|��r2|tk�r2|�d�r~|js�|�d�r�|jr�t	d|j
��d	|d
<|ddkr�d	|d
<d|kr�|	r�|d|d<d	|_n|d|d<d	|_d|k�rt|dk�r$t|��r|d|d<n|d|d<n|d|d<q>dD].\}
}|
|k�r6|�|j��}||
||<�q6|jd7_q>qdS)Nrr�r�r�rhr�rgz?Duplicate declaration of default route found for interface '%s'Tr�r�r�r�r�rkr�rr�r�rm))r�rk)r�rm)rrn)Znetmaskrl)rrjrO)
r�rrr4r	r rrRrSrorarrQ)
r�r��	route_cfgr�r��_r�r�rZis_ipv6r��new_namer�rrr�_render_subnet_routesjsb
���������	


�
�

zRenderer._render_subnet_routesc	Cs�g}|jD]\\}}||�dd�g}|D]>}||kr&||}t|ttf�rRd�|�}|�||�q
q&q
|r�|dkr�d�|�|d<nd�|�|d<dS)Nr��-rrZBONDING_MODULE_OPTSZBONDING_OPTS)�
bond_tpl_optsrprB�tupler�r�append)	r�r�r�r�Z	bond_optsZbond_keyZ	value_tplZ	bond_keysZ
bond_valuerrr�_render_bonding_opts�s
zRenderer._render_bonding_optsc
Cshtj}|�|�D]R}|�d�p$|d}|�dg�}||}|j}	|�|||j|�|�||	||�qdS)N�	config_idrar�)rZfilter_by_physical�iter_interfacesr4r�r�r�r�)
r��
network_state�iface_contentsr�Zphysical_filterr�r��
iface_subnetsr�r�rrr�_render_physical_interfaces�s$��z$Renderer._render_physical_interfacescsdt�d�}t�d�}|�|�D�]>}|d�|�}|�|||�|g}|�|j�|D]}	d|	d<|dkrXd|	_qX|�d�r�|dkr�|�d�|d<n|�d�|d	<|�d
g�}
|j	}|�
||
|j|�|�|||
|�t
�fdd�|�|�D��}t|�D]`\}
}|dk�rd
|
}nd|
}|||<||}|dk�rLd|d<d|d<q��|d<d|d<q�qdS)Nrx�bond-masterraTZBONDING_MASTERrr�r��MACADDRr�cs g|]}|d�kr|d�qS)r�rar)�.0Zslave_iface�r�rr�
<listcomp>	s�z4Renderer._render_bond_interfaces.<locals>.<listcomp>zBONDING_SLAVE_%szBONDING_SLAVE%sr�r�Zhotplugr�ZMASTERZSLAVE)r�filter_by_typeZfilter_by_attrr�r��extendrr�r4r�r�r�r�r@r�)r�r�r�r�Zbond_filterZslave_filterr�r�Zmaster_cfgsZ
master_cfgr�r�Zbond_slavesrrZ
bond_slaveZslavestrZ	slave_cfgrr�r�_render_bond_interfaces�s`


��
���




z Renderer._render_bond_interfacesc
	Cs�t�d�}|�|�D]�}|d}||}|dkr^|�d�}|rF||d<|d|�d��|d<nJd|d	<d|_|d
}	t|	|d�}
||
kr�t�d||	d�	|
��|	|d
<|�dg�}|j
}|�|||j|�|�
||||�qdS)Nr{rar�vlan_idZVLAN_ID�.ZETHERDEVICETZVLANzvlan-raw-devicezIName '%s' for vlan '%s' is not officially supportedby RHEL. Supported: %srZPHYSDEVr�)rr�r�r4�rfindr��_supported_vlan_namesr�r�rr�r�r�r�)
r�r�r�r�Zvlan_filterr�r�r�r��rdevZ	supportedr�r�rrr�_render_vlan_interfaces!sF

���z Renderer._render_vlan_interfacesc	sng�g�|��D]�}|dD]0}d|kr6��|d�d|kr��|d�qd|kr��fdd�|ddD�7���fdd�|dd	D�7�q|jr���fd
d�|jD�7�|jrЈ�fdd�|jD�7�tt��t��g�s�dSt�d�}|�rtj	�
|��rt�t�|��}�D]}|�
|��q�D]}|�|��q0td
�}t|�}|�|��sj|d|}|S)Nr�r�r��dnscsg|]}|�kr|�qSrr)r�r���found_nameserversrrr�Xs�z(Renderer._render_dns.<locals>.<listcomp>�nameserverscsg|]}|�kr|�qSrr�r�r#��found_dns_searchrrr�]s�r#csg|]}|�kr|�qSrr)r��
nameserverr�rrr�hs�csg|]}|�kr|�qSrrr�r�rrr�ns�r�;r)r�r�r��dns_searchdomains�anyrrZ
ResolvConf�osr��isfilerZload_text_fileZadd_nameserverZadd_search_domainrrEr$)	r��existing_dns_pathr�r��contentr�Zsearchdomain�headerZcontent_strr)r�r�r�_render_dnsHsV
�
�

����
�zRenderer._render_dnscCs�d}t�d�}|��D]V}|dD]}d|ks6d|kr"d}q@q"|sd|kr|ddsd|dd	rd}qnq|js~|js~|r�|�d
dd�t|�dkr�dSd�t�d
d
�|�	��d
g�}|S)NFrr�r�r�Tr�r�r#�mainr�rr)
rZNetworkManagerConfr�r�r�Zset_section_keypairrrrr?)r�r�Z	iface_dnsr�r�r��outrrr�_render_networkmanager_conf�s8
��
�
����z$Renderer._render_networkmanager_conf)r�cCs�dd�|j|��D�}t�d�}|�|�D�]P}|d}||}|dkrPd|_|��D]\}	}
|	|krX||	||
<qX|dkr�d|kr�|�d�r�d|d<nd|d<|�d	�r�d
}|dkr�d}|�d	�||<|dkr�|�dg�r�d
d�|�d��|d<|�dg�D]F}||}
|
g}|�|
j	�|D] }|}|dk�r:d}||d<�q$�q|�dg�}|j
}|�|||j|�|�
||||�q,dS)NcSs i|]\}}|�d�r||�qS)ry)r$)r�Zold_kZnew_krrr�
<dictcomp>�s
�z6Renderer._render_bridge_interfaces.<locals>.<dictcomp>ryrarr�ZonZoffr�r�Z	LLADDRESSZbridge_portsz%srZBRIDGE_PORTSr)r�r�)r��itemsrr�r�r�r4rr�rr�r�r�r�)r�r�r�r�Zbridge_key_mapZ
bridge_filterr�r�r�r�r�r0Zbridged_iface_nameZbridged_cfgZbridged_cfgsZ
bridge_cfgZbridge_valuer�r�rrr�_render_bridge_interfaces�sd�



�

��z"Renderer._render_bridge_interfacesc
Csht�d�}|�|�D]N}|d}||}d|_|�dg�}|j}	|�|||j|�|�||	||�qdS)Nrzrar�)	rr�r�r�r4r�r�r�r�)
r�r�r�r�Z	ib_filterr�r�r�r�r�rrr�_render_ib_interfaces�s&
��zRenderer._render_ib_interfacesc
Cs\|s
|j}i}|��D]f}|ddkr(q|�d�p8|d}t|d||�}|dkrf|�d�|�d�|�|||�|||<q|�|||�|�|||�|�|||�|�	|||�|�
|||�i}	|��D]�\}
}|s�|j�r|�
�|	|j<|jD]}|r�|�
�|	|j<q�|jr�t|jj|jjgdd	g�D]$\}}||	k�r0|j�
|�|	|<�q0q�|	S)
z3Given state, return /etc/sysconfig files + contentsr�Zloopbackr�rarr~r�rgrh)r�r�r4rur7r�r�r�r�r�rr�rrHr�r��ziprbrc)
r�rXr�r�r�r�r�r�r��contentsr�Zcpathrqrrr�_render_sysconfigsJ	�



�
zRenderer._render_sysconfig)r�r��returncCsT|s
|j}d}t�||j�}|j|||j|d���D]\}}t�|||�q4|j	r�t�||j	�}|j
||d�}	|	r�t�||	|�|jr�t�||j�}
|�||�}|r�t�|
||�|j
r�|�|�}t�||j
�}
tj|
||dd�t�||�d��}|�d��rPt�tj�|��t�dg}|j�r8|�d	�|�d
�t�|d�|�d|�dS)Ni�)r�)r�T)r��modeZ
preserve_moder�rzNETWORKING=yeszNETWORKING_IPV6=yeszIPV6_AUTOCONF=nor)r�r�target_pathr�rr�r�rZ
write_filer�r�r�r�r�Z_render_persistent_netr4r%Z
ensure_dirr�r��dirnamerZuse_ipv6r�r)r.r�r��targetZ	file_moderXr��datar�Zresolv_contentr�Znm_conf_contentZnetrules_contentr�Zsysconfig_pathZnetcfgrrr�render_network_state1sf����
�


�zRenderer.render_network_state)N)N)N)N)NN)rJrKrLrMr�r�r�r�r��dict�__annotations__r/�classmethodr�r�r�r�r�r�r��staticmethodr�r�r
r�rrrr
rrrrr�4s�
	���	����


M
G


>
&B%�>
��0��r�cs��fdd�dD�S)ziReturn list of supported names for vlan devices per RHEL doc
    11.5. Naming Scheme for VLAN Interfaces.csg|]}|j�t��d��qS)�r�Zvid)�format�int)r��vrrrr�is�z)_supported_vlan_names.<locals>.<listcomp>)z{rdev}{vid:04}z{rdev}{vid}z{rdev}.{vid:04}z{rdev}.{vid}rrrrrr�fs�r�cCs0t��dtkrdSt|�r dSt|�r,dSdS)NZvariantFT)rZsystem_info�
KNOWN_DISTROS�available_sysconfig�available_nm_ifcfg_rh�rrrr�	availabletsrcCst�t�|d��S)Nz;usr/lib*/NetworkManager/*/libnm-settings-plugin-ifcfg-rh.so)�globrrrrrrr~s��rcCs`ddg}ddg}|D]}tj|||d�sdSqddg}|D]}tj�t�||��r<d	Sq<dS)
NZifupZifdownz/sbinz	/usr/sbin)r#rFz/etc/sysconfig/network-scripts/network-functionszetc/sysconfig/configT)rZwhichr�r�r�r)rZexpectedr#�pZexpected_pathsrrrr�s�r)r)N)N)N)&r]rr=Zloggingr�r"�typingrrZ	cloudinitrrZcloudinit.distros.parsersrrZ
cloudinit.netrr	r
rrZcloudinit.net.network_stater
Z	getLoggerrJr�rrr r'r(rNrur�r�rrrrrrr�<module>sV
�

6nJ8




Zerion Mini Shell 1.0