پٿون SDK سان چيڪ پوائنٽ API کي آسان ڪرڻ

پٿون SDK سان چيڪ پوائنٽ API کي آسان ڪرڻAPIs سان رابطي جي مڪمل طاقت ظاهر ٿئي ٿي جڏهن پروگرام ڪوڊ سان گڏ استعمال ڪيو وڃي، جڏهن اهو ممڪن ٿئي ٿو ته متحرڪ طور تي API درخواستون ۽ اوزار پيدا ڪرڻ API جوابن جو تجزيو ڪرڻ لاءِ. بهرحال، اهو اڃا تائين اڻڄاتل رهي ٿو پٿون سافٽ ويئر ڊولپمينٽ کٽ (هتي پٿون SDK جي طور تي حوالو ڏنو ويو آهي). چيڪ پوائنٽ مينيجمينٽ API، پر بيڪار. اهو خاص طور تي ڊولپرز ۽ آٽوميشن جي شوقينن جي زندگي کي آسان بڻائي ٿو. پٿون تازو ئي تمام گهڻي مقبوليت حاصل ڪئي آهي ۽ مون ان خال کي ڀرڻ ۽ بنيادي خصوصيتن جو جائزو وٺڻ جو فيصلو ڪيو. چيڪ پوائنٽ API پٿون ڊولپمينٽ کٽ. هي مضمون هيبري تي هڪ ٻئي مضمون ۾ هڪ بهترين اضافي طور ڪم ڪري ٿو چيڪ پوائنٽ R80.10 API. CLI ذريعي ڪنٽرول، اسڪرپٽ ۽ وڌيڪ. اسان ڏسنداسين ته ڪيئن لکجي اسڪرپٽس کي استعمال ڪندي Python SDK ۽ ويجھو نظر وٺو نئين مئنيجمينٽ API ڪارڪردگي تي نسخو 1.6 ۾ (سپورٽ شروع ٿيندڙ R80.40). مضمون کي سمجهڻ لاءِ، توهان کي APIs ۽ Python سان ڪم ڪرڻ جي بنيادي ڄاڻ جي ضرورت پوندي.

چيڪ پوائنٽ فعال طور تي ترقي ڪري رهيو آهي API ۽ هن وقت هيٺيون جاري ڪيون ويون آهن:

Python SDK في الحال صرف انتظام API سان رابطي جي حمايت ڪري ٿو ۽ Gaia API. اسان هن ماڊل ۾ سڀ کان اهم طبقن، طريقن ۽ متغيرن کي ڏسنداسين.

پٿون SDK سان چيڪ پوائنٽ API کي آسان ڪرڻ

ماڊل انسٽال ڪرڻ

ماڊلول cpapi کان جلدي ۽ آساني سان انسٽال github تي سرڪاري چيڪ پوائنٽ مخزن مدد سان pip. تفصيلي تنصيب جون هدايتون موجود آهن README.md. هي ماڊل پائٿون ورزن 2.7 ۽ 3.7 سان ڪم ڪرڻ لاءِ ٺاهيل آهي. هن آرٽيڪل ۾، پٿون 3.7 استعمال ڪندي مثال ڏنا ويندا. بهرحال، پٿون SDK سڌو سنئون چيڪ پوائنٽ مئنيجمينٽ سرور (سمارٽ مئنيجمينٽ) مان هلائي سگھجي ٿو، پر اهي صرف پٿون 2.7 کي سپورٽ ڪن ٿا، تنهن ڪري آخري سيڪشن 2.7 ورزن لاءِ ڪوڊ مهيا ڪندو. ماڊل کي انسٽال ڪرڻ کان پوءِ فوري طور تي، مان سفارش ڪريان ٿو ڏسجي مثالن کي ڊائريڪٽرن ۾ مثال_python2 и مثال_python3.

شروع ڪرائڻ

اسان کي سي پي پي ماڊل جي اجزاء سان ڪم ڪرڻ جي قابل ٿيڻ لاء، اسان کي ماڊل مان درآمد ڪرڻ جي ضرورت آهي. cpapi گهٽ ۾ گهٽ ٻه گهربل طبقا:

API ڪلائنٽ и APIClientArgs

from cpapi import APIClient, APIClientArgs

ڪلاس APIClientArgs API سرور، ۽ طبقي سان ڪنيڪشن پيٽرولر لاء ذميوار آهي API ڪلائنٽ 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 ۽ context مينيجر ذريعي ڳنڍڻ

ڪلاس API ڪلائنٽ ان کي استعمال ڪرڻ جو سڀ کان وڌيڪ آسان طريقو حوالو مينيجر جي ذريعي آهي. اهو سڀ ڪجهه منظور ٿيڻ جي ضرورت آهي APIClient ڪلاس جي مثال ۾ ڪنيڪشن پيٽرولر جيڪي اڳئين قدم ۾ بيان ڪيا ويا آهن.

with APIClient(client_args) as client:

حوالو مينيجر خودڪار طور تي API سرور ڏانهن لاگ ان ڪال نه ڪندو، پر اهو هڪ لاگ آئوٽ ڪال ڪندو جڏهن ان کان ٻاهر نڪرندو. جيڪڏهن ڪجهه سببن لاءِ لاگ آئوٽ گهربل نه آهي API ڪالن سان ڪم ڪرڻ کان پوءِ، توهان کي ضرورت آهي ڪم ڪرڻ شروع ڪرڻ کان سواءِ ڪنٽينيڪٽ مئنيجر:

client = APIClient(clieng_args)

ڪنيڪشن چيڪ ڪندي

چيڪ ڪرڻ جو آسان طريقو اهو آهي ته ڇا ڪنيڪشن مخصوص پيٽرولن سان ملندو آهي طريقو استعمال ڪندي چيڪ_فنگر پرنٽ. جيڪڏهن سرور API سرٽيفڪيٽ جي فنگر پرنٽ لاءِ sha1 hash sum جي تصديق ناڪام ٿئي ٿي (طريقو واپس آيو ڪوڙي)، پوء اهو عام طور تي ڪنيڪشن جي مسئلن جي سبب آهي ۽ اسان پروگرام جي عمل کي روڪي سگهون ٿا (يا صارف کي ڪنيڪشن ڊيٽا کي درست ڪرڻ جو موقعو ڏيو):

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

مهرباني ڪري نوٽ ڪريو ته مستقبل ۾ ڪلاس API ڪلائنٽ هر API ڪال چيڪ ڪندو (طريقو api_call и api_query، اسان انهن بابت ٿورو اڳتي ڳالهائينداسين) sha1 فنگر پرنٽ سرٽيفڪيٽ API سرور تي. پر جيڪڏهن، API سرور سرٽيفڪيٽ جي sha1 فنگر پرنٽ جي جانچ ڪندي، هڪ غلطي معلوم ٿئي ٿي (سرٽيفڪيٽ نامعلوم آهي يا تبديل ڪيو ويو آهي)، طريقو چيڪ_فنگر پرنٽ خودڪار طريقي سان مقامي مشين تي ان بابت معلومات شامل ڪرڻ/تبديل ڪرڻ جو موقعو فراهم ڪندو. هي چيڪ مڪمل طور تي غير فعال ٿي سگهي ٿو (پر اهو صرف ان صورت ۾ سفارش ڪري سگهجي ٿو جڏهن اسڪرپٽس API سرور تي هلن ٿيون، جڏهن 127.0.0.1 سان ڳنڍي رهيا آهن)، APIClientArgs دليل استعمال ڪندي - unsafe_auto_accept (APIClientArgs جي باري ۾ وڌيڪ ڏسو اڳ ۾ "ڪنيڪشن جي وضاحت ڪرڻ" ۾).

client_args = APIClientArgs(unsafe_auto_accept=True)

API سرور ۾ لاگ ان ڪريو

У API ڪلائنٽ 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

لاگ ان_with_api_key طريقو

آپشن استعمال ڪندي api key (مديري ورزن R80.40/Management API v1.6 کان شروع ٿيندڙ سپورٽ، "3TsbPJ8ZKjaJGvFyoFqHFA==" هي آهي API ڪيئي قدر استعمال ڪندڙن مان هڪ لاءِ مئنيجمينٽ سرور تي API ڪيئي اختيار ڪرڻ واري طريقي سان):

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

طريقي سان لاگ ان_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_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 طريقو آهي جيڪو خودڪار طريقي سان ڪم ڪري ٿو. ڪالن جا مثال جتي ھن طريقي جي ضرورت آھي: شو-سيشن، شو-ميزبان، شو-نيٽ ورڪ، شو-وائلڊ ڪارڊ، شو-گروپ، شو-پتا-رينجز، شو-سادو-گيٽ ويز، ڏيکاريو-سادو-ڪلسٽر، شو-پهچ-رول، ڏيکاريو-قابل اعتماد-ڪلائنٽ، ڏيکاريو پيڪيجز. حقيقت ۾، اسان انهن API ڪالن جي نالي ۾ جمع لفظ ڏسون ٿا، تنهن ڪري اهي ڪالز آسان ٿي ويندا api_query

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

هن درخواست لاء آئوٽ پٽي هيٺ ڏنل:

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

پروسيسنگ API ڪالن جا نتيجا

ان کان پوءِ توھان استعمال ڪري سگھوٿا ڪلاس جا متغير ۽ طريقا API جواب(ٻنهي جي حوالي سان مئنيجر جي اندر ۽ ٻاهر). ڪلاس ۾ API جواب 4 طريقا ۽ 5 متغير اڳ ۾ بيان ڪيا ويا آھن؛ اسان وڌيڪ تفصيل سان سڀ کان وڌيڪ اھم تي رھنداسين.

پٿون SDK سان چيڪ پوائنٽ API کي آسان ڪرڻ

ڪاميابي

شروع ڪرڻ سان، اهو هڪ سٺو خيال هوندو ته پڪ ڪرڻ لاء ته 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 ۾ شامل ڪيون ويون آھن.

پهرين، اچو ته ڏسو ته ڪالون ڪيئن ڪم ڪن ٿيون اضافو ميزبان и اضافو-پتا- حد. اچو ته چئو ته اسان کي سب نيٽ 192.168.0.0/24 جي سڀني IP پتي ٺاهڻ جي ضرورت آهي، جنهن جو آخري آڪٽٽ 5 آهي، ميزبان قسم جي شين جي طور تي، ۽ ٻين سڀني IP پتي کي ايڊريس جي حد جي قسم جي شين جي طور تي لکو. انهي صورت ۾، سب نيٽ ايڊريس ۽ براڊ ڪاسٽ ايڊريس کي خارج ڪريو.

تنهن ڪري، هيٺ ڏنل هڪ اسڪرپٽ آهي جيڪو هن مسئلي کي حل ڪري ٿو ۽ ميزبان جي قسم جي 50 شيون ۽ ايڊريس جي حد جي قسم جي 51 شيون ٺاهي ٿو. مسئلو حل ڪرڻ لاءِ، 101 API ڪالون گھربل آھن (فائنل پبلش ڪال جي ڳڻپ نه ڪندي). انهي سان گڏ، ٽائمٽ ماڊل استعمال ڪندي، اسان ان وقت جو اندازو لڳايو آهي جيڪو اسڪرپٽ تي عمل ڪرڻ ۾ وٺندو آهي جيستائين تبديليون شايع نه ٿينديون آهن.

اسڪرپٽ استعمال ڪندي 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)

سڀئي فنڪشن جيڪي ظاهر ٿين ٿا چيڪ پوائنٽ سافٽ ويئر جي نئين رليز ۾ فوري طور تي API ڪالون حاصل ڪن ٿيون. اهڙيءَ طرح، R80.40 ۾ اهڙيون ”فيچرز“ جيئن Revert to revision ۽ Smart Task ظاهر ٿيا، ۽ لاڳاپيل API ڪالون انهن لاءِ فوري طور تي تيار ڪيون ويون. ان کان علاوه، سڀ ڪارڪردگي جڏهن Legacy ڪنسولز کان متحد پاليسي موڊ ڏانهن منتقل ٿئي ٿي API جي مدد پڻ حاصل ڪري ٿي. مثال طور، سافٽ ويئر ورزن R80.40 ۾ ڊگھي انتظار جي تازه ڪاري هئي HTTPS انسپيڪشن پاليسي کي Legacy mode کان Unified Policy mode ڏانهن منتقل ڪيو ويو، ۽ هن ڪارڪردگي کي فوري طور تي API ڪالون مليون. هتي ڪوڊ جو هڪ مثال آهي جيڪو HTTPS انسپيڪشن پاليسي جي مٿين پوزيشن ۾ هڪ ضابطو شامل ڪري ٿو جيڪو 3 قسمن جي چڪاس کان خارج ڪري ٿو (صحت، ماليات، سرڪاري خدمتون)، جيڪي ڪيترن ئي ملڪن ۾ قانون جي مطابق چڪاس کان منع ٿيل آهن.

HTTPS انسپيڪشن پاليسي ۾ ضابطو شامل ڪريو

from cpapi import APIClient, APIClientArgs

client_args = APIClientArgs(server="192.168.47.240")

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

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

چيڪ پوائنٽ مئنيجمينٽ سرور تي پٿون اسڪرپٽ هلائڻ

سڀ ڪجهه ساڳيو آهي README.md پٿون اسڪرپٽ کي سڌو سنئون ڪنٽرول سرور مان ڪيئن هلائڻ جي معلومات تي مشتمل آهي. اهو آسان ٿي سگهي ٿو جڏهن توهان ٻئي مشين کان API سرور سان ڳنڍڻ ۾ ناڪام آهيو. مون هڪ ڇهن منٽن جي وڊيو رڪارڊ ڪئي جنهن ۾ مان ماڊل کي انسٽال ڪندي ڏسان ٿو cpapi ۽ ڪنٽرول سرور تي پٿون اسڪرپٽ هلائڻ جون خاصيتون. مثال طور، ھڪ اسڪرپٽ ھلايو ويندو آھي جيڪو ھڪڙي ڪم لاءِ نئين گيٽ وي جي ٺاھ جوڙ کي خودڪار ڪري ٿو جيئن نيٽ ورڪ آڊيٽنگ سيڪيورٽي چيڪ اپ. انهن خاصيتن مان جن سان مون کي معاملو ڪرڻو هو: فنڪشن اڃا تائين پٿون 2.7 ۾ ظاهر نه ٿيو آهي ان پٽ، تنهنڪري معلومات کي پروسيس ڪرڻ لاءِ جيڪو صارف داخل ڪري ٿو، هڪ فنڪشن استعمال ڪيو ويندو آهي raw_input. ٻي صورت ۾، ڪوڊ ساڳيو آهي جيئن ٻين مشينن مان لانچ ڪرڻ لاء، صرف ان کي استعمال ڪرڻ وڌيڪ آسان آهي فنڪشنل لاگ ان_as_root, ته جيئن توهان جو پنهنجو يوزرنيم، پاسورڊ ۽ IP پتو مئنيجمينٽ سرور جو ٻيهر بيان نه ڪيو وڃي.

سيڪيورٽي چيڪ اپ جي تڪڙي سيٽ اپ لاءِ اسڪرپٽ

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

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

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

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

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

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

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

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

main()

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

ٿڪل

هي مضمون صرف ڪم جي بنيادي امڪانن جي جانچ ڪري ٿو پٿن ايس ڊي آر ۽ ماڊل cpapi(جيئن توهان اندازو لڳايو هوندو، اهي اصل ۾ مترادف آهن) ۽ هن ماڊل ۾ ڪوڊ پڙهڻ سان توهان ان سان ڪم ڪرڻ ۾ اڃا به وڌيڪ امڪان ڳوليندا. اهو ممڪن آهي ته توهان ان کي پنهنجي طبقن، افعال، طريقن ۽ متغيرن سان پورو ڪرڻ چاهيندا. توھان ھميشہ پنھنجو ڪم شيئر ڪري سگھو ٿا ۽ سيڪشن ۾ چيڪ پوائنٽ لاءِ ٻيون لکتون ڏسي سگھو ٿا ڪوڊ هب ڪميونٽي ۾ چيڪ ميٽس، جيڪو ٻنهي پراڊڪٽ ڊولپرز ۽ صارفين کي گڏ ڪري ٿو.

خوش ڪوڊنگ ۽ آخر تائين پڙهڻ لاءِ مهرباني!

جو ذريعو: www.habr.com

تبصرو شامل ڪريو