100 lines
2.0 KiB
Go
100 lines
2.0 KiB
Go
package fastmirror
|
|
|
|
import (
|
|
"fmt"
|
|
"io/ioutil"
|
|
"log"
|
|
"os"
|
|
"os/exec"
|
|
"path/filepath"
|
|
"runtime"
|
|
"strings"
|
|
)
|
|
|
|
func cliEntry() {
|
|
if runtime.GOOS != "linux" {
|
|
log.Fatal("This program is only for Linux")
|
|
}
|
|
if !isUbuntu() {
|
|
log.Fatal("This program is only for Ubuntu")
|
|
}
|
|
|
|
fp := identifySourcesFile()
|
|
|
|
fmt.Printf("Found sources file: %s\n", fp)
|
|
|
|
architecture := runtime.GOARCH
|
|
switch architecture {
|
|
case "amd64", "386":
|
|
fmt.Println("Use archive.ubuntu.com for packages")
|
|
default:
|
|
fmt.Println("Use ports.ubuntu.com for packages")
|
|
}
|
|
}
|
|
|
|
func getUbuntuCodename() string {
|
|
cmd := exec.Command("lsb_release", "-cs")
|
|
output, err := cmd.Output()
|
|
if err != nil {
|
|
log.Fatal("Failed to run lsb_release: %v\n", err)
|
|
}
|
|
codename := strings.TrimSpace(string(output))
|
|
return codename
|
|
}
|
|
|
|
func isUbuntu() bool {
|
|
cmd := exec.Command("lsb_release", "-is")
|
|
output, err := cmd.Output()
|
|
if err != nil {
|
|
log.Fatal("Failed to run lsb_release: %v\n", err)
|
|
}
|
|
|
|
distro := strings.TrimSpace(string(output))
|
|
if distro == "Ubuntu" {
|
|
return true
|
|
} else {
|
|
return false
|
|
}
|
|
}
|
|
|
|
func identifySourcesFile() string {
|
|
const sourcesList = "/etc/apt/sources.list"
|
|
const sourcesListD = "/etc/apt/sources.list.d/"
|
|
if checkFileForUbuntu(sourcesList) {
|
|
fmt.Printf("Found Ubuntu sources file: %s\n", sourcesList)
|
|
return sourcesList
|
|
}
|
|
files, err := ioutil.ReadDir(sourcesListD)
|
|
if err != nil {
|
|
fmt.Printf("Failed to read directory %s: %v\n", sourcesListD, err)
|
|
os.Exit(1)
|
|
}
|
|
|
|
for _, file := range files {
|
|
if file.IsDir() {
|
|
continue
|
|
}
|
|
|
|
filePath := filepath.Join(sourcesListD, file.Name())
|
|
if checkFileForUbuntu(filePath) {
|
|
fmt.Printf("Found Ubuntu sources file: %s\n", filePath)
|
|
return filePath
|
|
}
|
|
}
|
|
return ""
|
|
}
|
|
|
|
func checkFileForUbuntu(filePath string) bool {
|
|
content, err := ioutil.ReadFile(filePath)
|
|
if err != nil {
|
|
fmt.Printf("Failed to read file %s: %v\n", filePath, err)
|
|
return false
|
|
}
|
|
|
|
if strings.Contains(strings.ToLower(string(content)), "ubuntu.com") {
|
|
return true
|
|
}
|
|
|
|
return false
|
|
}
|