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); }