From 4f8f721b51aa439ecf3003dc3d32ca95820694d6 Mon Sep 17 00:00:00 2001 From: ppigazzini Date: Wed, 23 Aug 2023 16:00:54 +0200 Subject: [PATCH] Replace deprecated `datetime.datetime.utcnow()` The function is deprecated in python 3.12, see https://docs.python.org/3.12/library/datetime.html?highlight=utcnow#datetime.datetime.now "Because naive datetime objects are treated by many datetime methods as local times, it is preferred to use aware datetimes to represent times in UTC. As such, the recommended way to create an object representing the current time in UTC is by calling `datetime.now(timezone.utc)`." Raise worker version to 213 (also server side). --- server/fishtest/actiondb.py | 2 +- server/fishtest/api.py | 12 ++++----- server/fishtest/rundb.py | 42 ++++++++++++++++++++---------- server/fishtest/userdb.py | 4 +-- server/fishtest/util.py | 7 ++--- server/fishtest/views.py | 19 +++++++++----- server/tests/test_api.py | 4 +-- server/tests/test_rundb.py | 6 ++--- server/tests/test_users.py | 4 +-- server/utils/convert_actions.py | 12 ++++----- server/utils/delta_update_users.py | 36 +++++++++++++------------ server/utils/purge_pgn.py | 8 +++--- server/utils/upgrade.py | 10 +++---- worker/games.py | 14 +++++----- worker/sri.txt | 2 +- worker/updater.py | 4 +-- worker/worker.py | 6 ++--- 17 files changed, 106 insertions(+), 86 deletions(-) diff --git a/server/fishtest/actiondb.py b/server/fishtest/actiondb.py index 125459930..ad033f505 100644 --- a/server/fishtest/actiondb.py +++ b/server/fishtest/actiondb.py @@ -267,7 +267,7 @@ def insert_action(self, **action): action["run_id"] = str(action["run_id"]) ret = validate(schema, action, "action", strict=True) if ret == "": - action["time"] = datetime.utcnow().replace(tzinfo=timezone.utc).timestamp() + action["time"] = datetime.now(timezone.utc).timestamp() self.actions.insert_one(action) else: raise Exception("Validation failed with error '{}'".format(ret)) diff --git a/server/fishtest/api.py b/server/fishtest/api.py index 8d2f1e4de..e7e518094 100644 --- a/server/fishtest/api.py +++ b/server/fishtest/api.py @@ -1,6 +1,6 @@ import base64 import copy -from datetime import datetime +from datetime import datetime, timezone from fishtest.stats.stat_util import SPRT_elo from fishtest.util import optional_key, union, validate, worker_name @@ -25,7 +25,7 @@ on how frequently the main instance flushes its run cache. """ -WORKER_VERSION = 212 +WORKER_VERSION = 213 def validate_request(request): @@ -126,7 +126,7 @@ def handle_error(self, error, exception=HTTPBadRequest): raise exception(self.add_time({"error": error})) def validate_username_password(self, api): - self.__t0 = datetime.utcnow() + self.__t0 = datetime.now(timezone.utc) self.__api = api # is the request valid json? try: @@ -191,7 +191,7 @@ def validate_request(self, api): self.__task = task def add_time(self, result): - result["duration"] = (datetime.utcnow() - self.__t0).total_seconds() + result["duration"] = (datetime.now(timezone.utc) - self.__t0).total_seconds() return result def get_username(self): @@ -349,7 +349,7 @@ def get_elo(self): @view_config(route_name="api_calc_elo") def calc_elo(self): - self.__t0 = datetime.utcnow() + self.__t0 = datetime.now(timezone.utc) self.__api = "/api/calc_elo" W = self.request.params.get("W") @@ -553,7 +553,7 @@ def beat(self): self.validate_request("/api/beat") run = self.run() task = self.task() - task["last_updated"] = datetime.utcnow() + task["last_updated"] = datetime.now(timezone.utc) self.request.rundb.buffer(run, False) return self.add_time({}) diff --git a/server/fishtest/rundb.py b/server/fishtest/rundb.py index 4a0ea3158..a0eb724fc 100644 --- a/server/fishtest/rundb.py +++ b/server/fishtest/rundb.py @@ -9,7 +9,7 @@ import threading import time import zlib -from datetime import datetime, timedelta +from datetime import datetime, timedelta, timezone import fishtest.stats.stat_util from bson.binary import Binary @@ -35,7 +35,7 @@ DEBUG = False -boot_time = datetime.utcnow() +boot_time = datetime.now(timezone.utc) last_rundb = None @@ -140,7 +140,9 @@ def new_run( adjudication=True, ): if start_time is None: - start_time = datetime.utcnow() + start_time = datetime.now(timezone.utc) + else: + start_time = start_time.replace(tzinfo=timezone.utc) run_args = { "base_tag": base_tag, @@ -421,15 +423,18 @@ def flush_buffers(self): self.start_timer() def scavenge(self, run): - if datetime.utcnow() < boot_time + timedelta(seconds=300): + if datetime.now(timezone.utc) < boot_time + timedelta(seconds=300): return False # print("scavenge ", run["_id"]) dead_task = False - old = datetime.utcnow() - timedelta(minutes=6) + old = datetime.now(timezone.utc) - timedelta(minutes=6) task_id = -1 for task in run["tasks"]: task_id += 1 - if task["active"] and task["last_updated"] < old: + if ( + task["active"] + and task["last_updated"].replace(tzinfo=timezone.utc) < old + ): task["active"] = False dead_task = True print( @@ -468,7 +473,9 @@ def get_machines(self): machines = ( task["worker_info"] | { - "last_updated": task.get("last_updated", None), + "last_updated": task["last_updated"].replace(tzinfo=timezone.utc) + if task.get("last_updated") + else None, "run": run, "task_id": task_id, } @@ -779,11 +786,13 @@ def priority(run): # lower is better # name is already connected. my_name = "-".join(worker_name(worker_info).split("-")[0:3]) - now = datetime.utcnow() + now = datetime.now(timezone.utc) for task in active_tasks: task_name = "-".join(worker_name(task["worker_info"]).split("-")[0:3]) if my_name == task_name: - last_update = (now - task["last_updated"]).seconds + last_update = ( + now - task["last_updated"].replace(tzinfo=timezone.utc) + ).seconds # 120 = period of heartbeat in worker. if last_update <= 120: error = 'Request_task: There is already a worker running with name "{}" which sent an update {} seconds ago'.format( @@ -931,7 +940,7 @@ def priority(run): # lower is better "num_games": task_size, "active": True, "worker_info": worker_info, - "last_updated": datetime.utcnow(), + "last_updated": datetime.now(timezone.utc), "start": opening_offset, "stats": { "wins": 0, @@ -986,7 +995,9 @@ def active_run_lock(self, id): if self.purge_count > 100000: old = time.time() - 10000 self.active_runs = dict( - (k, v) for k, v in self.active_runs.items() if v["time"] >= old + (k, v) + for k, v in self.active_runs.items() + if v["time"].replace(tzinfo=timezone.utc) >= old ) self.purge_count = 0 if id in self.active_runs: @@ -1074,7 +1085,7 @@ def update_task(self, worker_info, run_id, task_id, stats, spsa): def sync_update_task(self, worker_info, run_id, task_id, stats, spsa): run = self.get_run(run_id) task = run["tasks"][task_id] - update_time = datetime.utcnow() + update_time = datetime.now(timezone.utc) error = "" @@ -1356,8 +1367,11 @@ def approve_run(self, run_id, approver): def purge_run(self, run, p=0.001, res=7.0, iters=1): # Only purge finished runs assert run["finished"] - now = datetime.utcnow() - if "start_time" not in run or (now - run["start_time"]).days > 30: + now = datetime.now(timezone.utc) + if ( + "start_time" not in run + or (now - run["start_time"].replace(tzinfo=timezone.utc)).days > 30 + ): return "Run too old to be purged" # Do not revive failed runs if run.get("failed", False): diff --git a/server/fishtest/userdb.py b/server/fishtest/userdb.py index 8638c302b..d29a66549 100644 --- a/server/fishtest/userdb.py +++ b/server/fishtest/userdb.py @@ -1,7 +1,7 @@ import sys import threading import time -from datetime import datetime +from datetime import datetime, timezone from pymongo import ASCENDING @@ -85,7 +85,7 @@ def create_user(self, username, password, email): { "username": username, "password": password, - "registration_time": datetime.utcnow(), + "registration_time": datetime.now(timezone.utc), "blocked": True, "email": email, "groups": [], diff --git a/server/fishtest/util.py b/server/fishtest/util.py index fb4159525..8679bb0f6 100644 --- a/server/fishtest/util.py +++ b/server/fishtest/util.py @@ -2,7 +2,7 @@ import math import re import smtplib -from datetime import datetime, timedelta +from datetime import datetime, timedelta, timezone from email.mime.text import MIMEText from functools import cache @@ -425,8 +425,9 @@ def post_in_fishcooking_results(run): def diff_date(date): - if date != datetime.min: - diff = datetime.utcnow() - date + utc_date = date.replace(tzinfo=timezone.utc) + if utc_date != datetime.min.replace(tzinfo=timezone.utc): + diff = datetime.now(timezone.utc) - utc_date else: diff = timedelta.max return diff diff --git a/server/fishtest/views.py b/server/fishtest/views.py index 4e9080254..5a0a4dc56 100644 --- a/server/fishtest/views.py +++ b/server/fishtest/views.py @@ -1,11 +1,11 @@ import copy -import datetime import hashlib import html import os import re import threading import time +from datetime import datetime, timezone import fishtest.stats.stat_util import requests @@ -543,7 +543,7 @@ def get_master_info(url): if idx == 0: message = message_lines[0].strip() date_str = commit["commit"]["committer"]["date"] - date = datetime.datetime.strptime(date_str, "%Y-%m-%dT%H:%M:%SZ") + date = datetime.strptime(date_str, "%Y-%m-%dT%H:%M:%SZ") if bench: return { "bench": bench.group(2), @@ -868,8 +868,8 @@ def update_nets(request, run): if not net: return if "first_test" not in net: - net["first_test"] = {"id": run_id, "date": datetime.datetime.utcnow()} - net["last_test"] = {"id": run_id, "date": datetime.datetime.utcnow()} + net["first_test"] = {"id": run_id, "date": datetime.now(timezone.utc)} + net["last_test"] = {"id": run_id, "date": datetime.now(timezone.utc)} request.rundb.update_nn(net) @@ -969,8 +969,11 @@ def tests_modify(request): run = request.rundb.get_run(request.POST["run"]) before = del_tasks(run) - now = datetime.datetime.utcnow() - if "start_time" not in run or (now - run["start_time"]).days > 30: + now = datetime.now(timezone.utc) + if ( + "start_time" not in run + or (now - run["start_time"].replace(tzinfo=timezone.utc)).days > 30 + ): request.session.flash("Run too old to be modified", "error") return HTTPFound(location=request.route_url("tests")) @@ -1325,7 +1328,9 @@ def tests_view(request): if task["active"]: active += 1 cores += task["worker_info"]["concurrency"] - last_updated = task.get("last_updated", datetime.datetime.min) + last_updated = task.get("last_updated", datetime.min).replace( + tzinfo=timezone.utc + ) task["last_updated"] = last_updated chi2 = get_chi2(run["tasks"]) diff --git a/server/tests/test_api.py b/server/tests/test_api.py index 3ac2e6775..a48ac083a 100644 --- a/server/tests/test_api.py +++ b/server/tests/test_api.py @@ -1,8 +1,8 @@ import base64 -import datetime import sys import unittest import zlib +from datetime import datetime, timezone from fishtest.api import WORKER_VERSION, ApiView from pyramid.httpexceptions import HTTPUnauthorized @@ -26,7 +26,7 @@ def new_run(self, add_tasks=0): "", username="travis", tests_repo="travis", - start_time=datetime.datetime.utcnow(), + start_time=datetime.now(timezone.utc), ) run = self.rundb.get_run(run_id) run["approved"] = True diff --git a/server/tests/test_rundb.py b/server/tests/test_rundb.py index f1cc48571..db50f4307 100644 --- a/server/tests/test_rundb.py +++ b/server/tests/test_rundb.py @@ -1,6 +1,6 @@ -import datetime import sys import unittest +from datetime import datetime, timezone import util from fishtest.api import WORKER_VERSION @@ -64,7 +64,7 @@ def test_10_create_run(self): "", username="travis", tests_repo="travis", - start_time=datetime.datetime.utcnow(), + start_time=datetime.now(timezone.utc), ) run = self.rundb.get_run(run_id_stc) run["finished"] = True @@ -92,7 +92,7 @@ def test_10_create_run(self): "", username="travis", tests_repo="travis", - start_time=datetime.datetime.utcnow(), + start_time=datetime.now(timezone.utc), ) print(" ") print(run_id) diff --git a/server/tests/test_users.py b/server/tests/test_users.py index e1f2f5265..4e039d9ac 100644 --- a/server/tests/test_users.py +++ b/server/tests/test_users.py @@ -1,5 +1,5 @@ -import datetime import unittest +from datetime import datetime, timezone import util from fishtest.views import login, signup @@ -91,7 +91,7 @@ def setUp(self): "", username="travis", tests_repo="travis", - start_time=datetime.datetime.utcnow(), + start_time=datetime.now(timezone.utc), ) self.rundb.userdb.user_cache.insert_one( {"username": "JoeUser", "cpu_hours": 12345} diff --git a/server/utils/convert_actions.py b/server/utils/convert_actions.py index f814aa1ae..2907851af 100644 --- a/server/utils/convert_actions.py +++ b/server/utils/convert_actions.py @@ -1,4 +1,4 @@ -import datetime +from datetime import datetime, timezone import pymongo from bson.objectid import ObjectId @@ -10,19 +10,17 @@ actions = actions_collection.find({}).sort("_id", 1) count = 0 print("Starting conversion...") - t0 = datetime.datetime.utcnow() + t0 = datetime.now(timezone.utc) for action in actions: count += 1 action_id = action["_id"] - if "time" in action and isinstance(action["time"], datetime.datetime): - action["time"] = ( - action["time"].replace(tzinfo=datetime.timezone.utc).timestamp() - ) + if "time" in action and isinstance(action["time"], datetime): + action["time"] = action["time"].replace(tzinfo=timezone.utc).timestamp() if "run_id" in action and isinstance(action["run_id"], ObjectId): action["run_id"] = str(action["run_id"]) actions_collection.replace_one({"_id": action_id}, action) print("Actions converted: {}.".format(count), end="\r") - t1 = datetime.datetime.utcnow() + t1 = datetime.now(timezone.utc) duration = (t1 - t0).total_seconds() time_per_run = duration / count print("") diff --git a/server/utils/delta_update_users.py b/server/utils/delta_update_users.py index 5d496741e..15bcc0e6a 100644 --- a/server/utils/delta_update_users.py +++ b/server/utils/delta_update_users.py @@ -1,7 +1,7 @@ #!/usr/bin/env python3 import sys -from datetime import datetime, timedelta +from datetime import datetime, timedelta, timezone from fishtest.rundb import RunDb from fishtest.util import delta_date, diff_date, estimate_game_duration @@ -9,10 +9,11 @@ def initialize_info(rundb, clear_stats): + utc_datetime_min = datetime.min.replace(tzinfo=timezone.utc) info_total = {} info_top_month = {} - diff_ini = diff_date(datetime.min).total_seconds() - last_ini = delta_date(diff_date(datetime.min)) + diff_ini = diff_date(utc_datetime_min).total_seconds() + last_ini = delta_date(diff_date(utc_datetime_min)) for u in rundb.userdb.get_users(): username = u["username"] @@ -24,7 +25,7 @@ def initialize_info(rundb, clear_stats): "games_per_hour": 0.0, "tests": 0, "tests_repo": u.get("tests_repo", ""), - "last_updated": datetime.min, + "last_updated": utc_datetime_min, "diff": diff_ini, "str_last_updated": last_ini, } @@ -86,7 +87,8 @@ def process_run(run, info): info_user = info[t_username] info_user["last_updated"] = max( - info_user["last_updated"], task.get("last_updated", datetime.min) + info_user["last_updated"].replace(tzinfo=timezone.utc), + task.get("last_updated", datetime.min).replace(tzinfo=timezone.utc), ) info_user["cpu_hours"] += float( num_games * int(run["args"].get("threads", 1)) * tc / (60 * 60) @@ -102,7 +104,7 @@ def update_info(rundb, clear_stats, deltas, info_total, info_top_month): except Exception as e: print(f"Exception on unfinished run {run['_id']=} for info_top_month:\n{e}") - now = datetime.utcnow() + now = datetime.now(timezone.utc) skip = False skip_count = 0 new_deltas = {} @@ -129,7 +131,7 @@ def update_info(rundb, clear_stats, deltas, info_total, info_top_month): skip_count += 1 # Update info_top_month with finished runs having start_time in the last 30 days - if (now - run["start_time"]).days < 30: + if (now - run["start_time"].replace(tzinfo=timezone.utc)).days < 30: try: process_run(run, info_top_month) except Exception as e: @@ -145,7 +147,7 @@ def update_info(rundb, clear_stats, deltas, info_total, info_top_month): def build_users(info): users = [] - # diff_date(given_date) = datetime.utcnow() - given_date + # diff_date(given_date) = datetime.now(timezone.utc) - given_date # delta_date(diff: timedelta) -> str: for username, info_user in info.items(): try: @@ -198,18 +200,18 @@ def cleanup_users(rundb): update = True if update: rundb.userdb.save_user(u) - if "registration_time" not in u or u[ - "registration_time" - ] < datetime.utcnow() - timedelta(days=28): + if "registration_time" not in u or u["registration_time"].replace( + tzinfo=timezone.utc + ) < datetime.now(timezone.utc) - timedelta(days=28): idle[u["username"]] = u for u in rundb.userdb.user_cache.find(): if u["username"] in idle: del idle[u["username"]] for u in idle.values(): # A safe guard against deleting long time users - if "registration_time" not in u or u[ - "registration_time" - ] < datetime.utcnow() - timedelta(days=38): + if "registration_time" not in u or u["registration_time"].replace( + tzinfo=timezone.utc + ) < datetime.now(timezone.utc) - timedelta(days=38): print("Warning: Found old user to delete:", str(u["_id"])) else: print("Delete:", str(u["_id"])) @@ -238,9 +240,9 @@ def main(): # "games_per_hour": 0.0, # "tests": 0, # "tests_repo": u.get("tests_repo", ""), - # "last_updated": datetime.min, # latest datetime of all user's tasks - # "diff": diff_date(datetime.min), # used to sort in the users table - # "str_last_updated": delta_date(diff_date(datetime.min)), # e.g. "Never", "12 days ago" + # "last_updated": utc_datetime_min, # latest datetime of all user's tasks + # "diff": diff_date(utc_datetime_min), # used to sort in the users table + # "str_last_updated": delta_date(diff_date(utc_datetime_min)), # e.g. "Never", "12 days ago" # "new_deltas": dictionary with keys representing the IDs of newly finished runs # since the previous script execution. It is used to update the "deltas" collection. diff --git a/server/utils/purge_pgn.py b/server/utils/purge_pgn.py index 1a4298e99..d7d1a2146 100644 --- a/server/utils/purge_pgn.py +++ b/server/utils/purge_pgn.py @@ -1,6 +1,6 @@ #!/usr/bin/env python3 import re -from datetime import datetime, timedelta +from datetime import datetime, timedelta, timezone from fishtest.rundb import RunDb from pymongo import DESCENDING @@ -9,7 +9,7 @@ def purge_pgn(rundb, finished, deleted, days): kept_runs, kept_tasks, kept_pgns = 0, 0, 0 purged_runs, purged_tasks, purged_pgns = 0, 0, 0 - now = datetime.utcnow() + now = datetime.now(timezone.utc) cutoff_date_ltc = now - timedelta(days=5 * days) cutoff_date = now - timedelta(days=days) tc_regex = re.compile("^([2-9][0-9])|([1-9][0-9][0-9])") @@ -23,8 +23,8 @@ def purge_pgn(rundb, finished, deleted, days): not deleted and finished and tc_regex.match(run["args"]["tc"]) - and run["last_updated"] > cutoff_date_ltc - ) or run["last_updated"] > cutoff_date + and run["last_updated"].replace(tzinfo=timezone.utc) > cutoff_date_ltc + ) or run["last_updated"].replace(tzinfo=timezone.utc) > cutoff_date if keep: kept_runs += 1 diff --git a/server/utils/upgrade.py b/server/utils/upgrade.py index 4c2cb3141..86c8f838f 100644 --- a/server/utils/upgrade.py +++ b/server/utils/upgrade.py @@ -1,6 +1,6 @@ -import datetime import pprint import uuid +from datetime import datetime, timezone import pymongo from fishtest.util import worker_name @@ -40,8 +40,8 @@ def show(p): "priority": 0, "adjudication": True, }, - "start_time": datetime.datetime.min, - "last_updated": datetime.datetime.min, + "start_time": datetime.min, + "last_updated": datetime.min, "tc_base": -1.0, "base_same_as_master": True, "results_stale": False, @@ -105,7 +105,7 @@ def convert_run(run): runs = runs_collection.find({}).sort("_id", 1) count = 0 print("Starting conversion...") - t0 = datetime.datetime.utcnow() + t0 = datetime.now(timezone.utc) for r in runs: count += 1 r_id = r["_id"] @@ -113,7 +113,7 @@ def convert_run(run): convert_task_list(r["tasks"]) runs_collection.replace_one({"_id": r_id}, r) print("Runs converted: {}.".format(count), end="\r") - t1 = datetime.datetime.utcnow() + t1 = datetime.now(timezone.utc) duration = (t1 - t0).total_seconds() time_per_run = duration / count print("") diff --git a/worker/games.py b/worker/games.py index f52d9693e..f18533cba 100644 --- a/worker/games.py +++ b/worker/games.py @@ -1,6 +1,5 @@ import copy import ctypes -import datetime import hashlib import io import json @@ -19,6 +18,7 @@ import time from base64 import b64decode from contextlib import ExitStack +from datetime import datetime, timedelta, timezone from pathlib import Path from queue import Empty, Queue from zipfile import ZipFile @@ -79,7 +79,7 @@ def log(s): logfile = Path(__file__).resolve().parent / LOGFILE with LOG_LOCK: with open(logfile, "a") as f: - f.write("{} : {}\n".format(datetime.datetime.utcnow(), s)) + f.write("{} : {}\n".format(datetime.now(timezone.utc), s)) def backup_log(): @@ -174,7 +174,7 @@ def requests_post(remote, *args, **kw): def send_api_post_request(api_url, payload, quiet=False): - t0 = datetime.datetime.utcnow() + t0 = datetime.now(timezone.utc) response = requests_post( api_url, data=json.dumps(payload), @@ -204,7 +204,7 @@ def send_api_post_request(api_url, payload, quiet=False): if "error" in response: print("Error from remote: {}".format(response["error"])) - t1 = datetime.datetime.utcnow() + t1 = datetime.now(timezone.utc) w = 1000 * (t1 - t0).total_seconds() s = 1000 * response["duration"] log( @@ -843,11 +843,11 @@ def parse_cutechess_output( t.daemon = True t.start() - end_time = datetime.datetime.utcnow() + datetime.timedelta(seconds=tc_limit) + end_time = datetime.now(timezone.utc) + timedelta(seconds=tc_limit) print("TC limit {} End time: {}".format(tc_limit, end_time)) num_games_updated = 0 - while datetime.datetime.utcnow() < end_time: + while datetime.now(timezone.utc) < end_time: try: line = q.get_nowait().strip() except Empty: @@ -977,7 +977,7 @@ def parse_cutechess_output( update_pentanomial(line, rounds) else: raise WorkerException( - "{} is past end time {}".format(datetime.datetime.utcnow(), end_time) + "{} is past end time {}".format(datetime.now(timezone.utc), end_time) ) return True diff --git a/worker/sri.txt b/worker/sri.txt index 448fffec9..8216bb242 100644 --- a/worker/sri.txt +++ b/worker/sri.txt @@ -1 +1 @@ -{"__version": 212, "updater.py": "JOyZ0qPEXaL82QdgajUzcNfhBbusBn8Fwcp3eGqeXfW1HpDWRD1jXDsrzVUaZeCd", "worker.py": "JNiGRpnjVNuplGzER45R9j24vlh1tugy+KV7ZFfrVEv5C9HT/RSTyZ0ocRrrNMyW", "games.py": "au3WiGyUAb26mcz5C2MhnU7rhe8X3JMEgnyUlo4aAH+dPjxnXCZrWh9xFjdNQoFZ"} +{"__version": 213, "updater.py": "GEDqwD5F16roa/hRFbTNbbUqW/smvbe/4Rcf09O5BIJOAI63wsAVgLEnMtQp1naZ", "worker.py": "dT4tz1DqISrMUZhqlQNV94nvpf6EPVg0ebs118cSJ8gC7C22PetaQjQgA1Ciupm4", "games.py": "LyUiwCAMXllQWLIHsWGZpQpziYGO6dK3jDXzimEFd2ehLLrp5nsSGbl7+AUQTnAa"} diff --git a/worker/updater.py b/worker/updater.py index 8bd31ce16..ebed0ec9e 100644 --- a/worker/updater.py +++ b/worker/updater.py @@ -1,7 +1,7 @@ -import datetime import os import shutil import sys +from datetime import datetime, timezone from distutils.dir_util import copy_tree from pathlib import Path from zipfile import ZipFile @@ -68,7 +68,7 @@ def update(restart=True, test=False): os.chdir(worker_dir) testing_dir = worker_dir / "testing" if testing_dir.exists(): - time_stamp = str(datetime.datetime.timestamp(datetime.datetime.utcnow())) + time_stamp = str(datetime.now(timezone.utc).timestamp()) bkp_testing_dir = worker_dir / ("_testing_" + time_stamp) testing_dir.replace(bkp_testing_dir) testing_dir.mkdir() diff --git a/worker/worker.py b/worker/worker.py index 9b2bc8249..9ffcb3081 100644 --- a/worker/worker.py +++ b/worker/worker.py @@ -1,7 +1,6 @@ #!/usr/bin/env python3 import atexit import base64 -import datetime import getpass import hashlib import json @@ -23,6 +22,7 @@ from argparse import ArgumentDefaultsHelpFormatter, ArgumentParser from configparser import ConfigParser from contextlib import ExitStack +from datetime import datetime, timezone from functools import partial from pathlib import Path @@ -54,7 +54,7 @@ # Several packages are called "expression". # So we make sure to use the locally installed one. -WORKER_VERSION = 212 +WORKER_VERSION = 213 FILE_LIST = ["updater.py", "worker.py", "games.py"] HTTP_TIMEOUT = 30.0 INITIAL_RETRY_TIME = 15.0 @@ -1329,7 +1329,7 @@ def fetch_and_handle_task( # Print the current time for log purposes print( "Current time is {} UTC (local offset: {}) ".format( - datetime.datetime.utcnow(), utcoffset() + datetime.now(timezone.utc), utcoffset() ) )