د Python SDK سره د چیک پوائنټ API ساده کول

د Python SDK سره د چیک پوائنټ API ساده کولد APIs سره د متقابل عمل بشپړ ځواک څرګندیږي کله چې د برنامې کوډ سره یوځای کارول کیږي ، کله چې دا ممکنه وي چې په متحرک ډول د API ځوابونو تحلیل لپاره د API غوښتنې او وسیلې رامینځته کړي. په هرصورت، دا لاهم د پام وړ پاتې دی د پایتون سافټویر پرمختیا کټ (له دې وروسته د Python SDK په نوم یادیږي) لپاره د پوائنټ مدیریت API چیک کړئخو بې ګټې. دا د پام وړ د پراختیا کونکو او اتوماتیک لیوالانو ژوند ساده کوي. پایتون پدې وروستیو کې خورا شهرت ترلاسه کړی او ما پریکړه وکړه چې تشه ډکه کړم او اصلي ب featuresې بیاکتنه وکړم. د پوائنټ API Python پرمختیا کټ چیک کړئ. دا مقاله د هابري په اړه د بلې مقالې لپاره د عالي اضافه په توګه کار کوي چیک پوائنټ R80.10 API. د CLI، سکریپټونو او نورو له لارې مدیریت. موږ به وګورو چې څنګه د Python SDK په کارولو سره سکریپټونه ولیکئ او په 1.6 نسخه کې د نوي مدیریت API فعالیت ته نږدې کتنه وکړئ (د R80.40 څخه پیل شوي ملاتړ شوی). د مقالې د پوهیدو لپاره، تاسو به د APIs او Python سره د کار کولو لومړنۍ پوهې ته اړتیا ولرئ.

چیک پوائنټ په فعاله توګه API ته وده ورکوي او دا مهال لاندې خوشې شوي دي:

د Python SDK اوس مهال یوازې د مدیریت API سره تعامل ملاتړ کوي او Gaia API. موږ به په دې ماډل کې خورا مهم ټولګي، میتودونه او تغیرات وګورو.

د Python SDK سره د چیک پوائنټ API ساده کول

د ماډل نصب کول

انډول cpapi څخه په چټکۍ او اسانۍ سره نصب کیږي په ګیتوب کې رسمي چیک پوائنټ ذخیره له لارې برابرېږي. د نصب کولو تفصيلي لارښوونې په کې شتون لري README.md. دا ماډل د Python نسخو 2.7 او 3.7 سره کار کولو لپاره تطابق شوی. پدې مقاله کې ، مثالونه به د Python 3.7 په کارولو سره ورکړل شي. په هرصورت، د Python SDK مستقیم د چیک پوائنټ مدیریت سرور (سمارټ مدیریت) څخه پرمخ وړل کیدی شي، مګر دوی یوازې د Python 2.7 ملاتړ کوي، نو وروستۍ برخه به د 2.7 نسخه لپاره کوډ چمتو کړي. د ماډل نصبولو سمدلاسه وروسته ، زه وړاندیز کوم چې په لارښودونو کې مثالونه وګورم مثالونه_python2 и مثالونه_python3.

تر لاسه کول پیل شول

د دې لپاره چې موږ وکولی شو د 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 سرور سره وصل کیدو پرمهال کارول کیدی شي:

د APIClientArgs ټولګي د __init__ میتود دلیلونه

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

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

زه باور لرم هغه دلیلونه چې د APIClientArgs ټولګي په مثالونو کې کارول کیدی شي د چیک پوائنټ مدیرانو لپاره هوښیار دي او اضافي نظرونو ته اړتیا نلري.

د APIClient او د شرایطو مدیر له لارې نښلول

کللس APIClient د دې کارولو ترټولو اسانه لار د شرایطو مدیر له لارې ده. ټول هغه څه چې د APIClient ټولګي مثال ته لیږدولو ته اړتیا لري د پیوستون پیرامیټونه دي چې په تیر مرحله کې تعریف شوي.

with APIClient(client_args) as client:

د شرایطو مدیر به په اتوماتيک ډول د API سرور ته د ننوتلو زنګ ونه کړي، مګر دا به د وتلو په وخت کې د ننوتلو کال وکړي. که د کوم دلیل لپاره د API کالونو سره کار کولو پای ته رسیدو وروسته لاګ آوټ ته اړتیا نه وي ، نو تاسو اړتیا لرئ د شرایطو مدیر کارولو پرته کار پیل کړئ:

client = APIClient(clieng_args)

د پیوستون ازموینه

د کتلو لپاره ترټولو اسانه لار چې ایا پیوستون ټاکل شوي پیرامیټونه پوره کوي د میتود کارول دي د ګوتو نښه چیک کړئ. که چیرې د سرور API سند د ګوتو نښې لپاره د sha1 هش جمع تایید ناکام شي (طریقه بیرته راستانه شوه غلط)، بیا دا معمولا د اتصال ستونزو له امله رامینځته کیږي او موږ کولی شو د برنامه اجرا ودروو (یا کارونکي ته فرصت ورکړو چې د پیوستون ډیټا سم کړي):

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

مهرباني وکړئ په یاد ولرئ چې په راتلونکي کې ټولګي APIClient هر API کال به وګوري (طریقه api_call и api_پوښتنه، موږ به د دوی په اړه لږ څه وغږیږو) د API سرور کې sha1 د ګوتو نښې سند. مګر که، کله چې د API سرور سند د sha1 ګوتو نښې چک کوي، یوه تېروتنه وموندل شوه (سند نامعلوم دی یا بدل شوی دی)، طریقه د ګوتو نښه چیک کړئ په محلي ماشین کې به د دې په اړه د معلوماتو اضافه/بدلون فرصت برابر کړي. دا چک په بشپړ ډول غیر فعال کیدی شي (مګر دا یوازې هغه وخت وړاندیز کیدی شي چې سکریپټونه پخپله د API سرور کې چلول کیږي، کله چې 127.0.0.1 سره وصل شي)، د APIClientArgs دلیل په کارولو سره - غیر محفوظ_آټو_قبول (د APIClientArgs په اړه نور وګورئ مخکې د "د پیوستون پیرامیټونو تعریف" کې).

client_args = APIClientArgs(unsafe_auto_accept=True)

د API سرور ته ننوتل

У APIClient د API سرور ته د ننوتلو لپاره تر 3 پورې میتودونه شتون لري، او هر یو یې په معنی پوهیږي پټ شوی(session-id)، کوم چې په سرلیک کې په هر راتلونکي API کال کې په اتوماتيک ډول کارول کیږي (د دې پیرامیټر په سر کې نوم دی X-chkp-sid)، نو د دې پیرامیټر نور پروسس کولو ته اړتیا نشته.

د ننوتلو طریقه

د ننوتلو او پټنوم کارولو اختیار (د مثال په توګه، د کارونکي نوم مدیر او پټنوم 1q2w3e د موقعیتي دلیلونو په توګه لیږدول کیږي):

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

اضافي اختیاري پیرامیټونه د ننوتلو میتود کې هم شتون لري؛ دلته د دوی نومونه او ډیفالټ ارزښتونه دي:

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

ننوتل_د_api_key طریقه

د api کیلي کارولو اختیار (د مدیریت نسخه R80.40/Management API v1.6 څخه پیل شوی ملاتړ شوی، "3TsbPJ8ZKjaJGvFyoFqHFA==" دا د API کلیدي اختیار کولو میتود سره د مدیریت سرور کې د یو کاروونکو لپاره د API کلیدي ارزښت دی):

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

په طریقه ننوتل_د_api_key سره ورته اختیاري پیرامیټونه شتون لري لکه څنګه چې په میتود کې شتون لري د ننه کیدل.

login_as_root میتود

د API سرور سره محلي ماشین ته د ننوتلو اختیار:

     login = client.login_as_root()

د دې میتود لپاره یوازې دوه اختیاري پیرامیټونه شتون لري:

domain=None, payload=None

او په نهایت کې API خپل ځان بولي

موږ د میتودونو له لارې د API تلیفونونو کولو لپاره دوه اختیارونه لرو api_call и api_پوښتنه. راځئ چې معلومه کړو چې د دوی ترمنځ توپیر څه دی.

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_پوښتنه

اجازه راکړئ سمدلاسه یو ریزرویشن وکړم چې دا طریقه یوازې د هغو تلیفونونو لپاره پلي کیږي چې محصول پکې شامل وي. دا ډول تحلیل هغه وخت رامینځته کیږي کله چې پدې کې ډیر معلومات شتون ولري یا ممکن وي. د مثال په توګه، دا کیدی شي د مدیریت سرور کې د ټولو جوړ شوي کوربه شیانو لیست لپاره غوښتنه وي. د داسې غوښتنو لپاره، API د ډیفالټ په واسطه د 50 شیانو لیست بیرته راګرځوي (تاسو کولی شئ په ځواب کې حد 500 شیانو ته لوړ کړئ). او د دې لپاره چې معلومات څو ځله راوباسي، د API په غوښتنه کې د آفسیټ پیرامیټر بدلول، د api_query میتود شتون لري چې دا په اتوماتيک ډول کار کوي. د زنګونو مثالونه چیرې چې دې طریقې ته اړتیا لیدل کیږي: شو-غونډې، د نندارې کوربه، شو-شبکې، نندارې-وائلډ کارډونه، د نندارې ګروپونه، د پتې سلسله، نندارې-ساده-ګيټ ویز، ښودل-ساده-کلسترونه، نندارې-لاسرسۍ-رولونه، نندارې-باور لرونکي پیرودونکي، د ښودلو کڅوړې. په حقیقت کې ، موږ د دې API تلیفونونو په نوم جمع کلمې ګورو ، نو دا زنګونه به د دې له لارې اداره کول اسانه وي api_پوښتنه

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

د کټ لاندې د دې غوښتنې لپاره محصول:

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

د API کالونو پایلې پروسس کول

له دې وروسته تاسو کولی شئ د ټولګي متغیرات او میتودونه وکاروئ API ځواب(دواړه د شرایطو مدیر دننه او بهر). په ټولګي کې API ځواب 4 میتودونه او 5 متغیرونه مخکې تعریف شوي دي؛ موږ به په خورا تفصیل سره په خورا مهم ډول وګورو.

د Python SDK سره د چیک پوائنټ API ساده کول

برياليتوب

د پیل کولو لپاره، دا به ښه نظر وي چې ډاډ ترلاسه کړئ چې د API کال بریالی و او پایله یې بیرته راستانه شوه. د دې لپاره یوه طریقه شتون لري برياليتوب:

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

ریښتیا راګرځي که چیرې د API کال بریالۍ وي (د ځواب کوډ - 200) او غلط که بریالی نه وي (د کوم بل ځواب کوډ). دا د ځواب کوډ پراساس مختلف معلومات ښودلو لپاره د API زنګ وروسته سمدلاسه کارول اسانه دي.

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

د حالت کوډ

د API زنګ وهلو وروسته د ځواب کوډ بیرته راګرځي.

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

د احتمالي ځواب کوډونه: 200,400,401,403,404,409,500,501.

set_success_status

په دې حالت کې، دا ممکن اړین وي چې د بریالیتوب حالت ارزښت بدل کړي. په تخنیکي توګه، تاسو کولی شئ هلته هر څه واچوئ، حتی یو منظم تار. مګر یو ریښتینی مثال به د دې پیرامیټر بیا تنظیم کول د ځینې شرایطو لاندې غلط ته. لاندې، مثال ته پام وکړئ کله چې د مدیریت سرور کې دندې پرمخ ځي، مګر موږ به دا غوښتنه ناکامه وګڼو (موږ به د بریالیتوب متغیر ترتیب کړو. غلط، سره له دې چې د API کال بریالی و او کوډ 200 بیرته راستانه شو).

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

ځواب()

د ځواب میتود تاسو ته اجازه درکوي د ځواب کوډ (status_code) او د غبرګون بدن (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']}

error_message

دا معلومات یوازې هغه وخت شتون لري کله چې د 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-address-range. راځئ چې ووایو چې موږ اړتیا لرو د سبنټ 192.168.0.0/24 ټول IP پتې رامینځته کړو، چې وروستی octet یې 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 کال په کارولو سره ورته ستونزه حل کړو 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 شیانو کې، د بیچ ډول کال 10 ځله ګړندی پرمخ ځي. د شیانو په لوی شمیر کې توپیر به حتی ډیر اغیزمن وي.

اوس راځئ وګورو چې څنګه ورسره کار وکړو set-objects-batch. د دې API کال په کارولو سره، موږ کولی شو هر ډول پیرامیټر بدل کړو. راځئ چې د پتې لومړۍ نیمایي د مخکیني مثال څخه (تر .124 hosts پورې، او رینجونه هم) رنګ سیینا ته تنظیم کړو، او د پتې دویمې نیمایي ته رنګ خاکي وټاکو.

د شیانو رنګ بدلول په تیرو مثال کې رامینځته شوي

from cpapi import APIClient, APIClientArgs

client_args = APIClientArgs(server="192.168.47.240")

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

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

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

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

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

تاسو کولی شئ په یو API کال کې ډیری توکي د کارولو په کارولو سره حذف کړئ حذف-شیان-بیچ. اوس راځئ چې د کوډ مثال وګورو چې ټول کوربه له لارې مخکې جوړ شوي حذف کوي add-objects-batch.

د حذف-آبجیکٹ-بیچ په کارولو سره د شیانو حذف کول

from cpapi import APIClient, APIClientArgs

client_args = APIClientArgs(server="192.168.47.240")

objects_list_ip = []
objects_list_range = []

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

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

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

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

print(delete_objects_batch.data)

ټولې دندې چې د چیک پوائنټ سافټویر نوي ریلیزونو کې څرګندیږي سمدلاسه د API کالونه ترلاسه کوي. په دې توګه، په R80.40 کې داسې "ځانګړتیاوې" لکه بیاکتنې ته بیرته راګرځیدل او سمارټ ټاسک ښکاره شوي، او ورته API تلیفونونه سمدلاسه د دوی لپاره چمتو شوي. سربیره پردې ، ټول فعالیت کله چې د میراث کنسولونو څخه متحد پالیسۍ حالت ته حرکت کوي د API ملاتړ هم ترلاسه کوي. د مثال په توګه ، د سافټویر نسخه R80.40 کې اوږد انتظار شوی تازه کول د میراث حالت څخه متحد پالیسۍ حالت ته د HTTPS تفتیش پالیسۍ حرکت و ، او دې فعالیت سمدلاسه د API تلیفونونه ترلاسه کړل. دلته د کوډ یوه بیلګه ده چې د HTTPS تفتیش پالیسۍ لوړ پوړ کې یو قاعده اضافه کوي چې د تفتیش څخه 3 کټګورۍ (روغتیا، مالیه، دولتي خدمتونه) خارجوي، کوم چې په یو شمیر هیوادونو کې د قانون سره سم د تفتیش څخه منع دي.

د HTTPS تفتیش پالیسۍ ته یو قاعده اضافه کړئ

from cpapi import APIClient, APIClientArgs

client_args = APIClientArgs(server="192.168.47.240")

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

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

د چیک پوائنټ مدیریت سرور کې د Python سکریپټونو چلول

هر څه همداسې دي README.md د کنټرول سرور څخه مستقیم د Python سکریپټونو چلولو څرنګوالي په اړه معلومات لري. دا اسانه کیدی شي کله چې تاسو نشئ کولی د بل ماشین څخه د API سرور سره وصل شئ. ما یو شپږ دقیقې ویډیو ثبت کړه چې په هغه کې زه د ماډل نصبولو ته ګورم cpapi او په کنټرول سرور کې د Python سکریپټونو چلولو ځانګړتیاوې. د مثال په توګه، یو سکریپټ چلول کیږي چې د یوې دندې لپاره د نوي دروازې ترتیب اتومات کوي لکه د شبکې پلټنې د امنیت معاینه. د هغه ځانګړتیاو په مینځ کې چې ما ورسره معامله کړې وه: فنکشن لاهم په Python 2.7 کې نه دی څرګند شوی وتنی، نو د هغه معلوماتو پروسس کولو لپاره چې کارونکي یې ننوځي ، یو فنکشن کارول کیږي raw_input. که نه نو، کوډ د نورو ماشینونو څخه د پیل کولو لپاره ورته دی، یوازې د فعالیت کارول خورا اسانه دي login_as_root، نو د مدیریت سرور خپل کارن نوم ، پټنوم او IP پته بیا مشخص نه کړئ.

د امنیت چیک اپ ګړندي تنظیم کولو لپاره سکریپټ

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

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

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

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

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

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

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

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

main()

د پټنوم قاموس اضافي_pass.conf سره د مثال فایل
{
"passwords" : ["malware","malicious","infected","Infected"],
"phrases" : ["password","Password","Pass","pass","codigo","key","pwd","пароль","Пароль","Ключ","ключ","шифр","Шифр"] }

پایلې

دا مقاله یوازې د کار لومړني امکانات څیړي د Python SDK او ماډل cpapi(لکه څنګه چې تاسو اټکل کړی وي، دا واقعا مترادفات دي)، او په دې ماډل کې د کوډ په مطالعه کولو سره به تاسو د دې سره د کار کولو لپاره حتی نور فرصتونه ومومئ. دا ممکنه ده چې تاسو غواړئ دا د خپلو ټولګیو، دندو، میتودونو او تغیراتو سره ضمیمه کړئ. تاسو کولی شئ تل خپل کار شریک کړئ او په برخه کې د چیک پوائنټ لپاره نور سکریپټونه وګورئ CodeHub په ټولنه کې چیک میټس، کوم چې د محصول پراختیا کونکي او کارونکي دواړه سره یوځای کوي.

خوشحاله کوډینګ او پای ته د لوستلو لپاره مننه!

سرچینه: www.habr.com

Add a comment