Code

Implemented asterisk Multi server into trunk:
authorhickert <hickert@594d385d-05f5-0310-b6e9-bd551577e9d8>
Wed, 10 Jan 2007 07:59:02 +0000 (07:59 +0000)
committerhickert <hickert@594d385d-05f5-0310-b6e9-bd551577e9d8>
Wed, 10 Jan 2007 07:59:02 +0000 (07:59 +0000)
config.inc
users phoneAccount

git-svn-id: https://oss.gonicus.de/repositories/gosa/trunk@5505 594d385d-05f5-0310-b6e9-bd551577e9d8

include/class_config.inc
plugins/gofon/phoneaccount/class_phoneAccount.inc
plugins/gofon/phoneaccount/generic.tpl

index 516195d7b43468767e91ee34c0ffe0ab00072cc2..b00926aba365a403fff9ce24793ad592cafc2cfe 100644 (file)
@@ -363,26 +363,46 @@ class config  {
           'PASSWORD' => $attrs['goFaxPassword'][0]);
     }
 
+
     /* Get asterisk servers */
     $ldap->cd ($this->current['BASE']);
     $ldap->search ("(objectClass=goFonServer)");
-    $this->data['SERVERS']['FON']= array(); 
+    $this->data['SERVERS']['FON']= array();
     if ($ldap->count()){
       while ($attrs= $ldap->fetch()){
-        $this->data['SERVERS']['FON'][]= array( 
-            'SERVER'   => $attrs['cn'][0],
-            'LOGIN'    => $attrs['goFonAdmin'][0],
-            'PASSWORD'         => $attrs['goFonPassword'][0],
-            'DB'               => "gophone",
-            'SIP_TABLE'                => "sip_users",
-            'EXT_TABLE'        => "extensions",
-            'VOICE_TABLE'      => "voicemail_users",
-            'QUEUE_TABLE'      => "queues",
-            'QUEUE_MEMBER_TABLE'       => "queue_members");
+
+        /* Add 0 entry for development */
+        if(count($this->data['SERVERS']['FON']) == 0){
+          $this->data['SERVERS']['FON'][0]= array(
+              'DN'      => $attrs['dn'],
+              'SERVER'  => $attrs['cn'][0],
+              'LOGIN'   => $attrs['goFonAdmin'][0],
+              'PASSWORD'  => $attrs['goFonPassword'][0],
+              'DB'    => "gophone",
+              'SIP_TABLE'   => "sip_users",
+              'EXT_TABLE'   => "extensions",
+              'VOICE_TABLE' => "voicemail_users",
+              'QUEUE_TABLE' => "queues",
+              'QUEUE_MEMBER_TABLE'  => "queue_members");
+        }
+
+        /* Add entry with 'dn' as index */
+        $this->data['SERVERS']['FON'][$attrs['dn']]= array(
+            'DN'      => $attrs['dn'],
+            'SERVER'  => $attrs['cn'][0],
+            'LOGIN'   => $attrs['goFonAdmin'][0],
+            'PASSWORD'  => $attrs['goFonPassword'][0],
+            'DB'    => "gophone",
+            'SIP_TABLE'   => "sip_users",
+            'EXT_TABLE'   => "extensions",
+            'VOICE_TABLE' => "voicemail_users",
+            'QUEUE_TABLE' => "queues",
+            'QUEUE_MEMBER_TABLE'  => "queue_members");
       }
     }
 
-    /* Get asterisk servers */
+
+    /* Get glpi server */
     $ldap->cd ($this->current['BASE']);
     $ldap->search ("(&(objectClass=goGlpiServer)(cn=*)(goGlpiAdmin=*)(goGlpiDatabase=*))",array("cn","goGlpiPassword","goGlpiAdmin","goGlpiDatabase"));
     if ($ldap->count()){
index 30206d3004b93966186d7bb74b93aa60d746c3de..fe230fd98ffcf6aa6f052eaa66df93bef2b99cc0 100644 (file)
@@ -8,9 +8,9 @@ class phoneAccount extends plugin
   var $has_mailAccount= FALSE;
 
   /* Attributes */
-  var $telephoneNumber        = "";
-  var $goFonHardware          = "";
-  var $goFonFormat            = "";
+  var $telephoneNumber        = array();
+  var $goFonHardware          = "automatic";
+  var $goFonFormat            = "wav";
   var $goFonPIN               = "";
   var $goFonVoicemailPIN      = "";
   var $goFonDeliveryMode      = "";
@@ -27,6 +27,10 @@ class phoneAccount extends plugin
   var $generate_error         = "";
   var $a_old_telenums         = array();
   var $goFonPINVoice          = "";
+  var $goFonHomeServer        = "0";            // Contains the dn of the server that manage this account 
+  var $init_HomeServer        = "0";            // Contains the dn of the server that manage this account 
+  var $goFonHomeServers       = array();        // Contains all available server configurations 
+    
 
   /* CLI vars */
   var $cli_summary            = "Manage users phone account";
@@ -37,32 +41,16 @@ class phoneAccount extends plugin
   var $CopyPasteVars          = array("phoneNumbers","macroarray","macrostillavailable"/*"phoneNumbers" -Reset- */,
                                       "hardware_list","used_hardware");
 
-  var $attributes             = array("goFonDeliveryMode", "goFonFormat","uid","cn",
-                                      "goFonHardware","goFonPIN","goFonVoicemailPIN",
-                                      "telephoneNumber", "goFonMacro","macro");
+  var $attributes             = array("goFonDeliveryMode", "goFonFormat","uid","cn","goFonHomeServer",
+      "goFonHardware","goFonPIN","goFonVoicemailPIN","telephoneNumber", "goFonMacro","macro");
   var $objectclasses= array("goFonAccount");
 
-  var $uid ="";
+  var $uid;
 
   function phoneAccount ($config, $dn= NULL, $parent= NULL)
   {
     plugin::plugin ($config, $dn, $parent);
 
-    /* Set uid, it is used in handle_post_events */    
-    if(isset($this->attrs['uid'])){
-      $this->uid = $this->attrs['uid'][0];
-    }
-
-    /* Set phone hardware */
-    if (!isset($this->attrs['goFonHardware'])){
-      $this->goFonHardware= "automatic";
-    }
-
-    /* Preset voice format */
-    if (!isset($this->attrs['goFonFormat'])){
-      $this->goFonFormat= "wav";
-    }
-
     /* Assemble phone numbers */
     if (isset($this->attrs['telephoneNumber'])){
       for ($i= 0; $i<$this->attrs['telephoneNumber']['count']; $i++){
@@ -78,36 +66,66 @@ class phoneAccount extends plugin
       }
     }
 
+
+    /* Check server configurations 
+     * Load all server configuration in $this->goFonHomeServers if available
+     *  and first server as default if necessary.
+     * Check if connection is successfull for the selected server $this->goFonHomeServer
+     */
     $a_SETUP= array();
     if(array_key_exists('config',$_SESSION) &&
        array_key_exists('SERVERS',$_SESSION['config']->data) &&
        array_key_exists('FON',$_SESSION['config']->data['SERVERS']) &&
        is_callable("mysql_connect")
        ) {
-      $a_SETUP = $_SESSION['config']->data['SERVERS']['FON'][0];
-      $r_con =  @mysql_pconnect($a_SETUP['SERVER'],$a_SETUP['LOGIN'],$a_SETUP['PASSWORD']);
-      if(!$r_con){
-        $this->generate_error = sprintf(_("The MySQL Server '%s' isn't reachable as user '%s', check GOsa log for mysql error."),
-          $a_SETUP['SERVER'],$a_SETUP['LOGIN']);
-        gosa_log(mysql_error());
-        return false;
-      }
-      $db  =  @mysql_select_db($a_SETUP['DB'],$r_con);
-      if(!$db){
-        $this->generate_error = sprintf(_("Can't select database %s on %s."),$a_SETUP['DB'],$a_SETUP['SERVER']);
-        gosa_log(mysql_error());
-        return false;
-      }
-      $first = false; 
-      foreach($this->phoneNumbers as $key => $val){
-        if(!$first){
-          $first = $key;
+
+      /* Set available server */
+      $this->goFonHomeServers = $_SESSION['config']->data['SERVERS']['FON'];
+
+      /* Servers defined? Watch here... */
+      if (count($this->goFonHomeServers)){
+
+        /* Set default server */
+        if(empty($this->goFonHomeServer) || $this->goFonHomeServer == "0"){
+          $this->goFonHomeServer= $this->goFonHomeServers[0]['DN'];
+        }
+
+        /* Remember inital home server, to be able to remove old entries */
+        $this->init_HomeServer = $this->goFonHomeServer;
+
+        /* Get config */
+        if(!isset($this->goFonHomeServers[$this->goFonHomeServer])){
+          print_red(sprintf(_("The specified goFonHomeServer '%s' is not available in GOsa server configuration. Saving this account will create a new entry on the server '%s'. Use cancel if you do not want to create a new entry ignoring old accounts."),$this->goFonHomeServer, $this->goFonHomeServers[0]['DN']));
+
+          $this->goFonHomeServer = $this->goFonHomeServers[0]['DN'];
+          $this->init_HomeServer = $this->goFonHomeServers[0]['DN'];
+        }    
+        $cur_cfg = $this->goFonHomeServers[$this->goFonHomeServer];
+
+        $r_con =  @mysql_pconnect($cur_cfg['SERVER'],$cur_cfg['LOGIN'],$cur_cfg['PASSWORD']);
+        if(!$r_con){
+          print_red( sprintf(_("The MySQL Server '%s' isn't reachable as user '%s', check GOsa log for mysql error."),
+                $cur_cfg['SERVER'],$cur_cfg['LOGIN']));
+          gosa_log(mysql_error());
+        }
+        $db  =  @mysql_select_db($cur_cfg['DB'],$r_con);
+        if(!$db){
+          print_red(sprintf(_("Can't select database %s on %s."),$cur_cfg['DB'],$cur_cfg['SERVER']));
+          gosa_log(mysql_error());
+        }
+
+        $first = false; 
+        foreach($this->phoneNumbers as $key => $val){
+          if(!$first){
+            $first = $key;
+          }
         }
       }
     }
 
-    /* Load hardware list */
+    /* Get available phone hardware  
+     * Search for all available phone hardware  
+     */
     $ldap= $this->config->get_ldap_link();
     $ldap->cd($this->config->current['BASE']);
     $ldap->search("(objectClass=goFonHardware)", array('cn', 'description'));
@@ -119,65 +137,65 @@ class phoneAccount extends plugin
         $description= "";
       }
       $this->hardware_list[$cn]= "$cn$description";
-
     }
 
-    /* Perform search, to get Macro Parameters,Name,Dn,Displayname etc*/
-    $ldap->search("(objectClass=goFonMacro)", array("*"));
+
+    /* Get available Macros  
+     * Search for all Marcos that are visible and create 
+     *  an array with name and parameters 
+     */
+    $ldap->search("(&(objectClass=goFonMacro)(goFonMacroVisible=1))", array("*"));
 
     /* Add none for no macro*/
     $this->macros['none']=_("no macro");    
     $this->macro ="none";
 
-
     /* Fetch all Macros*/
     while ($attrs= $ldap->fetch()){
 
-      /* Only visisble */
-      if((isset($attrs['goFonMacroVisible'][0]))&&($attrs['goFonMacroVisible'][0] ==1)){
-
-        /* unset Count, we don't need that here */
-        unset($attrs['displayName']['count']);
+      /* unset Count, we don't need that here */
+      unset($attrs['displayName']['count']);
 
-        /* fill Selectfield variable with Macros */
-        if(isset($attrs['displayName'][0])){
-          $this->macros[$attrs['dn']] = $attrs['displayName'][0]." (".$attrs['cn'][0].")";
-        }else{
-          $this->macros[$attrs['dn']] = _("undefined");
-        }
+      /* Parse macro data, unset count for parameterarrays  */
+      if (isset($attrs['goFonMacroParameter']['count'])){
+        unset($attrs['goFonMacroParameter']['count']);
+      }
 
-        /* Parse macro data, unset count for parameterarrays  */
-        if (isset($attrs['goFonMacroParameter']['count'])){
-          unset($attrs['goFonMacroParameter']['count']);
-        }
+      /* fill Selectfield variable with Macros */
+      if(isset($attrs['displayName'][0])){
+        $this->macros[$attrs['dn']] = $attrs['displayName'][0]." (".$attrs['cn'][0].")";
+      }else{
+        $this->macros[$attrs['dn']] = _("undefined");
+      }
 
-        /* Go through available parameters and parse all attributes, like parametername, type, default ...*/
-        if((isset($attrs['goFonMacroParameter']))&&(is_array($attrs['goFonMacroParameter']))){
-
-          foreach($attrs['goFonMacroParameter'] as $pkey=>$pval){
-            /* Split Data in readable values, by delimiter !  */
-            $data = split("!",$attrs['goFonMacroParameter'][$pkey]);
-
-            /* Set all attrs */
-            $id = $data[0];
-            $this->macroarray[$attrs['dn']][$id]['var']    ="var".$id;
-            $this->macroarray[$attrs['dn']][$id]['choosen']=$data[3]; 
-            $this->macroarray[$attrs['dn']][$id]['id']     =$id;
-            $this->macroarray[$attrs['dn']][$id]['name']   =$data[1];
-            $this->macroarray[$attrs['dn']][$id]['type']   =$data[2];
-            $this->macroarray[$attrs['dn']][$id]['default']=$data[3];
-            if($data[2] == "bool"){
-              $this->macroarray[$attrs['dn']][$id]['choosen']=$data[3];
-            }
-          }//foreach
-        }//is_array
-      }//visible = 1
+      /* Go through available parameters and parse all attributes, like parametername, type, default ...*/
+      if((isset($attrs['goFonMacroParameter']))&&(is_array($attrs['goFonMacroParameter']))){
+
+        foreach($attrs['goFonMacroParameter'] as $pkey=>$pval){
+          /* Split Data in readable values, by delimiter !  */
+          $data = split("!",$attrs['goFonMacroParameter'][$pkey]);
+
+          /* Set all attrs */
+          $id = $data[0];
+          $this->macroarray[$attrs['dn']][$id]['var']    ="var".$id;
+          $this->macroarray[$attrs['dn']][$id]['choosen']=$data[3]; 
+          $this->macroarray[$attrs['dn']][$id]['id']     =$id;
+          $this->macroarray[$attrs['dn']][$id]['name']   =$data[1];
+          $this->macroarray[$attrs['dn']][$id]['type']   =$data[2];
+          $this->macroarray[$attrs['dn']][$id]['default']=$data[3];
+          if($data[2] == "bool"){
+            $this->macroarray[$attrs['dn']][$id]['choosen']=$data[3];
+          }
+        }//foreach
+      }//is_array
     }//while
 
-    /* Go through already saved values, for a parameter */
-    $tmp = split("!",$this->goFonMacro);
 
-    /* it is possible that nothing has been saved yet */
+    /* Parse used Macro  
+     * If we have a macro selected, parse it and set values 
+     *  in $this->macroarray[$this->macro]. 
+     */
+    $tmp = split("!",$this->goFonMacro);
     if(is_array($tmp)){
 
       /* First value is the macroname */
@@ -187,7 +205,7 @@ class phoneAccount extends plugin
       unset($tmp[0]);
 
       /* Check if makro has been removed */
-      if(!isset($this->macroarray[$this->macro])){
+      if(!isset($this->macros[$this->macro])){
         $this->macrostillavailable = false;
       }else{
         $this->macrostillavailable = true;
@@ -208,7 +226,10 @@ class phoneAccount extends plugin
     }
 
 
-    /* Eventually colorize phones */
+    /* Colorize phones 
+     * Used phones will be colored in grey, 
+     *  so we must detect which phones are currently in use.
+     */
     $ldap->cd($this->config->current['BASE']);
     foreach ($this->hardware_list as $cn => $desc){
       $ldap->search("(goFonHardware=$cn)", array('cn'));
@@ -234,11 +255,11 @@ class phoneAccount extends plugin
      * This means, the PIN in the DB is up to date
      */
     // Connect to DB server
-    if((is_callable("mysql_pconnect"))&&(isset($a_SETUP))&&(isset($a_SETUP['SERVER']))&&(isset($a_SETUP['LOGIN']))&&(isset($a_SETUP['PASSWORD']))){
-      $r_con =  @mysql_pconnect($a_SETUP['SERVER'],$a_SETUP['LOGIN'],$a_SETUP['PASSWORD']);
+    if((is_callable("mysql_pconnect"))&&(isset($cur_cfg))&&(isset($cur_cfg['SERVER']))&&(isset($cur_cfg['LOGIN']))&&(isset($cur_cfg['PASSWORD']))){
+      $r_con =  @mysql_pconnect($cur_cfg['SERVER'],$cur_cfg['LOGIN'],$cur_cfg['PASSWORD']);
       if($r_con){
-        $r_db  =  @mysql_select_db($a_SETUP['DB'],$r_con);
-        $vp = mysql_fetch_row(mysql_query("SELECT ".$a_SETUP['VOICE_TABLE'].".password FROM  ".$a_SETUP['VOICE_TABLE'].", ".$a_SETUP['SIP_TABLE']."  WHERE customer_id = sip_users.mailbox AND name='".$this->uid."'"));
+        $r_db  =  @mysql_select_db($cur_cfg['DB'],$r_con);
+        $vp = mysql_fetch_row(mysql_query("SELECT ".$cur_cfg['VOICE_TABLE'].".password FROM  ".$cur_cfg['VOICE_TABLE'].", ".$cur_cfg['SIP_TABLE']."  WHERE customer_id = sip_users.mailbox AND name='".$this->uid."'"));
 
         if((isset($vp[0]))&&(!empty($vp[0]))){
           $this->goFonPINVoice = $vp[0];
@@ -253,23 +274,42 @@ class phoneAccount extends plugin
   }
 
 
-  // Generate MySQL Syntax
-  function generate_mysql_entension_entries($save = false){
-
-    if(!isset($_SESSION['config']->data['SERVERS']['FON'][0])){
-      if($save)
-      print_red(_("There is currently no asterisk server defined. Possibly you are missing a server that handles the asterisk management (goFonServer). Your settings can't be saved to asterisk database."));
+  /* This function generates the Database entries. 
+   * The Parameter 'save' could be true or false.
+   *  false - means only testing no database transactions.
+   *  true  - write database entries.
+   *
+   * 'sip_users','voice_mail' and 'extensions' table entries will be created.
+   * 
+   * If the phone hardware is 'automatic' the table entries will only be removed
+   *  and not added. 
+   */
+  function generate_mysql_entension_entries($save = false)
+  {
+    /* Check if there is at least one server available 
+     * If not, return and tell the user that saving failed 
+     */
+    if(!count($this->goFonHomeServers)){
+      if($save){
+        print_red(_("There is currently no asterisk server defined. Possibly you are missing a server that handles the asterisk management (goFonServer). Your settings can't be saved to asterisk database."));
+      }
       return(true);
     }
 
+    /* Check if Mysql extension is available */
     if(!is_callable("mysql_pconnect")){
       if($save)
       print_red(_("Can't save any changes to asterisk database, there is no mysql extension available."));
       return(true);
     }
-  
+    /********************** 
+     * Attribute Initialisation
+     **********************/
+
+    $old_connection = false;
+
     // Get Configuration for Mysql database Server
-    $a_SETUP        = $_SESSION['config']->data['SERVERS']['FON'][0];  // DB Configuration
     $s_parameter    = "";                                           // Contains paramter for selected Macro 
     $r_con          = false;                                        // DB connection
     $r_db           = false;                                        // Selected DB
@@ -297,223 +337,373 @@ class phoneAccount extends plugin
 
     $i_is_accounted = false;  // Ensure that extension entry, for name to number is only once in table
 
+    restore_error_handler();
 
-    // Connect to DB server
-    $r_con =  @mysql_pconnect($a_SETUP['SERVER'],$a_SETUP['LOGIN'],$a_SETUP['PASSWORD']);
-
-    // Check if we are  connected correctly
-    if(!$r_con){
-      $this->generate_error = sprintf(_("The MySQL Server '%s' isn't reachable as user '%s', check GOsa log for mysql error."),
-          $a_SETUP['SERVER'],$a_SETUP['LOGIN']);
-      gosa_log(mysql_error());
-      return false;
+    /* Prepare some basic attributes */
+    foreach($this->a_old_telenums as $tele){
+      $oldnums[]= preg_replace("/[^0-9]/","",$tele);
+    }
+    foreach($this->phoneNumbers as $tele){
+      $newnums[]= preg_replace("/[^0-9]/","",$tele);
     }
 
-    // Select database for Extensions
-    $r_db  =  @mysql_select_db($a_SETUP['DB'],$r_con);
-
-    // Test if we have the database selected correctly
-    if(!$r_db){
-      $this->generate_error = sprintf(_("Can't select database %s on %s."),$a_SETUP['DB'],$a_SETUP['SERVER']);
-      gosa_log(mysql_error());
-      return false;
+    /* If deletion starts from userslist, cn uid are not set */
+    if((isset($this->parent->by_object['user']->uid))&&(!empty($this->parent->by_object['user']->uid))){
+      $this->uid = $this->parent->by_object['user']->uid;
+    }
+    if((isset($this->parent->by_object['user']->cn))&&(!empty($this->parent->by_object['user']->cn))){
+      $this->cn  = $this->parent->by_object['user']->cn;
+    }
+    /* Create voicemail entry 
+     */
+    if((!isset($this->cn))||(empty($this->cn))){
+      $CNname= $this->uid;
+    }else{
+      $CNname= $this->cn;
     }
 
-    // Get phonehardware to setup sip entry
+    if((isset($this->parent))&&(isset($this->parent->by_object['mailAccount']))&&($this->parent->by_object['mailAccount']->is_account==true)){
+      $s_mail = $this->parent->by_object['mailAccount']->mail;
+    }else{
+      $s_mail = "";
+    }
+    /* Get phonehardware to setup sip entry  */
     $ldap         = $this->config->get_ldap_link();
     $r_res        = $ldap->search("(&(objectClass=goFonHardware)(cn=".$this->goFonHardware."))", array('*'));
     $a_ldap_attrs = $ldap->fetch();
 
+    /* Check selected phone hardware, is a default IP set? */
+    if(((isset($a_ldap_attrs['goFonDefaultIP'][0]))&&($a_ldap_attrs['goFonDefaultIP'][0] != "dynamic"))){
+      $s_ip       = $a_ldap_attrs['goFonDefaultIP'][0];
+      $s_host     = $s_ip;
+    }else{
+      $s_ip       = NULL;
+      $s_host     = "dynamic";
+    }
+
+    // Attribute GoFonQualify set ?
+    if(isset($a_ldap_attrs['goFonQualify'])){
+      $s_qualify = $a_ldap_attrs['goFonQualify'][0];
+    }
+
+    // Attribute GoFonPIN set ?
+    if(isset($this->goFonPIN)){
+      $s_pin      = $this->goFonPIN;
+    }
+
+    // Attribute GoFonType set ?
+    if(isset($a_ldap_attrs['goFonType'])){
+      $s_type = $a_ldap_attrs['goFonType'][0];
+    }
+
+    if(isset($a_ldap_attrs['goFonDmtfMode'][0])){
+      $sip_data_array['dtmfmode']     = $a_ldap_attrs['goFonDmtfMode'][0];
+    }else{
+      $sip_data_array['dtmfmode']     ="rfc2833";
+    }
+
+    /* Check if phone number is used */
     if($this->is_number_used()){
       $this->generate_error = $this->is_number_used(); 
       return false;
     }
 
-    /* If Save == true, we should save something.
-     * Generate SQL, for drop of old entries
-     * Generate SQL, for insert new entries
-     */ 
-    if($save == true){
-      
-      foreach($this->a_old_telenums as $tele){
-        $oldnums[]= preg_replace("/[^0-9]/","",$tele);
-      }
 
-      foreach($this->phoneNumbers as $tele){
-        $newnums[]= preg_replace("/[^0-9]/","",$tele);
-      }
 
-      // Attribute GoFonDefaultIP set ?
-      if(((isset($a_ldap_attrs['goFonDefaultIP'][0]))&&($a_ldap_attrs['goFonDefaultIP'][0] != "dynamic"))){
-        $s_ip       = $a_ldap_attrs['goFonDefaultIP'][0];
-        $s_host     = $s_ip;
-      }else{
-        $s_ip       = NULL;
-        $s_host     = "dynamic";
-      }
+    /********************** 
+     * Check Server Connection Information
+     **********************/
+    /* Create Mysql handle for the current goFonHomeServer, if possible  
+     * Get configuration to old asterisk home server 
+     */ 
+    $a_New = $this->goFonHomeServers[$this->goFonHomeServer];  // DB Configuration
+    $new_connection =  @mysql_pconnect($a_New['SERVER'],$a_New['LOGIN'],$a_New['PASSWORD']);
+    if(!$new_connection){
+      $this->generate_error = sprintf(
+          _("The MySQL Server '%s' isn't reachable as user '%s'. Abort saving entries to keep the database consistent, check GOsa log for mysql error."),
+          $a_New['SERVER'],$a_New['LOGIN']);
+      gosa_log(@mysql_error($new_connection));
+      return false;
+    }
+    $new_database  =  @mysql_select_db($a_New['DB'],$new_connection);
+    if(!$new_database){
+      $this->generate_error = sprintf(
+          _("Can't select database %s on %s. Abort saving entries to keep the database consistent, check GOsa log for mysql error."),
+          $a_New['DB'],$a_New['SERVER']);
+      gosa_log( @mysql_error($new_connection));
+      return false;
+    }
 
-      // Attribute GoFonQualify set ?
-      if(isset($a_ldap_attrs['goFonQualify'])){
-        $s_qualify = $a_ldap_attrs['goFonQualify'][0];
+    /* If the home server has changed, we must remove entries from old 
+     *  server and add new entries in new server.  
+     */
+    if($this->init_HomeServer != $this->goFonHomeServer){
+    
+      /* Get configuration to old asterisk home server */ 
+      $a_Remove = $this->goFonHomeServers[$this->init_HomeServer];  // DB Configuration
+      /* Create connection to the database that contains the old entry. 
+       */
+      $old_connection =  @mysql_pconnect($a_Remove['SERVER'],$a_Remove['LOGIN'],$a_Remove['PASSWORD']);
+      if(!$old_connection){
+        $this->generate_error = sprintf(
+            _("The old MySQL home server '%s' isn't reachable as user '%s'. Abort saving entries to keep the database consistent, check GOsa log for mysql error."),
+            $a_Remove['SERVER'],$a_Remove['LOGIN']);
+        gosa_log(@mysql_error($old_connection));
+        return false;
       }
-
-      // Attribute GoFonPIN set ?
-      if(isset($this->goFonPIN)){
-        $s_pin      = $this->goFonPIN;
+      $old_database  =  @mysql_select_db($a_Remove['DB'],$old_connection);
+      if(!$old_database){
+        $this->generate_error = sprintf(
+            _("Can't select database %s on %s. Abort saving entries to keep the database consistent, check GOsa log for mysql error."),
+            $a_Remove['DB'],$a_Remove['SERVER']);
+        gosa_log(@mysql_error($old_connection));
+        return false;
       }
+    }
 
-      // Attribute GoFonType set ?
-      if(isset($a_ldap_attrs['goFonType'])){
-        $s_type = $a_ldap_attrs['goFonType'][0];
-      }
+    /* Save means that we must save changes, not only test  */
+    if($save == true){
+    
+      /********************** 
+       * Remove entries from old home server 
+       **********************/
+
+      /* Check if there is an old entry 
+       * If there is en old entry, get callerid and remove voicemail and extensions too 
+       */
+      if($old_connection){
+        $query  = "SELECT id,name,callerid FROM ".$a_Remove['SIP_TABLE']." WHERE name='".$this->uid."';";
+        $rid    = mysql_query($query,$old_connection);
+
+        /* Old entry found, remove it */
+        $query_a = array();
+        if(mysql_affected_rows($old_connection)){
+          $result = mysql_fetch_assoc($rid);
+          $query_a[]= "DELETE FROM ".$a_Remove['SIP_TABLE']." WHERE name='".$this->uid."';";
+          $query_a[]= "DELETE FROM ".$a_Remove['VOICE_TABLE']." WHERE customer_id='".$result['callerid']."';";
+          $query_a[]= "DELETE FROM ".$a_Remove['EXT_TABLE']." WHERE exten='".$this->uid."';";
+          foreach($oldnums as $s_telenums) {
+            $query_a[]= "DELETE FROM ".$a_Remove['EXT_TABLE']." WHERE exten='".$s_telenums."';";
+          }
 
-      if(isset($a_ldap_attrs['goFonDmtfMode'][0])){
-        $sip_data_array['dtmfmode']     = $a_ldap_attrs['goFonDmtfMode'][0];
-      }else{
-        $sip_data_array['dtmfmode']     ="rfc2833";
+          foreach($query_a as $qry){
+            if(!mysql_query($qry,$old_connection)){
+              echo $qry;
+              echo mysql_error($old_connection);
+            } 
+          }
+        }
       }
 
-      // generate SIP entry
-      $sip_data_array['id']           = "";
-      $sip_data_array['name']         = $this->uid;
-      $sip_data_array['accountcode']  = NULL;          
-      $sip_data_array['amaflags']     = NULL;
-      $sip_data_array['callgroup']    = NULL;
-      $sip_data_array['callerid']     = "";
-      $sip_data_array['canreinvite']  = "no";
-      $sip_data_array['context']      = "default";
-      $sip_data_array['defaultip']    = NULL;
-      $sip_data_array['fromuser']     = NULL;
-      $sip_data_array['fromdomain']   = NULL;
-      $sip_data_array['host']         = $s_host;
-      $sip_data_array['insecure']     = NULL;
-      $sip_data_array['language']     = NULL;
-      $sip_data_array['mailbox']      = "asterisk";
-      $sip_data_array['md5secret']    = NULL;
-      $sip_data_array['nat']          = "no";
-      $sip_data_array['permit']       = NULL;
-      $sip_data_array['deny']         = NULL;
-      $sip_data_array['mask']         = NULL;
-      $sip_data_array['pickupgroup']  = NULL;
-      $sip_data_array['port']         = NULL;
-      $sip_data_array['qualify']      = $s_qualify;
-      $sip_data_array['restrictcid']  = "n";
-      $sip_data_array['rtptimeout']   = NULL;
-      $sip_data_array['rtpholdtimeout']=NULL;
-      $sip_data_array['secret']       = $this->goFonPIN;
-      $sip_data_array['type']         = $s_type ;
-      $sip_data_array['username']     = $this->uid;
-      $sip_data_array['disallow']     = NULL;
-      $sip_data_array['allow']        = NULL;
-      $sip_data_array['musiconhold']  = NULL;
-      $sip_data_array['regseconds']   = NULL;
-      $sip_data_array['ipaddr']       = $s_ip;
-      $sip_data_array['regexten']     = NULL;
-      $sip_data_array['cancallforward']=NULL;
+      /********************** 
+       * Update / Insert sip_users entry  
+       **********************/
 
-      // Get selected Macro Parameter and create parameter entry 
-      if(isset($this->macroarray[$this->macro])){
-        foreach($this->macroarray[$this->macro] as $key => $val ){
-          $s_parameter .= $val['choosen']."|";
+      /* Set the first given phone number as callerid */
+      reset($newnums);        
+      $i_new_key = key($newnums);
+      $sip_data_array['callerid']  =$newnums[$i_new_key];
+      $sip_data_array['mailbox']   =$newnums[$i_new_key];
+
+      /* Check if there is already an entry in sip_users for this uid */
+      $SQL_query_array = array();
+      $rid = mysql_query("SELECT * FROM ".$a_New['SIP_TABLE']." WHERE name='".$this->uid."';\n",$new_connection);
+      if(mysql_affected_rows($new_connection)){
+
+        /********************** 
+         * Update sip_users entry 
+         **********************/
+        $result                     = mysql_fetch_assoc($rid);
+        $sip_data_array['host']         = $s_host;
+        $sip_data_array['qualify']      = $s_qualify;
+        $sip_data_array['secret']       = $this->goFonPIN;
+        $sip_data_array['type']         = $s_type ;
+        $sip_data_array['username']     = $this->uid;
+        $sip_data_array['ipaddr']       = $s_ip;
+
+        /* Remove not changed attributes, to avoid updating table with same values */
+        foreach($sip_data_array as $name => $value){
+          if($result[$name] == $value){
+            unset($sip_data_array[$name]);
+          }
         }
-        $s_parameter = preg_replace("/\|$/","",$s_parameter);
-      }
+        /* Only update entry if there is something to uopdate */
+        if(count($sip_data_array)){
+          $query = "UPDATE ".$a_New['SIP_TABLE']." SET ";
+          foreach($sip_data_array as $key => $val){
+            $query.= "".$key."='".$val."',"; 
+          } 
+          $query = preg_replace("/,$/","",$query);
+          $query.= " WHERE name='".$this->uid."';";
+          $SQL_query_array[] = $query;
+        }
+      } else {
+        /********************** 
+         * Insert sip_users entry 
+         **********************/
+        //generate SIP entry
+        $sip_data_array['id']           = "";
+        $sip_data_array['name']         = $this->uid;
+        $sip_data_array['accountcode']  = NULL;          
+        $sip_data_array['amaflags']     = NULL;
+        $sip_data_array['callgroup']    = NULL;
+        $sip_data_array['canreinvite']  = "no";
+        $sip_data_array['context']      = "default";
+        $sip_data_array['defaultip']    = NULL;
+        $sip_data_array['fromuser']     = NULL;
+        $sip_data_array['fromdomain']   = NULL;
+        $sip_data_array['host']         = $s_host;
+        $sip_data_array['insecure']     = NULL;
+        $sip_data_array['language']     = NULL;
+        $sip_data_array['mailbox']      = $newnums[$i_new_key];
+        $sip_data_array['md5secret']    = NULL;
+        $sip_data_array['nat']          = "no";
+        $sip_data_array['permit']       = NULL;
+        $sip_data_array['deny']         = NULL;
+        $sip_data_array['mask']         = NULL;
+        $sip_data_array['pickupgroup']  = NULL;
+        $sip_data_array['port']         = NULL;
+        $sip_data_array['qualify']      = $s_qualify;
+        $sip_data_array['restrictcid']  = "n";
+        $sip_data_array['rtptimeout']   = NULL;
+        $sip_data_array['rtpholdtimeout']=NULL;
+        $sip_data_array['secret']       = $this->goFonPIN;
+        $sip_data_array['type']         = $s_type ;
+        $sip_data_array['username']     = $this->uid;
+        $sip_data_array['disallow']     = NULL;
+        $sip_data_array['allow']        = NULL;
+        $sip_data_array['musiconhold']  = NULL;
+        $sip_data_array['regseconds']   = NULL;
+        $sip_data_array['ipaddr']       = $s_ip;
+        $sip_data_array['regexten']     = NULL;
+        $sip_data_array['cancallforward']=NULL;
+
+        /* There is currently no entry for this user in the sip_users table. 
+         * We should create one i
+         */
+        foreach($sip_data_array as $s_sip_key=>$s_sip_val){
+          if($s_sip_val == NULL) continue;
+          $s_sip_values.="'".$s_sip_val."',";
+          $s_sip_keys  .="`".$s_sip_key."`,";
+        }
+        $s_sip_values =  preg_replace("/,$/","",$s_sip_values);
+        $s_sip_keys   =  preg_replace("/,$/","",$s_sip_keys);
 
-      if($this->is_number_used()){
-        $this->generate_error = $this->is_number_used(); 
-        return false;
+        /* Add sip entries to mysql queries */
+        $SQL_query_array[] ="INSERT INTO ".$a_New['SIP_TABLE']." (".$s_sip_keys.") VALUES (".$s_sip_values.");";
       }
 
-      // Create new SIP entry ...
-      $sip_entry = $sip_data_array;
-      reset($newnums);
-      $i_new_key = key($newnums);
-      $sip_entry['callerid']  =$newnums[$i_new_key];
-      $sip_entry['mailbox']   =$newnums[$i_new_key];
 
-      if((isset($this->parent))&&(isset($this->parent->by_object['mailAccount']))&&($this->parent->by_object['mailAccount']->is_account==true)){
-        $s_mail = $this->parent->by_object['mailAccount']->mail;
-      }else{
-        $s_mail = "";
+      /********************** 
+       * Update / Insert Voice mail entry  
+       **********************/
+
+      $customer_id = $newnums[$i_new_key];
+
+      $voice_data_array = array(
+          "customer_id" => $customer_id,
+          "mailbox"     => $customer_id,
+          "password"    => $this->goFonVoicemailPIN,
+          "fullname"    => $CNname,
+          "email"       => $s_mail);
+
+      /* Set pager number if available */
+      if(isset($this->parent->by_object['user']->pager)){
+        $voice_data_array['pager']   = $this->parent->by_object['user']->pager;
       }
 
-      // $SQL contains all queries
-      $SQL   = array();
-      $SQL[] = "DELETE FROM ".$a_SETUP['EXT_TABLE']." WHERE exten='".$this->uid."';\n";
-      $SQL[] = "DELETE FROM ".$a_SETUP['SIP_TABLE']." WHERE name='".$this->uid."';\n";
-      $SQL[] = "DELETE FROM ".$a_SETUP['VOICE_TABLE']." WHERE customer_id=".$newnums[$i_new_key].";"; 
-      // Delete old entries
-      $b_first_deleted  =false;
-      if(isset($oldnums) && is_array($oldnums)){
-        foreach($oldnums as $s_telenums){
-          $SQL[] = "DELETE FROM ".$a_SETUP['EXT_TABLE']." WHERE exten='".$s_telenums."';\n";
-          if(!$b_first_deleted){
-            $b_first_deleted=true;
-            $SQL[] = "DELETE FROM ".$a_SETUP['VOICE_TABLE']." WHERE customer_id=".$s_telenums.";";
+      /* Check if there is already an entry in sip_users for this uid */
+      $rid = mysql_query("SELECT * FROM ".$a_New['VOICE_TABLE']." WHERE customer_id='".$customer_id."';\n",$new_connection);
+      if(mysql_affected_rows($new_connection)){
+
+        /********************** 
+         * Update Voice mail entry  
+         **********************/
+        $result = mysql_fetch_assoc($rid)  ;
+
+        foreach($voice_data_array as $name => $value){
+          if($result[$name] == $value){
+            unset($voice_data_array[$name]);
           }
         }
-      }
-      if($this->goFonHardware=="automatic"){
-        foreach($SQL as $query ){
-          mysql_query($query) ;
-        }
-        return;
-      }
 
-      // Generate Strings with keys and values 
-      foreach($sip_entry as $s_sip_key=>$s_sip_val){
-        if($s_sip_val == NULL) continue;
-        $s_sip_values.="'".$s_sip_val."',";
-        $s_sip_keys  .="`".$s_sip_key."`,";
-      }
-      // Remove last ,
-      $s_sip_values =  preg_replace("/,$/","",$s_sip_values);
-      $s_sip_keys   =  preg_replace("/,$/","",$s_sip_keys);
+        /* Only update entry if there is something to uopdate */
+        if(count($voice_data_array)){
+          $query = "UPDATE ".$a_New['VOICE_TABLE']." SET ";
+          foreach($voice_data_array as $key => $val){
+            $query.= "".$key."='".$val."',"; 
+          } 
+          $query = preg_replace("/,$/","",$query);
+          $query.= " WHERE customer_id='".$customer_id."';";
+          $SQL_query_array[] = $query;
+        }
+      }else{
 
-      // Append SIP Entry 
-      $SQL[] ="INSERT INTO ".$a_SETUP['SIP_TABLE']." (".$s_sip_keys.") VALUES (".$s_sip_values.");";
+        /********************** 
+         * Insert Voice mail entry  
+         **********************/
+        $voice_data_array['context'] = "default";
+  
+        /* There is currently no voice mail entry for this user. 
+         * We should create one 
+         */
+        $s_voi_values = $s_voi_keys = "";
+        foreach($voice_data_array as $s_voi_key=>$s_voi_val){
+          if($s_voi_val == NULL) continue;
+          $s_voi_values.="'".$s_voi_val."',";
+          $s_voi_keys  .="`".$s_voi_key."`,";
+        }
+        $s_voi_values =  preg_replace("/,$/","",$s_voi_values);
+        $s_voi_keys   =  preg_replace("/,$/","",$s_voi_keys);
 
-      /* If deletion starts from userslist, cn uid are not set */
-      if((isset($this->parent->by_object['user']->uid))&&(!empty($this->parent->by_object['user']->uid))){
-        $this->uid = $this->parent->by_object['user']->uid;
+        /* Add sip entries to mysql queries */
+        $SQL_query_array[] ="INSERT INTO ".$a_New['VOICE_TABLE']." (".$s_voi_keys.") VALUES (".$s_voi_values.");";
       }
 
-      if((isset($this->parent->by_object['user']->cn))&&(!empty($this->parent->by_object['user']->cn))){
-        $this->cn  = $this->parent->by_object['user']->cn;
+     
+      /********************** 
+       * Remove/Insert extension entries
+       **********************/
+      
+      /* Remove old entries */
+      $query = array();
+      $query[]= "DELETE FROM ".$a_New['EXT_TABLE']." WHERE exten=\"".$this->uid."\";";
+      foreach($newnums as $s_telenums){
+        $query[]= "DELETE FROM ".$a_New['EXT_TABLE']." WHERE exten=\"".$s_telenums."\";";
       }
-
-      if((!isset($this->cn))||(empty($this->cn))){
-        $CNname= $this->uid;
-      }else{
-        $CNname= $this->cn;
+      foreach($query as $qry){
+        if(!mysql_query($qry,$new_connection)){
+          echo mysql_error($new_connection);
+        } 
       }
-
-      $SQL[]= "INSERT INTO ".$a_SETUP['VOICE_TABLE']." (`customer_id`,`context`,`mailbox`,`password`,`fullname`,`email`,`pager`)
-          VALUES   ('".$newnums[$i_new_key]."',
-                    'default',
-                    '".$newnums[$i_new_key]."',
-                    '".$this->goFonVoicemailPIN."',
-                    '".$CNname."',
-                    '".$s_mail."',
-                    '');";
-      $i_is_accounted=false;
-    
-      $i = 0; 
  
-      $is_inserted_once = false;
+      /********************** 
+       * Insert extension entries
+       **********************/
  
+      // Get selected Macro Parameter and create parameter entry 
+      if(isset($this->macroarray[$this->macro])){
+        foreach($this->macroarray[$this->macro] as $key => $val ){
+          $s_parameter .= $val['choosen']."|";
+        }
+        $s_parameter = preg_replace("/\|$/","",$s_parameter);
+      }
+     
+      $i = 0; 
+      $EXT = array();
+      $EXT[$i]['context'] = 'GOsa';
+      $EXT[$i]['exten']   = $this->uid;
+      $EXT[$i]['priority']= 1;
+      $EXT[$i]['app']     = "Goto";
+      $EXT[$i]['appdata'] = $newnums[$i_new_key]."|1";
+      $i ++;
+
       // Entension entries  Hint / Dial / Goto
       foreach($newnums as $s_telenums){
 
-        if(!$is_inserted_once){
-          $is_inserted_once = true;
-          $EXT[$i]['context'] = 'GOsa';
-          $EXT[$i]['exten']   = $this->uid;
-          $EXT[$i]['priority']= 1;
-          $EXT[$i]['app']     = "Goto";
-          $EXT[$i]['appdata'] = $s_telenums."|1";
-          $i ++;
-        }
         /* Hint Entry */
         $EXT[$i]['context'] = 'GOsa';
         $EXT[$i]['exten']   = $s_telenums;
@@ -545,12 +735,11 @@ class phoneAccount extends plugin
         $EXT[$i]['app']     = $s_app;
         $EXT[$i]['appdata'] = $s_par;
         $i ++;
-
       }
 
       // Append all these Entries 
       foreach($EXT as $entr){
-        $SQL_syn = "INSERT INTO ".$a_SETUP['EXT_TABLE']." (";
+        $SQL_syn = "INSERT INTO ".$a_New['EXT_TABLE']." (";
         foreach($entr as $key2 => $val2){
           $SQL_syn.= "`".$key2."`,";
         }
@@ -561,27 +750,30 @@ class phoneAccount extends plugin
         }
         $SQL_syn = preg_replace("/,$/","",$SQL_syn);
         $SQL_syn .=");\n";
-        $SQL[] =$SQL_syn;
+
+        $SQL_query_array[] =$SQL_syn;
         $SQL_syn ="";
       }
 
       // Perform queries ...
-      foreach($SQL as $query){
-        if(!@mysql_query($query,$r_con)){
-          print_red(_("Error while performing query:")." ".mysql_error());
-          return false;
+      if($this->goFonHardware != "automatic"){
+        foreach($SQL_query_array as $query){
+          if(!@mysql_query($query,$new_connection)){
+            print_red(_("Error while performing query:")." ".mysql_error());
+            return false;
+          }
         }
       }
     }
-    @mysql_close($r_con);
+    @mysql_close($new_connection);
     return true;
   }
 
 
   function execute()
   {
-       /* Call parent execute */
-       plugin::execute();
+    /* Call parent execute */
+    plugin::execute();
 
     $display = "";
 
@@ -601,7 +793,7 @@ class phoneAccount extends plugin
         /* Macroname saved, delete that index */
         unset($tmp[0]);
 
-        /* Check if makro has been removed */
+        /* Check if macro has been removed */
         if(!isset($this->macroarray[$this->macro])){
           $this->macrostillavailable = false;
         }else{
@@ -644,7 +836,7 @@ class phoneAccount extends plugin
     /* Prepare templating */
     $smarty= get_smarty();
 
-    /* tell user that the pluging selected is no longer available*/
+    /* tell user that the selected plugin is no longer available */
     if((!$this->macrostillavailable)&&($this->macro!="none")){
       print_red(_("The macro you selected, is no longer available for you, please choose another one."));
     }
@@ -654,11 +846,13 @@ class phoneAccount extends plugin
     $smarty->assign("macro", $this->macro);   
 
     /* check if there is a FON server created */
-    if(!isset($_SESSION['config']->data['SERVERS']['FON'][0])){
+    if(!count($this->goFonHomeServer)){
       print_red(_("There is currently no asterisk server defined. Possibly you are missing a server that handles the asterisk management (goFonServer). Your settings can't be saved to asterisk database."));
     }
 
-    /* Create parameter table, skip if no parameters given */
+    /* Create html parameter table for selected macro parameters 
+     *  skip if no parameters given 
+     */
     if(!isset($this->macroarray[$this->macro])){
       $macrotab="";
     }else{
@@ -669,8 +863,6 @@ class phoneAccount extends plugin
       foreach($this->phoneNumbers as $phonenum){
         $tmp[] = $phonenum;
       }
-
-      
     
       if($this->macro != $this->lastmacro){
         /* Go through all params */
@@ -716,7 +908,7 @@ class phoneAccount extends plugin
         switch ($type){
 
           case "combo":
-            $str= "<select name='".$var."' ".$dis.">";
+            $str= "<select name='".$var."' ".$dis." >";
           foreach(split(":",$default) as $choice){
             if($choosen==$choice){
               $str.= "\n<option value='".$choice."' selected>".$choice."&nbsp;</option>";
@@ -730,7 +922,7 @@ class phoneAccount extends plugin
 
           case "bool":
             if(!$choosen){
-              $str="\n<input type='checkbox' name='".$var."' value='1' ".$dis.">";
+              $str="\n<input type='checkbox' name='".$var."' value='1' ".$dis." >";
             }else{
               $str="\n<input type='checkbox' name='".$var."' value='1' checked  ".$dis.">";
             }
@@ -738,7 +930,7 @@ class phoneAccount extends plugin
           break;
 
           case "string":
-            $str="<input name='".$var."' value='".$choosen."' style='width:340px;' ".$dis.">";
+            $str="<input name='".$var."' value='".$choosen."' ".$dis." style='width:340px;'>";
           $macrotab.= "<td>".base64_decode($name)."</td><td>$str";
           break;
 
@@ -752,6 +944,7 @@ class phoneAccount extends plugin
     /* Give smarty the table */
     $smarty->assign("macrotab",$macrotab);
 
+
     /* Do we represent a valid account? */
     if (!$this->is_account && $this->parent == NULL){
       $display= "<img alt=\"\" src=\"images/stop.png\" align=\"middle\">&nbsp;<b>".
@@ -761,8 +954,7 @@ class phoneAccount extends plugin
     }
 
     $display= "";
-
-    /* Show tab dialog headers */
+ /* Show tab dialog headers */
     if ($this->parent != NULL){
       if ($this->is_account){
         $display= $this->show_disable_header(_("Remove phone account"),
@@ -808,29 +1000,36 @@ class phoneAccount extends plugin
       }
     }
 
+    /* Create home server array */
+    $tmp = array();
+    foreach($this->goFonHomeServers as $dn => $attrs){
+      if(!is_numeric($dn)){
+        $tmp[$dn] = $attrs['SERVER'];
+      }
+    }
+    $smarty->assign("goFonHomeServers",$tmp);
+
     /* Fill arrays */
     $smarty->assign ("goFonHardware", $this->goFonHardware);
     if (!count($this->phoneNumbers)){
-      $smarty->assign ("phoneNumbers", array(""));
+      $smarty->assign ("phoneNumbers", array());
     } else {
       $smarty->assign ("phoneNumbers", $this->phoneNumbers);
     }
 
-
     $dis = "";
     if(!$this->acl_is_writeable("goFonHardware",$SkipWrite)){
       $dis= " disabled ";
     }
     $hl= "<select size=\"1\" name=\"goFonHardware\" ".$dis." title=\"".
-      _("Choose your private phone")."\">\n";
-    foreach ($this->hardware_list as $cn => $description){
+       _("Choose your private phone")."\">\n";
 
+    foreach ($this->hardware_list as $cn => $description){
       if ($cn == $this->goFonHardware){
         $selected= "selected";
       } else {
         $selected= "";
       }
-
       if (isset($this->used_hardware[$cn])){
         $color= "style=\"color:#A0A0A0\"";
       } else {
@@ -849,11 +1048,23 @@ class phoneAccount extends plugin
 
 
   function save_object()
-  { 
+  {
     $SkipWrite = (!isset($this->parent) || !$this->parent) && !isset($_SESSION['edit']);
     if (isset($_POST["phoneTab"])){
       plugin::save_object();
 
+      /* Save checkbox */
+      $tmp = preg_replace("/[^a-z]/i","",$this->goFonDeliveryMode);
+      if($this->acl_is_writeable("goFonDeliveryMode",$SkipWrite)){
+        if(isset($_POST['fon_to_mail']) && !preg_match("/M/",$this->goFonDeliveryMode)){
+          $tmp .= "M";
+        }elseif(!isset($_POST['fon_to_mail']) && preg_match("/M/",$this->goFonDeliveryMode)){
+          $tmp  = preg_replace ("/M/","",$tmp);
+        }
+      }
+      $this->goFonDeliveryMode= "[".$tmp."]";
+
+
       /* Every macro in the select box are available */
       if((isset($_POST['macro']))){
         $this->macrostillavailable=true;
@@ -868,28 +1079,15 @@ class phoneAccount extends plugin
       }
 
 
-      /* Save checkbox */
-      $tmp = preg_replace("/[^a-z]/i","",$this->goFonDeliveryMode);
-      if($this->acl_is_writeable("goFonDeliveryMode",$SkipWrite)){
-        if(isset($_POST['fon_to_mail']) && !preg_match("/M/",$this->goFonDeliveryMode)){
-          $tmp .= "M";
-        }elseif(!isset($_POST['fon_to_mail']) && preg_match("/M/",$this->goFonDeliveryMode)){
-          $tmp  = preg_replace ("/M/","",$tmp);
-        }
-      }
-      $this->goFonDeliveryMode= "[".$tmp."]";
-
-
-
       /* get all Postvars */
       if(isset($this->macroarray[$this->macro])){
-        if($this->acl_is_writeable("goFonMarco",$SkipWrite)){ 
+        if($this->acl_is_writeable("goFonMarco",$SkipWrite)){
           foreach($this->macroarray[$this->macro] as $key => $paras){
             if(isset($_POST[$paras['var']])){
               $this->macroarray[$this->macro][$key]['choosen'] = $_POST[$paras['var']];
             }
 
-            /* Checkboxes are special, they are not Posted if they are not selected, so the won't be changed with the above code 
+            /* Checkboxes are special, they are not Posted if they are not selected, so the won't be changed with the above code
                We need this code below to read and save checkboxes correct
              */
 
@@ -913,6 +1111,14 @@ class phoneAccount extends plugin
     /* Call common method to give check the hook */
     $message= plugin::check();
 
+    if(!count($this->goFonHomeServers)){
+      $message[] = _("There must be at least one server with an asterisk database to create a phone account.");
+    }
+
+    if(empty($this->goFonHomeServer)){
+      $message[] = _("Please select a valid goFonHomeServer.");
+    }
+
     if((strlen($this->goFonVoicemailPIN)==0)||(strlen($this->goFonVoicemailPIN)>4)){
       $message[]=(_("Voicemail PIN must be between 1-4 characters."));
     }else{
@@ -955,10 +1161,20 @@ class phoneAccount extends plugin
   {
     plugin::save();
 
+    /* Force saving macro again 
+     * This ensures that 
+     *  - the macro is available on the destiantion server.
+     *  - the macro saved is up to date on the destination server.
+     */
+    if(!empty($this->macro) && $this->macro != "none")  {
+      $macro_tab = new macrotabs($this->config,$this->config->data['TABS']['MACROTABS'], $this->macro);
+      $macro_tab -> save();
+    }
+
     /* Save arrays */
-    $this->attrs['telephoneNumber']= array();
+    $tmp_numbers = array();
     foreach ($this->phoneNumbers as $number){
-      $this->attrs['telephoneNumber'][]= $number;
+      $tmp_numbers[] = $number;
     }
 
     /* Save settings, or remove goFonMacro attribute*/
@@ -976,7 +1192,10 @@ class phoneAccount extends plugin
 
     $this->attrs['goFonForwarding']=array();
 
-    $this->generate_mysql_entension_entries(true);
+    $str = $this->generate_mysql_entension_entries(true);
+    if(empty($str)){
+      print_red($str);
+    }
 
     if($this->attrs['goFonMacro']==""){
       $this->attrs['goFonMacro']=array();
@@ -988,6 +1207,9 @@ class phoneAccount extends plugin
     $ldap= $this->config->get_ldap_link();
     $ldap->cd($this->dn);
     $this->cleanup();
+    
+    /* Force saving numbers, else it will be overwriten by user account. */
+    $this->attrs['telephoneNumber'] =$tmp_numbers;
     $ldap->modify ($this->attrs); 
 
     show_ldap_error($ldap->get_error(), sprintf(_("Saving of user/phone account with dn '%s' failed."),$this->dn));
@@ -996,7 +1218,7 @@ class phoneAccount extends plugin
 
     if ($this->initially_was_account == $this->is_account){
       if ($this->is_modified){
-        $this->handle_post_events("modify",array("uid"=> $this->uid));
+        $this->handle_post_events("modify",array("uid" => $this->uid));
       }
     } else {
       $this->handle_post_events("add",array("uid" => $this->uid));
@@ -1005,28 +1227,6 @@ class phoneAccount extends plugin
   }
 
 
-  function insert_after($entry, $nr, $list)
-  {
-    /* Is the entry free? No? Make it free... */
-    if (isset($list[$nr])) {
-      $dest= array();
-      $newidx= 0;
-
-      foreach ($list as $idx => $contents){
-        $dest[$newidx++]= $contents;
-        if ($idx == $nr){
-          $dest[$newidx++]= $entry;
-        }
-      }
-    } else {
-      $dest= $list;
-      $dest[$nr]= $entry;
-    }
-
-    return ($dest);
-  }
-
-
   function adapt_from_template($dn)
   {
     plugin::adapt_from_template($dn);
@@ -1051,12 +1251,10 @@ class phoneAccount extends plugin
         unset($this->$val);
       }
     }
-    if(array_key_exists('config', $_SESSION) &&
-       array_key_exists('SERVERS', $_SESSION['config']->data) &&
-       array_key_exists('FON', $_SESSION['config']->data['SERVERS']) &&
-        is_callable("mysql_pconnect")) {
-      // Get Configuration for Mysql database Server
-      $a_SETUP = $_SESSION['config']->data['SERVERS']['FON'][0];
+    if(count($this->goFonHomeServers) && !empty($this->init_HomeServer) && is_callable("mysql_pconnect")){
+
+      // Get Configuration for initial Mysql database Server
+      $a_SETUP = $this->goFonHomeServers[$this->init_HomeServer];
       $s_parameter  ="";
 
       // Connect to DB server
@@ -1155,7 +1353,7 @@ class phoneAccount extends plugin
 
     /* Optionally execute a command after we're done */
     @mysql_close($r_con);
-    $this->handle_post_events('remove',array("uid" => $this->uid));
+    $this->handle_post_events('remove',array("uid"=> $this->uid));
   }
 
 
@@ -1224,6 +1422,14 @@ class phoneAccount extends plugin
   }
 
 
+  function allow_remove()
+  {
+    /* Check if previously selected server is still available */
+    if($this->initially_was_account && !isset($this->goFonHomeServers[$this->goFonHomeServer])){
+      return sprintf(_("The previously selected asterisk home server (%s) is no longer available. Remove aborted."),preg_replace("/,/",", ",$this->goFonHomeServer));
+    }
+  }
+
   /* Return plugin informations for acl handling */
   function plInfo()
   {
@@ -1235,7 +1441,7 @@ class phoneAccount extends plugin
           "plPriority"      => 7,                                 // Position in tabs
           "plSection"       => "personal",                        // This belongs to personal
           "plCategory"      => array("gofonreport" => array("description" => _("GOfon reports"),
-                                                  "objectClass" => "")),
+              "objectClass" => "")),
 
           "plOptions"       => array(),
 
@@ -1245,7 +1451,7 @@ class phoneAccount extends plugin
             "goFonHardware"       => _("Phone hardware"),
             "goFonPIN"            => _("Telephone pin"),
             "goFonVoicemailPIN"   => _("Voicemail pin"))
-            ));
+          ));
   }
 }
 
index 33e494d8405d60964ccbc3b2572b33807c55c4ef..ae726bedb53b8fd0957e717c953c44d9dbe5e4cb 100644 (file)
         <td>{t}Telephone{/t}</td>
         <td>{$hardware_list}</td>
        </tr>
+       <tr>
+        <td>{t}Home server{/t}{$must}
+        </td>
+        <td>
+{render acl=$goFonHomeServerACL}
+         <select name='goFonHomeServer' title='{t}Select the accounts home server{/t}'>
+          {html_options options=$goFonHomeServers selected=$goFonHomeServer}
+         </select>
+{/render}
+        </td>
+      </tr>
       <tr>
        <td>
         <label for="goFonVoicemailPIN">{t}Voicemail PIN{/t}{$must}</label>