Compare commits
10 Commits
afc19b6e4d
...
b58173837b
| Author | SHA1 | Date | |
|---|---|---|---|
| b58173837b | |||
| 97408da348 | |||
| be96001d78 | |||
| 7c4fba5c86 | |||
| 4cee062889 | |||
| 93093382f4 | |||
| e4b4d43163 | |||
| b89abb31df | |||
| 0a965c67c2 | |||
| 147fca375e |
@@ -1,17 +1,19 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bufio"
|
|
||||||
"database/sql"
|
"database/sql"
|
||||||
_ "embed"
|
_ "embed"
|
||||||
"fmt"
|
"fmt"
|
||||||
"log"
|
"log"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
"runtime"
|
||||||
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
|
|
||||||
"packets/configs"
|
"packets/configs"
|
||||||
"packets/internal/consts"
|
"packets/internal/consts"
|
||||||
|
errors_packets "packets/internal/errors"
|
||||||
"packets/internal/utils"
|
"packets/internal/utils"
|
||||||
packets "packets/pkg"
|
packets "packets/pkg"
|
||||||
|
|
||||||
@@ -85,6 +87,8 @@ func init() {
|
|||||||
log.Fatal(err)
|
log.Fatal(err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_ = os.MkdirAll("/var/lib/packets", 0777)
|
||||||
}
|
}
|
||||||
|
|
||||||
// COBRA CMDS
|
// COBRA CMDS
|
||||||
@@ -101,11 +105,10 @@ var syncCmd = &cobra.Command{
|
|||||||
log.Fatal("index.db does not exist, try to use \"packets sync\"")
|
log.Fatal("index.db does not exist, try to use \"packets sync\"")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
f, err := os.OpenFile(consts.IndexDB, os.O_WRONLY, 0)
|
|
||||||
if err != nil {
|
if os.Getuid() != 0 {
|
||||||
log.Fatalf("can't open to write [ %s ]. Are you running packets as root?\n", consts.IndexDB)
|
log.Fatal("are you running packets as root?")
|
||||||
}
|
}
|
||||||
f.Close()
|
|
||||||
|
|
||||||
syncUrl := consts.DefaultSyncUrl
|
syncUrl := consts.DefaultSyncUrl
|
||||||
if len(args) > 0 {
|
if len(args) > 0 {
|
||||||
@@ -160,13 +163,12 @@ var installCmd = &cobra.Command{
|
|||||||
}
|
}
|
||||||
|
|
||||||
for _, inputName := range args {
|
for _, inputName := range args {
|
||||||
|
runtime.GC()
|
||||||
|
|
||||||
var exist bool
|
var exist bool = false
|
||||||
err := db.QueryRow("SELECT EXISTS(SELECT 1 FROM packages WHERE name = ?)", inputName).Scan(&exist)
|
err := db.QueryRow("SELECT EXISTS(SELECT 1 FROM packages WHERE id = ?)", inputName).Scan(&exist)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if err != sql.ErrNoRows {
|
log.Fatal(err)
|
||||||
log.Panic(err)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if exist {
|
if exist {
|
||||||
installed, err := utils.CheckIfPackageInstalled(inputName)
|
installed, err := utils.CheckIfPackageInstalled(inputName)
|
||||||
@@ -174,7 +176,7 @@ var installCmd = &cobra.Command{
|
|||||||
log.Fatal(err)
|
log.Fatal(err)
|
||||||
}
|
}
|
||||||
if installed {
|
if installed {
|
||||||
log.Printf("package %s is already installed\n", inputName)
|
fmt.Printf("Package %s is already installed\n", inputName)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
fmt.Printf("Checking dependencies of (%s)\n", inputName)
|
fmt.Printf("Checking dependencies of (%s)\n", inputName)
|
||||||
@@ -201,7 +203,7 @@ var installCmd = &cobra.Command{
|
|||||||
}
|
}
|
||||||
for _, depn := range dependencies {
|
for _, depn := range dependencies {
|
||||||
wg.Add(1)
|
wg.Add(1)
|
||||||
go AyncFullInstall(depn, cfg.Config.StorePackages, filepath.Join(cfg.Config.Data_d, inputName), &wg, &mu)
|
go AyncFullInstall(depn, cfg.Config.StorePackages, filepath.Join(cfg.Config.Data_d, depn), &wg, &mu)
|
||||||
}
|
}
|
||||||
|
|
||||||
wg.Wait()
|
wg.Wait()
|
||||||
@@ -237,193 +239,92 @@ var installCmd = &cobra.Command{
|
|||||||
continue
|
continue
|
||||||
|
|
||||||
}
|
}
|
||||||
|
var id string
|
||||||
|
err = db.QueryRow("SELECT id FROM packages WHERE query_name = ? ORDER BY serial DESC LIMIT 1", inputName).Scan(&id)
|
||||||
|
if err != nil {
|
||||||
|
if err == sql.ErrNoRows {
|
||||||
|
log.Panicf("can't find any results for (%s)\n", inputName)
|
||||||
|
}
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
rows, err := db.Query("SELECT id, version, description FROM packages WHERE query_name = ?", inputName)
|
installed, err := utils.CheckIfPackageInstalled(inputName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatal(err)
|
log.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
defer rows.Close()
|
if installed {
|
||||||
|
fmt.Printf(":: Package %s is already installed, searching for upgrades...\n", inputName)
|
||||||
var pkgs []Quer1
|
var wg sync.WaitGroup
|
||||||
for rows.Next() {
|
wg.Add(1)
|
||||||
var q Quer1
|
go AsyncFullyUpgrade(inputName, cfg.Config.StorePackages, filepath.Join(cfg.Config.Data_d, id), &wg, db)
|
||||||
if err := rows.Scan(&q.Name, &q.Version, &q.Description); err != nil {
|
wg.Done()
|
||||||
log.Panic(err)
|
|
||||||
}
|
|
||||||
pkgs = append(pkgs, q)
|
|
||||||
}
|
|
||||||
switch len(pkgs) {
|
|
||||||
case 0:
|
|
||||||
log.Fatalf("can't find any results for (%s)\n", inputName)
|
|
||||||
|
|
||||||
case 1:
|
|
||||||
fmt.Printf(":: Founded 1 package for %s \n", inputName)
|
|
||||||
|
|
||||||
installed, err := utils.CheckIfPackageInstalled(pkgs[0].Name)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
if installed {
|
|
||||||
log.Printf("Package %s is already installed\n", pkgs[0].Name)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
fmt.Printf("Checking dependencies of (%s)\n", pkgs[0].Name)
|
|
||||||
dependenciesRaw, err := utils.GetDependencies(db, inputName)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
dependencies, err := utils.ResolvDependencies(dependenciesRaw)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(dependencies) > 0 {
|
|
||||||
var wg sync.WaitGroup
|
|
||||||
var mu sync.Mutex
|
|
||||||
|
|
||||||
fmt.Printf(":: Packets will install %s and %d dependencies\nPackages to install:\n", pkgs[0].Name, len(dependencies))
|
|
||||||
fmt.Println(dependencies)
|
|
||||||
fmt.Println("Are you sure? (y/N)")
|
|
||||||
var a string
|
|
||||||
fmt.Scanf("%s", &a)
|
|
||||||
if a != "y" && a != "Y" {
|
|
||||||
os.Exit(1)
|
|
||||||
}
|
|
||||||
for _, depn := range dependencies {
|
|
||||||
wg.Add(1)
|
|
||||||
go AyncFullInstall(depn, cfg.Config.StorePackages, filepath.Join(cfg.Config.Data_d, inputName), &wg, &mu)
|
|
||||||
}
|
|
||||||
|
|
||||||
wg.Wait()
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
fmt.Printf("Downloading %s \n", pkgs[0].Name)
|
|
||||||
p, err := utils.GetPackage(pkgs[0].Name)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
cfg, err := configs.GetConfigTOML()
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
fmt.Printf(":: Installing %s \n", pkgs[0].Name)
|
|
||||||
if err := packets.InstallPackage(p.PackageF, filepath.Join(cfg.Config.Data_d, pkgs[0].Name)); err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
if cfg.Config.StorePackages {
|
|
||||||
_, err := p.Write()
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
err = p.AddToInstalledDB(1, filepath.Join(cfg.Config.Data_d, pkgs[0].Name))
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
err := p.AddToInstalledDB(0, filepath.Join(cfg.Config.Data_d, pkgs[0].Name))
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
continue
|
|
||||||
|
|
||||||
default:
|
|
||||||
|
|
||||||
fmt.Printf(":: Founded %d packages for (%s)\n Select 1 to install\n", len(pkgs), inputName)
|
|
||||||
for i, q := range pkgs {
|
|
||||||
fmt.Printf("[%d] %s : %s\n %s\n", i, q.Name, q.Version, q.Description)
|
|
||||||
}
|
|
||||||
var choice int
|
|
||||||
optionagain:
|
|
||||||
fmt.Print(">> ")
|
|
||||||
fmt.Fscan(bufio.NewReader(os.Stdin), &choice)
|
|
||||||
if choice > len(pkgs) || choice < 0 {
|
|
||||||
fmt.Println("invalid option")
|
|
||||||
goto optionagain
|
|
||||||
}
|
|
||||||
|
|
||||||
installed, err := utils.CheckIfPackageInstalled(pkgs[choice].Name)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
if installed {
|
|
||||||
log.Printf("package %s is already installed\n", pkgs[choice].Name)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
fmt.Printf("Checking dependencies of (%s)\n", pkgs[choice].Name)
|
|
||||||
dependenciesRaw, err := utils.GetDependencies(db, inputName)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
dependencies, err := utils.ResolvDependencies(dependenciesRaw)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(dependencies) > 0 {
|
|
||||||
var wg sync.WaitGroup
|
|
||||||
var mu sync.Mutex
|
|
||||||
|
|
||||||
fmt.Printf(":: Packets will install %s and %d dependencies\nPackages to install:\n", pkgs[choice].Name, len(dependencies))
|
|
||||||
fmt.Println(dependencies)
|
|
||||||
fmt.Println("Are you sure? (y/N)")
|
|
||||||
var a string
|
|
||||||
fmt.Scanf("%s", &a)
|
|
||||||
if a != "y" && a != "Y" {
|
|
||||||
os.Exit(1)
|
|
||||||
}
|
|
||||||
for _, depn := range dependencies {
|
|
||||||
wg.Add(1)
|
|
||||||
go AyncFullInstall(depn, cfg.Config.StorePackages, filepath.Join(cfg.Config.Data_d, pkgs[choice].Name), &wg, &mu)
|
|
||||||
}
|
|
||||||
|
|
||||||
wg.Wait()
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
fmt.Printf("Downloading %s \n", pkgs[choice].Name)
|
|
||||||
p, err := utils.GetPackage(pkgs[choice].Name)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
cfg, err := configs.GetConfigTOML()
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
fmt.Printf(":: Installing (%s) \n", pkgs[choice].Name)
|
|
||||||
if err := packets.InstallPackage(p.PackageF, filepath.Join(cfg.Config.Data_d, pkgs[choice].Name)); err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
if cfg.Config.StorePackages {
|
|
||||||
_, err := p.Write()
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
err = p.AddToInstalledDB(1, filepath.Join(cfg.Config.Data_d, pkgs[choice].Name))
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
err := p.AddToInstalledDB(0, filepath.Join(cfg.Config.Data_d, pkgs[choice].Name))
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fmt.Printf("Checking dependencies of (%s)\n", inputName)
|
||||||
|
dependenciesRaw, err := utils.GetDependencies(db, id)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
dependencies, err := utils.ResolvDependencies(dependenciesRaw)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
if len(dependencies) > 0 {
|
||||||
|
var wg sync.WaitGroup
|
||||||
|
var mu sync.Mutex
|
||||||
|
|
||||||
|
fmt.Printf(":: Packets will install %s and %d dependencies\nPackages to install:\n", id, len(dependencies))
|
||||||
|
fmt.Println(dependencies)
|
||||||
|
fmt.Println("Are you sure? (y/N)")
|
||||||
|
var a string
|
||||||
|
fmt.Scanf("%s", &a)
|
||||||
|
if a != "y" && a != "Y" {
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
for _, depn := range dependencies {
|
||||||
|
wg.Add(1)
|
||||||
|
go AyncFullInstall(depn, cfg.Config.StorePackages, filepath.Join(cfg.Config.Data_d, depn), &wg, &mu)
|
||||||
|
}
|
||||||
|
|
||||||
|
wg.Wait()
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Printf("Downloading %s \n", inputName)
|
||||||
|
p, err := utils.GetPackage(id)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
cfg, err := configs.GetConfigTOML()
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Printf(":: Installing %s \n", inputName)
|
||||||
|
if err := packets.InstallPackage(p.PackageF, filepath.Join(cfg.Config.Data_d, id)); err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if cfg.Config.StorePackages {
|
||||||
|
_, err := p.Write()
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
err = p.AddToInstalledDB(1, filepath.Join(cfg.Config.Data_d, id))
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
err := p.AddToInstalledDB(0, filepath.Join(cfg.Config.Data_d, id))
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
continue
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
@@ -483,11 +384,12 @@ var removeCmd = &cobra.Command{
|
|||||||
}
|
}
|
||||||
|
|
||||||
fmt.Println("Sucessifully removed")
|
fmt.Println("Sucessifully removed")
|
||||||
|
continue
|
||||||
|
|
||||||
os.Exit(0)
|
|
||||||
}
|
}
|
||||||
log.Fatalf("%s not installed", pkgName)
|
log.Fatalf("%s not installed", pkgName)
|
||||||
}
|
}
|
||||||
|
os.Exit(0)
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -570,12 +472,60 @@ var searchCmd = &cobra.Command{
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var upgradeCmd = &cobra.Command{
|
||||||
|
Use: "upgrade",
|
||||||
|
Args: cobra.NoArgs,
|
||||||
|
Short: "upgrade all installed packages",
|
||||||
|
Run: func(cmd *cobra.Command, args []string) {
|
||||||
|
|
||||||
|
if os.Getuid() != 0 {
|
||||||
|
log.Fatal("you must run this command as root")
|
||||||
|
}
|
||||||
|
|
||||||
|
cfg, err := configs.GetConfigTOML()
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
db, err := sql.Open("sqlite", consts.InstalledDB)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
defer db.Close()
|
||||||
|
|
||||||
|
rows, err := db.Query("SELECT query_name FROM packages")
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
defer rows.Close()
|
||||||
|
|
||||||
|
var installedPackagesQName []string
|
||||||
|
for rows.Next() {
|
||||||
|
var queryName string
|
||||||
|
if err := rows.Scan(&queryName); err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
installedPackagesQName = append(installedPackagesQName, queryName)
|
||||||
|
}
|
||||||
|
|
||||||
|
var wg sync.WaitGroup
|
||||||
|
|
||||||
|
for _, v := range installedPackagesQName {
|
||||||
|
wg.Add(1)
|
||||||
|
go AsyncFullyUpgrade(v, cfg.Config.StorePackages, cfg.Config.Data_d, &wg, db)
|
||||||
|
}
|
||||||
|
wg.Wait()
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
rootCmd.AddCommand(installCmd)
|
rootCmd.AddCommand(installCmd)
|
||||||
rootCmd.AddCommand(removeCmd)
|
rootCmd.AddCommand(removeCmd)
|
||||||
rootCmd.AddCommand(syncCmd)
|
rootCmd.AddCommand(syncCmd)
|
||||||
rootCmd.AddCommand(listCmd)
|
rootCmd.AddCommand(listCmd)
|
||||||
rootCmd.AddCommand(searchCmd)
|
rootCmd.AddCommand(searchCmd)
|
||||||
|
rootCmd.AddCommand(upgradeCmd)
|
||||||
rootCmd.Execute()
|
rootCmd.Execute()
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -619,3 +569,99 @@ func AyncFullInstall(dep string, storePackages bool, installPath string, wg *syn
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func AsyncFullyUpgrade(queryName string, storePackages bool, installDir string, wg *sync.WaitGroup, db *sql.DB) {
|
||||||
|
defer wg.Done()
|
||||||
|
installed, err := utils.CheckIfPackageInstalled(queryName)
|
||||||
|
if err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if !installed {
|
||||||
|
log.Println(errors_packets.ErrNotInstalled)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
idb, err := sql.Open("sqlite", consts.InstalledDB)
|
||||||
|
if err != nil {
|
||||||
|
log.Panic(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
var oldSerial int
|
||||||
|
if err := idb.QueryRow("SELECT serial FROM packages WHERE query_name = ?", queryName).Scan(&oldSerial); err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
var newSerial int
|
||||||
|
var id string
|
||||||
|
if err := db.QueryRow("SELECT serial, id FROM packages WHERE query_name = ? ORDER BY serial DESC LIMIT 1", queryName).Scan(&newSerial, &id); err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
installPath := filepath.Join(installDir, id)
|
||||||
|
if oldSerial == newSerial {
|
||||||
|
log.Println(errors_packets.ErrAlredyUpToDate)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
var v int
|
||||||
|
if storePackages {
|
||||||
|
v = 1
|
||||||
|
} else {
|
||||||
|
v = 0
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := UpgradeToThis(id, installPath, idb, v); err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func UpgradeToThis(id string, installPath string, installedDB *sql.DB, storePkgFile int) error {
|
||||||
|
|
||||||
|
p, err := utils.GetPackage(id)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
query_name := strings.SplitN(id, "@", 2)[0]
|
||||||
|
|
||||||
|
var oldPath string
|
||||||
|
if err := installedDB.QueryRow("SELECT package_d FROM packages WHERE query_name = ?", query_name).Scan(&oldPath); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := os.Rename(oldPath, installPath); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := packets.InstallPackage(p.PackageF, installPath); err != nil {
|
||||||
|
if err := os.Rename(installPath, oldPath); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err = installedDB.Exec(`
|
||||||
|
UPDATE packages
|
||||||
|
SET query_name = ?, id = ?, version = ?, description = ?,
|
||||||
|
serial = ?, package_d = ?, filename = ?, os = ?, arch = ?, in_cache = ?
|
||||||
|
`,
|
||||||
|
p.QueryName,
|
||||||
|
p.Manifest.Info.Id,
|
||||||
|
p.Version,
|
||||||
|
p.Description,
|
||||||
|
p.Serial,
|
||||||
|
installPath,
|
||||||
|
p.Filename,
|
||||||
|
p.OS,
|
||||||
|
p.Arch,
|
||||||
|
storePkgFile,
|
||||||
|
)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|||||||
@@ -6,4 +6,6 @@ var (
|
|||||||
ErrResponseNot200OK = errors.New("the request is not 200, download failed")
|
ErrResponseNot200OK = errors.New("the request is not 200, download failed")
|
||||||
ErrCantFindManifestTOML = errors.New("can't find manifest.toml when trying to read the packagefile")
|
ErrCantFindManifestTOML = errors.New("can't find manifest.toml when trying to read the packagefile")
|
||||||
ErrInvalidSignature = errors.New("the signature is invalid")
|
ErrInvalidSignature = errors.New("the signature is invalid")
|
||||||
|
ErrNotInstalled = errors.New("the package isn't installed")
|
||||||
|
ErrAlredyUpToDate = errors.New("alredy up to date")
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -252,8 +252,12 @@ func CheckIfPackageInstalled(name string) (bool, error) {
|
|||||||
}
|
}
|
||||||
defer db.Close()
|
defer db.Close()
|
||||||
|
|
||||||
|
if strings.Contains(name, "@") {
|
||||||
|
name = strings.SplitN(name, "@", 2)[0]
|
||||||
|
}
|
||||||
|
|
||||||
var exists bool
|
var exists bool
|
||||||
err = db.QueryRow("SELECT EXISTS(SELECT 1 FROM packages WHERE id = ? OR query_name = ?)", name, name).Scan(&exists)
|
err = db.QueryRow("SELECT EXISTS(SELECT 1 FROM packages WHERE query_name = ?)", name).Scan(&exists)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false, err
|
return false, err
|
||||||
}
|
}
|
||||||
@@ -284,6 +288,7 @@ func GetDependencies(db *sql.DB, id string) (map[string]string, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func ResolvDependencies(depnList map[string]string) ([]string, error) {
|
func ResolvDependencies(depnList map[string]string) ([]string, error) {
|
||||||
|
|
||||||
db, err := sql.Open("sqlite", consts.IndexDB)
|
db, err := sql.Open("sqlite", consts.IndexDB)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return []string{}, err
|
return []string{}, err
|
||||||
@@ -299,13 +304,13 @@ func ResolvDependencies(depnList map[string]string) ([]string, error) {
|
|||||||
switch {
|
switch {
|
||||||
case strings.HasPrefix(constraint, ">"):
|
case strings.HasPrefix(constraint, ">"):
|
||||||
filter = fmt.Sprintf("AND serial > %s", value)
|
filter = fmt.Sprintf("AND serial > %s", value)
|
||||||
order = "ORDER BY serial ASC LIMIT 1"
|
order = "ORDER BY serial DESC LIMIT 1"
|
||||||
case strings.HasPrefix(constraint, "<="):
|
case strings.HasPrefix(constraint, "<="):
|
||||||
filter = fmt.Sprintf("AND serial <= %s", value)
|
filter = fmt.Sprintf("AND serial <= %s", value)
|
||||||
order = "ORDER BY serial DESC LIMIT 1"
|
order = "ORDER BY serial ASC LIMIT 1"
|
||||||
case strings.HasPrefix(constraint, "<"):
|
case strings.HasPrefix(constraint, "<"):
|
||||||
filter = fmt.Sprintf("AND serial < %s", value)
|
filter = fmt.Sprintf("AND serial < %s", value)
|
||||||
order = "ORDER BY serial DESC LIMIT 1"
|
order = "ORDER BY serial ASC LIMIT 1"
|
||||||
case strings.HasPrefix(constraint, "="):
|
case strings.HasPrefix(constraint, "="):
|
||||||
filter = fmt.Sprintf("AND serial = %s", value)
|
filter = fmt.Sprintf("AND serial = %s", value)
|
||||||
order = ""
|
order = ""
|
||||||
@@ -322,7 +327,6 @@ func ResolvDependencies(depnList map[string]string) ([]string, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
resolved = append(resolved, packageId)
|
resolved = append(resolved, packageId)
|
||||||
|
|
||||||
dp, err := GetDependencies(db, packageId)
|
dp, err := GetDependencies(db, packageId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return resolved, err
|
return resolved, err
|
||||||
@@ -368,6 +372,7 @@ func RemoveFromInstalledDB(id string) error {
|
|||||||
func GetPackage(id string) (Package, error) {
|
func GetPackage(id string) (Package, error) {
|
||||||
|
|
||||||
var this Package
|
var this Package
|
||||||
|
this.Dependencies = make(map[string]string)
|
||||||
var peers []Peer
|
var peers []Peer
|
||||||
|
|
||||||
db, err := sql.Open("sqlite", consts.IndexDB)
|
db, err := sql.Open("sqlite", consts.IndexDB)
|
||||||
@@ -437,6 +442,7 @@ func GetPackage(id string) (Package, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if len(peers) == 0 {
|
if len(peers) == 0 {
|
||||||
|
fmt.Printf(":: Pulling from %s\n", packageUrl)
|
||||||
this.PackageF, err = GetFileHTTP(packageUrl)
|
this.PackageF, err = GetFileHTTP(packageUrl)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return Package{}, err
|
return Package{}, err
|
||||||
@@ -444,6 +450,7 @@ func GetPackage(id string) (Package, error) {
|
|||||||
} else {
|
} else {
|
||||||
var totalerrors int = 0
|
var totalerrors int = 0
|
||||||
for _, peer := range peers {
|
for _, peer := range peers {
|
||||||
|
fmt.Printf(":: Pulling from local network (%s)\n", peer.IP)
|
||||||
this.PackageF, err = GetFileHTTP(fmt.Sprintf("http://%s:%d/%s", peer.IP, peer.Port, filename))
|
this.PackageF, err = GetFileHTTP(fmt.Sprintf("http://%s:%d/%s", peer.IP, peer.Port, filename))
|
||||||
if err == nil {
|
if err == nil {
|
||||||
break
|
break
|
||||||
@@ -475,7 +482,7 @@ skipping:
|
|||||||
}
|
}
|
||||||
|
|
||||||
func GetPacketsUID() (int, error) {
|
func GetPacketsUID() (int, error) {
|
||||||
_ = exec.Command("useradd", "-M", "-N", "-r", "packets").Run()
|
_ = exec.Command("useradd", "-M", "-N", "-r", "-s", "/bin/false", "-d", "/var/lib/packets", "packets").Run()
|
||||||
cmd := exec.Command("id", "-u", "packets")
|
cmd := exec.Command("id", "-u", "packets")
|
||||||
|
|
||||||
out, err := cmd.CombinedOutput()
|
out, err := cmd.CombinedOutput()
|
||||||
@@ -496,6 +503,7 @@ func ChangeToNoPermission() error {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
_ = os.Chown("/var/lib/packets", uid, 0)
|
||||||
|
|
||||||
return syscall.Setresuid(0, uid, 0)
|
return syscall.Setresuid(0, uid, 0)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user