GenerateRemoteCrontabCommand.php 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. <?php
  2. namespace StatsBundle\Command;
  3. use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand;
  4. use Symfony\Component\Console\Input\InputOption;
  5. use Symfony\Component\Console\Input\InputInterface;
  6. use Symfony\Component\Console\Output\OutputInterface;
  7. class GenerateRemoteCrontabCommand extends ContainerAwareCommand
  8. {
  9. protected function configure()
  10. {
  11. $this
  12. ->setName('stats:crontab:remote')
  13. ->setDescription('Generate Remote Stats Crontab File')
  14. ->setHelp('El comando genera/actualiza el archivo crontab de manera remota para realizar consultas a dispositivos')
  15. ->setDefinition(array(
  16. new InputOption('file-crontab', false, InputOption::VALUE_OPTIONAL, "File Crontab", "/etc/cron.d/fd3_stats"),
  17. new InputOption('path-app', false, InputOption::VALUE_OPTIONAL, "Path App", "/opt/stats"),
  18. new InputOption('url', false, InputOption::VALUE_OPTIONAL, "Crontab webservice url"),
  19. new InputOption('amqp', false, InputOption::VALUE_OPTIONAL, "Execute the commands via amqp", true),
  20. new InputOption('routing_key', false, InputOption::VALUE_OPTIONAL, "AMQP Routing key"),
  21. ))
  22. ;
  23. }
  24. /**
  25. * @param InputInterface $input
  26. * @param OutputInterface $output
  27. */
  28. protected function execute(InputInterface $input, OutputInterface $output)
  29. {
  30. $this->output = $output;
  31. $fileCrontab = $input->getOption('file-crontab');
  32. $pathApp = $input->getOption('path-app');
  33. $url = $input->getOption('url');
  34. if (is_null($url)) {
  35. if ($this->getContainer()->hasParameter('url_crontab')) {
  36. $url = $this->getContainer()->getParameter('url_crontab');
  37. } else {
  38. $output->writeln('<error>ERROR:</error> Debe definir una url para generar el crontab.');
  39. $output->writeln($this->getSynopsis());
  40. return;
  41. }
  42. }
  43. $times = array();
  44. $now = date("d-m-Y H:i:s");
  45. $content = PHP_EOL . "# NO EDITAR este archivo, se autogenera con el comando stats:crontab:remote. Generado {$now}." . PHP_EOL;
  46. $doctrine = $this->getContainer()->get('doctrine.orm.entity_manager');
  47. if (is_null($pathApp)) {
  48. $pathApp = $this->getContainer()->getParameter('app_path');
  49. }
  50. $pathConsole = "root $(which php) {$pathApp}/bin/console";
  51. $serverDevices = $doctrine->getRepository('\StatsBundle\Entity\DeviceServer')->findAll();
  52. $oltMarks = array('FiberHome', 'FiberLink', 'Huawei');
  53. $oltLibraries = array('OIDSFiberHomeV1', 'OIDSHuaweiV1');
  54. $amqp = $input->getOption('amqp');
  55. $amqpRemote = '';
  56. $routing_key = '';
  57. if ($amqp) {
  58. $amqpRemote = 'amqp:remote';
  59. // Verifico la routing key si se pasa como parametro o variable de entorno
  60. // default routing_key = stats
  61. $routing_key = $input->getOption('routing_key');
  62. if (!$routing_key) {
  63. $routing_key = getenv('AMQP_KEY') !== false ? getenv('AMQP_KEY') : 'stats';
  64. }
  65. $routing_key = "--route={$routing_key}";
  66. }
  67. $content .= "*/5 * * * * {$pathConsole} stats:crontab:remote" . PHP_EOL;
  68. foreach ($serverDevices as $server) {
  69. $content .= PHP_EOL . PHP_EOL . "# SERVER {$server->getName()} / {$server->getUrl()}" . PHP_EOL;
  70. // APARTADO OLT
  71. $oltDevices = $doctrine->getRepository('\StatsBundle\Entity\Device')->findBy(array('deviceType' => 'FTTHBundle\Entity\OLT', 'deviceServer' => $server));
  72. $serverId = $server->getId();
  73. $saveHistoric = $server->getSaveHistoric();
  74. ($saveHistoric)? $saveHistoric = 1 : $saveHistoric = 0;
  75. foreach ($oltDevices as $device) {
  76. $commands = array();
  77. $data = $device->jsonExtraData();
  78. $deviceId = $device->getDeviceId();
  79. if ($data['executeSnmp'] == 0){
  80. $content .= PHP_EOL . PHP_EOL . "# Device {$deviceId} skiped, executeSnmp is 0" . PHP_EOL;
  81. continue;
  82. }
  83. if (!in_array($data['mark'], $oltMarks)){
  84. $content .= PHP_EOL . PHP_EOL . "# Device {$deviceId} skiped, mark is not one of " . implode(", ", $oltMarks). PHP_EOL;
  85. continue;
  86. }
  87. if (!in_array($data['library'], $oltLibraries)){
  88. $content .= PHP_EOL . PHP_EOL . "# Device {$deviceId} skiped, library is not one of " . implode(", ", $oltLibraries). PHP_EOL;
  89. continue;
  90. }
  91. $oltName = $data['name'];
  92. $mark = strtolower($data['mark']);
  93. $library = $data['library'];
  94. $snmpCommunity = $data['snmpCommunity'];
  95. $deviceIp = $device->getIp();
  96. $timeScan = $data['timeScan'];
  97. $timeOnuStats = $data['timeOnuStats'];
  98. $timePonStats = $data['timePonStats'];
  99. $timeOltOctets = $data['timeOltOctets'];
  100. $params = "--olt-ip={$deviceIp} --olt-community={$snmpCommunity} --olt-snmp-library={$library} --olt-device-id={$deviceId} --olt-server-id={$serverId}";
  101. if ($amqp) {
  102. $params = "--args=--olt-ip:{$deviceIp} --args=--olt-community:{$snmpCommunity} --args=--olt-snmp-library:{$library} --args=--olt-device-id:{$deviceId} --args=--olt-server-id:{$serverId}";
  103. }
  104. $commands[] = "*/{$timeScan} * * * * {$pathConsole} {$amqpRemote} {$routing_key} {$mark}:pon:scan {$params}";
  105. $commands[] = "*/{$timeScan} * * * * {$pathConsole} {$amqpRemote} {$routing_key} {$mark}:onu:scan {$params}";
  106. $commands[] = "*/{$timeScan} * * * * {$pathConsole} {$amqpRemote} {$routing_key} {$mark}:olt:scan {$params}";
  107. if ($amqp) {
  108. $params .= " --args=--save-historic:{$saveHistoric}";
  109. } else {
  110. $params .= " --save-historic={$saveHistoric}";
  111. }
  112. $commands[] = "*/{$timeOnuStats} * * * * {$pathConsole} {$amqpRemote} {$routing_key} {$mark}:onu:stats {$params}";
  113. $commands[] = "*/{$timePonStats} * * * * {$pathConsole} {$amqpRemote} {$routing_key} {$mark}:pon:stats {$params}";
  114. if($mark == "huawei") {
  115. $commands[] = "*/{$timeOltOctets} * * * * {$pathConsole} {$amqpRemote} {$routing_key} {$mark}:onu:octets {$params}";
  116. }
  117. $commands[] = "*/{$timeOltOctets} * * * * {$pathConsole} {$amqpRemote} {$routing_key} {$mark}:pon:octets {$params}";
  118. $params = "--olt-device-id={$deviceId} --olt-server-id={$serverId}";
  119. if ($amqp) {
  120. $params = "--args=--olt-device-id:{$deviceId} --args=--olt-server-id:{$serverId}";
  121. }
  122. $commands[] = "*/{$timeOnuStats} * * * * {$pathConsole} {$amqpRemote} {$routing_key} stats:onu {$params}";
  123. $commands[] = "*/{$timeOnuStats} * * * * {$pathConsole} {$amqpRemote} {$routing_key} stats:ponport {$params}";
  124. $content .= PHP_EOL . "# OLT {$oltName} ({$deviceIp})" . PHP_EOL;
  125. $content .= implode(PHP_EOL, $commands);
  126. }
  127. if ($this->getContainer()->getParameter('geoserver_service')) {
  128. $content .= PHP_EOL . PHP_EOL . "# MAPAS" . PHP_EOL;
  129. $params = "--olt-server-id={$serverId}";
  130. if ($amqp) {
  131. $params = "--args=--olt-server-id:{$serverId}";
  132. }
  133. $commands = array();
  134. $commands[] = "*/5 * * * * {$pathConsole} {$amqpRemote} {$routing_key} stats:onu:geo {$params}";
  135. $commands[] = "*/10 * * * * {$pathConsole} {$amqpRemote} {$routing_key} stats:ponport:geo {$params}";
  136. $content .= implode(PHP_EOL, $commands);
  137. $content .= PHP_EOL;
  138. }
  139. $nasDevices = $doctrine->getRepository('\StatsBundle\Entity\Device')->findBy(array('deviceType' => 'RadiusBundle\Entity\NAS', 'deviceServer' => $server));
  140. foreach ($nasDevices as $device) {
  141. $commands = array();
  142. $data = $device->jsonExtraData();
  143. $deviceId = $device->getDeviceId();
  144. if (is_null($data['radiusPassword']) || empty($data['radiusPassword'])){
  145. $content .= PHP_EOL . PHP_EOL . "# Device(NAS) {$deviceId} skiped, radiusPassword is null or empty" . PHP_EOL;
  146. continue;
  147. }
  148. if (!in_array($data['library'], array('OIDSBase'))){
  149. $content .= PHP_EOL . PHP_EOL . "# Device(NAS) {$deviceId} skiped, library not exist" . PHP_EOL;
  150. continue;
  151. }
  152. if (!$saveHistoric){
  153. $content .= PHP_EOL . PHP_EOL . "# Device {$deviceId} skiped, because saveHistoric is 0, set Server options in Stats". PHP_EOL;
  154. continue;
  155. }
  156. $library = $data['library'];
  157. $snmpCommunity = $data['radiusPassword'];
  158. $description = $data['description'];
  159. $deviceIp = $device->getIp();
  160. $params = "--nas-ip={$deviceIp} --nas-community={$snmpCommunity} --nas-snmp-library={$library} --nas-device-id={$deviceId} --nas-server-id={$serverId} --save-historic=1";
  161. if ($amqp) {
  162. $params = "--args=--nas-ip:{$deviceIp} --args=--nas-community:{$snmpCommunity} --args=--nas-snmp-library:{$library} --args=--nas-device-id:{$deviceId} --args=--nas-server-id:{$serverId} --args=--save-historic:1";
  163. }
  164. $commands[] = "*/10 * * * * {$pathConsole} {$amqpRemote} {$routing_key} nas:onu:octets {$params}";
  165. $content .= PHP_EOL . "# NAS {$description} ({$deviceIp})" . PHP_EOL;
  166. $content .= implode(PHP_EOL, $commands) . PHP_EOL.PHP_EOL;
  167. }
  168. }
  169. file_put_contents($fileCrontab, $content);
  170. print_r(shell_exec("/etc/init.d/cron reload"));
  171. }
  172. }