По вашему запросу ничего не найдено :(
Убедитесь, что запрос написан правильно, или посмотрите другие наши статьи:
img
Привет! Мы уже рассказывали про операционные системы для устройств Cisco – IOS, IOS-XE, CatOS. В этой статье мы рассмотрим NX-OS и IOS-XR, а также сравним их с традиционной IOS. На верхнем уровне их можно соотнести так: Cisco IOS: используется в borderless сетях (то есть это сети, которые позволяют кому угодно, где угодно и с любого устройства подключаться к корпоративной сети). Например, маршрутизатор ISR2 Cisco 3900 Series использует Cisco IOS; Cisco NX-OS: используется в коммутаторах Cisco Nexus, расположенных в центрах обработки данных. Например, коммутатор Cisco Nexus 7000 работает под управлением Cisco NX-OS; Cisco IOS-XR: используется на маршрутизаторах провайдеров связи. Например, маршрутизатор Cisco XR 12000 Series использует Cisco IOS-XR. Cisco IOS Хотя имя «IOS» появилось позже, операционная система относится к середине 1980-х годов. Cisco IOS была разработана с использованием языка программирования C и имела несколько ограничений, указывающих на то, когда она была разработана. Например, он не поддерживал симметричную многопроцессорную обработку. В результате одна инструкция должна была быть завершена до того, как начнется выполнение другой. Еще одним огромным архитектурным ограничением было использование общего пространства памяти, в результате которого один неправильный процесс мог нанести ущерб другим процессам маршрутизатора. У некоторых платформ марщрутизаторов были обходные пути. Например модульный маршрутизатор Cisco 7513 – он может быть оснащен модулем универсального интерфейса (VIP), который позволяет отдельным линейным картам запускать собственные экземпляры Cisco IOS. Это обеспечило некоторый уровень балансировки нагрузки и избыточности. Еще одна версия Cisco IOS - это IOS-XE, которая запускает Cisco IOS в Linux. В качестве примера можно найти Cisco IOS-XE, работающую на маршрутизаторе Cisco ASR 1000 Series. Благодаря набору функций Linux, Cisco IOS-XE добавляет поддержку симметричной многопроцессорности и отдельных пространств памяти. Однако, помимо своих Linux-подходов, Cisco IOS-XE в основном похожа на традиционную Cisco IOS. Cisco NX-OS Первоначально имевшая название SAN-OS (где акроним SAN обозначался как Storage Area Network), NX-OS предлагает некоторые обширные архитектурные улучшения по сравнению с традиционными Cisco IOS. Хотя первоначально это была 32-разрядная операционная система, с тех пор она превратилась в 64-разрядную ОС. В отличие от Cisco IOS, NX-OS не использует одно пространство памяти и поддерживает симметричную многопроцессорность. Она также имеет превентивную многозадачность, что позволяет высокоприоритетному процессу получить время процессора перед процессом с более низким приоритетом. NX-OS построена на ядре Linux, и поддерживает язык Python для создания сценариев на коммутаторах Cisco Nexus. Кроме того, она имеет несколько функций высокой доступности (high availability), и не загружает сразу все ее функции. Вместо этого можно указать, какие функции вы хотите активировать. Устранение ненужных функций освобождает память и процессор для тех функций, которые вам нужны. Однако когда дело доходит до конфигурации, существует много сходства между NX-OS и Cisco IOS. Cisco IOS-XR Первоначально разработанная для 64-разрядной работы, IOS-XR предлагает множество улучшений, обнаруженных в NX-OS (например, симметричная многопроцессорность, отдельные пространства памяти и активация только тех сервисов, которые необходимы). Однако, хотя NX-OS построена на ядре Linux, IOS-XR построен на микроядре QNX Neutrino Microkernel. Функция IOS-XR, которой нет в NX-OS, - это возможность иметь один экземпляр операционной системы, управляющей несколькими шасси. Кроме того, поскольку IOS-XR ориентирована на среды провайдеров, она предлагает поддержку таких интерфейсов, как DWDM и Packet over SONET. В то время как конфигурация IOS-XR имеет некоторое сходство с традиционной IOS, различия намного заметнее, чем различия в NX-OS. Например, когда вы закончили вводить команды конфигурации, вам необходимо зафиксировать свои изменения, чтобы они вступили в силу и до выхода из режима конфигурации. Примеры конфигурации Чтобы проиллюстрировать некоторые основные конфигурации этих трех операционных систем, рассмотрим следующие примеры. Эти команды были предоставлены маршрутизатору Cisco IOS, коммутатору NX-OS и экземплярам маршрутизатора IOS-XR, работающим в Cisco VIRL. В каждом из следующих примеров показана текущая версия маршрутизатора или коммутатора. Затем мы входим в глобальный режим конфигурации и изменяем имя хоста маршрутизатора или коммутатора, а затем создаем интерфейс Loopback 0, назначая IP-адрес этому интерфейсу, выходя из режима привилегий и выдавая команду show ip interface brief. При назначении IP-адресов интерфейсам Loopback на устройствах следует заметить, что Cisco IOS требует, чтобы маска подсети была введена в десятичной системе с точками, в то время как NX-OS и IOS-XR поддерживают ввод маски подсети с использованием слеша. Также нужно обратить внимание, что перед выходом из режима конфигурации необходимо выполнить команду commit на IOS-XR. Кроме того, только когда мы применяем эту команду, применяется наша обновленная конфигурация имени хоста. IOS: Router>show version Cisco IOS Software, C2900 Software (C2900-UNIVERSALK9-M), Version 15.1(4)M4, RELEASE SOFTWARE (fc2) Technical Support: http://www.cisco.com/techsupport Copyright (c) 1986-2012 by Cisco Systems, Inc. Compiled Thurs 5-Jan-12 15:41 by pt_team ROM: System Bootstrap, Version 15.1(4)M4, RELEASE SOFTWARE (fc1) cisco2911 uptime is 40 seconds System returned to ROM by power-on System image file is "flash0:c2900-universalk9-mz.SPA.151-1.M4.bin" Last reload type: Normal Reload This product contains cryptographic features and is subject to United States and local country laws governing import, export, transfer and use. Delivery of Cisco cryptographic products does not imply third-party authority to import, export, distribute or use encryption. Importers, exporters, distributors and users are responsible for compliance with U.S. and local country laws. By using this product you agree to comply with applicable laws and regulations. If you are unable to comply with U.S. and local laws, return this product immediately. A summary of U.S. laws governing Cisco cryptographic products may be found at: http://www.cisco.com/wwl/export/crypto/tool/stqrg.html If you require further assistance please contact us by sending email to export@cisco.com. Cisco CISCO2911/K9 (revision 1.0) with 491520K/32768K bytes of memory. Processor board ID FTX152400KS 3 Gigabit Ethernet interfaces DRAM configuration is 64 bits wide with parity disabled. 255K bytes of non-volatile configuration memory. 249856K bytes of ATA System CompactFlash 0 (Read/Write) License Info: License UDI: ------------------------------------------------- Device# PID SN ------------------------------------------------- *0 CISCO2911/K9 FTX15246R1P Technology Package License Information for Module:'c2900' ---------------------------------------------------------------- Technology Technology-package Technology-package Current Type Next reboot ----------------------------------------------------------------- ipbase ipbasek9 Permanent ipbasek9 security None None None uc None None None data None None None Configuration register is 0x2102 Router>en Router#conf t Enter configuration commands, one per line. End with CNTL/Z. Router(config)#hostname IOS-ROUTER IOS-ROUTER(config)#interface loopback0 IOS-ROUTER(config-if)# %LINK-5-CHANGED: Interface Loopback0, changed state to up %LINEPROTO-5-UPDOWN: Line protocol on Interface Loopback0, changed state to up IOS-ROUTER(config-if)#ip address 10.1.1.1 255.255.255.255 IOS-ROUTER(config-if)#end IOS-ROUTER# %SYS-5-CONFIG_I: Configured from console by console IOS-ROUTER#show ip int brief Interface IP-Address OK? Method Status Protocol GigabitEthernet0/0 unassigned YES unset administratively down down GigabitEthernet0/1 unassigned YES unset administratively down down GigabitEthernet0/2 unassigned YES unset administratively down down Loopback0 10.1.1.1 YES manual up up Vlan1 unassigned YES unset administratively down down IOS-ROUTER# NX-OS: switch#show version Cisco Nexus Operating System (NX-OS) Software TAC support: http://www.cisco.com/tac Copyright (c) 2002-2010, Cisco Systems, Inc. All rights reserved. The copyrights to certain works contained herein are owned by other third parties and are used and distributed under license. Some parts of this software are covered under the GNU Public License. A copy of the license is available at http://www.gnu.org/licenses/gpl.html. Software BIOS: version 1.3.0 loader: version N/A kickstart: version 5.0(2)N2(1) [build 5.0(2)N2(1)] system: version 5.0(2)N2(1) [build 5.0(2)N2(1)] power-seq: version v1.2 BIOS compile time: 09/08/09 kickstart image file is: bootflash:/sanity-kickstart kickstart compile time: 12/6/2010 7:00:00 [12/06/2010 07:35:14] system image file is: bootflash:/sanity-system system compile time: 12/6/2010 7:00:00 [12/06/2010 08:56:45] Hardware cisco Nexus5010 Chassis ("20x10GE/Supervisor") Intel(R) Celeron(R) M CPU with 2073416 kB of memory. Processor Board ID JAF1228BTAS Device name: BEND-2 bootflash: 1003520 kB Kernel uptime is 0 day(s), 3 hour(s), 30 minute(s), 45 second(s) Last reset Reason: Unknown System version: Service: plugin Core Plugin, Ethernet Plugin, Fc Plugin switch# conf t Enter configuration commands, one per line. End with CNTL/Z. switch(config)# hostname NEXUS-SWITCH NEXUS-SWITCH(config)#interface loopback0 NEXUS-SWITCH(config-if)# ip address 10.2.2.2/32 NEXUS-SWITCH(config-if)#end NEXUS-SWITCH# show ip int brief IP Interface Status for VRF “default” (1) Interface IP Address Interface Status Lo0 10.2.2.2 protocol-up/link-ip/admin-up NEXUS-SWITCH# IOS-XR: RP/0/RP/CPU0:router# show version Mon May 31 02:14:12.722 DST Cisco IOS XR Software, Version 4.1.0[Default] Copyright (c) 2010 by Cisco Systems, Inc. ROM: System Bootstrap, Version 2.100(20100129:213223) [CRS-1 ROMMON], router uptime is 1 week, 6 days, 4 hours, 22 minutes System image file is "bootflash:disk0/hfr-os-mbi-4.1.0/mbihfr-rp.vm" cisco CRS-8/S (7457) processor with 4194304K bytes of memory. 7457 processor at 1197Mhz, Revision 1.2 2 Management Ethernet 8 GigabitEthernet 12 SONET/SDH 12 Packet over SONET/SDH 1 WANPHY controller(s) 1 TenGigE 1019k bytes of non-volatile configuration memory. 38079M bytes of hard disk. 3607592k bytes of disk0: (Sector size 512 bytes). 3607592k bytes of disk1: (Sector size 512 bytes). RP/0/RP/CPU0:router#conf t RP/0/RP/CPU0: router(config)#hostname IOS-XR-ROUTER RP/0/RP/CPU0: router(config)#interface loopback0 RP/0/RP/CPU0: router(config-if)#ip address 10.3.3.3/32 RP/0/RP/CPU0: router(config-if)#commit RP/0/RP/CPU0: IOS-XR-ROUTER (config-if)#end RP/0/RP/CPU0: IOS-XR-ROUTER (config)#show ip int brirf Interface IP-Address Status Protocol Vrf-Name Loopback0 10.3.3.3 Up Up default MgmtEth0/0/CPU0/0 unassigned Shutdown Down default GigabitEthernet0/0/0/0 unassigned Shutdown Down default RP/0/RP/CPU0: IOS-XR-ROUTER#
img
Когда мы только начинаем изучать Python, мы закладываем некоторые вредные привычки при написании кода, о которых мы можем даже не подозревать. Вы можете написать код, который сработает сейчас, но может не сработать в будущем, или вы можете использовать какие-то хитрые ходы вместо встроенной функции, которая могла бы облегчить вашу жизнь. У большинства из нас сохранились не одна из тех вредных привычек при программировании на Python, что формируются в период первых месяцев обучения. Отличная новость в том, что вы можете с легкостью искоренить их, прочитав приведенный ниже текст. 1. Использование import * Каждый раз, когда нам становится лень, то возникает соблазн импортировать все необходимое из модуля с помощью from xyz import *. Это не самый лучший подход по многим причинам. Кот несколько из них: Это может оказаться неэффективно: если в модуле очень много объектов, то вам придется долго ждать, пока все импортируется. Это может вызвать конфликт имен переменных: когда вы используете *, то вы понятия не имеете, какие объекты вы импортируете и как они называются. Как же с этим бороться? Импортируйте либо какой-то конкретный объект, либо весь модуль целиком. # Using import * # Bad from math import * print(floor(2.4)) print(ceil(2.4)) print(pi) # Good import math from math import pi print(math.floor(2.4)) print(math.ceil(2.4)) print(pi) 2. Try/except: отсутствие указания исключения в блоке «except» Я очень долго пренебрегал этим. Сложно посчитать, сколько раз Pycharm давал мне понять (этими противными подчеркиваниями), что не нужно использовать «голое» исключение. Это идет в разрез с рекомендациями PEP8. # Try - except # Bad try: driver.find_element(...) except: print("Which exception?") # Good try: driver.find_element(...) except NoSuchElementException: print("It's giving NoSuchElementException") except ElementClickInterceptedException: print("It's giving ElementClickInterceptedException") Проблема «голых» исключений заключается в том, что оно будет перехватывать исключения SystemExit и KeyboardInterrupt, что затрудняет прерывание программы с помощью Control-C. В следующий раз, когда вы будете использовать try/except, укажите исключение в блоке except. 3. Не использовать Numpy для математических вычислений Очень часто мы забываем, что в Python есть множество пакетов, которые могут значительно облегчить нашу жизнь и сделать ее более продуктивной. Одним из таких пакетов является Numpy – пакет для математических вычислений. Numpy может помочь вам вычислять математические операции быстрее, чем циклы for. Допустим, что у нас есть массив random_scores, и мы хотим получить средний балл тех, кто не сдал экзамен (score>>dict_countries.keys() dict_keys(['USA', 'UK', 'Canada'])>>>dict_countries.values() dict_values([329.5, 67.2, 38]) Проблема тут заключается в том, что мы не всегда используем их должным образом. Например, мы хотим просмотреть словарь и получить ключи. Вы можете использовать метод .keys, но знаете ли вы, что ключи можно получить, просто перебирая словарь? В этом случае использование метода .keys будет излишним. # Not using .keys() properly # Bad for key in dict_countries.keys(): print(key) # Good for key in dict_countries: print(key) Кроме того, можно придумать некоторые хитрости для получения значений словаря, например, с помощью метода .items(). # Not using .items() # Bad for key in dict_countries: print(dict_countries[key]) # Good for key, value in dict_countries.items(): print(key) print(value) 7. Никогда не использовать генераторы (или использовать их всегда) Генератор предлагает более простой синтаксис при создании новой последовательности (списка, словаря и т.д.) на основе уже определенной последовательности. Допустим, мы хотим перевести все элементы в нашем списке countries в нижний регистр. И хотя вы могли бы это сделать просто с помощью цикла for, но также вы можете упростить работу при помощи генератора списка. # Bad countries = ['USA', 'UK', 'Canada'] lower_case = [] for country in countries: lower_case.append(country.lower()) # Good (but don't overuse it!) lower_case = [country.lower() for country in countries] Генераторы – это очень полезно, но не злоупотребляйте ими! Помните правило Дзен Python: «Простое лучше, чем сложное». 8. Использование range(len()) Одни из первых функций, которые мы изучили будучи новичками – это range и len, поэтому не удивительно, почему многие люди имеют дурную привычку писать range(len()) при переборе списков. Допустим у нас есть два списка: countries и populations. Если мы хотим пройтись по обоим спискам одновременно, то, вероятнее всего, вы воспользуетесь range(len()). # Using range(len()) countries = ['USA', 'UK', 'Canada'] populations = [329.5, 67.2, 38] # Bad for i in range(len(countries)): country = countries[i] population = populations[i] print(f'{country} has a population of {population} million people') И хотя это в принципе выполняет свою работу, вы все равно можете упростить задачу, воспользовавшись enumerate (или, что еще лучше, воспользовавшись функцией zip для сопряжения элементов из обоих списков). # OK for i, country in enumerate(countries): population = populations[i] print(f'{country} has a population of {population} million people') # Much Better for country, population in zip(countries, populations): print(f'{country} has a population of {population} million people') 9. Форматирование с помощью оператора + Вероятно, одна из первых вещей, которую мы изучаем в Python, - это то, как соединять строки с помощью оператора +. Это полезный, но не самый эффективный способ соединения строк в Python. Помимо этого, это не очень красиво – чем больше строк вам нужно соединить, тем больше операторов + вы будете использовать. Вместо этого вы можете воспользоваться f-строкой. # Formatting with + operator # Bad name = input("Introduce Name: ") print("Good Morning, " + name + "!") # Good name = input("Introduce Name: ") print(f'Good Morning, {name}') Преимуществом f-строк в том, что они полезны не только для конкатенации, но и для других целей. 10. Использование изменяемых значений в качестве значений по умолчанию Если вы включите изменяемое значение (например, список) в качестве параметра функции по умолчанию, то увидите нечто неожиданное. # Bad def my_function(i, my_list=[]): my_list.append(i) return my_list>>> my_function(1) [1] >>> my_function(2) [1, 2] >>> my_function(3) [1, 2, 3] В приведенном выше коде каждый раз, когда мы вызываем функцию my_function, список my_list сохраняет значения из предыдущих вызовов (а мы, скорее всего, хотим инициировать пустой список при каждом вызове функции). Чтобы избежать такой проблемы, мы должны установить этот параметр my_list равным None и добавить условие if как показано ниже. # Good def my_function(i, my_list=None): if my_list is None: my_list = [] my_list.append(i) return my_list>>> my_function(1) [1] >>> my_function(2) [2] >>> my_function(3) [3]
img
В данной статье будет в общем виде рассмотрен диалплан и его содержимое - контексты и экстеншены в Asterisk. Формат диалплана Диалплан в файле extensions.conf структурирован в секции, называемые контекстами. Контекстом называется сущность внутри диалплана, которая позволяет функционировать его различным частям совершенно независимо. Контексты используются для разделения функций, улучшения безопасности между различными частями диалплана, настройкой классов обслуживания для разных пользователей и так далее. Контексты в диалплане Синтаксис для контекста точно такой же как и во всех конфигурационных файлах Asterisk (файлах с расширением .conf) Для создания контекста просто необходимо поместить его название в квадратные скобки: [telephony-users] Экстеншены в диалплане Внутри каждого контекста необходимо обозначит один или более экстеншенов. Экстеншен по сути это определенный список действий с определенным названием. После набора номера экстеншена, Астериск последовательно выполняет каждое действие. Синтаксис у экстешена следующий: exten => number,priority,application([parameter[,parameter2...]]) К примеру: exten => 101,1,Dial(PJSIP/celecom, 20) В данном случае, номер экстеншена – 101, номер приоритета – 1, используемое приложение – Dial(), с параметрами PJSIP/celecom и 20. Приоритеты Внутри каждого экстеншена должен быть один или более номеров приоритетов. Приоритет это просто число, от 1 до N. Команда с первым приоритетом будет соответственно исполнена первой, после её завершения будет исполняться команда с приоритетом 2 и так далее. Обязательно нужно использовать последовательные числа, иначе выполнение сценария будет прервано. exten => 101,1,выполнить действие exten => 101,2,выполнить другое действие exten => 101,5,выполнить еще какое-то действие В примере выше выполнение сценария прервется после строчки с приоритетом 2, по причине того, что отсутствует приоритет с номером 3. Кроме того, вместо номера приоритета можно указывать литеру n (next). То есть возможен такой сценарий: exten => 101,1,выполнить действие exten => 101,n,выполнить другое действие exten => 101,n,выполнить еще какое-то действие Если не хочется постоянно писать номер экстеншена, можно использовать функцию same. exten => 101,1,NoOp() same => n(repeat),Verbose("Нужно что-то сделать!") same => n,Verbose("Нужно сделать что-то другое!") Порядок обработки диалплана Порядок считывания экстеншенов внутри контекста идёт сверху вниз, причем вложенные контексты обрабатываются первыми. То есть к примеру у вас есть три контекста – X, Y и Z. Если вы хотите чтобы контекст Z обрабатывался первым, просто сделайте его вложенным контекстом для контекста X. Порядок поиска таков: Экстеншены Экстеншены с масками Вложенные экстеншены Переключатели
ВЕСЕННИЕ СКИДКИ
40%
50%
60%
До конца акции: 30 дней 24 : 59 : 59