feat: implement openSUSE 42+ support
This commit is contained in:
		
							
								
								
									
										185
									
								
								distro/opensuse/opensuse.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										185
									
								
								distro/opensuse/opensuse.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,185 @@ | ||||
| package opensuse | ||||
|  | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"strings" | ||||
|  | ||||
| 	"code.dumpstack.io/tools/out-of-tree/container" | ||||
| 	"code.dumpstack.io/tools/out-of-tree/distro" | ||||
| ) | ||||
|  | ||||
| func init() { | ||||
| 	releases := []string{ | ||||
| 		"42.1", "42.2", "42.3", | ||||
| 		"15.0", "15.1", "15.2", "15.3", "15.4", "15.5", | ||||
| 	} | ||||
|  | ||||
| 	for _, release := range releases { | ||||
| 		distro.Register(OpenSUSE{release: release}) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| type OpenSUSE struct { | ||||
| 	release string | ||||
| } | ||||
|  | ||||
| func (suse OpenSUSE) Equal(d distro.Distro) bool { | ||||
| 	return suse.release == d.Release && distro.OpenSUSE == d.ID | ||||
| } | ||||
|  | ||||
| func (suse OpenSUSE) Distro() distro.Distro { | ||||
| 	return distro.Distro{ID: distro.OpenSUSE, Release: suse.release} | ||||
| } | ||||
|  | ||||
| func (suse OpenSUSE) Packages() (pkgs []string, err error) { | ||||
| 	c, err := container.New(suse.Distro()) | ||||
| 	if err != nil { | ||||
| 		return | ||||
| 	} | ||||
|  | ||||
| 	var name string | ||||
| 	if strings.HasPrefix(suse.release, "42") { | ||||
| 		name = "opensuse/leap:42" | ||||
| 	} else if strings.HasPrefix(suse.release, "15") { | ||||
| 		name = "opensuse/leap:" + suse.release | ||||
| 	} | ||||
|  | ||||
| 	err = c.Build(name, suse.envs(), suse.runs()) | ||||
| 	if err != nil { | ||||
| 		return | ||||
| 	} | ||||
|  | ||||
| 	cmd := "zypper search -s --match-exact kernel-default | grep x86_64 " + | ||||
| 		"| cut -d '|' -f 4 | sed 's/ //g'" | ||||
|  | ||||
| 	output, err := c.Run("", []string{cmd}) | ||||
| 	if err != nil { | ||||
| 		return | ||||
| 	} | ||||
|  | ||||
| 	for _, pkg := range strings.Fields(output) { | ||||
| 		pkgs = append(pkgs, pkg) | ||||
| 	} | ||||
|  | ||||
| 	return | ||||
| } | ||||
|  | ||||
| func (suse OpenSUSE) Kernels() (kernels []distro.KernelInfo, err error) { | ||||
| 	c, err := container.New(suse.Distro()) | ||||
| 	if err != nil { | ||||
| 		return | ||||
| 	} | ||||
|  | ||||
| 	return c.Kernels() | ||||
| } | ||||
|  | ||||
| func (suse OpenSUSE) envs() (envs []string) { | ||||
| 	return | ||||
| } | ||||
|  | ||||
| func (suse OpenSUSE) runs() (commands []string) { | ||||
| 	cmdf := func(f string, s ...interface{}) { | ||||
| 		commands = append(commands, fmt.Sprintf(f, s...)) | ||||
| 	} | ||||
|  | ||||
| 	main := "http://download.opensuse.org/" | ||||
| 	discontinued := "http://ftp.gwdg.de/pub/opensuse/discontinued/" | ||||
|  | ||||
| 	var repourls []string | ||||
|  | ||||
| 	if strings.HasPrefix(suse.release, "42") { | ||||
| 		dist := discontinued + "distribution/leap/%s/repo/oss/suse/" | ||||
| 		update := discontinued + "update/leap/%s/oss/" | ||||
| 		repourls = append(repourls, | ||||
| 			fmt.Sprintf(dist, suse.release), | ||||
| 			fmt.Sprintf(update, suse.release), | ||||
| 		) | ||||
| 	} else if strings.HasPrefix(suse.release, "15") { | ||||
| 		dist := main + "distribution/leap/%s/repo/oss/" | ||||
| 		update := main + "update/leap/%s/oss/" | ||||
| 		repourls = append(repourls, | ||||
| 			fmt.Sprintf(dist, suse.release), | ||||
| 			fmt.Sprintf(update, suse.release), | ||||
| 		) | ||||
|  | ||||
| 		switch suse.release { | ||||
| 		case "15.3", "15.4", "15.5": | ||||
| 			sle := main + "update/leap/%s/sle/" | ||||
| 			repourls = append(repourls, | ||||
| 				fmt.Sprintf(sle, suse.release), | ||||
| 			) | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	cmdf("rm /etc/zypp/repos.d/*") | ||||
|  | ||||
| 	for i, repourl := range repourls { | ||||
| 		cmdf(`echo -e `+ | ||||
| 			`"[%d]\n`+ | ||||
| 			`name=%d\n`+ | ||||
| 			`enabled=1\n`+ | ||||
| 			`autorefresh=0\n`+ | ||||
| 			`gpgcheck=0\n`+ | ||||
| 			`baseurl=%s" > /etc/zypp/repos.d/%d.repo`, | ||||
| 			i, i, repourl, i, | ||||
| 		) | ||||
| 	} | ||||
|  | ||||
| 	cmdf("zypper -n refresh") | ||||
| 	cmdf("zypper -n update") | ||||
|  | ||||
| 	params := "--no-recommends --force-resolution --replacefiles" | ||||
| 	cmdf("zypper --no-refresh -n install %s -t pattern devel_kernel", params) | ||||
|  | ||||
| 	// Cache dependencies | ||||
| 	cmdf("zypper -n install %s kernel-default kernel-default-devel "+ | ||||
| 		"&& zypper -n remove -U kernel-default kernel-default-devel", | ||||
| 		params) | ||||
|  | ||||
| 	cmdf("zypper --no-refresh -n install %s kmod which", params) | ||||
| 	return | ||||
| } | ||||
|  | ||||
| func (suse OpenSUSE) Install(version string, headers bool) (err error) { | ||||
| 	var commands []string | ||||
| 	cmdf := func(f string, s ...interface{}) { | ||||
| 		commands = append(commands, fmt.Sprintf(f, s...)) | ||||
| 	} | ||||
|  | ||||
| 	installcmd := "zypper --no-refresh -n " + | ||||
| 		"install --force-resolution --capability" | ||||
| 	cmdf("%s kernel-default=%s", installcmd, version) | ||||
| 	if headers { | ||||
| 		cmdf("%s kernel-default-devel=%s", installcmd, version) | ||||
| 	} | ||||
|  | ||||
| 	cmdf("dracut " + | ||||
| 		"--add-drivers 'ata_piix libata' " + | ||||
| 		"--force-drivers 'e1000 ext4 sd_mod rfkill af_packet' " + | ||||
| 		"-f /boot/initrd-$(ls /lib/modules) $(ls /lib/modules)") | ||||
|  | ||||
| 	cmdf("cp -r /boot /target/") | ||||
| 	cmdf("cp -r /lib/modules /target/lib/") | ||||
| 	cmdf("cp -r /usr/src /target/usr/") | ||||
|  | ||||
| 	c, err := container.New(suse.Distro()) | ||||
| 	if err != nil { | ||||
| 		return | ||||
| 	} | ||||
|  | ||||
| 	for i := range c.Volumes { | ||||
| 		c.Volumes[i].Dest = "/target" + c.Volumes[i].Dest | ||||
| 	} | ||||
|  | ||||
| 	_, err = c.Run("", commands) | ||||
| 	if err != nil { | ||||
| 		return | ||||
| 	} | ||||
|  | ||||
| 	return | ||||
| } | ||||
|  | ||||
| func (suse OpenSUSE) RootFS() string { | ||||
| 	return fmt.Sprintf("out_of_tree_opensuse_%s.img", | ||||
| 		strings.Split(suse.release, ".")[0]) | ||||
| } | ||||
		Reference in New Issue
	
	Block a user