Snom 320 og 380 på TDC IP Scale platformen





På min arbejdsplads havde vi 40 Snom apparater kørende hos en anden udbyder. Telefonerne er placeret på 7 lokationer, spredt rundt omkring indenfor kommunegrænsen. Infrastrukturen havde vi allerede via nogle routede VLANS rundt på lokationerne.

Da vi skulle skifte til TDC IP Scale ville vi gerne genbruge Snom apparaterne. Både for at spare penge, men også forbrugernes skyld, der havde vænnet sig til telefonerne. Desuden kan Snom lave elektronisk rørløft når man bruger headset, og ikke som LG der kræver en ”løft af” mekanik installeret.

Snom er ikke godkendt på Scale platformen. Dog er Broadsoft, som er motoren under Scales motorhjelm, kompatibel med Snom apparaterne. Efter en hurtig test af et enkelt apparat kunne vi se at de godt kunne fungere på platformen – dog uden fuldautomatisk udrulning af konfigurationen.

Som gammel Perl haj anså jeg det som en spændende opgave. Og Snom har et veldokumenteret og ”scripting”-venligt produkt.
TDC mente at vi skulle rundt og håndkonfigurere alle apparaterne, men jeg var af en anden overbevisning.
Efter lidt test frem og tilbage nåede jeg i mål med 3 scripts der kunne klare opgaven.

På selve migreringsdagen udførte jeg følgende konfigurationer på en time:

1.       Kørte script der scannede 7 TELE IP ranges for aktive Snom apparater og trak IP, MAC og telefonnummer ud.

a.       Denne master liste er vigtig da den indeholder mapping mellem MAC og telefonnummer!

2.       Kørte script der lavede factory reset på min liste af aktive Snom apparater.

a.       Efter dette genstarter telefonerne og ryger på DATA netværket.

3.       Kørte script der scannede 7 DATA IP ranges for aktive Snom apparater og trak IP og  MAC.

4.       Rekonfigurere 7 Cisco switche, så ”VOICE” VLAN blev ændret fra unikt lokations-bestemt ID til same nye ID for alle lokationer.

5.       Kørte script der rekonfigurerede telefonerne til TDC Scale.

a.       Export 2 listen blev brugt til at finde ud af hvilke IP’er der skulle kontaktes.

b.      Export 1 (master) listen blev brugt til at mappe MAC med telefonnummer og SIP konto.

c.       Scriptet sluttede af med at genstarte hver telefon.

6.       Telefonerne startede op og trak IP’er fra det nye TELE VLAN, og fangede derefter TDC IP Scale serveren.

 

Øvrige vigtige detaljer om projektet

 

”Phone Home” på Snom
Snom er indstillet til meget insisterende at ringe hjem til hovedkvarteret. Konceptet er smart men man skal lige huske at det kan genere ens arbejde.
De ringer hjem, og ud fra deres MAC adresse kan Snom hovedkvarteret enten sige ”det må du selv om” eller ”du skal lige spørge udbyder XXX”

Altså – de spørger efter:
http://provisioning.snom.com/snom320/snom320.php?mac=000413000001

Og hos os var svaret:
setting_server: http:// provisioning.den-tidligere-udbyder.dk/snom/{mac}

Og derefter trækker telefonen automatisk konfiguration derfra – hvilket drillede mig lidt – men kun i testen indtil jeg fandt ud af hvad problemet var.

Løsningen er at kontakte sin udbyder og få dem til at trække registreringen hos Snom tilbage for samtlige af ens telefoner.

 

VLAN overblik

·         Unik VLAN til DATA(100, 101, …, 106) på hver lokation

·         Unik VLAN til TELE(200, 201, …, 206) på hver lokation – udfases efter migreringen

·         Fælles VLAN til TELE(1000) til TDC

 

Scripts og eksempel filer:

 

Script A – ScanForSnom.pl – Brugt til punkt 1 og 3

use strict;

use LWP::Simple qw($ua get);

 

my $filename = "scanlist_" . time() . ".txt";

open (OUTFILE, ">>$filename");

$ua->timeout(1);

my @ip_scopes = (

                  '10.99.0.',        # IP scopes ændres til den sekundære scanning

                  '10.99.1.',

                  '10.99.2.',

                  '10.99.3.',

                  '10.99.4.',

                  '10.99.5.',

                  '10.99.6.',

                );

my $ip_start = 1;

my $ip_end = 254;

 

foreach my $ip_scope (@ip_scopes) {

  my $i = $ip_start;

  while ($i <= $ip_end) {

    my $ip = $ip_scope . $i;

    print "IP: $ip\n";

    my $url = "http://$ip/settings.htm";

    my $content = "";

   

    unless (defined ($content = get $url)) {

        print "\tNo response!\n";

       

    } else {

      my $tagA = '<pre>';

      my $tagB = '</pre>';

     

      if ($content =~ /$tagA(.*)$tagB/igs) {

        $content = $1;

      } else {

        print "\tNo settings returned!\n";

        $content = "";

      }

    

      if ($content) {

        my $mac = "";

        my $no = "";

        my $fw = "";

 

        if ($content =~ /mac&: (\w*)/) {

          $mac = $1;

          print "\t\tMac: $mac\n";

        }

 

        if ($content =~ /user_realname1&: (\w*)/) {

          $no = $1;

          print "\t\tNo : $no\n";

        }

 

        if ($content =~ /firmware_version!: (.*)/) {

          $fw = $1;

          $fw =~ s/;/-/;

          $fw =~ s/\r\n//;

          $fw =~ s/\n//;

          $fw =~ s/\r//;

          print "\t\tFw: $fw\n";

        }

       

        print OUTFILE "$ip;$mac;$no;$fw\n";

      }

    }

 

    $i++;

  }

 

}

 

close (OUTFILE);

 

 

Script B – FactoryReset.pl – Brugt til punkt 2

use strict;

use LWP::Simple;

 

my $result = "";

my $message = "";

my $ipfile = 'scanlist_ACTIVE-IP-MAC_LATEST.txt';

 

open FILE, "<$ipfile" or die $!;

while (my $line = <FILE>) {

  $line =~ s/\r\n//;

  $line =~ s/\n//;

  $line =~ s/\r//;

  my ($ip, $mac, $no, $fw) = split(/;/, $line);

  print "IP: $ip\n";

  my $content = "";

  my $url = "http://$ip/advanced_network.htm?reset=Reset";

 

  $content = get $url;

  if (length($content) > 1000) {

    print "\tAccepted - Rebooting\n";

  }

}

close FILE;

 

Script C – ConfigureToScale.pl – Brugt til punkt 5

use strict;

use LWP::Simple;

 

my $result = "";

my $message = "";

my $ipfile = 'scanlist_ACTIVE-IP-MAC_LATEST.txt';

my $macnumberfile = 'scanlist_MAC-NUMBER-MASTER.txt';

my $scalefile = 'scale_accounts.txt';

my %scale_accounts = ();

my %scale_passwords = ();

my %mac_numbers = ();

my $scale_domain = "vk999999.hvoip.dk";

my $scale_proxy = "87.48.131.54";

 

open MACNUMBERFILE, "<$macnumberfile" or die $!;

while (my $line = <MACNUMBERFILE>) {

  $line =~ s/\r\n//;

  $line =~ s/\n//;

  $line =~ s/\r//;

  my ($ip, $mac, $no, $fw) = split(/;/, $line);

  $mac_numbers{$mac} = $no;

}

close MACNUMBERFILE;

 

open SCALEFILE, "<$scalefile" or die $!;

while (my $line = <SCALEFILE>) {

  $line =~ s/\r\n//;

  $line =~ s/\n//;

  $line =~ s/\r//;

  my ($no, $account, $pw) = split(/\t/, $line);

  $scale_accounts{$no} = $account;

  $scale_passwords{$no} = $pw;

}

close SCALEFILE;

 

open FILE, "<$ipfile" or die $!;

while (my $line = <FILE>) {

  $line =~ s/\r\n//;

  $line =~ s/\n//;

  $line =~ s/\r//;

  my ($ip, $mac, $bad_no, $fw) = split(/;/, $line);

  print "IP: $ip - $bad_no(no number)\n";

 

  my $no = $mac_numbers{$mac};

  if ($no) {

    print "\tCorrect number for this MAC is: $no\n";

   

  } else {

    print "\tNO NUMBER FOUND!!!\n";

    next();

  }

 

  my $scale_sip_login_short = $scale_accounts{$no};

  my $scale_sip_password = $scale_passwords{$no};

  if ($scale_sip_login_short && $scale_sip_password) {

    print "\tAccount: $scale_sip_login_short\n";

 

  } else {

    print "\tCANNOT FIND LOGIN INFO FOR $no\n";

    next();  

  }

 

  my $vlan_pc = "";

  # Da telefonerne har udgangsstik til PC, er det vigtigt at de ved

  # hvilket VLAN at DATA skal køre på, på den pågældende lokation.

  if ($ip =~ /10\.88\.0\./) {

    $vlan_pc = "100";

   

  } elsif ($ip =~ /10\.88\.1\./) {

    $vlan_pc = "101";

   

  } elsif ($ip =~ /10\.88\.2\./) {

    $vlan_pc = "102";

   

  } elsif ($ip =~ /10\.88\.3\./) {

    $vlan_pc = "103";

   

  } elsif ($ip =~ /10\.88\.4\./) {

    $vlan_pc = "104";

   

  } elsif ($ip =~ /10\.88\.5\./) {

    $vlan_pc = "105";

   

  } elsif ($ip =~ /10\.88\.6\./) {

    $vlan_pc = "106";

  }

 

  my $content = "";

  my $parameter = "vlan";

  my $value = "1000 7";   # TELE VLAN = 1000 og 7 er en prioritet

  my $url = "http://$ip/dummy.htm?settings=save&$parameter=$value";

 

  # Vlan settings

  $url .= "&vlan_net_id=$vlan_pc";

  $url .= "&vlan_net_priority=6";

 

  # Scale IP Login settings

  $url .= "&user_realname1=$no";                      # Kan ændres til at indeholde navnet!

  $url .= "&user_idle_text1=$no";

  $url .= "&user_name1=$scale_sip_login_short";

  $url .= "&user_host1=$scale_domain";

  $url .= "&user_pname1=$scale_sip_login_short" . '@' . "$scale_domain";

  $url .= "&user_pass1=$scale_sip_password";

  $url .= "&user_outbound1=$scale_proxy";

 

  # Diverse settings

  $url .= "&pnp_config=off";

  $url .= "&subscribe_config=false";

  $url .= "&update_policy=never_update";

  $url .= "&utc_offset=3600";

  $url .= "&dst=3600 03.13.07 02:00:00 10.43.07 03:00:00";

  $url .= "&timezone=DNK%2B1";    # DNK+1 med HTTP encoding

  $url .= "&date_us_format=off";

  $url .= "&time_24_format=on";

  $url .= "&ntp_server=193.162.159.194";

  $url .= "&tone_scheme=DNK";

  $url .= "&language=Dansk";

  $url .= "&web_language=Dansk";

  $url .= "&challenge_response=off";

  $url .= "&logon_wizard=off";

  $url .= "&ignore_security_warning=on";

  $url .= "&call_join_xfer=on";

 

  # Scale settings

  $url .= "&fkey10=speed *300";   # Indmeld

  $url .= "&fkey11=speed *301";   # Udmeld

 

  $content = get $url;

 

  if (length($content) > 10) {

    print "\tAccepted\n";

   

    my $url = "http://$ip/advanced_update.htm?reboot=Reboot";

    $content = get $url;

   

    if (length($content) > 1000) {

      print "\t\tAccepted - Rebooting\n";

    }

  }

}

close FILE;

 

 

Fileksempel – Scaleaccounts.txt (tabulator separeret)
Indhold: Telefonnummer, sip-login-prefix, sip-password

80808022    sip022      123456

80808023    sip023      123456

80808024    sip024      123456

 

 

Fileksempel – SnomMasterList.txt
Indhold: IP før, MAC, Telefonnummer, model+firmware

10.99.0.2;000413000001;80808050;snom370-SIP&#32-7.3.30

10.99.0.3;000413000002;80808077;snom320-SIP&#32-7.3.30

10.99.0.5;000413000003;80808044;snom320-SIP&#32-7.3.30

 

 

Fileksempel – SnomBlankPhonesList.txt
Indhold: IP midlertidig, MAC, (Ingen telefonnummer), model+firmware

10.55.0.57;000413000001;?;snom370-SIP&#32-7.3.30

10.55.0.58;000413000002;?;snom320-SIP&#32-7.3.30

10.55.0.59;000413000003;?;snom320-SIP&#32-7.3.30

 

 

Cisco switch konfiguration
Alle user interfaces blev rekonfigureret – Men kun VOICE VLAN blev ændret.

Før:

interface FastEthernet0/1

 switchport access vlan 101

 switchport trunk encapsulation dot1q

 switchport mode access

 switchport voice vlan 201

!

 

 

Efter:

interface FastEthernet0/1

 switchport access vlan 101

 switchport trunk encapsulation dot1q

 switchport mode access

 switchport voice vlan 1000

!

 

 

Jeg håber du fik noget ud af ovenstående. Jeg synes det var vigtigt at fortælle om den gode oplevelse med Snom på TDC IP Scale. Indlægget er skrevet på eget initiativ og uden TDC stående bagved.
Det var genialt at jeg ved at lave lidt forarbejde kunne lave hele migreringen på en time – i stedet for at have kørt rundt til 7 forskellige steder og tastet løs på 40 telefoner.

Jeg fandt også ud af hvordan man uploader en opdateret adressebog til 40 telefoner på 2 minutter! Det kommer nok i en anden guide engang.