рдкрд╛рдЗрдерди SDK рдХреЛ рд╕рд╛рде рдЪреЗрдХ рдкреЛрдЗрдиреНрдЯ API рд▓рд╛рдИ рд╕рд░рд▓ рдмрдирд╛рдЙрдБрджреИ

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

рдЪреЗрдХ рдкреЛрдЗрдиреНрдЯ рд╕рдХреНрд░рд┐рдп рд░реВрдкрдорд╛ рдПрдкреАрдЖрдИ рд╡рд┐рдХрд╛рд╕ рдЧрд░реНрджреИрдЫ рд░ рдпрд╕ рд╕рдордпрдорд╛ рдирд┐рдореНрди рдЬрд╛рд░реА рдЧрд░рд┐рдПрдХреЛ рдЫ:

Python SDK рд▓реЗ рд╣рд╛рд▓ рдорд╛рддреНрд░ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрди API рд░ рдЕрдиреНрддрд░рдХреНрд░рд┐рдпрд╛рд▓рд╛рдИ рд╕рдорд░реНрдерди рдЧрд░реНрджрдЫ Gaia APIред рд╣рд╛рдореА рдпрд╕ рдореЛрдбреНрдпреБрд▓рдорд╛ рд╕рдмреИрднрдиреНрджрд╛ рдорд╣рддреНрддреНрд╡рдкреВрд░реНрдг рд╡рд░реНрдЧрд╣рд░реВ, рд╡рд┐рдзрд┐рд╣рд░реВ рд░ рдЪрд░рд╣рд░реВ рд╣реЗрд░реНрдиреЗрдЫреМрдВред

рдкрд╛рдЗрдерди SDK рдХреЛ рд╕рд╛рде рдЪреЗрдХ рдкреЛрдЗрдиреНрдЯ API рд▓рд╛рдИ рд╕рд░рд▓ рдмрдирд╛рдЙрдБрджреИ

рдореЛрдбреНрдпреБрд▓ рд╕реНрдерд╛рдкрдирд╛ рдЧрд░реНрджреИ

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

рд╕реБрд░реБрд╡рд╛рдд

рд╣рд╛рдореАрд▓реЗ cpapi рдореЛрдбреНрдпреБрд▓рдХрд╛ рдХрдореНрдкреЛрдиреЗрдиреНрдЯрд╣рд░реВрд╕рдБрдЧ рдХрд╛рдо рдЧрд░реНрди рд╕рдХреНрд╖рдо рд╣реБрдирдХреЛ рд▓рд╛рдЧрд┐, рд╣рд╛рдореАрд▓реЗ рдореЛрдбреНрдпреБрд▓рдмрд╛рдЯ рдЖрдпрд╛рдд рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫред cpapi рдХрдореНрддрд┐рдорд╛ рджреБрдИ рдЖрд╡рд╢реНрдпрдХ рдХрдХреНрд╖рд╛рд╣рд░реВ:

APIClient ╨╕ APIClientArgs

from cpapi import APIClient, APIClientArgs

╨Ъ╨╗╨░╤Б╤Б APIClientArgs API рд╕рд░реНрднрд░, рд░ рд╡рд░реНрдЧрдорд╛ рдЬрдбрд╛рди рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░рд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рдЬрд┐рдореНрдореЗрд╡рд╛рд░ рдЫ APIClient API рд╕рдБрдЧ рдЕрдиреНрддрд░рдХреНрд░рд┐рдпрд╛рдХреЛ рд▓рд╛рдЧрд┐ рдЬрд┐рдореНрдореЗрд╡рд╛рд░ рдЫред

рдЬрдбрд╛рди рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░рд╣рд░реВ рдирд┐рд░реНрдзрд╛рд░рдг рдЧрд░реНрджреИ

API рдорд╛ рдЬрдбрд╛рди рдЧрд░реНрдирдХрд╛ рд▓рд╛рдЧрд┐ рд╡рд┐рднрд┐рдиреНрди рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░рд╣рд░реВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдЧрд░реНрди, рддрдкрд╛рдИрдВрд▓реЗ рдХрдХреНрд╖рд╛рдХреЛ рдЙрджрд╛рд╣рд░рдг рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫ APIClientArgsред рд╕рд┐рджреНрдзрд╛рдиреНрддрдорд╛, рдпрд╕рдХреЛ рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░рд╣рд░реВ рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдЫрдиреН рд░ рдирд┐рдпрдиреНрддреНрд░рдг рд╕рд░реНрднрд░рдорд╛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд▓рд╛рдЙрдБрджрд╛, рддрд┐рдиреАрд╣рд░реВрд▓рд╛рдИ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫреИрдиред

client_args = APIClientArgs()

рддрд░ рддреЗрд╕реНрд░реЛ-рдкрдХреНрд╖ рд╣реЛрд╕реНрдЯрдорд╛ рдЪрд▓реНрджрд╛, рддрдкрд╛рдИрдВрд▓реЗ рдХрдореНрддрд┐рдорд╛ IP рдареЗрдЧрд╛рдирд╛ рд╡рд╛ API рд╕рд░реНрднрд░рдХреЛ рд╣реЛрд╕реНрдЯ рдирд╛рдо рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫ (рд╡реНрдпрд╡рд╕реНрдерд╛рдкрди рд╕рд░реНрднрд░ рдкрдирд┐ рднрдирд┐рдиреНрдЫ)ред рддрд▓рдХреЛ рдЙрджрд╛рд╣рд░рдгрдорд╛, рд╣рд╛рдореА рд╕рд░реНрднрд░ рдЬрдбрд╛рди рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдЧрд░реНрдЫреМрдВ рд░ рдпрд╕рд▓рд╛рдИ рд╕реНрдЯреНрд░рд┐рдЩрдХреЛ рд░реВрдкрдорд╛ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрди рд╕рд░реНрднрд░рдХреЛ рдЖрдИрдкреА рдареЗрдЧрд╛рдирд╛ рддреЛрдХреНрдЫреМрдВред

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 рдлрд┐рдВрдЧрд░рдкреНрд░рд┐рдиреНрдЯ рдЬрд╛рдБрдЪ рдЧрд░реНрджрд╛, рддреНрд░реБрдЯрд┐ рдкрддреНрддрд╛ рд▓рд╛рдЧреНрдпреЛ (рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдЕрдЬреНрдЮрд╛рдд рдЫ рд╡рд╛ рдкрд░рд┐рд╡рд░реНрддрди рдЧрд░рд┐рдПрдХреЛ рдЫ), рд╡рд┐рдзрд┐ рдЪреЗрдХ_рдлрд┐рдВрдЧрд░рдкреНрд░рд┐рдиреНрдЯ рд╕реНрдерд╛рдиреАрдп рдореЗрд╕рд┐рдирдорд╛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдкрдорд╛ рдпрд╕рдХреЛ рдмрд╛рд░реЗрдорд╛ рдЬрд╛рдирдХрд╛рд░реА рдердкреНрди/рдкрд░рд┐рд╡рд░реНрддрди рдЧрд░реНрдиреЗ рдЕрд╡рд╕рд░ рдкреНрд░рджрд╛рди рдЧрд░реНрдиреЗрдЫред рдпреЛ рдЬрд╛рдБрдЪрд▓рд╛рдИ рдкреВрд░реНрдг рд░реВрдкрдорд╛ рдЕрд╕рдХреНрд╖рдо рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫ (рддрд░ рдпрджрд┐ 127.0.0.1 рдорд╛ рдЬрдбрд╛рди рдЧрд░реНрджрд╛, API рд╕рд░реНрднрд░рдорд╛ рд╕реНрдХреНрд░рд┐рдкреНрдЯрд╣рд░реВ рдЪрд▓рд╛рдЗрдПрдорд╛ рдорд╛рддреНрд░ рдпреЛ рд╕рд┐рдлрд╛рд░рд┐рд╕ рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫ), APIClientArgs рддрд░реНрдХ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ - unsafe_auto_accept (APIClientArgs рдХреЛ рдмрд╛рд░реЗрдорд╛ рдкрд╣рд┐рд▓реЗ "рдкрд░рд┐рднрд╛рд╖рд┐рдд рдЬрдбрд╛рди рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░рд╣рд░реВ" рдорд╛ рд╣реЗрд░реНрдиреБрд╣реЛрд╕реН)ред

client_args = APIClientArgs(unsafe_auto_accept=True)

API рд╕рд░реНрднрд░рдорд╛ рд▓рдЧрдЗрди рдЧрд░реНрдиреБрд╣реЛрд╕реН

╨г APIClient рдПрдкреАрдЖрдИ рд╕рд░реНрднрд░рдорд╛ рд▓рдЧ рдЗрди рдЧрд░реНрдирдХрд╛ рд▓рд╛рдЧрд┐ 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 рд╡рд┐рдзрд┐

рдПрдкреАрдЖрдИ рдХреБрдЮреНрдЬреА рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗ рд╡рд┐рдХрд▓реНрдк (рд╡реНрдпрд╡рд╕реНрдерд╛рдкрди рд╕рдВрд╕реНрдХрд░рдг R80.40/Management API v1.6 рдмрд╛рдЯ рд╕реБрд░реБ рдЧрд░реА рд╕рдорд░реНрдерд┐рдд, "3TsbPJ8ZKjaJGvFyoFqHFA==" рдпреЛ API рдХреБрдЮреНрдЬреА рдкреНрд░рд╛рдзрд┐рдХрд░рдг рд╡рд┐рдзрд┐рдХреЛ рд╕рд╛рде рд╡реНрдпрд╡рд╕реНрдерд╛рдкрди рд╕рд░реНрднрд░рдорд╛ рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рд╣рд░реВ рдордзреНрдпреЗ рдПрдХрдХреЛ рд▓рд╛рдЧрд┐ API рдХреБрдЮреНрдЬреА рдорд╛рди рд╣реЛ):

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

рд╡рд┐рдзрд┐рдорд╛ рд▓рдЧрдЗрди_with_api_key рдЙрд╣реА рд╡реИрдХрд▓реНрдкрд┐рдХ рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░рд╣рд░реВ рд╡рд┐рдзрд┐рдорд╛ рдЙрдкрд▓рдмреНрдз рдЫрдиреН рд▓рдЧ - рдЗрди.

login_as_root рд╡рд┐рдзрд┐

рдПрдкреАрдЖрдИ рд╕рд░реНрднрд░рдХреЛ рд╕рд╛рде рд╕реНрдерд╛рдиреАрдп рдореЗрд╕рд┐рдирдорд╛ рд▓рдЧрдЗрди рдЧрд░реНрдиреЗ рд╡рд┐рдХрд▓реНрдк:

     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 рдЪрд░рд╣рд░реВ рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдЫрдиреН; рд╣рд╛рдореА рдердк рд╡рд┐рд╡рд░рдгрдорд╛ рд╕рдмреИрднрдиреНрджрд╛ рдорд╣рддреНрддреНрд╡рдкреВрд░реНрдгрд╣рд░реВрдорд╛ рдмрд╕реНрдиреЗрдЫреМрдВред

рдкрд╛рдЗрдерди SDK рдХреЛ рд╕рд╛рде рдЪреЗрдХ рдкреЛрдЗрдиреНрдЯ API рд▓рд╛рдИ рд╕рд░рд▓ рдмрдирд╛рдЙрдБрджреИ

рд╕рдлрд▓рддрд╛

рд╕реБрд░реБрдорд╛, рдПрдкреАрдЖрдИ рдХрд▓ рд╕рдлрд▓ рднрдПрдХреЛ рд░ рдирддрд┐рдЬрд╛ рдлрд░реНрдХрд╛рдЗрдпреЛ рднрдиреА рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдЧрд░реНрдиреБ рд░рд╛рдореНрд░реЛ рд╡рд┐рдЪрд╛рд░ рд╣реБрдиреЗрдЫред рдпрд╕рдХрд╛ рд▓рд╛рдЧрд┐ рд╡рд┐рдзрд┐ рдЫ рд╕рдлрд▓рддрд╛:

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

API рдХрд▓ рд╕рдлрд▓ рднрдПрдорд╛ True рдлрд░реНрдХрд╛рдЙрдБрдЫ (рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛрдб - 200) рд░ рдЕрд╕рдлрд▓ рднрдПрдорд╛ False (рдХреБрдиреИ рдЕрдиреНрдп рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛрдб)ред рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛрдбрдХреЛ рдЖрдзрд╛рд░рдорд╛ рдлрд░рдХ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд░реНрд╢рди рдЧрд░реНрди 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

рдпрд╕ рдЕрд╡рд╕реНрдерд╛рдорд╛, рдпреЛ рд╕рдлрд▓рддрд╛ рд╕реНрдерд┐рддрд┐ рдХреЛ рдореВрд▓реНрдп рдкрд░рд┐рд╡рд░реНрддрди рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рд╣реБрди рд╕рдХреНрдЫред рдкреНрд░рд╛рд╡рд┐рдзрд┐рдХ рд░реВрдкрдорд╛, рддрдкрд╛рдЗрдБ рддреНрдпрд╣рд╛рдБ рдХреЗрд╣рд┐ рдкрдирд┐ рд░рд╛рдЦреНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ, рдирд┐рдпрдорд┐рдд рд╕реНрдЯреНрд░рд┐рдЩ рдкрдирд┐ред рддрд░ рдПрдЙрдЯрд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЙрджрд╛рд╣рд░рдгрд▓реЗ рдпреЛ рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░рд▓рд╛рдИ рдХреЗрд╣реА рдирд┐рд╢реНрдЪрд┐рдд рд╕рд░реНрддрд╣рд░реВрдорд╛ False рдорд╛ рд░рд┐рд╕реЗрдЯ рдЧрд░реНрджреИрдЫред рддрд▓, рд╡реНрдпрд╡рд╕реНрдерд╛рдкрди рд╕рд░реНрднрд░рдорд╛ рдХрд╛рд░реНрдпрд╣рд░реВ рдЪрд▓рд┐рд░рд╣реЗрдХреЛ рдмреЗрд▓рд╛ рдЙрджрд╛рд╣рд░рдгрдорд╛ рдзреНрдпрд╛рди рджрд┐рдиреБрд╣реЛрд╕реН, рддрд░ рд╣рд╛рдореА рдпреЛ рдЕрдиреБрд░реЛрдзрд▓рд╛рдИ рдЕрд╕рдлрд▓ рдорд╛рдиреНрдиреЗрдЫреМрдВ (рд╣рд╛рдореА рд╕рдлрд▓рддрд╛ рдЪрд░ рд╕реЗрдЯ рдЧрд░реНрдиреЗрдЫреМрдВред рдЭреВрдЯрд╛, 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']}

рддреНрд░реБрдЯрд┐ рд╕рдиреНрджреЗрд╢

рдПрдкреАрдЖрдИ рдЕрдиреБрд░реЛрдз рдкреНрд░рд╢реЛрдзрди рдЧрд░реНрджрд╛ рддреНрд░реБрдЯрд┐ рджреЗрдЦрд╛ рдкрд░реНрджрд╛ рдорд╛рддреНрд░ рдпреЛ рдЬрд╛рдирдХрд╛рд░реА рдЙрдкрд▓рдмреНрдз рд╣реБрдиреНрдЫ (рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛрдб рдЫреИрди 200)ред рдЙрджрд╛рд╣рд░рдг рдЖрдЙрдЯрдкреБрдЯ

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

рдЙрдкрдпреЛрдЧреА рдЙрджрд╛рд╣рд░рдгрд╣рд░реВ

рд╡реНрдпрд╡рд╕реНрдерд╛рдкрди API 1.6 рдорд╛ рдердкрд┐рдПрдХрд╛ API рдХрд▓рд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗ рдЙрджрд╛рд╣рд░рдгрд╣рд░реВ рдирд┐рдореНрди рдЫрдиреНред

рдкрд╣рд┐рд▓реЗ, рдХрд▓рд╣рд░реВ рдХрд╕рд░реА рдХрд╛рдо рдЧрд░реНрдЫ рднрдиреА рд╣реЗрд░реМрдВ add-host ╨╕ рдердк-рдареЗрдЧрд╛рдирд╛-рджрд╛рдпрд░рд╛ред рдорд╛рдиреМрдВ рд╣рд╛рдореАрд▓реЗ рд╕рдмрдиреЗрдЯ 192.168.0.0/24 рдХреЛ рд╕рдмреИ IP рдареЗрдЧрд╛рдирд╛рд╣рд░реВ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫ, рдЬрд╕рдХреЛ рдЕрдиреНрддрд┐рдо рдЕрдХреНрдЯреЗрдЯ 5 рд╣реЛ, рд╣реЛрд╕реНрдЯ рдкреНрд░рдХрд╛рд░рдХреЛ рд╡рд╕реНрддреБрдХреЛ рд░реВрдкрдорд╛, рд░ рдЕрдиреНрдп рд╕рдмреИ IP рдареЗрдЧрд╛рдирд╛рд╣рд░реВ рдареЗрдЧрд╛рдирд╛ рджрд╛рдпрд░рд╛ рдкреНрд░рдХрд╛рд░рдХреЛ рд╡рд╕реНрддреБрдХреЛ рд░реВрдкрдорд╛ рд▓реЗрдЦреНрдиреБрд╣реЛрд╕реНред рдпрд╕ рдЕрд╡рд╕реНрдерд╛рдорд╛, рд╕рдмрдиреЗрдЯ рдареЗрдЧрд╛рдирд╛ рд░ рдкреНрд░рд╕рд╛рд░рдг рдареЗрдЧрд╛рдирд╛ рдмрд╣рд┐рд╖реНрдХрд╛рд░ рдЧрд░реНрдиреБрд╣реЛрд╕реНред

рддреНрдпрд╕реЛрднрдП, рддрд▓ рдПрдЙрдЯрд╛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЫ рдЬрд╕рд▓реЗ рдпреЛ рд╕рдорд╕реНрдпрд╛ рд╕рдорд╛рдзрд╛рди рдЧрд░реНрджрдЫ рд░ рд╣реЛрд╕реНрдЯ рдкреНрд░рдХрд╛рд░рдХреЛ 50 рд╡рд╕реНрддреБрд╣рд░реВ рд░ рдареЗрдЧрд╛рдирд╛ рджрд╛рдпрд░рд╛ рдкреНрд░рдХрд╛рд░рдХреЛ 51 рд╡рд╕реНрддреБрд╣рд░реВ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрджрдЫред рд╕рдорд╕реНрдпрд╛ рд╕рдорд╛рдзрд╛рди рдЧрд░реНрди, 101 API рдХрд▓рд╣рд░реВ рдЖрд╡рд╢реНрдпрдХ рдЫрдиреН (рдЕрдиреНрддрд┐рдо рдкреНрд░рдХрд╛рд╢рди рдХрд▓ рдЧрдгрдирд╛ рдирдЧрд░реА)ред рд╕рд╛рдереИ, timeit рдореЛрдбреНрдпреБрд▓ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░, рд╣рд╛рдореА рдкрд░рд┐рд╡рд░реНрддрдирд╣рд░реВ рдкреНрд░рдХрд╛рд╢рд┐рдд рдирднрдПрд╕рдореНрдо рд▓рд┐рдкрд┐ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЧрд░реНрди рд▓рд╛рдЧреНрдиреЗ рд╕рдордп рдЧрдгрдирд╛ рдЧрд░реНрдЫреМрдВред

add-host рд░ add-address-range рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рд▓рд┐рдкрд┐

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 рд╕реЗрдХреЗрдиреНрдбрдХреЛ рдмреАрдЪрдорд╛ рд▓рд┐рдиреНрдЫред

рдЕрдм рдПрдкреАрдЖрдИ рдХрд▓ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рд╕рдорд╛рди рд╕рдорд╕реНрдпрд╛ рдХрд╕рд░реА рд╕рдорд╛рдзрд╛рди рдЧрд░реНрдиреЗ рд╣реЗрд░реМрдВ add-objects-batch, рд╕рдорд░реНрдерди рдЬрд╕рдХреЛ рд▓рд╛рдЧрд┐ API рд╕рдВрд╕реНрдХрд░рдг 1.6 рдорд╛ рдердкрд┐рдПрдХреЛ рдерд┐рдпреЛред рдпреЛ рдХрд▓рд▓реЗ рддрдкрд╛рдИрдВрд▓рд╛рдИ рдПрдЙрдЯреИ рдПрдкреАрдЖрдИ рдЕрдиреБрд░реЛрдзрдорд╛ рдзреЗрд░реИ рд╡рд╕реНрддреБрд╣рд░реВ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрди рдЕрдиреБрдорддрд┐ рджрд┐рдиреНрдЫред рдпрд╕рдмрд╛рд╣реЗрдХ, рдпреА рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░рдХрд╛ рд╡рд╕реНрддреБрд╣рд░реВ рд╣реБрди рд╕рдХреНрдЫрдиреН (рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, рд╣реЛрд╕реНрдЯрд╣рд░реВ, рд╕рдмрдиреЗрдЯрд╣рд░реВ рд░ рдареЗрдЧрд╛рдирд╛ рджрд╛рдпрд░рд╛рд╣рд░реВ)ред рдпрд╕реИрд▓реЗ, рд╣рд╛рдореНрд░реЛ рдХрд╛рд░реНрдп рдПрдХ API рдХрд▓ рдХреЛ рд░реВрдкрд░реЗрдЦрд╛ рднрд┐рддреНрд░ рд╕рдорд╛рдзрд╛рди рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫред

add-objects-batch рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рд▓рд┐рдкрд┐

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 рд╕реЗрдХреЗрдиреНрдб рд▓рд╛рдЧреНрдЫ, рд╡реНрдпрд╡рд╕реНрдерд╛рдкрди рд╕рд░реНрднрд░рдорд╛ рд▓реЛрдбрдорд╛ рдирд┐рд░реНрднрд░ рдЧрд░реНрджрдЫред рдЕрд░реНрдерд╛рддреН, рдФрд╕рддрдорд╛, резрежрез API рд╡рд╕реНрддреБрд╣рд░реВрдорд╛, рдмреНрдпрд╛рдЪ рдкреНрд░рдХрд╛рд░рдХреЛ рдХрд▓ резреж рдЧреБрдгрд╛ рдЫрд┐рдЯреЛ рдЪрд▓реНрдЫред рд╡рд╕реНрддреБрд╣рд░реВрдХреЛ рдареВрд▓реЛ рд╕рдВрдЦреНрдпрд╛рдорд╛ рднрд┐рдиреНрдирддрд╛ рдЕрдЭ рдкреНрд░рднрд╛рд╡рд╢рд╛рд▓реА рд╣реБрдиреЗрдЫред

рдЕрдм рдХрд╕рд░реА рдХрд╛рдо рдЧрд░реНрдиреЗ рднрдиреЗрд░ рд╣реЗрд░реМрдВ рд╕реЗрдЯ-рд╡рд╕реНрддреБрд╣рд░реВ-рдмреИрдЪред рдпреЛ API рдХрд▓ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░, рд╣рд╛рдореА рдХреБрдиреИ рдкрдирд┐ рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░ рдмрд▓реНрдХ рдкрд░рд┐рд╡рд░реНрддрди рдЧрд░реНрди рд╕рдХреНрдЫреМрдВред рдЕрдШрд┐рд▓реНрд▓реЛ рдЙрджрд╛рд╣рд░рдгрдмрд╛рдЯ рдареЗрдЧрд╛рдирд╛рд╣рд░реВрдХреЛ рдкрд╣рд┐рд▓реЛ рдЖрдзрд╛ рд╕реЗрдЯ рдЧрд░реМрдВ (124 рд╣реЛрд╕реНрдЯрд╣рд░реВ, рд░ рджрд╛рдпрд░рд╛рд╣рд░реВ рдкрдирд┐) рд░рдЩ рд╕рд┐рдПрдирд╛рдорд╛, рд░ рд░рдЩ рдЦрд╛рдХреАрд▓рд╛рдИ рдареЗрдЧрд╛рдирд╛рд╣рд░реВрдХреЛ рджреЛрд╕реНрд░реЛ рднрд╛рдЧрдорд╛ рдЕрд╕рд╛рдЗрди рдЧрд░реМрдВред

рдЕрдШрд┐рд▓реНрд▓реЛ рдЙрджрд╛рд╣рд░рдгрдорд╛ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░рд┐рдПрдХрд╛ рд╡рд╕реНрддреБрд╣рд░реВрдХреЛ рд░рдВрдЧ рдкрд░рд┐рд╡рд░реНрддрди рдЧрд░реНрджреИ

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 рдХрд▓ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдзреЗрд░реИ рд╡рд╕реНрддреБрд╣рд░реВ рдореЗрдЯрд╛рдЙрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ рдореЗрдЯрд╛рдЙрдиреЗ-рд╡рд╕реНрддреБрд╣рд░реВ-рдмреИрдЪред рдЕрдм рдПрдХ рдХреЛрдб рдЙрджрд╛рд╣рд░рдг рд╣реЗрд░реМрдВ рдЬрд╕рд▓реЗ рдкрд╣рд┐рд▓реЗ рдорд╛рд░реНрдлрдд рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░рд┐рдПрдХрд╛ рд╕рдмреИ рд╣реЛрд╕реНрдЯрд╣рд░реВ рдореЗрдЯрд╛рдЙрдБрдЫ add-objects-batch.

Delete-objects-batch рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рд╡рд╕реНрддреБрд╣рд░реВ рдореЗрдЯрд╛рдЙрдБрджреИ

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(рддрдкрд╛рдИрдВрд▓реЗ рдЕрдиреБрдорд╛рди рдЧрд░реНрдиреБрднрдПрдХреЛ рд╣реБрди рд╕рдХреНрдЫ, рдпреА рд╡рд╛рд╕реНрддрд╡рдорд╛ рд╕рдорд╛рдирд╛рд░реНрдереА рд╢рдмреНрджрд╣рд░реВ рд╣реБрдиреН), рд░ рдпрд╕ рдореЛрдбреНрдпреБрд▓рдорд╛ рдХреЛрдб рдЕрдзреНрдпрдпрди рдЧрд░реЗрд░ рддрдкрд╛рдИрдВрд▓реЗ рдпрд╕рдорд╛ рдХрд╛рдо рдЧрд░реНрдиреЗ рдердк рдЕрд╡рд╕рд░рд╣рд░реВ рдкрддреНрддрд╛ рд▓рдЧрд╛рдЙрдиреБрд╣реБрдиреЗрдЫред рдпреЛ рд╕рдореНрднрд╡ рдЫ рдХрд┐ рддрдкрд╛рдЗрдБ рдпрд╕рд▓рд╛рдИ рддрдкрд╛рдЗрдБрдХреЛ рдЖрдлреНрдиреИ рдХрдХреНрд╖рд╛рд╣рд░реБ, рдкреНрд░рдХрд╛рд░реНрдпрд╣рд░реБ, рд╡рд┐рдзрд┐рд╣рд░реБ рд░ рдЪрд░рд╣рд░реБ рд╕рдВрдЧ рдкреВрд░рдХ рдЧрд░реНрди рдЪрд╛рд╣рд╛рдиреБрд╣реБрдиреНрдЫред рддрдкрд╛рдИрд▓реЗ рд╕рдзреИрдВ рдЖрдлреНрдиреЛ рдХрд╛рдо рд╕рд╛рдЭрд╛ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ рд░ рд╕реЗрдХреНрд╕рдирдорд╛ рдЪреЗрдХ рдкреЛрдЗрдиреНрдЯрдХреЛ рд▓рд╛рдЧрд┐ рдЕрдиреНрдп рд╕реНрдХреНрд░рд┐рдкреНрдЯрд╣рд░реВ рд╣реЗрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ CodeHub рд╕рдореБрджрд╛рдпрдорд╛ рдЪреЗрдХрдореЗрдЯреНрд╕, рдЬрд╕рд▓реЗ рдЙрддреНрдкрд╛рджрди рд╡рд┐рдХрд╛рд╕рдХрд░реНрддрд╛ рд░ рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛ рджреБрд╡реИрд▓рд╛рдИ рд╕рдБрдЧреИ рд▓реНрдпрд╛рдЙрдБрдЫред

рдЦреБрд╢реА рдХреЛрдбрд┐рдЩ рд░ рдЕрдиреНрдд рд╕рдореНрдо рдкрдвреНрди рдХреЛ рд▓рд╛рдЧреА рдзрдиреНрдпрд╡рд╛рдж!

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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдердкреНрди