def submit_ping_results(request): """Called by the client to submit the results of the addresses pinged.""" global nb_submited_requests, nb_submited_results client_addr = get_client_ip(request) logger.debug('submit_ping_results request: %s', request.json_body) # Check that token is valid. Always accept it even if it is bad # as otherwise this would block client Also, the "bad" token is # probably caused by a server problem, not people trying to push # wrong results. token = request.json_body.get('token') nick = request.json_body.get('userid') uuid = request.json_body.get('uuid') # Store results. results = request.json_body.get('results') if results is None: # FB: should return 400 client error raise HTTPBadRequest('No "results" field.') results.insert(0, client_addr) results.append("TOKEN=" + token) results.append("NICK=" + nick) results.append("UUID=" + uuid) resources.store_results(results) resources.store_known_pignable(results) nb_submited_requests += 1 nb_submited_results += len(results) # Update leaderboards if nick was passed. if nick is not None: resources.update_leaderboards(nick, results) return {'success': True}
def submit_ping_results(request): """Called by the client to submit the results of the addresses pinged.""" logger.debug('submit_ping_results request: %s', request.json_body) # Check that token is valid. token = request.json_body.get('token') if not resources.check_token(token): raise HTTPForbidden('Invalid or absent token value.') # Store results. results = request.json_body.get('results') if results is None: raise HTTPBadRequest('No "results" field.') resources.store_results(results) # Update leaderboards if userid was passed. userid = request.json_body.get('userid') if userid is not None: resources.update_leaderboards(userid, results) return {'success': True}
def get_pings(request): """Called by the client to get a list of addresses to ping.""" global nb_get_pings, min_round_time global last_time, last_nb_get_pings, time_table_idx global nb_submited_requests, nb_submited_results, last_nb_submited_requests global nb_feedback, last_nb_feedback client_addr = get_client_ip(request) logger.debug('get_pings request client address: %s', client_addr) ip_addresses = resources.get_pings(client_addr) token = resources.get_token() uuid = request.json_body.get("uuid") nick = request.json_body.get('userid') info = [ "GET_PINGS", "TOKEN=" + token, "UUID=" + uuid, "NICK=" + nick, ip_addresses ] resources.store_results(info) nb_get_pings += 1 now = time() spent = now - last_time if spent > 5: removed = resources.last_clients.remove_old(now) #number of pings per second since the last check p_s = (nb_get_pings - last_nb_get_pings) / spent submit_s = (nb_submited_requests - last_nb_submited_requests) / spent feedback_s = (nb_feedback - last_nb_feedback) / spent ratio_pings_on_expected = p_s / expected_get_pings_process_seconds if ratio_pings_on_expected > 1: time_table_idx = min(time_table_idx + 1, len(time_table)) elif ratio_pings_on_expected < 0.5: time_table_idx = max(time_table_idx - 1, 0) size_clients_list = len(resources.last_clients) min_round_time = time_table[time_table_idx] print >> stats, ( "nb_get_pings=%d, new_pings=%d," " time=%.2f, elapsed_time(s)=%.2f," " ping_per_second=%f, ratio_pings_on_expected=%f," " time_table_index=%d, min_round_time=%d," " size_clients_list=%d, removed=%d," " nb_submit_requests=%d, nb_submit_results=%d," " submit_req_per_second=%d," " nb_feedback=%d, nb_feedback_per_second=%d" % (nb_get_pings, nb_get_pings - last_nb_get_pings, now, now - last_time, p_s, ratio_pings_on_expected, time_table_idx, min_round_time, size_clients_list, removed, nb_submited_requests, nb_submited_results, submit_s, nb_feedback, feedback_s)) stats.flush() last_time = now last_nb_get_pings = nb_get_pings last_nb_submited_requests = nb_submited_requests last_nb_feedback = nb_feedback return { 'token': token, 'pings': ip_addresses, 'geoip': resources.get_geoip_data(ip_addresses), 'client_geoip': resources.get_geoip_data([client_addr])[0], 'client_ip': client_addr, 'min_round_time': min_round_time } # in seconds
def get_pings(request): """Called by the client to get a list of addresses to ping.""" global nb_get_pings, min_round_time global last_time, last_nb_get_pings, time_table_idx global nb_submited_requests, nb_submited_results, last_nb_submited_requests global nb_feedback, last_nb_feedback client_addr = get_client_ip(request) logger.debug('get_pings request client address: %s', client_addr) ip_addresses = resources.get_pings(client_addr) token = resources.get_token() uuid = request.json_body.get("uuid") nick = request.json_body.get('userid') info = ["GET_PINGS", "TOKEN=" + token, "UUID=" + uuid, "NICK=" + nick, ip_addresses] resources.store_results(info) nb_get_pings += 1 now = time() spent = now - last_time if spent > 5: removed = resources.last_clients.remove_old(now) #number of pings per second since the last check p_s = (nb_get_pings - last_nb_get_pings) / spent submit_s = (nb_submited_requests - last_nb_submited_requests) / spent feedback_s = (nb_feedback - last_nb_feedback) / spent ratio_pings_on_expected = p_s / expected_get_pings_process_seconds if ratio_pings_on_expected > 1: time_table_idx = min(time_table_idx + 1, len(time_table)) elif ratio_pings_on_expected < 0.5: time_table_idx = max(time_table_idx - 1, 0) size_clients_list = len(resources.last_clients) min_round_time = time_table[time_table_idx] print >>stats, ("nb_get_pings=%d, new_pings=%d," " time=%.2f, elapsed_time(s)=%.2f," " ping_per_second=%f, ratio_pings_on_expected=%f," " time_table_index=%d, min_round_time=%d," " size_clients_list=%d, removed=%d," " nb_submit_requests=%d, nb_submit_results=%d," " submit_req_per_second=%d," " nb_feedback=%d, nb_feedback_per_second=%d"% ( nb_get_pings, nb_get_pings - last_nb_get_pings, now, now - last_time, p_s, ratio_pings_on_expected, time_table_idx, min_round_time, size_clients_list, removed, nb_submited_requests, nb_submited_results, submit_s, nb_feedback, feedback_s)) stats.flush() last_time = now last_nb_get_pings = nb_get_pings last_nb_submited_requests = nb_submited_requests last_nb_feedback = nb_feedback return {'token': token, 'pings': ip_addresses, 'geoip': resources.get_geoip_data(ip_addresses), 'client_geoip': resources.get_geoip_data([client_addr])[0], 'client_ip': client_addr, 'min_round_time': min_round_time} # in seconds