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 }