%PDF- %PDF-
Mini Shell

Mini Shell

Direktori : /lib/python2.7/site-packages/salt/modules/
Upload File :
Create Path :
Current File : //lib/python2.7/site-packages/salt/modules/selinux.pyo

�
���^c@@smdZddlmZmZmZddlZddlZddlZddl	Zddl
Zddljj
Z
ddlZddlmZmZddlmZidd6dd	6d
d6dd
6dd6dd6dd6dd6Zd�Ze
jd��Zd�Zd�Zd�Zd�Zed�Zed�Zd�Zd�Z d �Z!d!�Z"d"�Z#d#�Z$d$�Z%d%�Z&d&�Z'd'�Z(dd(�Z)ddddd)�Z+ddddd*�Z,ddddd+�Z-ddddd,�Z.ddddd-�Z/ed.�Z0ed/�Z1dddd0�Z2ddddd1�Z3ddd2�Z4ddddd3�Z5dS(4u�
Execute calls on selinux

.. note::
    This module requires the ``semanage``, ``setsebool``, and ``semodule``
    commands to be available on the minion. On RHEL-based distributions,
    ensure that the ``policycoreutils`` and ``policycoreutils-python``
    packages are installed. If not on a Fedora or RHEL-based distribution,
    consult the selinux documentation for your distribution to ensure that the
    proper packages are installed.
i(tabsolute_importtunicode_literalstprint_functionN(tCommandExecutionErrortSaltInvocationError(tsixu	all filesuauregular fileufu	directoryuducharacter deviceucublock deviceubusocketusu
symbolic linkulu
named pipeupcC@sXd	}x1|D])}tjjj|�s
t|dfSq
WtddkrNdStdfS(
ug
    Check if the os is Linux, and then if selinux is running in permissive or
    enforcing mode.
    usemanageu	setseboolusemoduleu is not in the pathukerneluLinuxuselinuxu1Module only works on Linux with selinux installed(usemanageu	setseboolusemodule(tsalttutilstpathtwhichtFalset
__grains__(t
required_cmdstcmd((s8/usr/lib/python2.7/site-packages/salt/modules/selinux.pyt__virtual__*s
cC@slySxHdD]@}tjj|�r
tjjtjj|d��rJ|Sq
q
WdSWntk
rgdSXdS(u�
    Return the location of the SELinux VFS directory

    CLI Example:

    .. code-block:: bash

        salt '*' selinux.selinux_fs_path
    u/sys/fs/selinuxu/selinuxuenforceN(u/sys/fs/selinuxu/selinux(tosRtisdirtisfiletjointNonetAttributeError(t	directory((s8/usr/lib/python2.7/site-packages/salt/modules/selinux.pytselinux_fs_path=s

!
cC@s�t�}|dkrdSyitjj|d�}tjjj|d��6}tjj	j
|j��j�dkrwdSdSWdQXWnt
ttfk
r�dSXdS(u�
    Return the mode selinux is running in

    CLI Example:

    .. code-block:: bash

        salt '*' selinux.getenforce
    uDisableduenforceuru0u
Permissiveu	EnforcingN(RRRRRRRtfilestfopentstringutilst
to_unicodetreadlinetstriptIOErrortOSErrorR(t_selinux_fs_pathtenforcet_fp((s8/usr/lib/python2.7/site-packages/salt/modules/selinux.pyt
getenforceUs
	'cC@s�y�d}tjjj|d��_}xU|D]M}tjjj|�}|j�jd�r+|jd�dj	�j�Sq+WWdQXWnt
ttfk
r�dSXdS(u�
    Return the selinux mode from the config file

    CLI Example:

    .. code-block:: bash

        salt '*' selinux.getconfig
    u/etc/selinux/configuruSELINUX=u=iN(RRRRRRRt
startswithtsplitt
capitalizeRRRR(tconfigR!tline((s8/usr/lib/python2.7/site-packages/salt/modules/selinux.pyt	getconfigms

+c	
C@set|tj�r�|j�dkr3d}d}q�|j�dkrTd}d}q�|j�dkrud}d}q�d	j|�Sn4t|t�r�|r�d}q�d}n
d	j|�St�dkr[tjj	t
�d
�}yAtjj
j|d��#}|jtjjj|��WdQXWq[ttfk
rW}d
}t|j|���q[Xnd}y�tjj
j|d��}|j�}WdQXy^tjj
j|d��@}tjdd|d|�}|jtjjj|��WdQXWn4ttfk
r%}d}t|j|���nXWn4ttfk
r]}d}t|j|���nXt�S(u�
    Set the SELinux enforcing mode

    CLI Example:

    .. code-block:: bash

        salt '*' selinux.setenforce enforcing
    u	enforcingu1u	Enforcingu
permissiveu0u
PermissiveudisableduDisableduInvalid mode {0}uenforceuwNu)Could not write SELinux enforce file: {0}u/etc/selinux/configuru\nSELINUX=.*\nu	
SELINUX=u
u(Could not write SELinux config file: {0}u'Could not read SELinux config file: {0}(t
isinstanceRtstring_typestlowertformattintR"RRRRRRRRtwriteRtto_strRRRtreadtretsub(	tmodet
modestringR R!texctmsgR&t_cftconf((s8/usr/lib/python2.7/site-packages/salt/modules/selinux.pyt
setenforce�sN
					
&&cC@st�j|i�S(u�
    Return the information on a specific selinux boolean

    CLI Example:

    .. code-block:: bash

        salt '*' selinux.getsebool virt_use_usb
    (tlist_sebooltget(tboolean((s8/usr/lib/python2.7/site-packages/salt/modules/selinux.pyt	getsebool�s
cC@sB|rdj||�}ndj||�}td|dt�S(u�
    Set the value for a boolean

    CLI Example:

    .. code-block:: bash

        salt '*' selinux.setsebool virt_use_usb off
    usetsebool -P {0} {1}usetsebool {0} {1}ucmd.retcodetpython_shell(R,t__salt__R
(R<tvaluetpersistR
((s8/usr/lib/python2.7/site-packages/salt/modules/selinux.pyt	setsebool�s
cC@srt|t�siS|r"d}nd}x2tj|�D]!\}}dj|||�}q8Wtd|dt�S(u�
    Set the value of multiple booleans

    CLI Example:

    .. code-block:: bash

        salt '*' selinux.setsebools '{virt_use_usb: on, squid_use_tproxy: off}'
    u
setsebool -P u
setsebool u{0} {1}={2}ucmd.retcodeR>(R)tdictRt	iteritemsR,R?R
(tpairsRAR
R<R@((s8/usr/lib/python2.7/site-packages/salt/modules/selinux.pyt
setsebools�s
	cC@s�tdd�j�}i}xp|dD]d}|j�s?q'n|j�}i|ddd6|dd d6dj|d	�d
6||d<q'W|S(u�
    Return a structure listing all of the selinux booleans on the system and
    what state they are in

    CLI Example:

    .. code-block:: bash

        salt '*' selinux.list_sebool
    ucmd.runusemanage boolean -liuStateii����uDefaultu iuDescriptioni(R?t
splitlinesRR$R(tbdatatretR'tcomps((s8/usr/lib/python2.7/site-packages/salt/modules/selinux.pyR:�s#cC@st�j|i�S(u�
    Return the information on a specific selinux module

    CLI Example:

    .. code-block:: bash

        salt '*' selinux.getsemod mysql

    .. versionadded:: 2016.3.0
    (t
list_semodR;(tmodule((s8/usr/lib/python2.7/site-packages/salt/modules/selinux.pytgetsemodscC@sW|j�dkr$dj|�}n$|j�dkrHdj|�}ntd|�S(u�
    Enable or disable an SELinux module.

    CLI Example:

    .. code-block:: bash

        salt '*' selinux.setsemod nagios Enabled

    .. versionadded:: 2016.3.0
    uenabledusemodule -e {0}udisabledusemodule -d {0}ucmd.retcode(R+R,R?(RLtstateR
((s8/usr/lib/python2.7/site-packages/salt/modules/selinux.pytsetsemods
cC@sF|jd�dkr(td|�}ndj|�}td|�S(u�
    Install custom SELinux module from file

    CLI Example:

    .. code-block:: bash

        salt '*' selinux.install_semod [salt://]path/to/module.pp

    .. versionadded:: 2016.11.6
    usalt://iu
cp.cache_fileusemodule -i {0}ucmd.retcode(tfindR?R,(tmodule_pathR
((s8/usr/lib/python2.7/site-packages/salt/modules/selinux.pyt
install_semod)scC@sdj|�}td|�S(u�
    Remove SELinux module

    CLI Example:

    .. code-block:: bash

        salt '*' selinux.remove_semod module_name

    .. versionadded:: 2016.11.6
    usemodule -r {0}ucmd.retcode(R,R?(RLR
((s8/usr/lib/python2.7/site-packages/salt/modules/selinux.pytremove_semod;scC@s�tdd�j�}d}x,|D]$}|j�jd�r#d}q#q#W|dkr�tdd�j�}i}x|D]q}|j�s�qzn|j�}t|�dkr�itd6dd	6||d
<qzitd6dd	6||d
<qzWn�tdd�j�}i}x�|D]y}|j�s-qn|j�}t|�dkrnitd6|d
d	6||d
<qitd6|d
d	6||d
<qW|S(u�
    Return a structure listing all of the selinux modules on the system and
    what state they are in

    CLI Example:

    .. code-block:: bash

        salt '*' selinux.list_semod

    .. versionadded:: 2016.3.0
    ucmd.runusemodule -huufullunewusemodule -lfulliuEnableduVersioniusemodule -liiN(	R?RGRR#R$tlenR
RtTrue(thelptexttsemodule_versionR'tmdataRIRJ((s8/usr/lib/python2.7/site-packages/salt/modules/selinux.pyRKKs:








cC@s.|tj�kr*tdj|���ntS(u�
    .. versionadded:: 2017.7.0

    Checks if the given filetype is a valid SELinux filetype
    specification. Throws an SaltInvocationError if it isn't.
    uInvalid filetype given: {0}(t_SELINUX_FILETYPEStkeysRR,RU(tfiletype((s8/usr/lib/python2.7/site-packages/salt/modules/selinux.pyt_validate_filetype{scC@sd}tj||�}|s?tj|dj||��}n|sctdj|||���n|jd�|jd�fS(u
    .. versionadded:: 2019.2.0

    Validates and parses the protocol and port/port range from the name
    if both protocol and port are not provided.

    If the name is in a valid format, the protocol and port are ignored if provided

    Examples: tcp/8080 or udp/20-21
    u^(tcp|udp)\/(([\d]+)\-?[\d]+)$u{0}/{1}uUInvalid name "{0}" format and protocol and port not provided or invalid: "{1}" "{2}".ii(R1tmatchR,Rtgroup(tnametprotocoltporttprotocol_port_patternt
name_parts((s8/usr/lib/python2.7/site-packages/salt/modules/selinux.pyt_parse_protocol_port�s!cC@s
dj|�S(uc
    .. versionadded:: 2017.7.0

    Converts an SELinux file context from a dict to a string.
    u,{sel_user}:{sel_role}:{sel_type}:{sel_level}(R,(tcontext((s8/usr/lib/python2.7/site-packages/salt/modules/selinux.pyt_context_dict_to_string�scC@sxtjd|�s%tdd��n|jdd�}i}x4tdddd	g�D]\}}||||<qVW|S(
u_
    .. versionadded:: 2017.7.0

    Converts an SELinux file context from string to dict.
    u[^:]+:[^:]+:[^:]+:[^:]+$u%Invalid SELinux context string: {0}. u/Expected "sel_user:sel_role:sel_type:sel_level"u:iusel_userusel_roleusel_typeu	sel_level(R1R]RR$t	enumerate(Retcontext_listRItindexR@((s8/usr/lib/python2.7/site-packages/salt/modules/selinux.pyt_context_string_to_dict�s
%cC@st|�tj|d�S(u�
    .. versionadded:: 2017.7.0

    Translates SELinux filetype single-letter representation to a more
    human-readable version (which is also used in `semanage fcontext
    -l`).
    uerror(R\RYR;(R[((s8/usr/lib/python2.7/site-packages/salt/modules/selinux.pytfiletype_id_to_string�s
cC@sB|rt|�nd}i|d6tj|�d6|p<dd6dd6|pPdd6|p]dd6}|dkrvd	n	t|�|d
<ddj|�}td
|dt�}|dkr�dStjdjitj|�d6�|�}	i|	j	d�j
�d6|	j	d�j
�d
6}
|
jt|	j	d�j
���|
S(u�
    .. versionadded:: 2017.7.0

    Returns the current entry in the SELinux policy list as a
    dictionary. Returns None if no exact match was found.

    Returned keys are:

    * filespec (the name supplied and matched)
    * filetype (the descriptive name of the filetype supplied)
    * sel_user, sel_role, sel_type, sel_level (the selinux context)

    For a more in-depth explanation of the selinux context, go to
    https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/Security-Enhanced_Linux/chap-Security-Enhanced_Linux-SELinux_Contexts.html

    name
        filespec of the file or directory. Regex syntax is allowed.

    filetype
        The SELinux filetype specification. Use one of [a, f, d, c, b,
        s, l, p]. See also `man semanage-fcontext`. Defaults to 'a'
        (all files).

    CLI Example:

    .. code-block:: bash

        salt '*' selinux.fcontext_get_policy my-policy
    u[ ]+uspacerufilespecu[^:]+usel_userusel_roleusel_typeu	sel_levelu
[[:alpha:] ]+ufiletypeusemanage fcontext -l | egrep uT'^{filespec}{spacer}{filetype}{spacer}{sel_user}:{sel_role}:{sel_type}:{sel_level}$'u	cmd.shelltignore_retcodeuu^({filespec}) +([a-z ]+) (.*)$iiiN(
R\R1tescapeRRkR,R?RUR]R^RtupdateRj(R_R[tsel_typetsel_usert	sel_levelt	re_spacert
cmd_kwargsR
tcurrent_entry_texttpartsRI((s8/usr/lib/python2.7/site-packages/salt/modules/selinux.pytfcontext_get_policy�s*



"+"cC@std|||||�S(u�
    .. versionadded:: 2019.2.0

    Adds the SELinux policy for a given filespec and other optional parameters.

    Returns the result of the call to semanage.

    Note that you don't have to remove an entry before setting a new
    one for a given filespec and filetype, as adding one with semanage
    automatically overwrites a previously configured SELinux context.

    name
        filespec of the file or directory. Regex syntax is allowed.

    file_type
        The SELinux filetype specification. Use one of [a, f, d, c, b,
        s, l, p]. See also ``man semanage-fcontext``. Defaults to 'a'
        (all files).

    sel_type
        SELinux context type. There are many.

    sel_user
        SELinux user. Use ``semanage login -l`` to determine which ones
        are available to you.

    sel_level
        The MLS range of the SELinux context.

    CLI Example:

    .. code-block:: bash

        salt '*' selinux.fcontext_add_policy my-policy
    uadd(t_fcontext_add_or_delete_policy(R_R[RoRpRq((s8/usr/lib/python2.7/site-packages/salt/modules/selinux.pytfcontext_add_policy�s$cC@std|||||�S(u�
    .. versionadded:: 2019.2.0

    Deletes the SELinux policy for a given filespec and other optional parameters.

    Returns the result of the call to semanage.

    Note that you don't have to remove an entry before setting a new
    one for a given filespec and filetype, as adding one with semanage
    automatically overwrites a previously configured SELinux context.

    name
        filespec of the file or directory. Regex syntax is allowed.

    file_type
        The SELinux filetype specification. Use one of [a, f, d, c, b,
        s, l, p]. See also ``man semanage-fcontext``. Defaults to 'a'
        (all files).

    sel_type
        SELinux context type. There are many.

    sel_user
        SELinux user. Use ``semanage login -l`` to determine which ones
        are available to you.

    sel_level
        The MLS range of the SELinux context.

    CLI Example:

    .. code-block:: bash

        salt '*' selinux.fcontext_delete_policy my-policy
    udelete(Rw(R_R[RoRpRq((s8/usr/lib/python2.7/site-packages/salt/modules/selinux.pytfcontext_delete_policy!s$cC@s/tjjjdd�t||||||�S(u
    .. versionadded:: 2017.7.0

    Adds or deletes the SELinux policy for a given filespec and other optional parameters.

    Returns the result of the call to semanage.

    Note that you don't have to remove an entry before setting a new
    one for a given filespec and filetype, as adding one with semanage
    automatically overwrites a previously configured SELinux context.

    .. warning::

        Use :mod:`selinux.fcontext_add_policy()<salt.modules.selinux.fcontext_add_policy>`,
        or :mod:`selinux.fcontext_delete_policy()<salt.modules.selinux.fcontext_delete_policy>`.

    .. deprecated:: 2019.2.0

    action
        The action to perform. Either ``add`` or ``delete``.

    name
        filespec of the file or directory. Regex syntax is allowed.

    file_type
        The SELinux filetype specification. Use one of [a, f, d, c, b,
        s, l, p]. See also ``man semanage-fcontext``. Defaults to 'a'
        (all files).

    sel_type
        SELinux context type. There are many.

    sel_user
        SELinux user. Use ``semanage login -l`` to determine which ones
        are available to you.

    sel_level
        The MLS range of the SELinux context.

    CLI Example:

    .. code-block:: bash

        salt '*' selinux.fcontext_add_or_delete_policy add my-policy
    uSodiumuThe 'selinux.fcontext_add_or_delete_policy' module has been deprecated. Please use the 'selinux.fcontext_add_policy' and 'selinux.fcontext_delete_policy' modules instead. Support for the 'selinux.fcontext_add_or_delete_policy' module will be removed in Salt {version}.(RRtversionst
warn_untilRw(tactionR_R[RoRpRq((s8/usr/lib/python2.7/site-packages/salt/modules/selinux.pytfcontext_add_or_delete_policyHs.cC@s�|dkr$tdj|���ndj|�}|d
k	rk|dkrkt|�|dj|�7}n|d
k	r�|dj|�7}n|d
k	r�|dj|�7}n|d
k	r�|d	j|�7}n|d
tj|�7}td|�S(u�
    .. versionadded:: 2019.2.0

    Performs the action as called from ``fcontext_add_policy`` or ``fcontext_delete_policy``.

    Returns the result of the call to semanage.
    uaddudeleteu4Actions supported are "add" and "delete", not "{0}".usemanage fcontext --{0}uau --ftype {0}u --type {0}u
 --seuser {0}u --range {0}u ucmd.run_all(uaddudeleteN(RR,RR\R1RmR?(R|R_R[RoRpRqR
((s8/usr/lib/python2.7/site-packages/salt/modules/selinux.pyRw�s
cC@sCd}|r|d7}n|tj|�7}td|�jd�S(u�
    .. versionadded:: 2017.7.0

    Returns an empty string if the SELinux policy for a given filespec
    is applied, returns string with differences in policy and actual
    situation otherwise.

    name
        filespec of the file or directory. Regex syntax is allowed.

    CLI Example:

    .. code-block:: bash

        salt '*' selinux.fcontext_policy_is_applied my-policy
    urestorecon -n -v u-R ucmd.run_allustdout(R1RmR?R;(R_t	recursiveR
((s8/usr/lib/python2.7/site-packages/salt/modules/selinux.pytfcontext_policy_is_applied�s

cC@s�i}t||�}d}|r.|d7}n|tj|�7}td|�}|j|�|ddkr�tjd|tj�}t|�dkr�|jiid6�nx�|D]�}|d}t|d�}	t|d	�}
i}xIt	j
|	�D]8\}}
|
j|�|
kr�|ji|
|6�q�q�Wx|D]}|	|=|
|=q?W|djii|	d
6|
d6|6�q�Wn|S(u�
    .. versionadded:: 2017.7.0

    Applies SElinux policies to filespec using `restorecon [-R]
    filespec`. Returns dict with changes if successful, the output of
    the restorecon command otherwise.

    name
        filespec of the file or directory. Regex syntax is allowed.

    recursive
        Recursively apply SELinux policies.

    CLI Example:

    .. code-block:: bash

        salt '*' selinux.fcontext_apply_policy my-policy
    urestorecon -v -F u-R ucmd.run_alluretcodeiu)restorecon reset (.*) context (.*)->(.*)$uchangesiiuoldunew(RR1RmR?RntfindalltMRTRjRRDR;(R_R~RItchanges_textR
t	apply_rettchanges_listtitemtfilespectoldtnewt	intersecttkeyR@((s8/usr/lib/python2.7/site-packages/salt/modules/selinux.pytfcontext_apply_policy�s2




-c
C@s�t|||�\}}d}|r*|nd}i|d6|d6|d6|d6}ddj|�}td	|d
t�}|dkr�dStjd|�}	i|	jd
�j�d6|	jd�j�d6|	jd�j�d6S(u
    .. versionadded:: 2019.2.0

    Returns the current entry in the SELinux policy list as a
    dictionary. Returns None if no exact match was found.

    Returned keys are:

    * sel_type (the selinux type)
    * proto (the protocol)
    * port (the port(s) and/or port range(s))

    name
        The protocol and port spec. Can be formatted as ``(tcp|udp)/(port|port-range)``.

    sel_type
        The SELinux Type.

    protocol
        The protocol for the port, ``tcp`` or ``udp``. Required if name is not formatted.

    port
        The port or port range. Required if name is not formatted.

    CLI Example:

    .. code-block:: bash

        salt '*' selinux.port_get_policy tcp/80
        salt '*' selinux.port_get_policy foobar protocol=tcp port=80
    u[ ]+u\w+uspacerusel_typeuprotocoluportusemanage port -l | egrep u<'^{sel_type}{spacer}{protocol}{spacer}((.*)*)[ ]{port}($|,)'u	cmd.shellRluu^(\w+)[ ]+(\w+)[ ]+([\d\-, ]+)iiiN(	RdR,R?RURR1R]R^R(
R_RoR`RaRrtre_sel_typeRsR
tport_policyRu((s8/usr/lib/python2.7/site-packages/salt/modules/selinux.pytport_get_policy�s" 

cC@std|||||�S(u�
    .. versionadded:: 2019.2.0

    Adds the SELinux policy for a given protocol and port.

    Returns the result of the call to semanage.

    name
        The protocol and port spec. Can be formatted as ``(tcp|udp)/(port|port-range)``.

    sel_type
        The SELinux Type. Required.

    protocol
        The protocol for the port, ``tcp`` or ``udp``. Required if name is not formatted.

    port
        The port or port range. Required if name is not formatted.

    sel_range
        The SELinux MLS/MCS Security Range.

    CLI Example:

    .. code-block:: bash

        salt '*' selinux.port_add_policy add tcp/8080 http_port_t
        salt '*' selinux.port_add_policy add foobar http_port_t protocol=tcp port=8091
    uadd(t_port_add_or_delete_policy(R_RoR`Rat	sel_range((s8/usr/lib/python2.7/site-packages/salt/modules/selinux.pytport_add_policyscC@std|d||d�S(uX
    .. versionadded:: 2019.2.0

    Deletes the SELinux policy for a given protocol and port.

    Returns the result of the call to semanage.

    name
        The protocol and port spec. Can be formatted as ``(tcp|udp)/(port|port-range)``.

    protocol
        The protocol for the port, ``tcp`` or ``udp``. Required if name is not formatted.

    port
        The port or port range. Required if name is not formatted.

    CLI Example:

    .. code-block:: bash

        salt '*' selinux.port_delete_policy tcp/8080
        salt '*' selinux.port_delete_policy foobar protocol=tcp port=8091
    udeleteN(R�R(R_R`Ra((s8/usr/lib/python2.7/site-packages/salt/modules/selinux.pytport_delete_policy6scC@s�|d
kr$tdj|���n|dkrF|rFtd��nt|||�\}}dj||�}|r�|dj|�7}n|r�|dj|�7}n|dj|�7}td	|�S(u�
    .. versionadded:: 2019.2.0

    Performs the action as called from ``port_add_policy`` or ``port_delete_policy``.

    Returns the result of the call to semanage.
    uaddudeleteu4Actions supported are "add" and "delete", not "{0}".u(SELinux Type is required to add a policyusemanage port --{0} --proto {1}u --type {0}u --range {0}u {0}ucmd.run_all(uaddudelete(RR,RdR?(R|R_RoR`RaR�R
((s8/usr/lib/python2.7/site-packages/salt/modules/selinux.pyR�Qs(6t__doc__t
__future__RRRRR1tsalt.utils.filesRtsalt.utils.pathtsalt.utils.stringutilstsalt.utils.decoratorsRt
decoratorstsalt.utils.versionstsalt.exceptionsRRtsalt.extRRYRtmemoizeRR"R(R9R=R
RBRFR:RMRORRRSRKR\RdRfRjRkRRvRxRyR}RwRR�R�R�R�R�(((s8/usr/lib/python2.7/site-packages/salt/modules/selinux.pyt<module>sb
				:	
						0					8''8/4!

Zerion Mini Shell 1.0