summary-modules-by-aod/SummaryModulesByAOD.go

358 lines
9.9 KiB
Go
Raw Permalink Normal View History

2023-07-25 20:10:52 +08:00
package main
import (
"bufio"
"flag"
"fmt"
2023-07-25 20:10:52 +08:00
"log"
"os"
"path/filepath"
"regexp"
"strings"
2023-08-05 16:12:02 +08:00
"time"
2023-07-25 20:10:52 +08:00
)
type FileInfo struct {
FilePath string
2023-08-05 16:12:02 +08:00
FileName string
2023-07-25 20:10:52 +08:00
FileSize int64
2023-08-05 16:12:02 +08:00
FileTime time.Time
2023-07-25 20:10:52 +08:00
}
var (
2023-08-05 16:12:02 +08:00
diffYear int = 0
bkupPath string = ""
autoBkup bool = false
2023-07-31 08:39:12 +08:00
exclude bool = false
2023-07-25 20:10:52 +08:00
aodType string = ""
aodPath string = ""
modPath string = ""
2023-11-20 09:11:12 +08:00
skipFile string = ""
aodList = make([]string, 0)
criList = make([]string, 0)
moduleList = make([]string, 0)
skipList = make([]string, 0)
2023-11-20 15:05:54 +08:00
bkupList = make([]string, 0)
2023-11-20 09:11:12 +08:00
uniqueCriList = make([]string, 0)
uniqueModuleList = make([]string, 0)
needlessModuleList = make([]string, 0)
2024-01-27 20:29:34 +08:00
needlessModuleInfo = make([]string, 0)
2023-11-20 09:11:12 +08:00
missingModuleList = make([]string, 0)
errAOD = make([]string, 0)
errCRI = make([]string, 0)
2023-07-25 20:10:52 +08:00
aodInfoList []FileInfo
moduleInfoList []FileInfo
)
var regFilter = `.*`
var regLNB = `(?i)\S{10,}\.[0-9]{3}`
var regTNB = `(?i)SSW\S{7}\.SSW\S{7}`
var regSBID = `(?i)\S{8,}\.DAT`
func init() {
2023-07-31 08:39:12 +08:00
flag.BoolVar(&exclude, "x", false, "Exclude Mode")
2023-08-05 16:12:02 +08:00
flag.BoolVar(&autoBkup, "y", false, "Auto Backup")
flag.IntVar(&diffYear, "d", 6, "Differ Year Of File Time to Backup")
2023-07-31 08:39:12 +08:00
flag.StringVar(&aodPath, "a", `D:\Vol1\PDLINE\PLANT1\PRELOAD\AOD`, "Path Of AODs")
2023-08-05 16:12:02 +08:00
flag.StringVar(&modPath, "m", `D:\COMMON`, "Path Of Modules")
2023-08-05 23:21:23 +08:00
flag.StringVar(&bkupPath, "b", `D:\COMMON_BKUP`, "Path Of Backup")
2023-07-25 20:10:52 +08:00
flag.StringVar(&aodType, "t", "*", "Type Of AODs, LNB/TNB/SBID/*")
2023-11-20 09:11:12 +08:00
flag.StringVar(&skipFile, "s", "./SkipList.txt", "Text File Of Skip Modules")
2023-07-25 20:10:52 +08:00
flag.Parse()
}
func main() {
2023-08-05 23:21:23 +08:00
log.SetOutput(os.Stdout)
log.Printf("[MSG] Commandline: %v\r\n", os.Args)
bkupList = append(bkupList, fmt.Sprintf("### Commandline: %v", os.Args))
2023-07-25 20:10:52 +08:00
_, err := os.Stat(aodPath)
if err != nil {
log.Printf("[ERR] Path Of AODs Not Exists.\r\n")
os.Exit(1)
}
_, err = os.Stat(modPath)
if err != nil {
log.Printf("[ERR] Path Of Modules Not Exists.\r\n")
os.Exit(1)
}
2023-11-20 09:11:12 +08:00
if skipFile != "" {
obj, err := os.Open(skipFile)
if err == nil {
buf := bufio.NewScanner(obj)
for buf.Scan() {
if buf.Err() != nil {
break
}
skipList = append(skipList, strings.TrimSpace(buf.Text()))
}
}
}
2023-11-20 09:15:06 +08:00
log.Printf("[MSG] Skip Modules: %d\r\n", len(skipList))
2023-11-20 09:11:12 +08:00
2023-07-25 20:10:52 +08:00
log.Printf("[MSG] Summary Loacal AODs ...\r\n")
2023-08-05 16:12:02 +08:00
aodInfoList, err = _SummaryAODs(aodPath, aodType)
2023-07-25 20:10:52 +08:00
if err != nil {
log.Printf("[ERR] Get AOD List Failed: %s\r\n", err.Error())
os.Exit(1)
}
log.Printf("[MSG] Total Local AODs: %d\r\n", len(aodInfoList))
2023-11-20 15:05:54 +08:00
_WriteFileFromStringSlice("./AOD.txt", aodList)
2023-07-25 20:10:52 +08:00
log.Printf("[MSG] Summary Local Modules ...\r\n")
2023-08-05 16:12:02 +08:00
moduleInfoList, err = _SummaryModules(modPath)
2023-07-25 20:10:52 +08:00
if err != nil {
log.Printf("[ERR] Get Module List Failed: %s\r\n", err.Error())
os.Exit(1)
}
log.Printf("[MSG] Total Local Modules: %d\r\n", len(moduleInfoList))
regCRI, err := regexp.Compile(`(?i).*File=(.{1,}.CRI)`)
if err != nil {
log.Printf("[ERR] RegExp - CRI Compile Error: %s\r\n", err.Error())
os.Exit(1)
}
2023-08-05 16:12:02 +08:00
2023-07-25 20:10:52 +08:00
log.Printf("[MSG] Summary CRIs From AODs ...\r\n")
2023-08-05 16:12:02 +08:00
for _, aod := range aodList {
rdr, err := os.Open(aod)
2023-07-25 20:10:52 +08:00
if err != nil {
2023-08-05 16:12:02 +08:00
errAOD = append(errAOD, aod)
2023-11-20 09:11:12 +08:00
continue
2023-07-25 20:10:52 +08:00
}
buf := bufio.NewScanner(rdr)
for buf.Scan() {
if buf.Err() != nil {
break
}
rst := regCRI.FindStringSubmatch(buf.Text())
if len(rst) != 2 {
continue
}
criList = append(criList, strings.TrimSpace(rst[1]))
}
}
log.Printf("[MSG] Total CRIs From AODs: %d\r\n", len(criList))
2023-08-05 16:12:02 +08:00
uniqueCriList = _RemoveDuplicateElementOfSlice(criList)
log.Printf("[MSG] Unique CRIs From AODs: %d\r\n", len(uniqueCriList))
2023-07-25 20:10:52 +08:00
regModuleName, err := regexp.Compile(`(?i)(ModuleName[0-9]{0,}|ModuleThis[0-9]{0,})=(.{1,})`)
if err != nil {
log.Printf("[ERR] RegExp - ModuleName Compile Error: %s\r\n", err.Error())
os.Exit(1)
}
2023-08-05 16:12:02 +08:00
2023-07-25 20:10:52 +08:00
log.Printf("[MSG] Summary Modules From CRIs ...\r\n")
2023-08-05 16:12:02 +08:00
for _, cri := range uniqueCriList {
2023-07-25 20:10:52 +08:00
rdr, err := os.Open(modPath + "\\" + cri)
if err != nil {
errCRI = append(errCRI, modPath+"\\"+cri)
}
buf := bufio.NewScanner(rdr)
for buf.Scan() {
if buf.Err() != nil {
break
}
rst := regModuleName.FindStringSubmatch(buf.Text())
if len(rst) != 3 {
continue
}
moduleList = append(moduleList, strings.TrimSpace(rst[2]))
}
}
log.Printf("[MSG] Total Modules From CRIs: %d\r\n", len(moduleList))
2023-08-05 16:12:02 +08:00
uniqueModuleList = _RemoveDuplicateElementOfSlice(moduleList)
log.Printf("[MSG] Unique Modules From CRIs: %d\r\n", len(uniqueModuleList))
_WriteFileFromStringSlice("./NeededModules.txt", uniqueModuleList)
2023-07-25 20:10:52 +08:00
log.Printf("[MSG] Checking Missing Modules ...\r\n")
2023-08-05 16:12:02 +08:00
for _, m := range uniqueModuleList {
2023-07-25 20:10:52 +08:00
exist := false
for _, l := range moduleInfoList {
if strings.EqualFold(m, l.FileName) {
exist = true
break
}
}
if !exist {
missingModuleList = append(missingModuleList, m)
}
}
log.Printf("[MSG] Checking Needless Modules ...\r\n")
for _, l := range moduleInfoList {
needless := true
2023-08-05 16:12:02 +08:00
for _, m := range uniqueModuleList {
2023-07-25 20:10:52 +08:00
if strings.EqualFold(l.FileName, m) {
needless = false
break
}
}
if needless {
2024-01-27 20:29:34 +08:00
needlessModuleList = append(needlessModuleList, l.FileName)
needlessModuleInfo = append(needlessModuleInfo, l.FileName+"\t"+l.FileTime.Format("2006-01-02 15:04:05"))
2023-07-25 20:10:52 +08:00
}
}
log.Printf("***** Error AODs: %d\r\n", len(errAOD))
2023-11-20 15:05:54 +08:00
_WriteFileFromStringSlice("./errAOD.txt", errAOD)
2023-07-25 20:10:52 +08:00
log.Printf("***** Error CRIs: %d\r\n", len(errCRI))
2023-11-20 15:05:54 +08:00
_WriteFileFromStringSlice("./errCRI.txt", errCRI)
2023-07-25 20:10:52 +08:00
log.Printf("##### Missing Modules: %d\r\n", len(missingModuleList))
2023-11-20 15:05:54 +08:00
_WriteFileFromStringSlice("./MissingModules.txt", missingModuleList)
2023-07-25 20:10:52 +08:00
log.Printf("##### Needless Modules: %d\r\n", len(needlessModuleList))
2024-01-27 20:29:34 +08:00
_WriteFileFromStringSlice("./NeedlessModules.txt", needlessModuleInfo)
2023-08-05 16:12:02 +08:00
if autoBkup {
log.Printf("[MSG] Starting Backup Modules Older Than %d Years ...\r\n", diffYear)
_, err := os.Stat(bkupPath)
if err != nil {
err = os.MkdirAll(bkupPath, os.ModePerm)
if err != nil {
2023-11-20 15:05:54 +08:00
log.Printf("[ERR] Create Backup Directory Failed.\r\n")
2023-08-05 16:12:02 +08:00
os.Exit(1)
}
}
2023-08-05 23:21:23 +08:00
ttl := 0
2023-11-20 09:11:12 +08:00
LOOP:
2023-08-05 16:12:02 +08:00
for _, n := range needlessModuleList {
2023-11-20 09:11:12 +08:00
for _, s := range skipList {
if s == n {
log.Printf("[MSG] Skip Backup Module: %s\r\n", s)
continue LOOP
}
}
2023-08-05 16:12:02 +08:00
for _, m := range moduleInfoList {
if m.FileName == n {
if m.FileTime.AddDate(diffYear, 0, 0).Before(time.Now()) {
err := os.Rename(m.FilePath, bkupPath+"\\"+m.FileName)
if err != nil {
2023-08-05 23:21:23 +08:00
log.Printf("[ERR] FileName: %s;\tErrMsg: %s\r\n", m.FileName, err.Error())
2023-08-05 16:12:02 +08:00
break
}
2023-11-20 15:05:54 +08:00
bkupList = append(bkupList, m.FileName+"\t"+m.FileTime.Format("2006-01-02 15:04:05"))
2023-08-12 15:46:09 +08:00
log.Printf("[MSG] FileName: %s;\tFileTime: %s\r\n", m.FileName, m.FileTime.Format("2006-01-02 15:04:05"))
2023-08-05 23:21:23 +08:00
ttl += 1
2023-08-05 16:12:02 +08:00
break
}
}
}
}
_WriteFileFromStringSlice("./Backup_"+time.Now().Format("2006-01-02_15-04-05")+".txt", bkupList)
2023-11-20 09:11:12 +08:00
log.Printf("[MSG] Total Backed Up Modules: %d\r\n", ttl)
2023-08-05 16:12:02 +08:00
}
2023-07-25 20:10:52 +08:00
}
2023-08-05 16:12:02 +08:00
func _SummaryAODs(basePath, filter string) ([]FileInfo, error) {
2023-07-25 20:10:52 +08:00
var err error
sortInfoList := make([]FileInfo, 0)
fileInfoList := make([]FileInfo, 0)
err = filepath.Walk(basePath, func(path string, info os.FileInfo, err error) error {
if !info.IsDir() {
2023-08-05 16:12:02 +08:00
fi := new(FileInfo)
fi.FilePath = path
fi.FileName = info.Name()
fi.FileSize = info.Size()
fi.FileTime = info.ModTime() //.Format("2006-01-02 15:04:05")
fileInfoList = append(fileInfoList, *fi)
aodList = append(aodList, fi.FilePath)
2023-07-25 20:10:52 +08:00
}
return nil
})
if err != nil {
log.Printf("[ERR] Get File List Failed: %s\r\n", err.Error())
return nil, err
}
switch filter {
case "LNB":
regFilter = regLNB
case "TNB":
regFilter = regTNB
case "SBID":
regFilter = regSBID
default:
return fileInfoList, nil
}
for _, i := range fileInfoList {
reg := regexp.MustCompile(regFilter)
rst := reg.FindStringSubmatch(i.FileName)
2023-08-05 16:12:02 +08:00
2023-07-31 08:39:12 +08:00
if exclude {
if len(rst) == 1 {
continue
}
sortInfoList = append(sortInfoList, i)
2023-08-05 16:12:02 +08:00
}
if !exclude {
2023-07-31 08:39:12 +08:00
if len(rst) != 1 {
continue
}
sortInfoList = append(sortInfoList, i)
2023-07-25 20:10:52 +08:00
}
}
return sortInfoList, nil
}
2023-08-05 16:12:02 +08:00
func _SummaryModules(basePath string) ([]FileInfo, error) {
2023-07-26 00:07:53 +08:00
var err error
fileInfoList := make([]FileInfo, 0)
err = filepath.Walk(basePath, func(path string, info os.FileInfo, err error) error {
if !info.IsDir() {
2023-08-05 16:12:02 +08:00
fi := new(FileInfo)
fi.FilePath = path
fi.FileName = info.Name()
fi.FileSize = info.Size()
fi.FileTime = info.ModTime() //.Format("2006-01-02 15:04:05")
2023-07-26 00:07:53 +08:00
if path == basePath+"\\"+info.Name() {
2023-08-05 16:12:02 +08:00
fileInfoList = append(fileInfoList, *fi)
2023-07-26 00:07:53 +08:00
}
}
return nil
})
if err != nil {
log.Printf("[ERR] Get File List Failed: %s\r\n", err.Error())
return nil, err
}
return fileInfoList, nil
}
2023-07-25 20:10:52 +08:00
func _RemoveDuplicateElementOfSlice(src []string) []string {
dst := make([]string, 0, len(src))
tmp := map[string]struct{}{}
for _, s := range src {
if _, ok := tmp[s]; !ok {
tmp[s] = struct{}{}
dst = append(dst, s)
}
}
return dst
}
func _WriteFileFromStringSlice(fileName string, dataSlice []string) {
obj, err := os.OpenFile(fileName, os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0666)
if err != nil {
log.Printf("[ERR] Open File Error: %s\r\n", err.Error())
return
}
defer obj.Close()
var builder strings.Builder
for _, s := range dataSlice {
builder.WriteString(s + "\r\n")
}
2023-07-27 09:38:50 +08:00
_, err = obj.WriteString(builder.String())
2023-07-25 20:10:52 +08:00
if err != nil {
log.Printf("[ERR] Write File Error: %s\r\n", err.Error())
return
}
}