Skip to content
This repository has been archived by the owner on Apr 1, 2024. It is now read-only.

Commit

Permalink
Refactoring
Browse files Browse the repository at this point in the history
  • Loading branch information
xiaozhuai committed Nov 23, 2021
1 parent 29eabb9 commit b7b58b3
Show file tree
Hide file tree
Showing 3 changed files with 115 additions and 47 deletions.
37 changes: 34 additions & 3 deletions exp/ALCL_E_14OW_P.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,40 +2,71 @@ package exp

import (
"bytes"
"encoding/xml"
"errors"
"fmt"
"golang.org/x/image/tiff/lzw"
"io/ioutil"
"net/http"
"regexp"
)

type modemConfig struct {
LoginCfgAdminUserName string `xml:"InternetGatewayDevice>X_BROADCOM_COM_LoginCfg>AdminUserName"`
TeleComAccountPassword string `xml:"InternetGatewayDevice>DeviceInfo>X_CT-COM_TeleComAccount>Password"`
}

func parseModemConfig(data []byte) (*Result, error) {
var modemConfig modemConfig

// TRICKY: modem has invalid xml tag starts with number, replace it to valid one
re := regexp.MustCompile("<(/?)([0-9]+)")
s := re.ReplaceAllString(string(data), "<${1}fxxk${2}")

err := xml.Unmarshal([]byte(s), &modemConfig)
if err != nil {
return nil, err
}
return &Result{
Username: modemConfig.LoginCfgAdminUserName,
Password: modemConfig.TeleComAccountPassword,
Config: data,
}, nil
}

func ALCL_E_140W_P() *Exp {
return &Exp{
Name: "ALCL E-140W-P downloadFile?file=/var/config/psi",
Handle: func(host string) (*Result, error) {
response, err := http.Get(fmt.Sprintf("http://%s/downloadFile?file=/var/config/psi", host))
Handle: func(context Context) (*Result, error) {
context.Log("下载配置文件 /var/config/psi")
response, err := http.Get(fmt.Sprintf("http://%s/downloadFile?file=/var/config/psi", context.GetHost()))
if err != nil {
return nil, err
}
if response.StatusCode != 200 {
return nil, errors.New("error send http request")
return nil, errors.New(fmt.Sprintf("请求失败, 状态码: %d", response.StatusCode))
}

encryptData, err := ioutil.ReadAll(response.Body)
if err != nil {
return nil, err
}

if len(encryptData) < 0x3C {
return nil, errors.New("配置文件不合法")
}
// ignore leading 0x3C bytes
encryptData = encryptData[0x3C:]

context.Log("解码配置文件")
// lzw decompress
reader := lzw.NewReader(bytes.NewReader(encryptData), lzw.MSB, 8)
data, err := ioutil.ReadAll(reader)
if err != nil {
return nil, err
}

context.Log("解析超级管理员账号和密码")
result, err := parseModemConfig(data)
if err != nil {
return nil, err
Expand Down
80 changes: 54 additions & 26 deletions exp/Exp.go
Original file line number Diff line number Diff line change
@@ -1,41 +1,69 @@
package exp

import (
"encoding/xml"
"regexp"
)
import "fmt"

type Result struct {
type Context interface {
GetHost() string
GetUsername() string
GetPassword() string
Log(line string)
}

type ContextImpl struct {
Host string
Username string
Password string
Config []byte
}

type Exp struct {
Name string
Handle func(host string) (*Result, error)
func NewContext(host string, username string, password string) Context {
return &ContextImpl{
Host: host,
Username: username,
Password: password,
}
}

func (_this *ContextImpl) GetHost() string {
if _this.Host == "" {
fmt.Printf(" - 请输入光猫地址 (默认: 192.168.1.1) : ")
_, _ = fmt.Scanln(&_this.Host)
if _this.Host == "" {
_this.Host = "192.168.1.1"
}
}
return _this.Host
}

func (_this *ContextImpl) GetUsername() string {
if _this.Username == "" {
fmt.Printf(" - 请输入普通管理员账号 (默认: useradmin) : ")
_, _ = fmt.Scanln(&_this.Username)
if _this.Username == "" {
_this.Username = "useradmin"
}
}
return _this.Username
}

type ModemConfig struct {
LoginCfgAdminUserName string `xml:"InternetGatewayDevice>X_BROADCOM_COM_LoginCfg>AdminUserName"`
TeleComAccountPassword string `xml:"InternetGatewayDevice>DeviceInfo>X_CT-COM_TeleComAccount>Password"`
func (_this *ContextImpl) GetPassword() string {
if _this.Password == "" {
fmt.Printf(" - 请输入普通管理员密码 : ")
_, _ = fmt.Scanln(&_this.Password)
}
return _this.Password
}

func parseModemConfig(data []byte) (*Result, error) {
var modemConfig ModemConfig
func (_this *ContextImpl) Log(line string) {
fmt.Printf(" - %s\n", line)
}

// TRICKY: modem has invalid xml tag starts with number, replace it to valid one
re := regexp.MustCompile("<(/?)([0-9]+)")
s := re.ReplaceAllString(string(data), "<${1}fxxk${2}")
type Result struct {
Username string
Password string
Config []byte
}

err := xml.Unmarshal([]byte(s), &modemConfig)
if err != nil {
return nil, err
}
return &Result{
Username: modemConfig.LoginCfgAdminUserName,
Password: modemConfig.TeleComAccountPassword,
Config: data,
}, nil
type Exp struct {
Name string
Handle func(context Context) (*Result, error)
}
45 changes: 27 additions & 18 deletions main.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,21 @@ import (
"time"
)

var (
host string
)

func main() {
flag.StringVar(&host, "host", "192.168.1.1", "set modem host")
var (
host string
username string
password string
autoContinue bool
)
flag.StringVar(&host, "host", "192.168.1.1", "光猫地址")
flag.StringVar(&username, "username", "", "普通管理员账号")
flag.StringVar(&password, "password", "", "普通管理员密码")
flag.BoolVar(&autoContinue, "auto-continue", false, "完成后自动退出进程")
flag.Parse()
fmt.Printf("- Modem host: %s\n", host)
context := exp.NewContext(host, username, password)

fmt.Printf("- 光猫地址: %s\n", context.GetHost())
suc := false
var result *exp.Result = nil
var err error = nil
Expand All @@ -25,35 +32,37 @@ func main() {
// TODO Add more exp...
}
for _, e := range allExp {
fmt.Printf(" - [%s] Trying...\n", e.Name)
result, err = e.Handle(host)
fmt.Printf(" - [%s] 正在尝试...\n", e.Name)
result, err = e.Handle(context)
if err != nil {
fmt.Printf(" - [%s] Failed! %v\n", e.Name, err)
fmt.Printf(" - [%s] 失败! %v\n", e.Name, err)
} else {
fmt.Printf(" - [%s] Succeed!\n", e.Name)
fmt.Printf(" - [%s] 成功!\n", e.Name)
suc = true
break
}
}
if suc {
fmt.Printf("- Done!\n")
fmt.Printf(" - Username: %s\n", result.Username)
fmt.Printf(" - Password: %s\n", result.Password)
fmt.Printf("- 完成!\n")
fmt.Printf(" - 超级管理员账号: %s\n", result.Username)
fmt.Printf(" - 超级管理员密码: %s\n", result.Password)
now := time.Now()
year, mon, day := now.Date()
hour, min, sec := now.Clock()
zone, _ := now.Zone()
configFile := fmt.Sprintf("modem_%04d%02d%02d%02d%02d%02d%s.xml", year, mon, day, hour, min, sec, zone)
err = os.WriteFile(configFile, result.Config, 0644)
if err != nil {
fmt.Printf(" - Error write modem config file\n")
fmt.Printf(" - 写入光猫配置失败! %v\n", err)
} else {
fmt.Printf(" - Modem Config: %s\n", configFile)
fmt.Printf(" - 光猫配置文件: %s\n", configFile)
}
} else {
fmt.Printf("- Failed, no suitable exp found\n")
fmt.Printf("- 失败, 没有找到适用于你的光猫设备的方案\n")
}

fmt.Printf("- Press Enter to continue...\n")
_, _ = fmt.Scanln()
if !autoContinue {
fmt.Printf("- 按回车键退出...\n")
_, _ = fmt.Scanln()
}
}

0 comments on commit b7b58b3

Please sign in to comment.