Include package scripts in compilation
This commit is contained in:
parent
8b6ef5fa63
commit
6af3b77d69
@ -4,11 +4,11 @@ import (
|
|||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"gopkg.in/yaml.v3"
|
"gopkg.in/yaml.v3"
|
||||||
"io"
|
|
||||||
"os"
|
"os"
|
||||||
"os/exec"
|
"os/exec"
|
||||||
"path"
|
"path"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
func CompileSourcePackage(archiveFilename, outputFilename string) (err error) {
|
func CompileSourcePackage(archiveFilename, outputFilename string) (err error) {
|
||||||
@ -46,25 +46,18 @@ func CompileSourcePackage(archiveFilename, outputFilename string) (err error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Extract source.sh file
|
// Extract source.sh file
|
||||||
content, err := readTarballContent(archiveFilename, "source.sh")
|
err = extractTarballFile(archiveFilename, "source.sh", tempDirectory)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
sourceFile, err := os.Create(path.Join(tempDirectory, "source.sh"))
|
|
||||||
if err != nil {
|
// Get package scripts and extract them
|
||||||
return err
|
packageScripts := getPackageScripts(archiveFilename)
|
||||||
}
|
for _, script := range packageScripts {
|
||||||
_, err = io.Copy(sourceFile, content.tarReader)
|
err = extractTarballFile(archiveFilename, script, tempDirectory)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
err = sourceFile.Close()
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
err = content.file.Close()
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Extract source files
|
// Extract source files
|
||||||
@ -167,8 +160,13 @@ func CompileSourcePackage(archiveFilename, outputFilename string) (err error) {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Get files to include in BPM archive
|
||||||
|
bpmArchiveFiles := make([]string, 0)
|
||||||
|
bpmArchiveFiles = append(bpmArchiveFiles, "pkg.info", "pkg.files", "files.tar.gz") // Base files
|
||||||
|
bpmArchiveFiles = append(bpmArchiveFiles, packageScripts...) // Package scripts
|
||||||
|
|
||||||
// Create final BPM archive
|
// Create final BPM archive
|
||||||
cmd = exec.Command("bash", "-c", "tar -cf "+outputFilename+" --owner=0 --group=0 -C \"$BPM_WORKDIR\" pkg.info pkg.files ${PACKAGE_SCRIPTS[@]} files.tar.gz")
|
cmd = exec.Command("bash", "-c", "tar -cf "+outputFilename+" --owner=0 --group=0 -C \"$BPM_WORKDIR\" "+strings.Join(bpmArchiveFiles, " "))
|
||||||
cmd.Dir = tempDirectory
|
cmd.Dir = tempDirectory
|
||||||
cmd.Stdout = os.Stdout
|
cmd.Stdout = os.Stdout
|
||||||
cmd.Stderr = os.Stderr
|
cmd.Stderr = os.Stderr
|
||||||
|
@ -218,6 +218,31 @@ func ReadPackage(filename string) (*BPMPackage, error) {
|
|||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func getPackageScripts(filename string) (packageScripts []string) {
|
||||||
|
content, err := listTarballContent(filename)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, file := range content {
|
||||||
|
if file == "pre_install.sh" {
|
||||||
|
packageScripts = append(packageScripts, "pre_install.sh")
|
||||||
|
} else if file == "post_install.sh" {
|
||||||
|
packageScripts = append(packageScripts, "post_install.sh")
|
||||||
|
} else if file == "pre_update.sh" {
|
||||||
|
packageScripts = append(packageScripts, "pre_update.sh")
|
||||||
|
} else if file == "post_update.sh" {
|
||||||
|
packageScripts = append(packageScripts, "post_update.sh")
|
||||||
|
} else if file == "pre_remove.sh" {
|
||||||
|
packageScripts = append(packageScripts, "pre_remove.sh")
|
||||||
|
} else if file == "post_remove.sh" {
|
||||||
|
packageScripts = append(packageScripts, "post_remove.sh")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return packageScripts
|
||||||
|
}
|
||||||
|
|
||||||
func ReadPackageScripts(filename string) (map[string]string, error) {
|
func ReadPackageScripts(filename string) (map[string]string, error) {
|
||||||
if _, err := os.Stat(filename); os.IsNotExist(err) {
|
if _, err := os.Stat(filename); os.IsNotExist(err) {
|
||||||
return nil, err
|
return nil, err
|
||||||
@ -480,7 +505,7 @@ func extractPackage(bpmpkg *BPMPackage, verbose bool, filename, rootDir string)
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
tarballFile, err := readTarballContent(filename, "files.tar.gz")
|
tarballFile, err := readTarballFile(filename, "files.tar.gz")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@ -738,7 +763,7 @@ func installPackage(filename, rootDir string, verbose, force bool) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
tarballFile, err := readTarballContent(filename, "pkg.files")
|
tarballFile, err := readTarballFile(filename, "pkg.files")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -14,7 +14,35 @@ type tarballFileReader struct {
|
|||||||
file *os.File
|
file *os.File
|
||||||
}
|
}
|
||||||
|
|
||||||
func readTarballContent(tarballPath, fileToExtract string) (*tarballFileReader, error) {
|
func listTarballContent(tarballPath string) (content []string, err error) {
|
||||||
|
file, err := os.Open(tarballPath)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
defer file.Close()
|
||||||
|
|
||||||
|
tr := tar.NewReader(file)
|
||||||
|
for {
|
||||||
|
header, err := tr.Next()
|
||||||
|
if err == io.EOF {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
switch header.Typeflag {
|
||||||
|
case tar.TypeDir:
|
||||||
|
continue
|
||||||
|
default:
|
||||||
|
content = append(content, header.Name)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return content, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func readTarballFile(tarballPath, fileToExtract string) (*tarballFileReader, error) {
|
||||||
file, err := os.Open(tarballPath)
|
file, err := os.Open(tarballPath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
@ -44,6 +72,60 @@ func readTarballContent(tarballPath, fileToExtract string) (*tarballFileReader,
|
|||||||
return nil, errors.New("could not file in tarball")
|
return nil, errors.New("could not file in tarball")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func extractTarballFile(tarballPath, fileToExtract string, workingDirectory string) (err error) {
|
||||||
|
file, err := os.Open(tarballPath)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
defer file.Close()
|
||||||
|
|
||||||
|
tr := tar.NewReader(file)
|
||||||
|
for {
|
||||||
|
header, err := tr.Next()
|
||||||
|
if err == io.EOF {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Skip if filename does not match
|
||||||
|
if header.Name != fileToExtract {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
// Trim directory name from header name
|
||||||
|
header.Name = strings.Split(header.Name, "/")[len(strings.Split(header.Name, "/"))-1]
|
||||||
|
outputPath := path.Join(workingDirectory, header.Name)
|
||||||
|
|
||||||
|
switch header.Typeflag {
|
||||||
|
case tar.TypeReg:
|
||||||
|
// Create file and set permissions
|
||||||
|
file, err = os.Create(outputPath)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
err := file.Chmod(header.FileInfo().Mode())
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Copy data to file
|
||||||
|
_, err = io.Copy(file, tr)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Close file
|
||||||
|
file.Close()
|
||||||
|
default:
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func extractTarballDirectory(tarballPath, directoryToExtract, workingDirectory string) (err error) {
|
func extractTarballDirectory(tarballPath, directoryToExtract, workingDirectory string) (err error) {
|
||||||
file, err := os.Open(tarballPath)
|
file, err := os.Open(tarballPath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user