Signed-off-by: Matheus Sampaio Queiroga <srherobrine20@gmail.com>
83 lines
2.2 KiB
Go
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
|
|
}
|