ΠΡΡ ΠΏΠΎΡΡΠΆΠ½ΡΡΡΡ Π²Π·Π°ΡΠΌΠΎΠ΄ΡΡ Π· API ΡΠΎΠ·ΠΊΡΠΈΠ²Π°ΡΡΡΡΡ ΠΏΡΠΈ ΡΠΏΡΠ»ΡΠ½ΠΎΠΌΡ Π²ΠΈΠΊΠΎΡΠΈΡΡΠ°Π½Π½Ρ Π· ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ½ΠΈΠΌ ΠΊΠΎΠ΄ΠΎΠΌ, ΠΊΠΎΠ»ΠΈ Π·'ΡΠ²Π»ΡΡΡΡΡΡ ΠΌΠΎΠΆΠ»ΠΈΠ²ΠΎΡΡΡ Π΄ΠΈΠ½Π°ΠΌΡΡΠ½ΠΎ ΡΠΎΡΠΌΡΠ²Π°ΡΠΈ Π·Π°ΠΏΠΈΡΠΈ API Ρ ΡΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΈ Π΄Π»Ρ Π°Π½Π°Π»ΡΠ·Ρ API Π²ΡΠ΄ΠΏΠΎΠ²ΡΠ΄Π΅ΠΉ. ΠΡΠΎΡΠ΅, ΠΌΠ°Π»ΠΎΠΏΠΎΠΌΡΡΠ½ΠΈΠΌ Π΄ΠΎΡΡ Π·Π°Π»ΠΈΡΠ°ΡΡΡΡΡ ΠΠΎΠΌΠΏΠ»Π΅ΠΊΡ ΡΠΎΠ·ΡΠΎΠ±ΠΊΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ½ΠΎΠ³ΠΎ Π·Π°Π±Π΅Π·ΠΏΠ΅ΡΠ΅Π½Π½Ρ Python (Π΄Π°Π»Ρ - Python SDK) Π΄Π»Ρ Check Point Management API, Π° Π΄Π°ΡΠ΅ΠΌΠ½ΠΎ. ΠΡΠ½ Π²ΡΠ΄ΡΡΡΠ½ΠΎ ΡΠΏΡΠΎΡΡΡ ΠΆΠΈΡΡΡ ΡΠΎΠ·ΡΠΎΠ±Π½ΠΈΠΊΠ°ΠΌ ΡΠ° Π°ΠΌΠ°ΡΠΎΡΠ°ΠΌ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·Π°ΡΡΡ. Python Π½Π°Π±ΡΠ² Π²Π΅Π»ΠΈΡΠ΅Π·Π½ΠΎΡ ΠΏΠΎΠΏΡΠ»ΡΡΠ½ΠΎΡΡΡ ΠΎΡΡΠ°Π½Π½ΡΠΌ ΡΠ°ΡΠΎΠΌ Ρ Ρ Π²ΠΈΡΡΡΠΈΠ² ΡΡΡΠ½ΡΡΠΈ ΠΏΡΠΎΠ³Π°Π»ΠΈΠ½Ρ Ρ Π·ΡΠΎΠ±ΠΈΡΠΈ ΠΎΠ³Π»ΡΠ΄ ΠΎΡΠ½ΠΎΠ²Π½ΠΈΡ
ΠΌΠΎΠΆΠ»ΠΈΠ²ΠΎΡΡΠ΅ΠΉ . Π¦Ρ ΡΡΠ°ΡΡΡ Ρ ΡΡΠ΄ΠΎΠ²ΠΈΠΌ Π΄ΠΎΠΏΠΎΠ²Π½Π΅Π½Π½ΡΠΌ ΡΠ½ΡΠΎΡ ΡΡΠ°ΡΡΡ Π½Π° Π₯Π°Π±ΡΠ΅ . ΠΠΈ ΡΠΎΠ·Π³Π»ΡΠ½Π΅ΠΌΠΎ ΡΠΊ Π½Π°ΠΏΠΈΡΠ°ΡΠΈ ΡΠΊΡΠΈΠΏΡΠΈ Π· Π²ΠΈΠΊΠΎΡΠΈΡΡΠ°Π½Π½ΡΠΌ Python SDK Ρ Π·ΡΠΏΠΈΠ½ΠΈΠΌΠΎΡΡ Π΄ΠΎΠΊΠ»Π°Π΄Π½ΡΡΠ΅ Π½Π° Π½ΠΎΠ²ΠΎΠΌΡ ΡΡΠ½ΠΊΡΡΠΎΠ½Π°Π»Ρ Management API Ρ Π²Π΅ΡΡΡΡ 1.6 (ΠΏΡΠ΄ΡΡΠΈΠΌΡΡΡΡΡΡ ΠΏΠΎΡΠΈΠ½Π°ΡΡΠΈ Π· R80.40). ΠΠ»Ρ ΡΠΎΠ·ΡΠΌΡΠ½Π½Ρ ΡΡΠ°ΡΡΡ Π·Π½Π°Π΄ΠΎΠ±Π»ΡΡΡΡΡ Π±Π°Π·ΠΎΠ²Ρ Π·Π½Π°Π½Π½Ρ Π· ΡΠΎΠ±ΠΎΡΠΈ Π· API ΡΠ° Python.
Check Point Π°ΠΊΡΠΈΠ²Π½ΠΎ ΡΠΎΠ·Π²ΠΈΠ²Π°Ρ API Ρ Π·Π°ΡΠ°Π· Π½Π° ΡΠ²ΡΡ Π·'ΡΠ²ΠΈΠ»ΠΈΡΡ:
- - Π ΠΎΠ±ΠΎΡΠ° Π· ΡΠ΅ΡΠ²Π΅ΡΠΎΠΌ ΡΠΏΡΠ°Π²Π»ΡΠ½Π½Ρ ΡΠ΅ΡΠ΅Π· API (Ρ ΠΌΠΎΠΆΠ»ΠΈΠ²ΡΡΡΡ Π²ΠΈΠΊΠΎΠ½ΡΠ²Π°ΡΠΈ ΡΠΊΡΠΈΠΏΡΠΈ Π½Π° ΡΠ»ΡΠ·Π°Ρ ΠΏΡΠ΄ ΡΠΏΡΠ°Π²Π»ΡΠ½Π½ΡΠΌ ΡΠ΅ΡΠ²Π΅ΡΠ° ΡΠΏΡΠ°Π²Π»ΡΠ½Π½Ρ)
- - ΡΠΎΠ±ΠΎΡΠ° Π·Ρ ΡΠ»ΡΠ·Π°ΠΌΠΈ Π±Π΅Π·ΠΏΠ΅ΠΊΠΈ
- - ΡΠΎΠ±ΠΎΡΠ° Π· ΠΏΡΡΠΎΡΠ½ΠΈΡΠ΅Ρ Ρ Ρ ΠΌΠ°ΡΡ Check Point
- - ΡΠΎΠ±ΠΎΡΠ° Π· Identity Awareness blade Π½Π° ΡΠ»ΡΠ·Π°Ρ
- - Π ΠΎΠ±ΠΎΡΠ° Π· ΠΏΠΎΡΡΠ°Π»ΠΎΠΌ ΡΠΏΡΠ°Π²Π»ΡΠ½Π½Ρ SMB ΡΠ»ΡΠ·Π°ΠΌΠΈ ()
- - Π²Π·Π°ΡΠΌΠΎΠ΄ΡΡ Π· IoT ΠΊΠΎΠ½ΡΡΠΎΠ»Π΅ΡΠ°ΠΌΠΈ
- - ΡΠΎΠ±ΠΎΡΠ° Π· (Π ΡΡΠ΅Π½Π½Ρ SD-WAN security)
- - ΡΠΎΠ±ΠΎΡΠ° Π·
Python SDK Π½Π° Π΄Π°Π½ΠΈΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ ΠΏΡΠ΄ΡΡΠΈΠΌΡΡ Π²Π·Π°ΡΠΌΠΎΠ΄ΡΡ ΡΡΠ»ΡΠΊΠΈ Π· Management API ΡΠ° Gaia API. ΠΠΈ ΡΠΎΠ·Π³Π»ΡΠ½Π΅ΠΌΠΎ Π½Π°ΠΉΠ²Π°ΠΆΠ»ΠΈΠ²ΡΡΡ ΠΊΠ»Π°ΡΠΈ, ΠΌΠ΅ΡΠΎΠ΄ΠΈ ΡΠ° Π·ΠΌΡΠ½Π½Ρ Π² Π΄Π°Π½ΠΎΠΌΡ ΠΌΠΎΠ΄ΡΠ»Ρ.

ΠΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π½Ρ ΠΌΠΎΠ΄ΡΠ»Ρ
ΠΌΠΎΠ΄ΡΠ»Ρ cpapi Π²ΡΡΠ°Π½ΠΎΠ²Π»ΡΡΡΡΡΡ ΡΠ²ΠΈΠ΄ΠΊΠΎ Ρ ΠΏΡΠΎΡΡΠΎ Π· Π·Π° Π΄ΠΎΠΏΠΎΠΌΠΎΠ³ΠΎΡ ΡΠΈΠΏΡΠ½. ΠΠ΅ΡΠ°Π»ΡΠ½Π° ΡΠ½ΡΡΡΡΠΊΡΡΡ ΠΏΠΎ Π²ΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π½Ρ Ρ Π² . Π¦Π΅ΠΉ ΠΌΠΎΠ΄ΡΠ»Ρ Π°Π΄Π°ΠΏΡΠΎΠ²Π°Π½ΠΈΠΉ Π΄Π»Ρ ΡΠΎΠ±ΠΎΡΠΈ Π· Π²Π΅ΡΡΡΡΠΌΠΈ Python 2.7 ΡΠ° 3.7. Π£ ΡΡΠΉ ΡΡΠ°ΡΡΡ ΠΏΡΠΈΠΊΠ»Π°Π΄ΠΈ Π±ΡΠ΄ΡΡΡ Π½Π°Π²Π΅Π΄Π΅Π½Ρ Π·Π° Π΄ΠΎΠΏΠΎΠΌΠΎΠ³ΠΎΡ Python 3.7. ΠΠ΄Π½Π°ΠΊ Python SDK ΠΌΠΎΠΆΠ½Π° Π·Π°ΠΏΡΡΠΊΠ°ΡΠΈ ΠΏΡΡΠΌΠΎ Π· ΡΠ΅ΡΠ²Π΅ΡΠ° ΠΊΠ΅ΡΡΠ²Π°Π½Π½Ρ Check Point (Smart Management), Π°Π»Π΅ Π½Π° Π½ΠΈΡ ΠΏΡΠ΄ΡΡΠΈΠΌΡΡΡΡΡΡ ΡΡΠ»ΡΠΊΠΈ Π²Π΅ΡΡΡΡ Python 2.7, ΡΠΎΠΌΡ Π² ΠΎΡΡΠ°Π½Π½ΡΠΎΠΌΡ ΡΠΎΠ·Π΄ΡΠ»Ρ Π±ΡΠ΄Π΅ Π½Π°Π²Π΅Π΄Π΅Π½ΠΎ ΠΊΠΎΠ΄ Π΄Π»Ρ Π²Π΅ΡΡΡΡ 2.7. ΠΡΠ΄ΡΠ°Π·Ρ ΠΏΡΡΠ»Ρ Π²ΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π½Ρ ΠΌΠΎΠ΄ΡΠ»Ρ ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΡ ΠΏΠΎΠ΄ΠΈΠ²ΠΈΡΠΈΡΡ Π½Π° ΠΏΡΠΈΠΊΠ»Π°Π΄ΠΈ Π² Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΡΡΡ examples_python2 ΠΈ examples_python3.
ΠΠΎΡΠ°ΡΠΎΠΊ ΡΠΎΠ±ΠΎΡΠΈ
ΠΠ»Ρ ΡΠΎΠ³ΠΎ ΡΠΎΠ± Ρ Π½Π°Ρ Π·'ΡΠ²ΠΈΠ»Π°ΡΡ ΠΌΠΎΠΆΠ»ΠΈΠ²ΡΡΡΡ ΠΏΡΠ°ΡΡΠ²Π°ΡΠΈ Π· ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°ΠΌΠΈ ΠΌΠΎΠ΄ΡΠ»Ρ cpapi Π½Π΅ΠΎΠ±Ρ ΡΠ΄Π½ΠΎ ΡΠΌΠΏΠΎΡΡΡΠ²Π°ΡΠΈ Π· ΠΌΠΎΠ΄ΡΠ»Ρ cpapi ΡΠΊ ΠΌΡΠ½ΡΠΌΡΠΌ Π΄Π²Π° Π½Π΅ΠΎΠ±Ρ ΡΠ΄Π½Ρ ΠΊΠ»Π°ΡΠΈ:
APIClient ΠΈ APIClientArgs
from cpapi import APIClient, APIClientArgs
ΠΠ»Π°Ρ APIClientArgs Π²ΡΠ΄ΠΏΠΎΠ²ΡΠ΄Π°Ρ Π·Π° ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ ΠΏΡΠ΄ΠΊΠ»ΡΡΠ΅Π½Π½Ρ Π΄ΠΎ API ΡΠ΅ΡΠ²Π΅ΡΠ°, Π° ΠΊΠ»Π°Ρ APIClient Π²ΡΠ΄ΠΏΠΎΠ²ΡΠ΄Π°Ρ Π·Π° Π²Π·Π°ΡΠΌΠΎΠ΄ΡΡ Π· API.
ΠΠΈΠ·Π½Π°ΡΠ°ΡΠΌΠΎ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ ΠΏΡΠ΄ΠΊΠ»ΡΡΠ΅Π½Π½Ρ
Π©ΠΎΠ± Π²ΠΈΠ·Π½Π°ΡΠΈΡΠΈ ΡΡΠ·Π½Ρ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ ΠΏΡΠ΄ΠΊΠ»ΡΡΠ΅Π½Π½Ρ Π΄ΠΎ API, ΠΏΠΎΡΡΡΠ±Π½ΠΎ ΡΡΠ²ΠΎΡΠΈΡΠΈ Π΅ΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ ΠΊΠ»Π°ΡΡ APIClientArgs. Π ΠΏΡΠΈΠ½ΡΠΈΠΏΡ, ΠΉΠΎΠ³ΠΎ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ Π²ΠΈΠ·Π½Π°ΡΠ΅Π½Ρ Ρ ΠΏΡΠΈ Π·Π°ΠΏΡΡΠΊΡ ΡΠΊΡΠΈΠΏΡΠ° Π½Π° ΡΠ΅ΡΠ²Π΅ΡΡ ΡΠΏΡΠ°Π²Π»ΡΠ½Π½Ρ ΡΡ ΠΌΠΎΠΆΠ½Π° Π½Π΅ Π²ΠΊΠ°Π·ΡΠ²Π°ΡΠΈ.
client_args = APIClientArgs()ΠΠ»Π΅ ΠΏΡΠΈ Π·Π°ΠΏΡΡΠΊΡ Π½Π° ΡΡΠΎΡΠΎΠ½Π½ΡΠΎΠΌΡ Ρ ΠΎΡΡΡ ΠΏΠΎΡΡΡΠ±Π½ΠΎ Π²ΠΊΠ°Π·Π°ΡΠΈ ΡΠΊ ΠΌΡΠ½ΡΠΌΡΠΌ IP Π°Π΄ΡΠ΅ΡΡ Π°Π±ΠΎ ΡΠΌ'Ρ Ρ ΠΎΡΡΠ° API ΡΠ΅ΡΠ²Π΅ΡΠ° (Π²ΡΠ½ ΡΠ΅ΡΠ²Π΅Ρ ΠΊΠ΅ΡΡΠ²Π°Π½Π½Ρ). Π£ Π½Π°Π²Π΅Π΄Π΅Π½ΠΎΠΌΡ Π½ΠΈΠΆΡΠ΅ ΠΏΡΠΈΠΊΠ»Π°Π΄Ρ ΠΌΠΈ Π²ΠΈΠ·Π½Π°ΡΠ°ΡΠΌΠΎ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ ΠΏΡΠ΄ΠΊΠ»ΡΡΠ΅Π½Π½Ρ server Ρ ΠΏΡΠΈΡΠ²ΠΎΡΡΠΌΠΎ ΠΉΠΎΠΌΡ Ρ Π²ΠΈΠ³Π»ΡΠ΄Ρ ΡΡΠ΄ΠΊΠ° 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:
ΠΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΡ Π½Π΅ Π±ΡΠ΄Π΅ Π²ΠΈΠΊΠΎΠ½ΡΠ²Π°ΡΠΈ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ½ΠΎ login Π²ΠΈΠΊΠ»ΠΈΠΊ Π½Π° ΡΠ΅ΡΠ²Π΅Ρ API, ΠΎΠ΄Π½Π°ΠΊ Π²ΡΠ½ Π²ΠΈΠΊΠΎΠ½Π°Ρ Π²ΠΈΠΊΠ»ΠΈΠΊ logout ΠΏΡΠΈ Π²ΠΈΡ ΠΎΠ΄Ρ Π· Π½ΡΠΎΠ³ΠΎ. Π―ΠΊΡΠΎ Π· ΡΠΊΠΈΡ ΠΎΡΡ ΠΏΡΠΈΡΠΈΠ½ logout ΠΏΡΡΠ»Ρ Π·Π°ΠΊΡΠ½ΡΠ΅Π½Π½Ρ ΡΠΎΠ±ΠΎΡΠΈ Π· API Π²ΠΈΠΊΠ»ΠΈΠΊΠ°ΠΌΠΈ Π½Π΅ ΠΏΠΎΡΡΡΠ±Π½ΠΎ, ΠΏΠΎΡΡΡΠ±Π½ΠΎ ΡΠΎΠ·ΠΏΠΎΡΠ°ΡΠΈ ΡΠΎΠ±ΠΎΡΡ Π±Π΅Π· Π²ΠΈΠΊΠΎΡΠΈΡΡΠ°Π½Π½Ρ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅ΡΠ° ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΡ:
client = APIClient(clieng_args)ΠΠ΅ΡΠ΅Π²ΡΡΠΊΠ° Π·'ΡΠ΄Π½Π°Π½Π½Ρ
ΠΠ΅ΡΠ΅Π²ΡΡΠΈΡΠΈ ΡΠΈ ΠΏΡΠΎΡ ΠΎΠ΄ΠΈΡΡ Π·'ΡΠ΄Π½Π°Π½Π½Ρ Π·Π° Π·Π°Π΄Π°Π½ΠΈΠΌΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ°ΠΌΠΈ Π½Π°ΠΉΠΏΡΠΎΡΡΡΡΠ΅ Π·Π° Π΄ΠΎΠΏΠΎΠΌΠΎΠ³ΠΎΡ ΠΌΠ΅ΡΠΎΠ΄Ρ check_fingerprint. Π―ΠΊΡΠΎ ΠΏΠ΅ΡΠ΅Π²ΡΡΠΊΠ° Ρ Π΅Ρ-ΡΡΠΌΠΈ sha1 Π΄Π»Ρ fingerprint ΡΠ΅ΡΡΠΈΡΡΠΊΠ°ΡΠ° 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 fingerprint ΡΠ΅ΡΡΠΈΡΡΠΊΠ°ΡΠ° Π½Π° API ΡΠ΅ΡΠ²Π΅ΡΡ. Π ΠΎΡΡ ΡΠΊΡΠΎ ΠΏΡΠ΄ ΡΠ°Ρ ΠΏΠ΅ΡΠ΅Π²ΡΡΠΊΠΈ sha1 fingerprint ΡΠ΅ΡΡΠΈΡΡΠΊΠ°ΡΠ° API ΡΠ΅ΡΠ²Π΅ΡΠ° Π±ΡΠ΄Π΅ Π²ΠΈΡΠ²Π»Π΅Π½ΠΎ ΠΏΠΎΠΌΠΈΠ»ΠΊΡ (ΡΠ΅ΡΡΠΈΡΡΠΊΠ°Ρ Π½Π΅Π²ΡΠ΄ΠΎΠΌΠΈΠΉ Π°Π±ΠΎ Π±ΡΠ² Π·ΠΌΡΠ½Π΅Π½ΠΈΠΉ), ΠΌΠ΅ΡΠΎΠ΄ check_fingerprint Π½Π°Π΄Π°ΡΡΡ ΠΌΠΎΠΆΠ»ΠΈΠ²ΡΡΡΡ Π΄ΠΎΠ΄Π°ΡΠΈ/Π·ΠΌΡΠ½ΠΈΡΠΈ ΡΠ½ΡΠΎΡΠΌΠ°ΡΡΡ ΠΏΡΠΎ Π½ΡΠΎΠ³ΠΎ Π½Π° Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΠΉ ΠΌΠ°ΡΠΈΠ½Ρ Π² Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ½ΠΎΠΌΡ ΡΠ΅ΠΆΠΈΠΌΡ. ΠΠ°Π½Ρ ΠΏΠ΅ΡΠ΅Π²ΡΡΠΊΡ ΠΌΠΎΠΆΠ½Π° Π²ΡΠ΄ΠΊΠ»ΡΡΠΈΡΠΈ Π·ΠΎΠ²ΡΡΠΌ (Π°Π»Π΅ ΡΠ°ΠΊΠ΅ ΠΌΠΎΠΆΠ½Π° ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΠ²Π°ΡΠΈ Π»ΠΈΡΠ΅ Ρ ΡΠ°Π·Ρ Π·Π°ΠΏΡΡΠΊΡ ΡΠΊΡΠΈΠΏΡΡΠ² Π½Π° ΡΠ°ΠΌΠΎΠΌΡ API ΡΠ΅ΡΠ²Π΅ΡΡ, ΠΏΡΠΈ ΠΏΡΠ΄ΠΊΠ»ΡΡΠ΅Π½Π½Ρ Π΄ΠΎ 127.0.0.1), Π²ΠΈΠΊΠΎΡΠΈΡΡΠΎΠ²ΡΡΡΠΈ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ APIClientArgs β unsafe_auto_accept (ΠΠΈΠ². Π΄ΠΎΠΊΠ»Π°Π΄Π½ΡΡΠ΅ Π΄Π»Ρ APIClientArgs ΡΠ°Π½ΡΡΠ΅ Π² Β«ΠΠΈΠ·Π½Π°ΡΠ°ΡΠΌΠΎ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ ΠΏΡΠ΄ΠΊΠ»ΡΡΠ΅Π½Π½ΡΒ»).
client_args = APIClientArgs(unsafe_auto_accept=True)Login Π½Π° ΡΠ΅ΡΠ²Π΅Ρ API
Π£ APIClient Ρ ΡΡΠ»ΠΈΡ 3 ΠΌΠ΅ΡΠΎΠ΄ΠΈ Π»ΠΎΠ³ΡΠ½Ρ Π½Π° API ΡΠ΅ΡΠ²Π΅Ρ, Ρ ΠΊΠΎΠΆΠ΅Π½ ΡΠ· Π½ΠΈΡ ΡΠΎΠ·ΡΠΌΡΡ Π·Π½Π°ΡΠ΅Π½Π½Ρ SID(session-id), ΡΠΊΠ΅ Π²ΠΈΠΊΠΎΡΠΈΡΡΠΎΠ²ΡΡ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ½ΠΎ Π² ΠΊΠΎΠΆΠ½ΠΎΠΌΡ Π½Π°ΡΡΡΠΏΠ½ΠΎΠΌΡ API Π²ΠΈΠΊΠ»ΠΈΠΊΡ Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΡ (ΡΠΌ'Ρ Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΡ ΡΡΠΎΠ³ΠΎ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ° β X-chkp-sid), ΡΠ°ΠΊ ΡΠΎ Π½Π΅ ΠΏΠΎΡΡΡΠ±Π½ΠΎ Π΄ΠΎΠ΄Π°ΡΠΊΠΎΠ²ΠΎ ΠΎΠ±ΡΠΎΠ±Π»ΡΡΠΈ ΡΠ΅ΠΉ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ.
ΠΠ΅ΡΠΎΠ΄ login
ΠΠ°ΡΡΠ°Π½Ρ Π· Π²ΠΈΠΊΠΎΡΠΈΡΡΠ°Π½Π½ΡΠΌ Π»ΠΎΠ³ΡΠ½Ρ ΡΠ° ΠΏΠ°ΡΠΎΠ»Ρ (Ρ ΠΏΡΠΈΠΊΠ»Π°Π΄Ρ ΡΠΌ'Ρ ΠΊΠΎΡΠΈΡΡΡΠ²Π°ΡΠ° admin ΡΠ° ΠΏΠ°ΡΠΎΠ»Ρ 1q2w3e ΠΏΠ΅ΡΠ΅Π΄Π°Π½Ρ ΡΠΊ ΠΏΠΎΠ·ΠΈΡΡΠΉΠ½Ρ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΈ):
login = client.login('admin', '1q2w3e') Π£ ΠΌΠ΅ΡΠΎΠ΄Ρ login Π΄ΠΎΡΡΡΠΏΠ½Ρ ΡΠ°ΠΊΠΎΠΆ Π΄ΠΎΠ΄Π°ΡΠΊΠΎΠ²Ρ ΠΎΠΏΡΡΠΎΠ½Π°Π»ΡΠ½Ρ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ, Π½Π°Π²ΠΎΠ΄ΠΆΡ ΡΡ ΡΠΌΠ΅Π½Π° ΡΠ° Π·Π½Π°ΡΠ΅Π½Π½Ρ Π·Π° ΠΏΡΠΎΠΌΠΎΠ²ΡΠ°Π½Π½ΡΠΌ:
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 key):
login = client.login_with_api_key('3TsbPJ8ZKjaJGvFyoFqHFA==') Π£ ΠΌΠ΅ΡΠΎΠ΄Ρ login_with_api_key Π΄ΠΎΡΡΡΠΏΠ½Ρ ΡΠ°ΠΊΡ ΠΆ ΠΎΠΏΡΡΠΎΠ½Π°Π»ΡΠ½Ρ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ, ΡΠΊ Ρ Π² ΠΌΠ΅ΡΠΎΠ΄Ρ ΠΠΎΠ³ΡΠ½.
ΠΠ΅ΡΠΎΠ΄ login_as_root
ΠΠ°ΡΡΠ°Π½Ρ login'Π° Π½Π° Π»ΠΎΠΊΠ°Π»ΡΠ½Ρ ΠΌΠ°ΡΠΈΠ½Ρ Π· ΡΠ΅ΡΠ²Π΅ΡΠΎΠΌ API:
login = client.login_as_root()ΠΠ»Ρ Π΄Π°Π½ΠΎΠ³ΠΎ ΠΌΠ΅ΡΠΎΠ΄Ρ Π΄ΠΎΡΡΡΠΏΠ½Ρ Π»ΠΈΡΠ΅ Π΄Π²Π° ΠΎΠΏΡΡΠΎΠ½Π°Π»ΡΠ½Ρ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ:
domain=None, payload=NoneΠ Π½Π°ΡΠ΅ΡΡΡ ΡΠ°ΠΌΡ API Π²ΠΈΠΊΠ»ΠΈΠΊΠΈ
Π£ Π½Π°Ρ Ρ Π΄Π²Π° Π²Π°ΡΡΠ°Π½ΡΠΈ ΡΠΎΠ±ΠΈΡΠΈ API Π²ΠΈΠΊΠ»ΠΈΠΊΠΈ ΡΠ΅ΡΠ΅Π· ΠΌΠ΅ΡΠΎΠ΄ΠΈ api_call ΠΈ api_query. ΠΠ°Π²Π°ΠΉΡΠ΅ ΡΠΎΠ·Π±Π΅ΡΠ΅ΠΌΠΎΡΡ, Π² ΡΠΎΠΌΡ ΠΌΡΠΆ Π½ΠΈΠΌΠΈ ΡΡΠ·Π½ΠΈΡΡ.
api_call
Π¦Π΅ΠΉ ΠΌΠ΅ΡΠΎΠ΄ ΠΌΠΎΠΆΠ½Π° Π·Π°ΡΡΠΎΡΡΠ²Π°ΡΠΈ Π΄Π»Ρ Π±ΡΠ΄Ρ-ΡΠΊΠΈΡ Π²ΠΈΠΊΠ»ΠΈΠΊΡΠ². ΠΠ°ΠΌ ΠΏΠΎΡΡΡΠ±Π½ΠΎ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΈ ΠΎΡΡΠ°Π½Π½Ρ ΡΠ°ΡΡΠΈΠ½Ρ Π΄Π»Ρ api Π΄Π·Π²ΡΠ½ΠΊΠ° ΡΠ° payload Π² ΡΡΠ»Ρ Π·Π°ΠΏΠΈΡΡ ΠΏΡΠΈ Π½Π΅ΠΎΠ±Ρ ΡΠ΄Π½ΠΎΡΡΡ. Π―ΠΊΡΠΎ ΠΏΠ»Π°ΡΠ° ΠΏΠΎΡΠΎΠΆΠ½Ρ, ΡΠΎ ΡΡ ΠΌΠΎΠΆΠ½Π° Π½Π΅ ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°ΡΠΈ Π·ΠΎΠ²ΡΡΠΌ:
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
ΠΡΠ΄ΡΠ°Π·Ρ Π·Π°Π·Π½Π°ΡΡ, ΡΠΎ Π΄Π°Π½ΠΈΠΉ ΠΌΠ΅ΡΠΎΠ΄ Π·Π°ΡΡΠΎΡΠΎΠ²ΡΡΡΡΡΡ ΡΡΠ»ΡΠΊΠΈ Π΄Π»Ρ Π²ΠΈΠΊΠ»ΠΈΠΊΡΠ², Π²ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ ΡΠΊΠΈΡ ΠΏΠ΅ΡΠ΅Π΄Π±Π°ΡΠ°Ρ offset (Π·ΡΡΠ²). Π’Π°ΠΊΠΈΠΉ Π²ΠΈΡΠ½ΠΎΠ²ΠΎΠΊ Π²ΡΠ΄Π±ΡΠ²Π°ΡΡΡΡΡ Π² ΡΠΎΠΌΡ Π²ΠΈΠΏΠ°Π΄ΠΊΡ, ΠΊΠΎΠ»ΠΈ Π² Π½ΡΠΎΠΌΡ ΠΌΡΡΡΠΈΡΡΡΡ Π°Π±ΠΎ ΠΌΠΎΠΆΠ΅ ΠΌΡΡΡΠΈΡΠΈ Π²Π΅Π»ΠΈΠΊΡ ΠΊΡΠ»ΡΠΊΡΡΡΡ ΡΠ½ΡΠΎΡΠΌΠ°ΡΡΡ. ΠΠ°ΠΏΡΠΈΠΊΠ»Π°Π΄, ΡΠ΅ ΠΌΠΎΠΆΠ΅ Π±ΡΡΠΈ Π·Π°ΠΏΠΈΡ ΡΠΏΠΈΡΠΊΡ Π²ΡΡΡ ΡΡΠ²ΠΎΡΠ΅Π½ΠΈΡ ΠΎΠ±'ΡΠΊΡΡΠ² ΡΠΈΠΏΡ Ρ ΠΎΡΡ Π½Π° ΡΠ΅ΡΠ²Π΅ΡΡ ΠΊΠ΅ΡΡΠ²Π°Π½Π½Ρ. ΠΠ»Ρ ΡΠ°ΠΊΠΈΡ Π·Π°ΠΏΠΈΡΡΠ² API ΠΏΠΎΠ²Π΅ΡΡΠ°Ρ ΡΠΏΠΈΡΠΎΠΊ ΡΠ· 50 ΠΎΠ±'ΡΠΊΡΡΠ² Π·Π° ΠΏΡΠΎΠΌΠΎΠ²ΡΠ°Π½Π½ΡΠΌ (ΠΌΠΎΠΆΠ½Π° Π·Π±ΡΠ»ΡΡΠΈΡΠΈ Π»ΡΠΌΡΡ Π΄ΠΎ 500 ΠΎΠ±'ΡΠΊΡΡΠ² Ρ Π²ΡΠ΄ΠΏΠΎΠ²ΡΠ΄Ρ). Π Π΄Π»Ρ ΡΠΎΠ³ΠΎ, ΡΠΎΠ± Π½Π΅ ΡΠΌΠΈΠΊΠ°ΡΠΈ ΡΠ½ΡΠΎΡΠΌΠ°ΡΡΡ ΠΏΠΎ ΠΊΡΠ»ΡΠΊΠ° ΡΠ°Π·ΡΠ², Π·ΠΌΡΠ½ΡΡΡΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ offset Π² Π·Π°ΠΏΠΈΡΡ 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, show-packages. ΠΠΎ ΡΠ°ΠΊΡΡ, Π² ΡΠΌΠ΅Π½Ρ ΡΠΈΡ 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) statuscode
ΠΠΎΠ²Π΅ΡΡΠ°Ρ ΠΊΠΎΠ΄ Π²ΡΠ΄ΠΏΠΎΠ²ΡΠ΄Ρ ΠΏΡΡΠ»Ρ Π²ΠΈΠΊΠΎΠ½Π°Π½Π½Ρ API Π΄Π·Π²ΡΠ½ΠΊΠ°.
In [62]: api_versions.status_code
Out[62]: 400
ΠΠΎΠΆΠ»ΠΈΠ²Ρ ΠΊΠΎΠ΄ΠΈ Π²ΡΠ΄ΠΏΠΎΠ²ΡΠ΄Π΅ΠΉ: 200,400,401,403,404,409,500,501.
set_success_status
ΠΡΠΈ ΡΡΠΎΠΌΡ ΠΌΠΎΠΆΠ»ΠΈΠ²ΠΎ Π½Π΅ΠΎΠ±Ρ ΡΠ΄Π½ΡΡΡΡ Π·ΠΌΡΠ½ΠΈΡΠΈ Π·Π½Π°ΡΠ΅Π½Π½Ρ ΡΡΠ°ΡΡΡΡ success. Π’Π΅Ρ Π½ΡΡΠ½ΠΎ, ΡΡΠ΄ΠΈ ΠΌΠΎΠΆΠ½Π° ΠΏΠΎΠΌΡΡΡΠΈΡΠΈ Π±ΡΠ΄Ρ-ΡΠΎ, Π½Π°Π²ΡΡΡ Π·Π²ΠΈΡΠ°ΠΉΠ½ΠΈΠΉ ΡΡΠ΄ΠΎΠΊ. ΠΠ»Π΅ ΡΠ΅Π°Π»ΡΠ½ΠΈΠΌ ΠΏΡΠΈΠΊΠ»Π°Π΄ΠΎΠΌ ΠΌΠΎΠΆΠ΅ Π±ΡΡΠΈ ΡΠΊΠΈΠ΄Π°Π½Π½Ρ Π΄Π°Π½ΠΎΠ³ΠΎ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ° False Π·Π° ΠΏΠ΅Π²Π½ΠΈΡ ΡΡΠΏΡΡΠ½ΡΡ ΡΠΌΠΎΠ²Π°Ρ . ΠΠΈΠΆΡΠ΅ Π·Π²Π΅ΡΠ½ΡΡΡ ΡΠ²Π°Π³Ρ Π½Π° ΠΏΡΠΈΠΊΠ»Π°Π΄, ΠΊΠΎΠ»ΠΈ Ρ Π·Π°Π²Π΄Π°Π½Π½Ρ, ΡΠΎ Π²ΠΈΠΊΠΎΠ½ΡΡΡΡΡΡ Π½Π° ΡΠ΅ΡΠ²Π΅ΡΡ ΡΠΏΡΠ°Π²Π»ΡΠ½Π½Ρ, Π°Π»Π΅ ΠΌΠΈ Π²Π²Π°ΠΆΠ°ΡΠΈΠΌΠ΅ΠΌΠΎ ΡΠ΅ΠΉ Π·Π°ΠΏΠΈΡ Π½Π΅Π²Π΄Π°Π»ΠΈΠΌ (Π²ΠΈΡΡΠ°Π²ΠΈΠΌΠΎ Π·ΠΌΡΠ½Π½Ρ success Π² ΠΠΎΠΌΠΈΠ»ΠΊΠΎΠ²ΠΈΠΉ, Π½Π΅Π·Π²Π°ΠΆΠ°ΡΡΠΈ Π½Π° ΡΠ΅, ΡΠΎ API Π²ΠΈΠΊΠ»ΠΈΠΊ Π±ΡΠ² ΡΡΠΏΡΡΠ½ΠΈΠΌ Ρ ΠΏΠΎΠ²Π΅ΡΠ½ΡΠ² ΠΊΠΎΠ΄ 200).
for task in task_result.data["tasks"]:
if task["status"] == "failed" or task["status"] == "partially succeeded":
task_result.set_success_status(False)
breakresponse()
ΠΠ΅ΡΠΎΠ΄ response Π΄ΠΎΠ·Π²ΠΎΠ»ΡΡ ΠΏΠΎΠ΄ΠΈΠ²ΠΈΡΠΈΡΡ ΡΠ»ΠΎΠ²Π½ΠΈΠΊ ΡΠ· ΠΊΠΎΠ΄ΠΎΠΌ Π²ΡΠ΄ΠΏΠΎΠ²ΡΠ΄Ρ(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']}}
Π΄Π°Π½Ρ
ΠΠΎΠ·Π²ΠΎΠ»ΡΡ ΠΏΠΎΠ±Π°ΡΠΈΡΠΈ Π»ΠΈΡΠ΅ ΡΡΠ»ΠΎ Π²ΡΠ΄ΠΏΠΎΠ²ΡΠ΄Ρ (body) Π±Π΅Π· Π·Π°ΠΉΠ²ΠΎΡ ΡΠ½ΡΠΎΡΠΌΠ°ΡΡΡ.
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 Π²ΠΈΠΊΠ»ΠΈΠΊΠΈ, ΡΠΊΡ Π±ΡΠ»ΠΈ Π΄ΠΎΠ΄Π°Π½Ρ Π΄ΠΎ Π²Π΅ΡΡΡΡ Management API 1.6.
ΠΠ»Ρ ΠΏΠΎΡΠ°ΡΠΊΡ ΡΠΎΠ·Π³Π»ΡΠ½Π΅ΠΌΠΎ ΡΠΎΠ±ΠΎΡΡ Π΄Π·Π²ΡΠ½ΠΊΡΠ² add-host ΠΈ add-address-range. ΠΡΠΈΠΏΡΡΡΠΈΠΌΠΎ, Π½Π°ΠΌ ΠΏΠΎΡΡΡΠ±Π½ΠΎ ΡΡΠ²ΠΎΡΠΈΡΠΈ ΡΠΊ ΠΎΠ±'ΡΠΊΡ ΡΠΈΠΏΡ Ρ ΠΎΡΡ Π²ΡΡ ip Π°Π΄ΡΠ΅ΡΠΈ ΠΏΡΠ΄ΠΌΠ΅ΡΠ΅ΠΆΡ 192.168.0.0/24, ΠΎΡΡΠ°Π½Π½ΡΠΉ ΠΎΠΊΡΠ΅Ρ ΡΠΊΠΈΡ Π΄ΠΎΡΡΠ²Π½ΡΡ 5, Π° Π²ΡΡ ΡΠ½ΡΡ ip Π°Π΄ΡΠ΅ΡΠΈ Π·Π°ΠΏΠΈΡΠ°ΡΠΈ Π² ΡΠΊΠΎΡΡΡ ΠΎΠ±'ΡΠΊΡΡΠ² ΡΠΈΠΏΡ Π΄ΡΠ°ΠΏΠ°Π·ΠΎΠ½ Π°Π΄ΡΠ΅Ρ. ΠΡΠΈ ΡΡΠΎΠΌΡ Π°Π΄ΡΠ΅ΡΡ ΠΏΡΠ΄ΠΌΠ΅ΡΠ΅ΠΆΡ ΡΠ° ΡΠΈΡΠΎΠΊΠΎΠΌΠΎΠ²Π½Ρ Π°Π΄ΡΠ΅ΡΡ Π²ΠΈΠΊΠ»ΡΡΠΈΡΠΈ.
ΠΡΠΆΠ΅, Π½ΠΈΠΆΡΠ΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠΉ ΡΠΊΡΠΈΠΏΡ Ρ ΡΠΊΠΎΠΌΡ Π²ΠΈΡΡΡΡΡΡΡΡΡ ΡΠ΅ Π·Π°Π²Π΄Π°Π½Π½Ρ Ρ ΡΡΠ²ΠΎΡΡΡΡΡΡΡ 50 ΠΎΠ±'ΡΠΊΡΡΠ² ΡΠΈΠΏΡ Ρ ΠΎΡΡ Ρ 51 ΠΎΠ±'ΡΠΊΡ ΡΠΈΠΏΡ Π΄ΡΠ°ΠΏΠ°Π·ΠΎΠ½ Π°Π΄ΡΠ΅Ρ. ΠΠ° Π²ΠΈΡΡΡΠ΅Π½Π½Ρ Π·Π°Π²Π΄Π°Π½Π½Ρ ΠΏΠΎΡΡΡΠ±Π½ΠΎ 101 API Π²ΠΈΠΊΠ»ΠΈΠΊ (Π½Π΅ ΡΠ°Ρ ΡΡΡΠΈ ΡΡΠ½Π°Π»ΡΠ½ΠΎΠ³ΠΎ Π²ΠΈΠΊΠ»ΠΈΠΊΡ publish). Π’Π°ΠΊΠΎΠΆ Π·Π° Π΄ΠΎΠΏΠΎΠΌΠΎΠ³ΠΎΡ ΠΌΠΎΠ΄ΡΠ»Ρ 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 Π²ΠΈΠΊΠ»ΠΈΠΊΡ add-objects-batch, ΠΏΡΠ΄ΡΡΠΈΠΌΠΊΠ° ΡΠΊΠΎΠ³ΠΎ Π΄ΠΎΠ΄Π°Π½Π° Π΄ΠΎ Π²Π΅ΡΡΡΡ 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 Π²ΠΈΠΊΠ»ΠΈΠΊ ΡΠΈΠΏΡ batch, Π²ΡΠ΄ΠΏΡΠ°ΡΡΠΎΠ²ΡΡ Ρ 10 ΡΠ°Π·ΡΠ² ΡΠ²ΠΈΠ΄ΡΠ΅. ΠΠ° Π±ΡΠ»ΡΡΡΠΉ ΠΊΡΠ»ΡΠΊΠΎΡΡΡ ΠΎΠ±'ΡΠΊΡΡΠ² ΡΡΠ·Π½ΠΈΡΡ Π±ΡΠ΄Π΅ ΡΠ΅ Π±ΡΠ»ΡΡ Π²ΡΠ°ΠΆΠ°ΡΡΠΎΡ.
Π’Π΅ΠΏΠ΅Ρ Π΄Π°Π²Π°ΠΉΡΠ΅ ΠΏΠΎΠ΄ΠΈΠ²ΠΈΠΌΠΎΡΡ ΡΠΊ ΠΏΡΠ°ΡΡΠ²Π°ΡΠΈ Π· set-objects-batch. ΠΠ° Π΄ΠΎΠΏΠΎΠΌΠΎΠ³ΠΎΡ ΡΡΠΎΠ³ΠΎ API Π²ΠΈΠΊΠ»ΠΈΠΊΡ ΠΌΠΈ ΠΌΠΎΠΆΠ΅ΠΌΠΎ ΠΌΠ°ΡΠΎΠ²ΠΎ Π·ΠΌΡΠ½ΠΈΡΠΈ Π±ΡΠ΄Ρ-ΡΠΊΠΈΠΉ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ. ΠΠ°Π²Π°ΠΉΡΠ΅ Π½Π°Π»Π°ΡΡΡΡΠΌΠΎ ΠΏΠ΅ΡΡΡΠΉ ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Ρ Π°Π΄ΡΠ΅Ρ Π· ΠΌΠΈΠ½ΡΠ»ΠΎΠ³ΠΎ ΠΏΡΠΈΠΊΠ»Π°Π΄Ρ (Π΄ΠΎ .124 Ρ ΠΎΡΡΠ°, ΠΏΡΠΈΡΠΎΠΌΡ Ρ Π΄ΡΠ°ΠΏΠ°Π·ΠΎΠ½Π°ΠΌ ΡΠ΅ΠΆ) ΠΊΠΎΠ»ΡΡ sienna, Π° Π΄ΡΡΠ³ΡΠΉ ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Ρ Π°Π΄ΡΠ΅Ρ ΠΏΡΠΈΠ·Π½Π°ΡΠΈΠΌΠΎ ΠΊΠΎΠ»ΡΡ khaki.
ΠΠΌΡΠ½Π° ΠΊΠΎΠ»ΡΠΎΡΡ ΠΎΠ±'ΡΠΊΡΡΠ², ΡΡΠ²ΠΎΡΠ΅Π½ΠΈΡ Ρ ΠΏΠΎΠΏΠ΅ΡΠ΅Π΄Π½ΡΠΎΠΌΡ ΠΏΡΠΈΠΊΠ»Π°Π΄Ρ
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. Π ΡΠ΅ΠΏΠ΅Ρ ΠΏΠΎΠ΄ΠΈΠ²ΠΈΠΌΠΎΡΡ Π½Π° ΠΏΡΠΈΠΊΠ»Π°Π΄ ΠΊΠΎΠ΄Ρ, ΡΠΊΠΈΠΉ Π²ΠΈΠ΄Π°Π»ΡΡ Π²ΡΡ Ρ ΠΎΡΡΠΈ, ΡΡΠ²ΠΎΡΠ΅Π½Ρ ΡΠ°Π½ΡΡΠ΅ ΡΠ΅ΡΠ΅Π· 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)
ΠΡΡ ΡΡΠ½ΠΊΡΡΡ, ΡΠΊΡ Π·'ΡΠ²Π»ΡΡΡΡΡΡ Π² Π½ΠΎΠ²ΠΈΡ ΡΠ΅Π»ΡΠ·Π°Ρ Check Point, Π²ΡΠ΄ΡΠ°Π·Ρ ΠΆ Π·Π½Π°Ρ ΠΎΠ΄ΡΡΡ Ρ API Π²ΠΈΠΊΠ»ΠΈΠΊΠΈ. Π’Π°ΠΊ, Ρ R80.40 Π·'ΡΠ²ΠΈΠ»ΠΈΡΡ ΡΠ°ΠΊΡ "ΡΡΡΡ" ΡΠΊ Revert to revision ΡΠ° Smart Task, Ρ Π΄Π»Ρ Π½ΠΈΡ ΠΎΠ΄ΡΠ°Π·Ρ ΠΆ ΠΏΡΠ΄Π³ΠΎΡΡΠ²Π°Π»ΠΈ Π²ΡΠ΄ΠΏΠΎΠ²ΡΠ΄Π½Ρ API Π²ΠΈΠΊΠ»ΠΈΠΊΠΈ. ΠΡΠ»ΡΡΠ΅ ΡΠΎΠ³ΠΎ, Π²Π΅ΡΡ ΡΡΠ½ΠΊΡΡΠΎΠ½Π°Π» ΠΏΡΠ΄ ΡΠ°Ρ ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄Ρ Π· Legacy ΠΊΠΎΠ½ΡΠΎΠ»Π΅ΠΉ Ρ ΡΠ΅ΠΆΠΈΠΌ Unified Policy ΡΠ°ΠΊΠΎΠΆ ΠΎΠ±ΡΠΎΡΡΠ°Ρ ΠΏΡΠ΄ΡΡΠΈΠΌΠΊΠΎΡ API. ΠΠ°ΠΏΡΠΈΠΊΠ»Π°Π΄, Π΄ΠΎΠ²Π³ΠΎΠΎΡΡΠΊΡΠ²Π°Π½ΠΈΠΌ ΠΎΠ½ΠΎΠ²Π»Π΅Π½Π½ΡΠΌ Ρ Π²Π΅ΡΡΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ½ΠΎΠ³ΠΎ Π·Π°Π±Π΅Π·ΠΏΠ΅ΡΠ΅Π½Π½Ρ R80.40 ΡΡΠ°Π² ΠΏΠ΅ΡΠ΅ΡΠ·Π΄ ΠΏΠΎΠ»ΡΡΠΈΠΊΠΈ HTTPS Inspection Π· Legacy ΡΠ΅ΠΆΠΈΠΌΡ Π² ΡΠ΅ΠΆΠΈΠΌ Unified Policy, Ρ Π΄Π°Π½ΠΈΠΉ ΡΡΠ½ΠΊΡΡΠΎΠ½Π°Π» Π²ΡΠ΄ΡΠ°Π·Ρ ΠΆ ΠΎΡΡΠΈΠΌΠ°Π² API Π²ΠΈΠΊΠ»ΠΈΠΊΠΈ. ΠΡΡ ΠΏΡΠΈΠΊΠ»Π°Π΄ ΠΊΠΎΠ΄Ρ, ΡΠΊΠΈΠΉ Π΄ΠΎΠ΄Π°Ρ Π½Π° Π²Π΅ΡΡ Π½Ρ ΠΏΠΎΠ·ΠΈΡΡΡ HTTPS Inspection policy ΠΏΡΠ°Π²ΠΈΠ»ΠΎ, ΡΠΊΠ΅ Π²ΠΈΠΊΠ»ΡΡΠ°Ρ Π· ΡΠ½ΡΠΏΠ΅ΠΊΡΡΡ 3 ΠΊΠ°ΡΠ΅Π³ΠΎΡΡΡ (ΠΠ΄ΠΎΡΠΎΠ²'Ρ, Π€ΡΠ½Π°Π½ΡΠΈ, ΠΠ΅ΡΠΆΠ°Π²Π½Ρ ΠΏΠΎΡΠ»ΡΠ³ΠΈ), ΡΠΊΡ Π·Π°Π±ΠΎΡΠΎΠ½Π΅Π½ΠΎ ΠΏΠ΅ΡΠ΅Π²ΡΡΡΡΠΈ Π²ΡΠ΄ΠΏΠΎΠ²ΡΠ΄Π½ΠΎ Π΄ΠΎ Π·Π°ΠΊΠΎΠ½ΠΎΠ΄Π°Π²ΡΡΠ²Π° Ρ Π½ΠΈΠ·ΡΡ ΠΊΡΠ°ΡΠ½.
ΠΠΎΠ΄Π°ΡΠΈ ΠΏΡΠ°Π²ΠΈΠ»ΠΎ Π΄ΠΎ ΠΏΠΎΠ»ΡΡΠΈΠΊΠΈ HTTPS Inspection
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
ΠΡΠ΅ Π² ΡΠΎΠΌΡ ΠΆ ΠΌΡΡΡΠΈΡΡΡΡ ΡΠ½ΡΠΎΡΠΌΠ°ΡΡΡ ΡΠΊ Π·Π°ΠΏΡΡΠΊΠ°ΡΠΈ ΡΠΊΡΠΈΠΏΡΠΈ Π½Π° Python ΠΏΡΡΠΌΠΎ Π· ΡΠ΅ΡΠ²Π΅ΡΠ° ΠΊΠ΅ΡΡΠ²Π°Π½Π½Ρ. Π¦Π΅ ΠΌΠΎΠΆΠ΅ Π±ΡΡΠΈ Π·ΡΡΡΠ½ΠΎ, ΠΊΠΎΠ»ΠΈ Ρ Π²Π°Ρ Π½Π΅ΠΌΠ°Ρ ΠΌΠΎΠΆΠ»ΠΈΠ²ΠΎΡΡΡ ΠΏΡΠ΄ΠΊΠ»ΡΡΠΈΡΠΈΡΡ Π΄ΠΎ ΡΠ΅ΡΠ²Π΅ΡΠ° API Π· ΡΠ½ΡΠΎΡ ΠΌΠ°ΡΠΈΠ½ΠΈ. Π― Π·Π°ΠΏΠΈΡΠ°Π² ΡΠ΅ΡΡΠΈΡ Π²ΠΈΠ»ΠΈΠ½Π½Π΅ Π²ΡΠ΄Π΅ΠΎ Π² ΡΠΊΠΎΠΌΡ ΡΠΎΠ·Π³Π»ΡΠ΄Π°Ρ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΡ ΠΌΠΎΠ΄ΡΠ»Ρ cpapi ΡΠ° ΠΎΡΠΎΠ±Π»ΠΈΠ²ΠΎΡΡΡ Π·Π°ΠΏΡΡΠΊΡ Python ΡΠΊΡΠΈΠΏΡΡΠ² Π½Π° ΡΠ΅ΡΠ²Π΅ΡΡ ΠΊΠ΅ΡΡΠ²Π°Π½Π½Ρ. Π―ΠΊ ΠΏΡΠΈΠΊΠ»Π°Π΄ Π·Π°ΠΏΡΡΠΊΠ°ΡΡΡΡΡ ΡΠΊΡΠΈΠΏΡ, ΡΠΊΠΈΠΉ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·ΡΡ ΠΊΠΎΠ½ΡΡΠ³ΡΡΠ°ΡΡΡ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΡΠ»ΡΠ·Ρ Π΄Π»Ρ ΡΠ°ΠΊΠΎΠ³ΠΎ Π·Π°Π²Π΄Π°Π½Π½Ρ, ΡΠΊ ΠΌΠ΅ΡΠ΅ΠΆΠ½ΠΈΠΉ Π°ΡΠ΄ΠΈΡ Security CheckUp. Π ΠΎΡΠΎΠ±Π»ΠΈΠ²ΠΎΡΡΠ΅ΠΉ, Π· ΡΠΊΠΈΠΌΠΈ Π΄ΠΎΠ²Π΅Π»ΠΎΡΡ Π·ΡΡΠΊΠ½ΡΡΠΈΡΡ: Ρ Π²Π΅ΡΡΡΡ Python 2.7 ΡΠ΅ Π·'ΡΠ²ΠΈΠ»Π°ΡΡ ΡΡΠ½ΠΊΡΡΡ Π²Ρ ΡΠ΄ΡΠΎΠΌΡ Π΄Π»Ρ ΠΎΠ±ΡΠΎΠ±ΠΊΠΈ ΡΠ½ΡΠΎΡΠΌΠ°ΡΡΡ, ΡΠΊΡ Π²Π²ΠΎΠ΄ΠΈΡΡ ΠΊΠΎΡΠΈΡΡΡΠ²Π°Ρ, Π²ΠΈΠΊΠΎΡΠΈΡΡΠΎΠ²ΡΡΡΡΡΡ ΡΡΠ½ΠΊΡΡΡ raw_input. Π ΡΠ½ΡΠΎΠΌΡ, ΠΊΠΎΠ΄ ΡΠ°ΠΊΠΈΠΉ ΠΆΠ΅ ΡΠΊ Π΄Π»Ρ Π·Π°ΠΏΡΡΠΊΡ Π· ΡΠ½ΡΠΈΡ ΠΌΠ°ΡΠΈΠ½, ΡΡΠ»ΡΠΊΠΈ Π·ΡΡΡΠ½ΡΡΠ΅ Π²ΠΈΠΊΠΎΡΠΈΡΡΠΎΠ²ΡΠ²Π°ΡΠΈ ΡΡΠ½ΠΊΡΡΡ login_as_root, ΡΠΎΠ± Π½Π΅ Π²ΠΊΠ°Π·ΡΠ²Π°ΡΠΈ ΡΠ²ΠΎΡ Π²Π»Π°ΡΠ½Ρ username, ΠΏΠ°ΡΠΎΠ»Ρ Ρ IP Π°Π΄ΡΠ΅ΡΡ ΡΠ΅ΡΠ²Π΅ΡΠ° ΡΠΏΡΠ°Π²Π»ΡΠ½Π½Ρ ΡΠ΅ ΡΠ°Π·.

Π‘ΠΊΡΠΈΠΏΡ Π΄Π»Ρ ΡΠ²ΠΈΠ΄ΠΊΠΎΠ³ΠΎ Π½Π°Π»Π°ΡΡΡΠ²Π°Π½Π½Ρ 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 Ρ ΡΠΎΠ·Π΄ΡΠ»Ρ Π² ΡΠΏΡΠ²ΡΠΎΠ²Π°ΡΠΈΡΡΠ²Ρ , ΡΠΎ ΠΏΠΎΡΠ΄Π½ΡΡ Π² ΡΠΎΠ±Ρ Ρ ΡΠΎΠ·ΡΠΎΠ±Π½ΠΈΠΊΡΠ² ΠΏΡΠΎΠ΄ΡΠΊΡΡΠ² ΡΠ° ΠΊΠΎΡΠΈΡΡΡΠ²Π°ΡΡΠ².
ΠΡΠΈΡΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄ΠΈΠ½Π³Ρ ΡΠ° Π΄ΡΠΊΡΡ, ΡΠΎ Π΄ΠΎΡΠΈΡΠ°Π»ΠΈ Π΄ΠΎ ΠΊΡΠ½ΡΡ!
ΠΠΆΠ΅ΡΠ΅Π»ΠΎ: habr.com
