Cisco SPA Provisioning

Приехала новая авая с новыми телефонами, какой же это шлак) Дизайнеры(как внешнего вида так и самой логики атс) Аваи наверное теперь работают таксидермистами, и на самом деле этот лис их рук дело. Дык вот, настройка аваефонов производиться прямо с атски, и разгорелся у нас с коллегой спор кто быстрее введет в эксплуатацию АТС с провиженом итд(короч одинаковым функционалом) (он на авае я на Астериске). Из неописанного мной была настройка провижена на цыскофонах, пора исправлять).
Provision – (англ.) обеспечение, предоставление; снабжение — Достал телефон с коробки, воткнул — работает.

  1.  Процесс загрузки телефона
  2. Формат файлов

1. Процесс загрузки:

  • Тестируем питание(PoE или от адаптера)
  • POST(тестируем железо)
  • CDP, VTP и DHCP
  • Получаем по DHCP(IP, opt: 66(TFTP), 150(Cisco current usage), 159(Server’s ip-address https), 160(Server’s name https))
  • Получив адрес сервера, откуда забрать конфиг, наш телефончик делает запрос конфига /spa$PSN.сfg
  • Сервер отдает конфиг /spa$PSN.сfg(например для модели SPA504G файл будет называться /spa504G.cfg)
  • Телефон получив этот конфиг, смотрит какой конфиг(xml) ему грузить дальше, и запрашивает новый конфиг
  • Сервер отдает xml файл с настройками
  • Телефон применяет настройки и перезагружается

Настройки телефонов можно сгружать и по http с использованием php скрипта, для этого опцию 66 приводим к виду(на микротике)

/ip dhcp-server option add code=66 name=tftp value="'http://10.199.133.9/cisco.php\?mac=\$MA&sn=\$SN'" /ip dhcp-server network set dhcp-option=tftp 0 

2. Телефон поддерживает 2 формата файлов: открытый с xml подобным синтаксисом(можем сжать gzipом и зашифровать AES256), и плейн текст(параметр-значение), который потом с помощью SPC мы конвертируем в бинарный файл (не нравится мне так)
Для сжатия под Никсами делаем gzip profile.xml получаем gz файлик, телефончик его тоже радостно примет
После этого можем зашифровать файл с помощью openssl и определенным ключем, передать по https ключ в телефон, потом по http забрать зашифрованный конфиг.
openssl enc –e –aes-256-cbc –k SecretPhrase1234 –in profile.xml.gz –out profile.cfg

Учимся делать простой rsync
Создаем файл basic.txt
следующего содержания:

<flat-profile>
<GPP_A> 12345678
</GPP_A>
</flat-profile>

в браузере делаем ресинк
http://192.168.1.100/admin/resync?tftp://192.168.1.200/basic.txt
Смотрим параметр, и о чудо он поменялся))
Ресинк также доступен и через sip notify.

Пример Файла /spa$PSN.сfg

<flat-profile>
<Resync_On_Reset>Yes</Resync_On_Reset>
<Profile_Rule>/525/spa$MA.xml</Profile_Rule>
</flat-profile>

Небольшие пояснения к синтаксису файла:
Телефон понимает только то что находиться между flat-profile
Названия параметров заключены в угловые скобки
Названия не должны содержать пробелов и спец символов(заменяем на _)
Названия параметров должны быть уникальны
Для параметров которые содержат порядковый номер, например номер линии параметр записывается так: Dial_Plan[1]
Теги обязательно должны закрываться
Названия параметров чувствительны к регистру
Неправильно написанные(не распознанные) параметры игнорируются
Допускается только закрывающийся тег  <Profile_Rule_B />
Для предотвращения перезаписи параметров, можно использовать такую конструкцию
<Speed_Dial_2_2_ ua=”rw”/>
<Speed_Dial_3_2_ ua=”rw”/>

Допускается установка пустого значения(между тегами не указываем ничего)
Допускается использование комментариев в xml стиле
XML хедер игнорируется
Можно заменять спец символы на xml последовательности
Поддерживаются только ASCII коды

& (ampersand)   &amp;
< (less than)   &lt;
> (greater than)  &gt;
’ (apostrophe)  &apos;
” (double quote)  &quot;

Для предотвращения шаловливых действия пользователя, используется атрибут ua с параметрами:
• na—no access
• ro—read-only
• rw—read/write
Пример:
<SIP_TOS_DiffServ_Value_1_ ua=”na”/>

GPP (general purpose parameters) используются при обращении к конкретным серверам провижена, могут содержать
• Encryption keys
• URLs
• Multi-stage provisioning status information
• Post request templates
• Parameter name alias maps
• Partial string values, eventually combined into complete parameter values

GPP_SA — GPP_SD используются как аргументы ключей URL параметров
Например можно использовать параметры заданные в GPP для указания папки:
tftp://server.local/cisco/$B/$MA.cfg

Для того чтобы посмотреть опции доступные для конфигурирования достаточно скачать SPC под Ваш телефон и версию прошивки, распаковать и выполнить spcexecuteable —sample-xml outputfile.name
читаем тот самый outputfile.name и черпаем полезную информацию)

Собственно, если что пропустил готов рассмотреть.
Ниже приведены файлы для всех телефончиков и для конкретного аппарата)
Пример общего конфига для всего семейства: spa525G2.cfg

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<flat-profile>
<!-- System Configuration -->
<Enable_Web_Server ua="na">Yes</Enable_Web_Server>
<Web_Server_Port ua="na">80</Web_Server_Port>
<Enable_Web_Admin_Access ua="na">Yes</Enable_Web_Admin_Access>
<Admin_Password ua="na">sdtu</Admin_Password>
<User_Password ua="rw"></User_Password>
<SPA525-protocol ua="na">SIP</SPA525-protocol> <!-- options: SIP/SCCP -->
<SPA525-auto-detect-sccp ua="na">No</SPA525-auto-detect-sccp>
<Phone-UI-user-mode ua="na">No</Phone-UI-user-mode>
<SPA525-readonly ua="na">No</SPA525-readonly>
<!-- Configuration Profile -->
<Resync_On_Reset>Yes</Resync_On_Reset>
<Upgrade_Enable ua="na">Yes</Upgrade_Enable>
<Upgrade_Rule>( < 7.5.2b )? tftp://10.199.36.199/525/spa525g-7-5-2b-bt.bin | tftp://10.199.36.199/525/spa525g-7-5-5-bt.bin </Upgrade_Rule>
<Profile_Rule_B>/525/spa$MA.cfg</Profile_Rule_B>
<Transport_Protocol ua="na">tftp</Transport_Protocol> <!-- options: none/tftp/http/https -->
<!-- VLAN Settings -->
<Enable_VLAN ua="rw">No</Enable_VLAN>
<VLAN_ID ua="rw">602</VLAN_ID>
<PC_Port_VLAN_Highest_Priority ua="na">1</PC_Port_VLAN_Highest_Priority> <!-- options: 0/1/2/3/4/5/6/7/No Limit -->
<Enable_PC_Port_VLAN_Tagging ua="na">No</Enable_PC_Port_VLAN_Tagging>
<PC_Port_VLAN_ID ua="na">601</PC_Port_VLAN_ID>
<Enable_CDP ua="na">No</Enable_CDP>
<Enable_LLDP-MED ua="na">No</Enable_LLDP-MED>
<Network_Startup_Delay ua="na">1</Network_Startup_Delay>
<!-- Language -->
<Dictionary_Server_Script ua="na">serv=tftp://10.199.39.200/525/; d0=English; x0=spa525_en_v754.xml; d1=Russian; x1=spa525_ru_v754.xml;</Dictionary_Server_Script>
<Language_Selection ua="na">Russian</Language_Selection>
<Locale ua="na">ru-RU</Locale>
<!-- LOG-->
<Syslog_Server ua="na">10.199.33.106</Syslog_Server>
<Debug_Server ua="na">10.199.33.106</Debug_Server>
<Debug_Level ua="na">3</Debug_Level>
<!-- Time -->
<Time_Zone>GMT+02:00</Time_Zone>
<Time_Format ua="na">24hr</Time_Format>
<Date_Format ua="na">day/month</Date_Format>
<Ignore_DHCP_Time_Offset ua="na">Yes</Ignore_DHCP_Time_Offset>
<Daylight_Saving_Time_Rule ua="na">start=3/-1/7/3;end=10/-1/7/3;save=1</Daylight_Saving_Time_Rule>
<Daylight_Saving_Time_Enable ua="na">Yes</Daylight_Saving_Time_Enable>
<!-- SCREEN -->
<Screen_Saver_Enable ua="rw">Yes</Screen_Saver_Enable>
<Screen_Saver_Type ua="rw">Clock</Screen_Saver_Type> <!-- options: Black Background/Gray Background/Black/Gray Rotation/Picture Rotation/Digital Frame/Download Picture/Clock -->
<Screen_Saver_Trigger_Time ua="rw">300</Screen_Saver_Trigger_Time>
<Screen_Saver_Refresh_Time ua="rw">10</Screen_Saver_Refresh_Time>
<!-- DIrectory -->
<XML_Directory_Service_Name ua="na">CompanyNAMEEEE</XML_Directory_Service_Name>
<XML_Directory_Service_URL ua="na">http://10.199.39.200/Directory.xml</XML_Directory_Service_URL>

<!-- Programmable Softkeys -->
<Programmable_Softkey_Enable ua="na">Yes</Programmable_Softkey_Enable>
<Idle_Key_List ua="na">redial|1;dir|2;psk1|3;cfwd|4;dnd;</Idle_Key_List>
<Missed_Call_Key_List ua="na">lcr|1;miss|4;</Missed_Call_Key_List>
<Off_Hook_Key_List ua="na">redial;lcr;dir;option;</Off_Hook_Key_List>
<Dialing_Input_Key_List ua="na">option|1;dial|2;delchr|3;cancel|4;</Dialing_Input_Key_List>
<Progressing_Key_List ua="na">endcall|2;</Progressing_Key_List>
<Connected_Key_List ua="na">hold|1;endcall|2;conf|3;xfer|4;crdstart;crdstop;bxfer;</Connected_Key_List>
<Start-Xfer_Key_List ua="na">hold|1;endcall|2;xfer|4;crdstart;crdstop;</Start-Xfer_Key_List>
<Start-Conf_Key_List ua="na">hold|1;endcall|2;conf|3;crdstart;crdstop;</Start-Conf_Key_List>
<Conferencing_Key_List ua="na">hold|1;endcall|2;join|4;crdstart;crdstop;</Conferencing_Key_List>
<Releasing_Key_List ua="na">endcall|2;</Releasing_Key_List>
<Hold_Key_List ua="na">resume|1;endcall|2;newcall|3;redial;dir;cfwd;dnd;crdstart;crdstop;</Hold_Key_List>
<Ringing_Key_List ua="na">answer|1;ignore|2;</Ringing_Key_List>
<Shared_Active_Key_List ua="na">newcall|1;barge|2;cfwd|3;dnd|4;crdstart;crdstop;</Shared_Active_Key_List>
<Shared_Held_Key_List ua="na">resume|1;barge|2;cfwd|3;dnd|4;crdstart;crdstop;</Shared_Held_Key_List>
<PSK_1 ua="na">fnc=sd;[email protected]$PROXY;vid=1;nme=2Me</PSK_1>

<!-- Line1 to all -->
<SIP_TOS_DiffServ_Value_1_ ua="na">0x68</SIP_TOS_DiffServ_Value_1_>
<SIP_CoS_Value_1_ ua="na">3</SIP_CoS_Value_1_>
<RTP_TOS_DiffServ_Value_1_ ua="na">0xb8</RTP_TOS_DiffServ_Value_1_>
<RTP_CoS_Value_1_ ua="na">5</RTP_CoS_Value_1_>
<Proxy_1_ ua="na">10.199.10.254</Proxy_1_>
<Register_1_ ua="na">Yes</Register_1_>
<Preferred_Codec_1_ ua="na">G729a</Preferred_Codec_1_>
<Use_Pref_Codec_Only_1_ ua="na">No</Use_Pref_Codec_Only_1_>
<Second_Preferred_Codec_1_ ua="na">G711a</Second_Preferred_Codec_1_>
</flat-profile>

Пример конфига для конкретного телефончика:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<flat-profile>
<Station_Name ua="na">ph640</Station_Name>
<Station_Display_Name ua="na">BOS</Station_Display_Name>
<!--Line 1 -->
<Display_Name_1_ ua="na">bos_main</Display_Name_1_>
<User_ID_1_ ua="na">1640</User_ID_1_>
<Password_1_ ua="na">supermegapassword))</Password_1_>
<Use_Auth_ID_1_ ua="na">Yes</Use_Auth_ID_1_>
<Auth_ID_1_ ua="na">1640</Auth_ID_1_>
<!-- Line Key 4 -->
<Extension_4_ ua="na">Disabled</Extension_4_> <!-- options: 1/2/3/4/5/Disabled -->
<Short_Name_4_ ua="na">MVG</Short_Name_4_>
<Share_Call_Appearance_4_ ua="na">private</Share_Call_Appearance_4_> <!-- options: private/shared -->
<Extended_Function_4_ ua="na">fnc=sd;[email protected]$PROXY</Extended_Function_4_>
</flat-profile>

Адресная книга(Взял отсюда: http://habrahabr.ru/post/214235/):

<?php

//-------Данные MySQL
$mysrv = 'localhost';
$mydb = 'asterisk';
$myuser = 'user';
$mypass = 'pass';
$table = 'sippeers';

$mysqli = new mysqli($mysrv,$myuser,$mypass,$mydb);
if ($mysqli->connect_error) {
    die('Connect Error (' . $mysqli->connect_errno . ') ' . $mysqli->connect_error);
    }
    $mysqli->query("set names utf8");
    $query = 'SELECT cid_number,callerid from `'.$table.'` ORDER BY `defaultuser` ASC';
    $result=$mysqli->query($query);
    while ($row = $result->fetch_assoc()){
    $phones[] = $row['cid_number'];
    $names[] = $row['callerid'];
    }
    $mysqli->close();
?>
<?xml version="1.0" encoding="utf-8" ?>
<CiscoIPPhoneDirectory>
<Title>Каталог</Title>
<Prompt>Выберите номер</Prompt>
<?php
foreach($phones as $k=>$v){?>
<DirectoryEntry>
<Name><?php echo $names[$k]." - ".$v;?></Name>
<Telephone><?php echo $v;?></Telephone>
</DirectoryEntry>
<?php
  }
?>
</CiscoIPPhoneDirectory>

Комментарии: