# [CMS Online Judge] 給系統管理者的一些建議 :::info 目錄: * [[CMS Online Judge] Docker安裝教學](/WKsC33XYRme4sM-Kkst_XA) * [[CMS Online Judge] 完整安裝教學](/qLOLKTjlQ6ivpN0vg4yb-g) * [[CMS Online Judge] 使用教學](/vzeJxoVGQPipzqd3R0_s9w) * [[CMS Online Judge] 互動題、Checker](/cA70QEPVRROxvTxYujMTcw) * [[CMS Online Judge] 給系統管理者的一些建議](/EOf5VvLOSM6BTjbVfb7vRg) [Github連結](https://github.com/erichung09060/cms) ::: 1. 一鍵備份所有的比賽及submission 建議設定完題目跟比賽結束後都備份一次,避免日後有爭議。 ``` cmsDumpExporter ``` 2. 還原備份檔 ``` cmsDumpImporter [備份檔檔名] ``` 3. 把開啟的比賽丟到背景運行 輸入`sudo cmsResourceService -a`開啟比賽後,按`ctrl+z`暫停,接著輸入`bg 1`把該process丟到背景去運行。 4. 關閉在背景運行的比賽 ``` sudo kill $(ps aux | grep cms | awk '{print $2}' | head -n -1) ``` 可搭配alias使用,以後只需輸入`startcms`、`stopcms`、`restartcms`即可控制比賽。 ``` 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" ``` 5. 重設整個DB(會刪除所有的比賽以及相關的設定檔,建議先備份) ``` sudo rm -rf /var/local/lib/cms sudo cmsDropDB sudo cmsInitDB ``` 6. 防火牆設定 只讓特定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 ``` 7. 放所有submissio和ranking的位置 ``` /var/local/lib/cms ``` 8. 計分板左上角logo圖檔的位置(記得刪除瀏覽器的cache才會生效) ``` /usr/local/lib/python3.10/dist-packages/cms-1.5.dev0-py3.10.egg/cmsranking/static/img/logo.png ``` 9. 從計分板上刪除使用者(或可以直接在後台把該使用者設為hidden) ``` cmsRWSHelper delete user [username] ``` 10. 新增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 ``` 12. 以user這個使用者在第1場比賽的pA上傳10次main.cpp ``` for i in {1..10};do sudo cmsAddSubmission -f pA.%l:main.cpp user pA -c 1; done ``` 13. 查看參賽者code的實際輸出 首先需要去以下檔案中的第72行插入一個return,把rmtree這個函式直接關閉。 ``` sudo vim /usr/local/lib/python3.8/dist-packages/cms-1.5.dev0-py3.8.egg/cms/util.py ``` ![](https://hackmd.io/_uploads/B1GBiKTo2.png) 重開比賽後,就可以使用root帳號cd到後台顯示的Sandbox位置進去看啦~(記得rejudge) 14. 校正系統時間 ``` sudo timedatectl set-timezone Asia/Taipei ``` 15. 自動重啟 ``` #!/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 ``` 16. 把stack memory設成無限 ``` ulimit -s unlimited ``` 17. 如果參賽者會用到額外的python package,只需要在judge的主機上安裝即可,cms會自己吃主機的環境。 ### 補充 * 可直接使用指令匯入整個Contest,詳細格式請見[這裡](https://github.com/erichung1113/cms/tree/main/Sample_Contest) * 可直接把Polygon Package打包成CMS格式的匯入檔,詳細請見[這裡](https://github.com/erichung1113/cms/tree/main/Polygon)