repochecker/file-inspector: New checker

This commit is contained in:
nemunaire 2022-11-03 02:32:27 +01:00
parent 7a800b10de
commit 057ce22fb9
5 changed files with 104 additions and 1 deletions

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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
}

View File

@ -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)
}