ΠΡΠ»Π½Π°ΡΠ° ΡΠΈΠ»Π° Π½Π° Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ Ρ API ΡΠ΅ ΡΠ°Π·ΠΊΡΠΈΠ²Π°, ΠΊΠΎΠ³Π°ΡΠΎ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π·Π°Π΅Π΄Π½ΠΎ Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ΅Π½ ΠΊΠΎΠ΄, ΠΊΠΎΠ³Π°ΡΠΎ ΡΡΠ°Π½Π΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ½ΠΎ Π³Π΅Π½Π΅ΡΠΈΡΠ°Π½Π΅ Π½Π° API Π·Π°ΡΠ²ΠΊΠΈ ΠΈ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΈ Π·Π° Π°Π½Π°Π»ΠΈΠ·ΠΈΡΠ°Π½Π΅ Π½Π° API ΠΎΡΠ³ΠΎΠ²ΠΎΡΠΈ. ΠΡΠΏΡΠ΅ΠΊΠΈ ΡΠΎΠ²Π°, ΡΠΎΠΉ Π²ΡΠ΅ ΠΎΡΠ΅ ΠΎΡΡΠ°Π²Π° Π½Π΅Π·Π°Π±Π΅Π»Π΅ΠΆΠΈΠΌ ΠΠΎΠΌΠΏΠ»Π΅ΠΊΡ Π·Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π° ΡΠΎΡΡΡΠ΅Ρ Python (Π½Π°ΡΠΈΡΠ°Π½ ΠΏΠΎ-Π΄ΠΎΠ»Ρ Python SDK) Π·Π° API Π·Π° ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° Check Point, ΠΠΎ Π½Π°ΠΏΡΠ°Π·Π½ΠΎ. Π’ΠΎΠΉ Π·Π½Π°ΡΠΈΡΠ΅Π»Π½ΠΎ ΠΎΠΏΡΠΎΡΡΡΠ²Π° ΠΆΠΈΠ²ΠΎΡΠ° Π½Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΡΠΈΡΠ΅ ΠΈ Π΅Π½ΡΡΡΠΈΠ°ΡΡΠΈΡΠ΅ ΠΏΠΎ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·Π°ΡΠΈΡ. Python ΠΏΡΠΈΠ΄ΠΎΠ±ΠΈ ΠΎΠ³ΡΠΎΠΌΠ½Π° ΠΏΠΎΠΏΡΠ»ΡΡΠ½ΠΎΡΡ Π½Π°ΠΏΠΎΡΠ»Π΅Π΄ΡΠΊ ΠΈ ΡΠ΅ΡΠΈΡ
Π΄Π° Π·Π°ΠΏΡΠ»Π½Ρ ΠΏΡΠ°Π·Π½ΠΈΠ½Π°ΡΠ° ΠΈ Π΄Π° ΠΏΡΠ΅Π³Π»Π΅Π΄Π°ΠΌ ΠΎΡΠ½ΠΎΠ²Π½ΠΈΡΠ΅ Ρ
Π°ΡΠ°ΠΊΡΠ΅ΡΠΈΡΡΠΈΠΊΠΈ.
Check Point Π°ΠΊΡΠΈΠ²Π½ΠΎ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠ²Π° API ΠΈ Π² ΠΌΠΎΠΌΠ΅Π½ΡΠ° ΡΠ° ΠΏΡΡΠ½Π°ΡΠΈ ΡΠ»Π΅Π΄Π½ΠΈΡΠ΅:
API Π·Π° ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° Check Point (ΡΠ΅ΠΊΡΡΠ° Π²Π΅ΡΡΠΈΡ 1.6) β ΡΠ°Π±ΠΎΡΠ° Ρ ΠΊΠΎΠ½ΡΡΠΎΠ»Π½ΠΈΡ ΡΡΡΠ²ΡΡ ΡΡΠ΅Π· API (ΠΈ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ Π·Π° ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π° ΡΠΊΡΠΈΠΏΡΠΎΠ²Π΅ Π½Π° ΡΠ»ΡΠ·ΠΎΠ²Π΅, ΠΊΠΎΠ½ΡΡΠΎΠ»ΠΈΡΠ°Π½ΠΈ ΠΎΡ ΠΊΠΎΠ½ΡΡΠΎΠ»Π½ΠΈΡ ΡΡΡΠ²ΡΡ)Check Point GAIA API (ΡΠ΅ΠΊΡΡΠ° Π²Π΅ΡΡΠΈΡ 1.4) β ΡΠ°Π±ΠΎΡΠ° Ρ ΡΠ»ΡΠ·ΠΎΠ²Π΅ Π·Π° ΡΠΈΠ³ΡΡΠ½ΠΎΡΡAPI Π·Π° ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΡΠ²Π°Π½Π΅ Π½Π° Π·Π°ΠΏΠ»Π°Ρ ΠΈ 1.0 β ΡΠ°Π±ΠΎΡΠ° Ρ ΠΏΡΡΡΡΠ½ΠΈΠΊ Π² ΠΎΠ±Π»Π°ΠΊΠ° Check PointAPI Π·Π° ΠΈΠ½ΡΠΎΡΠΌΠΈΡΠ°Π½ΠΎΡΡ Π·Π° ΡΠ°ΠΌΠΎΠ»ΠΈΡΠ½ΠΎΡΡΡΠ° β ΡΠ°Π±ΠΎΡΠ° Ρ Π±Π»Π΅ΠΉΠ΄ Π·Π° ΡΠ°Π·ΠΏΠΎΠ·Π½Π°Π²Π°Π½Π΅ Π½Π° ΡΠ°ΠΌΠΎΠ»ΠΈΡΠ½ΠΎΡΡΡΠ° Π½Π° ΡΠ»ΡΠ·ΠΎΠ²Π΅API Π½Π° ΠΏΠΎΡΡΠ°Π»Π° Π·Π° ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° ΡΠΈΠ³ΡΡΠ½ΠΎΡΡΡΠ° β ΡΠ°Π±ΠΎΡΠ° Ρ ΠΏΠΎΡΡΠ°Π»Π° Π·Π° ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° SMB gateway (ΠΠΎΠ²Π΅ΡΠ΅ Π·Π° SMB ΡΠ»ΡΠ·ΠΎΠ²Π΅ΡΠ΅ )IoT API β Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ Ρ IoT ΠΊΠΎΠ½ΡΡΠΎΠ»Π΅ΡΠΈAPI Π·Π° ΡΠ²ΡΡΠ·Π²Π°Π½Π΅ Π½Π° CloudGuard - ΡΠ°Π±ΠΎΡΠΈ ΡCloudGuard Connect (SD-WAN ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π·Π° ΡΠΈΠ³ΡΡΠ½ΠΎΡΡ)API Π½Π° Dome9 - ΡΠ°Π±ΠΎΡΠΈ ΡΠΡΠΏΠΎΠ»9
ΠΠΎΠ½Π°ΡΡΠΎΡΡΠ΅ΠΌ Python SDK ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ° Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ ΡΠ°ΠΌΠΎ Ρ API Π·Π° ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΠΈ Gaia API. Π©Π΅ ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ Π½Π°ΠΉ-Π²Π°ΠΆΠ½ΠΈΡΠ΅ ΠΊΠ»Π°ΡΠΎΠ²Π΅, ΠΌΠ΅ΡΠΎΠ΄ΠΈ ΠΈ ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ Π² ΡΠΎΠ·ΠΈ ΠΌΠΎΠ΄ΡΠ».
ΠΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½Π΅ Π½Π° ΠΌΠΎΠ΄ΡΠ»Π°
ΠΠΎΠ΄ΡΠ» cpapi ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ° ΡΠ΅ Π±ΡΡΠ·ΠΎ ΠΈ Π»Π΅ΡΠ½ΠΎ ΠΎΡ
ΠΡΡΠ²ΠΈ ΡΡΡΠΏΠΊΠΈ
ΠΠ° Π΄Π° ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΡΠ°Π±ΠΎΡΠΈΠΌ Ρ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΈΡΠ΅ Π½Π° cpapi ΠΌΠΎΠ΄ΡΠ»Π°, ΡΡΡΠ±Π²Π° Π΄Π° ΠΈΠΌΠΏΠΎΡΡΠΈΡΠ°ΠΌΠ΅ ΠΎΡ ΠΌΠΎΠ΄ΡΠ»Π° cpapi ΠΏΠΎΠ½Π΅ Π΄Π²Π° Π·Π°Π΄ΡΠ»ΠΆΠΈΡΠ΅Π»Π½ΠΈ ΠΊΠ»Π°ΡΠ°:
APIClient ΠΈ APIClientArgs
from cpapi import APIClient, APIClientArgs
ΠΠ»Π°Ρ APIClientArgs ΠΎΡΠ³ΠΎΠ²Π°ΡΡ Π·Π° ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΡΠ΅ Π½Π° Π²ΡΡΠ·ΠΊΠ°ΡΠ° ΠΊΡΠΌ API ΡΡΡΠ²ΡΡΠ° ΠΈ ΠΊΠ»Π°ΡΠ° APIClient ΠΎΡΠ³ΠΎΠ²Π°ΡΡ Π·Π° Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ΡΠΎ Ρ API.
ΠΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π΅ Π½Π° ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΡΠ΅ Π½Π° Π²ΡΡΠ·ΠΊΠ°ΡΠ°
ΠΠ° Π΄Π° Π΄Π΅ΡΠΈΠ½ΠΈΡΠ°ΡΠ΅ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ Π·Π° ΡΠ²ΡΡΠ·Π²Π°Π½Π΅ ΠΊΡΠΌ API, ΡΡΡΠ±Π²Π° Π΄Π° ΡΡΠ·Π΄Π°Π΄Π΅ΡΠ΅ Π΅ΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ Π½Π° ΠΊΠ»Π°ΡΠ° APIClientArgs. ΠΠΎ ΠΏΡΠΈΠ½ΡΠΈΠΏ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΡΠ΅ ΠΌΡ ΡΠ° ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»Π½ΠΎ Π΄Π΅ΡΠΈΠ½ΠΈΡΠ°Π½ΠΈ ΠΈ ΠΏΡΠΈ ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ Π½Π° ΡΠΊΡΠΈΠΏΡΠ° Π½Π° ΠΊΠΎΠ½ΡΡΠΎΠ»Π½ΠΈΡ ΡΡΡΠ²ΡΡ Π½Π΅ Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π° ΡΠ΅ Π·Π°Π΄Π°Π²Π°Ρ.
client_args = APIClientArgs()
ΠΠΎ ΠΊΠΎΠ³Π°ΡΠΎ ΡΠ°Π±ΠΎΡΠΈΡΠ΅ Π½Π° Ρ ΠΎΡΡ Π½Π° ΡΡΠ΅ΡΠ° ΡΡΡΠ°Π½Π°, ΡΡΡΠ±Π²Π° Π΄Π° ΠΏΠΎΡΠΎΡΠΈΡΠ΅ ΠΏΠΎΠ½Π΅ IP Π°Π΄ΡΠ΅ΡΠ° ΠΈΠ»ΠΈ ΠΈΠΌΠ΅ΡΠΎ Π½Π° Ρ ΠΎΡΡΠ° Π½Π° API ΡΡΡΠ²ΡΡΠ° (ΠΈΠ·Π²Π΅ΡΡΠ΅Π½ ΡΡΡΠΎ ΠΊΠ°ΡΠΎ ΡΡΡΠ²ΡΡ Π·Π° ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅). Π ΠΏΡΠΈΠΌΠ΅ΡΠ° ΠΏΠΎ-Π΄ΠΎΠ»Ρ Π½ΠΈΠ΅ Π΄Π΅ΡΠΈΠ½ΠΈΡΠ°ΠΌΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡΠ° Π·Π° Π²ΡΡΠ·ΠΊΠ° ΡΡΡ ΡΡΡΠ²ΡΡΠ° ΠΈ ΠΌΡ ΠΏΡΠΈΡΠ²ΠΎΡΠ²Π°ΠΌΠ΅ IP Π°Π΄ΡΠ΅ΡΠ° Π½Π° ΡΡΡΠ²ΡΡΠ° Π·Π° ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΠΊΠ°ΡΠΎ Π½ΠΈΠ·.
client_args = APIClientArgs(server='192.168.47.241')
ΠΠ΅ΠΊΠ° Π΄Π° ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ Π²ΡΠΈΡΠΊΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ ΠΈ ΡΠ΅Ρ Π½ΠΈΡΠ΅ ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈ ΠΏΠΎ ΠΏΠΎΠ΄ΡΠ°Π·Π±ΠΈΡΠ°Π½Π΅, ΠΊΠΎΠΈΡΠΎ ΠΌΠΎΠ³Π°Ρ Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ ΠΏΡΠΈ ΡΠ²ΡΡΠ·Π²Π°Π½Π΅ ΠΊΡΠΌ API ΡΡΡΠ²ΡΡΠ°:
ΠΡΠ³ΡΠΌΠ΅Π½ΡΠΈ Π½Π° ΠΌΠ΅ΡΠΎΠ΄Π° __init__ Π½Π° ΠΊΠ»Π°ΡΠ° APIClientArgs
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, ΡΠ° ΠΈΠ½ΡΡΠΈΡΠΈΠ²Π½ΠΈ Π·Π° Π°Π΄ΠΌΠΈΠ½ΠΈΡΡΡΠ°ΡΠΎΡΠΈΡΠ΅ Π½Π° Check Point ΠΈ Π½Π΅ ΠΈΠ·ΠΈΡΠΊΠ²Π°Ρ Π΄ΠΎΠΏΡΠ»Π½ΠΈΡΠ΅Π»Π½ΠΈ ΠΊΠΎΠΌΠ΅Π½ΡΠ°ΡΠΈ.
Π‘Π²ΡΡΠ·Π²Π°Π½Π΅ ΡΡΠ΅Π· APIClient ΠΈ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ΅Π½ ΠΌΠ΅Π½ΠΈΠ΄ΠΆΡΡ
ΠΠ»Π°Ρ APIClient ΠΠ°ΠΉ-ΡΠ΄ΠΎΠ±Π½ΠΈΡΡ Π½Π°ΡΠΈΠ½ Π·Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π΅ ΡΡΠ΅Π· ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ½ΠΈΡ ΠΌΠ΅Π½ΠΈΠ΄ΠΆΡΡ. ΠΡΠΈΡΠΊΠΎ, ΠΊΠΎΠ΅ΡΠΎ ΡΡΡΠ±Π²Π° Π΄Π° Π±ΡΠ΄Π΅ ΠΏΡΠ΅Π΄Π°Π΄Π΅Π½ΠΎ Π½Π° Π΅ΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ Π½Π° ΠΊΠ»Π°ΡΠ° APIClient, ΡΠ° ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΡΠ΅ Π½Π° Π²ΡΡΠ·ΠΊΠ°ΡΠ°, ΠΊΠΎΠΈΡΠΎ Π±ΡΡ Π° Π΄Π΅ΡΠΈΠ½ΠΈΡΠ°Π½ΠΈ Π² ΠΏΡΠ΅Π΄ΠΈΡΠ½Π°ΡΠ° ΡΡΡΠΏΠΊΠ°.
with APIClient(client_args) as client:
ΠΠΎΠ½ΡΠ΅ΠΊΡΡΠ½ΠΈΡΡ ΠΌΠ΅Π½ΠΈΠ΄ΠΆΡΡ Π½ΡΠΌΠ° Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ½ΠΎ Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈ ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½Π΅ Π·Π° Π²Π»ΠΈΠ·Π°Π½Π΅ ΠΊΡΠΌ API ΡΡΡΠ²ΡΡΠ°, Π½ΠΎ ΡΠ΅ Π½Π°ΠΏΡΠ°Π²ΠΈ ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½Π΅ Π·Π° ΠΈΠ·Π»ΠΈΠ·Π°Π½Π΅ ΠΏΡΠΈ ΠΈΠ·Π»ΠΈΠ·Π°Π½Π΅ ΠΎΡ Π½Π΅Π³ΠΎ. ΠΠΊΠΎ ΠΏΠΎ Π½ΡΠΊΠ°ΠΊΠ²Π° ΠΏΡΠΈΡΠΈΠ½Π° Π½Π΅ ΡΠ΅ ΠΈΠ·ΠΈΡΠΊΠ²Π° ΠΈΠ·Π»ΠΈΠ·Π°Π½Π΅ ΡΠ»Π΅Π΄ ΠΏΡΠΈΠΊΠ»ΡΡΠ²Π°Π½Π΅ Π½Π° ΡΠ°Π±ΠΎΡΠ°ΡΠ° Ρ API ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½ΠΈΡ, ΡΡΡΠ±Π²Π° Π΄Π° Π·Π°ΠΏΠΎΡΠ½Π΅ΡΠ΅ ΡΠ°Π±ΠΎΡΠ° Π±Π΅Π· Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ½ΠΈΡ ΠΌΠ΅Π½ΠΈΠ΄ΠΆΡΡ:
client = APIClient(clieng_args)
ΠΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° Π²ΡΡΠ·ΠΊΠ°ΡΠ°
ΠΠ°ΠΉ-Π»Π΅ΡΠ½ΠΈΡΡ Π½Π°ΡΠΈΠ½ Π΄Π° ΠΏΡΠΎΠ²Π΅ΡΠΈΡΠ΅ Π΄Π°Π»ΠΈ Π²ΡΡΠ·ΠΊΠ°ΡΠ° ΠΎΡΠ³ΠΎΠ²Π°ΡΡ Π½Π° Π·Π°Π΄Π°Π΄Π΅Π½ΠΈΡΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ Π΅ ΡΡΠ΅Π· ΠΌΠ΅ΡΠΎΠ΄Π° ΠΏΡΠΎΠ²Π΅ΡΠΊΠ°_ΠΏΡΡΡΡΠΎΠ² ΠΎΡΠΏΠ΅ΡΠ°ΡΡΠΊ. ΠΠΊΠΎ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ°ΡΠ° Π½Π° sha1 Ρ Π΅Ρ ΡΡΠΌΠ°ΡΠ° Π·Π° ΠΏΡΡΡΡΠΎΠ²ΠΈΡ ΠΎΡΠΏΠ΅ΡΠ°ΡΡΠΊ Π½Π° API ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΠ° Π½Π° ΡΡΡΠ²ΡΡΠ° Π΅ Π½Π΅ΡΡΠΏΠ΅ΡΠ½Π° (ΠΌΠ΅ΡΠΎΠ΄ΡΡ Π²ΡΡΠ½Π° Π€Π°Π»ΡΠΈΠ²), ΡΠΎΠ³Π°Π²Π° ΡΠΎΠ²Π° ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ ΡΠ΅ ΠΏΡΠΈΡΠΈΠ½ΡΠ²Π° ΠΎΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ Ρ Π²ΡΡΠ·ΠΊΠ°ΡΠ° ΠΈ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΡΠΏΡΠ΅ΠΌ ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ΡΠΎ Π½Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ° (ΠΈΠ»ΠΈ Π΄Π° Π΄Π°Π΄Π΅ΠΌ Π½Π° ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ Π΄Π° ΠΊΠΎΡΠΈΠ³ΠΈΡΠ° Π΄Π°Π½Π½ΠΈΡΠ΅ Π·Π° Π²ΡΡΠ·ΠΊΠ°):
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, ΡΠ΅ ΠΏΠΎΠ³ΠΎΠ²ΠΎΡΠΈΠΌ Π·Π° ΡΡΡ ΠΌΠ°Π»ΠΊΠΎ ΠΏΠΎ-Π½Π°ΡΠ°ΡΡΠΊ) sha1 ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°Ρ Π·Π° ΠΏΡΡΡΡΠΎΠ²ΠΈ ΠΎΡΠΏΠ΅ΡΠ°ΡΡΡΠΈ Π½Π° API ΡΡΡΠ²ΡΡΠ°. ΠΠΎ Π°ΠΊΠΎ ΠΏΡΠΈ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° ΠΏΡΡΡΡΠΎΠ²ΠΈΡ ΠΎΡΠΏΠ΅ΡΠ°ΡΡΠΊ sha1 Π½Π° ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΠ° Π½Π° API ΡΡΡΠ²ΡΡΠ° Π±ΡΠ΄Π΅ ΠΎΡΠΊΡΠΈΡΠ° Π³ΡΠ΅ΡΠΊΠ° (ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΡΡ Π΅ Π½Π΅ΠΈΠ·Π²Π΅ΡΡΠ΅Π½ ΠΈΠ»ΠΈ Π΅ ΠΏΡΠΎΠΌΠ΅Π½Π΅Π½), ΠΌΠ΅ΡΠΎΠ΄ΡΡ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ°_ΠΏΡΡΡΡΠΎΠ² ΠΎΡΠΏΠ΅ΡΠ°ΡΡΠΊ ΡΠ΅ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²ΠΈ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ Π·Π° Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΡΠ½Π΅/ΠΏΡΠΎΠΌΡΠ½Π° Π½Π° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Π·Π° Π½Π΅Π³ΠΎ Π½Π° Π»ΠΎΠΊΠ°Π»Π½Π°ΡΠ° ΠΌΠ°ΡΠΈΠ½Π°. Π’Π°Π·ΠΈ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ Π΄Π΅Π°ΠΊΡΠΈΠ²ΠΈΡΠ°Π½Π° Π½Π°ΠΏΡΠ»Π½ΠΎ (Π½ΠΎ ΡΠΎΠ²Π° ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΏΡΠ΅ΠΏΠΎΡΡΡΠ° ΡΠ°ΠΌΠΎ Π°ΠΊΠΎ ΡΠΊΡΠΈΠΏΡΠΎΠ²Π΅ ΡΠ΅ ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π°Ρ Π½Π° ΡΠ°ΠΌΠΈΡ API ΡΡΡΠ²ΡΡ, ΠΊΠΎΠ³Π°ΡΠΎ ΡΠ΅ ΡΠ²ΡΡΠ·Π²Π°ΡΠ΅ ΠΊΡΠΌ 127.0.0.1), ΠΊΠ°ΡΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ° APIClientArgs - unsafe_auto_accept (Π²ΠΈΠΆΡΠ΅ ΠΏΠΎΠ²Π΅ΡΠ΅ Π·Π° APIClientArgs ΠΏΠΎ-ΡΠ°Π½ΠΎ Π² βΠΠ΅ΡΠΈΠ½ΠΈΡΠ°Π½Π΅ Π½Π° ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ Π½Π° Π²ΡΡΠ·ΠΊΠ°ΡΠ°β).
client_args = APIClientArgs(unsafe_auto_accept=True)
ΠΠ»Π΅Π·ΡΠ΅ Π² API ΡΡΡΠ²ΡΡΠ°
Π£ APIClient ΠΈΠΌΠ° Π΄ΠΎ 3 ΠΌΠ΅ΡΠΎΠ΄Π° Π·Π° Π²Π»ΠΈΠ·Π°Π½Π΅ Π² API ΡΡΡΠ²ΡΡΠ° ΠΈ Π²ΡΠ΅ΠΊΠΈ ΠΎΡ ΡΡΡ ΡΠ°Π·Π±ΠΈΡΠ° ΡΠΌΠΈΡΡΠ»Π° Π‘ΠΈΠ΄(session-id), ΠΊΠΎΠΉΡΠΎ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ½ΠΎ ΠΏΡΠΈ Π²ΡΡΠΊΠΎ ΡΠ»Π΅Π΄Π²Π°ΡΠΎ API ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½Π΅ Π² Π·Π°Π³Π»Π°Π²ΠΊΠ°ΡΠ° (ΠΈΠΌΠ΅ΡΠΎ Π² Π·Π°Π³Π»Π°Π²ΠΊΠ°ΡΠ° Π½Π° ΡΠΎΠ·ΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ Π΅ X-chkp-sid), ΡΠ°ΠΊΠ° ΡΠ΅ Π½ΡΠΌΠ° Π½ΡΠΆΠ΄Π° ΠΎΡ Π΄ΠΎΠΏΡΠ»Π½ΠΈΡΠ΅Π»Π½Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π° ΡΠΎΠ·ΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ.
ΠΌΠ΅ΡΠΎΠ΄ Π·Π° Π²Π»ΠΈΠ·Π°Π½Π΅
ΠΠΏΡΠΈΡ, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ° ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΠΊΠΎ ΠΈΠΌΠ΅ ΠΈ ΠΏΠ°ΡΠΎΠ»Π° (Π² ΠΏΡΠΈΠΌΠ΅ΡΠ° ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΠΊΠΎΡΠΎ ΠΈΠΌΠ΅ admin ΠΈ ΠΏΠ°ΡΠΎΠ»Π°ΡΠ° 1q2w3e ΡΠ΅ ΠΏΡΠ΅Π΄Π°Π²Π°Ρ ΠΊΠ°ΡΠΎ ΠΏΠΎΠ·ΠΈΡΠΈΠΎΠ½Π½ΠΈ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΈ):
login = client.login('admin', '1q2w3e')
ΠΠΎΠΏΡΠ»Π½ΠΈΡΠ΅Π»Π½ΠΈ Π½Π΅Π·Π°Π΄ΡΠ»ΠΆΠΈΡΠ΅Π»Π½ΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ ΡΡΡΠΎ ΡΠ° Π½Π°Π»ΠΈΡΠ½ΠΈ Π² ΠΌΠ΅ΡΠΎΠ΄Π° Π·Π° Π²Π»ΠΈΠ·Π°Π½Π΅; Π΅ΡΠΎ ΡΠ΅Ρ Π½ΠΈΡΠ΅ ΠΈΠΌΠ΅Π½Π° ΠΈ ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈ ΠΏΠΎ ΠΏΠΎΠ΄ΡΠ°Π·Π±ΠΈΡΠ°Π½Π΅:
continue_last_session=False, domain=None, read_only=False, payload=None
ΠΠ΅ΡΠΎΠ΄ Login_with_api_key
ΠΠΏΡΠΈΡ, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ° api ΠΊΠ»ΡΡ (ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ° ΡΠ΅ ΠΎΡ Π²Π΅ΡΡΠΈΡ Π·Π° ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ R80.40/Management API v1.6, "3TsbPJ8ZKjaJGvFyoFqHFA==" ΡΠΎΠ²Π° Π΅ ΡΡΠΎΠΉΠ½ΠΎΡΡΡΠ° Π½Π° API ΠΊΠ»ΡΡΠ° Π·Π° Π΅Π΄ΠΈΠ½ ΠΎΡ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΠΈΡΠ΅ Π½Π° ΡΡΡΠ²ΡΡΠ° Π·Π° ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Ρ ΠΌΠ΅ΡΠΎΠ΄Π° Π·Π° ΠΎΡΠΎΡΠΈΠ·Π°ΡΠΈΡ Π½Π° API ΠΊΠ»ΡΡΠ°):
login = client.login_with_api_key('3TsbPJ8ZKjaJGvFyoFqHFA==')
Π ΠΌΠ΅ΡΠΎΠ΄Π° login_with_api_key Π½Π°Π»ΠΈΡΠ½ΠΈ ΡΠ° ΡΡΡΠΈΡΠ΅ Π½Π΅Π·Π°Π΄ΡΠ»ΠΆΠΈΡΠ΅Π»Π½ΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ ΠΊΠ°ΡΠΎ Π² ΠΌΠ΅ΡΠΎΠ΄Π° ΠΠ»ΠΈΠ·Π°Π½Π΅.
ΠΌΠ΅ΡΠΎΠ΄ login_as_root
ΠΠΏΡΠΈΡ Π·Π° Π²Π»ΠΈΠ·Π°Π½Π΅ Π² Π»ΠΎΠΊΠ°Π»Π½Π° ΠΌΠ°ΡΠΈΠ½Π° Ρ API ΡΡΡΠ²ΡΡ:
login = client.login_as_root()
ΠΠ° ΡΠΎΠ·ΠΈ ΠΌΠ΅ΡΠΎΠ΄ ΠΈΠΌΠ° ΡΠ°ΠΌΠΎ Π΄Π²Π° Π½Π΅Π·Π°Π΄ΡΠ»ΠΆΠΈΡΠ΅Π»Π½ΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡΠ°:
domain=None, payload=None
Π Π½Π°ΠΊΡΠ°Ρ ΡΠ°ΠΌΠΈΡΠ΅ API ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½ΠΈΡ
ΠΠΌΠ°ΠΌΠ΅ Π΄Π²Π΅ ΠΎΠΏΡΠΈΠΈ Π·Π° ΠΈΠ·Π²ΡΡΡΠ²Π°Π½Π΅ Π½Π° API ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½ΠΈΡ ΡΡΠ΅Π· ΠΌΠ΅ΡΠΎΠ΄ΠΈ api_call ΠΈ api_query. ΠΠ΅ΠΊΠ° Π΄Π° ΡΠ°Π·Π±Π΅ΡΠ΅ΠΌ ΠΊΠ°ΠΊΠ²Π° Π΅ ΡΠ°Π·Π»ΠΈΠΊΠ°ΡΠ° ΠΌΠ΅ΠΆΠ΄Ρ ΡΡΡ .
api_call
Π’ΠΎΠ·ΠΈ ΠΌΠ΅ΡΠΎΠ΄ Π΅ ΠΏΡΠΈΠ»ΠΎΠΆΠΈΠΌ Π·Π° Π²ΡΡΠΊΠ°ΠΊΠ²ΠΈ ΡΠ°Π·Π³ΠΎΠ²ΠΎΡΠΈ. Π’ΡΡΠ±Π²Π° Π΄Π° ΠΏΡΠ΅Π΄Π°Π΄Π΅ΠΌ ΠΏΠΎΡΠ»Π΅Π΄Π½Π°ΡΠ° ΡΠ°ΡΡ Π·Π° API ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½Π΅ΡΠΎ ΠΈ ΠΏΠΎΠ»Π΅Π·Π½ΠΈΡ ΡΠΎΠ²Π°Ρ Π² ΡΡΠ»ΠΎΡΠΎ Π½Π° Π·Π°ΡΠ²ΠΊΠ°ΡΠ°, Π°ΠΊΠΎ Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ. ΠΠΊΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΠΈΡΡ ΡΠΎΠ²Π°Ρ Π΅ ΠΏΡΠ°Π·Π΅Π½, ΡΠΎΠ³Π°Π²Π° ΡΠΎΠΉ ΠΈΠ·ΠΎΠ±ΡΠΎ Π½Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΠΏΡΠ΅Π΄Π°Π΄Π΅Π½:
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, ΠΈΠΌΠ° api_query ΠΌΠ΅ΡΠΎΠ΄, ΠΊΠΎΠΉΡΠΎ Π²ΡΡΡΠΈ ΡΠ°Π·ΠΈ ΡΠ°Π±ΠΎΡΠ° Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ½ΠΎ. ΠΡΠΈΠΌΠ΅ΡΠΈ Π·Π° ΠΎΠ±Π°ΠΆΠ΄Π°Π½ΠΈΡ, ΠΏΡΠΈ ΠΊΠΎΠΈΡΠΎ Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌ ΡΠΎΠ·ΠΈ ΠΌΠ΅ΡΠΎΠ΄: show-sessions, show-hosts, show-networks, show-wildcards, show-groups, show-address-ranges, show-simple-gateways, show-simple-clusters, show-access-roles, show-trusted-clients, ΡΠΎΡ-ΠΏΠ°ΠΊΠ΅ΡΠΈ. ΠΡΡΡΠ½ΠΎΡΡ Π²ΠΈΠΆΠ΄Π°ΠΌΠ΅ Π΄ΡΠΌΠΈ Π² ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π΅Π½ΠΎ ΡΠΈΡΠ»ΠΎ Π² ΠΈΠΌΠ΅ΡΠΎ Π½Π° ΡΠ΅Π·ΠΈ ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½ΠΈΡ Π½Π° 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
Π‘Π»Π΅Π΄ ΡΠΎΠ²Π° ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈΡΠ΅ ΠΈ ΠΌΠ΅ΡΠΎΠ΄ΠΈΡΠ΅ Π½Π° ΠΊΠ»Π°ΡΠ° APIResponse(ΠΊΠ°ΠΊΡΠΎ Π²ΡΡΡΠ΅ Π² ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ½ΠΈΡ ΠΌΠ΅Π½ΠΈΠ΄ΠΆΡΡ, ΡΠ°ΠΊΠ° ΠΈ ΠΈΠ·Π²ΡΠ½ Π½Π΅Π³ΠΎ). Π ΠΊΠ»Π°ΡΠ° APIResponse ΠΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»Π½ΠΎ ΡΠ° Π΄Π΅ΡΠΈΠ½ΠΈΡΠ°Π½ΠΈ 4 ΠΌΠ΅ΡΠΎΠ΄Π° ΠΈ 5 ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ, Π½ΠΈΠ΅ ΡΠ΅ ΡΠ΅ ΡΠΏΡΠ΅ΠΌ Π½Π° Π½Π°ΠΉ-Π²Π°ΠΆΠ½ΠΈΡΠ΅ ΠΎΡ ΡΡΡ ΠΏΠΎ-ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎ.
ΡΡΠΏΠ΅Ρ
ΠΠ°ΡΠΎ Π½Π°ΡΠ°Π»ΠΎ Π±ΠΈ Π±ΠΈΠ»ΠΎ Π΄ΠΎΠ±ΡΠ° ΠΈΠ΄Π΅Ρ Π΄Π° ΡΠ΅ ΡΠ²Π΅ΡΠΈΡΠ΅, ΡΠ΅ ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½Π΅ΡΠΎ Π½Π° API Π΅ ΡΡΠΏΠ΅ΡΠ½ΠΎ ΠΈ Π΅ Π²ΡΡΠ½Π°Π»ΠΎ ΡΠ΅Π·ΡΠ»ΡΠ°Ρ. ΠΠΌΠ° ΠΌΠ΅ΡΠΎΠ΄ Π·Π° ΡΠΎΠ²Π° ΡΡΠΏΠ΅Ρ :
In [49]: api_versions.success
Out[49]: True
ΠΡΡΡΠ° True, Π°ΠΊΠΎ ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½Π΅ΡΠΎ Π½Π° API Π΅ Π±ΠΈΠ»ΠΎ ΡΡΠΏΠ΅ΡΠ½ΠΎ (ΠΊΠΎΠ΄ Π½Π° ΠΎΡΠ³ΠΎΠ²ΠΎΡ - 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) ΠΈ ΡΡΠ»ΠΎΡΠΎ Π½Π° ΠΎΡΠ³ΠΎΠ²ΠΎΡΠ° (body).
In [94]: api_versions.response()
Out[94]:
{'status_code': 200,
'data': {'current-version': '1.6',
'supported-versions': ['1', '1.1', '1.2', '1.3', '1.4', '1.5', '1.6']}}
Π΄Π°Π½Π½ΠΈ
ΠΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π²ΠΈ Π΄Π° Π²ΠΈΠ΄ΠΈΡΠ΅ ΡΠ°ΠΌΠΎ ΡΡΠ»ΠΎΡΠΎ Π½Π° ΠΎΡΠ³ΠΎΠ²ΠΎΡΠ° (ΡΡΠ»ΠΎΡΠΎ) Π±Π΅Π· Π½Π΅Π½ΡΠΆΠ½Π° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ.
In [93]: api_versions.data
Out[93]:
{'current-version': '1.6',
'supported-versions': ['1', '1.1', '1.2', '1.3', '1.4', '1.5', '1.6']}
ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ Π·Π° Π³ΡΠ΅ΡΠΊΠ°
Π’Π°Π·ΠΈ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Π΅ Π΄ΠΎΡΡΡΠΏΠ½Π° ΡΠ°ΠΌΠΎ ΠΊΠΎΠ³Π°ΡΠΎ Π΅ Π²ΡΠ·Π½ΠΈΠΊΠ½Π°Π»Π° Π³ΡΠ΅ΡΠΊΠ° ΠΏΡΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ°ΡΠ° Π½Π° API Π·Π°ΡΠ²ΠΊΠ°ΡΠ° (ΠΊΠΎΠ΄ Π½Π° ΠΎΡΠ³ΠΎΠ²ΠΎΡ Π½Π΅ 200). ΠΡΠΈΠΌΠ΅ΡΠ΅Π½ ΠΈΠ·Ρ ΠΎΠ΄
In [107]: api_versions.error_message
Out[107]: 'code: generic_err_invalid_parameter_namenmessage: Unrecognized parameter [1]n'
ΠΠΎΠ»Π΅Π·Π½ΠΈ ΠΏΡΠΈΠΌΠ΅ΡΠΈ
Π‘Π»Π΅Π΄Π²Π°Ρ ΠΏΡΠΈΠΌΠ΅ΡΠΈ, ΠΊΠΎΠΈΡΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½ΠΈΡΡΠ° Π½Π° API, ΠΊΠΎΠΈΡΠΎ ΡΠ° Π΄ΠΎΠ±Π°Π²Π΅Π½ΠΈ Π² API Π·Π° ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ 1.6.
ΠΡΡΠ²ΠΎ, Π½Π΅ΠΊΠ° Π΄Π° ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΠΊΠ°ΠΊ ΡΠ°Π±ΠΎΡΡΡ ΠΎΠ±Π°ΠΆΠ΄Π°Π½ΠΈΡΡΠ° add-host ΠΈ Π΄ΠΎΠ±Π°Π²ΡΠ½Π΅ Π½Π° Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ ΠΎΡ Π°Π΄ΡΠ΅ΡΠΈ. ΠΠ° ΠΊΠ°ΠΆΠ΅ΠΌ, ΡΠ΅ ΡΡΡΠ±Π²Π° Π΄Π° ΡΡΠ·Π΄Π°Π΄Π΅ΠΌ Π²ΡΠΈΡΠΊΠΈ IP Π°Π΄ΡΠ΅ΡΠΈ Π½Π° ΠΏΠΎΠ΄ΠΌΡΠ΅ΠΆΠ°ΡΠ° 192.168.0.0/24, ΡΠΈΠΉΡΠΎ ΠΏΠΎΡΠ»Π΅Π΄Π΅Π½ ΠΎΠΊΡΠ΅Ρ Π΅ 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 ΡΠ΅ΠΊΡΠ½Π΄ΠΈ, Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ ΠΎΡ Π½Π°ΡΠΎΠ²Π°ΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° ΡΡΡΠ²ΡΡΠ° Π·Π° ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅.
Π‘Π΅Π³Π° Π½Π΅ΠΊΠ° Π²ΠΈΠ΄ΠΈΠΌ ΠΊΠ°ΠΊ Π΄Π° ΡΠ°Π·ΡΠ΅ΡΠΈΠΌ ΡΡΡΠΈΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌ Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° API ΠΏΠΎΠ²ΠΈΠΊΠ²Π°Π½Π΅ Π΄ΠΎΠ±Π°Π²ΡΠ½Π΅ Π½Π° ΠΎΠ±Π΅ΠΊΡΠΈ-ΠΏΠ°ΡΡΠΈΠ΄Π°, ΠΏΠΎΠ΄Π΄ΡΡΠΆΠΊΠ°ΡΠ° Π·Π° ΠΊΠΎΡΡΠΎ Π±Π΅ΡΠ΅ Π΄ΠΎΠ±Π°Π²Π΅Π½Π° Π² API Π²Π΅ΡΡΠΈΡ 1.6. Π’ΠΎΠ²Π° ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½Π΅ Π²ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π΄Π° ΡΡΠ·Π΄Π°Π²Π°ΡΠ΅ ΠΌΠ½ΠΎΠ³ΠΎ ΠΎΠ±Π΅ΠΊΡΠΈ Π½Π°Π²Π΅Π΄Π½ΡΠΆ Π² Π΅Π΄Π½Π° Π·Π°ΡΠ²ΠΊΠ° Π·Π° API. ΠΡΠ²Π΅Π½ ΡΠΎΠ²Π°, ΡΠΎΠ²Π° ΠΌΠΎΠ³Π°Ρ Π΄Π° Π±ΡΠ΄Π°Ρ ΠΎΠ±Π΅ΠΊΡΠΈ ΠΎΡ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΡΠΈΠΏΠΎΠ²Π΅ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ Ρ ΠΎΡΡΠΎΠ²Π΅, ΠΏΠΎΠ΄ΠΌΡΠ΅ΠΆΠΈ ΠΈ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ΠΈ ΠΎΡ Π°Π΄ΡΠ΅ΡΠΈ). Π’Π°ΠΊΠ° Π½Π°ΡΠ°ΡΠ° Π·Π°Π΄Π°ΡΠ° ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΡΠ΅ΡΠ΅Π½Π° Π² ΡΠ°ΠΌΠΊΠΈΡΠ΅ Π½Π° Π΅Π΄Π½ΠΎ ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½Π΅ Π½Π° 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 ΡΠ΅ΠΊΡΠ½Π΄ΠΈ, Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ ΠΎΡ Π½Π°ΡΠΎΠ²Π°ΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° ΡΡΡΠ²ΡΡΠ° Π·Π° ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅. Π’ΠΎΠ²Π° ΠΎΠ·Π½Π°ΡΠ°Π²Π°, ΡΠ΅ ΡΡΠ΅Π΄Π½ΠΎ Π½Π° 101 API ΠΎΠ±Π΅ΠΊΡΠ°, ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½Π΅ΡΠΎ ΠΎΡ ΠΏΠ°ΠΊΠ΅ΡΠ΅Π½ ΡΠΈΠΏ ΡΠ΅ ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π° 10 ΠΏΡΡΠΈ ΠΏΠΎ-Π±ΡΡΠ·ΠΎ. ΠΡΠΈ ΠΏΠΎ-Π³ΠΎΠ»ΡΠΌ Π±ΡΠΎΠΉ ΠΎΠ±Π΅ΠΊΡΠΈ ΡΠ°Π·Π»ΠΈΠΊΠ°ΡΠ° ΡΠ΅ Π΅ ΠΎΡΠ΅ ΠΏΠΎ-Π²ΠΏΠ΅ΡΠ°ΡΠ»ΡΠ²Π°ΡΠ°.
Π‘Π΅Π³Π° Π½Π΅ΠΊΠ° Π²ΠΈΠ΄ΠΈΠΌ ΠΊΠ°ΠΊ Π΄Π° ΡΠ°Π±ΠΎΡΠΈΠΌ Ρ ΠΊΠΎΠΌΠΏΠ»Π΅ΠΊΡ-ΠΎΠ±Π΅ΠΊΡΠΈ-ΠΏΠ°ΡΡΠΈΠ΄Π°. ΠΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ ΡΠΎΠ²Π° 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, ΠΊΠ°ΡΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ ΠΈΠ·ΡΡΠΈΠ²Π°Π½Π΅ Π½Π° ΠΎΠ±Π΅ΠΊΡΠΈ-ΠΏΠ°ΡΡΠΈΠ΄Π°. Π‘Π΅Π³Π° Π½Π΅ΠΊΠ° Π΄Π° ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΠΏΡΠΈΠΌΠ΅Ρ Π·Π° ΠΊΠΎΠ΄, ΠΊΠΎΠΉΡΠΎ ΠΈΠ·ΡΡΠΈΠ²Π° Π²ΡΠΈΡΠΊΠΈ Ρ ΠΎΡΡΠΎΠ²Π΅, ΡΡΠ·Π΄Π°Π΄Π΅Π½ΠΈ ΠΏΡΠ΅Π΄ΠΈ ΡΠΎΠ²Π° ΡΡΠ΅Π· Π΄ΠΎΠ±Π°Π²ΡΠ½Π΅ Π½Π° ΠΎΠ±Π΅ΠΊΡΠΈ-ΠΏΠ°ΡΡΠΈΠ΄Π°.
ΠΠ·ΡΡΠΈΠ²Π°Π½Π΅ Π½Π° ΠΎΠ±Π΅ΠΊΡΠΈ ΡΡΠ΅Π· 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)
ΠΡΠΈΡΠΊΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ, ΠΊΠΎΠΈΡΠΎ ΡΠ΅ ΠΏΠΎΡΠ²ΡΠ²Π°Ρ Π² Π½ΠΎΠ²ΠΈΡΠ΅ Π²Π΅ΡΡΠΈΠΈ Π½Π° ΡΠΎΡΡΡΠ΅ΡΠ° Check Point, Π½Π΅Π·Π°Π±Π°Π²Π½ΠΎ ΠΏΡΠΈΠ΄ΠΎΠ±ΠΈΠ²Π°Ρ API ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½ΠΈΡ. Π’Π°ΠΊΠ° Π² R80.40 ΡΠ΅ ΠΏΠΎΡΠ²ΠΈΡ Π° ΡΠ°ΠΊΠΈΠ²Π° βΡΡΠ½ΠΊΡΠΈΠΈβ ΠΊΠ°ΡΠΎ Revert to revision ΠΈ Smart Task ΠΈ ΡΡΠΎΡΠ²Π΅ΡΠ½ΠΈΡΠ΅ API ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½ΠΈΡ Π±ΡΡ Π° Π½Π΅Π·Π°Π±Π°Π²Π½ΠΎ ΠΏΠΎΠ΄Π³ΠΎΡΠ²Π΅Π½ΠΈ Π·Π° ΡΡΡ . ΠΡΠ²Π΅Π½ ΡΠΎΠ²Π°, ΡΡΠ»Π°ΡΠ° ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π½ΠΎΡΡ ΠΏΡΠΈ ΠΏΡΠ΅ΠΌΠΈΠ½Π°Π²Π°Π½Π΅ ΠΎΡ Legacy ΠΊΠΎΠ½Π·ΠΎΠ»ΠΈ ΠΊΡΠΌ ΡΠ΅ΠΆΠΈΠΌ Unified Policy ΡΡΡΠΎ ΠΏΡΠΈΠ΄ΠΎΠ±ΠΈΠ²Π° API ΠΏΠΎΠ΄Π΄ΡΡΠΆΠΊΠ°. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π΄ΡΠ»Π³ΠΎΠΎΡΠ°ΠΊΠ²Π°Π½Π°ΡΠ° Π°ΠΊΡΡΠ°Π»ΠΈΠ·Π°ΡΠΈΡ Π²ΡΠ² Π²Π΅ΡΡΠΈΡ Π½Π° ΡΠΎΡΡΡΠ΅ΡΠ° R80.40 Π±Π΅ΡΠ΅ ΠΏΡΠ΅ΠΌΠ΅ΡΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° ΠΏΠΎΠ»ΠΈΡΠΈΠΊΠ°ΡΠ° Π·Π° ΠΈΠ½ΡΠΏΠ΅ΠΊΡΠΈΡ Π½Π° HTTPS ΠΎΡ ΡΠ΅ΠΆΠΈΠΌ Legacy Π² ΡΠ΅ΠΆΠΈΠΌ Unified Policy ΠΈ ΡΠ°Π·ΠΈ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π½ΠΎΡΡ Π²Π΅Π΄Π½Π°Π³Π° ΠΏΠΎΠ»ΡΡΠΈ 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")
ΠΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π° Python ΡΠΊΡΠΈΠΏΡΠΎΠ²Π΅ Π½Π° ΡΡΡΠ²ΡΡΠ° Π·Π° ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° Check Point
ΠΡΠΈΡΠΊΠΎ Π΅ ΡΡΡΠΎΡΠΎ
Π‘ΠΊΡΠΈΠΏΡ Π·Π° Π±ΡΡΠ·Π° Π½Π°ΡΡΡΠΎΠΉΠΊΠ° Π½Π° Security CheckUp
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()
ΠΡΠΈΠΌΠ΅ΡΠ΅Π½ ΡΠ°ΠΉΠ» Ρ ΡΠ΅ΡΠ½ΠΈΠΊ Π·Π° ΠΏΠ°ΡΠΎΠ»ΠΈ Additional_pass.conf
{
"passwords" : ["malware","malicious","infected","Infected"],
"phrases" : ["password","Password","Pass","pass","codigo","key","pwd","ΠΏΠ°ΡΠΎΠ»Ρ","ΠΠ°ΡΠΎΠ»Ρ","ΠΠ»ΡΡ","ΠΊΠ»ΡΡ","ΡΠΈΡΡ","Π¨ΠΈΡΡ"]
}
ΠΠ°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅
Π’Π°Π·ΠΈ ΡΡΠ°ΡΠΈΡ ΡΠ°Π·Π³Π»Π΅ΠΆΠ΄Π° ΡΠ°ΠΌΠΎ ΠΎΡΠ½ΠΎΠ²Π½ΠΈΡΠ΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ Π·Π° ΡΠ°Π±ΠΎΡΠ° Python SDK ΠΈ ΠΌΠΎΠ΄ΡΠ» cpapi(ΠΊΠ°ΠΊΡΠΎ ΡΠ΅ Π΄ΠΎΡΠ΅ΡΠ°ΡΠ΅, ΡΠΎΠ²Π° Π²ΡΡΡΠ½ΠΎΡΡ ΡΠ° ΡΠΈΠ½ΠΎΠ½ΠΈΠΌΠΈ), Π° ΠΈΠ·ΡΡΠ°Π²Π°ΠΉΠΊΠΈ ΠΊΠΎΠ΄Π° Π² ΡΠΎΠ·ΠΈ ΠΌΠΎΠ΄ΡΠ» ΡΠ΅ ΠΎΡΠΊΡΠΈΠ΅ΡΠ΅ ΠΎΡΠ΅ ΠΏΠΎΠ²Π΅ΡΠ΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ Π·Π° ΡΠ°Π±ΠΎΡΠ° Ρ Π½Π΅Π³ΠΎ. ΠΡΠ·ΠΌΠΎΠΆΠ½ΠΎ Π΅ Π΄Π° ΠΈΡΠΊΠ°ΡΠ΅ Π΄Π° Π³ΠΎ Π΄ΠΎΠΏΡΠ»Π½ΠΈΡΠ΅ ΡΡΡ ΡΠ²ΠΎΠΈ ΡΠΎΠ±ΡΡΠ²Π΅Π½ΠΈ ΠΊΠ»Π°ΡΠΎΠ²Π΅, ΡΡΠ½ΠΊΡΠΈΠΈ, ΠΌΠ΅ΡΠΎΠ΄ΠΈ ΠΈ ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ. ΠΠΈΠ½Π°Π³ΠΈ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΡΠΏΠΎΠ΄Π΅Π»ΠΈΡΠ΅ ΡΠ°Π±ΠΎΡΠ°ΡΠ° ΡΠΈ ΠΈ Π΄Π° Π²ΠΈΠ΄ΠΈΡΠ΅ Π΄ΡΡΠ³ΠΈ ΡΠΊΡΠΈΠΏΡΠΎΠ²Π΅ Π·Π° Check Point Π² ΡΠ΅ΠΊΡΠΈΡΡΠ°
ΠΡΠΈΡΡΠ½ΠΎ ΠΊΠΎΠ΄ΠΈΡΠ°Π½Π΅ ΠΈ Π±Π»Π°Π³ΠΎΠ΄Π°ΡΡ, ΡΠ΅ ΠΏΡΠΎΡΠ΅ΡΠΎΡ
ΡΠ΅ Π΄ΠΎ ΠΊΡΠ°Ρ!
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: www.habr.com