126 lines
3.4 KiB
Go
126 lines
3.4 KiB
Go
// Copyright 2022 The Ip2Region Authors. All rights reserved.
|
|
// Use of this source code is governed by a Apache2.0-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
package cmd
|
|
|
|
import (
|
|
"fmt"
|
|
"log/slog"
|
|
"os"
|
|
"strconv"
|
|
"time"
|
|
|
|
"github.com/lionsoul2014/ip2region/maker/golang/xdb"
|
|
)
|
|
|
|
// source data process, sort, de-duplicate, merge
|
|
|
|
func Process(sCmd string) {
|
|
var err error
|
|
var srcFile, dstFile, fieldList = "", "", ""
|
|
var help, logLevel = false, ""
|
|
var clearBasedIndex = -1
|
|
var clearValueEqual, clearValueExcept = "", ""
|
|
var fErr = IterateFlags(func(key string, val string) error {
|
|
switch key {
|
|
case "src":
|
|
srcFile = val
|
|
case "dst":
|
|
dstFile = val
|
|
case "field-list":
|
|
fieldList = val
|
|
case "clear-based-index":
|
|
num, err := strconv.Atoi(val)
|
|
if err != nil {
|
|
return fmt.Errorf("invalid clear-based-index '%s=%s', integer expected", key, val)
|
|
}
|
|
|
|
clearBasedIndex = num
|
|
case "clear-value-equal":
|
|
clearValueEqual = val
|
|
case "clear-value-except":
|
|
clearValueExcept = val
|
|
case "help":
|
|
help = GetDefaultOnBool(val)
|
|
case "log-level":
|
|
logLevel = val
|
|
default:
|
|
return fmt.Errorf("undefined option '%s=%s'", key, val)
|
|
}
|
|
return nil
|
|
})
|
|
if fErr != nil {
|
|
fmt.Printf("failed to parse flags: %s", fErr)
|
|
return
|
|
}
|
|
|
|
if srcFile == "" || dstFile == "" || help {
|
|
fmt.Printf("%s %s [command options]\n", os.Args[0], sCmd)
|
|
fmt.Printf("options:\n")
|
|
fmt.Printf(" --src string source ip text file path\n")
|
|
fmt.Printf(" --dst string target ip text file path\n")
|
|
fmt.Printf(" --field-list string field index list imploded with ',' eg: 0,1,2,3-6,7\n")
|
|
fmt.Printf(" --clear-based-index integer clear based index eg: 3\n")
|
|
fmt.Printf(" --clear-value-equal string clear value equal to the specified one\n")
|
|
fmt.Printf(" --clear-value-except string clear value except the specified one\n")
|
|
fmt.Printf(" --log-level string set the log level, options: debug/info/warn/error\n")
|
|
fmt.Printf(" --help bool print this help menu\n")
|
|
return
|
|
}
|
|
|
|
if clearBasedIndex > -1 {
|
|
if len(clearValueEqual) > 0 && len(clearValueExcept) > 0 {
|
|
fmt.Print("Only one can be specified besides clear-value-equal and clear-value-except")
|
|
return
|
|
}
|
|
|
|
if len(clearValueEqual) == 0 && len(clearValueExcept) == 0 {
|
|
fmt.Print("At least one must be specified for clear-value-equal and clear-value-except")
|
|
return
|
|
}
|
|
}
|
|
|
|
// check and apply the log level
|
|
err = ApplyLogLevel(logLevel)
|
|
if err != nil {
|
|
slog.Error("failed to apply log level", "error", err)
|
|
return
|
|
}
|
|
|
|
fields, err := GetFilterFields(fieldList)
|
|
if err != nil {
|
|
slog.Error("failed to get filter fields", "error", err)
|
|
return
|
|
}
|
|
|
|
// make the binary file
|
|
tStart := time.Now()
|
|
processor, err := xdb.NewProcessor(srcFile, dstFile, fields, clearBasedIndex, clearValueEqual, clearValueExcept)
|
|
if err != nil {
|
|
fmt.Printf("failed to create %s\n", err)
|
|
return
|
|
}
|
|
|
|
err = processor.Init()
|
|
if err != nil {
|
|
fmt.Printf("failed Init: %s\n", err)
|
|
return
|
|
}
|
|
|
|
slog.Info("Processing", "src", srcFile, "dst", dstFile, "fields", fields, "clearBasedIndex",
|
|
clearBasedIndex, "clearValueEqual", clearValueEqual, "clearValueExcept", clearValueExcept, "logLevel", logLevel)
|
|
err = processor.Start()
|
|
if err != nil {
|
|
fmt.Printf("failed Start: %s\n", err)
|
|
return
|
|
}
|
|
|
|
err = processor.End()
|
|
if err != nil {
|
|
fmt.Printf("failed End: %s\n", err)
|
|
}
|
|
|
|
slog.Info("processor done", "elapsed", time.Since(tStart))
|
|
}
|