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/engines/__pycache__/ircbot.cpython-310.pyc
o

�N�g�(�@s�dZddlZddlZddlZddlZddlZddlmZddlZ	ddl
Z	ddlZ	e�e
�Zedd�Zedd�ZGdd	�d	�Z	
									
ddd�ZdS)a
IRC Bot engine

.. versionadded:: 2017.7.0

Example Configuration

.. code-block:: yaml

    engines:
      - ircbot:
          nick: <nick>
          username: <username>
          password: <password>
          host: irc.oftc.net
          port: 7000
          channels:
            - salt-test
            - '##something'
          use_ssl: True
          use_sasl: True
          disable_query: True
          allow_hosts:
            - salt/engineer/.*
          allow_nicks:
            - gtmanfred

Available commands on irc are:

ping
    return pong

echo <stuff>
    return <stuff> targeted at the user who sent the commands

event <tag> [<extra>, <data>]
    fire event on the master or minion event stream with the tag `salt/engines/ircbot/<tag>` and a data object with a
    list of everything else sent in the message

Example of usage

.. code-block:: text

    08:33:57 @gtmanfred > !ping
    08:33:57   gtmanbot > gtmanfred: pong
    08:34:02 @gtmanfred > !echo ping
    08:34:02   gtmanbot > ping
    08:34:17 @gtmanfred > !event test/tag/ircbot irc is useful
    08:34:17   gtmanbot > gtmanfred: TaDa!

.. code-block:: text

    [DEBUG   ] Sending event: tag = salt/engines/ircbot/test/tag/ircbot; data = {'_stamp': '2016-11-28T14:34:16.633623', 'data': ['irc', 'is', 'useful']}

�N)�
namedtuple�Eventzsource code line�	PrivEventz/source nick user host code channel command linec@s�eZdZ										d$dd�Zdd	�Zd
d�Zedd
��Zdd�Zdd�Z	dd�Z
dd�Zdd�Zdd�Z
dd�Zdd�Zdd�Zd d!�Zd"d#�ZdS)%�	IRCClient�NF�!Tc

Csz||_||_||_|p||_||_|pg|_||_||_|	|_|
|_	||_
||_tj
jjjdd�|_|j��|��dS)NF)�make_current)�nick�host�port�username�password�channels�ssl�sasl�char�allow_hosts�allow_nicks�
disable_query�salt�ext�tornado�ioloop�IOLoop�io_loopr�_connect)
�selfr	r
rrr
r�use_ssl�use_saslrrrr�r�G/opt/saltstack/salt/lib/python3.10/site-packages/salt/engines/ircbot.py�__init__Ms


zIRCClient.__init__cCsvt�tjtjd�}|jdurtjjjj|dtj	id�|_
n	tjjj�|�|_
|j
�|j
�|j
�|j|jf|j�dS)NrT�	cert_reqs)Zssl_options)�socket�AF_INET�SOCK_STREAMrrrrZiostreamZSSLIOStream�	CERT_NONE�_streamZIOStreamZset_close_callback�	on_closed�connectr
r�
on_connect)r�_sockrrr rls



�zIRCClient._connectcCs|j�d|j�dS)Nz
)r'Z
read_until�_message�rrrr �
read_messageswszIRCClient.read_messagescCsFt�d|�t�d|�}|�d�|�d�|�d�}}}t|||�S)NzReceived: %sz;^(?:(?P<source>:[^ ]+) )?(?P<code>[^ ]+)(?: (?P<line>.*))?$�source�code�line)�log�debug�re�match�groupr)r1�searchr/r0rrr �_eventzs�
�zIRCClient._eventc�*t|jt�r	|jSt�fdd�|jD��S)Nc�g|]}t�|���qSr�r4r5��.0r5�r
rr �
<listcomp>��z)IRCClient._allow_host.<locals>.<listcomp>)�
isinstancer�bool�any)rr
rr>r �_allow_host��zIRCClient._allow_hostcr9)Ncr:rr;r<�r	rr r?�r@z)IRCClient._allow_nick.<locals>.<listcomp>)rArrBrC)rr	rrFr �_allow_nick�rEzIRCClient._allow_nickc
	Cs�t�d|j�}|�d�|�d�|�d�}}}t�d�|j�|j�}|rt|�d�|�d�|�d�}}}|jd	urB|�d
�sBdS||j	krI|}t
|j||||j|||�}	|�|�s`|�
|�rxt|d|���rvt|d|���|	�dSdSdSdS)Nz/^:(?P<nick>[^!]+)!(?P<user>[^@]+)@(?P<host>.*)$r	�userr
zA^(?P<channel>[^ ]+) :(?:{}(?P<command>[^ ]+)(?: (?P<line>.*))?)?$�channel�commandr1T�#Z	_command_)r4r5r/r6�formatrr1r�
startswithr	rr0rGrD�hasattr�getattr)
r�eventr7r	rHr
rIrJr1Z	priveventrrr �_privmsg�s>�
���
�
�
��
zIRCClient._privmsgcCs"d|j�d|j��}|�|�dS)N�PRIVMSG � :)rIr1�send_message�rrP�messagerrr �
_command_echo�szIRCClient._command_echocCs$d|j�d|j�d�}|�|�dS)NrRrSz: pong)rIr	rTrUrrr �
_command_ping�szIRCClient._command_pingcs�t�d�dkrtjj�ttd�j�nd��fdd�}|j�d�}|d}t	|�dkr4d	|dd�i}nd	gi}|d
||�d|j
�d|j�d
�}|�|�dS)NZ__roleZmasterZsock_dircs$�r	�||�dStd||�dS)z/
            How to fire the event
            z
event.sendN)Z__salt__)�tag�msg�Zfire_masterrr �fire�sz&IRCClient._command_event.<locals>.fire� r��datazsalt/engines/ircbot/rRrSz: TaDa!)
Z__opts__�getr�utilsrPZget_master_eventZ
fire_eventr1�split�lenrIr	rT)rrPr\�argsrY�payloadrVrr[r �_command_event�s ��	zIRCClient._command_eventcCsx|�d��d�}|�|�}|jdkr$tjjjj�	��
|jd|j���n|jdkr6tjjjj�	��
|j
|�|��dS)N�
�utf-8ZPINGzPONG ZPRIVMSG)�rstrip�decoder8r0rrrrr�currentZspawn_callbackrTr1rQr.)r�rawrPrrr r,�s

�
�zIRCClient._messagecCs&|�d�s	d|}|�d|���dS)NrKzJOIN )rMrT)rrIrrr �join_channel�s
zIRCClient.join_channelcCs�t�d�|jdur|�d�|�d|j���|�d�|jrP|jdurEt�d�|j	|j��
��}|�d�|�d|���|�d	�n|�d
�|j	|j��|jD]}|�|�qS|�
�dS)Nr*Tz
CAP REQ :saslzNICK zUSER saltstack 0 * :saltstackz{0}{0}{1}zAUTHENTICATE PLAINz
AUTHENTICATE zCAP ENDz PRIVMSG NickServ :IDENTIFY {} {})�logging�inforrTr	r
�base64�	b64encoderLr�encoderrmr.)rZ
authstringrIrrr r*�s*




�
��
zIRCClient.on_connectcCst�d�dS)Nr()rnror-rrr r(szIRCClient.on_closedcCs4t|t�r
|�d�}t�d|�|j�|d�dS)NrhzSending:  %srg)rA�strrrr2r3r'�write)rr1rrr rTs

zIRCClient.send_message�
rNNNFFrFFT)�__name__�
__module__�__qualname__r!rr.�staticmethodr8rDrGrQrWrXrfr,rmr*r(rTrrrr rLs6
�
!rrFrTc

Cs0t||||||p	g||||	|
|�}|j��dS)aj
    IRC Bot for interacting with salt.

    nick
        Nickname of the connected Bot.

    host
        irc server (example - irc.oftc.net).

    port
        irc port.  Default: 6667

    password
        password for authenticating.  If not provided, user will not authenticate on the irc server.

    channels
        channels to join.

    use_ssl
        connect to server using ssl. Default: False

    use_sasl
        authenticate using sasl, instead of messaging NickServ. Default: False

        .. note:: This will allow the bot user to be fully authenticated before joining any channels

    char
        command character to look for. Default: !

    allow_hosts
        hostmasks allowed to use commands on the bot.  Default: False
        True to allow all
        False to allow none
        List of regexes to allow matching

    allow_nicks
        Nicks that are allowed to use commands on the bot.  Default: False
        True to allow all
        False to allow none
        List of regexes to allow matching

    disable_query
        Disable commands from being sent through private queries.  Require they be sent to a channel, so that all
        communication can be controlled by access to the channel. Default: True

    .. warning:: Unauthenticated Access to event stream

        This engine sends events calls to the event stream without authenticating them in salt.  Authentication will
        need to be configured and enforced on the irc server or enforced in the irc channel.  The engine only accepts
        commands from channels, so non authenticated users could be banned or quieted in the channel.

        /mode +q $~a  # quiet all users who are not authenticated
        /mode +r      # do not allow unauthenticated users into the channel

        It would also be possible to add a password to the irc channel, or only allow invited users to join.
    N)rr�start)
r	r
rrr
rrrrrrr�clientrrr rz
sF�rzru)�__doc__rprnr4r#r�collectionsrZsalt.ext.tornado.iolooprZsalt.ext.tornado.iostreamZsalt.utils.event�	getLoggerrvr2rrrrzrrrr �<module>s48


E�