Beispiel #1
0
    def __init__(self, t, data, ttl):
        self._name = "c00c"
        self._type = t
        self._ttl = int(ttl, 16)
        self._data_len = len(data) // 2
        self._data = data

        self.valid_till = get_current_seconds() + self._ttl
Beispiel #2
0
def main():
    last_check_cache = get_current_seconds()
    # смотрим, есть ли у нас данные для восстановления кэша при запуска
    server_cache = reload_cache()
    print(f"Cache: {server_cache}")

    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    sock.bind(('localhost', 53))
    print('Server start working on 53 port')

    while True:
        #вечный цикл работы сервера,обработка данных и проверка записей кэша на актуальность
        try:
            run_server(sock, server_cache)
            last_check_cache = clear_cache(last_check_cache, server_cache)
        except KeyboardInterrupt:
            #работа сервера прекращена,сохраняем кэш для последующего перезапуска
            print('server crashed')
            save_cache(server_cache)
            exit(1)
Beispiel #3
0
def parse_request(data, cache):
    header, before_header = divide_data(data)
    name = extract_name(data)[0]
    type_mes = before_header[-8:-4]
    #проверяем наличие такой записи в кэше
    if (name, type_mes) in cache.keys():
        records = []
        for item in cache[(name, type_mes)]:
            format_answer = item.create_response()
            #проверяем актуальность записи
            if item.ttl > get_current_seconds():
                records.append(format_answer)
        count = len(records)
        #если нашлось необходимое в кэше,возвращаем
        if count != 0:
            print(f'Record: {name}, {type_mes} - return from cache')
            return header[:4] + "8180" + header[8:12] + hex(count)[2:].rjust(
                4, '0') + header[16:] + before_header + ''.join(records)
    print(f'Record: {name}, {type_mes} not find in cache')
    return None
Beispiel #4
0
 def form_response(self):
     return self._name + self._type + "0001" + \
            decimal_to_hex(self.valid_till - get_current_seconds()).rjust(8, '0') + \
            decimal_to_hex(self._data_len).rjust(4, '0') + self._data, self.valid_till > get_current_seconds()
Beispiel #5
0
 def create_ttl(self):
     current_time = get_current_seconds()
     return hex(self.ttl - current_time)[2:].rjust(8, '0')
Beispiel #6
0
 def __init__(self, answer_type, ttl, data):
     self.type = answer_type
     self.ttl = int(ttl, 16) + get_current_seconds()
     self.data = data