本机:
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 ("完毕!")