Skip to content

Commit

Permalink
new 7
Browse files Browse the repository at this point in the history
  • Loading branch information
lee-cq committed Aug 25, 2024
1 parent f71dfa7 commit dbc47ca
Show file tree
Hide file tree
Showing 5 changed files with 160 additions and 63 deletions.
18 changes: 16 additions & 2 deletions .github/workflows/alist-server.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,16 @@ jobs:
echo "CLOUDFLARE_INSTALLED=true" >> "$GITHUB_ENV"
echo "Cloudflare Tunnel Installed."
- name: Install Grafana Alloy
run: |
sudo hostname alist-sync-${{github.run_id}}
echo $(hostname)
echo "Installing Grafana Alloy ..."
${{ secrets.GRAFANA_ALLOY_INSTALL_CMD }}
- name: Install and Init Alist Server
env:
_ALIST_ADMIN_PASSWORD: ${{ secrets.ALIST_ADMIN_PASSWORD }}
Expand All @@ -52,8 +62,12 @@ jobs:
bash -x bootstrap.sh alist-init
bash -x bootstrap.sh alist start
python3 tools/create_storage.py
bash -x bootstrap.sh alist stop
- name: Run Alist Server
run: |
./bootstrap.sh alist server
if [ -e "alist/data/logs/log.log" ]; then
tail -100f alist/data/logs/log.log
else
echo "No log file found."
sleep 36000
fi
3 changes: 3 additions & 0 deletions alist_sync/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,9 @@ class TransferLog(BaseModel):
transfer_type: str = CharField()
source_path: str = CharField()
target_path: str = CharField()
file_name: str = CharField()
file_size: int = IntegerField()
mtime: datetime = DateTimeField()
backup_path: str = CharField(null=True)
status: str = CharField()
message: str = TextField(null=True)
Expand Down
7 changes: 3 additions & 4 deletions alist_sync/scanner.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,17 +24,16 @@ def scan(path: AlistPath) -> Iterator[AlistPath]:
if Doer.get_or_none(abs_path=str(path)):
logger.info(f"跳过目录: {path}")
return

if path.is_file():
logger.debug(f"Find File: {path}")
yield path
else:
logger.debug(f"递归目录: {path}")
for p in path.iterdir():
yield from scan(p)
try:
Doer(abs_path=str(path)).save(force_insert=True)
except:
pass

Doer.create_no_error(abs_path=str(path))


def path2file(
Expand Down
79 changes: 66 additions & 13 deletions alist_sync/task.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
@Author : LeeCQ
@Date-Time : 2024/8/17 19:44
"""
import logging
import os
import threading
import time
Expand All @@ -14,12 +15,16 @@

from alist_sync.const import Env

logger = logging.getLogger("alist-sync.task")


class TaskStatus:
"""获取TaskStat"""

def __init__(self):
self.tasks: dict[str, Task] = dict()
self.done: set[str] = set()
self.undone: set[str] = set()

self.stop_event = threading.Event()
self.thread = threading.Thread(
Expand Down Expand Up @@ -51,36 +56,84 @@ def close(self):
self.stop_event.set()
self.thread.join()

def set_task(self, task: Task):
self.tasks[task.id] = task

def thread_update_task(self):
while not self.stop_event.is_set() or os.getenv(Env.exit_flag) == "true":
time.sleep(2)
self.update_task()
try:
self.update_task()
except Exception as e:
logger.exception(f"更新Task失败, {e}")

def update_task(self):
_tasks = {}
for c in ALIST_SERVER_INFO.values():
done = c.task_done("copy")
_cd = c.task_clear_succeeded("copy")
if _cd.code != 200:
f"清理失败, {c.base_url} - {_cd.message}"

for i in done.data:
self.tasks[i.id] = i

undone = c.task_undone("copy")
for i in undone.data:
self.tasks[i.id] = i
done = c.task_done("copy")
if all(i.progress < 60 for i in done.data):
_cd = c.task_clear_succeeded("copy")
if _cd.code != 200:
logger.warning(f"清理失败, {c.base_url} - {_cd.message}")

# 更新Task状态
[self.set_task(i) for i in done.data]
[self.set_task(i) for i in undone.data]
# 定义新的undone 和 上一次的undone
_last_undone = self.undone
self.undone = {i.id for i in undone.data}
# 计算可能已经完成的Task,但是被错误的清理
for i in _last_undone - self.undone:
if self.tasks[i].state == 1:
self.tasks[i].state = 2

self.tasks.update(_tasks)
# 从tasks中删除已完成的Task
for i in self.done:
if i in self.tasks:
del self.tasks[i]

logger.info(
f"更新Task成功, 共有{len(_tasks)}/{len(self.tasks)}个Task: {self.tasks.keys()}"
)

def get_task(self, _id) -> Task:
return self.tasks.get(_id)
return self.tasks.get(
_id,
Task(
id=_id,
name="Unknown",
state=0,
status="",
progress=0,
error="",
),
)

def status(self, _id: str) -> str:
try:
return self.tasks[_id].status
except KeyError:
logger.warning(f"Task {_id} not found in tasks: {self.tasks.keys()}")
return "Unknown"

def get_state_by_id(self, _id: str) -> int:
try:
return self.tasks[_id].state
except KeyError:
logger.warning(f"Task {_id} not found in tasks: {self.tasks.keys()}")
return -1

def remove_task(self, _id: str):
try:
self.done.add(_id)
del self.tasks[_id]
except KeyError:
logger.warning(f"Task {_id} not found in tasks")


task_status = TaskStatus()
copy_tasks = TaskStatus()

if __name__ == "__main__":
from tools.func import get_server_info
Expand Down
Loading

0 comments on commit dbc47ca

Please sign in to comment.