Added service checks. Some refactoring.
This commit is contained in:
@ -4,11 +4,11 @@ import (
|
||||
"fmt"
|
||||
"io"
|
||||
"log"
|
||||
"os"
|
||||
"os/exec"
|
||||
"strings"
|
||||
|
||||
"gitea.unprism.ru/KRBL/sim-modem/api/modem/at"
|
||||
"gitea.unprism.ru/KRBL/sim-modem/api/modem/utils"
|
||||
)
|
||||
|
||||
var apns = map[string]string{
|
||||
@ -44,7 +44,8 @@ type conn struct {
|
||||
|
||||
type Conn interface {
|
||||
Init() error
|
||||
ConfigurePPP() error
|
||||
Connect() error
|
||||
Disconnect() error
|
||||
Ping() bool // Is connected
|
||||
io.Closer
|
||||
}
|
||||
@ -56,121 +57,14 @@ func New(logger *log.Logger, port at.Port) Conn {
|
||||
}
|
||||
}
|
||||
|
||||
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) 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
|
||||
}
|
||||
|
||||
// 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")
|
||||
func (c *conn) Connect() error {
|
||||
if ok, err := utils.CheckService(c.port, c.logger); err != nil || !ok {
|
||||
if err != nil {
|
||||
return fmt.Errorf("check service: %w", err)
|
||||
}
|
||||
return fmt.Errorf("no service")
|
||||
}
|
||||
|
||||
// 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
|
||||
// AT+CPIN? and just check
|
||||
resp, err := c.port.Send("AT+CPIN?")
|
||||
if err != nil {
|
||||
return fmt.Errorf("AT+CPIN? request: %w", err)
|
||||
}
|
||||
if !resp.Check() {
|
||||
return fmt.Errorf("validate SIM: error response: %s", resp)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
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
|
||||
}
|
||||
|
||||
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
|
||||
}
|
||||
|
||||
func (c *conn) connect() error {
|
||||
resp, err := exec.Command("pon", pppConfigName).Output()
|
||||
if err != nil {
|
||||
return fmt.Errorf("execute connect cmd: %w", err)
|
||||
@ -179,7 +73,7 @@ func (c *conn) connect() error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (c *conn) diconnect() error {
|
||||
func (c *conn) Disconnect() error {
|
||||
resp, err := exec.Command("poff", pppConfigName).Output()
|
||||
if err != nil {
|
||||
return fmt.Errorf("execute disconnect cmd: %w", err)
|
||||
@ -190,28 +84,27 @@ func (c *conn) diconnect() error {
|
||||
|
||||
func (c *conn) Init() error {
|
||||
// Setup
|
||||
c.logger.Println("Setup...")
|
||||
if err := c.setup(); err != nil {
|
||||
return fmt.Errorf("setup: %w", err)
|
||||
}
|
||||
// Connect
|
||||
c.logger.Println("Connect...")
|
||||
if err := c.connect(); err != nil {
|
||||
return fmt.Errorf("connect: %w", err)
|
||||
}
|
||||
// // Connect
|
||||
// c.logger.Println("Connect...")
|
||||
// if err := c.Connect(); err != nil {
|
||||
// return fmt.Errorf("connect: %w", err)
|
||||
// }
|
||||
|
||||
//DEBUG
|
||||
resp, err := exec.Command("ifconfig").Output()
|
||||
if err != nil {
|
||||
return fmt.Errorf("execute ifconfig cmd: %w", err)
|
||||
}
|
||||
c.logger.Println("DEBUG ifconfig resp:", string(resp))
|
||||
// //DEBUG
|
||||
// resp, err := exec.Command("ifconfig").Output()
|
||||
// if err != nil {
|
||||
// return fmt.Errorf("execute ifconfig cmd: %w", err)
|
||||
// }
|
||||
// c.logger.Println("DEBUG ifconfig resp:", string(resp))
|
||||
|
||||
// Test connectin using Ping
|
||||
c.logger.Println("Test...")
|
||||
if !c.Ping() {
|
||||
return fmt.Errorf("ping failed")
|
||||
}
|
||||
// // Test connectin using Ping
|
||||
// c.logger.Println("Test...")
|
||||
// if !c.Ping() {
|
||||
// return fmt.Errorf("ping failed")
|
||||
// }
|
||||
return nil
|
||||
}
|
||||
|
||||
@ -234,7 +127,7 @@ func (c *conn) Ping() bool {
|
||||
}
|
||||
|
||||
func (c *conn) Close() error {
|
||||
if err := c.diconnect(); err != nil {
|
||||
if err := c.Disconnect(); err != nil {
|
||||
return fmt.Errorf("diconnect: %w", err)
|
||||
}
|
||||
return nil
|
||||
|
119
api/modem/internet/setup.go
Normal file
119
api/modem/internet/setup.go
Normal file
@ -0,0 +1,119 @@
|
||||
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
|
||||
}
|
Reference in New Issue
Block a user