HEX
Server: Apache
System: Linux server2.voipitup.com.au 4.18.0-553.109.1.lve.el8.x86_64 #1 SMP Thu Mar 5 20:23:46 UTC 2026 x86_64
User: posscale (1027)
PHP: 8.2.30
Disabled: exec,passthru,shell_exec,system
Upload Files
File: //opt/saltstack/salt/lib/python3.10/site-packages/salt/states/__pycache__/network.cpython-310.pyc
o

�N�g�_�@s\dZddlZddlZddlZddlZddlZe�e�Z	dd�Z
ddd�Zdd	�Zd
d�Z
dS)
a#)
Configuration of network interfaces
===================================

The network module is used to create and manage network settings,
interfaces can be set as either managed or ignored. By default
all interfaces are ignored unless specified.

.. note::

    RedHat-based systems (RHEL, CentOS, Scientific, etc.)
    have been supported since version 2014.1.0.

    Debian-based systems (Debian, Ubuntu, etc.) have been
    supported since version 2017.7.0. The following options
    are not supported: ipaddr_start, and ipaddr_end.

    Other platforms are not yet supported.

.. note::

    On Debian-based systems, networking configuration can be specified
    in `/etc/network/interfaces` or via included files such as (by default)
    `/etc/network/interfaces.d/*`. This can be problematic for configuration
    management. It is recommended to use either `file.managed` *or*
    `network.managed`.

    If using ``network.managed``, it can be useful to ensure ``interfaces.d/``
    is empty. This can be done using the following state

    .. code-block:: yaml

        /etc/network/interfaces.d:
          file.directory:
            - clean: True

Configuring Global Network Settings
-----------------------------------

Use the :py:func:`network.system <salt.states.network.system>` state to set
global network settings:

.. code-block:: yaml

    system:
      network.system:
        - enabled: True
        - hostname: server1.example.com
        - gateway: 192.168.0.1
        - gatewaydev: eth0
        - nozeroconf: True
        - nisdomain: example.com
        - require_reboot: True
        - apply_hostname: True

.. note::
    The use of ``apply_hostname`` above will apply changes to the hostname
    immediately.

.. versionchanged:: 2015.5.0
    ``apply_hostname`` added

retain_settings
***************

.. versionadded:: 2016.11.0

Use `retain_settings` to retain current network settings that are not otherwise
specified in the state. Particularly useful if only setting the hostname.
Default behavior is to delete unspecified network settings.

.. code-block:: yaml

    system:
      network.system:
        - hostname: server2.example.com
        - apply_hostname: True
        - retain_settings: True

Configuring Network Routes
--------------------------

Use the :py:func:`network.routes <salt.states.network.routes>` state to set
network routes.

.. code-block:: yaml

    routes:
      network.routes:
        - name: eth0
        - routes:
          - name: secure_network
            ipaddr: 10.2.0.0
            netmask: 255.255.255.0
            gateway: 10.1.0.3
          - name: HQ_network
            ipaddr: 10.100.0.0
            netmask: 255.255.0.0
            gateway: 10.1.0.10

Managing Network Interfaces
---------------------------

The :py:func:`network.managed <salt.states.network.managed>` state is used to
configure network interfaces. Here are several examples:

Ethernet Interface
******************

.. code-block:: yaml

    eth0:
      network.managed:
        - enabled: True
        - type: eth
        - proto: static
        - ipaddr: 10.1.0.7
        - netmask: 255.255.255.0
        - gateway: 10.1.0.1
        - enable_ipv6: true
        - ipv6proto: static
        - ipv6addrs:
          - 2001:db8:dead:beef::3/64
          - 2001:db8:dead:beef::7/64
        - ipv6gateway: 2001:db8:dead:beef::1
        - ipv6netmask: 64
        - dns:
          - 8.8.8.8
          - 8.8.4.4
        - channels:
            rx: 4
            tx: 4
            other: 4
            combined: 4

Ranged Interfaces (RHEL/CentOS Only)
************************************

.. versionadded:: 2015.8.0

Ranged interfaces can be created by including the word ``range`` in the
interface name.

.. important::
    The interface type must be ``eth``.

.. code-block:: yaml

    eth0-range0:
      network.managed:
        - type: eth
        - ipaddr_start: 192.168.1.1
        - ipaddr_end: 192.168.1.10
        - clonenum_start: 10
        - mtu: 9000

    bond0-range0:
      network.managed:
        - type: eth
        - ipaddr_start: 192.168.1.1
        - ipaddr_end: 192.168.1.10
        - clonenum_start: 10
        - mtu: 9000

    eth1.0-range0:
      network.managed:
        - type: eth
        - ipaddr_start: 192.168.1.1
        - ipaddr_end: 192.168.1.10
        - clonenum_start: 10
        - vlan: True
        - mtu: 9000

    bond0.1-range0:
      network.managed:
        - type: eth
        - ipaddr_start: 192.168.1.1
        - ipaddr_end: 192.168.1.10
        - clonenum_start: 10
        - vlan: True
        - mtu: 9000

Bond Interfaces
***************

To configure a bond, you must do the following:

- Configure the bond slaves with a ``type`` of ``slave``, and a ``master``
  option set to the name of the bond interface.

- Configure the bond interface with a ``type`` of ``bond``, and a ``slaves``
  option defining the bond slaves for the bond interface.

.. code-block:: yaml

    eth2:
      network.managed:
        - enabled: True
        - type: slave
        - master: bond0

    eth3:
      network.managed:
        - enabled: True
        - type: slave
        - master: bond0

    bond0:
      network.managed:
        - type: bond
        - ipaddr: 10.1.0.1
        - netmask: 255.255.255.0
        - mode: gre
        - proto: static
        - dns:
          - 8.8.8.8
          - 8.8.4.4
        - enabled: False
        - slaves: eth2 eth3
        - require:
          - network: eth2
          - network: eth3
        - miimon: 100
        - arp_interval: 250
        - downdelay: 200
        - lacp_rate: fast
        - max_bonds: 1
        - updelay: 0
        - use_carrier: on
        - hashing-algorithm: layer2
        - mtu: 9000
        - autoneg: on
        - speed: 1000
        - duplex: full
        - rx: on
        - tx: off
        - sg: on
        - tso: off
        - ufo: off
        - gso: off
        - gro: off
        - lro: off

VLANs
*****

Set ``type`` to ``vlan`` to configure a VLANs. These VLANs are configured on
the bond interface defined above.

.. code-block:: yaml

    bond0.2:
      network.managed:
        - type: vlan
        - ipaddr: 10.1.0.2
        - use:
          - network: bond0
        - require:
          - network: bond0

    bond0.3:
      network.managed:
        - type: vlan
        - ipaddr: 10.1.0.3
        - use:
          - network: bond0
        - require:
          - network: bond0

    bond0.10:
      network.managed:
        - type: vlan
        - ipaddr: 10.1.0.4
        - use:
          - network: bond0
        - require:
          - network: bond0

    bond0.12:
      network.managed:
        - type: vlan
        - ipaddr: 10.1.0.5
        - use:
          - network: bond0
        - require:
          - network: bond0

Bridge Interfaces
*****************

.. code-block:: yaml

    eth4:
      network.managed:
        - enabled: True
        - type: eth
        - proto: dhcp
        - bridge: br0

    br0:
      network.managed:
        - enabled: True
        - type: bridge
        - proto: dhcp
        - bridge: br0
        - delay: 0
        - ports: eth4
        - bypassfirewall: True
        - use:
          - network: eth4
        - require:
          - network: eth4

.. note::
    When managing bridged interfaces on a Debian/Ubuntu based system, the
    ``ports`` argument is required. RedHat-based systems will ignore the
    argument.

Network Teaming (RHEL/CentOS 7 and later)
*****************************************

.. versionadded:: 3002

- Configure the members of the team interface with a ``type`` of ``teamport``,
  and a ``team_master`` option set to the name of the bond interface.

  - ``master`` also works, but will be ignored if both ``team_master`` and
    ``master`` are present.

  - If applicable, include a ``team_port_config`` option. This should be
    formatted as a dictionary. Keep in mind that due to a quirk of PyYAML,
    dictionaries nested under a list item must be double-indented (see example
    below for interface ``eth5``).

- Configure the team interface with a ``type`` of ``team``. The team
  configuration should be passed via the ``team_config`` option. As with
  ``team_port_config``, the dictionary should be double-indented.

.. code-block:: yaml

    eth5:
      network.managed:
        - type: teamport
        - team_master: team0
        - team_port_config:
            prio: 100

    eth6:
      network.managed:
        - type: teamport
        - team_master: team0

    team0:
      network.managed:
        - type: team
        - ipaddr: 172.24.90.42
        - netmask: 255.255.255.128
        - enable_ipv6: True
        - ipv6addr: 'fee1:dead:beef:af43::'
        - team_config:
            runner:
              hwaddr_policy: by_active
              name: activebackup
              link_watch:
                name: ethtool

.. note::
    While ``teamd`` must be installed to manage a team interface, it is not
    required to configure a separate :py:func:`pkg.installed
    <salt.states.pkg.installed>` state for it, as it will be silently installed
    if needed.

Configuring the Loopback Interface
**********************************

Use :py:func:`network.managed <salt.states.network.managed>` with a ``type`` of
``eth`` and a ``proto`` of ``loopback``.

.. code-block:: yaml

    lo:
      network.managed:
        - name: lo
        - type: eth
        - proto: loopback
        - onboot: yes
        - userctl: no
        - ipv6_autoconf: no
        - enable_ipv6: true

Other Useful Options
--------------------

noifupdown
**********

The ``noifupdown`` option, if set to ``True``, will keep Salt from restart the
interface if changes are made, requiring them to be restarted manually. Here
are a couple examples:

.. code-block:: yaml

    eth7:
      network.managed:
        - enabled: True
        - type: eth
        # Automatic IP/DNS
        - proto: dhcp
        - noifupdown: True

    eth8:
      network.managed:
        - type: eth
        - noifupdown: True

        # IPv4
        - proto: static
        - ipaddr: 192.168.4.9
        - netmask: 255.255.255.0
        - gateway: 192.168.4.1
        - enable_ipv6: True

        # IPv6
        - ipv6proto: static
        - ipv6addr: 2001:db8:dead:c0::3
        - ipv6netmask: 64
        - ipv6gateway: 2001:db8:dead:c0::1
        # override shared; makes those options v4-only
        - ipv6ttl: 15

        # Shared
        - mtu: 1480
        - ttl: 18
        - dns:
          - 8.8.8.8
          - 8.8.4.4
�NcCs tjj��rdSdtvrdSdS)zf
    Confine this module to non-Windows systems with the required execution
    module available.
    )Fz!Only supported on non-Windows OSs�ip.get_interfaceT)Fzip module could not be loaded)�salt�utils�platformZ
is_windows�__salt__�rr�G/opt/saltstack/salt/lib/python3.10/site-packages/salt/states/network.py�__virtual__�s
r	Tc
Ks�|idd|�d�d�}d|vrt�dd�|d<d}t|�dd��}d	|vrJ|�d	�}d
}d|vr9|d7}||d<n|d
7}|d7}|�dg��|�z~td|�}td|||fi|��}	|dr�||	krf	|sw|	rwd|d<d|�d�|d<nP||	kr�tj||	dd�}
d|d<d�	|d�
|
��|d<n4|s�|	r�d|�d�|d<d|dd<d}n||	kr�tj||	dd�}
d|�d�|d<d�
|
�|dd<d}Wnty�}zd|d<t|�|d<|WYd}~Sd}~ww|dkr�|S|d k�r�d!tv�r�z�td!|�}td"|fi|��}	|d�r<|�s|	�rd|d<d#�	|�|d<nX||	k�r;tj||	dd�}
d|d<d$�	|d�
|
��|d<n;|�sW|	�rWd%|�d�|d<d&|�d'�|dd <d}n ||	k�rwtj||	dd�}
d%|�d�|d<d�
|
�|dd <d}Wnt�y�}zd|d<t|�|d<|WYd}~Sd}~ww|d�r�|Sd(|v�r�|�r�ztd)d*�|d<d+|d<|WSt�y�}zd|d<t|�|d<|WYd}~Sd}~wwd|d<d,|d<|Sz�t
jj��}d}
||v�r�||�d-�}
nq|D]n}d.||v�r||d.D]}|�d/d�|k�rd}
�q|d0k�red1||v�r@||d1}t|�d2k�r@|D]}|�d/d�|k�r>d}
�q1d3||v�re||d3}t|�d2k�re|D]}|�d/d�|k�rcd}
�qV�q�|�r�d4|v�r�|
�r�|d�r�td5||�td6||�d|�d7�|dd8<n+td6||�d|�d9�|dd8<nd4|v�r�|
�r�td5||�d|�d:�|dd8<Wnt�y�}zd|d<t|�|d<|WYd}~Sd}~ww|d k�rhd4|v�rhd;|v�rh|d;�rhtd<d=d>|�d?�g���}t|d;t��r|d;}n|d;��}t|�t|�}|�r^td@dAk�r]td<dBdCg���}|�rKt�dDdE�
|�|�||gt|�}td<|ddF�nt�dG�dH�	dE�
|�|�|ddI<n
t�dJdE�
|�|�|�rp|
�rp|StdK�|S)La
    Ensure that the named interface is configured properly.

    name
        The name of the interface to manage

    type : eth
        Type of interface and configuration

        .. versionchanged:: 3002

    enabled
        Designates the state of this interface.
    T�
Interface z is up to date.��name�changes�result�comment�testF�typeZeth�addrz%'addr' is not a valid argument name, �hwaddrz0its value has been assigned to 'hwaddr' instead.z)it has been ignored in favor of 'hwaddr'.z1 Update your SLS file to get rid of this warning.�warningsrzip.build_interfaceNrz is set to be added.r��Zlinetermz%Interface {} is set to be updated:
{}�
z added.zAdded network interface.r
Z	interfacez	 updated.�sourceZbondzip.get_bondz
ip.build_bondz%Bond interface {} is set to be added.z*Bond interface {} is set to be updated:
{}zBond interface zAdded bond �.�rangezservice.restart�networkz1network restarted for change of ranged interfaceszno change, passing itZupZ	secondaryZlabel�loZinet�Zinet6Z
noifupdownzip.downzip.upz restart to validate�statusz is upz downZslaveszcmd.run�catz/sys/class/net/z/bonding/slavesZ	os_familyZSuse�whichZ	ifenslavez#Adding slaves '%s' to the master %s� )Zpython_shellzCommand 'ifenslave' not foundz Added slaves '{}' to master '{}'ZenslavezGAll slaves '%s' are already added to the master %s, no actions requiredzsaltutil.refresh_grains)�__opts__�get�str�pop�
setdefault�appendr�difflib�unified_diff�format�join�AttributeError�	Exceptionrrr�
interfaces�len�split�
isinstance�list�setZ
__grains__�strip�log�info�error)r�enabled�kwargs�retZapply_ranged_settingZ
iface_typer�msg�old�new�diffr7r.Zinterface_statusZiface�secondZ	inet_data�dataZ
inet6_dataZpresent_slavesZdesired_slavesZmissing_slavesZifenslave_path�cmdrrr�managed�s~
�


�����

�

���
���

��
�
��


����
�����
�

�
���
rBc
Ks�|idd|�d�d�}d}d|vrt�dd�|d<z�td|�}td|fi|��}|drf||kr5|WS|sH|rHd	|d
<d|�d�|d<|WS||krftj||d
d�}d	|d
<d�|d�|��|d<|WS|s|rd}d|�d�|d<d|�d�|dd<n||kr�tj||d
d�}d}d|�d�|d<d�|�|dd<Wnty�}zd|d
<t|�|d<|WYd	}~Sd	}~ww|r�ztddi|��W|Sty�}zd|d
<t|�|d<|WYd	}~Sd	}~ww|S)z�
    Manage network interface static routes.

    name
        Interface name to apply the route to.

    kwargs
        Named routes
    Tr
z routes are up to date.rFrz
ip.get_routeszip.build_routesNrz routes are set to be added.rrrz-Interface {} routes are set to be updated:
{}rz routes added.zAdded interface z routes.r
Znetwork_routesz routes updated.�ip.apply_network_settingsr)	r"r#rr(r)r*r+r,r$)rr9r:Zapply_routesr<r=r>r7rrr�routes�sj
�
��������rDc
Ks�|iddd�}d}td|d<zktd�}tddi|��}tdrU||kr)|WS|s8|r8d|d	<d
|d<|WS||krUtj||dd
�}d|d	<d�d�|��|d<|WS|sb|rbd}d|dd<n||krytj||dd
�}d}d�|�|dd<Wn;ty�}zd|d	<t|�|d<|WYd}~Sd}~wty�}zd|d	<t|�|d<|WYd}~Sd}~ww|r�ztddi|��W|Sty�}zd|d	<t|�|d<|WYd}~Sd}~ww|S)z�
    Ensure that global network settings are configured properly.

    name
        Custom name to represent this configuration change.

    kwargs
        The global parameters for the system.

    Tz'Global network settings are up to date.rFrzip.get_network_settingszip.build_network_settingsNrz,Global network settings are set to be added.rrrz1Global network settings are set to be updated:
{}rzAdded global network settings.r
Znetwork_settingsrCr)	r"rr(r)r*r+r,r$�KeyError)rr9r:Zapply_net_settingsr<r=r>r7rrr�system�sn�
���������rF)T)�__doc__r(�loggingZsalt.loaderrZsalt.utils.networkZsalt.utils.platform�	getLogger�__name__r5r	rBrDrFrrrr�<module>s9

jB