120 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			120 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
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
 | 
						|
}
 |