From f34308367e5ebbae176a5a6815703d07855201ee Mon Sep 17 00:00:00 2001 From: roboogg133 Date: Sun, 21 Sep 2025 10:34:49 -0300 Subject: [PATCH] Implement UDP socket server and add package installation check utility --- cmd/httpsocket/main.go | 36 +++++++++++++++++++++++++ cmd/packets/main.go | 35 ++++++++++++++++++++++--- cmd/udpsocket/main.go | 58 +++++++++++++++++++++++++++++++++++++++++ internal/utils/utils.go | 16 ++++++++++++ 4 files changed, 141 insertions(+), 4 deletions(-) create mode 100644 cmd/httpsocket/main.go create mode 100644 cmd/udpsocket/main.go diff --git a/cmd/httpsocket/main.go b/cmd/httpsocket/main.go new file mode 100644 index 0000000..b4db14e --- /dev/null +++ b/cmd/httpsocket/main.go @@ -0,0 +1,36 @@ +package main + +import ( + "fmt" + "log" + "net/http" + "os" + "packets/configs" + "packets/internal/consts" + "path/filepath" +) + +type ConfigTOML struct { + Config struct { + DefaultHttpPort int `toml:"httpPort"` + DefaultCacheDir string `toml:"cacheDir"` + } `toml:"Config"` +} + +func main() { + + cfg, err := configs.GetConfigTOML() + if err != nil { + log.Fatal(err) + } + + pid := os.Getpid() + if err := os.WriteFile(filepath.Join(consts.DefaultLinux_d, "http.pid"), []byte(fmt.Sprint(pid)), 0664); err != nil { + fmt.Println("error saving subprocess pid", err) + } + + fs := http.FileServer(http.Dir(cfg.Config.Cache_d)) + http.Handle("/", fs) + + log.Fatal(http.ListenAndServe(fmt.Sprintf(":%d", cfg.Config.HttpPort), nil)) +} diff --git a/cmd/packets/main.go b/cmd/packets/main.go index 59c33bd..1b9bf76 100644 --- a/cmd/packets/main.go +++ b/cmd/packets/main.go @@ -30,7 +30,7 @@ func init() { _, err := os.Stat(consts.DefaultLinux_d) if os.IsNotExist(err) { - err := os.Mkdir(consts.DefaultLinux_d, 0755) + err := os.Mkdir(consts.DefaultLinux_d, 0777) if err != nil { if os.IsPermission(err) { log.Fatal("can't create packets root directory, please run as root") @@ -184,6 +184,14 @@ var installCmd = &cobra.Command{ } } if exist { + installed, err := utils.CheckIfPackageInstalled(inputName) + if err != nil { + log.Fatal(err) + } + if installed { + fmt.Printf(":: Package %s is already installed\n", inputName) + continue + } fmt.Printf(":: Downloading (%s) \n", inputName) p, err := packets.GetPackage(inputName) if err != nil { @@ -236,13 +244,23 @@ var installCmd = &cobra.Command{ } switch len(pkgs) { case 0: - log.Fatalf("can't find any results for %s\n", inputName) + 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 { + fmt.Printf(":: Package %s is already installed\n", pkgs[0].Name) + continue + } + fmt.Printf(":: Downloading %s \n", pkgs[0].Name) - p, err := packets.GetPackage(inputName) + p, err := packets.GetPackage(pkgs[0].Name) if err != nil { log.Fatal(err) } @@ -253,7 +271,7 @@ var installCmd = &cobra.Command{ } reader := bytes.NewReader(p.PackageF) - fmt.Printf(":: Installing (%s) \n", pkgs[0].Name) + fmt.Printf(":: Installing %s \n", pkgs[0].Name) packets.InstallPackage(reader) if cfg.Config.StorePackages { @@ -288,6 +306,15 @@ var installCmd = &cobra.Command{ goto optionagain } + installed, err := utils.CheckIfPackageInstalled(pkgs[choice].Name) + if err != nil { + log.Fatal(err) + } + if installed { + fmt.Printf(":: Package %s is already installed\n", pkgs[choice].Name) + continue + } + fmt.Printf(":: Downloading %s \n", pkgs[choice].Name) p, err := packets.GetPackage(pkgs[choice].Name) if err != nil { diff --git a/cmd/udpsocket/main.go b/cmd/udpsocket/main.go new file mode 100644 index 0000000..328bd68 --- /dev/null +++ b/cmd/udpsocket/main.go @@ -0,0 +1,58 @@ +package main + +import ( + "fmt" + "log" + "net" + "os" + "packets/configs" + "packets/internal/consts" + "path/filepath" + "strings" +) + +func CheckDownloaded(filename string) bool { + + cfg, err := configs.GetConfigTOML() + if err != nil { + log.Fatal(err) + } + + _, err = os.Stat(filepath.Join(cfg.Config.Cache_d, filename)) + return err == nil +} + +func main() { + pid := os.Getpid() + if err := os.WriteFile(filepath.Join(consts.DefaultLinux_d, "udp.pid"), []byte(fmt.Sprint(pid)), 0664); err != nil { + fmt.Println("error saving subprocess pid", err) + } + cfg, err := configs.GetConfigTOML() + if err != nil { + log.Fatal(err) + } + + addr := net.UDPAddr{IP: net.IPv4zero, Port: 1333} + conn, err := net.ListenUDP("udp", &addr) + if err != nil { + log.Fatal(err) + } + defer conn.Close() + buf := make([]byte, 1500) + + for { + n, remote, err := conn.ReadFromUDP(buf) + if err != nil { + log.Println("error creating udp socket", err) + } + msg := string(buf[:n]) + if !strings.HasPrefix(msg, "Q:") { + continue + } + filename := strings.TrimPrefix(msg, "Q:") + if CheckDownloaded(filename) { + reply := fmt.Sprintf("H:%s:%d", filename, cfg.Config.HttpPort) + conn.WriteToUDP([]byte(reply), remote) + } + } +} diff --git a/internal/utils/utils.go b/internal/utils/utils.go index da28e97..236f04d 100644 --- a/internal/utils/utils.go +++ b/internal/utils/utils.go @@ -239,3 +239,19 @@ func (p *Package) AddToInstalledDB(inCache int, packagePath string) error { success = true return err } + +func CheckIfPackageInstalled(name string) (bool, error) { + db, err := sql.Open("sqlite", consts.InstalledDB) + if err != nil { + return false, err + } + defer db.Close() + + var exists bool + err = db.QueryRow("SELECT EXISTS(SELECT 1 FROM packages WHERE name = ?)", name).Scan(&exists) + if err != nil { + return false, err + } + + return exists, nil +}