linux db updates

This commit is contained in:
Lea Anthony
2019-08-06 18:18:42 +10:00
parent af6b631b7b
commit 2a3cb35dc1
6 changed files with 113 additions and 78 deletions

4
.vscode/launch.json vendored
View File

@@ -5,11 +5,11 @@
"version": "0.2.0",
"configurations": [
{
"name": "Test linux package",
"name": "Test cmd package",
"type": "go",
"request": "launch",
"mode": "test",
"program": "${workspaceFolder}/cmd/linux"
"program": "${workspaceFolder}/cmd/"
},
{
"name": "Wails Init",

File diff suppressed because one or more lines are too long

View File

@@ -42,69 +42,78 @@ type DistroInfo struct {
ID string
Description string
Release string
DiscoveredBy string
}
// GetLinuxDistroInfo returns information about the running linux distribution
func GetLinuxDistroInfo() *DistroInfo {
result := &DistroInfo{Distribution: Unknown}
result := &DistroInfo{
Distribution: Unknown,
ID: "unknown",
Name: "Unknown",
}
_, err := os.Stat("/etc/os-release")
if !os.IsNotExist(err) {
// Default value
osID := "unknown"
osNAME := "Unknown"
version := ""
// read /etc/os-release
osRelease, _ := ioutil.ReadFile("/etc/os-release")
// Split into lines
lines := strings.Split(string(osRelease), "\n")
// Iterate lines
for _, line := range lines {
// Split each line by the equals char
splitLine := strings.SplitN(line, "=", 2)
// Check we have
if len(splitLine) != 2 {
continue
}
switch splitLine[0] {
case "ID":
osID = strings.Trim(splitLine[1], "\"")
case "NAME":
osNAME = strings.Trim(splitLine[1], "\"")
case "VERSION_ID":
version = strings.Trim(splitLine[1], "\"")
}
}
// Check distro name against list of distros
result.Release = version
result.DiscoveredBy = "/etc/os-release"
switch osID {
case "fedora":
result.Distribution = Fedora
case "centos":
result.Distribution = CentOS
case "arch":
result.Distribution = Arch
case "debian":
result.Distribution = Debian
case "ubuntu":
result.Distribution = Ubuntu
case "gentoo":
result.Distribution = Gentoo
case "zorin":
result.Distribution = Zorin
default:
result.Distribution = Unknown
}
result.ID = osID
result.Name = osNAME
result = parseOsRelease(string(osRelease))
}
return result
}
// parseOsRelease parses the given os-release data and returns
// a DistroInfo struct with the details
func parseOsRelease(osRelease string) *DistroInfo {
result := &DistroInfo{Distribution: Unknown}
// Default value
osID := "unknown"
osNAME := "Unknown"
version := ""
// Split into lines
lines := strings.Split(osRelease, "\n")
// Iterate lines
for _, line := range lines {
// Split each line by the equals char
splitLine := strings.SplitN(line, "=", 2)
// Check we have
if len(splitLine) != 2 {
continue
}
switch splitLine[0] {
case "ID":
osID = strings.Trim(splitLine[1], "\"")
case "NAME":
osNAME = strings.Trim(splitLine[1], "\"")
case "VERSION_ID":
version = strings.Trim(splitLine[1], "\"")
}
}
// Check distro name against list of distros
result.Release = version
switch osID {
case "fedora":
result.Distribution = Fedora
case "centos":
result.Distribution = CentOS
case "arch":
result.Distribution = Arch
case "debian":
result.Distribution = Debian
case "ubuntu":
result.Distribution = Ubuntu
case "gentoo":
result.Distribution = Gentoo
case "zorin":
result.Distribution = Zorin
default:
result.Distribution = Unknown
}
result.ID = osID
result.Name = osNAME
return result
}
// EqueryInstalled uses equery to see if a package is installed
func EqueryInstalled(packageName string) (bool, error) {
program := NewProgramHelper()
@@ -180,7 +189,6 @@ func RequestSupportForDistribution(distroInfo *DistroInfo, libraryName string) e
str.WriteString(fmt.Sprintf("| Distribution ID | %s |\n", distroInfo.ID))
str.WriteString(fmt.Sprintf("| Distribution Name | %s |\n", distroInfo.Name))
str.WriteString(fmt.Sprintf("| Distribution Version | %s |\n", distroInfo.Release))
str.WriteString(fmt.Sprintf("| Discovered by | %s |\n", distroInfo.DiscoveredBy))
body := fmt.Sprintf("**Description**\nDistribution '%s' is currently unsupported.\n\n**Further Information**\n\n%s\n\n*Please add any extra information here, EG: libraries that are needed to make the distribution work, or commands to install them*", distroInfo.ID, str.String())
fullURL := "https://github.com/wailsapp/wails/issues/new?"

26
cmd/linux_test.go Normal file
View File

@@ -0,0 +1,26 @@
package cmd
import "testing"
func TestUbuntuDetection(t *testing.T) {
osrelease := `
NAME="Ubuntu"
VERSION="18.04.2 LTS (Bionic Beaver)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 18.04.2 LTS"
VERSION_ID="18.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=bionic
UBUNTU_CODENAME=bionic
`
result := parseOsRelease(osrelease)
if result.Distribution != Ubuntu {
t.Errorf("expected 'Ubuntu' ID but got '%d'", result.Distribution)
}
}

View File

@@ -2,16 +2,13 @@ package cmd
import (
"log"
"path"
"path/filepath"
"runtime"
"github.com/leaanthony/mewn"
"gopkg.in/yaml.v3"
)
type LinuxDB struct {
Distributions map[string]*Distribution `yaml:"distributions"`
filename string
}
type Distribution struct {
@@ -45,11 +42,15 @@ func (l *LinuxDB) Load(filename string) error {
if err != nil {
return err
}
return yaml.Unmarshal([]byte(data), l)
return l.ImportData(data)
}
return nil
}
func (l *LinuxDB) ImportData(data []byte) error {
return yaml.Unmarshal(data, l)
}
func (l *LinuxDB) GetDistro(name string) *Distribution {
return l.Distributions[name]
}
@@ -82,16 +83,11 @@ func (l *LinuxDB) GetDistro(name string) *Distribution {
// }
func NewLinuxDB() *LinuxDB {
_, filename, _, _ := runtime.Caller(1)
fullPath, err := filepath.Abs(filepath.Join(path.Dir(filename), "linuxdb.yaml"))
if err != nil {
log.Fatal("Unable to open linuxdb: " + fullPath)
}
data := mewn.Bytes("./linuxdb.yaml")
result := LinuxDB{
filename: fullPath,
Distributions: make(map[string]*Distribution),
}
err = result.Load(fullPath)
err := result.ImportData(data)
if err != nil {
log.Fatal(err)
}

View File

@@ -9,9 +9,6 @@ func newPrerequisite(name, help string) *Prerequisite {
return &Prerequisite{Name: name, Help: help}
}
// The Linux Distribution DB
var linuxDB = NewLinuxDB()
// Prerequisites is a list of things required to use Wails
type Prerequisites []*Prerequisite
@@ -44,10 +41,13 @@ func getRequiredProgramsOSX() *Prerequisites {
func getRequiredProgramsLinux() *Prerequisites {
result := &Prerequisites{}
distroInfo := GetLinuxDistroInfo()
distro := linuxDB.GetDistro(distroInfo.Name)
release := distro.GetRelease(distroInfo.Release)
for _, program := range release.Programs {
result.Add(program)
if distroInfo.Distribution != Unknown {
var linuxDB = NewLinuxDB()
distro := linuxDB.GetDistro(distroInfo.ID)
release := distro.GetRelease(distroInfo.Release)
for _, program := range release.Programs {
result.Add(program)
}
}
return result
}
@@ -81,11 +81,15 @@ func getRequiredLibrariesOSX() (*Prerequisites, error) {
func getRequiredLibrariesLinux() (*Prerequisites, error) {
result := &Prerequisites{}
// The Linux Distribution DB
distroInfo := GetLinuxDistroInfo()
distro := linuxDB.GetDistro(distroInfo.Name)
release := distro.GetRelease(distroInfo.Release)
for _, library := range release.Libraries {
result.Add(library)
if distroInfo.Distribution != Unknown {
var linuxDB = NewLinuxDB()
distro := linuxDB.GetDistro(distroInfo.ID)
release := distro.GetRelease(distroInfo.Release)
for _, library := range release.Libraries {
result.Add(library)
}
}
return result, nil
}