1
0
This repository has been archived on 2025-03-04. You can view files and clone it, but cannot push or open issues or pull requests.
Files
Matheus Sampaio Queiroga 0df872b33c update release
Signed-off-by: Matheus Sampaio Queiroga <srherobrine20@gmail.com>
2025-03-04 17:59:41 -03:00

83 lines
2.2 KiB
Go

package dpkg
import (
"archive/tar"
"bytes"
"fmt"
"io"
"sirherobrine23.com.br/gitea/act/ar"
)
/* DPKG is ar file
debian-binary 4: `2.0\n`
control.tar(.gz|.xz) -1: <BINARY>
data.tar(.gz|.xz|.zst) -1: <BINARY>
*/
type Dpkg struct {
Pkg *Package
Data io.Reader
DataSize int64
PreInstall []byte
PreRemove []byte
PostInstall []byte
PostRemove []byte
}
func WriteDpkg(w io.Writer, pkg *Dpkg) error {
arWrite := ar.NewWriter(w)
arWrite.WriteGlobalHeader()
if err := arWrite.WriteHeader(&ar.Header{Name: "debian-binary", Size: 4}); err != nil {
return err
} else if _, err = arWrite.Write([]byte("2.0\n")); err != nil {
return err
}
controlTarballBuff := &bytes.Buffer{}
controlTarball := tar.NewWriter(controlTarballBuff)
defer controlTarball.Close()
// Control file
controlFile, err := pkg.Pkg.MarshalBinary()
if err != nil {
return err
}
controlTarball.WriteHeader(&tar.Header{Name: "control", Size: int64(len(controlFile)), Mode: 0644})
controlTarball.Write(controlFile)
if pkg.PreInstall != nil {
controlTarball.WriteHeader(&tar.Header{Name: "preinst", Size: int64(len(pkg.PreInstall)), Mode: 0755})
controlTarball.Write(pkg.PreInstall)
}
if pkg.PostInstall != nil {
controlTarball.WriteHeader(&tar.Header{Name: "postinst", Size: int64(len(pkg.PostInstall)), Mode: 0755})
controlTarball.Write(pkg.PostInstall)
}
if pkg.PreRemove != nil {
controlTarball.WriteHeader(&tar.Header{Name: "prerm", Size: int64(len(pkg.PreRemove)), Mode: 0755})
controlTarball.Write(pkg.PreRemove)
}
if pkg.PostRemove != nil {
controlTarball.WriteHeader(&tar.Header{Name: "postrm", Size: int64(len(pkg.PostRemove)), Mode: 0755})
controlTarball.Write(pkg.PostRemove)
}
controlTarball.Close()
if err = arWrite.WriteHeader(&ar.Header{Name: "control.tar", Size: int64(len(controlTarballBuff.Bytes()))}); err != nil {
return err
} else if _, err = arWrite.Write(controlTarballBuff.Bytes()); err != nil {
return err
}
fileExt, read, err := compressExt(pkg.Data)
if err != nil {
return err
} else if err = arWrite.WriteHeader(&ar.Header{Name: fmt.Sprintf("data.tar%s", fileExt), Size: pkg.DataSize}); err != nil {
return err
} else if _, err = io.CopyN(arWrite, read, pkg.DataSize); err != nil {
return err
}
return nil
}