Using positional arguments rather than option flag to enable better shell usage
This commit is contained in:
@@ -22,14 +22,13 @@ func init() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var cmdFix = &Command{
|
var cmdFix = &Command{
|
||||||
UsageLine: "fix -path=/tmp [-volumeId=234] [-collection=bigData]",
|
UsageLine: "fix [-volumeId=234] [-collection=bigData] /tmp",
|
||||||
Short: "run weed tool fix to recreate index file(s) if corrupted",
|
Short: "run weed tool fix on files or whole folders to recreate index file(s) if corrupted",
|
||||||
Long: `Fix runs the SeaweedFS fix command on dat files to re-create the index .idx file.
|
Long: `Fix runs the SeaweedFS fix command on dat files or whole folders to re-create the index .idx file.
|
||||||
`,
|
`,
|
||||||
}
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
fixVolumePath = cmdFix.Flag.String("path", ".", "path to an individual .dat file or a folder of dat files")
|
|
||||||
fixVolumeCollection = cmdFix.Flag.String("collection", "", "an optional volume collection name, if specified only it will be processed")
|
fixVolumeCollection = cmdFix.Flag.String("collection", "", "an optional volume collection name, if specified only it will be processed")
|
||||||
fixVolumeId = cmdFix.Flag.Int64("volumeId", 0, "an optional volume id, if not 0 (default) only it will be processed")
|
fixVolumeId = cmdFix.Flag.Int64("volumeId", 0, "an optional volume id, if not 0 (default) only it will be processed")
|
||||||
)
|
)
|
||||||
@@ -61,51 +60,52 @@ func (scanner *VolumeFileScanner4Fix) VisitNeedle(n *needle.Needle, offset int64
|
|||||||
}
|
}
|
||||||
|
|
||||||
func runFix(cmd *Command, args []string) bool {
|
func runFix(cmd *Command, args []string) bool {
|
||||||
basePath, f := path.Split(util.ResolvePath(*fixVolumePath))
|
for _, arg := range args {
|
||||||
|
basePath, f := path.Split(util.ResolvePath(arg))
|
||||||
|
|
||||||
files := []fs.DirEntry{}
|
files := []fs.DirEntry{}
|
||||||
if f == "" {
|
if f == "" {
|
||||||
fileInfo, err := os.ReadDir(basePath + f)
|
fileInfo, err := os.ReadDir(basePath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Println(err)
|
fmt.Println(err)
|
||||||
return false
|
return false
|
||||||
|
}
|
||||||
|
files = fileInfo
|
||||||
|
} else {
|
||||||
|
fileInfo, err := os.Stat(basePath + f)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
files = []fs.DirEntry{fs.FileInfoToDirEntry(fileInfo)}
|
||||||
}
|
}
|
||||||
files = fileInfo
|
|
||||||
} else {
|
|
||||||
fileInfo, err := os.Stat(basePath + f)
|
|
||||||
if err != nil {
|
|
||||||
fmt.Println(err)
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
files = []fs.DirEntry{fs.FileInfoToDirEntry(fileInfo)}
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, file := range files {
|
for _, file := range files {
|
||||||
if !strings.HasSuffix(file.Name(), ".dat") {
|
if !strings.HasSuffix(file.Name(), ".dat") {
|
||||||
continue
|
|
||||||
}
|
|
||||||
if *fixVolumeCollection != "" {
|
|
||||||
if !strings.HasPrefix(file.Name(), *fixVolumeCollection+"_") {
|
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
if *fixVolumeCollection != "" {
|
||||||
|
if !strings.HasPrefix(file.Name(), *fixVolumeCollection+"_") {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
baseFileName := file.Name()[:len(file.Name())-4]
|
||||||
|
collection, volumeIdStr := "", baseFileName
|
||||||
|
if sepIndex := strings.LastIndex(baseFileName, "_"); sepIndex > 0 {
|
||||||
|
collection = baseFileName[:sepIndex]
|
||||||
|
volumeIdStr = baseFileName[sepIndex+1:]
|
||||||
|
}
|
||||||
|
volumeId, parseErr := strconv.ParseInt(volumeIdStr, 10, 64)
|
||||||
|
if parseErr != nil {
|
||||||
|
fmt.Printf("Failed to parse volume id from %s: %v\n", baseFileName, parseErr)
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
if *fixVolumeId != 0 && *fixVolumeId != volumeId {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
doFixOneVolume(basePath, baseFileName, collection, volumeId)
|
||||||
}
|
}
|
||||||
baseFileName := file.Name()[:len(file.Name())-4]
|
|
||||||
collection, volumeIdStr := "", baseFileName
|
|
||||||
if sepIndex := strings.LastIndex(baseFileName, "_"); sepIndex > 0 {
|
|
||||||
collection = baseFileName[:sepIndex]
|
|
||||||
volumeIdStr = baseFileName[sepIndex+1:]
|
|
||||||
}
|
|
||||||
volumeId, parseErr := strconv.ParseInt(volumeIdStr, 10, 64)
|
|
||||||
if parseErr != nil {
|
|
||||||
fmt.Printf("Failed to parse volume id from %s: %v\n", baseFileName, parseErr)
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
if *fixVolumeId != 0 && *fixVolumeId != volumeId {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
doFixOneVolume(basePath, baseFileName, collection, volumeId)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user