рдкрд╛рдпрдерди рдПрд╕рдбреАрдХреЗ рдХреЗ рд╕рд╛рде рдЪреЗрдХ рдкреНрд╡рд╛рдЗрдВрдЯ рдПрдкреАрдЖрдИ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдирд╛

рдкрд╛рдпрдерди рдПрд╕рдбреАрдХреЗ рдХреЗ рд╕рд╛рде рдЪреЗрдХ рдкреНрд╡рд╛рдЗрдВрдЯ рдПрдкреАрдЖрдИ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдирд╛рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛрдб рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдкрд░ рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде рдЗрдВрдЯрд░реИрдХреНрд╢рди рдХреА рдкреВрд░реА рд╢рдХреНрддрд┐ рдХрд╛ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ, рдЬрдм рдПрдкреАрдЖрдИ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдУрдВ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдкреАрдЖрдИ рдЕрдиреБрд░реЛрдзреЛрдВ рдФрд░ рдЙрдкрдХрд░рдгреЛрдВ рдХреЛ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдЙрддреНрдкрдиреНрди рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрд╣ рдЕрднреА рднреА рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рдирд╣реАрдВ рд╣реИ рдкрд╛рдпрдерди рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдбреЗрд╡рд▓рдкрдореЗрдВрдЯ рдХрд┐рдЯ (рдЗрд╕рдХреЗ рдмрд╛рдж рдЗрд╕реЗ рдкрд╛рдпрдерди рдПрд╕рдбреАрдХреЗ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрджрд░реНрднрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛)ред рдЪреЗрдХ рдкреНрд╡рд╛рдЗрдВрдЯ рдкреНрд░рдмрдВрдзрди рдПрдкреАрдЖрдИ, рдкрд░рдиреНрддреБ рд╕рдлрд▓рддрд╛ рдирд╣реАрдВ рдорд┐рд▓реАред рдпрд╣ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдФрд░ рд╕реНрд╡рдЪрд╛рд▓рди рдЙрддреНрд╕рд╛рд╣реА рд▓реЛрдЧреЛрдВ рдХреЗ рдЬреАрд╡рди рдХреЛ рдХрд╛рдлреА рд╕рд░рд▓ рдмрдирд╛рддрд╛ рд╣реИред рдкрд╛рдпрдерди рдиреЗ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдХрд╛рдлреА рд▓реЛрдХрдкреНрд░рд┐рдпрддрд╛ рд╣рд╛рд╕рд┐рд▓ рдХреА рд╣реИ рдФрд░ рдореИрдВрдиреЗ рдЗрд╕ рдЕрдВрддрд░ рдХреЛ рднрд░рдиреЗ рдФрд░ рдореБрдЦреНрдп рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреА рд╕рдореАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рд╣реИред рдЪреЗрдХ рдкреНрд╡рд╛рдЗрдВрдЯ рдПрдкреАрдЖрдИ рдкрд╛рдпрдерди рдбреЗрд╡рд▓рдкрдореЗрдВрдЯ рдХрд┐рдЯ. рдпрд╣ рд▓реЗрдЦ рд╣реИрдмреНрд░реЗ рдкрд░ рдПрдХ рдЕрдиреНрдп рд▓реЗрдЦ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрддреНрдХреГрд╖реНрдЯ рдЕрддрд┐рд░рд┐рдХреНрдд рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ рдкреНрд╡рд╛рдЗрдВрдЯ R80.10 рдПрдкреАрдЖрдИ рдЬрд╛рдВрдЪреЗрдВред рд╕реАрдПрд▓рдЖрдИ, рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдФрд░ рдмрд╣реБрдд рдХреБрдЫ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░рдмрдВрдзрди. рд╣рдо рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдкрд╛рдпрдерди рдПрд╕рдбреАрдХреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреИрд╕реЗ рд▓рд┐рдЦреЗрдВ рдФрд░ рд╕рдВрд╕реНрдХрд░рдг 1.6 (рдЖрд░80.40 рд╕реЗ рд╕рдорд░реНрдерд┐рдд) рдореЗрдВ рдирдИ рдкреНрд░рдмрдВрдзрди рдПрдкреАрдЖрдИ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдкрд░ рдХрд░реАрдм рд╕реЗ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВред рд▓реЗрдЦ рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдПрдкреАрдЖрдИ рдФрд░ рдкрд╛рдпрдерди рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдмреБрдирд┐рдпрд╛рджреА рдЬреНрдЮрд╛рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред

рдЪреЗрдХ рдкреНрд╡рд╛рдЗрдВрдЯ рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рдПрдкреАрдЖрдИ рд╡рд┐рдХрд╕рд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реИ рдФрд░ рдлрд┐рд▓рд╣рд╛рд▓ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЬрд╛рд░реА рдХрд┐рдП рдЧрдП рд╣реИрдВ:

рдкрд╛рдпрдерди рдПрд╕рдбреАрдХреЗ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдХреЗрд╡рд▓ рдкреНрд░рдмрдВрдзрди рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде рдЗрдВрдЯрд░реИрдХреНрд╢рди рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ рдЧреИрдпрд╛ рдПрдкреАрдЖрдИ. рд╣рдо рдЗрд╕ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╡рд░реНрдЧреЛрдВ, рд╡рд┐рдзрд┐рдпреЛрдВ рдФрд░ рдЪрд░реЛрдВ рдХреЛ рджреЗрдЦреЗрдВрдЧреЗред

рдкрд╛рдпрдерди рдПрд╕рдбреАрдХреЗ рдХреЗ рд╕рд╛рде рдЪреЗрдХ рдкреНрд╡рд╛рдЗрдВрдЯ рдПрдкреАрдЖрдИ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдирд╛

рдореЙрдбреНрдпреВрд▓ рд╕реНрдерд╛рдкрдирд╛

рдореЙрдбреНрдпреВрд▓ cpapi рд╕реЗ рдЬрд▓реНрджреА рдФрд░ рдЖрд╕рд╛рдиреА рд╕реЗ рдЗрдВрд╕реНрдЯреЙрд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдЬреАрдердм рдкрд░ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдЪреЗрдХ рдкреНрд╡рд╛рдЗрдВрдЯ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд░рдВрдЬ. рд╡рд┐рд╕реНрддреГрдд рд╕реНрдерд╛рдкрдирд╛ рдирд┐рд░реНрджреЗрд╢ рдпрд╣рд╛рдВ рдЙрдкрд▓рдмреНрдз рд╣реИрдВ README.md. рдпрд╣ рдореЙрдбреНрдпреВрд▓ рдкрд╛рдпрдерди рд╕рдВрд╕реНрдХрд░рдг 2.7 рдФрд░ 3.7 рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рд┐рдд рд╣реИред рдЗрд╕ рдЖрд▓реЗрдЦ рдореЗрдВ, Python 3.7 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрджрд╛рд╣рд░рдг рджрд┐рдП рдЬрд╛рдПрдВрдЧреЗред рд╣рд╛рд▓рд╛рдБрдХрд┐, Python SDK рдХреЛ рд╕реАрдзреЗ рдЪреЗрдХ рдкреНрд╡рд╛рдЗрдВрдЯ рдореИрдиреЗрдЬрдореЗрдВрдЯ рд╕рд░реНрд╡рд░ (рд╕реНрдорд╛рд░реНрдЯ рдореИрдиреЗрдЬрдореЗрдВрдЯ) рд╕реЗ рдЪрд▓рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡реЗ рдХреЗрд╡рд▓ Python 2.7 рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЕрдВрддрд┐рдо рдЕрдиреБрднрд╛рдЧ рд╕рдВрд╕реНрдХрд░рдг 2.7 рдХреЗ рд▓рд┐рдП рдХреЛрдб рдкреНрд░рджрд╛рди рдХрд░реЗрдЧрд╛ред рдореЙрдбреНрдпреВрд▓ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж, рдореИрдВ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдУрдВ рдореЗрдВ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦрдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ рдЙрджрд╛рд╣рд░рдг_рдкрд╛рдпрдерди2 ╨╕ рдЙрджрд╛рд╣рд░рдг_рдкрд╛рдпрдерди3.

рдкреНрд░рд╛рд░рдВрдн рдХрд░рдирд╛

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

рдПрдкреАрдЖрдИрдХреНрд▓рд╛рдЗрдВрдЯ ╨╕ APIClientArgs

from cpapi import APIClient, APIClientArgs

рд╡рд░реНрдЧ APIClientArgs рдПрдкреАрдЖрдИ рд╕рд░реНрд╡рд░ рдФрд░ рдХреНрд▓рд╛рд╕ рд╕реЗ рдХрдиреЗрдХреНрд╢рди рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИ рдПрдкреАрдЖрдИрдХреНрд▓рд╛рдЗрдВрдЯ рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде рдЗрдВрдЯрд░реЗрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИред

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

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

client_args = APIClientArgs()

рд▓реЗрдХрд┐рди рддреГрддреАрдп-рдкрдХреНрд╖ рд╣реЛрд╕реНрдЯ рдкрд░ рдЪрд▓рддреЗ рд╕рдордп, рдЖрдкрдХреЛ рдПрдкреАрдЖрдИ рд╕рд░реНрд╡рд░ (рдЬрд┐рд╕реЗ рдкреНрд░рдмрдВрдзрди рд╕рд░реНрд╡рд░ рднреА рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ) рдХрд╛ рдХрдо рд╕реЗ рдХрдо рдЖрдИрдкреА рдкрддрд╛ рдпрд╛ рд╣реЛрд╕реНрдЯ рдирд╛рдо рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдо рд╕рд░реНрд╡рд░ рдХрдиреЗрдХреНрд╢рди рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рдмрдВрдзрди рд╕рд░реНрд╡рд░ рдХрд╛ рдЖрдИрдкреА рдкрддрд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВред

client_args = APIClientArgs(server='192.168.47.241')

рдЖрдЗрдП рдЙрди рд╕рднреА рдорд╛рдкрджрдВрдбреЛрдВ рдФрд░ рдЙрдирдХреЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рдиреЛрдВ рдХреЛ рджреЗрдЦреЗрдВ рдЬрд┐рдирдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдкреАрдЖрдИ рд╕рд░реНрд╡рд░ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рддреЗ рд╕рдордп рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

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 рд╡рд░реНрдЧ рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рдЬрд┐рди рддрд░реНрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд╡реЗ рдЪреЗрдХ рдкреНрд╡рд╛рдЗрдВрдЯ рдкреНрд░рд╢рд╛рд╕рдХреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рд╣рдЬ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

рдПрдкреАрдЖрдИрдХреНрд▓рд╛рдЗрдВрдЯ рдФрд░ рд╕рдВрджрд░реНрдн рдкреНрд░рдмрдВрдзрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрдиреЗрдХреНрдЯ рд╣реЛ рд░рд╣рд╛ рд╣реИ

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

with APIClient(client_args) as client:

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

client = APIClient(clieng_args)

рдХрдиреЗрдХреНрд╢рди рдкрд░реАрдХреНрд╖рдг

рдпрд╣ рдЬрд╛рдВрдЪрдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рдХрд┐ рдХрдиреЗрдХреНрд╢рди рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ, рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ check_fingerprint. рдпрджрд┐ рд╕рд░реНрд╡рд░ рдПрдкреАрдЖрдИ рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдХреЗ рдлрд┐рдВрдЧрд░рдкреНрд░рд┐рдВрдЯ рдХреЗ рд▓рд┐рдП sha1 рд╣реИрд╢ рд░рд╛рд╢рд┐ рдХрд╛ рд╕рддреНрдпрд╛рдкрди рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ (рд╡рд┐рдзрд┐ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рддреА рд╣реИ рдЭреВрдард╛), рддреЛ рдпрд╣ рдЖрдорддреМрд░ рдкрд░ рдХрдиреЗрдХреНрд╢рди рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рдХрд╛рд░рдг рд╣реЛрддрд╛ рд╣реИ рдФрд░ рд╣рдо рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рд░реЛрдХ рд╕рдХрддреЗ рд╣реИрдВ (рдпрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдХрдиреЗрдХреНрд╢рди рдбреЗрдЯрд╛ рдХреЛ рд╕рд╣реА рдХрд░рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ):

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

рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдХрдХреНрд╖рд╛ рдПрдкреАрдЖрдИрдХреНрд▓рд╛рдЗрдВрдЯ рдкреНрд░рддреНрдпреЗрдХ рдПрдкреАрдЖрдИ рдХреЙрд▓ рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдЧрд╛ (рддрд░реАрдХреЗ рдПрдкреАрдЖрдИ_рдХреЙрд▓ ╨╕ api_query, рд╣рдо рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рдЖрдЧреЗ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗ) рдПрдкреАрдЖрдИ рд╕рд░реНрд╡рд░ рдкрд░ sha1 рдлрд┐рдВрдЧрд░рдкреНрд░рд┐рдВрдЯ рдкреНрд░рдорд╛рдгрдкрддреНрд░ред рд▓реЗрдХрд┐рди рдЕрдЧрд░, рдПрдкреАрдЖрдИ рд╕рд░реНрд╡рд░ рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдХреЗ sha1 рдлрд╝рд┐рдВрдЧрд░рдкреНрд░рд┐рдВрдЯ рдХреА рдЬрд╛рдБрдЪ рдХрд░рддреЗ рд╕рдордп, рдПрдХ рддреНрд░реБрдЯрд┐ рдХрд╛ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ (рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдЕрдЬреНрдЮрд╛рдд рд╣реИ рдпрд╛ рдмрджрд▓ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ), рддреЛ рд╡рд┐рдзрд┐ check_fingerprint рд╕реНрдерд╛рдиреАрдп рдорд╢реАрди рдкрд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдЬреЛрдбрд╝рдиреЗ/рдмрджрд▓рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рдкреНрд░рджрд╛рди рдХрд░реЗрдЧрд╛ред APIClientArgs рддрд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕ рдЪреЗрдХ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдХреНрд╖рдо рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рд▓реЗрдХрд┐рди рдЗрд╕рдХреА рдЕрдиреБрд╢рдВрд╕рд╛ рдХреЗрд╡рд▓ рддрднреА рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ рдЬрдм 127.0.0.1 рд╕реЗ рдХрдиреЗрдХреНрдЯ рд╣реЛрдиреЗ рдкрд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдПрдкреАрдЖрдИ рд╕рд░реНрд╡рд░ рдкрд░ рд╣реА рдЪрд▓рддреА рд╣реИ) - рдЕрд╕реБрд░рдХреНрд╖рд┐рдд_рдСрдЯреЛ_рд╕реНрд╡реАрдХрд╛рд░ (рдкрд╣рд▓реЗ "рдХрдиреЗрдХреНрд╢рди рдкреИрд░рд╛рдореАрдЯрд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛" рдореЗрдВ APIClientArgs рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдФрд░ рдЕрдзрд┐рдХ рджреЗрдЦреЗрдВ)ред

client_args = APIClientArgs(unsafe_auto_accept=True)

рдПрдкреАрдЖрдИ рд╕рд░реНрд╡рд░ рдореЗрдВ рд▓реЙрдЧ рдЗрди рдХрд░реЗрдВ

╨г рдПрдкреАрдЖрдИрдХреНрд▓рд╛рдЗрдВрдЯ рдПрдкреАрдЖрдИ рд╕рд░реНрд╡рд░ рдореЗрдВ рд▓реЙрдЧ рдЗрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдо рд╕реЗ рдХрдо 3 рддрд░реАрдХреЗ рд╣реИрдВ, рдФрд░ рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХрд╛ рдЕрд░реНрде рд╕рдордЭрддрд╛ рд╣реИ рд╕рд┐рдб(рд╕рддреНрд░-рдЖрдИрдбреА), рдЬреЛ рд╣реЗрдбрд░ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдмрд╛рдж рдХреЗ рдПрдкреАрдЖрдИ рдХреЙрд▓ рдореЗрдВ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЗрд╕ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╣реЗрдбрд░ рдореЗрдВ рдирд╛рдо рд╣реИ рдПрдХреНрд╕-рд╕реАрдПрдЪрдХреЗрдкреА-рд╕рд┐рдб), рдЗрд╕рд▓рд┐рдП рдЗрд╕ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдЖрдЧреЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

рд▓реЙрдЧрд┐рди рд╡рд┐рдзрд┐

рд▓реЙрдЧрд┐рди рдФрд░ рдкрд╛рд╕рд╡рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рдХрд▓реНрдк (рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдФрд░ рдкрд╛рд╕рд╡рд░реНрдб 1q2w3e рдХреЛ рд╕реНрдерд┐рддрд┐рдЧрдд рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ):

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

рдЕрддрд┐рд░рд┐рдХреНрдд рд╡реИрдХрд▓реНрдкрд┐рдХ рдкреИрд░рд╛рдореАрдЯрд░ рднреА рд▓реЙрдЧрд┐рди рд╡рд┐рдзрд┐ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИрдВ; рдпрд╣рд╛рдВ рдЙрдирдХреЗ рдирд╛рдо рдФрд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рд╣реИрдВ:

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

рд╡рд┐рдзрд┐ рд▓реЙрдЧрд┐рди_рд╡рд┐рде_рдПрдкреАрдЖрдИ_рдХреА

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

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

рд╡рд┐рдзрд┐ рдореЗрдВ рд▓реЙрдЧрд┐рди_рд╡рд┐рде_рдПрдкреАрдЖрдИ_рдХреА рд╡рд┐рдзрд┐ рдХреЗ рд╕рдорд╛рди рд╣реА рд╡реИрдХрд▓реНрдкрд┐рдХ рдкреИрд░рд╛рдореАрдЯрд░ рдЙрдкрд▓рдмреНрдз рд╣реИрдВ рд▓реЙрдЧ рдЗрди.

рд▓реЙрдЧрд┐рди_рдЕрд╕_рд░реВрдЯ рд╡рд┐рдзрд┐

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

     login = client.login_as_root()

рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рджреЛ рд╡реИрдХрд▓реНрдкрд┐рдХ рдкреИрд░рд╛рдореАрдЯрд░ рдЙрдкрд▓рдмреНрдз рд╣реИрдВ:

domain=None, payload=None

рдФрд░ рдЕрдВрдд рдореЗрдВ рдПрдкреАрдЖрдИ рдЦреБрдж рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ

рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдкреАрдЖрдИ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рджреЛ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ рдПрдкреАрдЖрдИ_рдХреЙрд▓ ╨╕ api_query. рдЖрдЗрдП рдЬрд╛рдиреЗрдВ рдХрд┐ рдЗрдирдореЗрдВ рдХреНрдпрд╛ рдЕрдВрддрд░ рд╣реИред

рдПрдкреАрдЖрдИ_рдХреЙрд▓

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

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

рдореИрдВ рддреБрд░рдВрдд рдПрдХ рдЖрд░рдХреНрд╖рдг рдХрд░ рджреВрдВ рдХрд┐ рдпрд╣ рд╡рд┐рдзрд┐ рдХреЗрд╡рд▓ рдЙрди рдХреЙрд▓реЛрдВ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧреВ рд╣реИ рдЬрд┐рдирдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдореЗрдВ рдСрдлрд╕реЗрдЯ рд╢рд╛рдорд┐рд▓ рд╣реИред рдРрд╕рд╛ рдЕрдиреБрдорд╛рди рддрдм рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдЗрд╕рдореЗрдВ рдмрдбрд╝реА рдорд╛рддреНрд░рд╛ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╣реЛрддреА рд╣реИ рдпрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рдкреНрд░рдмрдВрдзрди рд╕рд░реНрд╡рд░ рдкрд░ рд╕рднреА рдирд┐рд░реНрдорд┐рдд рд╣реЛрд╕реНрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рд╕реВрдЪреА рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдРрд╕реЗ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд▓рд┐рдП, рдПрдкреАрдЖрдИ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ 50 рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рдПрдХ рд╕реВрдЪреА рд▓реМрдЯрд╛рддрд╛ рд╣реИ (рдЖрдк рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рд╕реАрдорд╛ рдХреЛ 500 рдСрдмреНрдЬреЗрдХреНрдЯ рддрдХ рдмрдврд╝рд╛ рд╕рдХрддреЗ рд╣реИрдВ)ред рдФрд░ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдХрдИ рдмрд╛рд░ рди рдЦреАрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдкреАрдЖрдИ рдЕрдиреБрд░реЛрдз рдореЗрдВ рдСрдлрд╕реЗрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдмрджрд▓рддреЗ рд╣реБрдП, рдПрдХ рдПрдкреАрдЖрдИ_рдХреНрд╡реЗрд░реА рд╡рд┐рдзрд┐ рд╣реИ рдЬреЛ рдпрд╣ рдХрд╛рдо рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдХрд░рддреА рд╣реИред рдХреЙрд▓ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдЬрд╣рд╛рдВ рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ: рд╢реЛ-рд╕рддреНрд░, рд╢реЛ-рд╣реЛрд╕реНрдЯ, рд╢реЛ-рдиреЗрдЯрд╡рд░реНрдХ, рд╢реЛ-рд╡рд╛рдЗрд▓реНрдбрдХрд╛рд░реНрдб, рд╢реЛ-рд╕рдореВрд╣, рд╢реЛ-рдПрдбреНрд░реЗрд╕-рд░реЗрдВрдЬ, рд╢реЛ-рд╕рд┐рдВрдкрд▓-рдЧреЗрдЯрд╡реЗ, рд╢реЛ-рд╕рд┐рдВрдкрд▓-рдХреНрд▓рд╕реНрдЯрд░, рд╢реЛ-рдПрдХреНрд╕реЗрд╕-рднреВрдорд┐рдХрд╛рдПрдВ, рд╢реЛ-рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп-рдЧреНрд░рд╛рд╣рдХ, рд╢реЛ-рдкреИрдХреЗрдЬ. рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╣рдо рдЗрди рдПрдкреАрдЖрдИ рдХреЙрд▓реЛрдВ рдХреЗ рдирд╛рдо рдореЗрдВ рдмрд╣реБрд╡рдЪрди рд╢рдмреНрдж рджреЗрдЦрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЗрди рдХреЙрд▓реЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдирд╛ рдЖрд╕рд╛рди рд╣реЛрдЧрд╛ 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
})

рдПрдкреАрдЖрдИ рдХреЙрд▓ рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдирд╛

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

рдкрд╛рдпрдерди рдПрд╕рдбреАрдХреЗ рдХреЗ рд╕рд╛рде рдЪреЗрдХ рдкреНрд╡рд╛рдЗрдВрдЯ рдПрдкреАрдЖрдИ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдирд╛

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

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

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

рдпрджрд┐ рдПрдкреАрдЖрдИ рдХреЙрд▓ рд╕рдлрд▓ рд░рд╣реА (рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛрдб - 200) рддреЛ рд╕рд╣реА рд╣реИ рдФрд░ рдпрджрд┐ рд╕рдлрд▓ рдирд╣реАрдВ рд╣реИ рддреЛ рдЧрд▓рдд рд╣реИ (рдХреЛрдИ рдЕрдиреНрдп рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛрдб)ред рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛрдб рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╡рд┐рднрд┐рдиреНрди рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдкреАрдЖрдИ рдХреЙрд▓ рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред

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

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

рдПрдкреАрдЖрдИ рдХреЙрд▓ рдХрд┐рдП рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛрдб рд▓реМрдЯрд╛рддрд╛ рд╣реИред

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

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

рд╕реЗрдЯ_рд╕рдлрд▓рддрд╛_рд╕реНрдерд┐рддрд┐

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

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

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЙрджрд╛рд╣рд░рдг рд╣реИрдВ рдЬреЛ рдкреНрд░рдмрдВрдзрди рдПрдкреАрдЖрдИ 1.6 рдореЗрдВ рдЬреЛрдбрд╝реЗ рдЧрдП рдПрдкреАрдЖрдИ рдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдХреЙрд▓ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреА рд╣реИрдВ рдРрдб-рд╣реЛрд╕реНрдЯ ╨╕ рдРрдб-рдПрдбреНрд░реЗрд╕-рд░реЗрдВрдЬ. рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдореЗрдВ рд╕рдмрдиреЗрдЯ 192.168.0.0/24 рдХреЗ рд╕рднреА рдЖрдИрдкреА рдкрддреЗ рдмрдирд╛рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрдВрддрд┐рдо рдСрдХреНрдЯреЗрдЯ 5 рд╣реИ, рд╣реЛрд╕реНрдЯ рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд░реВрдк рдореЗрдВ, рдФрд░ рдЕрдиреНрдп рд╕рднреА рдЖрдИрдкреА рдкрддреЗ рдХреЛ рдПрдбреНрд░реЗрд╕ рд░реЗрдВрдЬ рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд┐рдЦрдирд╛ рд╣реИред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рд╕рдмрдиреЗрдЯ рдкрддрд╛ рдФрд░ рдкреНрд░рд╕рд╛рд░рдг рдкрддрд╛ рдЫреЛрдбрд╝ рджреЗрдВред

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

рдРрдб-рд╣реЛрд╕реНрдЯ рдФрд░ рдРрдб-рдПрдбреНрд░реЗрд╕-рд░реЗрдВрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ

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 рд╕реЗрдХрдВрдб рдХрд╛ рд╕рдордп рд▓рдЧрддрд╛ рд╣реИред

рдЕрдм рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдПрдкреАрдЖрдИ рдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрд╕реА рд╕рдорд╕реНрдпрд╛ рдХреЛ рдХреИрд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдП рдРрдб-рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕-рдмреИрдЪ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдПрдкреАрдЖрдИ рд╕рдВрд╕реНрдХрд░рдг 1.6 рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛ред рдпрд╣ рдХреЙрд▓ рдЖрдкрдХреЛ рдПрдХ рдПрдкреАрдЖрдИ рдЕрдиреБрд░реЛрдз рдореЗрдВ рдПрдХ рд╕рд╛рде рдХрдИ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпреЗ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд╕реНрддреБрдПрдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣реЛрд╕реНрдЯ, рд╕рдмрдиреЗрдЯ рдФрд░ рдПрдбреНрд░реЗрд╕ рд░реЗрдВрдЬ)ред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдорд╛рд░рд╛ рдХрд╛рд░реНрдп рдПрдХ рдПрдкреАрдЖрдИ рдХреЙрд▓ рдХреЗ рдврд╛рдВрдЪреЗ рдХреЗ рднреАрддрд░ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдРрдб-рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕-рдмреИрдЪ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ

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 рдПрдкреАрдЖрдИ рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд░ рдПрдХ рдмреИрдЪ рдЯрд╛рдЗрдк рдХреЙрд▓ 10 рдЧреБрдирд╛ рддреЗрдЬреА рд╕реЗ рдЪрд▓рддреА рд╣реИред рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд╡рд╕реНрддреБрдУрдВ рдкрд░ рдЕрдВрддрд░ рдФрд░ рднреА рдЕрдзрд┐рдХ рдкреНрд░рднрд╛рд╡рд╢рд╛рд▓реА рд╣реЛрдЧрд╛ред

рдЕрдм рджреЗрдЦрддреЗ рд╣реИрдВ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рд╣реИ рд╕реЗрдЯ-рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕-рдмреИрдЪ. рдЗрд╕ рдПрдкреАрдЖрдИ рдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рд╣рдо рдХрд┐рд╕реА рднреА рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдмрдбрд╝реЗ рдкреИрдорд╛рдиреЗ рдкрд░ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдЗрдП рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рдкрддреЛрдВ рдХреЗ рдкрд╣рд▓реЗ рдЖрдзреЗ рднрд╛рдЧ (.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")

рдЖрдк рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдПрдкреАрдЖрдИ рдХреЙрд▓ рдореЗрдВ рдПрдХрд╛рдзрд┐рдХ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣рдЯрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдбрд┐рд▓реАрдЯ-рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕-рдмреИрдЪ. рдЕрдм рдЖрдЗрдП рдПрдХ рдХреЛрдб рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВ рдЬреЛ рдкрд╣рд▓реЗ рдмрдирд╛рдП рдЧрдП рд╕рднреА рд╣реЛрд╕реНрдЯ рдХреЛ рд╣рдЯрд╛ рджреЗрддрд╛ рд╣реИ рдРрдб-рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕-рдмреИрдЪ.

рдбрд┐рд▓реАрдЯ-рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕-рдмреИрдЪ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЛ рд╣рдЯрд╛рдирд╛

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)

рдЪреЗрдХ рдкреНрд╡рд╛рдЗрдВрдЯ рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдХреЗ рдирдП рд░рд┐рд▓реАрдЬ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рдлрд╝рдВрдХреНрд╢рди рддреБрд░рдВрдд рдПрдкреАрдЖрдИ рдХреЙрд▓ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕ рдкреНрд░рдХрд╛рд░, R80.40 рдореЗрдВ рд░рд┐рд╡рд░реНрдЯ рдЯреВ рд░рд┐рд╡реАрдЬрди рдФрд░ рд╕реНрдорд╛рд░реНрдЯ рдЯрд╛рд╕реНрдХ рдЬреИрд╕реА "рд╕реБрд╡рд┐рдзрд╛рдПрдБ" рджрд┐рдЦрд╛рдИ рджреАрдВ, рдФрд░ рд╕рдВрдмрдВрдзрд┐рдд рдПрдкреАрдЖрдИ рдХреЙрд▓ рддреБрд░рдВрдд рдЙрдирдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдХреА рдЧрдИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд▓реАрдЧреЗрд╕реА рдХрдВрд╕реЛрд▓ рд╕реЗ рдпреВрдирд┐рдлрд╛рдЗрдб рдкреЙрд▓рд┐рд╕реА рдореЛрдб рдореЗрдВ рдЬрд╛рдиреЗ рдкрд░ рд╕рднреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛рдПрдВ рдПрдкреАрдЖрдИ рд╕рдорд░реНрдерди рднреА рдкреНрд░рд╛рдкреНрдд рдХрд░ рд▓реЗрддреА рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рд╕рдВрд╕реНрдХрд░рдг R80.40 рдореЗрдВ рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рдкреНрд░рддреАрдХреНрд╖рд┐рдд рдЕрдкрдбреЗрдЯ HTTPS рдирд┐рд░реАрдХреНрд╖рдг рдиреАрддрд┐ рдХреЛ рд▓реАрдЧреЗрд╕реА рдореЛрдб рд╕реЗ рдпреВрдирд┐рдлрд╛рдЗрдб рдкреЙрд▓рд┐рд╕реА рдореЛрдб рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рдерд╛, рдФрд░ рдЗрд╕ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рддреБрд░рдВрдд рдПрдкреАрдЖрдИ рдХреЙрд▓ рдкреНрд░рд╛рдкреНрдд рд╣реБрдИред рдпрд╣рд╛рдВ рдХреЛрдб рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬреЛ 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 рдЗрд╕рдореЗрдВ рдирд┐рдпрдВрддреНрд░рдг рд╕рд░реНрд╡рд░ рд╕реЗ рд╕реАрдзреЗ рдкрд╛рдпрдерди рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд▓рд╛рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╢рд╛рдорд┐рд▓ рд╣реИред рдпрд╣ рддрдм рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬрдм рдЖрдк рдХрд┐рд╕реА рдЕрдиреНрдп рдорд╢реАрди рд╕реЗ рдПрдкреАрдЖрдИ рд╕рд░реНрд╡рд░ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдореЗрдВ рдЕрд╕рдорд░реНрде рд╣реЛрдВред рдореИрдВрдиреЗ рдЫрд╣ рдорд┐рдирдЯ рдХрд╛ рдПрдХ рд╡реАрдбрд┐рдпреЛ рд░рд┐рдХреЙрд░реНрдб рдХрд┐рдпрд╛ рдЬрд┐рд╕рдореЗрдВ рдореИрдВ рдореЙрдбреНрдпреВрд▓ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реБрдП рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдВ cpapi рдФрд░ рдирд┐рдпрдВрддреНрд░рдг рд╕рд░реНрд╡рд░ рдкрд░ рдкрд╛рдпрдерди рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд▓рд╛рдиреЗ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рддреМрд░ рдкрд░, рдПрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд▓рд╛рдИ рдЬрд╛рддреА рд╣реИ рдЬреЛ рдиреЗрдЯрд╡рд░реНрдХ рдСрдбрд┐рдЯрд┐рдВрдЧ рдЬреИрд╕реЗ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рдирдП рдЧреЗрдЯрд╡реЗ рдХреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд░рддреА рд╣реИ рд╕реБрд░рдХреНрд╖рд╛ рдЬрд╛рдВрдЪ. рдЬрд┐рди рд╕реБрд╡рд┐рдзрд╛рдУрдВ рд╕реЗ рдореБрдЭреЗ рдирд┐рдкрдЯрдирд╛ рдкрдбрд╝рд╛ рдЙрдирдореЗрдВ рд╕реЗ: рдлрд╝рдВрдХреНрд╢рди рдЕрднреА рддрдХ рдкрд╛рдпрдерди 2.7 рдореЗрдВ рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджрд┐рдпрд╛ рд╣реИ рдирд┐рд╡реЗрд╢, рдЗрд╕рд▓рд┐рдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рджрд░реНрдЬ рдХреА рдЧрдИ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрдЪреНрдЪреЗ рдЗрдирдкреБрдЯ. рдЕрдиреНрдпрдерд╛, рдХреЛрдб рдЕрдиреНрдп рдорд╢реАрдиреЛрдВ рд╕реЗ рд▓реЙрдиреНрдЪ рдХрд░рдиреЗ рдХреЗ рд╕рдорд╛рди рд╣реА рд╣реИ, рдХреЗрд╡рд▓ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ рд▓реЙрдЧрд┐рди_рдЕрд╕_рд░реВрдЯ, рддрд╛рдХрд┐ рдкреНрд░рдмрдВрдзрди рд╕рд░реНрд╡рд░ рдХрд╛ рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо, рдкрд╛рд╕рд╡рд░реНрдб рдФрд░ рдЖрдИрдкреА рдкрддрд╛ рджреЛрдмрд╛рд░рд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рди рдХрд░реЗрдВред

рд╕реБрд░рдХреНрд╖рд╛ рдЬрд╛рдВрдЪ рдХреЗ рддреНрд╡рд░рд┐рдд рд╕реЗрдЯрдЕрдк рдХреЗ рд▓рд┐рдП рд╕реНрдХреНрд░рд┐рдкреНрдЯ

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()

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

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

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

рд╣реИрдкреНрдкреА рдХреЛрдбрд┐рдВрдЧ рдФрд░ рдЕрдВрдд рддрдХ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!

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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╝реЗрдВ