diff --git a/admin/api_file.go b/admin/api_file.go index f77e6d9a..3c78cdf7 100644 --- a/admin/api_file.go +++ b/admin/api_file.go @@ -15,33 +15,43 @@ import ( "srs.epita.fr/fic-server/libfic" ) -type uploadedFile struct { - URI string -} - func createExerciceFile(theme fic.Theme, exercice fic.Exercice, args []string, body []byte) (interface{}, error) { - var uf uploadedFile + var uf map[string]string if err := json.Unmarshal(body, &uf); err != nil { return nil, err } - if len(uf.URI) == 0 { - return nil, errors.New("URI not filled") + var hash [sha512.Size]byte + var logStr string + var fromURI string + var getFile func(string) (error) + + if URI, ok := uf["URI"]; ok { + hash = sha512.Sum512([]byte(URI)) + logStr = "Import file from Cloud: " + URI + " =>" + fromURI = URI + getFile = func(dest string) error { return getCloudFile(URI, dest); } + } else if path, ok := uf["path"]; ok { + hash = sha512.Sum512([]byte(path)) + logStr = "Import file from local FS: " + path + " =>" + fromURI = path + getFile = func(dest string) error { return os.Symlink(path, dest); } + } else { + return nil, errors.New("URI or path not filled") } - hash := sha512.Sum512([]byte(uf.URI)) - pathname := path.Join(fic.FilesDir, strings.ToLower(base32.StdEncoding.EncodeToString(hash[:])), path.Base(uf.URI)) + pathname := path.Join(fic.FilesDir, strings.ToLower(base32.StdEncoding.EncodeToString(hash[:])), path.Base(fromURI)) if _, err := os.Stat(pathname); os.IsNotExist(err) { - log.Println("Import file from Cloud:", uf.URI, "=>", pathname) + log.Println(logStr, pathname) if err := os.MkdirAll(path.Dir(pathname), 0777); err != nil { return nil, err - } else if err := getCloudFile(uf.URI, pathname); err != nil { + } else if err := getFile(pathname); err != nil { return nil, err } } - return exercice.ImportFile(pathname, uf.URI) + return exercice.ImportFile(pathname, fromURI) } func getCloudFile(pathname string, dest string) error { diff --git a/admin/fill_exercices.sh b/admin/fill_exercices.sh index 9d66f680..c4461d81 100755 --- a/admin/fill_exercices.sh +++ b/admin/fill_exercices.sh @@ -1,8 +1,8 @@ -#!/bin/sh +#!/bin/bash -BASEURL="http://localhost:8081" -BASEURI="https://srs.epita.fr/owncloud/remote.php/webdav/FIC 2016" -BASEFILE="/files" +BASEURL="http://localhost:8081/admin" +BASEURI="https://owncloud.srs.epita.fr/remote.php/webdav/FIC 2017" +BASEFILE="/mnt/fic/" CLOUDPASS=fic:'f>t\nV33R|(+?$i*' new_theme() { @@ -30,7 +30,8 @@ new_file() { EXERCICE="$2" URI="$3" - curl -f -s -d "{\"URI\": \"${BASEFILE}${URI}\"}" "${BASEURL}/api/themes/$THEME/$EXERCICE/files" | +# curl -f -s -d "{\"URI\": \"${BASEFILE}${URI}\"}" "${BASEURL}/api/themes/$THEME/$EXERCICE/files" | + curl -f -s -d "{\"path\": \"${BASEFILE}${URI}\"}" "${BASEURL}/api/themes/$THEME/$EXERCICE/files" | grep -Eo '"id":[0-9]+,' | grep -Eo "[0-9]+" } @@ -44,38 +45,60 @@ new_key() { grep -Eo '"id":[0-9]+,' | grep -Eo "[0-9]+" } +get_dir_from_cloud() { + curl -f -s -X PROPFIND -u "${CLOUDPASS}" "${BASEURI}$1" | xmllint --format - | grep 'd:href' | sed -E 's/^.*>(.*)<.*$/\1/' +} +get_dir() { + ls "${BASEFILE}$1" +} +#alias get_dir=get_dir_from_cloud + +get_file_from_cloud() { + curl -f -s -u "${CLOUDPASS}" "${BASEURI}$1" | tr -d '\r' +} +get_file() { + cat "${BASEFILE}$1" | tr -d '\r' +} +#alias get_file=get_file_from_cloud + +unhtmlentities() { + cat | sed -E 's/%20/ /g' | sed -E "s/%27/'/g" | sed -E 's/%c3%a9/é/g' | sed -E 's/%c3%a8/è/g' +} + # Theme -curl -f -s -X PROPFIND -u "${CLOUDPASS}" "${BASEURI}" | xmllint --format - | grep 'd:href' | sed -E 's/^.*>(.*)<.*$/\1/' | sed 1d | tac | while read f; do basename "$f"; done | while read THEME_URI +get_dir "" | while read f; do basename "$f"; done | while read THEME_URI do THM_BASEURI="/${THEME_URI}/" - THEME_NAME=$(echo "${THEME_URI}" | sed -E 's/%20/ /g' | sed -E 's/%c3%a9/é/g' | sed -E 's/%c3%a8/è/g') - THEME_AUTHORS=$(curl -f -s -u "${CLOUDPASS}" "${BASEURI}${THM_BASEURI}/AUTHORS.txt" | sed 's/$/,/' | xargs) + THEME_NAME=$(echo "${THEME_URI#*-}" | unhtmlentities) + THEME_AUTHORS=$(get_file "${THM_BASEURI}/AUTHORS.txt" | sed 's/$/,/' | xargs) THEME_ID=`new_theme "$THEME_NAME" "$THEME_AUTHORS"` if [ -z "$THEME_ID" ]; then echo -e "\e[31;01m!!! An error occured during theme add\e[00m" - continue + continue else echo -e "\e[33m>>> New theme created:\e[00m $THEME_ID - $THEME_NAME" fi LAST=null EXO_NUM=0 - curl -f -s -X PROPFIND -u "${CLOUDPASS}" "${BASEURI}${THM_BASEURI}" | xmllint --format - | grep 'd:href' | sed -E 's/^.*>(.*)<.*$/\1/' | sed -E 's/%20/ /g' | sed -E 's/%c3%a9/é/g' | sed -E 's/%c3%a8/è/g' | sed 1d | while read f; do basename "$f"; done | while read EXO_NAME + get_dir "${THM_BASEURI}" | sed 1d | while read f; do basename "$f"; done | while read EXO_URI do - if ! echo $EXO_NAME | grep Exercice > /dev/null - then - continue - fi + case ${EXO_URI} in + [0-9]-*) + ;; + *) + continue;; + esac - EXO_NUM=$((EXO_NUM + 1)) + #EXO_NUM=$((EXO_NUM + 1)) + EXO_NUM=${EXO_URI%-*} + EXO_NAME=$(echo "${EXO_URI#*-}" | unhtmlentities) echo echo -e "\e[36m--- Filling exercice ${EXO_NUM} in theme ${THEME_NAME}\e[00m" - EXO_BASEURI="${EXO_NAME}/" + EXO_BASEURI="${EXO_URI}/" - FILES=$(curl -f -s -X PROPFIND -u "${CLOUDPASS}" "${BASEURI}${THM_BASEURI}${EXO_BASEURI}" | xmllint --format - | grep 'd:href' | sed -E 's/^.*>(.*)<.*$/\1/' | sed 1d | while read f; do basename $f; done) - - EXO_VIDEO=$(echo "$FILES" | grep -E "\.(mov|mkv|mp4|avi|flv|ogv|webm)$" | tail -1) + EXO_VIDEO=$(get_dir "${THM_BASEURI}${EXO_BASEURI}/resolution/" | grep -E "\.(mov|mkv|mp4|avi|flv|ogv|webm)$" | while read f; do basename $f; done | tail -1) if [ "${LAST}" = "null" ]; then echo ">>> Assuming this exercice has no dependency" @@ -86,10 +109,10 @@ do EXO_GAIN=$((3 * (2 ** $EXO_NUM) - 1)) echo ">>> Using default gain: ${EXO_GAIN} points" - EXO_DESC=$(curl -f -s -u "${CLOUDPASS}" "${BASEURI}${THM_BASEURI}${EXO_BASEURI}/description.txt") - EXO_HINT=$(curl -f -s -u "${CLOUDPASS}" "${BASEURI}${THM_BASEURI}${EXO_BASEURI}/hint.txt") + EXO_SCENARIO=$(get_file "${THM_BASEURI}${EXO_BASEURI}/scenario.txt") + EXO_HINT=$(get_file "${THM_BASEURI}${EXO_BASEURI}/hint.txt") - EXO_ID=`new_exercice "${THEME_ID}" "${EXO_NAME}" "${EXO_DESC}" "${EXO_HINT}" "${LAST}" "${EXO_GAIN}" "${THM_BASEURI}${EXO_BASEURI}${EXO_VIDEO}"` + EXO_ID=`new_exercice "${THEME_ID}" "${EXO_NAME}" "${EXO_SCENARIO}" "${EXO_HINT}" "${LAST}" "${EXO_GAIN}" "/resolution${THM_BASEURI}${EXO_BASEURI}resolution/${EXO_VIDEO}"` if [ -z "$EXO_ID" ]; then echo -e "\e[31;01m!!! An error occured during exercice add.\e[00m" continue @@ -99,7 +122,7 @@ do # Keys - curl -f -s -u "${CLOUDPASS}" "${BASEURI}${THM_BASEURI}${EXO_BASEURI}/keys.txt" | while read KEYLINE + get_file "${THM_BASEURI}${EXO_BASEURI}/flags.txt" | while read KEYLINE do KEY_NAME=$(echo "$KEYLINE" | cut -d : -f 1) KEY_RAW=$(echo "$KEYLINE" | cut -d : -f 2-) @@ -118,15 +141,14 @@ do # Files - for f in $FILES; do echo $f; done | grep -vEi "(ressources|readme|description.txt|hint.txt|keys.txt|${EXO_VIDEO})" | - while read FBASE + get_dir "${THM_BASEURI}${EXO_BASEURI}files/" | grep -v DIGESTS.txt | while read f; do basename "$f"; done | while read FILE_URI do - echo "Import file ${BASEURI}${THM_BASEURI}${EXO_BASEURI}${FBASE}" - FILE_ID=`new_file "${THEME_ID}" "${EXO_ID}" "${THM_BASEURI}${EXO_BASEURI}${FBASE}"` + echo "Import file ${THM_BASEURI}${EXO_BASEURI}files/${FILE_URI}" + FILE_ID=`new_file "${THEME_ID}" "${EXO_ID}" "${THM_BASEURI}${EXO_BASEURI}files/${FILE_URI}"` if [ -z "$FILE_ID" ]; then echo -e "\e[31;01m!!! An error occured during file import! Please check path.\e[00m" else - echo -e "\e[32m>>> New file added:\e[00m $FILE_ID - $FBASE" + echo -e "\e[32m>>> New file added:\e[00m $FILE_ID - $FILE_URI" fi done diff --git a/backend/main.go b/backend/main.go index 812b9255..599642a6 100644 --- a/backend/main.go +++ b/backend/main.go @@ -45,6 +45,7 @@ func main() { var dsn = flag.String("dsn", "fic:fic@/fic", "DSN to connect to the MySQL server") flag.StringVar(&SubmissionDir, "submission", "./submissions", "Base directory where save submissions") flag.StringVar(&TeamsDir, "teams", "../TEAMS", "Base directory where save teams JSON files") + flag.StringVar(&fic.FilesDir, "files", "/files", "Request path prefix to reach files") var skipFullGeneration = flag.Bool("skipFullGeneration", false, "Skip initial full generation (safe to skip after start)") flag.Parse() diff --git a/libfic/team_my.go b/libfic/team_my.go index 046bfe20..11e04c58 100644 --- a/libfic/team_my.go +++ b/libfic/team_my.go @@ -4,6 +4,7 @@ import ( "encoding/hex" "fmt" "time" + "path" ) type myTeamFile struct { @@ -86,7 +87,7 @@ func MyJSONTeam(t *Team, started bool) (interface{}, error) { return nil, err } else { for _, f := range files { - exercice.Files = append(exercice.Files, myTeamFile{f.Path, f.Name, hex.EncodeToString(f.Checksum), f.Size}) + exercice.Files = append(exercice.Files, myTeamFile{path.Join(FilesDir, f.Path), f.Name, hex.EncodeToString(f.Checksum), f.Size}) } }