Hướng dẫn how do i share data between two python scripts? - làm cách nào để chia sẻ dữ liệu giữa hai tập lệnh python?

Chương này, nhằm vào các lập trình viên Python có kinh nghiệm, giải thích cách trao đổi dữ liệu giữa các tập lệnh bằng khu vực dữ liệu được chia sẻ.

Về việc chia sẻ dữ liệu giữa các tập lệnh

Có thể chia sẻ dữ liệu giữa các tập lệnh phát triển cấu hình (CDK). Tính năng này có một loạt các ứng dụng, bao gồm khả năng lưu trữ và sử dụng lại dữ liệu hoặc các chức năng thường được sử dụng bởi các tập lệnh và để thực hiện kiểm soát lớn hơn đối với thứ tự thực thi tập lệnh.

Trình điều khiển thiết bị phân bổ diện tích bộ nhớ cho mỗi thiết bị mà nó quản lý. Điều này được gọi là khu vực dữ liệu được chia sẻ hoặc khu vực được chia sẻ. Dữ liệu được chia sẻ có thể được lưu trữ trong suốt vòng đời của thiết bị, nghĩa là cho đến khi thiết bị không được quản lý hoặc trình điều khiển thiết bị được khởi động lại hoặc cho một giao dịch. Thông tin hiện đang được lưu giữ trong khu vực dữ liệu được chia sẻ có thể được truy cập bởi bất kỳ tập lệnh CDK nào được áp dụng cho thiết bị đó.

Theo mặc định, dữ liệu được lưu trữ trong khu vực được chia sẻ dưới dạng từ điển Python đơn giản nhưng cũng có thể cấu trúc thông tin được chia sẻ bằng các lớp. Nếu bạn muốn sử dụng cấu trúc dựa trên lớp, bạn phải tạo mô-đun Python xác định cấu trúc và chuyển nó cho trình điều khiển thiết bị bằng tùy chọn dòng lệnh.

Giải pháp dựa trên lớp cung cấp một cách tiếp cận dễ quản lý hơn để sử dụng khu vực dữ liệu được chia sẻ. Nó cho phép một số thiết lập ban đầu được thực hiện bởi mô -đun Python để khu vực dữ liệu được chia sẻ chứa dữ liệu hữu ích khi tập lệnh CDK đầu tiên được chạy đối với thiết bị. Điều này tương phản với cấu trúc dựa trên từ điển, trong đó từ điển trống khi tập lệnh CDK đầu tiên chạy và bất kỳ dữ liệu, lớp hoặc chức năng nào phải được thêm bởi chính các tập lệnh CDK.

Chương này mô tả cách lưu trữ thông tin trong khu vực dữ liệu được chia sẻ bằng cách sử dụng các lớp hoặc từ điển, cung cấp một cách tiếp cận ví dụ cho tổ chức tập lệnh để sử dụng khu vực được chia sẻ và phác thảo một số ứng dụng tiềm năng.

Sử dụng các lớp học

Lưu trữ dữ liệu trong khu vực dữ liệu được chia sẻ bằng cấu trúc dữ liệu dựa trên lớp cung cấp việc sử dụng khu vực có thể duy trì.

Cấu trúc của các lớp sẽ được lưu trữ trong khu vực dữ liệu được chia sẻ phải được định nghĩa là mô -đun Python. Mô -đun là một tệp chứa mã xác định một nhóm các hàm Python hoặc các đối tượng khác.

Mô-đun được chạy khi trình điều khiển thiết bị được bắt đầu với tham số dòng lệnh sau:

-SharedDataModule module

trong đó mô -đun là tên của mô -đun Python xác định cấu trúc của thông tin được lưu giữ trong khu vực dữ liệu được chia sẻ.

Ví dụ:

\Program\cisco_device_driver.exe|"-SharedDataModule CreateSharedArea …

Mô -đun Python phải được cài đặt trên mọi máy đang lưu trữ trình điều khiển thiết bị được sử dụng để định cấu hình các tập lệnh.

Note:

Khi chỉ định tên của mô -đun Python, bạn không cần bao gồm phần mở rộng tập lệnh.

Nếu bạn đang chạy trình điều khiển thiết bị trên Solaris, vị trí của mô -đun Python phải được đặt trong biến môi trường PythonPath.

Nếu bạn đang chạy trình điều khiển thiết bị trên Windows, trình điều khiển sẽ tìm mô -đun trong C: \ Program Files \ Oracle Communications \ IP Service Activator \ Program theo mặc định. Biến PythonPath có thể được đặt thành một vị trí thay thế.c:\Program Files\Oracle Communications\IP Service Activator\Program by default. The PYTHONPATH variable may be set to an alternative location.

Mô -đun xác định cấu trúc cơ bản của lớp đối tượng được lưu trữ trong khu vực dữ liệu được chia sẻ và các phương thức có sẵn cho các trường hợp của lớp.

Mô-đun là một tập lệnh do người dùng xác định và có khả năng thay đổi giữa các cài đặt theo nhu cầu của hoạt động. Tối thiểu, nó sẽ cung cấp các phương pháp để chèn các đối tượng mới vào và loại bỏ các đối tượng khỏi khu vực được chia sẻ. Một mô -đun mẫu được cung cấp trong "tập lệnh mẫu để sử dụng khu vực dữ liệu được chia sẻ".

Note:

Tên của hàm mà trình điều khiển thiết bị gọi để tạo cấu trúc dựa trên lớp được mã hóa cứng trong trình điều khiển. Các mô-đun do người dùng xác định phải chứa chức năng CreateSharedObject. Ví dụ:

def CreateSharedObject():
return SharedInfo()

Nếu không có chức năng CreateSharedObject, trình điều khiển sẽ trở lại từ điển.

Hình 5-1 minh họa khu vực dữ liệu chia sẻ dựa trên lớp.

Sử dụng từ điển Python

Nếu tham số dòng lệnh -shareddatamodule không được chuyển cho trình điều khiển thiết bị có liên quan, trình điều khiển sẽ tạo một từ điển trống trong khu vực dữ liệu được chia sẻ khi khởi động.

Từ điển Python là một mảng kết hợp, được triển khai bằng cách sử dụng các bảng băm, cung cấp quyền truy cập vào các giá trị của các số nguyên, chuỗi hoặc các đối tượng Python khác được gọi là các phím. Một khóa cho biết nơi có giá trị từ điển A có thể được cho là. Bởi vì chìa khóa vào từ điển có thể là một cái gì đó không phải là một số, các đối tượng từ điển không có bất kỳ thứ tự ngầm nào liên quan đến nhau. Tuy nhiên, một thứ tự rõ ràng có thể được xác định bằng cấu trúc dữ liệu khác, chẳng hạn như danh sách. Các đối tượng được lưu trữ trong một từ điển có thể thuộc bất kỳ loại nào.

Sau khi được tạo, các vị trí mới có thể được tạo trong một từ điển vì các giá trị được ghi cho chúng, mà không cần phải tạo vị trí trước. Các giá trị được lưu trữ trong từ điển có thể được truy cập và sử dụng bởi các tập lệnh chạy trên cùng một máy chủ.

Hình 5-2 minh họa khu vực dữ liệu chia sẻ dựa trên từ điển.

Hình 5-2 khu vực dữ liệu được chia sẻ dựa trên từ điển

Hướng dẫn how do i share data between two python scripts? - làm cách nào để chia sẻ dữ liệu giữa hai tập lệnh python?

Lưu trữ và truy xuất dữ liệu

Trình điều khiển thiết bị tạo ra hai cửa hàng dữ liệu được chia sẻ cho một thiết bị: một cửa hàng tồn tại suốt đời của thiết bị và một cửa hàng tồn tại suốt đời của giao dịch.

Phương pháp sau đây lấy dữ liệu đã được lưu trữ trong khu vực dữ liệu được chia sẻ trong quá trình giao dịch hiện tại:

_device.getThisCommitSharedData()

Phương pháp sau đây lấy dữ liệu được lưu trữ trong khu vực dữ liệu được chia sẻ trong suốt thời gian của thiết bị:

_device.getLifetimeSharedData()

Khi một tập lệnh có một tham chiếu đến dữ liệu được chia sẻ, nó có thể đọc và ghi dữ liệu vào khu vực.

Kỹ thuật lưu trữ thông tin trong khu vực được chia sẻ phụ thuộc vào việc dữ liệu được lưu trữ dưới dạng lớp hoặc từ điển.

Nếu dữ liệu được chia sẻ được lưu trữ dưới dạng đối tượng lớp, có thể gọi các phương thức được xác định cho lớp. Các phương thức này được xác định trong mô -đun Python có tên trong tham số -shareddatamodule trên dòng lệnh của trình điều khiển thiết bị.

Ví dụ: giả sử sự tồn tại của phương thức insertBeHavior () cho lớp dữ liệu được chia sẻ:

_device.getThisCommitSharedData().insertBehavior(BehaviorX())

chèn một đối tượng của hành vi loại trong khu vực dữ liệu được chia sẻ.

Nếu dữ liệu được lưu trữ trong từ điển, có thể truy cập dữ liệu thông qua khóa của nó. Ví dụ:

Address=_device.getThisCommitSharedData()["IPAddress"]

Một ví dụ về việc sử dụng khu vực dữ liệu được chia sẻ

CDK cung cấp một giải pháp rất linh hoạt để chia sẻ dữ liệu giữa các tập lệnh, cho phép lưu trữ dữ liệu trên mỗi thiết bị trong thời gian sử dụng của thiết bị hoặc trong thời gian tồn tại của giao dịch, không có hạn chế về loại dữ liệu được lưu trữ hoặc cấu trúc được sử dụng để sử dụng tổ chức nó. Do đó, bất kỳ việc sử dụng khu vực dữ liệu được chia sẻ nào cũng có thể hướng đến các nhu cầu cụ thể của hoạt động.

Ví dụ trong phần này minh họa loại xử lý có thể được thực hiện bằng cách sử dụng khu vực dữ liệu được chia sẻ và sử dụng cách tiếp cận dựa trên từ điển để lưu trữ dữ liệu. Điều này có nghĩa là tất cả các lớp và phương thức được xác định trong chính các tập lệnh. Nếu một cách tiếp cận dựa trên lớp được sử dụng, chúng sẽ được xác định trong mô-đun Python được truyền cho trình điều khiển thiết bị trên dòng lệnh. Điều này sẽ đơn giản hóa các tập lệnh dữ liệu, hành vi và bộ điều khiển được áp dụng cho các thiết bị. Một định nghĩa mô -đun python mẫu được cung cấp trong "tập lệnh mẫu để sử dụng khu vực dữ liệu được chia sẻ".

Các loại kịch bản

Để hỗ trợ sử dụng lại chức năng tập lệnh và giảm dự phòng, ví dụ được mô tả trong phần này chia các tập lệnh thành ba loại cơ bản, theo loại chức năng chúng thực hiện:

  • Các tập lệnh dữ liệu xác định dữ liệu cấu hình dành riêng cho một mục tiêu chính sách cụ thể, chẳng hạn như giao diện. define configuration data that is specific to a particular policy target, such as an interface.

  • Các tập lệnh hành vi xác định các chức năng chung có thể được chạy đối với nhiều đối tượng chính sách, ví dụ: xác định chính sách hoặc bản đồ lớp hoặc thực hiện một hoạt động chung như phân tích dữ liệu phân tích hoặc đặt hàng. Khi chạy, một tập lệnh hành vi tạo ra một đối tượng hành vi trong khu vực dữ liệu được chia sẻ. define generic functions that can be run against multiple policy objects, for example, defining policy or class maps, or performing a generic operation such as parsing or ordering data. When run, a behavior script creates a behavior object in the shared data area.

  • Tập lệnh bộ điều khiển quản lý việc thực thi các đối tượng hành vi và tập lệnh dữ liệu (ví dụ: được tạo bởi các tập lệnh hành vi và dữ liệu), ví dụ, bằng cách ưu tiên thứ tự trong đó các đối tượng hành vi và dữ liệu được xử lý.controller script manages the execution of the behavior and data script objects (created by behavior and data scripts), for example, by prioritizing the order in which behavior and data objects are processed.

Note:

Việc phân chia các tập lệnh thành hành vi, dữ liệu và tập lệnh điều khiển được thiết kế để tận dụng tối đa các tính năng được cung cấp bởi khu vực dữ liệu được chia sẻ. Sơ đồ được trình bày trong ví dụ này là một phân loại mẫu và chỉ hoạt động như một minh họa. Bạn có thể chọn phân loại các tập lệnh theo bất kỳ sơ đồ logic nào khác.

Việc phân chia các tập lệnh thành các loại hành vi, dữ liệu và bộ điều khiển tối ưu hóa việc sử dụng lại chức năng được xác định bởi một tập lệnh. Ví dụ: tập lệnh hành vi có thể được áp dụng cho bất kỳ số lượng thiết bị nào để xác định các khía cạnh chung của cấu hình bản đồ chính sách và được kế thừa cho các giao diện có liên quan. Một số tập lệnh dữ liệu riêng biệt xác định thông tin dành riêng cho giao diện và được áp dụng cho từng giao diện có liên quan. Điều này được minh họa trong Hình 5-3.

Hình 5-3 phân chia các tập lệnh thành các loại

Hướng dẫn how do i share data between two python scripts? - làm cách nào để chia sẻ dữ liệu giữa hai tập lệnh python?

Về ví dụ

Ví dụ cho thấy cách áp dụng thay đổi cấu hình cho thiết bị, thực hiện thay đổi đơn giản đối với địa chỉ IP giao diện và mô tả. Mặc dù những thay đổi mà nó thực hiện rất đơn giản, nhưng nó minh họa một số nguyên tắc và nhiệm vụ cơ bản mà bạn có thể muốn sử dụng trong các tập lệnh của riêng bạn. Bao gồm các:

  • Phân tích cấu hình đang chạy của thiết bị và lưu trữ nó trong khu vực dữ liệu được chia sẻ.

    Ví dụ chỉ ra cách truy xuất cấu hình thiết bị một lần và lưu trữ nó trong khu vực dữ liệu được chia sẻ. Cấu hình được lưu trữ được tham chiếu bởi các tập lệnh khác được đặt để chạy đối với thiết bị. Điều này giảm thiểu giao tiếp với thiết bị và cắt giảm lưu lượng mạng.

  • So sánh cấu hình thiết bị mới tiềm năng với cấu hình đã được cài đặt

    Điều này đảm bảo rằng không có việc truyền dữ liệu không cần thiết đến thiết bị nếu, ví dụ, lệnh liên quan đã được cấu hình.

  • Xếp hàng các lệnh sẽ được gửi đến thiết bị.

    Khi các tập lệnh được chạy trên thiết bị, cấu hình mà chúng tạo được lưu trữ trong khu vực dữ liệu được chia sẻ. Khi tất cả các cấu hình được gửi đã được tích lũy, nó sẽ được gửi trong một phiên giao tiếp duy nhất với thiết bị.

  • Ưu tiên thứ tự trong đó chức năng tập lệnh được thực thi.

    Mỗi tập lệnh hành vi gán ưu tiên cho đối tượng hành vi mà nó tạo ra. Tập lệnh bộ điều khiển sắp xếp các đối tượng hành vi và thực thi chúng theo thứ tự ưu tiên của chúng.

Tính năng tập lệnh sau trong ví dụ:

  • Các tập lệnh dữ liệu xác định cấu hình dành riêng cho giao diện:

    • setipaddress.py xác định địa chỉ IP của giao diện defines the IP address of an interface

    • setDescrip.py xác định mô tả của giao diện defines the description of an interface

  • Một tập lệnh hành vi, processInterfaces.py, tạo ra một đối tượng hành vi trong khu vực dữ liệu được chia sẻ, cho thấy mức độ ưu tiên trong đó hành vi phải được chạy.processInterfaces.py, which creates a behavior object in the shared data area, indicating the priority in which the behavior must be run.

  • Ví dụ minh họa một tập lệnh hành vi duy nhất, nhưng có thể có một số tập lệnh hành vi được đặt để chạy đối với một thiết bị. Việc xử lý được thực hiện bởi một tập lệnh hành vi có thể phụ thuộc vào một số xử lý đã được thực hiện bởi một tập lệnh hành vi khác. Ví dụ: tên bản đồ lớp được tạo bởi tập lệnh hành vi có thể đóng vai trò là đầu vào cho tập lệnh hành vi tiếp theo tạo ra bản đồ chính sách.

  • Một tập lệnh bộ điều khiển, hành viandCommandControll.py, sắp xếp các đối tượng hành vi được lưu trữ và gọi một phương thức thực thi được xác định cho mọi hành vi.BehaviorAndCommandController.py, which sorts the stored behavior objects and calls an Execute method that is defined for every behavior.

Hầu hết các quá trình xử lý được thực hiện trên cấu hình hiện tại và mới được thực hiện bằng các phương thức được xác định trong tập lệnh hành vi. Tuy nhiên, chúng không thực sự chạy cho đến khi tập lệnh bộ điều khiển gọi phương thức thực thi của hành vi.

Máy khách Activator dịch vụ IP Truyền thông Oracle cung cấp một phương thức cơ bản để chỉ định thứ tự trong đó các tập lệnh được áp dụng cho một đối tượng, cho phép bạn chỉ định xem tập lệnh có được chạy trước hay sau khi cấu hình tiêu chuẩn thay đổi do trình điều khiển thiết bị thực hiện hay không. Hình 5-4 hiển thị trang lịch trình trong hộp thoại tập lệnh trình điều khiển nơi bạn có thể chỉ định khi tập lệnh được chạy.

Bằng cách chỉ định rằng các tập lệnh dữ liệu và hành vi chạy trước khi cấu hình tiêu chuẩn thay đổi và tập lệnh bộ điều khiển chạy sau các thay đổi, người ta đảm bảo rằng bất kỳ dữ liệu nào mà tập lệnh bộ điều khiển cần xử lý sẽ tồn tại trong khu vực dữ liệu được chia sẻ.

Tất cả các tập lệnh hoạt động trên khu vực dữ liệu được chia sẻ dành riêng cho dữ liệu chỉ được giữ cho giao dịch hiện tại:

  • Các tập lệnh dữ liệu ghi thông tin vào khu vực được chia sẻ, kiểm tra sự tồn tại của cấu hình tiềm năng được lưu trữ cho thiết bị và thêm đầu ra của chúng vào khu vực lưu trữ. Hình 5-5 minh họa tập lệnh dữ liệu đang hoạt động.

    Hình 5-5 tập lệnh dữ liệu ghi dữ liệu cấu hình vào khu vực dữ liệu được chia sẻ

    Hướng dẫn how do i share data between two python scripts? - làm cách nào để chia sẻ dữ liệu giữa hai tập lệnh python?

  • Tập lệnh hành vi ghi một đối tượng hành vi vào khu vực và lưu trữ thông tin về thứ tự cần được thực thi liên quan đến các hành vi khác (có thể có nhiều tập lệnh hành vi chạy đối với một thiết bị trong một giao dịch). Hình 5-6 minh họa tập lệnh hành vi đang hoạt động.

    Hình 5-6 tập lệnh hành vi viết một đối tượng hành vi vào khu vực dữ liệu được chia sẻ

    Hướng dẫn how do i share data between two python scripts? - làm cách nào để chia sẻ dữ liệu giữa hai tập lệnh python?

  • Tập lệnh bộ điều khiển xử lý bất kỳ đối tượng hành vi nào được ghi vào vùng dữ liệu được chia sẻ theo thứ tự ưu tiên của chúng, gọi một phương thức thực thi được xác định cho mỗi đối tượng hành vi. Điều này thực hiện phần thân của cấu hình xử lý, truy xuất và phân tích cú pháp từ thiết bị (nếu nó chưa được truy xuất), so sánh cấu hình hiện có với cấu hình được lưu trữ được tạo bởi các tập lệnh dữ liệu và gửi bất kỳ cấu hình nào cần được gửi đến thiết bị trong một phiên giao tiếp duy nhất. Hình 5-7 minh họa tập lệnh bộ điều khiển đang hoạt động.

    Hình 5-7 đối tượng hành vi xử lý bộ điều khiển bộ điều khiển

    Hướng dẫn how do i share data between two python scripts? - làm cách nào để chia sẻ dữ liệu giữa hai tập lệnh python?

Các phần sau đây cung cấp một danh sách của mỗi tập lệnh. Các tập lệnh cập nhật khu vực GetThiscommitSharedData hoặc đọc dữ liệu từ khu vực, lưu trữ dữ liệu trong một số từ điển. Đó là:

  • Giao diện: Được tạo hoặc cập nhật bởi các tập lệnh dữ liệu với địa chỉ IP và mô tả để định cấu hình giao diện trên thiết bị và bởi tập lệnh hành vi để truy xuất các lệnh mới cho thiết bị: created or updated by the data scripts with the IP address and description with which to configure an interface on a device, and by the behavior script to retrieve new commands for the device

  • Cấu hình: Được sử dụng bởi tập lệnh hành vi để lưu trữ cấu hình thiết bị hiện có: used by the behavior script to store existing device configuration

  • Các lệnh: Được sử dụng bởi tập lệnh hành vi để lưu trữ các lệnh sẽ được truyền đến thiết bị và bởi tập lệnh bộ điều khiển để truy xuất các lệnh để truyền đến thiết bị: used by the behavior script to store the commands to be transmitted to the device, and by the controller script to retrieve commands for transmission to the device

  • Hành vi: Được sử dụng bởi tập lệnh hành vi để lưu trữ thông tin về mức độ ưu tiên mà nó phải được chạy liên quan đến các tập lệnh hành vi khác và bởi tập lệnh bộ điều khiển để gọi phương thức thực thi của mỗi hành vi theo đúng thứ tự.: used by the behavior script to store information about the priority in which it must be run in relation to other behavior scripts, and by the controller script to call each behavior's Execute method in the correct order.

Kịch bản hành vi cũng tạo ra các từ điển bổ sung bên ngoài khu vực GetThiscommitSharedData. Chúng được sử dụng để xử lý cấu hình giao diện hiện có để nó có thể được so sánh với các lệnh mới tiềm năng được cấu hình cho một giao diện. Những từ điển này là:

  • Allinterfaces: Nắm giữ danh sách đầy đủ các giao diện trên thiết bị: holds a complete list of the interfaces on the device

  • InterfaceConfig: Giữ các lệnh có liên quan (nghĩa là các lệnh cấu hình địa chỉ IP và mô tả của giao diện) đã được cấu hình trên một thiết bị cho một giao diện cụ thể: holds the relevant commands (that is, commands that configure the interface's IP address and description) that are already configured on a device for a specific interface

Tập lệnh hành vi cũng tạo ra một danh sách các lệnh cần được gửi đến thiết bị trong một khu vực tạm thời trước khi thêm thông tin này vào từ điển lệnh trong khu vực GetthiscommitSharedData.getThisCommitSharedData area.

Tập lệnh dữ liệu: setipaddress.py

Tập lệnh setipaddress.py xác định địa chỉ IP và mặt nạ dành riêng cho giao diện và sẽ được áp dụng ở cấp độ giao diện thông qua máy khách Activator dịch vụ IP.setIPAddress.py script defines an interface-specific IP address and mask and would be applied at interface level through the IP Service Activator client.

Các phần theo sau cung cấp danh sách tập lệnh setipaddress.py và giải thích về cách tập lệnh hoạt động.setIPAddress.py script listing and an explanation of how the script works.

Liệt kê setipaddress.py

1   #Title: InterfaceIpAddressChanges.
    Version = '1.0'
    #IP Service Activator version: 7.0.0
    #Date: 1-Aug-2008   




9   #begin preamble section
    # Copy this line and paste it into the context field, editing the 
    # IP address and mask as required
    ip="0.0.0.0"
    mask="255.255.255.252"

15  #begin behavior section
    script_name = "INTERFACE_IPADDRESS"
    script_driver_type = "cisco"
    script_type = Interface
    script_device_role = Any
    script_interface_role = Any
    script_apply_when = Before
    script_repeat = False
    script_apply_on_restart = True

25  #begin common section
    # First make sure that there is a section representing interfaces
    if not _device.getThisCommitSharedData().has_key("interfaces"):
      _device.getThisCommitSharedData()["interfaces"]={}

30  interfaces = _device.getThisCommitSharedData()["interfaces"]
    if not interfaces.has_key(_interface.getInterfaceName() ):
      interfaces[_interface.getInterfaceName()]={}

34  #begin install section
    # Store the ip address command
36  ipCmd="ip address "+ ip + " " +mask
    interfaces[_interface.getInterfaceName()]["ip address"]=ipCmd

39  #begin remove section
    # Mark the ip address key as empty
    interfaces[_interface.getInterfaceName()]["ip address"]=""

Giải thích về setipaddress.py

Việc xử lý tập lệnh bắt đầu bằng cách kiểm tra xem có khóa giao diện trong từ điển GetThiscommitSharedData (dòng 27) hay không. Nếu không có khóa nào tồn tại, tập lệnh tạo ra một và làm cho khóa mới được tạo thành một tham chiếu đến một từ điển mới. Trên các dòng 30-32, tập lệnh lấy nội dung của từ điển giao diện và kiểm tra xem một khóa có tồn tại với tên giao diện có liên quan hay không. Nếu không có khóa nào tồn tại, tập lệnh tạo ra một và làm cho khóa mới được tạo thành một tham chiếu đến một từ điển mới. Địa chỉ IP giao diện và mặt nạ sau đó được lưu trữ tại điểm chính xác trong từ điển giao diện (dòng 34-37).getThisCommitSharedData dictionary (line 27). If no key exists, the script creates one and makes the newly-created key a reference to a new dictionary. On lines 30-32, the script retrieves the content of the interfaces dictionary, and checks whether a key exists with the relevant interface name. If no key exists, the script creates one and makes the newly-created key a reference to a new dictionary. The interface IP address and mask is then stored at the correct point in the interfaces dictionary (lines 34-37).

Tập lệnh dữ liệu: setDescrip.py

Tập lệnh SetDescrip.py thực hiện xử lý giống hệt với bản được thực hiện bởi setipaddress.py ngoại trừ mô tả giao diện thay thế địa chỉ IP.setDescription.py script performs processing identical to that performed by setIpAddress.py except that an interface description replaces the IP address.

Phần sau đó cung cấp danh sách tập lệnh SetDescrip.py.setDescription.py script listing.

Liệt kê setDescrip.py

1   #Title: InterfaceDescriptionChanges
    Version = '1.0'
    #IP Service Activator version: 7.0.0
    #Date: 31-Mar-2008




9   #begin preamble section
    description= "PE interface for customer XXX"

12  #begin behavior section
    script_name = "INTERFACE_DESCRIPTION"
    script_driver_type = "cisco"
    script_type = Interface
    script_device_role = Any
    script_interface_role = Any
    script_apply_when = Before
    script_repeat = False
    script_apply_on_restart = True

22  #begin common section
    # first make sure that there is a section representing interfaces
    if not _device.getThisCommitSharedData().has_key("interfaces"):
      _device.getThisCommitSharedData()["interfaces"]={}

    interfaces=_device.getThisCommitSharedData()["interfaces"]
    if not interfaces.has_key(_interface.getInterfaceName() ):
      interfaces[_interface.getInterfaceName()]={}

31  #begin install section
    # Set the description of the interface data
    descCmd="description "+ description
    interfaces[_interface.getInterfaceName()]["description"]=descCmd

36  #begin remove section
    # Mark the description key as empty
    interfaces[_interface.getInterfaceName()]["description"]=""

Tập lệnh hành vi: ProcessInterfaces.py

Các phần theo sau cung cấp danh sách tập lệnh ProcessInterfaces.py và giải thích về cách tập lệnh hoạt động.processInterfaces.py script listing and an explanation of how the script works.

Liệt kê các processInterfaces.py

1   #Title: InterfaceDescriptionChanges
    Version = '1.0'
    #IP Service Activator version: 7.0.0
    #Date: 31-Mar-2008   




9   #begin preamble section
    #N/A

12  #begin behavior section
    script_name = "PROCESS_INTERFACES"
    script_driver_type = "cisco"
    script_type = Interface
    script_device_role = Any
    script_interface_role = Any
    script_apply_when = Before
    script_repeat = False
    script_apply_on_restart = True

22  #begin common section
    #Load the string module
24  import string
    class InterfaceProcessor:
26    def __init__( self ):
27      self.types=("description", "ip address" )
28      def getDeviceConfig(self, command ):
          if not _device.getThisCommitSharedData().has_key("config"):
            _device.getThisCommitSharedData()["config"]={}

34        # Log onto the device, send the command and stash the returned 
          # config split into lines.
          if not _device.getThisCommitSharedData()["config"].has_key(command):
            _device.openSession()
            config = _device.deliverCommand(command )
            _device.closeSession()
            _device.getThisCommitSharedData()["config"][command]=string.split(config,"\n")

40        # Return the content of the [config][command] key
          return _device.getThisCommitSharedData()["config"][command]

43        # Get configuration from the device 
        def getInterfaceConfig( self ):
          config=self.getDeviceConfig("show running config")

47        allinterfaces={}
          interfaceconfig=None
49        for ind in range( 0 , len(config) ):
            str=string.lstrip( config[ind] )

            if ( str.startswith ("interface") ):
53            interfaceconfig={}
              allinterfaces[str]=interfaceconfig
            else:
            if( interfaceconfig ):
57            if( str == "!"):
                interfaceconfig=None
              else:
60              for type in self.types:
61                if ( str.startswith( type )  ):
62                  interfaceconfig[type]=str
          # else not in an interface and do need to look at the line.
          return allinterfaces

66      def Execute(self):

68        # Check for the commands dictionary 
          if not _device.getThisCommitSharedData().has_key("commands"):
            _device.getThisCommitSharedData()["commands"]={}
71        # Check that priority 3 commands exist
          if not _device.getThisCommitSharedData()
["commands"].has_key(3):
            _device.getThisCommitSharedData()["commands"][3]=[]

76        # Check whether there is any required interface configuration
          if not _device.getThisCommitSharedData().has_key("interfaces"):
            return

80        # Retrieve the current configuration from the device
          allOldData=self.getInterfaceConfig()

83        # Loop through the interfaces with required data
          for (name, reqData) in _device.getThisCommitSharedData()["interfaces"].items():
            commands=[]

87          # Get the existing interface config or create an empty object
            if( allOldData.has_key(name) ):
              oldData=allOldData[name]
            else:
              oldData={}
92            # Process each type of config the script can handle in turn 
              if reqData.has_key(type):
94              if(  reqData[type] ):
                if( not oldData.has_key(type) or oldData[type] != reqData[type] ):
                  commands.append( reqData[type] )
                else:
                  if( oldData.has_key(type) ):
                    commands.append( "no " + oldData[type ] )

102        # If there are any interface commands, surround them by enter
          # and exit commands and add them to the list of commands to execute
          if( len( commands )):
            _device.getThisCommitSharedData()["commands"][3].append
("interface " + name)
            _device.getThisCommitSharedData()["commands"][3]=\
            _device.getThisCommitSharedData()["commands"][3] + commands 
 
111         _device.getThisCommitSharedData()["commands"][3].
append("exit")

113 #begin install section
    if not _device.getThisCommitSharedData().has_key("behavior"):
      _device.getThisCommitSharedData()["behavior"]={}

    if not _device.getThisCommitSharedData()["behavior"].has_key(100):
      _device.getThisCommitSharedData()["behavior"][100]=[]

    _device.getThisCommitSharedData()["behavior"][100].append(InterfaceProcessor())

#begin remove section

Giải thích về ProcessInterfaces.py

Phần chung (dòng 22) xác định lớp giao diện có thể thực hiện các tác vụ sau:InterfaceProcessor class that can perform the following tasks:

  • Phân tích cú pháp và lưu trữ cấu hình đã có trên thiết bị

  • Kiểm tra xem có cấu hình mới được gửi đến thiết bị không

  • So sánh cấu hình mới với bất kỳ cấu hình hiện có cùng loại

  • Lưu trữ các lệnh được giao

Lớp học có thể được chia thành hai phần. Phần đầu tiên xác định các phương thức phân tích cú pháp, so sánh và lưu trữ cấu hình, phần thứ hai xác định một phương thức thực thi gọi các phương thức này. Khi tập lệnh được chạy, một đối tượng hành vi được tạo trong khu vực dữ liệu được chia sẻ, bằng cách gọi đến lớp giao diện. Phương thức thực thi được gọi và quá trình xử lý tập lệnh chỉ được thực hiện khi tập lệnh bộ điều khiển gọi phương thức.InterfaceProcessor class. The Execute method is called and the script's processing is performed only when the controller script calls the method.

Mô -đun chuỗi được nhập (dòng 24) cung cấp chức năng theo yêu cầu của quy trình phân tích cú pháp.

Phương thức trình xây dựng __init__ (dòng 26) được chạy tự động khi tên lớp được gọi để tạo một thể hiện. Phương pháp có thể được sử dụng để thực hiện tất cả các thiết lập cần thiết cho lớp.__init__ constructor method (line 26) is run automatically when the class name is called to create an instance. The method can be used to perform all the set up required for the class.

Dòng 27 tạo ra một danh sách các chuỗi, trong đó mỗi chuỗi xác định sự bắt đầu của một dòng cấu hình mà tập lệnh được thiết kế để xử lý. Danh sách các chuỗi này được gán cho các loại biến lớp. Biến này được sử dụng sau đó trong tập lệnh (dòng 93) và cung cấp một phương pháp quản lý dữ liệu có thể duy trì hơn để được xử lý bởi tập lệnh. Nếu tập lệnh cần được cập nhật để xử lý cấu hình bổ sung trong tương lai, một chuỗi mới có thể được thêm vào biến.

Phương thức GetDeviceConfig (dòng 28) hiện được gọi với lệnh Hiển thị Chạy cấu hình. Tuy nhiên, phương thức hỗ trợ bất kỳ lệnh cấu hình nào khác và cung cấp loại chức năng mà bạn có thể muốn xác định trong mô-đun Python khi sử dụng cách tiếp cận dựa trên lớp đối với khu vực dữ liệu được chia sẻ. Phương pháp kiểm tra xem từ điển GetThiscommitSharedData đã có một bản sao của cấu hình đang chạy (được lưu trữ trong từ điển cấu hình). Nếu không, nó đăng nhập vào thiết bị, truy xuất cấu hình, chia nó thành các dòng và lưu trữ nó trong từ điển cấu hình.getDeviceConfig method (line 28) is currently called with the show running config command. The method supports any other configuration command, however, and provides the type of functionality that you may wish to define in a Python module when using a class-based approach to the shared data area. The method checks whether the getThisCommitSharedData dictionary already has a copy of the running configuration (stored in the config dictionary). If not, it logs into the device, retrieves the config, splits it into lines and stores it in the config dictionary.

Phương thức GetInterfaceConfig gọi getDeviceConfig với lệnh hiển thị cấu hình chạy. Sau đó, nó tạo ra một từ điển AllInterfaces (dòng 47) và biến InterfaceConfig và đặt biến thành NOWN. Sau đó, nó chu trình qua từng dòng cấu hình được giữ trong từ điển cấu hình và kiểm tra cấu hình giao diện (dòng 49-50). Khi tìm thấy cấu hình giao diện, phương thức tạo từ điển InterfaceConfig (dòng 53) và thêm một khóa được dán nhãn theo tên của giao diện vào từ điển AllInterfaces trỏ đến từ điển InterfaceConfig. Đối với mỗi chuỗi được gán cho các loại biến lớp (nghĩa là địa chỉ IP và mô tả), phương thức kiểm tra xem dòng cấu hình hiện đang được xử lý bắt đầu với chuỗi (dòng 61). Nếu vậy, nó tạo một khóa trong từ điển InterfaceConfig, lấy giá trị hiện tại của loại làm tên khóa và ghi dòng cấu hình hiện tại vào khóa (dòng 62). Khi đạt được kết thúc cấu hình giao diện (được biểu thị bằng ký tự

\Program\cisco_device_driver.exe|"-SharedDataModule CreateSharedArea …
4) (dòng 57), phương thức sẽ xóa biến InterfaceConfig để đánh dấu rằng trình phân tích cú pháp nằm ngoài cấu hình giao diện. Cuối cùng, phương thức trả về nội dung của từ điển giao diện (dòng 64).getInterfaceConfig method calls getDeviceConfig with the show running config command. It then creates an allinterfaces dictionary (line 47) and an interfaceconfig variable and sets the variable to None. It then cycles through each line of configuration held in the config dictionary and checks for interface configuration (lines 49-50). Where interface configuration is found, the method creates an interfaceconfig dictionary (line 53) and adds a key labelled according to the name of the interface to the allinterfaces dictionary that points to the interfaceconfig dictionary. For each of the strings assigned to the class variable types (i.e. ip address and description), the method checks whether the line of config currently being processed starts with the string (line 61). If so, it creates a key in the interfaceconfig dictionary, taking the current value of type as the key name, and writes the current line of configuration to the key (line 62). When the end of interface configuration is reached (indicated by a
\Program\cisco_device_driver.exe|"-SharedDataModule CreateSharedArea …
4 character) (line 57), the method clears the interfaceconfig variable to mark that the parser is outside of interface configuration. Finally, the method returns the content of the interfaces dictionary (line 64).

Phương thức thực thi được gọi bởi tập lệnh bộ điều khiển khi nó chạy. Nó kiểm tra xem các lệnh từ điển có tồn tại trong từ điển GetthiscommitSharedData hay không và nếu không, tạo ra một (dòng 69-70). Sau đó, nó kiểm tra xem khóa 3 có tồn tại trong từ điển lệnh hay không; Đây là ưu tiên được gán cho các lệnh được tạo bởi hành vi cụ thể này. Có thể có các khóa cho các lệnh được tạo bởi các hành vi khác trong từ điển lệnh. Nếu khóa không tồn tại, phương thức sẽ tạo nó (dòng 72-74).Execute method is called by the controller script when it runs. It checks whether the commands dictionary exists within the getThisCommitSharedData dictionary and, if not, creates one (lines 69-70). It then checks that key 3 exists in the commands dictionary; this is the priority assigned to the commands generated by this particular behavior. There may be keys for commands generated by other behaviors in the commands dictionary. If the key does not exist, the method creates it (lines 72-74).

Trước khi thực hiện bất kỳ xử lý tiếp theo nào, phương thức kiểm tra xem có cấu hình giao diện nào đang chờ được gửi đến thiết bị không (dòng 77-79). Phương pháp kiểm tra xem một từ điển giao diện có tồn tại trong từ điển GetThiscommitSharedData hay không. Đây là từ điển được tạo hoặc cập nhật bởi bất kỳ tập lệnh dữ liệu nào đã chạy đối với thiết bị. Nếu từ điển không tồn tại, không có gì để làm và phương thức trả về.getThisCommitSharedData dictionary. This is the dictionary created or updated by any data scripts that have run against the device. If the dictionary does not exist, there is nothing to do and the method returns.

Phương thức sau đó truy xuất cấu hình hiện tại từ thiết bị bằng cách gọi phương thức GetInterfaceConfig (dòng 81). Sự trở lại của GetInterfaceConfig là từ điển giao diện, vì vậy biến alloldData là một con trỏ đến từ điển.getInterfaceConfig method (line 81). The return of getInterfaceConfig is the interfaces dictionary, so the allOldData variable is a pointer to a dictionary.

Phương thức sau đó lặp qua các giao diện mà cấu hình đã được lưu trữ trong từ điển giao diện (dòng 83-86), truy xuất tên, cặp giá trị của nó (mỗi cặp bao gồm một tên giao diện và cấu hình được đặt vào thiết bị). Phương thức lần lượt xử lý từng cặp, tạo một vùng cho các lệnh của giao diện hiện tại.

Nếu cấu hình được truy xuất (được giữ trong từ điển giao diện) có một khóa có tên khớp với hiện đang được xử lý, phương thức gán nội dung của khóa (nghĩa là tên giao diện trỏ đến cấu hình giao diện hiện tại) cho biến OldData. Nếu không, phương thức tạo ra một từ điển trống (dòng 87-91).oldData. If not, the method creates an empty dictionary (lines 87-91).

Sau đó, mỗi loại cấu hình, tập lệnh có thể xử lý lần lượt được xử lý và phương thức kiểm tra xem có lệnh được lưu trữ cho giao diện không (dòng 93). Nếu lệnh được phân phối không phải là một chuỗi trống và nếu lệnh chưa được cấu hình trên thiết bị (dòng 94) hoặc được cấu hình và không giống với lệnh hiện được lưu trữ cho giao diện (dòng 96), Phương thức thêm lệnh vào danh sách lệnh cho giao diện (97). Nếu lệnh được gửi là một chuỗi trống (nghĩa là, lệnh được định cấu hình không còn được yêu cầu nữa) và lệnh đã được cấu hình trên thiết bị, phương thức sẽ thêm & rsquor; không có 'dạng lệnh của lệnh vào danh sách lệnh cho Giao diện (dòng 100).

Nếu có bất kỳ lệnh nào trong danh sách lệnh, hãy bao quanh chúng bằng các lệnh enter và thoát và thêm chúng vào từ điển của từ điển getthiscommitshareddata từ khóa ưu tiên 3 (dòng 102-111). Các lệnh từ điển lưu trữ các lệnh để thực thi và thứ tự thực thi của chúng.getThisCommitSharedData dictionary's commands dictionary at the priority 3 key (lines 102-111). The commands dictionary stores the commands to execute and their order of execution.

Phần cài đặt (dòng 113) là phần duy nhất của tập lệnh sẽ được thực thi khi tập lệnh được chạy đối với thiết bị. Nó viết một đối tượng hành vi cho từ điển GetThiscommitSharedData bằng cách gọi phương thức giao diện (dòng 119). Các đối tượng hành vi được lưu trữ theo ưu tiên của chúng trong một từ điển hành vi.getThisCommitSharedData dictionary by calling the InterfaceProcessor method (line 119). Behavior objects are stored according to their priority within a behavior dictionary.

Tập lệnh điều khiển: hành viandCommandControll.py

Các phần theo sau cung cấp danh sách tập lệnh hành viandCommandControll.py và giải thích về cách tập lệnh hoạt động.BehaviorAndCommandController.py script listing and an explanation of how the script works.

Liệt kê hành viandcommandcontroll.py

\Program\cisco_device_driver.exe|"-SharedDataModule CreateSharedArea …
0

Giải thích về hành viandCommandControll.py

Kịch bản trước tiên kiểm tra từ điển hành vi trong Từ điển GetThiscommitSharedData (dòng 25). Nếu từ điển tồn tại, tập lệnh lấy các khóa của nó (mỗi tập lệnh hành vi đã viết một khóa cho từ điển hành vi để chỉ ra mức độ ưu tiên mà nó nên được thực thi), lần lượt sắp xếp các khóa/ưu tiên và gọi cho mỗi phương thức thực thi của đối tượng hành vi (các dòng lần lượt (các dòng 26-31).getThisCommitSharedData dictionary (line 25). If the dictionary exists, the script retrieves its keys (each behavior script has written a key to the behavior dictionary to indicate the priority in which it should be executed), sorts the keys/priorities and calls each behavior object's Execute method in turn (lines 26-31).

Sau khi xử lý đối tượng hành vi, tập lệnh kiểm tra xem điều này có dẫn đến các lệnh được ghi vào từ điển của từ điển GetThiscommitSharedData. Tập lệnh sắp xếp các lệnh được lưu trữ theo khóa, các vòng lặp qua tất cả các lệnh được lưu trữ và gửi chúng đến thiết bị (dòng 37-42).getThisCommitSharedData dictionary's commands dictionary. The script sorts the stored commands by key, loops through all of the stored commands and sends them to the device (lines 37-42).

Báo cáo lỗi trong tập lệnh hành vi

Nếu bạn tuân theo các hướng dẫn được nêu để sử dụng khu vực dữ liệu được chia sẻ, chức năng của tập lệnh hành vi không được thực thi cho đến khi nó được gọi bởi tập lệnh bộ điều khiển. Điều này có nghĩa là biến _Result cho thấy sự thành công hoặc thất bại của tập lệnh hiện đang chạy không thể được sử dụng để báo cáo về tập lệnh hành vi. Điều này là do tập lệnh hiện đang chạy khi chức năng của tập lệnh hành vi được thực thi là tập lệnh bộ điều khiển._result variable that indicates the success or failure of the script that is currently running cannot be used to report on the Behavior script. This is because the script that is currently running when the Behavior script's functionality is executed is the Controller script.

Để báo cáo về các lỗi xảy ra khi đối tượng hành vi được thực thi, ID của tập lệnh hành vi và thông tin thất bại phải được lưu trữ trong đối tượng hành vi được tạo bởi tập lệnh. Những chi tiết này sau đó có thể được truy xuất bởi tập lệnh bộ điều khiển khi nó chạy.

Phương thức cấu trúc lớp của tập lệnh hành vi sẽ xác định các biến để giữ các giá trị của các biến _ID và _failure_code, như sau:_id and _failure_code variables, as follows:

\Program\cisco_device_driver.exe|"-SharedDataModule CreateSharedArea …
1

Phương thức thực thi của tập lệnh kiểm tra điều kiện thất bại và nếu xảy ra lỗi, hãy trả về các giá trị biến và thông báo về lỗi, như sau:Execute method checks for a failure condition and, if a failure occurred, returns the variable values and a message about the failure, as follows:

\Program\cisco_device_driver.exe|"-SharedDataModule CreateSharedArea …
2

Tập lệnh bộ điều khiển sử dụng phương thức SendScriptObjectFailure của biến _Result để truy xuất các chi tiết thất bại của tập lệnh hành vi, như sau:_result variable's sendScriptObjectFailure method to retrieve the behavior script's failure details, as follows:

\Program\cisco_device_driver.exe|"-SharedDataModule CreateSharedArea …
3

Các chi tiết này được gửi đến máy chủ chính sách và thông báo được hiển thị trong ngăn lỗi hiện tại trong giao diện người dùng.

Làm thế nào để bạn liên kết hai tệp python với nhau?

Sau đây là các bước để hợp nhất ...
Mở tệp1.TXT và FILE2.txt trong chế độ đọc ..
Mở File3.TXT trong chế độ ghi ..
Đọc dữ liệu từ File1 và thêm nó vào một chuỗi ..
Đọc dữ liệu từ File2 và nối dữ liệu của tệp này đến chuỗi trước ..
Viết dữ liệu từ chuỗi đến File3 ..
Đóng tất cả các tệp ..

Làm cách nào để chia sẻ kịch bản Python?

Làm cách nào để chia sẻ mã của tôi trực tuyến?..
Sử dụng nút "Chia sẻ" trong trình chỉnh sửa.Trình chỉnh sửa Pythonanywhere (từ tab Tệp) cung cấp cho bạn tùy chọn chia sẻ tệp - tìm biểu tượng PaperClip ở đầu trình soạn thảo.....
Sử dụng bảng điều khiển chính.....
Bằng cách xây dựng một ứng dụng web.....
Tái bút - Hoặc bạn có thể đi nơi khác ..

Một kịch bản Python có thể gọi một kịch bản khác không?

Sử dụng phương thức ExecFile () để chạy tập lệnh Python trong một tập lệnh Python khác.Hàm execFile () thực thi tệp mong muốn trong trình thông dịch.Hàm này chỉ hoạt động trong Python 2. Trong Python 3, hàm ExecFile () đã bị xóa, nhưng điều tương tự có thể đạt được trong Python 3 bằng phương thức EXEC ().. The execfile() function executes the desired file in the interpreter. This function only works in Python 2. In Python 3, the execfile() function was removed, but the same thing can be achieved in Python 3 using the exec() method.