Feat: export lists in plaintext format
This commit is contained in:
parent
acf42e81bc
commit
670629a255
57
main.go
57
main.go
@ -18,6 +18,7 @@ import (
|
|||||||
|
|
||||||
var (
|
var (
|
||||||
dataPath = flag.String("datapath", "", "Path to your custom 'data' directory")
|
dataPath = flag.String("datapath", "", "Path to your custom 'data' directory")
|
||||||
|
exportLists = flag.String("exportlists", "", "Lists to be flattened and exported in plaintext format, separated by ',' comma")
|
||||||
defaultDataPath = filepath.Join("src", "github.com", "v2fly", "domain-list-community", "data")
|
defaultDataPath = filepath.Join("src", "github.com", "v2fly", "domain-list-community", "data")
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -38,6 +39,25 @@ type ParsedList struct {
|
|||||||
Entry []Entry
|
Entry []Entry
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (l *ParsedList) toPlainText(listName string) error {
|
||||||
|
var entryBytes []byte
|
||||||
|
for _, entry := range l.Entry {
|
||||||
|
var attrString string
|
||||||
|
if entry.Attrs != nil {
|
||||||
|
for _, attr := range entry.Attrs {
|
||||||
|
attrString += "@" + attr.GetKey() + ","
|
||||||
|
}
|
||||||
|
attrString = strings.TrimRight(attrString, ",")
|
||||||
|
}
|
||||||
|
// Entry output format is: type:domain.tld:@attr1,@attr2
|
||||||
|
entryBytes = append(entryBytes, []byte(entry.Type+":"+entry.Value+":"+attrString+"\n")...)
|
||||||
|
}
|
||||||
|
if err := ioutil.WriteFile(listName+".txt", entryBytes, 0644); err != nil {
|
||||||
|
return fmt.Errorf(err.Error())
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func (l *ParsedList) toProto() (*router.GeoSite, error) {
|
func (l *ParsedList) toProto() (*router.GeoSite, error) {
|
||||||
site := &router.GeoSite{
|
site := &router.GeoSite{
|
||||||
CountryCode: l.Name,
|
CountryCode: l.Name,
|
||||||
@ -75,6 +95,18 @@ func (l *ParsedList) toProto() (*router.GeoSite, error) {
|
|||||||
return site, nil
|
return site, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func exportPlainTextList(list []string, refName string, pl *ParsedList) {
|
||||||
|
for _, listName := range list {
|
||||||
|
if strings.ToUpper(refName) == strings.ToUpper(listName) {
|
||||||
|
if err := pl.toPlainText(strings.ToLower(refName)); err != nil {
|
||||||
|
fmt.Println("Failed: ", err)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
fmt.Printf("'%s' has been generated successfully in current directory.\n", listName)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func removeComment(line string) string {
|
func removeComment(line string) string {
|
||||||
idx := strings.Index(line, "#")
|
idx := strings.Index(line, "#")
|
||||||
if idx == -1 {
|
if idx == -1 {
|
||||||
@ -106,6 +138,7 @@ func parseAttribute(attr string) (*router.Domain_Attribute, error) {
|
|||||||
return &attribute, errors.New("invalid attribute: " + attr)
|
return &attribute, errors.New("invalid attribute: " + attr)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Trim attribute prefix `@` character
|
||||||
attr = attr[1:]
|
attr = attr[1:]
|
||||||
parts := strings.Split(attr, "=")
|
parts := strings.Split(attr, "=")
|
||||||
if len(parts) == 1 {
|
if len(parts) == 1 {
|
||||||
@ -307,7 +340,8 @@ func main() {
|
|||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
protoList := new(router.GeoSiteList)
|
protoList := new(router.GeoSiteList)
|
||||||
for _, list := range ref {
|
var existList []string
|
||||||
|
for refName, list := range ref {
|
||||||
pl, err := ParseList(list, ref)
|
pl, err := ParseList(list, ref)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Println("Failed: ", err)
|
fmt.Println("Failed: ", err)
|
||||||
@ -319,6 +353,27 @@ func main() {
|
|||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
protoList.Entry = append(protoList.Entry, site)
|
protoList.Entry = append(protoList.Entry, site)
|
||||||
|
|
||||||
|
// Flatten and export plaintext list
|
||||||
|
if *exportLists != "" {
|
||||||
|
if existList != nil {
|
||||||
|
exportPlainTextList(existList, refName, pl)
|
||||||
|
} else {
|
||||||
|
exportedListSlice := strings.Split(*exportLists, ",")
|
||||||
|
for _, exportedListName := range exportedListSlice {
|
||||||
|
fileName := filepath.Join(dir, exportedListName)
|
||||||
|
_, err := os.Stat(fileName)
|
||||||
|
if err == nil || os.IsExist(err) {
|
||||||
|
existList = append(existList, exportedListName)
|
||||||
|
} else {
|
||||||
|
fmt.Printf("'%s' list does not exist in '%s' directory.\n", exportedListName, dir)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if existList != nil {
|
||||||
|
exportPlainTextList(existList, refName, pl)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protoBytes, err := proto.Marshal(protoList)
|
protoBytes, err := proto.Marshal(protoList)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user