Logo ryp的博客

博客

WyOJ 快速数据上传脚本

2025-04-22 21:05:57 By ryp

本机:

import os
import random

rhost = "ryp@192.168.137.4"

def upload (pid, path):
    if not os.path.exists (path):
        raise Exception ("文件不存在。")

    rpath = "upload%d-%d.zip" % (pid, random.randint (1, 32767))
    print ("上传数据中")
    if os.system ("scp %s %s:%s" % (path, rhost, rpath)):
        raise Exception ("上传数据失败")
    print ("数据上传完毕。正在处理")
    if os.system ("ssh %s ./upload %d %s" % (rhost, pid, rpath)):
        raise Exception ("解压失败")
    print ("完毕!现在请在网页端题目管理界面单击 校验配置并同步数据。")
    os.system ("pause")

print ("选项(1:上传单个数据;2:上传一组数据(要求题目编号连续、ZIP 存档名称格式为 题目编号.zip)):")
opt = int (input ())

if opt == 1:
    pid = int (input ("题目 ID:"))
    path = input ("数据存档(必须是包含 problem.conf 的 ZIP 存档;子文件夹中的文件将会被移动到根,其中的同名文件会随机覆盖,):")
    upload (pid, path)
elif opt == 2:
    fails = []
    st = int (input ("编号区间起始值(含)"))
    ed = int (input ("编号区间结束值(含)"))
    for i in range (st, ed + 1):
        if not os.path.exists ("%d.zip" % i):
            raise Exception ("未找到文件 %d.zip" % i)
    for i in range (st, ed + 1):
        print ("上传数据 %d 中" % i)
        try:
            upload (i, "%d.zip" % i)
        except Exception:
            print ("上传 %d 数据失败。尝试下一道题目……" % i)
            fails.append (i)
        else:
            print ("上传 %d 数据成功" % i)
    print ("上传结束。共有 %d 道题失败(%.3f%%)" % (len (fails), 100.0 * len (fails) / (ed - st + 1)))
    print ("失败题目:")
    if len (fails) == 0:
        print ("(无)")
    else:
        for i in fails:
            print (i, end="; ")
else:
    raise Exception ("无效选项")

远端:

#!/bin/python3
import os
import sys
import random

def exec (s):
    print ("执行远端命令:%s" % s, file=sys.stderr)
    if os.system (s):
        raise Exception ("远端命令执行失败!")
def info (s):
    print (s, file=sys.stderr)

if len (sys.argv) != 3:
    raise Exception ("参数数量错误")

pid = int (sys.argv[1])
lpath = sys.argv[2]
rpath = "data%d-%d.zip" % (pid, random.randint (1, 32767))
info ("正在复制到容器")
exec ("sudo docker cp %s uoj-web:/tmp/%s" % (lpath, rpath))
info ("正在清空原数据")
exec ("sudo docker exec uoj-web rm -rf /var/uoj_data/upload/%d" % pid)
exec ("sudo docker exec uoj-web rm -rf /var/uoj_data/%d" % pid)
info ("正在解压数据")
exec ("sudo docker exec uoj-web unzip -q /tmp/%s -d /var/uoj_data/upload/%d" % (rpath, pid))
exec ("sudo docker exec uoj-web unzip -q /tmp/%s -d /var/uoj_data/%d" % (rpath, pid))
exec ("sudo docker exec uoj-web rm /tmp/%s" % rpath)
info ("正在展开数据(第一次)")
exec ("sudo docker exec uoj-web bash -c \'"
      "cd /var/uoj_data/upload/%d; "
      "for f in `find -type f`; do mv $f `basename $f`; done;"
      "for f in `find -type f -maxdepth 1 ! -name '.'`; do rm -rfv $f; done;\'" % pid)

info ("正在展开数据(第二次)")
exec ("sudo docker exec uoj-web bash -c \'"
      "cd /var/uoj_data/%d; "
      "for f in `find -type f`; do mv $f `basename $f`; done;"
      "for f in `find -type f -maxdepth 1 ! -name '.'`; do rm -rfv $f; done;\'" % pid)
print ("删除临时数据包")
exec ("rm %s" % lpath)
print ("完毕!")

评论

__vector__
qpzc

发表评论

可以用@mike来提到mike这个用户,mike会被高亮显示。如果你真的想打“@”这个字符,请用“@@”。