aides-repo-api/internal/services/taskservice/service.go

97 lines
2 KiB
Go

package taskservice
import (
"fmt"
"io"
"mime/multipart"
"os"
"os/exec"
"path"
"strings"
"code.alt-gnome.ru/aides-infra/aides-repo-api/internal/app"
)
type Service struct {
app *app.App
}
type TaskUploadInput struct {
TaskID string
Repo string
Files []*multipart.FileHeader
}
func New(app *app.App) *Service {
return &Service{
app: app,
}
}
func getRPMArchitecture(filePath string) (string, error) {
cmd := exec.Command("rpm", "-qp", "--queryformat", "%{ARCH}", filePath)
output, err := cmd.Output()
if err != nil {
return "", fmt.Errorf("ошибка при выполнении команды rpm: %v", err)
}
arch := strings.TrimSpace(string(output))
return arch, nil
}
func (s *Service) Upload(input *TaskUploadInput) error {
taskID := input.TaskID
files := input.Files
localPath := path.Join(taskID)
taskFolderPath := path.Join(s.app.Config.UploadDir, "tasks", localPath)
os.MkdirAll(taskFolderPath, os.ModePerm)
for _, fileHeader := range files {
file, err := fileHeader.Open()
if err != nil {
return err
}
defer file.Close()
// Полный путь для файла
filePath := path.Join(taskFolderPath, fileHeader.Filename)
//Удаляем файл если такой уже существует
if _, err := os.Stat(filePath); err == nil {
err = os.Remove(filePath)
if err != nil {
return err
}
}
// Сохранение файла на сервере
outFile, err := os.Create(filePath)
if err != nil {
return err
}
defer outFile.Close()
_, err = io.Copy(outFile, file)
if err != nil {
return err
}
arch, err := getRPMArchitecture(filePath)
if err != nil {
return err
}
// Символическая ссылка
targetPath := path.Join("../../../../tasks/", localPath, fileHeader.Filename)
symLink := path.Join(s.app.Config.UploadDir, "repo/Sisyphus", arch, "RPMS.aides", fileHeader.Filename)
err = createSymlink(targetPath, symLink)
if err != nil {
return err
}
}
return nil
}