การติดตั้ง Marmoset

จาก Theory Wiki
ไปยังการนำทาง ไปยังการค้นหา
ลิงก์ย่อ: Installing marmoset

Marmoset เป็นระบบรับโปรแกรมที่พัฒนาโดย University of Maryland เว็บหลักของโครงงานคือ http://marmoset.cs.umd.edu/

ระบบที่นำมาติดตั้งเป็นระบบที่ดัดแปลงโดยทีมงานจาก University of Waterloo เพื่อใช้ในการเรียนการสอน และใช้ในการแข่งขัน IOI 2011

สำหรับขั้นตอนการติดตั้งทั่วไป ดูจากเอกสารอ้างอิงหลักที่ mirror มาจากทาง u of waterloo อีกทีหนึ่ง: Marmoset Help Page

เราได้พัฒนาสคริปต์ในการติดตั้ง SubmitServer แล้ว ให้อ่านส่วนติดตั้งด้วยสคริปต์ด้านล่าง

ติดตั้ง SubmitServer ด้วย script

สคริปต์ดังกล่าวจะอ่าน repo ของ marmoset จาก repo สำหรับการแข่งขันโอลิมปิกสอวน.

ทำตามขั้นตอนต่อไปนี้

ดาวน์โหลดสคริปต์

wget http://theory.cpe.ku.ac.th/~jittat/marmoset/install-submitserver.py

จากนั้นแก้ script ในส่วนหัว โดยเพิ่มรหัสผ่านของผู้ใช้ในระบบต่าง ๆ ที่ต้องการให้สคริปต์สร้าง

# Make sure you don't put ' (single quote) or " (double quote) in the password.
# This will break the script.
MARMOSET_DB_USER_PASSWORD = "ใส่รหัสที่ต้องการสำหรับผู้ใช้ฐานข้อมูล"
MARMOSET_ADMIN_USERNAME = "admin"
MARMOSET_ADMIN_PASSWORD = "ใส่รหัสผ่านของผู้ดูแลเว็บ"
KEYSTORE_PASSWORD = "ใส่รหัสของไฟล์กุญแญ"

จากนั้นเรียกให้สคริปต์ทำงาน

python install-submitserver.py

สคริปต์จะมีการหยุดถามให้เราป้อนรหัสผ่านสำหรับ root ของ MySQL หนึ่งครั้ง เมื่อติดตั้ง MySQL และจะถามรหัสเราอีกครั้งเมื่อจะเข้าใช้ mysql ในการสร้างบัญชีของผู้ใช้ marmoset

จากนั้นสคริปต์จะทำงานจนจบสิ้น

เมื่อเสร็จแล้วสามารถเข้าใช้ได้ที่ URL https://localhost:8443/

นอกจากนี้สคริปต์ยัง export certificate อยู่ในแฟ้ม marmoset.cer เพื่อนำไป import เข้าระบบ JAVA ที่เครื่อง BuildServer ต่อไป

SubmitServer แบบ manual

ในส่วนนี้จะอธิบายการติดตั้งบน Ubuntu

หลาย ๆ ครั้งจะต้องปิด-เปิด tomcat ให้สั่ง เช่น

sudo /etc/init.d/tomcat6 start
sudo /etc/init.d/tomcat6 stop
sudo /etc/init.d/tomcat6 restart

เมื่อติดตั้งเรียบร้อยแล้ว จะสามารถเข้า Submit Server ได้ที่

https://localhost:8443/

เริ่มต้นจากการติดตั้งซอฟต์แวร์ที่จำเป็น

ติดตั้ง java

sudo apt-get install openjdk-6-jdk openjdk-6-jre

ติดตั้ง tomcat

sudo apt-get install tomcat6

ติดตั้ง ant

sudo apt-get install ant

ติดตั้งและสร้างฐานข้อมูล

อ้างอิงขั้นตอนในเอกสาร Marmoset Help Pages แต่เราจะติดตั้ง mysql โดยใช้ apt-get

ติดตั้ง mysql server, และ client

sudo apt-get install mysql-server mysql-client

ระหว่างติดตั้งให้จำ password ของ mysql root ไว้ด้วย

จากนั้นสร้าง user และ database สำหรับ SubmitServer โดยสั่งตามนี้

เข้า mysql (ป้อน password root ด้วย)

mysql -u root -p

จากนั้นสั่งสร้าง user, database และ grant permission

create user 'marmoset'@'localhost' identified by 'MARMOSET_DB_PASSWORD';  # โดยที่ MARMOSET_DB_PASSWORD คือรหัสผ่านของฐานข้อมูลสำหรับผู้ใช้ marmoset
create database submitserver;
grant all on submitserver.* to 'marmoset'@'localhost';

จากนั้นให้ ออกจาก mysql command line interface เพื่อไปเรียก database initialization script

SQL script ต่าง ๆ จะอยู่ที่ SubmitServerModelClasses/trunk/SubmitServerModelClasses/dbScripts

ในเอกสาร marmoset จะระบุให้ใช้ script runsql แต่เราจะเรียกใช้ mysql โดยตรง โดยสั่งดังตัวอย่างด้านล่าง

ในการสร้าง schema เบื้องต้น ให้ย้ายไปที่ไดเร็กทอรีดังกล่าว แล้วสั่ง

mysql -D submitserver -u marmoset -p < marmoset-schema.sql

เพื่อสร้าง schema และ

mysql -D submitserver -u marmoset -p < sql-patches/project-starter-file-archives.sql 

เพื่อ patch database schema

สร้าง super user

อ้างอิงขั้นตอนในเอกสาร Marmoset Help Pages

ให้แก้ไฟล์ bootstrap.sql ตามเอกสารแล้วสั่ง

mysql -D submitserver -u marmoset -p < bootstrap.sql 

ติดตั้ง web app

อ้างอิงขั้นตอนในเอกสาร [1]

แก้ไฟล์ local.properties ตามคำสั่งในเอกสาร ไฟล์ดังกล่าวอยู่ที่ SubmitServer/trunk/SubmitServer2 โดยแก้ส่วน production.install.location โดยใส่ที่อยู่ของ tomcat ใน ubuntu ที่อยู่ของ tomcat คือ /usr/share/tomcat6

จากนั้นสั่ง

ant production.install

คำสั่งดังกล่าว ถ้าสั่งด้วย sudo จะคัดลอกไฟล์ได้บางส่วน ถ้าไม่ใช้ sudo จะคัดลอกไฟล์ไม่ได้เลย

ไฟล์ที่คอมไพล์แล้วจะอยู่ที่ SubmitServer/trunk/SubmitServer2/dist ดังนั้นให้คัดลอกไฟล์ต่าง ๆ เอง ดังนี้:

  • war file: คัดลอกไฟล์ dist/submitServer.war ไปยัง /var/lib/tomcat6/webapps
  • shared jar: คัดลอกไฟล์ dist/sharedSubmitServer.jar ไปยัง /usr/share/tomcat6/lib/
  • log4j: ไฟล์จะอยู่ที่ SubmitServer/trunk/SubmitServer2/lib คัดลอกไฟล์ log4j.jar ไปที่ /usr/share/tomcat6/lib/

ถ้าเราอยู่ที่ SubmitServer/trunk/SubmitServer2/ คัดลอกไฟล์ทั้งหมดด้วยคำสั่งดังนี้

sudo cp dist/submitServer.war /var/lib/tomcat6/webapps/
sudo cp dist/sharedSubmitServer.jar /usr/share/tomcat6/lib/
sudo cp lib/log4j.jar /usr/share/tomcat6/lib/

สังเกตว่า lib ของ tomcat อยู่ที่ /usr/share/tomcat6/lib/ แต่ตัว webapps อยู่ที่ /var/lib/tomcat6/webapps ระวัง: มีไดเร็กทอรี /usr/share/tomcat6/webapps แต่นั่นไม่ใช่ที่เก็บ war ไฟล์

แก้ config ต่าง ๆ ของ tomcat ตามเอกสาร

หมายเหตุ ดูตัวอย่างได้จากส่วนถัดไป

โดยมากไพล์จะอยู่ที่ /etc/tomcat6

  • แก้ config ตามเอกสาร
    • แก้ server.xml [2]
    • แก้ web.xml [3]
  • แก้ permission เพื่อให้ log4j ทำงานได้ (TODO: ส่วนนี้ต้องปรับปรุงเพิ่มเติมให้ปลอดภัยกว่านี้)
    • อ้างอิง [4]
    • แก้ไฟล์ /etc/tomcat6/policy.d/04webapps.policy ตามตัวอย่างด้านล่าง
  • แก้ให้ทำงานบนพอร์ต 8443 (https)
    • สร้าง key ตามขั้นตอนในเอกสาร [5] อย่าลืมจำรหัสผ่านของ key store เมื่อตอนสร้างไว้ด้วย
      • อย่าลืมคัดลอกไฟล์ marmosetKeystore ไปไว้ให้ถูกที่ด้วย
    • ให้แก้ไฟล์ server.xml เพิ่มเติมดังตัวอย่างด้านล่าง ดูเอกสารอ้างอิง เอกสารของ tomcat หลัก ๆ คือ เปิด APR library และใส่ keystore ใน connector

ตัวอย่าง diff ของ Config ของ tomcat ที่แก้

server.xml

--- server.xml	2010-08-19 22:45:13.000000000 +0700
+++ /etc/tomcat6/server.xml	2010-09-18 07:09:01.600653343 +0700
@@ -22,9 +22,9 @@
 <Server port="8005" shutdown="SHUTDOWN">
 
   <!--APR library loader. Documentation at /docs/apr.html -->
-  <!--
   <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
-  -->
+
+
   <!--Initialize Jasper prior to webapps are loaded. Documentation at /docs/jasper-howto.html -->
   <Listener className="org.apache.catalina.core.JasperListener" />
   <!-- JMX Support for the Tomcat server. Documentation at /docs/non-existent.html -->
@@ -80,11 +80,12 @@
          This connector uses the JSSE configuration, when using APR, the 
          connector should be using the OpenSSL style configuration
          described in the APR documentation -->
-    <!--
+
     <Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
                maxThreads="150" scheme="https" secure="true"
+               keystoreFile="/etc/tomcat6/ssl/marmosetKeystore"
+               keystorePass="PASSWORD"
                clientAuth="false" sslProtocol="TLS" />
-    -->
 
     <!-- Define an AJP 1.3 Connector on port 8009 -->
     <!--
@@ -131,6 +132,9 @@
             unpackWARs="true" autoDeploy="true"
             xmlValidation="false" xmlNamespaceAware="false">
 
+<Context path="" docBase="submitServer" debug="0"
+reloadable="true"/>
+
         <!-- SingleSignOn valve, share authentication between web applications
              Documentation at: /docs/config/valve.html -->
         <!--

web.xml

แก้ตามในคู่มือ marmoset

--- web.xml	2009-05-14 06:15:14.000000000 +0700
+++ /etc/tomcat6/web.xml	2010-09-17 17:57:26.155673917 +0700
@@ -1191,4 +1191,26 @@
         <welcome-file>index.jsp</welcome-file>
     </welcome-file-list>
 
+
+<context-param>
+    <param-name>authentication.service</param-name>
+    <param-value>edu.umd.cs.submitServer.GenericStudentPasswordAuthenticationService</param-value>
+</context-param>
+<context-param>
+    <param-name>database.server.jdbc.url</param-name>
+    <param-value>jdbc:mysql://localhost/submitserver</param-value>
+</context-param>
+<context-param>
+    <param-name>database.user</param-name>
+    <param-value>MYSQLUSER</param-value>
+</context-param>
+<context-param>
+    <param-name>database.password</param-name>
+    <param-value>MYSQLPASSWORD</param-value>
+</context-param>
+<context-param>
+    <param-name>database.driver</param-name>
+    <param-value>com.mysql.jdbc.Driver</param-value>
+</context-param>
+
 </web-app>

policy.d/04webapps.policy

ควรต้องตั้ง permission ให้ดีกว่านี้

--- policy.d/04webapps.policy	2010-08-19 22:45:11.000000000 +0700
+++ /etc/tomcat6/policy.d/04webapps.policy	2010-09-18 00:29:59.447935207 +0700
@@ -5,6 +5,9 @@
 // In addition, a web application will be given a read FilePermission
 // and JndiPermission for all files and directories in its document root.
 grant { 
+    // this is for testing
+    permission java.security.AllPermission;
+
     // Required for JNDI lookup of named JDBC DataSource's and
     // javamail named MimePart DataSource used to send mail
     permission java.util.PropertyPermission "java.home", "read";

ขั้นตอนที่ต้องระวัง

  • ต้องคัดลอกไฟล์ .war และ .jar เอง อย่าลืมคัดลือก log4j.jar ใส่ใน /usr/share/tomcat6/lib ด้วย
  • เพื่อให้ log4j เก็บค่าได้ ต้องตั้ง permission
  • ติดตั้ง SSL:
  • mysql driver

BuildServer

เอกสารอ้างอิงหลัก [6]

ติดตั้งซอฟต์แวร์ที่จำเป็น

ติดตั้ง java

sudo apt-get install openjdk-6-jdk openjdk-6-jre

ติดตั้ง ant

sudo apt-get install ant

ในคู่มือให้ติดตั้ง perl ด้วย แต่ใน ubuntu มี perl 5 มาให้อยู่แล้ว จึงไม่จำเป็น

ติดตั้ง BuildServer

เอกสารหลัก [7]
  • สร้างไดเร็กทอรี buildserver
  • คัดลอก BuildServer จาก BuildServer/trunk และ SubmitServerModelClasses จาก SubmitServerModelClasses/trunk ลงใน buildserver

ใน directory BuildServer สั่ง

ant 

เพื่อ compile จากนั้นสั่ง

./batch-install -h SUBMITSERVERHOST -c ioi -s fall2011 NUM

เพื่อติดตั้ง BuildServer NUM ตัว

สคริปต์จะสร้าง directory bsX.BUILDSERVERNAME สำหรับ BuildServer ตัวที่ X เช่น bs1.grader1 เป็นต้น

ติดตั้ง SSL Certificates

ทำตามข้อ 5.3 ใน คู่มือ

สร้างคีย์ไฟล์โดยใช้คำสั่ง

keytool -export -keystore marmosetKeystore -alias tomcat -file marmoset.cer 

และนำเข้าคีย์ไฟล์โดยสั่ง

sudo keytool -import -alias tomcat -keystore $JAVA_HOME/jre/lib/security/cacerts -file marmoset.cer 

ซึ่งถ้าเกิด Permission Denied ให้สั่ง

chmod u+w $JAVA_HOME/jre/lib/security/cacerts 

ซึ่ง cacerts จะอยู่ใน /usr/lib/jvm/java-6-openjdk/jre/lib/security ซึ่งลิงค์ไปที่ /etc/ssl/certs/java/cacerts

ที่เครื่อง build server จะมีการถามรหัสผ่าน ให้พิมพ์ changeit

จากนั้นจะสามารถเรียก ./runBuildServer config.properties ที่ใน build server แต่ละอันได้

ติดตั้งฝั่ง Window

  1. สร้าง /server/box
  2. เปิด Permission ให้ /server
  3. กอป box สำหรับ unix มาไว้ที่ /server/box
  4. gcc boc.cc
  5. install samba
  6. สร้าง /server/cross-os
  7. สร้าง share ของ samba บน cross-os
  8. map z: ไปที่ \\UNIX_SERVER\cross-os
  9. โหลด Dev-cpp
  10. ชี้ Path ไปที่ C:\Dev-Cpp\bin
  11. make box ของ window
  12. เก็บ box ไว้ที่ c:\box\box.exe
  13. create server.xp
  14. run server.xp