1: <?php
2: namespace Mapbender\MonitoringBundle\Controller;
3:
4: use Symfony\Bundle\FrameworkBundle\Controller\Controller;
5: use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
6: use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
7: use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
8: use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
9: use Symfony\Component\Form\FormBuilder;
10: use Symfony\Component\DependencyInjection\ContainerInterface;
11: use Symfony\Component\Security\Core\SecurityContext;
12: use Mapbender\MonitoringBundle\Entity\SchedulerProfile;
13: use Mapbender\MonitoringBundle\Form\SchedulerProfileType;
14:
15: /**
16: * Description of SchedulerProfileController
17: *
18: * @author Paul Schmidt
19: */
20: class SchedulerProfileController extends Controller {
21:
22: private static $CMD = "console monitoring:scheduler run schedulerprofilecontroller";
23:
24: protected function generateCmd(){
25: $dir = $this->container->getParameter("kernel.root_dir");
26: $cmd = $dir."/".SchedulerProfileController::$CMD;
27: return $cmd;
28: }
29:
30: /**
31: * @Route("/scheduler/start/")
32: * @Method("GET")
33: * @Template("MapbenderMonitoringBundle:SchedulerProfile:index.html.twig")
34: */
35: public function startAction() {
36:
37: $result = $this->getProcess($this->generateCmd());
38:
39: if(count($result) == 0){
40: $cmd_full = $this->generateCmd()." > /tmp/stdout &";
41: $res = exec($cmd_full);
42: sleep(3);
43: }
44: $query = $this->getDoctrine()->getEntityManager()->createQuery(
45: 'SELECT sp FROM MapbenderMonitoringBundle:SchedulerProfile sp'
46: .' ORDER BY sp.title ASC');
47: $schedulers = $query->getResult();
48: return array(
49: "nowtime" => new \DateTime(),
50: "schedulers" => $schedulers,
51: "process" => $this->getProcessStatus($this->generateCmd())
52:
53: );
54: }
55:
56: /**
57: * @Route("/scheduler/stop/")
58: * @Method("GET")
59: * @Template("MapbenderMonitoringBundle:SchedulerProfile:index.html.twig")
60: */
61: public function stopAction() {
62: $this->stopScheduler();
63: $query = $this->getDoctrine()->getEntityManager()->createQuery(
64: 'SELECT sp FROM MapbenderMonitoringBundle:SchedulerProfile sp'
65: .' ORDER BY sp.title ASC');
66: $schedulers = $query->getResult();
67: return array(
68: "nowtime" => new \DateTime(),
69: "schedulers" => $schedulers,
70: "process" => $this->getProcessStatus($this->generateCmd())
71: );
72: }
73:
74: protected function stopScheduler(){
75: $result = $this->getProcess($this->generateCmd());
76:
77: foreach ($result as $process) {
78: $cmd_kill = "kill -9 ".$process["PID"];
79: $res = exec($cmd_kill);
80: $sp = $this->getDoctrine()
81: ->getRepository('Mapbender\MonitoringBundle\Entity\SchedulerProfile')
82: ->findOneByCurrent(true);
83: $sp->setStatus(SchedulerProfile::$STATUS_ABORTED);
84: $em = $this->getDoctrine()->getEntityManager();
85: $em->persist($sp);
86: $em->flush();
87: }
88: }
89:
90: /**
91: * @Route("/scheduler/")
92: * @Method("GET")
93: * @Template("MapbenderMonitoringBundle:SchedulerProfile:index.html.twig")
94: */
95: public function indexAction() {
96: $query = $this->getDoctrine()->getEntityManager()->createQuery(
97: 'SELECT sp FROM MapbenderMonitoringBundle:SchedulerProfile sp'
98: .' ORDER BY sp.title ASC');
99: $schedulers = $query->getResult();
100: return array(
101: "nowtime" => new \DateTime(),
102: "schedulers" => $schedulers,
103: "process" => $this->getProcessStatus($this->generateCmd())
104: );
105: }
106:
107: /**
108: * @Route("/scheduler/new/")
109: * @Method("GET")
110: * @Template("MapbenderMonitoringBundle:SchedulerProfile:edit.html.twig")
111: */
112: public function shownewAction() {
113: $sp = new SchedulerProfile();
114: // $form = $this->getNewForm($sp);
115: $form = $this->get("form.factory")->create(
116: new SchedulerProfileType($sp),
117: new SchedulerProfile());
118: return array('form' => $form->createView(), "scheduler" => $sp);
119: }
120:
121: /**
122: * @Route("/scheduler/new/")
123: * @Method("POST")
124: * @Template("MapbenderMonitoringBundle:SchedulerProfile:edit.html.twig")
125: */
126: public function newAction() {
127: $scheduler_req = new SchedulerProfile();
128: // $form = $this->getNewForm($scheduler_req);
129: $form = $this->get("form.factory")->create(
130: new SchedulerProfileType($scheduler_req), $scheduler_req);
131: $form->bindRequest($this->get('request'));
132: if($form->isValid()) {
133: if($scheduler_req->getCurrent()){
134: $this->stopScheduler();
135: $this->deactivateAllScheduler();
136: }
137: $em = $this->getDoctrine()->getEntityManager();
138: $em->persist($scheduler_req);
139: $em->flush();
140: $query = $this->getDoctrine()->getEntityManager()->createQuery(
141: 'SELECT sp FROM MapbenderMonitoringBundle:SchedulerProfile sp'
142: .' ORDER BY sp.title ASC');
143: $schedulers = $query->getResult();
144: return $this->render(
145: 'MapbenderMonitoringBundle:SchedulerProfile:index.html.twig',
146: array(
147: "nowtime" => new \DateTime(),
148: "schedulers" => $schedulers,
149: "process" => $this->getProcessStatus($this->generateCmd())));
150: }
151: return array('form' => $form->createView(), "scheduler" => $scheduler_req);
152: }
153:
154: /**
155: * @Route("/scheduler/delete/{spId}")
156: * @Method("GET")
157: * @Template("MapbenderMonitoringBundle:SchedulerProfile:confirmdelete.html.twig")
158: */
159: public function confirmdeleteAction(SchedulerProfile $sp) {
160:
161: return array("sp" => $sp);
162: }
163:
164: /**
165: * @Route("/scheduler/delete/{spId}")
166: * @Method("POST")
167: * @Template("MapbenderMonitoringBundle:SchedulerProfile:index.html.twig")
168: */
169: public function deleteAction(SchedulerProfile $sp) {
170: $em = $this->getDoctrine()->getEntityManager();
171: $em->remove($sp);
172: $em->flush();
173: $query = $this->getDoctrine()->getEntityManager()->createQuery(
174: 'SELECT sp FROM MapbenderMonitoringBundle:SchedulerProfile sp'
175: .' ORDER BY sp.title ASC');
176: $schedulers = $query->getResult();
177: return array(
178: "nowtime" => new \DateTime(),
179: "schedulers" => $schedulers,
180: "process" => $this->getProcessStatus($this->generateCmd()));
181: }
182:
183: /**
184: * @Route("/scheduler/current/{spId}")
185: * @Method("GET")
186: * @Template("MapbenderMonitoringBundle:SchedulerProfile:index.html.twig")
187: */
188: public function currentAction(SchedulerProfile $sp) {
189: $this->stopScheduler();
190: $this->deactivateAllScheduler();
191: $em = $this->getDoctrine()->getEntityManager();
192: $sp->setCurrent(true);
193: $em->persist($sp);
194: $em->flush();
195: $query = $this->getDoctrine()->getEntityManager()->createQuery(
196: 'SELECT sp FROM MapbenderMonitoringBundle:SchedulerProfile sp'
197: .' ORDER BY sp.title ASC');
198: $schedulers = $query->getResult();
199: return array(
200: "nowtime" => new \DateTime(),
201: "schedulers" => $schedulers,
202: "process" => $this->getProcessStatus($this->generateCmd()));
203: }
204:
205: /**
206: * @Route("/scheduler/edit/{spId}")
207: * @Method("GET")
208: * @Template("MapbenderMonitoringBundle:SchedulerProfile:edit.html.twig")
209: */
210: public function showeditAction(SchedulerProfile $sp) {
211: // $form = $this->getNewForm($sp);
212: $form = $this->get("form.factory")->create(
213: new SchedulerProfileType($sp), $sp);
214: return array('form' => $form->createView(), "scheduler" => $sp);
215: }
216: /**
217: * @Route("/scheduler/edit/{spId}")
218: * @Method("POST")
219: * @Template("MapbenderMonitoringBundle:SchedulerProfile:edit.html.twig")
220: */
221: public function editAction(SchedulerProfile $sp) {
222: $form = $this->get("form.factory")->create(
223: new SchedulerProfileType($sp),
224: $sp);
225: $form->bindRequest($this->get('request'));
226: if($form->isValid()) {
227: if($sp->getCurrent()){
228: $this->stopScheduler();
229: $this->deactivateAllScheduler();
230: $sp->setCurrent(true);
231: }
232:
233: $em = $this->getDoctrine()->getEntityManager();
234: $em->persist($sp);
235: $em->flush();
236: $query = $this->getDoctrine()->getEntityManager()->createQuery(
237: 'SELECT sp FROM MapbenderMonitoringBundle:SchedulerProfile sp'
238: .' ORDER BY sp.title ASC');
239: $schedulers = $query->getResult();
240: return $this->render(
241: 'MapbenderMonitoringBundle:SchedulerProfile:index.html.twig',
242: array(
243: "nowtime" => new \DateTime(),
244: "schedulers" => $schedulers,
245: "process" => $this->getProcessStatus($this->generateCmd())));
246: }
247: return array('form' => $form->createView(), "scheduler" => $sp);
248: }
249:
250: protected function deactivateAllScheduler() {
251: $schedulers = $this->getDoctrine()->getRepository(
252: "MapbenderMonitoringBundle:SchedulerProfile")->findAll();
253: if($schedulers !== null){
254: $em = $this->getDoctrine()->getEntityManager();
255: foreach ($schedulers as $schedulerHelp) {
256: $schedulerHelp->setCurrent(false);
257: $em->persist($schedulerHelp);
258: $em->flush();
259: }
260: }
261: }
262:
263: protected function getProcessStatus($cmd) {
264: $result = $this->getProcess($cmd);
265:
266: if(count($result) > 0){
267: return "running";
268: } else
269: return "not running";
270: }
271:
272: protected function getProcess($cmd) {
273: $res_int = -1;
274: $res_arr = array();
275: $res = exec("ps -aux ", $res_arr, $res_int);
276: $teststr = $cmd;
277: $result = array();
278: $num = 0;
279: $header = array();
280: foreach ($res_arr as $value) {
281: if($num == 0){
282: $header = preg_split ("/[\s]+/", $value);
283: } else {
284: $pos = strpos ($value , $teststr);
285: if($pos!== false){
286: $help = preg_split ("/[\s]+/", $value);
287: $temp = array();
288: for($i = 0; $i < count($header); $i++) {
289: $temp[$header[$i]] = $help[$i];
290: }
291: $result[] = $temp;
292: }
293: }
294: $num++;
295: }
296: return $result;
297: }
298:
299: protected function getCurrentScheduler() {
300: return $this->getDoctrine()->getRepository(
301: "MapbenderMonitoringBundle:SchedulerProfile")->findBy(array('current' => true));
302: }
303:
304: // /**
305: // * @Route("/scheduler/test/")
306: // * @Method("GET")
307: // * @Template("MapbenderMonitoringBundle:SchedulerProfile:index.html.twig")
308: // */
309: // public function testAction() {
310: // $run = true;
311: // $num = 0;
312: // $sp_start = $this->get("doctrine")
313: // ->getRepository('Mapbender\MonitoringBundle\Entity\SchedulerProfile')
314: // ->findOneByCurrent(true);
315: // if($sp_start != null){
316: // $sp_start->setLaststarttime(null);
317: // $sp_start->setLastendtime(null);
318: // $sp_start->setNextstarttime(null);
319: // $this->get("doctrine")
320: // ->getEntityManager()->persist($sp_start);
321: // $this->get("doctrine")
322: // ->getEntityManager()->flush();
323: // }
324: //
325: // while($run){
326: // $num ++;
327: // $sp = $this->get("doctrine")
328: // ->getRepository('Mapbender\MonitoringBundle\Entity\SchedulerProfile')
329: // ->findOneByCurrent(true);
330: // if($sp != null && $sp_start->getId() == $sp->getId()){
331: //// $timestamp_act = time();
332: // $now = new \DateTime(date("Y-m-d H:i:s", time()));
333: // $hour_sec = 3600;
334: // $sleepbeforestart = 0;
335: // if($sp->getNextstarttime() === null) { // first time
336: // if($sp->getStarttime() > $now){
337: // $sleepbeforestart = date_timestamp_get($sp->getStarttime()) - date_timestamp_get($now);
338: // $sp->setNextstarttime(new \DateTime(date("Y-m-d H:i:s",date_timestamp_get($sp->getStarttime()))));
339: // } else {
340: // $sleepbeforestart = $hour_sec * 24 - (date_timestamp_get($now) - date_timestamp_get($sp->getStarttime()));
341: // $sp->setNextstarttime(new \DateTime(date("Y-m-d H:i:s",date_timestamp_get($now) + $sleepbeforestart)));
342: // }
343: // } else {
344: // if($sp->getNextstarttime() <= $now){
345: // $nextstarttime_stamp = date_timestamp_get($sp->getNextstarttime());
346: // $now_stamp = date_timestamp_get($now);
347: // while($nextstarttime_stamp < $now_stamp){
348: // $nextstarttime_stamp += $sp->getStarttimeinterval();
349: // }
350: //// $sleepbeforestart = date_timestamp_get($nextstarttime) - date_timestamp_get($now);
351: // $sp->setNextstarttime(null);
352: // $sp->setNextstarttime(new \DateTime(date("Y-m-d H:i:s", $nextstarttime_stamp)));
353: // }
354: // $sleepbeforestart = date_timestamp_get($sp->getNextstarttime()) - date_timestamp_get($now);
355: // }
356: // $sp->setStatusWaitstart();
357: // $this->get("doctrine")
358: // ->getEntityManager()->persist($sp);
359: // $this->get("doctrine")
360: // ->getEntityManager()->flush();
361: // // sleep
362: //// sleep($sleepbeforestart);
363: // $now = new \DateTime(date("Y-m-d H:i:s", time()));
364: // $sp->setLaststarttime($sp->getNextstarttime());
365: // $sp->setNextstarttime(null);
366: // $sp->setNextstarttime(new \DateTime(date("Y-m-d H:i:s", date_timestamp_get($sp->getLaststarttime()) + $sp->getStarttimeinterval())));
367: // $this->get("doctrine")
368: // ->getEntityManager()->persist($sp);
369: // $this->get("doctrine")
370: // ->getEntityManager()->flush();
371: //// $this->runCommandII($input, $output, $sp);
372: //// $now = new \DateTime(date("Y-m-d H:i:s", time()));
373: // $sp->setLastendtime(new \DateTime(date("Y-m-d H:i:s", time())));
374: // $this->get("doctrine")
375: // ->getEntityManager()->persist($sp);
376: // $this->get("doctrine")
377: // ->getEntityManager()->flush();
378: //
379: // } else {
380: // // $sp null
381: // $run = false;
382: // }
383: // if($num == 3)
384: // $run = false;
385: // }
386: //
387: // $query = $this->getDoctrine()->getEntityManager()->createQuery(
388: // 'SELECT sp FROM MapbenderMonitoringBundle:SchedulerProfile sp'
389: // .' ORDER BY sp.title ASC');
390: // $schedulers = $query->getResult();
391: // return array(
392: // "nowtime" => new \DateTime(),
393: // "schedulers" => $schedulers,
394: // "process" => $this->getProcessStatus($this->generateCmd()));
395: // }
396: }