root/freepbx/trunk/upgrades/1.10.007beta1/upgraderoutes.php

Revision 260, 8.1 kB (checked in by rcourtna, 8 years ago)

typo in fixcallfw. accomodate for 'default trunk' in upgraderoutes.php

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
Line 
1 <?php
2
3 /* check for old prefix based routing */
4 outn("Upgrading Dial Prefix to Outbound Routes..");
5
6 // see if they're still using the old dialprefix method
7 $sql = "SELECT variable,value FROM globals WHERE variable LIKE 'DIAL\\\_OUT\\\_%'";
8 // we SUBSTRING() to remove "outrt-"
9 $results = $db->getAll($sql);
10 if(DB::IsError($results)) {
11     die($results->getMessage());
12 }
13
14 outn(count($results)." to update..");
15
16 if (count($results) > 0) {
17     // yes, they are using old method, let's update
18     
19     // get the default trunk
20     $sql = "SELECT value FROM globals WHERE variable = 'OUT'";
21     $results_def = $db->getAll($sql);
22     if(DB::IsError($results_def)) {
23         die($results_def->getMessage());
24     }
25     
26     if (preg_match("/{OUT_(\d+)}/", $results_def[0][0], $matches)) {
27         $def_trunk = $matches[1];
28     } else {
29         $def_trunk = "";
30     }
31     
32     $default_patterns = array(    // default patterns that used to be in extensions.conf
33                 ".",
34 /*
35                 "NXXXXXX",
36                 "NXXNXXXXXX",
37                 "1800NXXXXXX",
38                 "1888NXXXXXX",
39                 "1877NXXXXXX",
40                 "1866NXXXXXX",
41                 "1NXXNXXXXXX",
42                 "011.",
43                 "911",
44                 "411",
45                 "311",
46 */
47                 );
48
49     $default_patterns2 = array(    // default patterns that used to be in extensions.conf
50                 "NXXXXXX",
51                 "NXXNXXXXXX",
52                 "1800NXXXXXX",
53                 "1888NXXXXXX",
54                 "1877NXXXXXX",
55                 "1866NXXXXXX",
56                 "1NXXNXXXXXX",
57                 "011.",
58                 "911",
59                 "411",
60                 "311",
61                 );
62     
63     foreach ($results as $temp) {
64         // temp[0] is "DIAL_OUT_1"
65         // temp[1] is the dial prefix
66         
67         $trunknum = substr($temp[0],9);
68         
69         $name = "route".$trunknum;
70         
71         $trunks = array(1=>"OUT_".$trunknum); // only one trunk to use
72         
73         $patterns = array();
74         foreach ($default_patterns as $pattern) {
75             $patterns[] = $temp[1]."|".$pattern;
76         }
77         
78         if ($trunknum == $def_trunk) {
79             // this is the default trunk, add the patterns with no prefix
80             $patterns = array_merge($patterns, $default_patterns2);
81         }
82         
83         // add this as a new route
84         addroute($name, $patterns, $trunks);
85     }
86     
87     
88     // delete old values
89     $sql = "DELETE FROM globals WHERE (variable LIKE 'DIAL\\\_OUT\\\_%') OR (variable = 'OUT') ";
90     debug($sql);
91     $result = $db->query($sql);
92     if(DB::IsError($result)) {
93         die($result->getMessage());
94     }
95     
96 }
97
98 out("OK");
99
100 outn("Upgrading Routes Names..");
101 $reason=FixTables();
102 $reason=FixRoutes();
103 out("OK");
104
105 function addroute($name, $patterns, $trunks) {
106     global $db;
107
108     $trunktech=array();
109
110     //Retrieve each trunk tech for later lookup
111     $sql="select * from globals WHERE variable LIKE 'OUT\\_%'";
112         $result = $db->getAll($sql);
113         if(DB::IsError($result)) {
114         die($result->getMessage());
115     }
116     foreach($result as $tr) {
117         $tech = strtok($tr[1], "/");
118         $trunktech[$tr[0]]=$tech;
119     }
120     
121     $trunks = array_values($trunks); // probably already done, but it's important for our dialplan
122     
123     foreach ($patterns as $pattern) {
124         
125         if (false !== ($pos = strpos($pattern,"|"))) {
126             // we have a | meaning to not pass the digits on
127             // (ie, 9|NXXXXXX should use the pattern _9NXXXXXX but only pass NXXXXXX, not the leading 9)
128             
129             $pattern = str_replace("|","",$pattern); // remove all |'s
130             $exten = "EXTEN:".$pos; // chop off leading digit
131         } else {
132             // we pass the full dialed number as-is
133             $exten = "EXTEN";
134         }
135         
136         if (!preg_match("/^[0-9*]+$/",$pattern)) {
137             // note # is not here, as asterisk doesn't recoginize it as a normal digit, thus it requires _ pattern matching
138             
139             // it's not strictly digits, so it must have patterns, so prepend a _
140             $pattern = "_".$pattern;
141         }
142         
143         foreach ($trunks as $priority => $trunk) {
144             $priority += 1; // since arrays are 0-based, but we want priorities to start at 1
145             
146             $sql = "INSERT INTO extensions (context, extension, priority, application, args) VALUES ";
147             $sql .= "('outrt-".$name."', ";
148             $sql .= "'".$pattern."', ";
149             $sql .= "'".$priority."', ";
150             $sql .= "'Macro', ";
151             if ($trunktech[$trunk] == "ENUM")
152                 $sql .= "'dialout-enum,".substr($trunk,4).",\${".$exten."}'"; // cut off OUT_ from $trunk
153             else
154                 $sql .= "'dialout-trunk,".substr($trunk,4).",\${".$exten."}'"; // cut off OUT_ from $trunk
155             $sql .= ")";
156             
157             debug($sql);
158             $result = $db->query($sql);
159             if(DB::IsError($result)) {
160                 die($result->getMessage());
161             }
162         }
163         
164         $priority += 1;
165         $sql = "INSERT INTO extensions (context, extension, priority, application, args, descr) VALUES ";
166         $sql .= "('outrt-".$name."', ";
167         $sql .= "'".$pattern."', ";
168         $sql .= "'".$priority."', ";
169         $sql .= "'Macro', ";
170         $sql .= "'outisbusy', ";
171         $sql .= "'No available circuits')";
172         
173         debug($sql);
174         $result = $db->query($sql);
175         if(DB::IsError($result)) {
176             die($result->getMessage());
177         }
178     }
179
180     
181     // add an include=>outrt-$name  to [outbound-allroutes]:
182     
183     // we have to find the first available priority.. priority doesn't really matter for the include, but
184     // there is a unique index on (context,extension,priority) so if we don't do this we can't put more than
185     // one route in the outbound-allroutes context.
186     $sql = "SELECT priority FROM extensions WHERE context = 'outbound-allroutes' AND extension = 'include'";
187     $results = $db->getAll($sql);
188     if(DB::IsError($results)) {
189         die($results->getMessage());
190     }
191     $priorities = array();
192     foreach ($results as $row) {
193         $priorities[] = $row[0];
194     }
195     for ($priority = 1; in_array($priority, $priorities); $priority++);
196     
197     // $priority should now be the lowest available number
198     
199     $sql = "INSERT INTO extensions (context, extension, priority, application, args, descr, flags) VALUES ";
200     $sql .= "('outbound-allroutes', ";
201     $sql .= "'include', ";
202     $sql .= "'".$priority."', ";
203     $sql .= "'outrt-".$name."', ";
204     $sql .= "'', ";
205     $sql .= "'', ";
206     $sql .= "'2')";
207     
208     debug($sql);
209     $result = $db->query($sql);
210     if(DB::IsError($result)) {
211         die($priority.$result->getMessage());
212     }
213     
214 }
215
216 function FixTables() {
217         global $db;
218
219           $sql = "ALTER TABLE extensions modify context varchar(45) NOT NULL default 'default'";
220           $result = $db->query($sql);
221     if(DB::IsError($result)) {
222         die($result->getMessage());
223           }
224           $sql = "ALTER TABLE extensions modify application varchar(45) NOT NULL default ''";
225           $result = $db->query($sql);
226     if(DB::IsError($result)) {
227         die($result->getMessage());
228           }
229         return true;
230 }
231 function FixRoutes() {
232         global $db;
233
234     $sql = "SELECT DISTINCT SUBSTRING(context,7) FROM extensions WHERE context LIKE 'outrt-001-%' ORDER BY context ";
235         $routes = $db->getAll($sql);
236         if (count($routes) > 0) {
237                 // the route is already in the correct format therefore we need not rename them
238         return true;
239     }
240
241         $sql = "DELETE from  extensions WHERE context='outbound-allroutes'";
242         $result = $db->query($sql);
243         if(DB::IsError($result)) {
244             die($result->getMessage().$sql);
245         }
246         $sql = "SELECT DISTINCT SUBSTRING(context,7) FROM extensions WHERE context LIKE 'outrt-%' ORDER BY context ";
247         $routes = $db->getAll($sql);
248         if (count($routes) > 0) {
249                 // there's a route therefore we need to rename them
250         $key=1;
251         foreach ($routes as $route) {
252             $prefix=setroutepriorities($key);
253                   $sql = "UPDATE extensions SET context = 'outrt-".$prefix."-".$route[0]."' WHERE context = 'outrt-".$route[0]."'";
254                   $result = $db->query($sql);
255             if(DB::IsError($result)) {
256                 die($result->getMessage());
257                   }
258
259             // Delete and readd the outbound-allroutes entries
260                     $sql = "INSERT INTO extensions (context, extension, priority, application, args, descr, flags) VALUES ";
261                     $sql .= "('outbound-allroutes', ";
262                     $sql .= "'include', ";
263                     $sql .= "'".$key."', ";
264                     $sql .= "'outrt-".$prefix."-".$route[0]."', ";
265                     $sql .= "'', ";
266                     $sql .= "'', ";
267                     $sql .= "'2')";
268
269                     $result = $db->query($sql);
270                     if(DB::IsError($result)) {
271                             die($result->getMessage(). $sql);
272                     }
273             $key++;
274             }
275         }
276     else
277         return false;
278
279         return true;
280 }
281 function setroutepriorities($key)
282 {
283         if ($key<10)
284                 $prefix = sprintf("00%d",$key);
285         else if ((9<$key)&&($key<100))
286                 $prefix = sprintf("0%d",$key);
287         else if ($key>100)
288                 $prefix = sprintf("%d",$key);
289         return ($prefix);
290 }
291
292 ?>
293
Note: See TracBrowser for help on using the browser.