File: //opt/saltstack/salt/lib/python3.10/site-packages/salt/netapi/__pycache__/rest_wsgi.cpython-310.pyc
o
�N�g# � @ s� d Z ddlZddlZddlZddlZddlZddlZddddddd d
�ZdZe� e�Z
dd
� ZG dd� de�Z
dd� Zdd� Zdd� Zd%dd�Zdd� Zdd� Zdd� Zdd� Zd d!� Zd"d#� Zed$krie� dS dS )&a�
A minimalist REST API for Salt
==============================
This ``rest_wsgi`` module provides a no-frills REST interface for sending
commands to the Salt master. There are no dependencies.
Extra care must be taken when deploying this module into production. Please
read this documentation in entirety.
All authentication is done through Salt's :ref:`external auth <acl-eauth>`
system.
Usage
=====
* All requests must be sent to the root URL (``/``).
* All requests must be sent as a POST request with JSON content in the request
body.
* All responses are in JSON.
.. seealso:: :py:mod:`rest_cherrypy <salt.netapi.rest_cherrypy.app>`
The :py:mod:`rest_cherrypy <salt.netapi.rest_cherrypy.app>` module is
more full-featured, production-ready, and has builtin security features.
Deployment
==========
The ``rest_wsgi`` netapi module is a standard Python WSGI app. It can be
deployed one of two ways.
Using a WSGI-compliant web server
---------------------------------
This module may be run via any WSGI-compliant production server such as Apache
with mod_wsgi or Nginx with FastCGI.
It is strongly recommended that this app be used with a server that supports
HTTPS encryption since raw Salt authentication credentials must be sent with
every request. Any apps that access Salt through this interface will need to
manually manage authentication credentials (either username and password or a
Salt token). Tread carefully.
:program:`salt-api` using a development-only server
---------------------------------------------------
If run directly via the salt-api daemon it uses the `wsgiref.simple_server()`__
that ships in the Python standard library. This is a single-threaded server
that is intended for testing and development. **This server does not use
encryption**; please note that raw Salt authentication credentials must be sent
with every HTTP request.
**Running this module via salt-api is not recommended!**
In order to start this module via the ``salt-api`` daemon the following must be
put into the Salt master config::
rest_wsgi:
port: 8001
.. __: http://docs.python.org/2/library/wsgiref.html#module-wsgiref.simple_server
Usage examples
==============
.. http:post:: /
**Example request** for a basic ``test.ping``::
% curl -sS -i \
-H 'Content-Type: application/json' \
-d '[{"eauth":"pam","username":"saltdev","password":"saltdev","client":"local","tgt":"*","fun":"test.ping"}]' localhost:8001
**Example response**:
.. code-block:: http
HTTP/1.0 200 OK
Content-Length: 89
Content-Type: application/json
{"return": [{"ms--4": true, "ms--3": true, "ms--2": true, "ms--1": true, "ms--0": true}]}
**Example request** for an asynchronous ``test.ping``::
% curl -sS -i \
-H 'Content-Type: application/json' \
-d '[{"eauth":"pam","username":"saltdev","password":"saltdev","client":"local_async","tgt":"*","fun":"test.ping"}]' localhost:8001
**Example response**:
.. code-block:: http
HTTP/1.0 200 OK
Content-Length: 103
Content-Type: application/json
{"return": [{"jid": "20130412192112593739", "minions": ["ms--4", "ms--3", "ms--2", "ms--1", "ms--0"]}]}
**Example request** for looking up a job ID::
% curl -sS -i \
-H 'Content-Type: application/json' \
-d '[{"eauth":"pam","username":"saltdev","password":"saltdev","client":"runner","fun":"jobs.lookup_jid","jid":"20130412192112593739"}]' localhost:8001
**Example response**:
.. code-block:: http
HTTP/1.0 200 OK
Content-Length: 89
Content-Type: application/json
{"return": [{"ms--4": true, "ms--3": true, "ms--2": true, "ms--1": true, "ms--0": true}]}
:form lowstate: A list of lowstate data appropriate for the
:ref:`client <client-apis>` interface you are calling.
:status 200: success
:status 401: authentication required
� Nz200 OKz400 BAD REQUESTz401 UNAUTHORIZEDz
404 NOT FOUNDz405 METHOD NOT ALLOWEDz406 NOT ACCEPTABLEz500 INTERNAL SERVER ERROR)�� � � i� � � �� Z rest_wsgic C s t �ti �} d| v rtS dS )N�portF)�__opts__�get�__virtualname__)�mod_opts� r
�I/opt/saltstack/salt/lib/python3.10/site-packages/salt/netapi/rest_wsgi.py�__virtual__� s r c @ s e Zd ZdZdd� ZdS )� HTTPErrorzM
A custom exception that can take action based on an HTTP error code
c C s || _ t�| |� d|� �� d S )Nz: )�code� Exception�__init__)�selfr �messager
r
r r � s zHTTPError.__init__N)�__name__�
__module__�__qualname__�__doc__r r
r
r
r r � s r c
C sT zt �| � W dS ty) } z|jtjkrt j�| �rn� W Y d}~dS d}~ww )z?
mkdir -p
http://stackoverflow.com/a/600612/127816
N)�os�makedirs�OSError�errnoZEEXIST�path�isdir)r �excr
r
r �mkdir_p� s ���r! c C s. | � dd�}|dkrdnt|�}| d �|�S )z6
Pull the body from the request and return it
ZCONTENT_LENGTH�0� r z
wsgi.input)r
�int�read)�environ�lengthr
r
r � read_body� s r( c
C sV | � dd�}|dkrtdd��z
tjj�t| ��W S ty* } ztd|��d}~ww )z)
Return the request body as JSON
ZCONTENT_TYPEr# �application/jsonr z
JSON requiredr N)r
r �salt�utils�json�loadsr( �
ValueError)r&