Files
umbrix-libcore/config/parser.go

85 lines
1.9 KiB
Go
Raw Normal View History

2024-01-15 17:17:05 +03:30
package config
2023-08-19 14:08:39 +03:30
import (
2023-08-20 23:50:13 +03:30
_ "embed"
2023-08-19 14:08:39 +03:30
"fmt"
"os"
2024-01-16 17:16:13 +00:00
"encoding/json"
2023-08-19 14:08:39 +03:30
2023-09-09 20:05:05 +00:00
"github.com/hiddify/ray2sing/ray2sing"
2023-08-19 14:08:39 +03:30
"github.com/sagernet/sing-box/experimental/libbox"
"github.com/xmdhs/clash2singbox/convert"
"github.com/xmdhs/clash2singbox/model/clash"
"gopkg.in/yaml.v3"
)
2023-08-20 23:50:13 +03:30
//go:embed config.json.template
var configByte []byte
2023-10-12 00:16:55 +03:30
var configParsers = []func([]byte, bool) ([]byte, error){
parseSingboxConfig,
parseV2rayConfig,
parseClashConfig,
}
2024-01-15 17:59:45 +03:30
func ParseConfig(path string, debug bool) ([]byte, error) {
content, err := os.ReadFile(path)
2023-08-19 14:08:39 +03:30
if err != nil {
2024-01-15 17:59:45 +03:30
return nil, err
2023-08-19 14:08:39 +03:30
}
2023-09-09 20:05:05 +00:00
2023-10-12 00:16:55 +03:30
var parseError error
for index, parser := range configParsers {
config, err := parser(content, debug)
if err == nil {
fmt.Printf("[ConfigParser] success with parser #%d, checking...\n", index)
err = libbox.CheckConfig(string(config))
2024-01-15 17:59:45 +03:30
return config, err
2023-10-12 00:16:55 +03:30
}
parseError = err
2023-08-19 14:08:39 +03:30
}
2024-01-15 17:59:45 +03:30
return nil, parseError
2023-08-19 14:08:39 +03:30
}
2023-09-22 23:25:38 +03:30
2023-10-12 00:16:55 +03:30
func parseV2rayConfig(content []byte, debug bool) ([]byte, error) {
config, err := ray2sing.Ray2Singbox(string(content))
2023-09-09 14:06:54 +00:00
if err != nil {
2023-10-12 00:16:55 +03:30
fmt.Printf("[V2rayParser] error: %s\n", err)
2023-09-09 14:06:54 +00:00
return nil, err
}
2023-10-12 00:16:55 +03:30
return []byte(config), nil
2023-09-09 14:06:54 +00:00
}
2023-09-22 23:25:38 +03:30
2023-10-12 00:16:55 +03:30
func parseClashConfig(content []byte, debug bool) ([]byte, error) {
2023-08-19 14:08:39 +03:30
clashConfig := clash.Clash{}
err := yaml.Unmarshal(content, &clashConfig)
if err != nil {
2023-10-12 00:16:55 +03:30
fmt.Printf("[ClashParser] unmarshal error: %s\n", err)
2023-08-19 14:08:39 +03:30
return nil, err
}
2023-10-12 00:16:55 +03:30
2023-08-19 14:08:39 +03:30
sbConfig, err := convert.Clash2sing(clashConfig)
if err != nil {
2023-10-12 00:16:55 +03:30
fmt.Printf("[ClashParser] convert error: %s\n", err)
2023-08-19 14:08:39 +03:30
return nil, err
}
2023-08-20 23:50:13 +03:30
output := configByte
2023-08-19 14:08:39 +03:30
output, err = convert.Patch(output, sbConfig, "", "", nil)
if err != nil {
2023-10-12 00:16:55 +03:30
fmt.Printf("[ClashParser] patch error: %s\n", err)
2023-08-19 14:08:39 +03:30
return nil, err
}
return output, nil
}
2023-10-12 00:16:55 +03:30
func parseSingboxConfig(content []byte, debug bool) ([]byte, error) {
2024-01-16 17:16:13 +00:00
var dummy interface{}
err := json.Unmarshal(content, &dummy)
if err != nil{
2023-10-12 00:16:55 +03:30
return nil, err
}
return content, nil
}