|
|
import base64 |
|
|
import datetime |
|
|
import hashlib |
|
|
import os |
|
|
import shutil |
|
|
import sys |
|
|
from model.data import ModelId |
|
|
|
|
|
|
|
|
def get_local_miners_dir(base_dir: str) -> str: |
|
|
return os.path.join(base_dir, "models") |
|
|
|
|
|
|
|
|
def get_local_miner_dir(base_dir: str, hotkey: str) -> str: |
|
|
return os.path.join(get_local_miners_dir(base_dir), hotkey) |
|
|
|
|
|
|
|
|
|
|
|
def get_local_model_dir(base_dir: str, hotkey: str, model_id: ModelId) -> str: |
|
|
return os.path.join( |
|
|
get_local_miner_dir(base_dir, hotkey), |
|
|
"models" + "--" + model_id.namespace + "--" + model_id.name, |
|
|
) |
|
|
|
|
|
|
|
|
def get_local_model_snapshot_dir(base_dir: str, hotkey: str, model_id: ModelId) -> str: |
|
|
return os.path.join( |
|
|
get_local_model_dir(base_dir, hotkey, model_id), |
|
|
"snapshots", |
|
|
model_id.commit, |
|
|
) |
|
|
|
|
|
|
|
|
def get_hf_download_path(local_path: str, model_id: ModelId) -> str: |
|
|
return os.path.join( |
|
|
local_path, |
|
|
"models" + "--" + model_id.namespace + "--" + model_id.name, |
|
|
"snapshots", |
|
|
model_id.commit, |
|
|
) |
|
|
|
|
|
|
|
|
def get_newest_datetime_under_path(path: str) -> datetime.datetime: |
|
|
newest_filetime = sys.maxsize |
|
|
|
|
|
|
|
|
for cur_path, dirnames, filenames in os.walk(path): |
|
|
for filename in filenames: |
|
|
path = os.path.join(cur_path, filename) |
|
|
try: |
|
|
mod_time = os.stat(path).st_mtime |
|
|
if mod_time < newest_filetime: |
|
|
newest_filetime = mod_time |
|
|
except: |
|
|
pass |
|
|
|
|
|
if newest_filetime == sys.maxsize: |
|
|
return datetime.datetime.max |
|
|
|
|
|
return datetime.datetime.fromtimestamp(newest_filetime) |
|
|
|
|
|
|
|
|
def remove_dir_out_of_grace_by_datetime(path: str, grace_period_seconds: int, last_modified: datetime.datetime) -> bool: |
|
|
"""Removes a dir if the last modified time is out of grace period secs. Returns if it was deleted.""" |
|
|
grace = datetime.timedelta(seconds=grace_period_seconds) |
|
|
|
|
|
if last_modified < datetime.datetime.now() - grace: |
|
|
shutil.rmtree(path=path, ignore_errors=True) |
|
|
return True |
|
|
|
|
|
return False |
|
|
|
|
|
def remove_dir_out_of_grace(path: str, grace_period_seconds: int) -> bool: |
|
|
"""Removes a dir if the last modified time is out of grace period secs. Returns if it was deleted.""" |
|
|
last_modified = get_newest_datetime_under_path(path) |
|
|
return remove_dir_out_of_grace_by_datetime(path, grace_period_seconds, last_modified) |
|
|
|
|
|
|
|
|
def realize_symlinks_in_directory(path: str) -> int: |
|
|
"""Realizes all symlinks in the given directory, moving the linked file to the location. Returns count removed.""" |
|
|
realized_symlinks = 0 |
|
|
|
|
|
for cur_path, dirnames, filenames in os.walk(path): |
|
|
for filename in filenames: |
|
|
path = os.path.abspath(os.path.join(cur_path, filename)) |
|
|
|
|
|
real_path = os.path.realpath(path) |
|
|
|
|
|
if path != real_path: |
|
|
realized_symlinks += 1 |
|
|
shutil.move(real_path, path) |
|
|
|
|
|
return realized_symlinks |
|
|
|
|
|
|
|
|
def get_hash_of_file(path: str) -> str: |
|
|
blocksize = 64 * 1024 |
|
|
file_hash = hashlib.sha256() |
|
|
with open(path, "rb") as fp: |
|
|
while True: |
|
|
data = fp.read(blocksize) |
|
|
if not data: |
|
|
break |
|
|
file_hash.update(data) |
|
|
return base64.b64encode(file_hash.digest()).decode("utf-8") |
|
|
|
|
|
|
|
|
def get_hash_of_directory(path: str) -> str: |
|
|
dir_hash = hashlib.sha256() |
|
|
|
|
|
|
|
|
for cur_path, dirnames, filenames in os.walk(path): |
|
|
|
|
|
dirnames.sort() |
|
|
|
|
|
for filename in sorted(filenames): |
|
|
path = os.path.join(cur_path, filename) |
|
|
file_hash = get_hash_of_file(path) |
|
|
dir_hash.update(file_hash.encode()) |
|
|
|
|
|
return base64.b64encode(dir_hash.digest()).decode("utf-8") |
|
|
|