admin: add ability to add files from local storage
This commit is contained in:
parent
a3940abed8
commit
b41180c7b0
@ -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 {
|
||||
|
@ -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
|
||||
|
||||
|
@ -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()
|
||||
|
||||
|
@ -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})
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user