github.com/metux/go-metabuild@v0.0.0-20240118143255-d9ed5ab697f9/util/pkgmgr/dpkg/dpkg.go (about)

     1  package dpkg
     2  
     3  import (
     4  	"log"
     5  	"os"
     6  	"path/filepath"
     7  	"strings"
     8  
     9  	"github.com/metux/go-metabuild/util/cmd"
    10  	"github.com/metux/go-metabuild/util/fileutil"
    11  	"github.com/metux/go-metabuild/util/pkgmgr/base"
    12  )
    13  
    14  type Dpkg struct {
    15  	Command []string
    16  	Env     []string
    17  	Sysroot string
    18  }
    19  
    20  func NewDpkg(command []string, env []string, sysroot string) Dpkg {
    21  	if len(command) == 0 {
    22  		command = []string{"dpkg"}
    23  	}
    24  	return Dpkg{command, env, sysroot}
    25  }
    26  
    27  func (dpkg Dpkg) SearchInstalledFile(fn string) []base.PkgFileEntry {
    28  	res := make([]base.PkgFileEntry, 0)
    29  
    30  	cmdline := append(dpkg.Command, "-S", fn)
    31  	out, err := cmd.RunOutLines(cmdline, true)
    32  
    33  	if err != nil {
    34  		return res
    35  	}
    36  
    37  	for _, line := range out {
    38  		a := strings.Split(line, ": ")
    39  		res = append(res, base.NewPkgFileEntry(a[0], a[1]))
    40  	}
    41  
    42  	return res
    43  }
    44  
    45  func (dpkg Dpkg) MatchElfArch(debArch string, elfArch string) bool {
    46  	if debArch == elfArch {
    47  		return true
    48  	}
    49  	// FIXME: need a better mapping for that
    50  	if strings.HasSuffix(elfArch, debArch) {
    51  		return true
    52  	}
    53  
    54  	if debArch == "amd64" && elfArch == "elf64-x86-64" {
    55  		return true
    56  	}
    57  
    58  	return false
    59  }
    60  
    61  func (dpkg Dpkg) WriteControlFile(pkgroot string, control base.PkgControl) error {
    62  	debroot := pkgroot + "/DEBIAN"
    63  	os.MkdirAll(debroot, 0755)
    64  
    65  	// write DEBIAN/control
    66  	wr, err := fileutil.CreateWriter(debroot + "/control")
    67  	defer wr.Close()
    68  	if err != nil {
    69  		return err
    70  	}
    71  
    72  	wr.WriteFolded("Package", control.Package)
    73  	wr.WriteFolded("Version", control.Version)
    74  	wr.WriteFolded("Maintainer", control.Maintainer)
    75  	wr.WriteFolded("Section", control.Section)
    76  	wr.WriteFolded("Depend", strings.Join(control.Depend, ",\n"))
    77  	wr.WriteFolded("Multi-Arch", control.MultiArch)
    78  	wr.WriteFolded("Bugs", control.Bugs)
    79  	wr.WriteFolded("Homepage", control.Homepage)
    80  	wr.WriteFolded("Origin", control.Origin)
    81  	wr.WriteFolded("Priority", control.Priority)
    82  
    83  	if control.Architecture == "" {
    84  		wr.WriteFolded("Architecture", "all")
    85  	} else {
    86  		wr.WriteFolded("Architecture", control.Architecture)
    87  	}
    88  
    89  	wr.WriteFolded("Description", control.Description)
    90  
    91  	// write DEBIAN/md5sums
    92  	md5, err := fileutil.MD5Files(pkgroot, dpkg.ScanPlainFiles(pkgroot))
    93  	if err != nil {
    94  		return err
    95  	}
    96  	return fileutil.WriteText(debroot+"/md5sums", md5)
    97  }
    98  
    99  func (dpkg Dpkg) ScanPlainFiles(rootdir string) []string {
   100  	rootdirlen := len(rootdir)
   101  	flist := []string{}
   102  	filepath.Walk(rootdir,
   103  		func(path string, info os.FileInfo, err error) error {
   104  			if err == nil && !info.IsDir() && (info.Mode()&os.ModeSymlink != os.ModeSymlink) {
   105  				p := path[rootdirlen:]
   106  				if !strings.HasPrefix(p, "DEBIAN/") {
   107  					flist = append(flist, p)
   108  				}
   109  			}
   110  			return err
   111  		})
   112  	return flist
   113  }
   114  
   115  func (dpkg Dpkg) Build(pkgroot string, targetdir string) error {
   116  	cmdline := []string{"dpkg-deb", "-b", "--root-owner-group", pkgroot, targetdir}
   117  	_, err := cmd.RunOutLines(cmdline, true)
   118  	if err != nil {
   119  		log.Println("DPKG: build error", err)
   120  		return err
   121  	}
   122  	return nil
   123  }