From 1890cd11ef57f071b2aa019652e873976b757152 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dalibor=20Markovi=C4=87?= Date: Sun, 31 May 2026 16:30:17 +0200 Subject: [PATCH] Izmene --- cmd/ntech/.main.go.kate-swp | Bin 0 -> 50 bytes cmd/ntech/main.go | 32 +++- go.mod | 1 + go.sum | 2 + internal/config/.firstrun.go.kate-swp | Bin 0 -> 50 bytes internal/config/.setup.go.kate-swp | Bin 0 -> 50 bytes internal/config/firstrun.go | 62 ++++++++ internal/config/setup.go | 81 ++++++++++ web/templates/setup/index.html | 220 ++++++++++++++++++++++++++ 9 files changed, 396 insertions(+), 2 deletions(-) create mode 100644 cmd/ntech/.main.go.kate-swp create mode 100644 internal/config/.firstrun.go.kate-swp create mode 100644 internal/config/.setup.go.kate-swp create mode 100644 internal/config/firstrun.go create mode 100644 internal/config/setup.go create mode 100644 web/templates/setup/index.html diff --git a/cmd/ntech/.main.go.kate-swp b/cmd/ntech/.main.go.kate-swp new file mode 100644 index 0000000000000000000000000000000000000000..59d0856cd839ec7f6810e9a9eb6dbec304ccf6d8 GIT binary patch literal 50 zcmZQzU=Z?7EJ;-eE>A2_aLdd|RWQ;sU|?VnVc0G2siSnBTQbebZl~xGd&93*qQS1g Ft^ha$4R-(l literal 0 HcmV?d00001 diff --git a/cmd/ntech/main.go b/cmd/ntech/main.go index 04bc89e..00bb1f4 100644 --- a/cmd/ntech/main.go +++ b/cmd/ntech/main.go @@ -1,7 +1,35 @@ package main -import "fmt" +import ( + "fmt" + "log" + "net/http" + "os" + + "github.com/go-chi/chi/v5" + "ntech/internal/config" +) func main() { - fmt.Println("NTech pokrenut") + if config.JelPrvoPokretanje() { + config.PokreniSetup() + return + } + + // normalno pokretanje + port := os.Getenv("NTECH_PORT") + if port == "" { + port = "8080" + } + + r := chi.NewRouter() + r.Get("/", func(w http.ResponseWriter, r *http.Request) { + fmt.Fprintln(w, "Zdravo iz NTech-a") + }) + + log.Printf("NTech pokrenut na portu %s", port) + err := http.ListenAndServe(":"+port, r) + if err != nil { + log.Fatalf("Greška: port %s je zauzet ili nije dostupan", port) + } } diff --git a/go.mod b/go.mod index 62326c3..32f8632 100644 --- a/go.mod +++ b/go.mod @@ -9,6 +9,7 @@ require ( github.com/mattn/go-isatty v0.0.20 // indirect github.com/ncruces/go-strftime v1.0.0 // indirect github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect + github.com/webview/webview_go v0.0.0-20240831120633-6173450d4dd6 // indirect golang.org/x/sys v0.42.0 // indirect modernc.org/libc v1.72.3 // indirect modernc.org/mathutil v1.7.1 // indirect diff --git a/go.sum b/go.sum index c666558..67b8867 100644 --- a/go.sum +++ b/go.sum @@ -10,6 +10,8 @@ github.com/ncruces/go-strftime v1.0.0 h1:HMFp8mLCTPp341M/ZnA4qaf7ZlsbTc+miZjCLOF github.com/ncruces/go-strftime v1.0.0/go.mod h1:Fwc5htZGVVkseilnfgOVb9mKy6w1naJmn9CehxcKcls= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= +github.com/webview/webview_go v0.0.0-20240831120633-6173450d4dd6 h1:VQpB2SpK88C6B5lPHTuSZKb2Qee1QWwiFlC5CKY4AW0= +github.com/webview/webview_go v0.0.0-20240831120633-6173450d4dd6/go.mod h1:yE65LFCeWf4kyWD5re+h4XNvOHJEXOCOuJZ4v8l5sgk= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.42.0 h1:omrd2nAlyT5ESRdCLYdm3+fMfNFE/+Rf4bDIQImRJeo= golang.org/x/sys v0.42.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= diff --git a/internal/config/.firstrun.go.kate-swp b/internal/config/.firstrun.go.kate-swp new file mode 100644 index 0000000000000000000000000000000000000000..9ee76e5c9f4e2ef471fffc3bb8eca533cab748b5 GIT binary patch literal 50 zcmZQzU=Z?7EJ;-eE>A2_aLdd|RWQ;sU|?VnVTyI~mzvYe=3d^o_j1nX!+~A9YlB^b FT>(*#5E=jg literal 0 HcmV?d00001 diff --git a/internal/config/.setup.go.kate-swp b/internal/config/.setup.go.kate-swp new file mode 100644 index 0000000000000000000000000000000000000000..40668f5d0d43ddd0a8d8ba11566b6bc8771bec45 GIT binary patch literal 50 zcmZQzU=Z?7EJ;-eE>A2_aLdd|RWQ;sU|?Vn;W9FM&n+H$s#~^DZil?IDbH=0reN1# FR{%L<4QK!W literal 0 HcmV?d00001 diff --git a/internal/config/firstrun.go b/internal/config/firstrun.go new file mode 100644 index 0000000..025d424 --- /dev/null +++ b/internal/config/firstrun.go @@ -0,0 +1,62 @@ +package config + +import ( + "fmt" + "net" + "os" +) + +// lista portova koje proveravamo pri prvom pokretanju +var kandidatPortovi = []int{8080, 3000, 8000, 9090} + +// proverava da li je port slobodan +func JelPortSlobodan(port int) bool { + adresa := fmt.Sprintf(":%d", port) + listener, err := net.Listen("tcp", adresa) + if err != nil { + return false + } + listener.Close() + return true +} + +// vraća prvi slobodan port sa liste kandidata +func NadjiSlobodanPort() int { + for _, port := range kandidatPortovi { + if JelPortSlobodan(port) { + return port + } + } + // ako ni jedan nije slobodan, vraćamo 0 + return 0 +} + +// proverava da li je ovo prvo pokretanje programa +func JelPrvoPokretanje() bool { + _, err := os.Stat(".env") + return os.IsNotExist(err) +} + +// PortStatus čuva informaciju o jednom portu +type PortStatus struct { + Port int `json:"port"` + Slobodan bool `json:"slobodan"` +} + +// StatusPortova vraća listu svih kandidat portova sa statusom +func StatusPortova() []PortStatus { + rezultat := make([]PortStatus, len(kandidatPortovi)) + for i, port := range kandidatPortovi { + rezultat[i] = PortStatus{ + Port: port, + Slobodan: JelPortSlobodan(port), + } + } + return rezultat +} + +// SacuvajEnv upisuje izabrani port u .env fajl +func SacuvajEnv(port int) error { + sadrzaj := fmt.Sprintf("NTECH_PORT=%d\n", port) + return os.WriteFile(".env", []byte(sadrzaj), 0600) +} diff --git a/internal/config/setup.go b/internal/config/setup.go new file mode 100644 index 0000000..0a3232e --- /dev/null +++ b/internal/config/setup.go @@ -0,0 +1,81 @@ +package config + +import ( + "encoding/json" + "fmt" + "log" + "net/http" + "os" + "strings" + + "github.com/go-chi/chi/v5" + "github.com/webview/webview_go" +) + +// PokreniSetup pokreće WebView prozor za prvo podešavanje +func PokreniSetup() { + port := NadjiSlobodanPort() + if port == 0 { + log.Fatal("Greška: nije pronađen nijedan slobodan port") + } + + adresa := fmt.Sprintf(":%d", port) + r := chi.NewRouter() + + // serviraj setup stranicu + r.Get("/setup", func(w http.ResponseWriter, req *http.Request) { + portovi := StatusPortova() + podaci, err := json.Marshal(portovi) + if err != nil { + http.Error(w, "Greška", http.StatusInternalServerError) + return + } + sadrzaj, err := os.ReadFile("web/templates/setup/index.html") + if err != nil { + http.Error(w, "Greška", http.StatusInternalServerError) + return + } + html := strings.Replace(string(sadrzaj), "PORT_PODACI", string(podaci), 1) + w.Header().Set("Content-Type", "text/html") + fmt.Fprint(w, html) + }) + + // proverava da li je određeni port slobodan + r.Get("/setup/proveriPort", func(w http.ResponseWriter, req *http.Request) { + portStr := req.URL.Query().Get("port") + var port int + fmt.Sscanf(portStr, "%d", &port) + slobodan := JelPortSlobodan(port) + w.Header().Set("Content-Type", "application/json") + json.NewEncoder(w).Encode(map[string]bool{"slobodan": slobodan}) + }) + + // prima izabrani port i upisuje .env + r.Post("/setup/potvrdi", func(w http.ResponseWriter, req *http.Request) { + var telo struct { + Port int `json:"port"` + } + json.NewDecoder(req.Body).Decode(&telo) + err := SacuvajEnv(telo.Port) + if err != nil { + http.Error(w, "Greška pri čuvanju podešavanja", http.StatusInternalServerError) + return + } + w.Header().Set("Content-Type", "application/json") + json.NewEncoder(w).Encode(map[string]bool{"ok": true}) + }) + + // pokreni server u pozadini + go func() { + log.Printf("Setup server pokrenut na portu %d", port) + http.ListenAndServe(adresa, r) + }() + + // otvori WebView prozor + w := webview.New(false) + defer w.Destroy() + w.SetTitle("NTech — Konfiguracija") + w.SetSize(520, 580, 0) + w.Navigate(fmt.Sprintf("http://localhost:%d/setup", port)) + w.Run() +} diff --git a/web/templates/setup/index.html b/web/templates/setup/index.html new file mode 100644 index 0000000..374c1f2 --- /dev/null +++ b/web/templates/setup/index.html @@ -0,0 +1,220 @@ + + + + + NTech — Konfiguracija + + + +
+
+

NTech

+

Početna konfiguracija

+
+ +

Dostupni portovi

+
+ +
+ +

Ili unesite drugi port

+ + + +
+ NTech je konfigurisan! Možete zatvoriti ovaj prozor. +
+
+ + + +