Try   HackMD

[CMS Online Judge] 給系統管理者的一些建議

  1. 一鍵備份所有的比賽及submission
    建議設定完題目跟比賽結束後都備份一次,避免日後有爭議。
cmsDumpExporter
  1. 還原備份檔
cmsDumpImporter [備份檔檔名]
  1. 把開啟的比賽丟到背景運行
    輸入sudo cmsResourceService -a開啟比賽後,按ctrl+z暫停,接著輸入bg 1把該process丟到背景去運行。

  2. 關閉在背景運行的比賽

sudo kill $(ps aux | grep cms | awk '{print $2}' | head -n -1)

可搭配alias使用,以後只需輸入startcmsstopcmsrestartcms即可控制比賽。

vim ~/.bash_aliases
alias stopcms="sudo kill \$(ps aux | grep cms | awk '{print \$2}' | head -n -1) > /dev/null 2>&1"
alias startcms="sudo cmsResourceService -a"
alias restartcms="stopcms; startcms"
  1. 重設整個DB(會刪除所有的比賽以及相關的設定檔,建議先備份)
sudo rm -rf /var/local/lib/cms
sudo cmsDropDB
sudo cmsInitDB
  1. 防火牆設定

只讓特定ip連進來。

sudo iptables -I INPUT 1 -p tcp --dport 8888 -s 140.116.0.0/16 -j ACCEPT
sudo iptables -I INPUT 2 -p tcp --dport 8888 -s 192.168.0.0/16 -j ACCEPT
sudo iptables -I INPUT 3 -p tcp --dport 8888 -j DROP
sudo iptables -I INPUT 1 -p tcp --dport 8889 -s 140.116.0.0/16 -j ACCEPT
sudo iptables -I INPUT 2 -p tcp --dport 8889 -s 192.168.0.0/16 -j ACCEPT
sudo iptables -I INPUT 3 -p tcp --dport 8889 -j DROP

解除

sudo iptables -D INPUT -p tcp --dport 8888 -s 140.116.0.0/16 -j ACCEPT
sudo iptables -D INPUT -p tcp --dport 8888 -s 192.168.0.0/16 -j ACCEPT
sudo iptables -D INPUT -p tcp --dport 8888 -j DROP
sudo iptables -D INPUT -p tcp --dport 8889 -s 140.116.0.0/16 -j ACCEPT
sudo iptables -D INPUT -p tcp --dport 8889 -s 192.168.0.0/16 -j ACCEPT
sudo iptables -D INPUT -p tcp --dport 8889 -j DROP
  1. 放所有submissio和ranking的位置
/var/local/lib/cms
  1. 計分板左上角logo圖檔的位置(記得刪除瀏覽器的cache才會生效)
/usr/local/lib/python3.10/dist-packages/cms-1.5.dev0-py3.10.egg/cmsranking/static/img/logo.png
  1. 從計分板上刪除使用者(或可以直接在後台把該使用者設為hidden)
cmsRWSHelper delete user [username]
  1. 新增10個使用者,並加到第一場比賽中
for i in {1..10}; do 
    cmsAddUser "first_name_$i" "last_name_$i" "user_name_$i" -p "password_$i";
    cmsAddParticipation -c 1 "user_name_$i"
done

或只加入已創建的user

for i in {1..181}; do 
    account=$(printf team%03d $i)
    cmsAddParticipation -c 2 $account
done
  1. 以user這個使用者在第1場比賽的pA上傳10次main.cpp
for i in {1..10};do sudo cmsAddSubmission -f pA.%l:main.cpp user pA -c 1; done
  1. 查看參賽者code的實際輸出

首先需要去以下檔案中的第72行插入一個return,把rmtree這個函式直接關閉。

sudo vim /usr/local/lib/python3.8/dist-packages/cms-1.5.dev0-py3.8.egg/cms/util.py

Image Not Showing Possible Reasons
  • The image was uploaded to a note which you don't have access to
  • The note which the image was originally uploaded to has been deleted
Learn More →

重開比賽後,就可以使用root帳號cd到後台顯示的Sandbox位置進去看啦~(記得rejudge)

  1. 校正系統時間
sudo timedatectl set-timezone Asia/Taipei
  1. 自動重啟
#!/bin/bash

while true; do
    if ! curl -s http://localhost:8888 > /dev/null; then
    	sudo cmsResourceService -a <<< 1 # contest id
    fi 
    sleep 60  # Check every 60 seconds
done
  1. 把stack memory設成無限
ulimit -s unlimited
  1. 如果參賽者會用到額外的python package,只需要在judge的主機上安裝即可,cms會自己吃主機的環境。

補充

  • 可直接使用指令匯入整個Contest,詳細格式請見這裡
  • 可直接把Polygon Package打包成CMS格式的匯入檔,詳細請見這裡