package internet import ( "fmt" "os" "os/exec" "strings" "gitea.unprism.ru/KRBL/sim-modem/api/modem/utils" ) func (c *conn) setup() error { c.logger.Println("Check requirenments...") if err := c.checkReqs(); err != nil { return fmt.Errorf("check requirenments: %w", err) } // DEBUG show networks and signal resp, err := c.port.Send("AT+COPS?") if err != nil { return fmt.Errorf("AT+COPS? request: %w", err) } c.logger.Println("DEBUG networks:", resp) resp, err = c.port.Send("AT+CSQ") if err != nil { return fmt.Errorf("AT+CSQ request: %w", err) } c.logger.Println("DEBUG signal quality:", resp) // Configure ppp // what is better ASK If /etc/ppp/peers/annalistnet not exists c.logger.Println("Configure ppp...") if err := c.configurePPP(); err != nil { return fmt.Errorf("configure ppp: %w", err) } return nil } // Check requirenments func (c *conn) checkReqs() error { // Check AT port for sure if c.port == nil || !c.port.IsConnected() { return fmt.Errorf("AT port is not connect or nil") } // Ensure all necessary packages installed if err := c.ensurePackage("ppp"); err != nil { return fmt.Errorf("ensure ppp package: %w", err) } // if err := c.ensurePackage("net-tools"); err != nil { // return fmt.Errorf("ensure net-tools package: %w", err) // } // Check SIM is valid if err := utils.CheckPIN(c.port, c.logger); err != nil { return fmt.Errorf("PIN check: %w", err) } return nil } func (c *conn) ensurePackage(pname string) error { if c.checkPackageExist(pname) { return nil } return fmt.Errorf("package %s not installed", pname) // c.logger.Println("Installing", pname, "package...") // resp, err := exec.Command("apt-get", "install", pname).Output() // if err != nil { // return fmt.Errorf("execute install cmd: %w", err) // } // c.logger.Println(resp) // c.logger.Println("\x1b[38;2;255;0;0mComplete\x1b[38;2;255;255;255m") // return nil } func (c *conn) checkPackageExist(pname string) bool { resp, err := exec.Command("apt-mark", "showmanual", pname).Output() c.logger.Println("CHECK:", resp) if err != nil { c.logger.Println("CHECK PACKAGE ERROR: ", err.Error()) return false } return string(resp[:len(pname)]) == pname } func (c *conn) configurePPP() error { // Get provider name and its APN resp, err := c.port.Send("AT+CSPN?") if err != nil { return fmt.Errorf("AT+CSPN? request: %w", err) } if !resp.Check() { return fmt.Errorf("get provider: error response: %s", resp) } strs := strings.Split(string(resp), "\"") if len(strs) < 3 { return fmt.Errorf("parse AT+CSPN response: %s", string(resp)) } provider := strs[1] apn := apns[provider] if apn == "" { return fmt.Errorf("no apn for provider: %s", provider) } // Make config c.logger.Printf("Config values: %s, %s, %d", apn, c.port.GetName(), c.port.GetBaudrate()) config := fmt.Sprintf(pppConfig, apn, c.port.GetName(), c.port.GetBaudrate()) // Write to file f, err := os.OpenFile("/etc/ppp/peers/"+pppConfigName, os.O_CREATE|os.O_WRONLY, 0666) if err != nil { return fmt.Errorf("open ppp config file %w", err) } defer f.Close() if _, err := f.Write([]byte(config)); err != nil { return fmt.Errorf("write to ppp config file: %w", err) } return nil }