Python SDK کے ساتھ چیک پوائنٹ API کو آسان بنانا

Python SDK کے ساتھ چیک پوائنٹ API کو آسان بناناAPIs کے ساتھ تعامل کی پوری طاقت اس وقت ظاہر ہوتی ہے جب پروگرام کوڈ کے ساتھ استعمال کیا جاتا ہے، جب API کے جوابات کا تجزیہ کرنے کے لیے متحرک طور پر API کی درخواستیں اور ٹولز تیار کرنا ممکن ہو جاتا ہے۔ تاہم، یہ اب بھی ناقابل توجہ ہے ازگر سافٹ ویئر ڈویلپمنٹ کٹ (اس کے بعد ازگر SDK کہا جاتا ہے) کے لیے پوائنٹ مینجمنٹ API چیک کریں۔، لیکن بیکار میں. یہ ڈویلپرز اور آٹومیشن کے شوقین افراد کی زندگی کو نمایاں طور پر آسان بناتا ہے۔ Python نے حال ہی میں بہت زیادہ مقبولیت حاصل کی ہے اور میں نے اس خلا کو پُر کرنے اور اہم خصوصیات کا جائزہ لینے کا فیصلہ کیا۔ چیک پوائنٹ API Python ڈویلپمنٹ کٹ. یہ مضمون Habré پر ایک اور مضمون میں ایک بہترین اضافہ کے طور پر کام کرتا ہے۔ چیک پوائنٹ R80.10 API۔ CLI، اسکرپٹس اور مزید کے ذریعے انتظام. ہم دیکھیں گے کہ Python SDK کا استعمال کرتے ہوئے اسکرپٹ کیسے لکھیں اور ورژن 1.6 (R80.40 سے شروع ہونے والے تعاون یافتہ) میں نئی ​​Management API فعالیت کو قریب سے دیکھیں۔ مضمون کو سمجھنے کے لیے، آپ کو APIs اور Python کے ساتھ کام کرنے کی بنیادی معلومات کی ضرورت ہوگی۔

چیک پوائنٹ فعال طور پر API تیار کر رہا ہے اور اس وقت درج ذیل کو جاری کیا گیا ہے۔

Python SDK فی الحال صرف مینجمنٹ API اور کے ساتھ تعامل کی حمایت کرتا ہے۔ Gaia API. ہم اس ماڈیول میں سب سے اہم کلاسز، طریقوں اور متغیرات کو دیکھیں گے۔

Python SDK کے ساتھ چیک پوائنٹ API کو آسان بنانا

ماڈیول کی تنصیب

ماڈیول cpapi سے جلدی اور آسانی سے انسٹال کرتا ہے۔ گیتھب پر آفیشل چیک پوائنٹ ریپوزٹری مدد کے ساتھ PIP. تنصیب کی تفصیلی ہدایات میں دستیاب ہیں۔ README.md. اس ماڈیول کو Python ورژن 2.7 اور 3.7 کے ساتھ کام کرنے کے لیے ڈھال لیا گیا ہے۔ اس مضمون میں، Python 3.7 کا استعمال کرتے ہوئے مثالیں دی جائیں گی۔ تاہم، Python SDK کو چیک پوائنٹ مینجمنٹ سرور (Smart Management) سے براہ راست چلایا جا سکتا ہے، لیکن وہ صرف Python 2.7 کو سپورٹ کرتے ہیں، اس لیے آخری سیکشن ورژن 2.7 کے لیے کوڈ فراہم کرے گا۔ ماڈیول انسٹال کرنے کے فوراً بعد، میں ڈائرکٹریز میں موجود مثالوں کو دیکھنے کا مشورہ دیتا ہوں۔ مثالیں_python2 и مثالیں_python3.

شروع کریں

ہمیں cpapi ماڈیول کے اجزاء کے ساتھ کام کرنے کے قابل ہونے کے لیے، ہمیں ماڈیول سے درآمد کرنے کی ضرورت ہے۔ cpapi کم از کم دو مطلوبہ کلاسیں:

API کلائنٹ и APIClientArgs

from cpapi import APIClient, APIClientArgs

طبقے کے APIClientArgs API سرور اور کلاس سے کنکشن پیرامیٹرز کے لیے ذمہ دار ہے۔ API کلائنٹ API کے ساتھ تعامل کے لیے ذمہ دار ہے۔

کنکشن کے پیرامیٹرز کا تعین کرنا

API سے منسلک ہونے کے لیے مختلف پیرامیٹرز کی وضاحت کرنے کے لیے، آپ کو کلاس کی ایک مثال بنانے کی ضرورت ہے۔ APIClientArgs. اصولی طور پر، اس کے پیرامیٹرز پہلے سے طے شدہ ہیں اور جب اسکرپٹ کو کنٹرول سرور پر چلاتے ہیں، تو ان کی وضاحت کرنے کی ضرورت نہیں ہے۔

client_args = APIClientArgs()

لیکن جب تھرڈ پارٹی ہوسٹ پر چل رہے ہوں، تو آپ کو API سرور کا کم از کم IP ایڈریس یا میزبان نام بتانا ہوگا (جسے مینجمنٹ سرور بھی کہا جاتا ہے)۔ ذیل کی مثال میں، ہم سرور کنکشن پیرامیٹر کی وضاحت کرتے ہیں اور اسے ایک سٹرنگ کے طور پر مینجمنٹ سرور کا 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 اور سیاق و سباق مینیجر کے ذریعے رابطہ قائم کرنا

طبقے کے API کلائنٹ اسے استعمال کرنے کا سب سے آسان طریقہ سیاق و سباق کے مینیجر کے ذریعے ہے۔ 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)

براہ کرم نوٹ کریں کہ مستقبل میں کلاس API کلائنٹ ہر API کال کو چیک کرے گا (طریقے api_call и api_query، ہم ان کے بارے میں تھوڑی آگے بات کریں گے) API سرور پر sha1 فنگر پرنٹ سرٹیفکیٹ۔ لیکن اگر، API سرور سرٹیفکیٹ کے sha1 فنگر پرنٹ کی جانچ کرتے وقت، ایک غلطی کا پتہ چلا (سرٹیفکیٹ نامعلوم ہے یا تبدیل کر دیا گیا ہے)، طریقہ چیک_فنگر پرنٹ مقامی مشین پر خود بخود اس کے بارے میں معلومات شامل کرنے/تبدیل کرنے کا موقع فراہم کرے گا۔ اس چیک کو مکمل طور پر غیر فعال کیا جا سکتا ہے (لیکن اس کی سفارش صرف اس صورت میں کی جا سکتی ہے جب 127.0.0.1 سے منسلک ہوتے وقت API سرور پر اسکرپٹس چلائی جائیں)، 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

لاگ ان_کے ساتھ_api_key طریقہ

api کلید کا استعمال کرنے کا اختیار (منیجمنٹ ورژن R80.40/Management API v1.6 سے شروع ہونے والے تعاون یافتہ، "3TsbPJ8ZKjaJGvFyoFqHFA==" یہ API کلیدی اجازت کے طریقہ کار کے ساتھ مینجمنٹ سرور پر صارفین میں سے ایک کے لیے API کلیدی قدر ہے:

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

طریقہ میں لاگ ان_کے ساتھ_api_key وہی اختیاری پیرامیٹرز دستیاب ہیں جیسا کہ طریقہ کار میں ہے۔ لاگ ان.

لاگ ان_اس_روٹ طریقہ

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 متغیر پہلے سے طے شدہ ہیں؛ ہم سب سے اہم پر مزید تفصیل سے غور کریں گے۔

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.

سیٹ_کامیابی_اسٹیٹس

اس صورت میں، کامیابی کی حیثیت کی قدر کو تبدیل کرنے کی ضرورت ہوسکتی ہے. تکنیکی طور پر، آپ وہاں کچھ بھی رکھ سکتے ہیں، یہاں تک کہ ایک باقاعدہ تار بھی۔ لیکن ایک حقیقی مثال اس پیرامیٹر کو کچھ ساتھ والی شرائط کے تحت False پر دوبارہ ترتیب دینا ہے۔ ذیل میں، اس مثال پر توجہ دیں جب انتظامی سرور پر کام چل رہے ہوں، لیکن ہم اس درخواست کو ناکام سمجھیں گے (ہم کامیابی کا متغیر مقرر کریں گے جھوٹی، اس حقیقت کے باوجود کہ API کال کامیاب رہی اور کوڈ 200 واپس آیا)۔

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

جواب()

جواب کا طریقہ آپ کو رسپانس کوڈ (status_code) اور رسپانس باڈی (باڈی) کے ساتھ لغت دیکھنے کی اجازت دیتا ہے۔

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 کے تمام آئی پی ایڈریسز بنانے کی ضرورت ہے، جس کا آخری آکٹیٹ 5 ہے، ہوسٹ ٹائپ کے آبجیکٹ کے طور پر، اور دیگر تمام آئی پی ایڈریسز کو ایڈریس رینج ٹائپ کے آبجیکٹ کے طور پر لکھنا ہے۔ اس صورت میں، سب نیٹ ایڈریس اور براڈکاسٹ ایڈریس کو خارج کر دیں۔

لہذا، ذیل میں ایک اسکرپٹ ہے جو اس مسئلے کو حل کرتا ہے اور میزبان قسم کے 50 آبجیکٹ اور ایڈریس رینج کی قسم کے 51 آبجیکٹ بناتا ہے۔ مسئلہ حل کرنے کے لیے، 101 API کالز درکار ہیں (فائنل پبلش کال کو شمار نہیں کرتے)۔ اس کے علاوہ، timeit ماڈیول کا استعمال کرتے ہوئے، ہم تبدیلیوں کے شائع ہونے تک اسکرپٹ پر عمل درآمد کرنے میں لگنے والے وقت کا حساب لگاتے ہیں۔

ایڈ ہوسٹ اور ایڈ ایڈریس رینج کا استعمال کرتے ہوئے اسکرپٹ

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 گنا تیز چلتی ہے۔ اشیاء کی ایک بڑی تعداد پر فرق اور بھی زیادہ متاثر کن ہوگا۔

اب دیکھتے ہیں کہ کس طرح کام کرنا ہے۔ سیٹ-آبجیکٹ-بیچ. اس 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 کال میں متعدد اشیاء کو حذف کر سکتے ہیں۔ ڈیلیٹ-آبجیکٹ-بیچ. اب آئیے ایک کوڈ کی مثال دیکھتے ہیں جو پہلے کے ذریعے بنائے گئے تمام میزبانوں کو حذف کر دیتا ہے۔ 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")

چیک پوائنٹ مینجمنٹ سرور پر ازگر کی اسکرپٹس چلانا

سب کچھ ایک جیسا ہے۔ README.md کنٹرول سرور سے براہ راست Python اسکرپٹ کو چلانے کے بارے میں معلومات پر مشتمل ہے۔ یہ اس وقت آسان ہو سکتا ہے جب آپ کسی دوسری مشین سے API سرور سے رابطہ قائم کرنے سے قاصر ہوں۔ میں نے چھ منٹ کی ویڈیو ریکارڈ کی جس میں میں ماڈیول کو انسٹال کرتے ہوئے دیکھتا ہوں۔ cpapi اور کنٹرول سرور پر Python اسکرپٹ چلانے کی خصوصیات۔ مثال کے طور پر، ایک اسکرپٹ چلایا جاتا ہے جو نیٹ ورک آڈیٹنگ جیسے کام کے لیے نئے گیٹ وے کی ترتیب کو خودکار کرتا ہے۔ سیکیورٹی چیک اپ. ان خصوصیات میں سے جن سے مجھے نمٹنا تھا: فنکشن ابھی تک ازگر 2.7 میں ظاہر نہیں ہوا ہے۔ ان پٹ، لہذا صارف کے داخل کردہ معلومات پر کارروائی کرنے کے لئے، ایک فنکشن استعمال کیا جاتا ہے۔ خام_ان پٹ. بصورت دیگر، کوڈ وہی ہے جو دوسری مشینوں سے لانچ کرنے کے لیے ہے، صرف فنکشن کو استعمال کرنا زیادہ آسان ہے۔ لاگ ان_اس_روٹتاکہ آپ اپنا صارف نام، پاس ورڈ اور مینیجمنٹ سرور کا 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

نیا تبصرہ شامل کریں