diff --git a/.drone.yml b/.drone.yml index aff47fa8..5bdabb24 100644 --- a/.drone.yml +++ b/.drone.yml @@ -23,6 +23,7 @@ steps: - go get -v -d srs.epita.fr/fic-server/dashboard - go get -v -d srs.epita.fr/fic-server/repochecker - go get -v -d srs.epita.fr/fic-server/repochecker/epita + - go get -v -d srs.epita.fr/fic-server/repochecker/file-inspector - go get -v -d srs.epita.fr/fic-server/repochecker/grammalecte - go get -v -d srs.epita.fr/fic-server/repochecker/videos - go get -v -d srs.epita.fr/fic-server/qa @@ -43,6 +44,7 @@ steps: - go vet -v -buildvcs=false srs.epita.fr/fic-server/dashboard - go vet -v -buildvcs=false srs.epita.fr/fic-server/repochecker - go vet -v -buildvcs=false srs.epita.fr/fic-server/repochecker/epita + - go vet -v -buildvcs=false srs.epita.fr/fic-server/repochecker/file-inspector - go vet -v -buildvcs=false srs.epita.fr/fic-server/repochecker/grammalecte - go vet -v -buildvcs=false srs.epita.fr/fic-server/repochecker/videos - go vet -v -buildvcs=false srs.epita.fr/fic-server/qa @@ -102,6 +104,7 @@ steps: - apk --no-cache add build-base - go build -buildvcs=false --tags checkupdate -v -o deploy/repochecker-${DRONE_STAGE_OS}-${DRONE_STAGE_ARCH} srs.epita.fr/fic-server/repochecker - go build -buildvcs=false -buildmode=plugin -v -o deploy/repochecker-epita-rules-${DRONE_STAGE_OS}-${DRONE_STAGE_ARCH}.so srs.epita.fr/fic-server/repochecker/epita + - go build -buildvcs=false -buildmode=plugin -v -o deploy/repochecker-file-inspector-rules-${DRONE_STAGE_OS}-${DRONE_STAGE_ARCH}.so srs.epita.fr/fic-server/repochecker/file-inspector - go build -buildvcs=false -buildmode=plugin -v -o deploy/repochecker-grammalecte-rules-${DRONE_STAGE_OS}-${DRONE_STAGE_ARCH}.so srs.epita.fr/fic-server/repochecker/grammalecte - go build -buildvcs=false -buildmode=plugin -v -o deploy/repochecker-videos-rules-${DRONE_STAGE_OS}-${DRONE_STAGE_ARCH}.so srs.epita.fr/fic-server/repochecker/videos - grep "const version" repochecker/update.go | sed -r 's/^.*=\s*(\S.*)$/\1/' > deploy/repochecker.version diff --git a/Dockerfile-admin b/Dockerfile-admin index 8b8b8795..10f4dcc2 100644 --- a/Dockerfile-admin +++ b/Dockerfile-admin @@ -14,6 +14,7 @@ RUN apk add --no-cache build-base && \ go get -d -v ./admin && \ go build -v -buildvcs=false -o admin/admin ./admin && \ go build -v -buildmode=plugin -o repochecker/epita-rules.so ./repochecker/epita && \ + go build -v -buildmode=plugin -o repochecker/file-inspector.so ./repochecker/file-inspector && \ go build -v -buildmode=plugin -o repochecker/grammalecte-rules.so ./repochecker/grammalecte && \ go build -v -buildmode=plugin -o repochecker/videos-rules.so ./repochecker/videos @@ -35,5 +36,6 @@ ENTRYPOINT ["/srv/admin", "-bind=:8081", "-baseurl=/admin/"] COPY --from=gobuild /go/src/srs.epita.fr/fic-server/admin/admin /srv/admin COPY --from=gobuild /go/src/srs.epita.fr/fic-server/repochecker/epita-rules.so /srv/epita-rules.so +COPY --from=gobuild /go/src/srs.epita.fr/fic-server/repochecker/file-inspector.so /usr/lib/file-inspector.so COPY --from=gobuild /go/src/srs.epita.fr/fic-server/repochecker/grammalecte-rules.so /usr/lib/grammalecte-rules.so COPY --from=gobuild /go/src/srs.epita.fr/fic-server/repochecker/videos-rules.so /usr/lib/videos-rules.so diff --git a/Dockerfile-repochecker b/Dockerfile-repochecker index a9607df3..35fe9465 100644 --- a/Dockerfile-repochecker +++ b/Dockerfile-repochecker @@ -15,6 +15,7 @@ COPY repochecker ./repochecker/ RUN go get -d -v ./repochecker && \ go build -v -o repochecker/repochecker ./repochecker && \ go build -v -buildmode=plugin -o repochecker/epita-rules.so ./repochecker/epita && \ + go build -v -buildmode=plugin -o repochecker/file-inspector.so ./repochecker/file-inspector && \ go build -v -buildmode=plugin -o repochecker/grammalecte-rules.so ./repochecker/grammalecte && \ go build -v -buildmode=plugin -o repochecker/videos-rules.so ./repochecker/videos @@ -27,12 +28,13 @@ RUN mkdir /srv/grammalecte && cd /srv/grammalecte && unzip /srv/grammalecte.zip FROM alpine:3.16 -ENTRYPOINT ["/usr/bin/repochecker", "--rules-plugins=/usr/lib/epita-rules.so", "--rules-plugins=/usr/lib/grammalecte-rules.so", "--rules-plugins=/usr/lib/videos-rules.so"] +ENTRYPOINT ["/usr/bin/repochecker", "--rules-plugins=/usr/lib/epita-rules.so", "--rules-plugins=/usr/lib/file-inspector.so", "--rules-plugins=/usr/lib/grammalecte-rules.so", "--rules-plugins=/usr/lib/videos-rules.so"] RUN apk add --no-cache git python3 ffmpeg COPY --from=gobuild /srv/grammalecte /srv/grammalecte COPY --from=gobuild /go/src/srs.epita.fr/fic-server/repochecker/repochecker /usr/bin/repochecker COPY --from=gobuild /go/src/srs.epita.fr/fic-server/repochecker/epita-rules.so /usr/lib/epita-rules.so +COPY --from=gobuild /go/src/srs.epita.fr/fic-server/repochecker/file-inspector.so /usr/lib/file-inspector.so COPY --from=gobuild /go/src/srs.epita.fr/fic-server/repochecker/grammalecte-rules.so /usr/lib/grammalecte-rules.so COPY --from=gobuild /go/src/srs.epita.fr/fic-server/repochecker/videos-rules.so /usr/lib/videos-rules.so diff --git a/repochecker/file-inspector/files.go b/repochecker/file-inspector/files.go new file mode 100644 index 00000000..848ec98b --- /dev/null +++ b/repochecker/file-inspector/files.go @@ -0,0 +1,83 @@ +package main + +import ( + "archive/tar" + "compress/bzip2" + "compress/gzip" + "fmt" + "io" + "log" + "os" + "path/filepath" + "strings" + + "srs.epita.fr/fic-server/admin/sync" + "srs.epita.fr/fic-server/libfic" +) + +func InspectFile(file *fic.EFile, exceptions *sync.CheckExceptions) (errs []error) { + i, ok := sync.GlobalImporter.(sync.LocalImporter) + if !ok { + log.Printf("Unable to load `file-inspector.so` as the current Importer is not a LocalImporter (%T).", sync.GlobalImporter) + return + } + + path := i.GetLocalPath(file.GetOrigin()) + + // Check there is more than 1 file in tarball + if filepath.Ext(file.Name) == ".tar" || strings.HasSuffix(file.Name, ".tar.gz") || strings.HasSuffix(file.Name, ".tar.bz2") { + fd, err := os.Open(path) + if err != nil { + log.Printf("Unable to open %q: %s", path, err.Error()) + return + } + defer fd.Close() + + var rd io.Reader + if strings.HasSuffix(file.Name, ".tar.gz") { + archive, err := gzip.NewReader(fd) + if err != nil { + log.Printf("Unable to uncompress gzip file %q: %s", file.Name, err.Error()) + return + } + defer archive.Close() + rd = archive + } else if strings.HasSuffix(file.Name, ".tar.bz2") { + rd = bzip2.NewReader(fd) + } else { + rd = fd + } + + nbFile := 0 + + tarrd := tar.NewReader(rd) + for { + header, err := tarrd.Next() + if err == io.EOF { + break + } else if err != nil { + log.Printf("An error occurs when analyzing the tarball %q: %s", file.Name, err.Error()) + return + } + + info := header.FileInfo() + if !info.IsDir() { + nbFile += 1 + } + } + + if nbFile < 2 { + if !exceptions.HasException(":one-file-tarball") { + errs = append(errs, fmt.Errorf("don't make a tarball for one file")) + } + } else if nbFile < 5 && false { + if !exceptions.HasException(":few-files-tarball") { + errs = append(errs, fmt.Errorf("don't make a tarball for so little files (:few-files-tarball)")) + } + } else { + log.Printf("%d files found in %q", nbFile, file.Name) + } + } + + return +} diff --git a/repochecker/file-inspector/main.go b/repochecker/file-inspector/main.go new file mode 100644 index 00000000..7cd9c1fd --- /dev/null +++ b/repochecker/file-inspector/main.go @@ -0,0 +1,13 @@ +package main + +import ( + "srs.epita.fr/fic-server/admin/sync" +) + +var hooks *sync.CheckHooks + +func RegisterChecksHooks(h *sync.CheckHooks) { + hooks = h + + h.RegisterFileHook(InspectFile) +}