|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
|
|
|
"bytes"
|
|
|
|
"context"
|
|
|
|
"encoding/json"
|
|
|
|
"fmt"
|
|
|
|
"github.com/go-redis/redis/v8"
|
|
|
|
"github.com/gogf/gf/v2/encoding/gjson"
|
|
|
|
"github.com/gogf/gf/v2/frame/g"
|
|
|
|
"log"
|
|
|
|
"os"
|
|
|
|
"os/exec"
|
|
|
|
"strings"
|
|
|
|
"time"
|
|
|
|
)
|
|
|
|
|
|
|
|
const redisAdress = "119.29.144.246:4114"
|
|
|
|
const redisPass = "peach"
|
|
|
|
|
|
|
|
const linkAccount = "mongodb://root:peach123@192.168.2.100:27017/PeachValley"
|
|
|
|
const link = "mongodb://127.0.0.1:27017/PeachValley"
|
|
|
|
|
|
|
|
const notAccount = false
|
|
|
|
|
|
|
|
func main() {
|
|
|
|
|
|
|
|
//fmt.Println("参数: ", len(os.Args))
|
|
|
|
var model string
|
|
|
|
|
|
|
|
fmt.Print("下载账号数据输入 1 , 替换账号数据输入 2 : ")
|
|
|
|
_, err := fmt.Scan(&model) // 读取输入并赋值给变量
|
|
|
|
if err != nil {
|
|
|
|
fmt.Println("输入错误:", err)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
ctx := context.Background()
|
|
|
|
rdb := redis.NewClient(&redis.Options{
|
|
|
|
Addr: redisAdress,
|
|
|
|
DialTimeout: 10 * time.Second,
|
|
|
|
ReadTimeout: 30 * time.Second,
|
|
|
|
WriteTimeout: 30 * time.Second,
|
|
|
|
PoolSize: 10,
|
|
|
|
PoolTimeout: 30 * time.Second,
|
|
|
|
Password: redisPass,
|
|
|
|
})
|
|
|
|
|
|
|
|
if model == "1" {
|
|
|
|
fmt.Printf("%s准备复制账号信息: \n", model)
|
|
|
|
copyUnit(ctx, rdb)
|
|
|
|
} else {
|
|
|
|
fmt.Printf("%s准备替换账号信息: \n", model)
|
|
|
|
updateUnit(ctx, rdb)
|
|
|
|
}
|
|
|
|
ticker := time.NewTicker(1 * time.Second)
|
|
|
|
defer ticker.Stop()
|
|
|
|
|
|
|
|
fmt.Println("程序仍在运行...(输入 'ctrl-c' 退出)")
|
|
|
|
for {
|
|
|
|
select {
|
|
|
|
case <-ticker.C:
|
|
|
|
// 这里可以添加条件检查(如读取文件、网络请求等)
|
|
|
|
default:
|
|
|
|
// 非阻塞检查用户输入(需配合 goroutine)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func copyUnit(ctx context.Context, rdb *redis.Client) {
|
|
|
|
var destUid string
|
|
|
|
fmt.Print("输入需要复制的uid: ")
|
|
|
|
_, err := fmt.Scan(&destUid) // 读取输入并赋值给变量
|
|
|
|
if err != nil {
|
|
|
|
fmt.Println("输入错误:", err)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
fmt.Printf("正在复制账号: %s\n", destUid)
|
|
|
|
rdb.Do(ctx, "select", 0)
|
|
|
|
destId, err := rdb.HGet(ctx, "public_id_for_uid", fmt.Sprint(destUid)).Result()
|
|
|
|
if err != nil {
|
|
|
|
fmt.Println("public_id_for_uid: err", err)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
if destId == "" {
|
|
|
|
fmt.Println("public_id_for_uid: value is nil")
|
|
|
|
return
|
|
|
|
}
|
|
|
|
filename := "Unit.json"
|
|
|
|
storeFilename := "StoreComponent.json"
|
|
|
|
userDir := "./" + filename
|
|
|
|
storeDir := "./" + storeFilename
|
|
|
|
name := "mongoexport"
|
|
|
|
args := []string{}
|
|
|
|
args1 := []string{}
|
|
|
|
if notAccount {
|
|
|
|
args = append(args, fmt.Sprintf("--uri=\"%s\"", link))
|
|
|
|
args1 = append(args1, fmt.Sprintf("--uri=\"%s\"", link))
|
|
|
|
} else {
|
|
|
|
args = append(args, fmt.Sprintf("--uri=\"%s\"", linkAccount))
|
|
|
|
args = append(args, "--authenticationDatabase=admin")
|
|
|
|
args1 = append(args1, fmt.Sprintf("--uri=\"%s\"", linkAccount))
|
|
|
|
args1 = append(args1, "--authenticationDatabase=admin")
|
|
|
|
}
|
|
|
|
|
|
|
|
args = append(args, "--collection=Unit")
|
|
|
|
args = append(args, "--jsonArray")
|
|
|
|
args = append(args, fmt.Sprintf("--out=\"%s\"", userDir))
|
|
|
|
args = append(args, fmt.Sprintf("--query=\"{\\\"UniqueId\\\":%s}\"", destUid))
|
|
|
|
args = append(args, "--jsonFormat=canonical")
|
|
|
|
args = append(args, "--type=json")
|
|
|
|
args1 = append(args1, "--collection=StoreComponent")
|
|
|
|
args1 = append(args1, "--jsonArray")
|
|
|
|
args1 = append(args1, fmt.Sprintf("--out=\"%s\"", storeDir))
|
|
|
|
args1 = append(args1, fmt.Sprintf("--query=\"{\\\"_id\\\":%s}\"", destId))
|
|
|
|
args1 = append(args1, "--jsonFormat=canonical")
|
|
|
|
args1 = append(args1, "--type=json")
|
|
|
|
|
|
|
|
cmdCommand(ctx, name, args...)
|
|
|
|
cmdCommand(ctx, name, args1...)
|
|
|
|
}
|
|
|
|
|
|
|
|
func updateUnit(ctx context.Context, rdb *redis.Client) {
|
|
|
|
var filename string
|
|
|
|
var storeFilename string
|
|
|
|
var destUid string
|
|
|
|
fmt.Print("输入需要修改的uid: ")
|
|
|
|
_, err := fmt.Scan(&destUid) // 读取输入并赋值给变量
|
|
|
|
if err != nil {
|
|
|
|
fmt.Println("输入错误:", err)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
fmt.Print("输入需要复制的unit文件名(需加后缀): ")
|
|
|
|
_, err = fmt.Scan(&filename) // 读取输入并赋值给变量
|
|
|
|
if err != nil {
|
|
|
|
fmt.Println("输入错误:", err)
|
|
|
|
|
|
|
|
return
|
|
|
|
}
|
|
|
|
fmt.Printf("正在复制账号: %s\n", filename)
|
|
|
|
fmt.Print("输入需要复制的store文件名(需加后缀): ")
|
|
|
|
_, err = fmt.Scan(&storeFilename) // 读取输入并赋值给变量
|
|
|
|
if err != nil {
|
|
|
|
fmt.Println("输入错误:", err)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
fmt.Printf("正在复制账号: %s\n", storeFilename)
|
|
|
|
fmt.Printf("现在修改账号: %s\n", destUid)
|
|
|
|
destId, err := rdb.HGet(ctx, "public_id_for_uid", fmt.Sprint(destUid)).Result()
|
|
|
|
if err != nil {
|
|
|
|
fmt.Println("public_id_for_uid: err", err)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
if destId == "" {
|
|
|
|
fmt.Println("public_id_for_uid: value is nil")
|
|
|
|
return
|
|
|
|
}
|
|
|
|
userDir := "./Unit" + fmt.Sprint(destId) + ".json"
|
|
|
|
srcUserDir := "./" + filename
|
|
|
|
|
|
|
|
writeByte, err1 := os.ReadFile(srcUserDir)
|
|
|
|
if err1 != nil {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
srcUid := ""
|
|
|
|
srcId := ""
|
|
|
|
var v1 map[string]interface{}
|
|
|
|
if strings.HasPrefix(string(writeByte), "[") {
|
|
|
|
user := []interface{}{}
|
|
|
|
json.Unmarshal(writeByte, &user)
|
|
|
|
v1 = user[0].(map[string]interface{})
|
|
|
|
} else {
|
|
|
|
json.Unmarshal(writeByte, &v1)
|
|
|
|
}
|
|
|
|
|
|
|
|
if _, ok := v1["UniqueId"]; ok {
|
|
|
|
UniqueId := v1["UniqueId"].(map[string]interface{})
|
|
|
|
srcUid = fmt.Sprint(UniqueId["$numberInt"])
|
|
|
|
}
|
|
|
|
if _, ok := v1["_id"]; ok {
|
|
|
|
UniqueId := v1["_id"].(map[string]interface{})
|
|
|
|
srcId = fmt.Sprint(UniqueId["$numberLong"])
|
|
|
|
}
|
|
|
|
|
|
|
|
userStoreDir := "./StoreComponent" + fmt.Sprint(destUid) + ".json"
|
|
|
|
srcStoreDir := "./" + storeFilename
|
|
|
|
writeStoreByte, err1 := os.ReadFile(srcStoreDir)
|
|
|
|
if err1 != nil {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
var v2 map[string]interface{}
|
|
|
|
if strings.HasPrefix(string(writeStoreByte), "[") {
|
|
|
|
user := []interface{}{}
|
|
|
|
json.Unmarshal(writeStoreByte, &user)
|
|
|
|
v2 = user[0].(map[string]interface{})
|
|
|
|
} else {
|
|
|
|
json.Unmarshal(writeStoreByte, &v2)
|
|
|
|
}
|
|
|
|
|
|
|
|
//log.Printf("copyUnit string(writeByte): %s ", string(writeByte))
|
|
|
|
log.Printf("copyUnit srcid: %s, uid: %s, destid: %s, uid: %s", srcId, srcUid, destId, destUid)
|
|
|
|
//log.Printf("copyUnit string(writeByte): %s ", gjson.MustEncodeString(user))
|
|
|
|
if srcId == "" || srcUid == "" {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
writeUnitString := strings.ReplaceAll(gjson.MustEncodeString(v1), srcId, fmt.Sprint(destId))
|
|
|
|
writeStoreString := strings.ReplaceAll(gjson.MustEncodeString(v2), srcId, fmt.Sprint(destId))
|
|
|
|
//log.Printf("copyUnit writeString: %s,", writeString)
|
|
|
|
writeUnitString = ReplaceLastOccurrence(writeUnitString, srcUid, fmt.Sprint(destUid))
|
|
|
|
//log.Printf("copyUnit writeString: %s,", writeString)
|
|
|
|
if err = os.WriteFile(userDir, []byte(writeUnitString), 0666); err != nil {
|
|
|
|
log.Println(err)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
if err = os.WriteFile(userStoreDir, []byte(writeStoreString), 0666); err != nil {
|
|
|
|
log.Println(err)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
name := "mongoimport"
|
|
|
|
|
|
|
|
args := []string{}
|
|
|
|
args1 := []string{}
|
|
|
|
if notAccount {
|
|
|
|
args = append(args, fmt.Sprintf("--uri=\"%s\"", link))
|
|
|
|
args1 = append(args1, fmt.Sprintf("--uri=\"%s\"", link))
|
|
|
|
} else {
|
|
|
|
args = append(args, fmt.Sprintf("--uri=\"%s\"", linkAccount))
|
|
|
|
args = append(args, "--authenticationDatabase=admin")
|
|
|
|
args1 = append(args1, fmt.Sprintf("--uri=\"%s\"", linkAccount))
|
|
|
|
args1 = append(args1, "--authenticationDatabase=admin")
|
|
|
|
}
|
|
|
|
|
|
|
|
args = append(args, "--collection=Unit")
|
|
|
|
args = append(args, fmt.Sprintf("--file=\"%s\"", userDir))
|
|
|
|
args = append(args, "--type=json")
|
|
|
|
args = append(args, "--mode=upsert")
|
|
|
|
args1 = append(args1, "--collection=StoreComponent")
|
|
|
|
args1 = append(args1, fmt.Sprintf("--file=\"%s\"", userStoreDir))
|
|
|
|
args1 = append(args1, "--type=json")
|
|
|
|
args1 = append(args1, "--mode=upsert")
|
|
|
|
|
|
|
|
cmdCommand(ctx, name, args...)
|
|
|
|
cmdCommand(ctx, name, args1...)
|
|
|
|
cmdCommand(ctx, "del", userDir)
|
|
|
|
cmdCommand(ctx, "del", userStoreDir)
|
|
|
|
|
|
|
|
fmt.Println("CopyUnit GetRoleDelta", destId)
|
|
|
|
}
|
|
|
|
|
|
|
|
func cmdCommand(ctx context.Context, name string, args ...string) {
|
|
|
|
g.Try(ctx, func(ctx context.Context) {
|
|
|
|
cmd := exec.Command(name, args...)
|
|
|
|
var stdout, stderr bytes.Buffer
|
|
|
|
cmd.Stdout = &stdout // 标准输出
|
|
|
|
cmd.Stderr = &stderr // 标准错误
|
|
|
|
err := cmd.Run()
|
|
|
|
if err != nil {
|
|
|
|
log.Printf("cmd.Run() failed with %s\n", err)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
outStr, errStr := string(stdout.Bytes()), string(stderr.Bytes())
|
|
|
|
fmt.Printf("out:\n%s\nerr:\n%s\n", outStr, errStr)
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
// ReplaceLastOccurrence 替换最后一个匹配的子字符串
|
|
|
|
func ReplaceLastOccurrence(s, oldStr, newStr string) string {
|
|
|
|
lastIndex := strings.LastIndex(s, oldStr)
|
|
|
|
if lastIndex == -1 {
|
|
|
|
return s // 未找到,直接返回原字符串
|
|
|
|
}
|
|
|
|
return s[:lastIndex] + newStr + s[lastIndex+len(oldStr):]
|
|
|
|
}
|