PageRenderTime 46ms CodeModel.GetById 16ms RepoModel.GetById 1ms app.codeStats 0ms

/modules/esl-1.1/controllers/esl.php

https://github.com/robertleeplummerjr/bluebox
PHP | 449 lines | 312 code | 73 blank | 64 comment | 63 complexity | 98264880bf4b971371b4fd321d4d114d MD5 | raw file
  1. <?php defined('SYSPATH') or die('No direct access allowed.');
  2. /*
  3. * Bluebox Modular Telephony Software Library / Application
  4. *
  5. * Module:
  6. *
  7. * The contents of this file are subject to the Mozilla Public License
  8. * Version 1.1 (the "License"); you may not use this file except in
  9. * compliance with the License. You may obtain a copy of the License at
  10. * http://www.mozilla.org/MPL/
  11. *
  12. * Software distributed under the License is distributed on an "AS IS"
  13. * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
  14. * License for the specific language governing rights and limitations
  15. * under the License.
  16. *
  17. * The Initial Developer of the Original Code is Michael Phillips <michael.j.phillips@gmail.com>.
  18. *
  19. * Portions created by the Initial Developer are Copyright (C)
  20. * the Initial Developer. All Rights Reserved.
  21. *
  22. * Contributor(s):
  23. *
  24. *
  25. */
  26. /**
  27. * esl.php - Sofia Viewer Module
  28. *
  29. * @author Michael Phillips <michael.j.phillips@gmail.com>
  30. * @author Jon Blanton <jon@2600hz.com>
  31. * @author Rockwood Cataldo <rocco@2600hz.com>
  32. * @license MPL
  33. * @package Esl
  34. */
  35. class Esl_Controller extends Bluebox_Controller
  36. {
  37. public function index()
  38. {
  39. stylesheet::add('esl', 50);
  40. javascript::add('pubsub.js', 50);
  41. //CLEAR THE ESL SESSION
  42. $_SESSION['esl'] = array();
  43. }
  44. public function eslresponse() {
  45. $this->auto_render = FALSE;
  46. $event = $_POST['event'];
  47. $eslManager = EslManager::getInstance();
  48. switch ($event) {
  49. case 'esl/reloadacl':
  50. if($eslManager->isConnected()) {
  51. $result = $eslManager->reloadacl();
  52. $response = $eslManager->getResponse($result);
  53. }
  54. // Can't connect to Freeswitch
  55. else {
  56. $response = "Cannot connect to Freeswitch";
  57. }
  58. break;
  59. case 'esl/reloadxml':
  60. if($eslManager->isConnected()) {
  61. $result = $eslManager->reloadxml();
  62. $response = $eslManager->getResponse($result);
  63. }
  64. // Can't connect to Freeswitch
  65. else {
  66. $response = "Cannot connect to Freeswitch";
  67. }
  68. break;
  69. case 'esl/reloadsofia':
  70. if($eslManager->isConnected()) {
  71. $result = $eslManager->reload('mod_sofia');
  72. $response = $eslManager->getResponse($result);
  73. }
  74. // Can't connect to Freeswitch
  75. else {
  76. $response = "Cannot connect to Freeswitch";
  77. }
  78. break;
  79. case 'esl/reloadDingaling':
  80. if($eslManager->isConnected()) {
  81. $result = $eslManager->reload('mod_dingaling');
  82. $response = $eslManager->getResponse($result);
  83. }
  84. // Can't connect to Freeswitch
  85. else {
  86. $response = "Cannot connect to Freeswitch";
  87. }
  88. break;
  89. case 'esl/reinitializeNAT':
  90. if($eslManager->isConnected()) {
  91. $result = $eslManager->nat('reinit');
  92. $response = $eslManager->getResponse($result);
  93. }
  94. // Can't connect to Freeswitch
  95. else {
  96. $response = "Cannot connect to Freeswitch";
  97. }
  98. break;
  99. case 'esl/republishNAT':
  100. if($eslManager->isConnected()) {
  101. $result = $eslManager->nat('republish');
  102. $response = $eslManager->getResponse($result);
  103. }
  104. // Can't connect to Freeswitch
  105. else {
  106. $response = "Cannot connect to Freeswitch";
  107. }
  108. break;
  109. case 'esl/manual_entry':
  110. if($eslManager->isConnected()) {
  111. $result = $eslManager->sendRecv("api " . $_POST['param']);
  112. $response = $eslManager->getResponse($result);
  113. }
  114. // Can't connect to Freeswitch
  115. else {
  116. $response = "Cannot connect to Freeswitch";
  117. }
  118. break;
  119. }
  120. echo $response;
  121. flush();
  122. die();
  123. }
  124. public function fluxresponse() {
  125. // Turn off the view
  126. $this->auto_render = FALSE;
  127. // Turn down log level
  128. $log_level = Kohana::config('core.log_threshold');
  129. Kohana::config_set('core.log_threshold', 2);
  130. $response = array();
  131. $eslManager = EslManager::getInstance();
  132. $subscribers = $_POST['subscribers'];
  133. foreach ($subscribers as $subscriber) {
  134. switch($subscriber) {
  135. case "esl/numactivecalls":
  136. if($eslManager->isConnected()) {
  137. $result = $eslManager->calls();
  138. $text = $eslManager->getResponse($result);
  139. preg_match("/[0-9]+(?=\stotal\.)/", $text, $output);
  140. $event = array("name" => $subscriber, "data" => array($output[0]));
  141. }
  142. // Can't connect to Freeswitch
  143. else {
  144. $event = array("name" => $subscriber, "data" => array("N\\A"));
  145. }
  146. break;
  147. case "esl/numactivemodules":
  148. if($eslManager->isConnected()) {
  149. $result = $eslManager->show('modules');
  150. $text = $eslManager->getResponse($result);
  151. preg_match("/[0-9]+(?=\stotal\.)/", $text, $output);
  152. $event = array("name" => $subscriber, "data" => array($output[0]));
  153. }
  154. // Can't connect to Freeswitch
  155. else {
  156. $event = array("name" => $subscriber, "data" => array("N\\A"));
  157. }
  158. break;
  159. case "esl/numactivechannels":
  160. if($eslManager->isConnected()) {
  161. $result = $eslManager->channels();
  162. $text = $eslManager->getResponse($result);
  163. preg_match("/[0-9]+(?=\stotal\.)/", $text, $output);
  164. $event = array("name" => $subscriber, "data" => array($output[0]));
  165. }
  166. // Can't connect to Freeswitch
  167. else {
  168. $event = array("name" => $subscriber, "data" => array("N\\A"));
  169. }
  170. break;
  171. case "esl/channels":
  172. if($eslManager->isConnected()) {
  173. $result = $eslManager->channels();
  174. $text = $eslManager->getResponse($result);
  175. $event = array("name" => $subscriber, "data" => array($text));
  176. }
  177. // Can't connect to Freeswitch
  178. else {
  179. $event = array("name" => $subscriber, "data" => array("N\\A"));
  180. }
  181. break;
  182. case "esl/numactivecodecs":
  183. if($eslManager->isConnected()) {
  184. $result = $eslManager->show('codecs');
  185. $text = $eslManager->getResponse($result);
  186. preg_match("/[0-9]+(?=\stotal\.)/", $text, $output);
  187. $event = array("name" => $subscriber, "data" => array($output[0]));
  188. }
  189. // Can't connect to Freeswitch
  190. else {
  191. $event = array("name" => $subscriber, "data" => array("N\\A"));
  192. }
  193. break;
  194. case "esl/modules":
  195. if($eslManager->isConnected()){
  196. $result = $eslManager->show('modules');
  197. $text = $eslManager->getResponse($result);
  198. preg_match_all("/(?<=\,)mod_[A-Za-z_0-9]+(?=,)/", $text, $output, PREG_PATTERN_ORDER);
  199. if(isset($output)) {
  200. // A dirty hack to eliminate duplicates
  201. $matches = array();
  202. foreach($output[0] as $value) {
  203. $matches[$value] = 1337;
  204. }
  205. $text = "";
  206. foreach($matches as $key => $value) {
  207. $text .= $key . ',';
  208. }
  209. }
  210. else {
  211. $text = "No modules found... I think something is broken.";
  212. }
  213. $event = array("name" => $subscriber, "data" => array($text));
  214. }
  215. else{
  216. $event=array("name" => $subscriber, "data" => array("Freeswitch not loaded.."));
  217. }
  218. break;
  219. case "esl/sipinterfaces":
  220. if($eslManager->isConnected()) {
  221. $result = $eslManager->sofia('status');
  222. $text = $eslManager->getResponse($result);
  223. $event = array("name" => $subscriber, "data" => array($text));
  224. }
  225. // Can't connect to Freeswitch
  226. else {
  227. $event = array("name" => $subscriber, "data" => array("N\\A"));
  228. }
  229. break;
  230. case "esl/calls":
  231. if($eslManager->isConnected()) {
  232. $result = $eslManager->calls();
  233. $text = $eslManager->getResponse($result);
  234. $event = array("name" => $subscriber, "data" => array($text));
  235. }
  236. // Can't connect to Freeswitch
  237. else {
  238. $event = array("name" => $subscriber, "data" => array("N\\A"));
  239. }
  240. break;
  241. case "esl/activecalls":
  242. if($eslManager->isConnected()) {
  243. $result = $eslManager->calls();
  244. $text = $eslManager->getResponse($result);
  245. $output = explode("\n", $text);
  246. $event = array("name" => $subscriber, "data" => array($text));
  247. }
  248. // Can't connect to Freeswitch
  249. else {
  250. $event = array("name" => $subscriber, "data" => array("N\\A"));
  251. }
  252. break;
  253. case "esl/uptime":
  254. if($eslManager->isConnected()) {
  255. $result = $eslManager->status();
  256. $text = $eslManager->getResponse($result);
  257. preg_match("/[0-9]+(?=\syear)/", $text, $output);
  258. $years = $output[0];
  259. preg_match("/[0-9]+(?=\sday)/", $text, $output);
  260. $days = $output[0];
  261. preg_match("/[0-9]+(?=\shour)/", $text, $output);
  262. $hours = $output[0];
  263. preg_match("/[0-9]+(?=\sminute)/", $text, $output);
  264. $mins = $output[0];
  265. preg_match("/[0-9]+(?=\ssecond)/", $text, $output);
  266. $secs = $output[0];
  267. $text = "";
  268. if($years > 0) {
  269. $text .= $years . " year";
  270. //Plurar check
  271. if($years > 1) {
  272. $text .= "s";
  273. }
  274. //check if there will be another field
  275. if($days + $hours + $mins > 0) {
  276. $text .= ", ";
  277. }
  278. }
  279. if($days > 0) {
  280. $text .= $days . " day";
  281. //Plurar check
  282. if($days > 1) {
  283. $text .= "s";
  284. }
  285. //check if there will be another field
  286. if($hours + $mins > 0) {
  287. $text .= ", ";
  288. }
  289. }
  290. if($hours > 0) {
  291. $text .= $hours . " hour";
  292. //Plurar check
  293. if($hours > 1) {
  294. $text .= "s";
  295. }
  296. //check if there will be another field
  297. if($mins > 0) {
  298. $text .= ", ";
  299. }
  300. }
  301. if($mins > 0) {
  302. $text .= $mins . " minute";
  303. //Plurar check
  304. if($mins > 1) {
  305. $text .= "s";
  306. }
  307. }
  308. if($mins + $hours + $days + $years == 0 && $secs > 0) {
  309. $text .= "<0 minutes";
  310. }
  311. $event = array("name" => $subscriber, "data" => array($text));
  312. }
  313. // Can't connect to Freeswitch
  314. else {
  315. $event = array("name" => $subscriber, "data" => array("(Server is down)"));
  316. }
  317. break;
  318. case "esl/logviewer":
  319. //Do some nifty magic to get freeswitch root path
  320. $confpath = Kohana::config('freeswitch.cfg_root');
  321. preg_match('/.+(?=\/conf$)/', $confpath, $output);
  322. $basepath = $output[0];
  323. $logfile = $basepath . "/log/freeswitch.log";
  324. if(!file_exists($logfile))
  325. {
  326. if(!file_exists($logfile = '/var/log/freeswitch/freeswitch.log'))
  327. {
  328. // If you still can't find the log file, just give up
  329. break;
  330. }
  331. }
  332. if(!isset($_SESSION["esl"]["logviewer_pos"])) {
  333. $logviewer_pos = filesize($logfile) - 1200;
  334. if($logviewer_pos < 0) {
  335. $logviewer_pos = 0;
  336. }
  337. }
  338. else {
  339. $logviewer_pos = $_SESSION["esl"]["logviewer_pos"];
  340. }
  341. $text = "";
  342. $log_pointer = fopen($logfile, "r");
  343. fseek($log_pointer, $logviewer_pos);
  344. //Skip to the first complete line....
  345. while(($char = fgetc($log_pointer)))
  346. if ($char == "\n") break;
  347. while(!feof($log_pointer)) {
  348. $line = fgets($log_pointer);
  349. if(trim($line) != "")
  350. $text .= $line;
  351. }
  352. $_SESSION["esl"]["logviewer_pos"] = ftell($log_pointer);
  353. fclose($log_pointer);
  354. $event = array("name" => $subscriber, "data" => array($text));
  355. break;
  356. default:
  357. $event = NULL;
  358. break;
  359. }
  360. if(isset($event)) {
  361. if(isset($_SESSION["esl"][$subscriber])) {
  362. if($_SESSION["esl"][$subscriber] == $event["data"]) {
  363. continue;
  364. }
  365. }
  366. $_SESSION["esl"][$subscriber] = $event["data"];
  367. $response[] = $event;
  368. }
  369. }
  370. // Restore log level
  371. Kohana::config_set('core.log_threshold', $log_level);
  372. echo json_encode($response);
  373. flush();
  374. die();
  375. }
  376. }