Cisco電話設定ファイルの自動生成

アスタリスク環境でCisco電話を使用している企業の場合、各電話の数十または数百の構成ファイルの保存に問題があります。 30の電話を更新する必要があることをきっかけに(一部はファームウェア、一部は設定によって)、私は構成ファイルの自動生成のための技術を提供することにしました。



これは特定の実装よりもテクノロジーに関するものだということをすぐに言わなければなりません。コードは未加工でデバッグが不十分です。 この記事では、たとえばvoip-info.orgおよび同様のリソースで推奨されているように、すでにCisco電話を設定し、その動作に精通していることを前提としています。



したがって、いくつかのインストールデータ:



ダイヤラーには多くの種類がありますが、ここではCisco Call Manager(CCM)テクノロジーなどを使用した電話について説明しています。 正確な理由は、ユーザー側と管理者側の両方から最も快適に使用できることです。



電源を入れてから電話をダウンロードして操作する通常のプロセスは、次のようになります。





構成ファイルは非常に大きく複雑であり、電話機のほぼすべての側面を定義しているため、関心があります。



TFTPサーバーが独自のソフトウェアであり、設定が返された時点で、TFTPサーバーは設定を知っていればそれを生成できます。 最小バージョンでは、パラメーターのリストは次のとおりです。





もちろん、ファームウェアを除き、これらはすべてカタログに含まれています。



1. IPアドレスの取得



提供する必要のあるファームウェアの種類を調べるには、ブランドを知る必要もあります。 電話は、DHCP要求フィールド60とSIPを登録するときの2つの場合にブランドを話します。 登録するときはすでに遅れているので、DHCPリクエストからブランドを取得します。



dhcpd.confでは、次のように記述できます。



on commit { set clip = binary-to-ascii(10, 8, ".", leased-address); set clhw = binary-to-ascii(16, 8, ":", substring(hardware, 1, 6)); execute("/root/bin/dhcpevent.php", "commit", clip, clhw, option vendor-class-identifier); }
      
      





これにより、リースが発行されたときにDHCPサーバーに次のようなスクリプトを発行するように指示します。



 /root/bin/dhcpevent.php commit 172.20.21.209 0:f:77:12:bc:aa "Cisco Systems, Inc. IP Phone CP-7945G"
      
      





ここで、ブランドをどこかに保存する必要があります。これにより、構成を要求するときに、ブランドを信頼できます。 データベース、アスタリスクデータベース、またはテキストファイルのどこにでも保存できます。 他の資格情報とともにLDAPに保存し、このために不要なtelexNumber属性を使用するオプションを選択しました。 電話を人に割り当てるために、ieee802deviceクラスを追加し、macAddress属性を電話のMACアドレスとして属性付けしました。



dhcpevent.php
 #!/usr/local/bin/php <?php $rdn = 'uid=root,ou=Users,dc=labma,dc=ru'; // DN to auth against LDAP $pass = 'superpass'; // Password $cont = "telexNumber"; // Attribute to fill with Cisco phone ID $ds = ldap_connect("pilot.labma.ru"); // Exit if not connected if (!$ds) exit (128); // Modern LDAP do not work on v1/v2 if (!ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3)) exit (128); // That means phone is not for us if (!preg_match ("/^Cisco/", $argv[4])) exit (1); $r = ldap_bind($ds, $rdn, $pass); $mac = ""; $macar = explode (":", $argv[3]); if (count($macar) != 6) exit (128); // PHP LDAP client get keys in low $contl = strtolower($cont); // DHCP server send not padded MAC foreach ($macar as $byte) $mac .= str_pad ($byte, 2, 0, STR_PAD_LEFT); $sr = ldap_search( $ds, "dc=labma, dc=ru", "macAddress=$mac", array ("dn", $cont) ); if (ldap_count_entries($ds, $sr) != 1) exit (4); $info = ldap_get_entries($ds, $sr)[0]; if ((array_key_exists($contl, $info)) && ($argv[4] == $info[$contl][0])) exit (0); $res = ldap_mod_replace ( $ds, $info["dn"], array ($cont => $argv[4]) ); if (!$res) exit (128); ldap_close ($ds); exit (0); ?>
      
      





スクリプトは、dhcpdが報告したMACアドレスを持つユーザーをLDAPで検索し、まだ設定されていない場合は、telexNumberを設定します。



2.設定を取得する



興味深いことに、cisophonesはまずHTTPプロトコルであるポート6970でTFTPサーバーにアクセスしてから、通常どおりに進みます。 会社のTFTPサーバーをHTTP / 6970に置き換えることを強くお勧めします-電話のロードが高速化されます。 重要! サーバーが応答するが、404または500を返す場合、TFTPは要求されず、電話機は起動しません。 6970がまったく応答しない場合、TFTPは正常に機能します。 最悪なのは、ポートがブロックされると、読み込みが大幅に遅くなることです。



VirtualHostの作成*:6970
 <VirtualHost *:6970> ServerAdmin webmaster@pbx.labma.ru DocumentRoot "/export/tftp" </VirtualHost> <Directory "/export/tftp/"> Options Indexes FollowSymLinks AllowOverride None Require ip 172.20.21.0/24 </Directory>
      
      





および.htaccess:



 RewriteEngine On RewriteRule ^(.*)\.xml$ index.php [L]
      
      







そして/ export / tftpにindex.php自体を置きます



 <?php if (preg_match ("/\SEP(\w+).cnf.xml/", $_SERVER["REQUEST_URI"], $m)) $mac = $m[1]; else { $file = getcwd ().$_SERVER["REQUEST_URI"]; if (!file_exists ($file)) _fail(); header ("Content-type: text/xml"); header ('Content-Length: ' . filesize($file)); readfile ($file); exit (0); } $user = _getUser($mac); if (!$user) _fail(); $tmpl = "template.".$user["cisco"].".xml"; if (!file_exists ($tmpl)) _fail (); $xml = file_get_contents ("template.".$user["cisco"].".xml"); // getLoadA hardcoded, loadB - search directory $user["load"] = _getLoadA($user["cisco"]); foreach ($user as $key => $value) { $xml = preg_replace ("/\#\#$key\#\#/m", $value, $xml); } header ("Content-type: text/xml"); header ('Content-Length: ' . strlen($xml)); echo $xml; exit; function _getUser ($mac) { $rdn = 'uid=root,ou=Users,dc=labma,dc=ru'; // DN to auth against LDAP $pass = 'superpassword'; // Password $cont = "telexNumber"; // Attribute to fill with Cisco phone ID $ds = ldap_connect("pilot.labma.ru"); // Exit if not connected if (!$ds) exit (128); // Modern LDAP do not work on v1/v2 if (!ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3)) exit (128); $r = ldap_bind($ds, $rdn, $pass); $sr = ldap_search( $ds, "dc=labma, dc=ru", "macAddress=$mac" ); if (ldap_count_entries($ds, $sr) != 1) { return null; } $info = ldap_get_entries($ds, $sr)[0]; $user = array(); $user ["label"] = $info["sn"][0]; $user ["phone"] = $info["uidnumber"][0]; if (preg_match ("/CP-(\d+)/", $info["telexnumber"][0], $m)) $user ["cisco"] = $m[1]; else return null; return $user; } function _getLoadA($cisco) { $list = array ( 3951 => "SIP3951.8-1-4a", 7906 => "SIP11.9-4-2SR1-1S", 7911 => "SIP11.9-4-2SR1-1S", 7931 => "SIP31.9-4-2SR2-2S", 7941 => "SIP41.9-4-2SR2-2S", 7945 => "SIP45.9-4-2SR2-2S", 7961 => "SIP41.9-4-2SR2-2S", 7965 => "SIP45.9-4-2SR2-2S", 8941 => "SIP894x.9-4-2SR3-1", 8845 => "sip8845_65.11-5-1SR1-1", 8865 => "sip8845_65.11-5-1SR1-1", ); if (!array_key_exists ($cisco, $list)) return ""; if (!file_exists (getcwd()."/".$list["cisco"].".loads")) return ""; return $list[$cisco]; } function _getLoadB($cisco) { $list = array ( 3951 => "SIP3951", 7906 => "SIP11", 7911 => "SIP11", 7931 => "SIP31", 7941 => "SIP41", 7945 => "SIP45", 7961 => "SIP41", 7965 => "SIP45", 8941 => "SIP894x", 8845 => "sip8845_65", 8865 => "sip8845_65", ); if (!array_key_exists ($cisco, $list)) return ""; $files = glob ($list[$cisco].".*.loads"); if (count($files) != 1) return ""; else return str_replace (".loads", "", $files[0]); } function _fail () { header ("HTTP/1.0 404 Not Found"); exit (0); } ?>
      
      





したがって、写真は次のようになります-電話はSEP <MAC>ファイルを要求し、ここからポピーアドレスを削除し、電話のLDAPブランドとその他のパラメーターを要求し、フォームtemplate.7941.xmlのテンプレートを開き、その変数を変更して電話に渡します。 xmlではない場合-Apache自体がファイルを提供しますが、xmlである場合は提供しますが、ポピーアドレスまたはテンプレートが見つからない場合は自分で提供します-404を呼び出します。



関数呼び出し_getLoadAは_getLoadBに置き換えることができ、ファームウェア自体はディレクトリ内で検索されます。最初の場合、その名前は静的にコードに組み込まれます。



以前は、一般的なパーツなどから複雑なテンプレートを作成したかったのですが、今ではそのような必要性は見当たらず、3951を除くすべての携帯電話に1つのテンプレートがあります。



ユーザーのLDAPに電話のMACアドレスを設定するだけで十分です。



3.ハザード






All Articles