Example #1
0
 public function submitQuery()
 {
     $validator = Validator::make(Input::all(), array('query' => array('required', 'query'), 'servers' => array('required', 'array'), 'type' => array('required', 'type')));
     if ($validator->fails()) {
         return Response::json(array('success' => false, 'error' => $validator->messages()->first()));
     }
     // Validate rate limit
     $ip = Request::getClientIp();
     $querylimit = Config::get('lowendping.ratelimit.queries');
     if (!empty($querylimit)) {
         $limit = RateLimit::find($ip);
         if ($limit) {
             $time = time();
             $expiration = (int) ($limit->time + Config::get('lowendping.ratelimit.timespan'));
             if ($expiration > $time) {
                 if ($limit->hits >= $querylimit) {
                     $reset = ($expiration - $time) / 60;
                     if ($reset <= 1) {
                         return Response::json(array('success' => false, 'error' => 'Rate limit exceeded, please try again in 1 minute.'));
                     }
                     return Response::json(array('success' => false, 'error' => 'Rate limit exceeded, please try again in ' . $reset . ' minutes.'));
                 }
                 $limit->hits++;
                 $limit->save();
             } else {
                 $limit->time = time();
                 $limit->hits = 1;
                 $limit->save();
             }
         } else {
             $limit = new RateLimit();
             $limit->ip = $ip;
             $limit->hits = 1;
             $limit->time = time();
             $limit->save();
         }
     }
     $servers = Config::get('lowendping.servers');
     $serverIds = array();
     // Validate servers
     foreach (Input::get('servers') as $id => $val) {
         if (!isset($servers[$id])) {
             return Response::json(array('success' => false, 'error' => 'Invalid server ' . $id));
         }
         $serverIds[] = $id;
     }
     // Process the query
     $query = Input::get('query');
     $q = new Query();
     $q->query = $query;
     $q->servers = serialize($serverIds);
     $q->save();
     Queue::push('QueryJob', array('id' => $q->id, 'query' => $query, 'type' => Input::get('type'), 'servers' => $serverIds));
     $response = array('success' => true, 'queryid' => $q->id, 'serverCount' => count($serverIds));
     if (Config::get('lowendping.websocket.enabled', false)) {
         $response['websocket'] = websocket_url(Config::get('lowendping.websocket.path', ''), Config::get('lowendping.websocket.proxied', false) ? false : Config::get('lowendping.websocket.port', 8080));
     }
     if (Config::get('lowendping.archive.enabled', false)) {
         $response['resultLink'] = action('HomeController@showResult', array('query' => $q->id));
     }
     return Response::json($response);
 }