Python SDK рд╕рд╣ рдЪреЗрдХ рдкреЙрдЗрдВрдЯ API рд╕рд░рд▓реАрдХреГрдд рдХрд░рдгреЗ

Python SDK рд╕рд╣ рдЪреЗрдХ рдкреЙрдЗрдВрдЯ API рд╕рд░рд▓реАрдХреГрдд рдХрд░рдгреЗAPI рд╕рд╣ рдкрд░рд╕реНрдкрд░рд╕рдВрд╡рд╛рджрд╛рдЪреА рд╕рдВрдкреВрд░реНрдг рд╢рдХреНрддреА рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛрдбрд╕рд╣ рдПрдХрддреНрд░рд┐рддрдкрдгреЗ рд╡рд╛рдкрд░рд▓реА рдЬрд╛рддреЗ рддреЗрд╡реНрд╣рд╛ рдкреНрд░рдХрдЯ рд╣реЛрддреЗ, рдЬреЗрд╡реНрд╣рд╛ API рдкреНрд░рддрд┐рд╕рд╛рджрд╛рдВрдЪреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА API рд╡рд┐рдирдВрддреНрдпрд╛ рдЖрдгрд┐ рд╕рд╛рдзрдиреЗ рдЧрддрд┐рд╢реАрд▓рдкрдгреЗ рд╡реНрдпреБрддреНрдкрдиреНрди рдХрд░рдгреЗ рд╢рдХреНрдп рд╣реЛрддреЗ. рдорд╛рддреНрд░, рддрд░реАрд╣реА рддреЗ рд▓рдХреНрд╖рд╛рдд рдпреЗрдд рдирд╛рд╣реА рдкрд╛рдпрдерди рд╕реЙрдлреНрдЯрд╡реЗрдЕрд░ рдбреЗрд╡реНрд╣рд▓рдкрдореЗрдВрдЯ рдХрд┐рдЯ (рдпрд╛рдкреБрдвреЗ Python SDK рдореНрд╣рдгреВрди рд╕рдВрджрд░реНрднрд┐рдд) рд╕рд╛рдареА рдкреЙрдЗрдВрдЯ рдореЕрдиреЗрдЬрдореЗрдВрдЯ API рддрдкрд╛рд╕рд╛, рдкрдг рд╡реНрдпрд░реНрде. рд╣реЗ рд╡рд┐рдХрд╛рд╕рдХ рдЖрдгрд┐ рдСрдЯреЛрдореЗрд╢рди рдЙрддреНрд╕рд╛рд╣реА рд▓реЛрдХрд╛рдВрдЪреЗ рдЬреАрд╡рди рд▓рдХреНрд╖рдгреАрдпрд░реАрддреНрдпрд╛ рд╕реБрд▓рдн рдХрд░рддреЗ. рдкрд╛рдпрдердирдиреЗ рдЕрд▓реАрдХрдбреЗ рдкреНрд░рдЪрдВрдб рд▓реЛрдХрдкреНрд░рд┐рдпрддрд╛ рдорд┐рд│рд╡рд▓реА рдЖрд╣реЗ рдЖрдгрд┐ рдореА рдЕрдВрддрд░ рднрд░реВрди рдореБрдЦреНрдп рд╡реИрд╢рд┐рд╖реНрдЯреНрдпрд╛рдВрдЪреЗ рдкреБрдирд░рд╛рд╡рд▓реЛрдХрди рдХрд░рдгреНрдпрд╛рдЪрд╛ рдирд┐рд░реНрдгрдп рдШреЗрддрд▓рд╛. рдкреЙрдЗрдВрдЯ API рдкрд╛рдпрдерди рдбреЗрд╡реНрд╣рд▓рдкрдореЗрдВрдЯ рдХрд┐рдЯ рддрдкрд╛рд╕рд╛. рд╣рд╛ рд▓реЗрдЦ рд╣рд╛рдмреНрд░реЗрд╡рд░реАрд▓ рджреБрд╕рд░реНтАНрдпрд╛ рд▓реЗрдЦрд╛рдд рдЙрддреНрдХреГрд╖реНрдЯ рдЬреЛрдб рдореНрд╣рдгреВрди рдХрд╛рдо рдХрд░рддреЛ рдкреЙрдЗрдВрдЯ R80.10 API рддрдкрд╛рд╕рд╛. CLI, рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЖрдгрд┐ рдмрд░реЗрдЪ рдХрд╛рд╣реА рджреНрд╡рд╛рд░реЗ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрди. рдЖрдореНрд╣реА Python SDK рд╡рд╛рдкрд░реВрди рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╕реЗ рд▓рд┐рд╣рд╛рдпрдЪреЗ рддреЗ рдкрд╛рд╣реВ рдЖрдгрд┐ рдЖрд╡реГрддреНрддреА 1.6 (R80.40 рдкрд╛рд╕реВрди рд╕рдорд░реНрдерд┐рдд) рдордзреАрд▓ рдирд╡реАрди рд╡реНрдпрд╡рд╕реНрдерд╛рдкрди API рдХрд╛рд░реНрдпрдХреНрд╖рдорддреЗрдХрдбреЗ рдЬрд╡рд│реВрди рдкрд╛рд╣реВ. рд▓реЗрдЦ рд╕рдордЬреВрди рдШреЗрдгреНрдпрд╛рд╕рд╛рдареА, рддреБрдореНрд╣рд╛рд▓рд╛ APIs рдЖрдгрд┐ Python рд╕рд╣ рдХрд╛рдо рдХрд░рдгреНрдпрд╛рдЪреЗ рдореВрд▓рднреВрдд рдЬреНрдЮрд╛рди рдЖрд╡рд╢реНрдпрдХ рдЕрд╕реЗрд▓.

рдЪреЗрдХ рдкреЙрдЗрдВрдЯ рд╕рдХреНрд░рд┐рдпрдкрдгреЗ API рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдд рдЖрд╣реЗ рдЖрдгрд┐ рдпрд╛рдХреНрд╖рдгреА рдЦрд╛рд▓реАрд▓ рд░рд┐рд▓реАрдЭ рдХреЗрд▓реЗ рдЧреЗрд▓реЗ рдЖрд╣реЗрдд:

Python SDK рд╕рдзреНрдпрд╛ рдлрдХреНрдд рдореЕрдиреЗрдЬрдореЗрдВрдЯ API рдЖрдгрд┐ рдкрд░рд╕реНрдкрд░рд╕рдВрд╡рд╛рджрд╛рд▓рд╛ рд╕рдорд░реНрдерди рджреЗрддреЗ Gaia API. рдЖрдкрдг рдпрд╛ рдореЙрдбреНрдпреВрд▓рдордзреАрд▓ рд╕рд░реНрд╡рд╛рдд рдорд╣рддреНрд╡рд╛рдЪреЗ рд╡рд░реНрдЧ, рдкрджреНрдзрддреА рдЖрдгрд┐ рдЪрд▓ рдкрд╛рд╣реВ.

Python SDK рд╕рд╣ рдЪреЗрдХ рдкреЙрдЗрдВрдЯ API рд╕рд░рд▓реАрдХреГрдд рдХрд░рдгреЗ

рдореЙрдбреНрдпреВрд▓ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдд рдЖрд╣реЗ

рдореЙрдбреНрдпреВрд▓ cpapi рдкрд╛рд╕реВрди рдЬрд▓рдж рдЖрдгрд┐ рд╕рд╣рдЬ рд╕реНрдерд╛рдкрд┐рдд рд╣реЛрддреЗ рдЧрд┐рдердмрд╡рд░ рдЕрдзрд┐рдХреГрдд рдЪреЗрдХ рдкреЙрдЗрдВрдЯ рд░реЗрдкреЙрдЬрд┐рдЯрд░реА рдорджрддреАрдиреЗ рд╡рд╛рд│реАрдд рдЯрд╛рдХрдгреЗ. рдордзреНрдпреЗ рддрдкрд╢реАрд▓рд╡рд╛рд░ рд╕реНрдерд╛рдкрдирд╛ рд╕реВрдЪрдирд╛ рдЙрдкрд▓рдмреНрдз рдЖрд╣реЗрдд README.md. рд╣реЗ рдореЙрдбреНрдпреВрд▓ рдкрд╛рдпрдерди рдЖрд╡реГрддреНрддреНрдпрд╛ 2.7 рдЖрдгрд┐ 3.7 рд╕рд╣ рдХрд╛рд░реНрдп рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЕрдиреБрдХреВрд▓ рдХреЗрд▓реЗ рдЖрд╣реЗ. рдпрд╛ рд▓реЗрдЦрд╛рдд, рдкрд╛рдпрдерди 3.7 рд╡рд╛рдкрд░реВрди рдЙрджрд╛рд╣рд░рдгреЗ рджрд┐рд▓реА рдЬрд╛рддреАрд▓. рддрдерд╛рдкрд┐, рдкрд╛рдпрдерди SDK рдЪреЗрдХ рдкреЙрдЗрдВрдЯ рдореЕрдиреЗрдЬрдореЗрдВрдЯ рд╕рд░реНрд╡реНрд╣рд░ (рд╕реНрдорд╛рд░реНрдЯ рдореЕрдиреЗрдЬрдореЗрдВрдЯ) рд╡рд░реВрди рдереЗрдЯ рдЪрд╛рд▓рд╡рд┐рд▓рд╛ рдЬрд╛рдК рд╢рдХрддреЛ, рдкрд░рдВрддреБ рддреЗ рдХреЗрд╡рд│ рдкрд╛рдпрдерди 2.7 рд▓рд╛ рд╕рдорд░реНрдерди рджреЗрддрд╛рдд, рдореНрд╣рдгреВрди рд╢реЗрд╡рдЯрдЪрд╛ рд╡рд┐рднрд╛рдЧ рдЖрд╡реГрддреНрддреА 2.7 рд╕рд╛рдареА рдХреЛрдб рдкреНрд░рджрд╛рди рдХрд░реЗрд▓. рдореЙрдбреНрдпреВрд▓ рд╕реНрдерд╛рдкрд┐рдд рдХреЗрд▓реНрдпрд╛рдирдВрддрд░ рд▓рдЧреЗрдЪ, рдореА рдирд┐рд░реНрджреЗрд╢рд┐рдХреЗрддреАрд▓ рдЙрджрд╛рд╣рд░рдгреЗ рдкрд╛рд╣рдгреНрдпрд╛рдЪреА рд╢рд┐рдлрд╛рд░рд╕ рдХрд░рддреЛ example_python2 ╨╕ example_python3.

рдкреНрд░рд╛рд░рдВрдн рдХрд░рдгреЗ

рдЖрдореНрд╣рд╛рд▓рд╛ cpapi рдореЙрдбреНрдпреВрд▓рдЪреНрдпрд╛ рдШрдЯрдХрд╛рдВрд╕рд╣ рдХрд╛рд░реНрдп рдХрд░рдгреНрдпрд╛рд╕ рд╕рдХреНрд╖рдо рд╣реЛрдгреНрдпрд╛рд╕рд╛рдареА, рдЖрдореНрд╣рд╛рд▓рд╛ рдореЙрдбреНрдпреВрд▓рдордзреВрди рдЖрдпрд╛рдд рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ cpapi рдХрд┐рдорд╛рди рджреЛрди рдЖрд╡рд╢реНрдпрдХ рд╡рд░реНрдЧ:

APIClient ╨╕ APIClientArgs

from cpapi import APIClient, APIClientArgs

рдХреНрд▓реЛрд╕реНрд╕ APIClientArgs API рд╕рд░реНрд╡реНрд╣рд░ рдЖрдгрд┐ рд╡рд░реНрдЧрд╛рд╢реА рдХрдиреЗрдХреНрд╢рди рдкреЕрд░рд╛рдореАрдЯрд░реНрд╕рд╕рд╛рдареА рдЬрдмрд╛рдмрджрд╛рд░ рдЖрд╣реЗ APIClient API рд╕рд╣ рдкрд░рд╕реНрдкрд░рд╕рдВрд╡рд╛рджрд╛рд╕рд╛рдареА рдЬрдмрд╛рдмрджрд╛рд░ рдЖрд╣реЗ.

рдХрдиреЗрдХреНрд╢рди рдкреЕрд░рд╛рдореАрдЯрд░реНрд╕ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдгреЗ

API рд╢реА рдХрдиреЗрдХреНрдЯ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рд╡рд┐рд╡рд┐рдз рдкреЕрд░рд╛рдореАрдЯрд░реНрд╕ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рддреБрдореНрд╣рд╛рд▓рд╛ рд╡рд░реНрдЧрд╛рдЪрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рддрдпрд╛рд░ рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ APIClientArgs. рддрддреНрд╡рддрдГ, рддреНрдпрд╛рдЪреЗ рдкреЕрд░рд╛рдореАрдЯрд░реНрд╕ рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдЖрд╣реЗрдд рдЖрдгрд┐ рдирд┐рдпрдВрддреНрд░рдг рд╕рд░реНрд╡реНрд╣рд░рд╡рд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд╛рд▓рд╡рддрд╛рдирд╛, рддреНрдпрд╛рдВрдирд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдгреНрдпрд╛рдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╛рд╣реА.

client_args = APIClientArgs()

рдкрд░рдВрддреБ рддреГрддреАрдп-рдкрдХреНрд╖ рд╣реЛрд╕реНрдЯрд╡рд░ рдЪрд╛рд▓рдд рдЕрд╕рддрд╛рдирд╛, рддреБрдореНрд╣рд╛рд▓рд╛ API рд╕рд░реНрд╡реНрд╣рд░рдЪрд╛ рдХрд┐рдорд╛рди IP рдкрддреНрддрд╛ рдХрд┐рдВрд╡рд╛ рд╣реЛрд╕реНрдЯ рдирд╛рд╡ (рдЬреНрдпрд╛рд▓рд╛ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрди рд╕рд░реНрд╡реНрд╣рд░ рдЕрд╕реЗрд╣реА рдореНрд╣рдгрддрд╛рдд) рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ. рдЦрд╛рд▓реАрд▓ рдЙрджрд╛рд╣рд░рдгрд╛рдордзреНрдпреЗ, рдЖрдореНрд╣реА рд╕рд░реНрд╡реНрд╣рд░ рдХрдиреЗрдХреНрд╢рди рдкреЕрд░рд╛рдореАрдЯрд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЛ рдЖрдгрд┐ рддреНрдпрд╛рд╕ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореНрд╣рдгреВрди рд╡реНрдпрд╡рд╕реНрдерд╛рдкрди рд╕рд░реНрд╡реНрд╣рд░рдЪрд╛ IP рдкрддреНрддрд╛ рдирд┐рдпреБрдХреНрдд рдХрд░рддреЛ.

client_args = APIClientArgs(server='192.168.47.241')

рдЪрд▓рд╛ рд╕рд░реНрд╡ рдкреЕрд░рд╛рдореАрдЯрд░реНрд╕ рдЖрдгрд┐ рддреНрдпрд╛рдВрдЪреА рдбреАрдлреЙрд▓реНрдЯ рдореВрд▓реНрдпреЗ рдкрд╛рд╣реВ рдЬреА API рд╕рд░реНрд╡реНрд╣рд░рд╢реА рдХрдиреЗрдХреНрдЯ рдХрд░рддрд╛рдирд╛ рд╡рд╛рдкрд░рд▓реА рдЬрд╛рдК рд╢рдХрддрд╛рдд:

APIClientArgs рд╡рд░реНрдЧрд╛рдЪреНрдпрд╛ __init__ рдкрджреНрдзрддреАрдЪреЗ рд╡рд┐рддрд░реНрдХ

class APIClientArgs:
    """
    This class provides arguments for APIClient configuration.
    All the arguments are configured with their default values.
    """

    # port is set to None by default, but it gets replaced with 443 if not specified
    # context possible values - web_api (default) or gaia_api
    def __init__(self, port=None, fingerprint=None, sid=None, server="127.0.0.1", http_debug_level=0,
                 api_calls=None, debug_file="", proxy_host=None, proxy_port=8080,
                 api_version=None, unsafe=False, unsafe_auto_accept=False, context="web_api"):
        self.port = port
        # management server fingerprint
        self.fingerprint = fingerprint
        # session-id.
        self.sid = sid
        # management server name or IP-address
        self.server = server
        # debug level
        self.http_debug_level = http_debug_level
        # an array with all the api calls (for debug purposes)
        self.api_calls = api_calls if api_calls else []
        # name of debug file. If left empty, debug data will not be saved to disk.
        self.debug_file = debug_file
        # HTTP proxy server address (without "http://")
        self.proxy_host = proxy_host
        # HTTP proxy port
        self.proxy_port = proxy_port
        # Management server's API version
        self.api_version = api_version
        # Indicates that the client should not check the server's certificate
        self.unsafe = unsafe
        # Indicates that the client should automatically accept and save the server's certificate
        self.unsafe_auto_accept = unsafe_auto_accept
        # The context of using the client - defaults to web_api
        self.context = context

рдорд╛рдЭрд╛ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдЖрд╣реЗ рдХреА APIClientArgs рд╡рд░реНрдЧрд╛рдЪреНрдпрд╛ рдЙрджрд╛рд╣рд░рдгрд╛рдВрдордзреНрдпреЗ рд╡рд╛рдкрд░рд▓реЗ рдЬрд╛рдК рд╢рдХрдгрд╛рд░реЗ рдпреБрдХреНрддрд┐рд╡рд╛рдж рдЪреЗрдХ рдкреЙрдЗрдВрдЯ рдкреНрд░рд╢рд╛рд╕рдХрд╛рдВрд╕рд╛рдареА рдЕрдВрддрд░реНрдЬреНрдЮрд╛рдиреА рдЖрд╣реЗрдд рдЖрдгрд┐ рддреНрдпрд╛рдВрдирд╛ рдЕрддрд┐рд░рд┐рдХреНрдд рдЯрд┐рдкреНрдкрдгреНрдпрд╛рдВрдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╛рд╣реА.

APIClient рдЖрдгрд┐ рд╕рдВрджрд░реНрдн рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХрд╛рджреНрд╡рд╛рд░реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдд рдЖрд╣реЗ

рдХреНрд▓реЛрд╕реНрд╕ APIClient рддреЗ рд╡рд╛рдкрд░рдгреНрдпрд╛рдЪрд╛ рд╕рд░реНрд╡рд╛рдд рд╕реЛрдпреАрд╕реНрдХрд░ рдорд╛рд░реНрдЧ рдореНрд╣рдгрдЬреЗ рд╕рдВрджрд░реНрдн рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХрд╛рджреНрд╡рд╛рд░реЗ. APIClient рдХреНрд▓рд╛рд╕рдЪреНрдпрд╛ рдЙрджрд╛рд╣рд░рдгрд╛рд╡рд░ рдкрд╛рд╕ рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ рддреЗ рдХрдиреЗрдХреНрд╢рди рдкреЕрд░рд╛рдореАрдЯрд░реНрд╕ рдЖрд╣реЗрдд рдЬреЗ рдорд╛рдЧреАрд▓ рдЪрд░рдгрд╛рдд рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХреЗрд▓реЗ рд╣реЛрддреЗ.

with APIClient(client_args) as client:

рд╕рдВрджрд░реНрдн рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ API рд╕рд░реНрд╡реНрд╣рд░рд╡рд░ рд╕реНрд╡рдпрдВрдЪрд▓рд┐рддрдкрдгреЗ рд▓реЙрдЧрд┐рди рдХреЙрд▓ рдХрд░рдгрд╛рд░ рдирд╛рд╣реА, рдкрд░рдВрддреБ рддреЗ рдмрд╛рд╣реЗрд░ рдкрдбрддрд╛рдирд╛ рд▓реЙрдЧрдЖрдЙрдЯ рдХреЙрд▓ рдХрд░реЗрд▓. API рдХреЙрд▓рд╕рд╣ рдХрд╛рд░реНрдп рдкреВрд░реНрдг рдХреЗрд▓реНрдпрд╛рдирдВрддрд░ рдХрд╛рд╣реА рдХрд╛рд░рдгрд╛рд╕реНрддрд╡ рд▓реЙрдЧрдЖрдЙрдЯ рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдирд╕рд▓реНрдпрд╛рд╕, рддреБрдореНрд╣рд╛рд▓рд╛ рд╕рдВрджрд░реНрдн рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рди рд╡рд╛рдкрд░рддрд╛ рдХрд╛рд░реНрдп рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ:

client = APIClient(clieng_args)

рдХрдиреЗрдХреНрд╢рди рдЪрд╛рдЪрдгреА

рдХрдиреЗрдХреНрд╢рди рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдкреЕрд░рд╛рдореАрдЯрд░реНрд╕ рдкреВрд░реНрдг рдХрд░рддреЗ рдХреА рдирд╛рд╣реА рд╣реЗ рддрдкрд╛рд╕рдгреНрдпрд╛рдЪрд╛ рд╕рд░реНрд╡рд╛рдд рд╕реЛрдкрд╛ рдорд╛рд░реНрдЧ рдореНрд╣рдгрдЬреЗ рдкрджреНрдзрдд рд╡рд╛рдкрд░рдгреЗ рддрдкрд╛рд╕рд╛_рдлрд┐рдВрдЧрд░рдкреНрд░рд┐рдВрдЯ. рд╕рд░реНрд╡реНрд╣рд░ API рдкреНрд░рдорд╛рдгрдкрддреНрд░рд╛рдЪреНрдпрд╛ рдлрд┐рдВрдЧрд░рдкреНрд░рд┐рдВрдЯрд╕рд╛рдареА sha1 рд╣реЕрд╢ рд╕рдордЪреА рдкрдбрддрд╛рд│рдгреА рдЕрдпрд╢рд╕реНрд╡реА рдЭрд╛рд▓реНрдпрд╛рд╕ (рдкрджреНрдзрдд рдкрд░рдд рдЖрд▓реА рдЦреЛрдЯреЗ), рддрд░ рд╣реЗ рд╕рд╣рд╕рд╛ рдХрдиреЗрдХреНрд╢рди рд╕рдорд╕реНрдпрд╛рдВрдореБрд│реЗ рд╣реЛрддреЗ рдЖрдгрд┐ рдЖрдореНрд╣реА рдкреНрд░реЛрдЧреНрд░рд╛рдордЪреА рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреА рдерд╛рдВрдмрд╡реВ рд╢рдХрддреЛ (рдХрд┐рдВрд╡рд╛ рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рд▓рд╛ рдХрдиреЗрдХреНрд╢рди рдбреЗрдЯрд╛ рджреБрд░реБрд╕реНрдд рдХрд░рдгреНрдпрд╛рдЪреА рд╕рдВрдзреА рджреЗрдК рд╢рдХрддреЛ):

    if client.check_fingerprint() is False:
        print("Could not get the server's fingerprint - Check connectivity with the server.")
        exit(1)

рдХреГрдкрдпрд╛ рд▓рдХреНрд╖рд╛рдд рдШреНрдпрд╛ рдХреА рднрд╡рд┐рд╖реНрдпрд╛рдд рд╡рд░реНрдЧ APIClient рдкреНрд░рддреНрдпреЗрдХ API рдХреЙрд▓ рддрдкрд╛рд╕реЗрд▓ (рдкрджреНрдзрддреА api_call ╨╕ api_query, рдЖрдореНрд╣реА рддреНрдпрд╛рдВрдЪреНрдпрд╛рдмрджреНрджрд▓ рдереЛрдбреЗ рдкреБрдвреЗ рдмреЛрд▓реВ) API рд╕рд░реНрд╡реНрд╣рд░рд╡рд░ sha1 рдлрд┐рдВрдЧрд░рдкреНрд░рд┐рдВрдЯ рдкреНрд░рдорд╛рдгрдкрддреНрд░. рдкрд░рдВрддреБ, API рд╕рд░реНрд╡реНрд╣рд░ рдкреНрд░рдорд╛рдгрдкрддреНрд░рд╛рдЪреЗ sha1 рдлрд┐рдВрдЧрд░рдкреНрд░рд┐рдВрдЯ рддрдкрд╛рд╕рддрд╛рдирд╛, рддреНрд░реБрдЯреА рдЖрдврд│рд▓реНрдпрд╛рд╕ (рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдЕрдЬреНрдЮрд╛рдд рдЖрд╣реЗ рдХрд┐рдВрд╡рд╛ рдмрджрд▓рд▓реЗ рдЧреЗрд▓реЗ рдЖрд╣реЗ), рдкрджреНрдзрдд рддрдкрд╛рд╕рд╛_рдлрд┐рдВрдЧрд░рдкреНрд░рд┐рдВрдЯ рд╕реНрдерд╛рдирд┐рдХ рдорд╢реАрдирд╡рд░ рдЖрдкреЛрдЖрдк рдорд╛рд╣рд┐рддреА рдЬреЛрдбрдгреНрдпрд╛рдЪреА/рдмрджрд▓рдгреНрдпрд╛рдЪреА рд╕рдВрдзреА рдкреНрд░рджрд╛рди рдХрд░реЗрд▓. рд╣реА рддрдкрд╛рд╕рдгреА рдкреВрд░реНрдгрдкрдгреЗ рдЕрдХреНрд╖рдо рдХреЗрд▓реА рдЬрд╛рдК рд╢рдХрддреЗ (рдкрд░рдВрддреБ APIClientArgs рдпреБрдХреНрддрд┐рд╡рд╛рдж рд╡рд╛рдкрд░реВрди, 127.0.0.1 рд╢реА рдХрдиреЗрдХреНрдЯ рдХрд░рддрд╛рдирд╛, API рд╕рд░реНрд╡реНрд╣рд░рд╡рд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд╛рд▓рд╡рд▓реНрдпрд╛ рдЧреЗрд▓реНрдпрд╛ рдЕрд╕рддреАрд▓ рддрд░рдЪ рдпрд╛рдЪреА рд╢рд┐рдлрд╛рд░рд╕ рдХреЗрд▓реА рдЬрд╛рдК рд╢рдХрддреЗ - unsafe_auto_accept ("рдХрдиреЗрдХреНрд╢рди рдкреЕрд░рд╛рдореАрдЯрд░реНрд╕ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдгреЗ" рдордзреНрдпреЗ APIClientArgs рдмрджреНрджрд▓ рдЕрдзрд┐рдХ рдкрд╣рд╛).

client_args = APIClientArgs(unsafe_auto_accept=True)

API рд╕рд░реНрд╡реНрд╣рд░рд╡рд░ рд▓реЙрдЧ рдЗрди рдХрд░рд╛

╨г APIClient API рд╕рд░реНрд╡реНрд╣рд░рд╡рд░ рд▓реЙрдЧ рдЗрди рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рддрдмреНрдмрд▓ 3 рдкрджреНрдзрддреА рдЖрд╣реЗрдд рдЖрдгрд┐ рддреНрдпрд╛ рдкреНрд░рддреНрдпреЗрдХрд╛рдЪрд╛ рдЕрд░реНрде рд╕рдордЬрддреЛ sid(рд╕рддреНрд░-рдЖрдпрдбреА), рдЬреЗ рд╢реАрд░реНрд╖рд▓реЗрдЦрд╛рддреАрд▓ рдкреНрд░рддреНрдпреЗрдХ рддреНрдпрд╛рдирдВрддрд░рдЪреНрдпрд╛ API рдХреЙрд▓рдордзреНрдпреЗ рд╕реНрд╡рдпрдВрдЪрд▓рд┐рддрдкрдгреЗ рд╡рд╛рдкрд░рд▓реЗ рдЬрд╛рддреЗ (рдпрд╛ рдкреЕрд░рд╛рдореАрдЯрд░рдЪреНрдпрд╛ рд╢реАрд░реНрд╖рд▓реЗрдЦрд╛рддреАрд▓ рдирд╛рд╡ рдЖрд╣реЗ X-chkp-sid), рддреНрдпрд╛рдореБрд│реЗ рдпрд╛ рдкреЕрд░рд╛рдореАрдЯрд░рд╡рд░ рдкреБрдвреАрд▓ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд░рдгреНрдпрд╛рдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╛рд╣реА.

рд▓реЙрдЧрд┐рди рдкрджреНрдзрдд

рд▓реЙрдЧрд┐рди рдЖрдгрд┐ рдкрд╛рд╕рд╡рд░реНрдб рд╡рд╛рдкрд░рдгреНрдпрд╛рдЪрд╛ рдкрд░реНрдпрд╛рдп (рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рд╡рд╛рдкрд░рдХрд░реНрддрд╛рдирд╛рд╡ рдкреНрд░рд╢рд╛рд╕рдХ рдЖрдгрд┐ рд╕рдВрдХреЗрддрд╢рдмреНрдж 1q2w3e рд╕реНрдерд╛рдирд╛рддреНрдордХ рдпреБрдХреНрддрд┐рд╡рд╛рдж рдореНрд╣рдгреВрди рдкрд╛рд╕ рдХреЗрд▓реЗ рдЬрд╛рддрд╛рдд):

     login = client.login('admin', '1q2w3e')  

рд▓реЙрдЧрд┐рди рдкрджреНрдзрддреАрдордзреНрдпреЗ рдЕрддрд┐рд░рд┐рдХреНрдд рдкрд░реНрдпрд╛рдпреА рдорд╛рдкрджрдВрдб рджреЗрдЦреАрд▓ рдЙрдкрд▓рдмреНрдз рдЖрд╣реЗрдд; рдпреЗрдереЗ рддреНрдпрд╛рдВрдЪреА рдирд╛рд╡реЗ рдЖрдгрд┐ рдбреАрдлреЙрд▓реНрдЯ рдореВрд▓реНрдпреЗ рдЖрд╣реЗрдд:

continue_last_session=False, domain=None, read_only=False, payload=None

рд▓реЙрдЧрд┐рди_with_api_key рдкрджреНрдзрддреА

api рдХреА рд╡рд╛рдкрд░рдгреНрдпрд╛рдЪрд╛ рдкрд░реНрдпрд╛рдп (рд╡реНрдпрд╡рд╕реНрдерд╛рдкрди рдЖрд╡реГрддреНрддреА R80.40/Management API v1.6 рдкрд╛рд╕реВрди рдкреНрд░рд╛рд░рдВрдн рдХрд░реВрди рд╕рдорд░реНрдерд┐рдд, "3TsbPJ8ZKjaJGvFyoFqHFA==" рд╣реЗ API рдХреА рдЕрдзрд┐рдХреГрддрддрд╛ рдкрджреНрдзрддреАрд╕рд╣ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрди рд╕рд░реНрд╡реНрд╣рд░рд╡рд░реАрд▓ рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рдВрдкреИрдХреА рдПрдХрд╛рд╕рд╛рдареА API рдХреА рдореВрд▓реНрдп рдЖрд╣реЗ:

     login = client.login_with_api_key('3TsbPJ8ZKjaJGvFyoFqHFA==') 

рдкрджреНрдзрддреАрдиреЗ login_with_api_key рдкрджреНрдзрддреАрдкреНрд░рдорд╛рдгреЗрдЪ рдкрд░реНрдпрд╛рдпреА рдорд╛рдкрджрдВрдб рдЙрдкрд▓рдмреНрдз рдЖрд╣реЗрдд рд▓реЙрдЧрд┐рди.

login_as_root рдкрджреНрдзрдд

API рд╕рд░реНрд╡реНрд╣рд░рд╕рд╣ рд╕реНрдерд╛рдирд┐рдХ рдорд╢реАрдирд╡рд░ рд▓реЙрдЧ рдЗрди рдХрд░рдгреНрдпрд╛рдЪрд╛ рдкрд░реНрдпрд╛рдп:

     login = client.login_as_root()

рдпрд╛ рдкрджреНрдзрддреАрд╕рд╛рдареА рдлрдХреНрдд рджреЛрди рдкрд░реНрдпрд╛рдпреА рдорд╛рдкрджрдВрдб рдЙрдкрд▓рдмреНрдз рдЖрд╣реЗрдд:

domain=None, payload=None

рдЖрдгрд┐ рд╢реЗрд╡рдЯреА API рд╕реНрд╡рддрдГрд▓рд╛ рдХреЙрд▓ рдХрд░рддрд╛рдд

рдЖрдордЪреНрдпрд╛рдХрдбреЗ рдкрджреНрдзрддреАрдВрджреНрд╡рд╛рд░реЗ API рдХреЙрд▓ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рджреЛрди рдкрд░реНрдпрд╛рдп рдЖрд╣реЗрдд api_call ╨╕ api_query. рдЪрд▓рд╛ рддреНрдпрд╛рдВрдЪреНрдпрд╛рдд рдХрд╛рдп рдлрд░рдХ рдЖрд╣реЗ рддреЗ рд╢реЛрдзреВрдпрд╛.

api_call

рд╣реА рдкрджреНрдзрдд рдХреЛрдгрддреНрдпрд╛рд╣реА рдХреЙрд▓рд╕рд╛рдареА рд▓рд╛рдЧреВ рдЖрд╣реЗ. рдЖрдореНрд╣рд╛рд▓рд╛ рдПрдкреАрдЖрдп рдХреЙрд▓рд╕рд╛рдареА рд╢реЗрд╡рдЯрдЪрд╛ рднрд╛рдЧ рдкрд╛рд╕ рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ рдЖрдгрд┐ рдЖрд╡рд╢реНрдпрдХ рдЕрд╕рд▓реНрдпрд╛рд╕ рд╡рд┐рдирдВрддреА рдореБрдЦреНрдп рднрд╛рдЧрд╛рдордзреНрдпреЗ рдкреЗрд▓реЛрдб рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ. рдкреЗрд▓реЛрдб рд░рд┐рдХреНрдд рдЕрд╕рд▓реНрдпрд╛рд╕, рддреЗ рдЕрдЬрд┐рдмрд╛рдд рдкреНрд░рд╕рд╛рд░рд┐рдд рдХреЗрд▓реЗ рдЬрд╛рдК рд╢рдХрдд рдирд╛рд╣реА:

api_versions = client.api_call('show-api-versions') 

рдХрдЯ рдЦрд╛рд▓реА рдпрд╛ рд╡рд┐рдирдВрддреАрд╕рд╛рдареА рдЖрдЙрдЯрдкреБрдЯ:

In [23]: api_versions                                                           
Out[23]: 
APIResponse({
    "data": {
        "current-version": "1.6",
        "supported-versions": [
            "1",
            "1.1",
            "1.2",
            "1.3",
            "1.4",
            "1.5",
            "1.6"
        ]
    },
    "res_obj": {
        "data": {
            "current-version": "1.6",
            "supported-versions": [
                "1",
                "1.1",
                "1.2",
                "1.3",
                "1.4",
                "1.5",
                "1.6"
            ]
        },
        "status_code": 200
    },
    "status_code": 200,
    "success": true
})
show_host = client.api_call('show-host', {'name' : 'h_8.8.8.8'})

рдХрдЯ рдЦрд╛рд▓реА рдпрд╛ рд╡рд┐рдирдВрддреАрд╕рд╛рдареА рдЖрдЙрдЯрдкреБрдЯ:

In [25]: show_host                                                              
Out[25]: 
APIResponse({
    "data": {
        "color": "black",
        "comments": "",
        "domain": {
            "domain-type": "domain",
            "name": "SMC User",
            "uid": "41e821a0-3720-11e3-aa6e-0800200c9fde"
        },
        "groups": [],
        "icon": "Objects/host",
        "interfaces": [],
        "ipv4-address": "8.8.8.8",
        "meta-info": {
            "creation-time": {
                "iso-8601": "2020-05-01T21:49+0300",
                "posix": 1588358973517
            },
            "creator": "admin",
            "last-modifier": "admin",
            "last-modify-time": {
                "iso-8601": "2020-05-01T21:49+0300",
                "posix": 1588358973517
            },
            "lock": "unlocked",
            "validation-state": "ok"
        },
        "name": "h_8.8.8.8",
        "nat-settings": {
            "auto-rule": false
        },
        "read-only": false,
        "tags": [],
        "type": "host",
        "uid": "c210af07-1939-49d3-a351-953a9c471d9e"
    },
    "res_obj": {
        "data": {
            "color": "black",
            "comments": "",
            "domain": {
                "domain-type": "domain",
                "name": "SMC User",
                "uid": "41e821a0-3720-11e3-aa6e-0800200c9fde"
            },
            "groups": [],
            "icon": "Objects/host",
            "interfaces": [],
            "ipv4-address": "8.8.8.8",
            "meta-info": {
                "creation-time": {
                    "iso-8601": "2020-05-01T21:49+0300",
                    "posix": 1588358973517
                },
                "creator": "admin",
                "last-modifier": "admin",
                "last-modify-time": {
                    "iso-8601": "2020-05-01T21:49+0300",
                    "posix": 1588358973517
                },
                "lock": "unlocked",
                "validation-state": "ok"
            },
            "name": "h_8.8.8.8",
            "nat-settings": {
                "auto-rule": false
            },
            "read-only": false,
            "tags": [],
            "type": "host",
            "uid": "c210af07-1939-49d3-a351-953a9c471d9e"
        },
        "status_code": 200
    },
    "status_code": 200,
    "success": true
})

api_query

рдореА рд▓рдЧреЗрдЪ рдЖрд░рдХреНрд╖рдг рдХрд░рддреЛ рдХреА рд╣реА рдкрджреНрдзрдд рдлрдХреНрдд рдЕрд╢рд╛ рдХреЙрд▓рд╕рд╛рдареА рд▓рд╛рдЧреВ рдЖрд╣реЗ рдЬреНрдпрд╛рдВрдЪреНрдпрд╛ рдЖрдЙрдЯрдкреБрдЯрдордзреНрдпреЗ рдСрдлрд╕реЗрдЯрдЪрд╛ рд╕рдорд╛рд╡реЗрд╢ рдЖрд╣реЗ. рдЕрд╕реЗ рдЕрдиреБрдорд╛рди рддреЗрд╡реНрд╣рд╛ рдЙрджреНрднрд╡рддреЗ рдЬреЗрд╡реНрд╣рд╛ рддреНрдпрд╛рдд рдореЛрдареНрдпрд╛ рдкреНрд░рдорд╛рдгрд╛рдд рдорд╛рд╣рд┐рддреА рдЕрд╕рддреЗ рдХрд┐рдВрд╡рд╛ рдЕрд╕реВ рд╢рдХрддреЗ. рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рдореЕрдиреЗрдЬрдореЗрдВрдЯ рд╕рд░реНрд╡реНрд╣рд░рд╡рд░ рддрдпрд╛рд░ рдХреЗрд▓реЗрд▓реНрдпрд╛ рд╕рд░реНрд╡ рд╣реЛрд╕реНрдЯ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕рдЪреНрдпрд╛ рд╕реВрдЪреАрд╕рд╛рдареА рд╣реА рд╡рд┐рдирдВрддреА рдЕрд╕реВ рд╢рдХрддреЗ. рдЕрд╢рд╛ рд╡рд┐рдирдВрддреНрдпрд╛рдВрд╕рд╛рдареА, API рдбреАрдлреЙрд▓реНрдЯрдиреБрд╕рд╛рд░ 50 рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕рдЪреА рд╕реВрдЪреА рджреЗрддреЗ (рдЖрдкрдг рдкреНрд░рддрд┐рд╕рд╛рджрд╛рдд 500 рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕рдЪреА рдорд░реНрдпрд╛рджрд╛ рд╡рд╛рдврд╡реВ рд╢рдХрддрд╛). рдЖрдгрд┐ рдПрдкреАрдЖрдп рд╡рд┐рдирдВрддреАрдордзреНрдпреЗ рдСрдлрд╕реЗрдЯ рдкреЕрд░рд╛рдореАрдЯрд░ рдмрджрд▓реВрди, рдорд╛рд╣рд┐рддреА рдЕрдиреЗрдХ рд╡реЗрд│рд╛ рдЦреЗрдЪреВ рдирдпреЗ рдореНрд╣рдгреВрди, рдПрдХ api_query рдкрджреНрдзрдд рдЖрд╣реЗ рдЬреА рд╣реЗ рд╕реНрд╡рдпрдВрдЪрд▓рд┐рддрдкрдгреЗ рдХрд╛рд░реНрдп рдХрд░рддреЗ. рдпрд╛ рдкрджреНрдзрддреАрдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рдХреЙрд▓рдЪреА рдЙрджрд╛рд╣рд░рдгреЗ: рд╢реЛ-рд╕рддреНрд░, рд╢реЛ-рд╣реЛрд╕реНрдЯ, рд╢реЛ-рдиреЗрдЯрд╡рд░реНрдХ, рд╢реЛ-рд╡рд╛рдЗрд▓реНрдбрдХрд╛рд░реНрдб, рд╢реЛ-рдЧреНрд░реБрдк, рд╢реЛ-рдкрддреНрддрд╛-рд╢реНрд░реЗрдгреА, рд╢реЛ-рд╕рд┐рдВрдкрд▓-рдЧреЗрдЯрд╡реЗ, рд╢реЛ-рд╕рд┐рдВрдкрд▓-рдХреНрд▓рд╕реНрдЯрд░, рд╢реЛ-рдЕреЕрдХреНрд╕реЗрд╕-рднреВрдорд┐рдХрд╛, рд╢реЛ-рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп-рдХреНрд▓рд╛рдпрдВрдЯ, рдкреЕрдХреЗрдЬреЗрд╕ рджрд╛рдЦрд╡рд╛. рдЦрд░рдВ рддрд░, рдЖрдореНрд╣реА рдпрд╛ API рдХреЙрд▓реНрд╕рдЪреНрдпрд╛ рдирд╛рд╡рд╛рдд рдЕрдиреЗрдХрд╡рдЪрдиреА рд╢рдмреНрдж рдкрд╛рд╣рддреЛ, рддреНрдпрд╛рдореБрд│реЗ рд╣реЗ рдХреЙрд▓ рд╣рд╛рддрд╛рд│рдгреЗ рд╕реЛрдкреЗ рд╣реЛрдИрд▓ api_query

show_hosts = client.api_query('show-hosts') 

рдХрдЯ рдЦрд╛рд▓реА рдпрд╛ рд╡рд┐рдирдВрддреАрд╕рд╛рдареА рдЖрдЙрдЯрдкреБрдЯ:

In [21]: show_hosts                                                             
Out[21]: 
APIResponse({
    "data": [
        {
            "domain": {
                "domain-type": "domain",
                "name": "SMC User",
                "uid": "41e821a0-3720-11e3-aa6e-0800200c9fde"
            },
            "ipv4-address": "192.168.47.1",
            "name": "h_192.168.47.1",
            "type": "host",
            "uid": "5d7d7086-d70b-4995-971a-0583b15a2bfc"
        },
        {
            "domain": {
                "domain-type": "domain",
                "name": "SMC User",
                "uid": "41e821a0-3720-11e3-aa6e-0800200c9fde"
            },
            "ipv4-address": "8.8.8.8",
            "name": "h_8.8.8.8",
            "type": "host",
            "uid": "c210af07-1939-49d3-a351-953a9c471d9e"
        }
    ],
    "res_obj": {
        "data": {
            "from": 1,
            "objects": [
                {
                    "domain": {
                        "domain-type": "domain",
                        "name": "SMC User",
                        "uid": "41e821a0-3720-11e3-aa6e-0800200c9fde"
                    },
                    "ipv4-address": "192.168.47.1",
                    "name": "h_192.168.47.1",
                    "type": "host",
                    "uid": "5d7d7086-d70b-4995-971a-0583b15a2bfc"
                },
                {
                    "domain": {
                        "domain-type": "domain",
                        "name": "SMC User",
                        "uid": "41e821a0-3720-11e3-aa6e-0800200c9fde"
                    },
                    "ipv4-address": "8.8.8.8",
                    "name": "h_8.8.8.8",
                    "type": "host",
                    "uid": "c210af07-1939-49d3-a351-953a9c471d9e"
                }
            ],
            "to": 2,
            "total": 2
        },
        "status_code": 200
    },
    "status_code": 200,
    "success": true
})

API рдХреЙрд▓рдЪреНрдпрд╛ рдкрд░рд┐рдгрд╛рдорд╛рдВрд╡рд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд░рдд рдЖрд╣реЗ

рдпрд╛рдирдВрддрд░ рддреБрдореНрд╣реА рдХреНрд▓рд╛рд╕рдЪреЗ рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓реНрд╕ рдЖрдгрд┐ рдкрджреНрдзрддреА рд╡рд╛рдкрд░реВ рд╢рдХрддрд╛ API рдкреНрд░рддрд┐рд╕рд╛рдж(рд╕рдВрджрд░реНрдн рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХрд╛рдЪреНрдпрд╛ рдЖрдд рдЖрдгрд┐ рдмрд╛рд╣реЗрд░ рджреЛрдиреНрд╣реА). рд╡рд░реНрдЧрд╛рдд API рдкреНрд░рддрд┐рд╕рд╛рдж 4 рдкрджреНрдзрддреА рдЖрдгрд┐ 5 рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓реНрд╕ рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдЖрд╣реЗрдд; рдЖрдореНрд╣реА рд╕рд░реНрд╡рд╛рдд рдорд╣рддреНрд╡рд╛рдЪреНрдпрд╛ рдЧреЛрд╖реНрдЯреАрдВрд╡рд░ рдЕрдзрд┐рдХ рддрдкрд╢реАрд▓рд╡рд╛рд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реВ.

Python SDK рд╕рд╣ рдЪреЗрдХ рдкреЙрдЗрдВрдЯ API рд╕рд░рд▓реАрдХреГрдд рдХрд░рдгреЗ

рдпрд╢

рд╕реБрд░реБрд╡рд╛рддреАрд▓рд╛, API рдХреЙрд▓ рдпрд╢рд╕реНрд╡реА рдЭрд╛рд▓рд╛ рдЖрдгрд┐ рдкрд░рд┐рдгрд╛рдо рдкрд░рдд рдЖрд▓рд╛ рдпрд╛рдЪреА рдЦрд╛рддреНрд░реА рдХрд░рдгреЗ рдЪрд╛рдВрдЧрд▓реА рдХрд▓реНрдкрдирд╛ рдЕрд╕реЗрд▓. рдпрд╛рд╕рд╛рдареА рдПрдХ рдкрджреНрдзрдд рдЖрд╣реЗ рдпрд╢:

In [49]: api_versions.success                                                   
Out[49]: True

API рдХреЙрд▓ рдпрд╢рд╕реНрд╡реА рдЭрд╛рд▓реНрдпрд╛рд╕ рд╕рддреНрдп (рдкреНрд░рддрд┐рд╕рд╛рдж рдХреЛрдб - 200) рдЖрдгрд┐ рдпрд╢рд╕реНрд╡реА рди рдЭрд╛рд▓реНрдпрд╛рд╕ рдЕрд╕рддреНрдп (рдЗрддрд░ рдХреЛрдгрддрд╛рд╣реА рдкреНрд░рддрд┐рд╕рд╛рдж рдХреЛрдб) рдкрд░рдд рдХрд░рддреЛ. рдкреНрд░рддрд┐рд╕рд╛рдж рдХреЛрдбрд╡рд░ рдЕрд╡рд▓рдВрдмреВрди рднрд┐рдиреНрди рдорд╛рд╣рд┐рддреА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА API рдХреЙрд▓рдирдВрддрд░ рд▓рдЧреЗрдЪ рд╡рд╛рдкрд░рдгреЗ рд╕реЛрдпреАрдЪреЗ рдЖрд╣реЗ.

if api_ver.success: 
    print(api_versions.data) 
else: 
    print(api_versions.err_message) 

рд╕реНрдерд┐рддреА рдХреЛрдб

API рдХреЙрд▓ рдХреЗрд▓реНрдпрд╛рдирдВрддрд░ рдкреНрд░рддрд┐рд╕рд╛рдж рдХреЛрдб рдкрд░рдд рдХрд░рддреЗ.

In [62]: api_versions.status_code                                               
Out[62]: 400

рд╕рдВрднрд╛рд╡реНрдп рдкреНрд░рддрд┐рд╕рд╛рдж рдХреЛрдб: 200,400,401,403,404,409,500,501.

set_success_status

рдпрд╛ рдкреНрд░рдХрд░рдгрд╛рдд, рдпрд╢рд╛рдЪреНрдпрд╛ рд╕реНрдерд┐рддреАрдЪреЗ рдореВрд▓реНрдп рдмрджрд▓рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЕрд╕реВ рд╢рдХрддреЗ. рддрд╛рдВрддреНрд░рд┐рдХрджреГрд╖реНрдЯреНрдпрд╛, рддреБрдореНрд╣реА рддреЗрдереЗ рдХрд╛рд╣реАрд╣реА рдареЗрд╡реВ рд╢рдХрддрд╛, рдЕрдЧрджреА рдирд┐рдпрдорд┐рдд рд╕реНрдЯреНрд░рд┐рдВрдЧ рджреЗрдЦреАрд▓. рдкрд░рдВрддреБ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЙрджрд╛рд╣рд░рдг рд╣реЗ рдкреЕрд░рд╛рдореАрдЯрд░ рдХрд╛рд╣реА рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкрд░рд┐рд╕реНрдерд┐рддреАрдВрдордзреНрдпреЗ рдЕрд╕рддреНрдп рд╡рд░ рд░реАрд╕реЗрдЯ рдХрд░рдгреЗ рдЖрд╣реЗ. рдЦрд╛рд▓реА, рд╡реНрдпрд╡рд╕реНрдерд╛рдкрди рд╕рд░реНрд╡реНрд╣рд░рд╡рд░ рдХрд╛рд░реНрдп рдЪрд╛рд▓реВ рдЕрд╕рддрд╛рдирд╛ рдЙрджрд╛рд╣рд░рдгрд╛рдХрдбреЗ рд▓рдХреНрд╖ рджреНрдпрд╛, рдкрд░рдВрддреБ рдЖрдореНрд╣реА рд╣реА рд╡рд┐рдирдВрддреА рдЕрдпрд╢рд╕реНрд╡реА рдорд╛рдиреВ (рдЖрдореНрд╣реА рдпрд╢ рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓ рд╕реЗрдЯ рдХрд░реВ рдЦреЛрдЯреЗ, API рдХреЙрд▓ рдпрд╢рд╕реНрд╡реА рдЭрд╛рд▓рд╛ рдЖрдгрд┐ рдХреЛрдб 200 рдкрд░рдд рдЖрд▓рд╛ рд╣реЗ рдЕрд╕реВрдирд╣реА).

for task in task_result.data["tasks"]:
    if task["status"] == "failed" or task["status"] == "partially succeeded":
        task_result.set_success_status(False)
        break

рдкреНрд░рддрд┐рд╕рд╛рдж()

рдкреНрд░рддрд┐рд╕рд╛рдж рдкрджреНрдзрдд рддреБрдореНрд╣рд╛рд▓рд╛ рдкреНрд░рддрд┐рд╕рд╛рдж рдХреЛрдб (status_code) рдЖрдгрд┐ рдкреНрд░рддрд┐рд╕рд╛рдж рдореБрдЦреНрдп рднрд╛рдЧ (рдмреЙрдбреА) рд╕рд╣ рд╢рдмреНрджрдХреЛрд╢ рдкрд╛рд╣рдгреНрдпрд╛рдЪреА рдкрд░рд╡рд╛рдирдЧреА рджреЗрддреЗ.

In [94]: api_versions.response()                                                
Out[94]: 
{'status_code': 200,
 'data': {'current-version': '1.6',
  'supported-versions': ['1', '1.1', '1.2', '1.3', '1.4', '1.5', '1.6']}}

рдбреЗрдЯрд╛

рддреБрдореНрд╣рд╛рд▓рд╛ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдорд╛рд╣рд┐рддреАрд╢рд┐рд╡рд╛рдп рдлрдХреНрдд рдкреНрд░рддрд┐рд╕рд╛рджрд╛рдЪреЗ рдореБрдЦреНрдп рднрд╛рдЧ (рд╢рд░реАрд░) рдкрд╛рд╣рдгреНрдпрд╛рдЪреА рдкрд░рд╡рд╛рдирдЧреА рджреЗрддреЗ.

In [93]: api_versions.data                                                      
Out[93]: 
{'current-version': '1.6',
 'supported-versions': ['1', '1.1', '1.2', '1.3', '1.4', '1.5', '1.6']}

рддреНрд░реБрдЯреА_рд╕рдВрджреЗрд╢

API рд╡рд┐рдирдВрддреАрд╡рд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд░рддрд╛рдирд╛ рддреНрд░реБрдЯреА рдЖрд▓реА рддреЗрд╡реНрд╣рд╛рдЪ рд╣реА рдорд╛рд╣рд┐рддреА рдЙрдкрд▓рдмреНрдз рд╣реЛрддреЗ (рдкреНрд░рддрд┐рд╕рд╛рдж рдХреЛрдб рдирд╛рд╣реА 200). рдЙрджрд╛рд╣рд░рдг рдЖрдЙрдЯрдкреБрдЯ

In [107]: api_versions.error_message                                            
Out[107]: 'code: generic_err_invalid_parameter_namenmessage: Unrecognized parameter [1]n'

рдЙрдкрдпреБрдХреНрдд рдЙрджрд╛рд╣рд░рдгреЗ

рд╡реНрдпрд╡рд╕реНрдерд╛рдкрди API 1.6 рдордзреНрдпреЗ рдЬреЛрдбрд▓реЗрд▓реЗ API рдХреЙрд▓ рд╡рд╛рдкрд░рдгрд╛рд░реА рдЙрджрд╛рд╣рд░рдгреЗ рдЦрд╛рд▓реАрд▓ рдЖрд╣реЗрдд.

рдкреНрд░рдердо, рдХреЙрд▓ рдХрд╕реЗ рдХрд╛рд░реНрдп рдХрд░рддрд╛рдд рддреЗ рдкрд╛рд╣реВ рдНрдб-рд╣реЛрд╕реНрдЯ ╨╕ рдЬреЛрдбрд╛-рдкрддреНрддрд╛-рд╢реНрд░реЗрдгреА. рд╕рдордЬрд╛ рдХреА рдЖрдкрд▓реНрдпрд╛рд▓рд╛ рд╕рдмрдиреЗрдЯ 192.168.0.0/24 рдЪреЗ рд╕рд░реНрд╡ IP рдкрддреНрддреЗ рддрдпрд╛рд░ рдХрд░рд╛рд╡реЗ рд▓рд╛рдЧрддреАрд▓, рдЬреНрдпрд╛рддреАрд▓ рд╢реЗрд╡рдЯрдЪрд╛ рдСрдХреНрдЯреЗрдЯ 5 рдЖрд╣реЗ, рд╣реЛрд╕реНрдЯ рдкреНрд░рдХрд╛рд░рд╛рдЪреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдореНрд╣рдгреВрди, рдЖрдгрд┐ рдЗрддрд░ рд╕рд░реНрд╡ IP рдкрддреНрддреЗ рдЕреЕрдбреНрд░реЗрд╕ рд░реЗрдВрдЬ рдкреНрд░рдХрд╛рд░рд╛рдЪреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдореНрд╣рдгреВрди рд▓рд┐рд╣рд╛. рдпрд╛ рдкреНрд░рдХрд░рдгрд╛рдд, рд╕рдмрдиреЗрдЯ рдкрддреНрддрд╛ рдЖрдгрд┐ рдкреНрд░рд╕рд╛рд░рдг рдкрддреНрддрд╛ рд╡рдЧрд│рд╛.

рддрд░, рдЦрд╛рд▓реА рдПрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЖрд╣реЗ рдЬреА рдпрд╛ рд╕рдорд╕реНрдпреЗрдЪреЗ рдирд┐рд░рд╛рдХрд░рдг рдХрд░рддреЗ рдЖрдгрд┐ рд╣реЛрд╕реНрдЯ рдкреНрд░рдХрд╛рд░рд╛рдЪреЗ 50 рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдЖрдгрд┐ рдЕреЕрдбреНрд░реЗрд╕ рд░реЗрдВрдЬ рдкреНрд░рдХрд╛рд░рд╛рдЪреЗ 51 рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рддрдпрд╛рд░ рдХрд░рддреЗ. рд╕рдорд╕реНрдпреЗрдЪреЗ рдирд┐рд░рд╛рдХрд░рдг рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, 101 API рдХреЙрд▓ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗрдд (рдЕрдВрддрд┐рдо рдкреНрд░рдХрд╛рд╢рди рдХреЙрд▓ рдореЛрдЬрдд рдирд╛рд╣реА). рддрд╕реЗрдЪ, timeit рдореЙрдбреНрдпреВрд▓ рд╡рд╛рдкрд░реВрди, рдмрджрд▓ рдкреНрд░рдХрд╛рд╢рд┐рдд рд╣реЛрдИрдкрд░реНрдпрдВрдд рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рд▓рд╛рдЧрдгрд╛рд░рд╛ рд╡реЗрд│ рдЖрдореНрд╣реА рдореЛрдЬрддреЛ.

рдНрдб-рд╣реЛрд╕реНрдЯ рдЖрдгрд┐ рдНрдб-рдкрддреНрддрд╛-рд╢реНрд░реЗрдгреА рд╡рд╛рдкрд░реВрди рд╕реНрдХреНрд░рд┐рдкреНрдЯ

import timeit
from cpapi import APIClient, APIClientArgs

start = timeit.default_timer()

first_ip = 1
last_ip = 4

client_args = APIClientArgs(server="192.168.47.240")

with APIClient(client_args) as client: 
     login = client.login_with_api_key('3TsbPJ8ZKjaJGvFyoFqHFA==')
     for ip in range(5,255,5):
         add_host = client.api_call("add-host", {"name" : f"h_192.168.0.{ip}", "ip-address": f'192.168.0.{ip}'})
     while last_ip < 255:
         add_range = client.api_call("add-address-range", {"name": f"r_192.168.0.{first_ip}-{last_ip}", "ip-address-first": f"192.168.0.{first_ip}", "ip-address-last": f"192.168.0.{last_ip}"})
         first_ip+=5
         last_ip+=5
     stop = timeit.default_timer() 
     publish = client.api_call("publish")
     
print(f'Time to execute batch request: {stop - start} seconds')

рдорд╛рдЭреНрдпрд╛ рдкреНрд░рдпреЛрдЧрд╢рд╛рд│реЗрдЪреНрдпрд╛ рд╡рд╛рддрд╛рд╡рд░рдгрд╛рдд, рд╡реНрдпрд╡рд╕реНрдерд╛рдкрди рд╕рд░реНрд╡реНрд╣рд░рд╡рд░реАрд▓ рд▓реЛрдбрд╡рд░ рдЕрд╡рд▓рдВрдмреВрди, рдпрд╛ рд╕реНрдХреНрд░рд┐рдкреНрдЯрд▓рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рд╣реЛрдгреНрдпрд╛рд╕рд╛рдареА 30 рддреЗ 50 рд╕реЗрдХрдВрдж рд▓рд╛рдЧрддрд╛рдд.

рдЖрддрд╛ API рдХреЙрд▓ рд╡рд╛рдкрд░реВрди рд╣реАрдЪ рд╕рдорд╕реНрдпрд╛ рдХрд╢реА рд╕реЛрдбрд╡рд╛рдпрдЪреА рддреЗ рдкрд╛рд╣реВ рдЕреЕрдб-рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕-рдмреЕрдЪ, рд╕рдорд░реНрдерди рдЬреНрдпрд╛рд╕рд╛рдареА API рдЖрд╡реГрддреНрддреА 1.6 рдордзреНрдпреЗ рдЬреЛрдбрд▓реЗ рд╣реЛрддреЗ. рд╣рд╛ рдХреЙрд▓ рддреБрдореНрд╣рд╛рд▓рд╛ рдПрдХрд╛ API рд╡рд┐рдирдВрддреАрд╡рд░ рдПрдХрд╛рдЪ рд╡реЗрд│реА рдЕрдиреЗрдХ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рдЪреА рдкрд░рд╡рд╛рдирдЧреА рджреЗрддреЛ. рд╢рд┐рд╡рд╛рдп, рдпрд╛ рд╡реЗрдЧрд╡реЗрдЧрд│реНрдпрд╛ рдкреНрд░рдХрд╛рд░рдЪреНрдпрд╛ рд╡рд╕реНрддреВ рдЕрд╕реВ рд╢рдХрддрд╛рдд (рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рд╣реЛрд╕реНрдЯ, рд╕рдмрдиреЗрдЯ рдЖрдгрд┐ рдкрддреНрддрд╛ рд╢реНрд░реЗрдгреА). рдЕрд╢рд╛ рдкреНрд░рдХрд╛рд░реЗ, рдЖрдордЪреЗ рдХрд╛рд░реНрдп рдПрдХрд╛ API рдХреЙрд▓рдЪреНрдпрд╛ рдЪреМрдХрдЯреАрдд рд╕реЛрдбрд╡рд▓реЗ рдЬрд╛рдК рд╢рдХрддреЗ.

рдЕреЕрдб-рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕-рдмреЕрдЪ рд╡рд╛рдкрд░реВрди рд╕реНрдХреНрд░рд┐рдкреНрдЯ

import timeit
from cpapi import APIClient, APIClientArgs

start = timeit.default_timer()

client_args = APIClientArgs(server="192.168.47.240")

objects_list_ip = []
objects_list_range = []

for ip in range(5,255,5):
    data = {"name": f'h_192.168.0.{ip}', "ip-address": f'192.168.0.{ip}'}
    objects_list_ip.append(data)
    
first_ip = 1
last_ip = 4


while last_ip < 255:
    data = {"name": f"r_192.168.0.{first_ip}-{last_ip}", "ip-address-first": f"192.168.0.{first_ip}", "ip-address-last": f"192.168.0.{last_ip}"}
    objects_list_range.append(data)
    first_ip+=5
    last_ip+=5

data_for_batch = {
  "objects" : [ {
    "type" : "host",
    "list" : objects_list_ip
}, {
    "type" : "address-range",
    "list" : objects_list_range
  }]
}


with APIClient(client_args) as client: 
     login = client.login_with_api_key('3TsbPJ8ZKjaJGvFyoFqHFA==')
     add_objects_batch = client.api_call("add-objects-batch", data_for_batch)
     stop = timeit.default_timer() 
     publish = client.api_call("publish")
     
print(f'Time to execute batch request: {stop - start} seconds')

рдЖрдгрд┐ рд╣реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдорд╛рдЭреНрдпрд╛ рд▓реЕрдм рд╡рд╛рддрд╛рд╡рд░рдгрд╛рдд рдЪрд╛рд▓рд╡рд╛рдпрд▓рд╛ 3 рддреЗ 7 рд╕реЗрдХрдВрдж рд▓рд╛рдЧрддрд╛рдд, рд╡реНрдпрд╡рд╕реНрдерд╛рдкрди рд╕рд░реНрд╡реНрд╣рд░рд╡рд░реАрд▓ рд▓реЛрдбрд╡рд░ рдЕрд╡рд▓рдВрдмреВрди. рдореНрд╣рдгрдЬреЗрдЪ, рд╕рд░рд╛рд╕рд░реА, 101 API рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕рд╡рд░, рдмреЕрдЪ рдкреНрд░рдХрд╛рд░ рдХреЙрд▓ 10 рдкрдЯ рд╡реЗрдЧрд╛рдиреЗ рдЪрд╛рд▓рддреЛ. рдореЛрдареНрдпрд╛ рд╕рдВрдЦреНрдпреЗрдиреЗ рд╡рд╕реНрддреВрдВрд╡рд░ рдлрд░рдХ рдЕрдзрд┐рдХ рдкреНрд░рднрд╛рд╡реА рд╣реЛрдИрд▓.

рдЖрддрд╛ рд╕реЛрдмрдд рдХрд╕реЗ рдХрд╛рдо рдХрд░рд╛рдпрдЪреЗ рддреЗ рдкрд╛рд╣реВ рд╕реЗрдЯ-рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕-рдмреЕрдЪ. рдпрд╛ API рдХреЙрд▓рдЪрд╛ рд╡рд╛рдкрд░ рдХрд░реВрди, рдЖрдореНрд╣реА рдХреЛрдгрддреЗрд╣реА рдкреЕрд░рд╛рдореАрдЯрд░ рдореЛрдареНрдпрд╛ рдкреНрд░рдорд╛рдгрд╛рдд рдмрджрд▓реВ рд╢рдХрддреЛ. рдЖрдзреАрдЪреНрдпрд╛ рдЙрджрд╛рд╣рд░рдгрд╛рд╡рд░реВрди рдкрддреНрддреНрдпрд╛рдВрдЪрд╛ рдкрд╣рд┐рд▓рд╛ рдЕрд░реНрдзрд╛ рднрд╛рдЧ (.резреирек рд╣реЛрд╕реНрдЯреНрд╕рдкрд░реНрдпрдВрдд рдЖрдгрд┐ рд░реЗрдВрдЬрд╣реА) рдХрд▓рд░ рд╕рд┐рдПрдирд╛ рд╡рд░ рд╕реЗрдЯ рдХрд░реВ рдЖрдгрд┐ рдкрддреНрддреНрдпрд╛рдВрдЪреНрдпрд╛ рджреБрд╕рд▒реНрдпрд╛ рдЕрд░реНрдзреНрдпрд╛ рднрд╛рдЧрд╛рд▓рд╛ рд░рдВрдЧ рдЦрд╛рдХреА рджреЗрдК.

рдорд╛рдЧреАрд▓ рдЙрджрд╛рд╣рд░рдгрд╛рдордзреНрдпреЗ рддрдпрд╛рд░ рдХреЗрд▓реЗрд▓реНрдпрд╛ рд╡рд╕реНрддреВрдВрдЪрд╛ рд░рдВрдЧ рдмрджрд▓рдгреЗ

from cpapi import APIClient, APIClientArgs

client_args = APIClientArgs(server="192.168.47.240")

objects_list_ip_first = []
objects_list_range_first = []
objects_list_ip_second = []
objects_list_range_second = []

for ip in range(5,125,5):
    data = {"name": f'h_192.168.0.{ip}', "color": "sienna"}
    objects_list_ip_first.append(data)
    
for ip in range(125,255,5):
    data = {"name": f'h_192.168.0.{ip}', "color": "khaki"}
    objects_list_ip_second.append(data)
    
first_ip = 1
last_ip = 4
while last_ip < 125:
    data = {"name": f"r_192.168.0.{first_ip}-{last_ip}", "color": "sienna"}
    objects_list_range_first.append(data)
    first_ip+=5
    last_ip+=5
    
while last_ip < 255:
    data = {"name": f"r_192.168.0.{first_ip}-{last_ip}", "color": "khaki"}
    objects_list_range_second.append(data)
    first_ip+=5
    last_ip+=5

data_for_batch_first  = {
  "objects" : [ {
    "type" : "host",
    "list" : objects_list_ip_first
}, {
    "type" : "address-range",
    "list" : objects_list_range_first
  }]
}

data_for_batch_second  = {
  "objects" : [ {
    "type" : "host",
    "list" : objects_list_ip_second
}, {
    "type" : "address-range",
    "list" : objects_list_range_second
  }]
}

with APIClient(client_args) as client: 
     login = client.login_with_api_key('3TsbPJ8ZKjaJGvFyoFqHFA==') 
     set_objects_batch_first = client.api_call("set-objects-batch", data_for_batch_first)
     set_objects_batch_second = client.api_call("set-objects-batch", data_for_batch_second)
     publish = client.api_call("publish")

рддреБрдореНрд╣реА рд╡рд╛рдкрд░реВрди рдПрдХрд╛ API рдХреЙрд▓рдордзреНтАНрдпреЗ рдПрдХрд╛рдзрд┐рдХ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣рдЯрд╡реВ рд╢рдХрддрд╛ рдбрд┐рд▓реАрдЯ-рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕-рдмреЕрдЪ. рдЖрддрд╛ рдХреЛрдбрдЪреЗ рдЙрджрд╛рд╣рд░рдг рдкрд╛рд╣реВ рдЬреЗ рдкреВрд░реНрд╡реА рддрдпрд╛рд░ рдХреЗрд▓реЗрд▓реЗ рд╕рд░реНрд╡ рд╣реЛрд╕реНрдЯ рд╣рдЯрд╡рддреЗ рдЕреЕрдб-рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕-рдмреЕрдЪ.

рдбрд┐рд▓реАрдЯ-рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕-рдмреЕрдЪ рд╡рд╛рдкрд░реВрди рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рд╣рдЯрд╡рдгреЗ

from cpapi import APIClient, APIClientArgs

client_args = APIClientArgs(server="192.168.47.240")

objects_list_ip = []
objects_list_range = []

for ip in range(5,255,5):
    data = {"name": f'h_192.168.0.{ip}'}
    objects_list_ip.append(data)

first_ip = 1
last_ip = 4
while last_ip < 255:
    data = {"name": f"r_192.168.0.{first_ip}-{last_ip}"}
    objects_list_range.append(data)
    first_ip+=5
    last_ip+=5

data_for_batch = {
  "objects" : [ {
    "type" : "host",
    "list" : objects_list_ip
}, {
    "type" : "address-range",
    "list" : objects_list_range
  }]
}

with APIClient(client_args) as client: 
     login = client.login_with_api_key('3TsbPJ8ZKjaJGvFyoFqHFA==')
     delete_objects_batch = client.api_call("delete-objects-batch", data_for_batch)
     publish = client.api_call("publish")

print(delete_objects_batch.data)

рдЪреЗрдХ рдкреЙрдЗрдВрдЯ рд╕реЙрдлреНрдЯрд╡реЗрдЕрд░рдЪреНрдпрд╛ рдирд╡реАрди рд░рд┐рд▓реАрдЭрдордзреНрдпреЗ рджрд┐рд╕рдгрд╛рд░реА рд╕рд░реНрд╡ рдлрдВрдХреНрд╢рдиреНрд╕ рддрд╛рдмрдбрддреЛрдм API рдХреЙрд▓ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛рдд. рдЕрд╢рд╛ рдкреНрд░рдХрд╛рд░реЗ, R80.40 рдордзреНрдпреЗ рд░рд┐рд╡реНрд╣рд░реНрдЯ рдЯреВ рд░рд┐рд╡реНрд╣рд┐рдЬрди рдЖрдгрд┐ рд╕реНрдорд╛рд░реНрдЯ рдЯрд╛рд╕реНрдХ рд╕рд╛рд░рдЦреА тАЬрд╡реИрд╢рд┐рд╖реНрдЯреНрдпреЗтАЭ рджрд┐рд╕реВ рд▓рд╛рдЧрд▓реА рдЖрдгрд┐ рддреНрдпрд╛рдВрдЪреНрдпрд╛рд╕рд╛рдареА рд╕рдВрдмрдВрдзрд┐рдд API рдХреЙрд▓ рддреНрд╡рд░рд┐рдд рддрдпрд╛рд░ рдХреЗрд▓реЗ рдЧреЗрд▓реЗ. рд╢рд┐рд╡рд╛рдп, рд▓реЗрдЧрд╕реА рдХрдиреНрд╕реЛрд▓рд╡рд░реВрди рдпреБрдирд┐рдлрд╛рдЗрдб рдкреЙрд▓рд┐рд╕реА рдореЛрдбрдордзреНрдпреЗ рдЬрд╛рддрд╛рдирд╛ рд╕рд░реНрд╡ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рджреЗрдЦреАрд▓ API рд╕рдорд░реНрдерди рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ. рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рд╕реЙрдлреНрдЯрд╡реЗрдЕрд░ рдЖрд╡реГрддреНрддреА R80.40 рдордзреАрд▓ рджреАрд░реНрдШ-рдкреНрд░рддреАрдХреНрд╖рд┐рдд рдЕрдкрдбреЗрдЯ рдореНрд╣рдгрдЬреЗ HTTPS рддрдкрд╛рд╕рдгреА рдзреЛрд░рдгрд╛рдЪреА рд▓реЗрдЧрд╕реА рдореЛрдбрдордзреВрди рдпреБрдирд┐рдлрд╛рдЗрдб рдкреЙрд▓рд┐рд╕реА рдореЛрдбрдордзреНрдпреЗ рд╣рд▓рд╡рдгреЗ рдЖрдгрд┐ рдпрд╛ рдХрд╛рд░реНрдпрдХреНрд╖рдорддреЗрд▓рд╛ рддреНрд╡рд░рд┐рдд API рдХреЙрд▓ рдкреНрд░рд╛рдкреНрдд рдЭрд╛рд▓реЗ. рд╣реЗ рдХреЛрдбрдЪреЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдЖрд╣реЗ рдЬреЗ HTTPS рддрдкрд╛рд╕рдгреА рдзреЛрд░рдгрд╛рдЪреНрдпрд╛ рд╢реАрд░реНрд╖ рд╕реНрдерд╛рдирд╛рд╡рд░ рдПрдХ рдирд┐рдпрдо рдЬреЛрдбрддреЗ рдЬреЗ рддрдкрд╛рд╕рдгреАрдордзреВрди 3 рд╢реНрд░реЗрдгреА рд╡рдЧрд│рддреЗ (рдЖрд░реЛрдЧреНрдп, рд╡рд┐рддреНрдд, рд╕рд░рдХрд╛рд░реА рд╕реЗрд╡рд╛), рдЬреНрдпрд╛рдВрдирд╛ рдЕрдиреЗрдХ рджреЗрд╢рд╛рдВрдордзреАрд▓ рдХрд╛рдпрджреНрдпрд╛рдиреБрд╕рд╛рд░ рддрдкрд╛рд╕рдгреА рдХрд░рдгреНрдпрд╛рд╕ рдордирд╛рдИ рдЖрд╣реЗ.

HTTPS рддрдкрд╛рд╕рдгреА рдзреЛрд░рдгрд╛рдордзреНрдпреЗ рдирд┐рдпрдо рдЬреЛрдбрд╛

from cpapi import APIClient, APIClientArgs

client_args = APIClientArgs(server="192.168.47.240")

data = {
  "layer" : "Default Layer",
  "position" : "top",
  "name" : "Legal Requirements",
  "action": "bypass",
  "site-category": ["Health", "Government / Military", "Financial Services"]
}

with APIClient(client_args) as client: 
     login = client.login_with_api_key('3TsbPJ8ZKjaJGvFyoFqHFA==')
     add_https_rule = client.api_call("add-https-rule", data)
     publish = client.api_call("publish")

рдЪреЗрдХ рдкреЙрдЗрдВрдЯ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрди рд╕рд░реНрд╡реНрд╣рд░рд╡рд░ рдкрд╛рдпрдерди рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд╛рд▓рд╡рдгреЗ

рд╕рд░реНрд╡ рдХрд╛рд╣реА рддрд╕реЗрдЪ рдЖрд╣реЗ README.md рдирд┐рдпрдВрддреНрд░рдг рд╕рд░реНрд╡реНрд╣рд░рд╡рд░реВрди рдкрд╛рдпрдерди рд╕реНрдХреНрд░рд┐рдкреНрдЯреНрд╕ рдХрд╕реЗ рдЪрд╛рд▓рд╡рд╛рдпрдЪреЗ рдпрд╛рдмрджреНрджрд▓ рдорд╛рд╣рд┐рддреА рд╕рдорд╛рд╡рд┐рд╖реНрдЯреАрдд рдЖрд╣реЗ. рдЬреЗрд╡реНрд╣рд╛ рддреБрдореНрд╣реА рджреБрд╕рд░реНтАНрдпрд╛ рдорд╢реАрдирд╡рд░реВрди API рд╕рд░реНрд╡реНрд╣рд░рд╢реА рдХрдиреЗрдХреНрдЯ рдХрд░реВ рд╢рдХрдд рдирд╕рд╛рд▓ рддреЗрд╡реНрд╣рд╛ рд╣реЗ рд╕реЛрдпреАрдЪреЗ рдЕрд╕реВ рд╢рдХрддреЗ. рдореА рд╕рд╣рд╛ рдорд┐рдирд┐рдЯрд╛рдВрдЪрд╛ рд╡реНрд╣рд┐рдбрд┐рдУ рд░реЗрдХреЙрд░реНрдб рдХреЗрд▓рд╛ рдЖрд╣реЗ рдЬреНрдпрд╛рдордзреНрдпреЗ рдореА рдореЙрдбреНрдпреВрд▓ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддрд╛рдирд╛ рдкрд╛рд╣рддреЛ cpapi рдЖрдгрд┐ рдХрдВрдЯреНрд░реЛрд▓ рд╕рд░реНрд╡реНрд╣рд░рд╡рд░ рдкрд╛рдпрдерди рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд╛рд▓рд╡рдгреНрдпрд╛рдЪреА рд╡реИрд╢рд┐рд╖реНрдЯреНрдпреЗ. рдЙрджрд╛рд╣рд░рдг рдореНрд╣рдгреВрди, рдПрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд╛рд▓рд╡рд▓реА рдЬрд╛рддреЗ рдЬреА рдиреЗрдЯрд╡рд░реНрдХ рдСрдбрд┐рдЯрд┐рдВрдЧрд╕рд╛рд░рдЦреНрдпрд╛ рдХрд╛рд░реНрдпрд╛рд╕рд╛рдареА рдирд╡реАрди рдЧреЗрдЯрд╡реЗрдЪреЗ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рд╕реНрд╡рдпрдВрдЪрд▓рд┐рдд рдХрд░рддреЗ рд╕реБрд░рдХреНрд╖рд╛ рддрдкрд╛рд╕рдгреА. рдорд▓рд╛ рдЬреНрдпрд╛ рд╡реИрд╢рд┐рд╖реНрдЯреНрдпрд╛рдВрдЪрд╛ рд╕рд╛рдордирд╛ рдХрд░рд╛рд╡рд╛ рд▓рд╛рдЧрд▓рд╛ рддреНрдпрд╛рдкреИрдХреА: рдлрдВрдХреНрд╢рди рдЕрджреНрдпрд╛рдк рдкрд╛рдпрдерди 2.7 рдордзреНрдпреЗ рджрд┐рд╕рд▓реЗ рдирд╛рд╣реА рдЗрдирдкреБрдЯ, рдореНрд╣рдгреВрди рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рдиреЗ рдкреНрд░рд╡рд┐рд╖реНрдЯ рдХреЗрд▓реЗрд▓реНрдпрд╛ рдорд╛рд╣рд┐рддреАрд╡рд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рдлрдВрдХреНрд╢рди рд╡рд╛рдкрд░рд▓реЗ рдЬрд╛рддреЗ raw_input. рдЕрдиреНрдпрдерд╛, рдХреЛрдб рдЗрддрд░ рдорд╢реАрдирдордзреВрди рд▓реЙрдиреНрдЪ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рд╕рдорд╛рди рдЖрд╣реЗ, рдлрдХреНрдд рддреЗ рдлрдВрдХреНрд╢рди рд╡рд╛рдкрд░рдгреЗ рдЕрдзрд┐рдХ рд╕реЛрдпреАрдЪреЗ рдЖрд╣реЗ login_as_root, рдЬреЗрдгреЗрдХрд░реВрди рддреБрдордЪреЗ рд╕реНрд╡рддрдГрдЪреЗ рд╡рд╛рдкрд░рдХрд░реНрддрд╛рдирд╛рд╡, рдкрд╛рд╕рд╡рд░реНрдб рдЖрдгрд┐ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрди рд╕рд░реНрд╡реНрд╣рд░рдЪрд╛ IP рдкрддреНрддрд╛ рдкреБрдиреНрд╣рд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реВ рдирдпреЗ.

рд╕рд┐рдХреНрдпреБрд░рд┐рдЯреА рдЪреЗрдХрдЕрдкрдЪреНрдпрд╛ рджреНрд░реБрдд рд╕реЗрдЯрдЕрдкрд╕рд╛рдареА рд╕реНрдХреНрд░рд┐рдкреНрдЯ

from __future__ import print_function
import getpass
import sys, os
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
from cpapi import APIClient, APIClientArgs

def main():
    with APIClient() as client:
       # if client.check_fingerprint() is False:
       #     print("Could not get the server's fingerprint - Check connectivity with the server.")
       #     exit(1)
        login_res = client.login_as_root()

        if login_res.success is False:
            print("Login failed:n{}".format(login_res.error_message))
            exit(1)

        gw_name = raw_input("Enter the gateway name:")
        gw_ip = raw_input("Enter the gateway IP address:")
        if sys.stdin.isatty():
            sic = getpass.getpass("Enter one-time password for the gateway(SIC): ")
        else:
            print("Attention! Your password will be shown on the screen!")
            sic = raw_input("Enter one-time password for the gateway(SIC): ")
        version = raw_input("Enter the gateway version(like RXX.YY):")
        add_gw = client.api_call("add-simple-gateway", {'name' : gw_name, 'ipv4-address' : gw_ip, 'one-time-password' : sic, 'version': version.capitalize(), 'application-control' : 'true', 'url-filtering' : 'true', 'ips' : 'true', 'anti-bot' : 'true', 'anti-virus' : 'true', 'threat-emulation' : 'true'})
        if add_gw.success and add_gw.data['sic-state'] != "communicating":
            print("Secure connection with the gateway hasn't established!")
            exit(1)
        elif add_gw.success:
            print("The gateway was added successfully.")
            gw_uid = add_gw.data['uid']
            gw_name = add_gw.data['name']
        else:
            print("Failed to add the gateway - {}".format(add_gw.error_message))
            exit(1)

        change_policy = client.api_call("set-access-layer", {"name" : "Network", "applications-and-url-filtering": "true", "content-awareness": "true"})
        if change_policy.success:
            print("The policy has been changed successfully")
        else:
            print("Failed to change the policy- {}".format(change_policy.error_message))
        change_rule = client.api_call("set-access-rule", {"name" : "Cleanup rule", "layer" : "Network", "action": "Accept", "track": {"type": "Detailed Log", "accounting": "true"}})
        if change_rule.success:
            print("The cleanup rule has been changed successfully")
        else:
            print("Failed to change the cleanup rule- {}".format(change_rule.error_message))

        # publish the result
        publish_res = client.api_call("publish", {})
        if publish_res.success:
            print("The changes were published successfully.")
        else:
                print("Failed to publish the changes - {}".format(install_tp_policy.error_message))

        install_access_policy = client.api_call("install-policy", {"policy-package" : "Standard", "access" : 'true',  "threat-prevention" : 'false', "targets" : gw_uid})
        if install_access_policy.success:
            print("The access policy has been installed")
        else:
                print("Failed to install access policy - {}".format(install_tp_policy.error_message))

        install_tp_policy = client.api_call("install-policy", {"policy-package" : "Standard", "access" : 'false',  "threat-prevention" : 'true', "targets" : gw_uid})
        if install_tp_policy.success:
            print("The threat prevention policy has been installed")
        else:
            print("Failed to install threat prevention policy - {}".format(install_tp_policy.error_message))
        
        # add passwords and passphrases to dictionary
        with open('additional_pass.conf') as f:
            line_num = 0
            for line in f:
                line_num += 1
                add_password_dictionary = client.api_call("run-script", {"script-name" : "Add passwords and passphrases", "script" : "printf "{}" >> $FWDIR/conf/additional_pass.conf".format(line), "targets" : gw_name})
                if add_password_dictionary.success:
                    print("The password dictionary line {} was added successfully".format(line_num))
                else:
                    print("Failed to add the dictionary - {}".format(add_password_dictionary.error_message))

main()

рдЕрддрд┐рд░рд┐рдХреНрдд_pass.conf рд╢рдмреНрджрдХреЛрд╖рд╛рд╕рд╣ рдЙрджрд╛рд╣рд░рдг рдлрд╛рдЗрд▓
{
"passwords" : ["malware","malicious","infected","Infected"],
"phrases" : ["password","Password","Pass","pass","codigo","key","pwd","╨┐╨░╤А╨╛╨╗╤М","╨Я╨░╤А╨╛╨╗╤М","╨Ъ╨╗╤О╤З","╨║╨╗╤О╤З","╤И╨╕╤Д╤А","╨и╨╕╤Д╤А"] }

рдирд┐рд╖реНрдХрд░реНрд╖

рд╣рд╛ рд▓реЗрдЦ рдХрд╛рдорд╛рдЪреНрдпрд╛ рдХреЗрд╡рд│ рдореВрд▓рднреВрдд рд╢рдХреНрдпрддрд╛рдВрдЪрд╛ рдЕрднреНрдпрд╛рд╕ рдХрд░рддреЛ рдкрд╛рдпрдерди рдПрд╕рдбреАрдХреЗ рдЖрдгрд┐ рдореЙрдбреНрдпреВрд▓ cpapi(рддреБрдореНрд╣реА рдЕрдВрджрд╛рдЬ рд▓рд╛рд╡рд▓рд╛ рдЕрд╕реЗрд▓, рд╣реЗ рдкреНрд░рддреНрдпрдХреНрд╖рд╛рдд рд╕рдорд╛рдирд╛рд░реНрдереА рд╢рдмреНрдж рдЖрд╣реЗрдд), рдЖрдгрд┐ рдпрд╛ рдореЙрдбреНрдпреВрд▓рдордзреАрд▓ рдХреЛрдбрдЪрд╛ рдЕрднреНрдпрд╛рд╕ рдХрд░реВрди рддреБрдореНрд╣рд╛рд▓рд╛ рддреНрдпрд╛рд╕реЛрдмрдд рдХрд╛рдо рдХрд░рдгреНрдпрд╛рдЪреНрдпрд╛ рдЖрдгрдЦреА рд╕рдВрдзреА рд╕рд╛рдкрдбрддреАрд▓. рд╣реЗ рд╢рдХреНрдп рдЖрд╣реЗ рдХреА рддреБрдореНрд╣рд╛рд▓рд╛ рддреЗ рддреБрдордЪреНрдпрд╛ рд╕реНрд╡рддрдГрдЪреНрдпрд╛ рд╡рд░реНрдЧ, рдХрд╛рд░реНрдпреЗ, рдкрджреНрдзрддреА рдЖрдгрд┐ рдЪрд▓рд╛рдВрд╕рд╣ рдкреВрд░рдХ рдХрд░рд╛рдпрдЪреЗ рдЕрд╕реЗрд▓. рддреБрдореНрд╣реА рддреБрдордЪреЗ рдХрд╛рдо рдиреЗрд╣рдореА рд╢реЗрдЕрд░ рдХрд░реВ рд╢рдХрддрд╛ рдЖрдгрд┐ рд╡рд┐рднрд╛рдЧрд╛рддреАрд▓ рдЪреЗрдХ рдкреЙрдЗрдВрдЯрд╕рд╛рдареА рдЗрддрд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкрд╛рд╣реВ рд╢рдХрддрд╛ рдХреЛрдбрд╣рдм рд╕рдорд╛рдЬрд╛рдд рдЪреЗрдХрдореЗрдЯреНрд╕, рдЬреЗ рдЙрддреНрдкрд╛рджрди рд╡рд┐рдХрд╛рд╕рдХ рдЖрдгрд┐ рд╡рд╛рдкрд░рдХрд░реНрддреЗ рджреЛрдШрд╛рдВрдирд╛ рдПрдХрддреНрд░ рдЖрдгрддреЗ.

рдЖрдирдВрджреА рдХреЛрдбрд┐рдВрдЧ рдЖрдгрд┐ рд╢реЗрд╡рдЯрдкрд░реНрдпрдВрдд рд╡рд╛рдЪрд▓реНрдпрд╛рдмрджреНрджрд▓ рдзрдиреНрдпрд╡рд╛рдж!

рд╕реНрддреНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╛