package main import ( "archive/tar" "bufio" "crypto/sha256" "database/sql" "encoding/hex" "encoding/json" "fmt" "io" "log" "net" "net/http" "net/url" "os" "os/exec" "path" "path/filepath" "strconv" "strings" "syscall" "time" "golang.org/x/net/ipv4" _ "modernc.org/sqlite" "github.com/ulikunitz/xz" ) type Installed struct { Realname string Version string Dependencies []string Family string Serial uint } type Peer struct { IP net.IP Port int } type Quer1 struct { Realname string Version string Description string } type Manifest struct { Name string `json:"name"` Version string `json:"version"` Description string `json:"description"` Dependencies []string `json:"dependencies"` Author string `json:"author"` Family string `json:"family"` Serial uint `json:"serial"` } var Serialpass uint func main() { uid := os.Getuid() if uid != 0 { fmt.Println("please, run packet as root") return } if len(os.Args) < 2 { fmt.Println("invalid syntax") return } cmd := os.Args[1] switch cmd { case "install": if len(os.Args) < 3 { fmt.Println("usage: packets install ") return } db, err := sql.Open("sqlite", "/opt/packets/packets/index.db") if err != nil { log.Fatal(err) return } defer db.Close() nameToQuery := os.Args[2] rows, err := db.Query("SELECT realname, version, description FROM packages WHERE name = ?", nameToQuery) if err != nil { if strings.Contains(err.Error(), "file is not a database (26)") { fmt.Println("index.db corrupted") return } log.Panic(err) return } defer rows.Close() var pkgs []Quer1 for rows.Next() { var q Quer1 if err := rows.Scan(&q.Realname, &q.Version, &q.Description); err != nil { log.Fatal(err) } pkgs = append(pkgs, q) } switch len(pkgs) { case 0: fmt.Printf("can't find any results for %s\n", nameToQuery) return case 1: fmt.Printf("Founded 1 package for %s \n", nameToQuery) fmt.Printf("Downloading %s \n", pkgs[0].Realname) QueryInstall(pkgs[0].Realname) return default: fmt.Printf("Found %d versions of %s\n Select 1\n", len(pkgs), nameToQuery) for i, q := range pkgs { fmt.Printf("[%d] %s : %s\n %s\n", i, q.Realname, q.Version, q.Description) } var choice int fmt.Fscan(bufio.NewReader(os.Stdin), &choice) if choice > len(pkgs) || choice < 0 { fmt.Println("invalid option") return } QueryInstall(pkgs[choice].Realname) return } case "serve": if len(os.Args) < 3 { fmt.Println("usage: packets serve