forked from Elara6331/itd
		
	Rewrite itctl to use urfave/cli instead of spf13/cobra
This commit is contained in:
		
							
								
								
									
										174
									
								
								cmd/itctl/fs.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										174
									
								
								cmd/itctl/fs.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,174 @@
 | 
			
		||||
package main
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"io"
 | 
			
		||||
	"io/ioutil"
 | 
			
		||||
	"os"
 | 
			
		||||
	"path/filepath"
 | 
			
		||||
 | 
			
		||||
	"github.com/cheggaaa/pb/v3"
 | 
			
		||||
	"github.com/urfave/cli/v2"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func fsList(c *cli.Context) error {
 | 
			
		||||
	dirPath := "/"
 | 
			
		||||
	if c.Args().Len() > 0 {
 | 
			
		||||
		dirPath = c.Args().Get(0)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	listing, err := client.ReadDir(dirPath)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for _, entry := range listing {
 | 
			
		||||
		fmt.Println(entry)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func fsMkdir(c *cli.Context) error {
 | 
			
		||||
	if c.Args().Len() < 1 {
 | 
			
		||||
		return cli.Exit("Command mkdir requires one or more arguments", 1)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	err := client.Mkdir(c.Args().Slice()...)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func fsMove(c *cli.Context) error {
 | 
			
		||||
	if c.Args().Len() != 2 {
 | 
			
		||||
		return cli.Exit("Command move requires two arguments", 1)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	err := client.Rename(c.Args().Get(0), c.Args().Get(1))
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func fsRead(c *cli.Context) error {
 | 
			
		||||
	if c.Args().Len() != 2 {
 | 
			
		||||
		return cli.Exit("Command read requires two arguments", 1)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var tmpFile *os.File
 | 
			
		||||
	var path string
 | 
			
		||||
	var err error
 | 
			
		||||
	if c.Args().Get(1) == "-" {
 | 
			
		||||
		tmpFile, err = ioutil.TempFile("/tmp", "itctl.*")
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
		path = tmpFile.Name()
 | 
			
		||||
	} else {
 | 
			
		||||
		path, err = filepath.Abs(c.Args().Get(1))
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	progress, err := client.ReadFile(path, c.Args().Get(0))
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Create progress bar template
 | 
			
		||||
	barTmpl := `{{counters . }} B {{bar . "|" "-" (cycle .) " " "|"}} {{percent . }} {{rtime . "%s"}}`
 | 
			
		||||
	// Start full bar at 0 total
 | 
			
		||||
	bar := pb.ProgressBarTemplate(barTmpl).Start(0)
 | 
			
		||||
	// Get progress events
 | 
			
		||||
	for event := range progress {
 | 
			
		||||
		// Set total bytes in progress bar
 | 
			
		||||
		bar.SetTotal(int64(event.Total))
 | 
			
		||||
		// Set amount of bytes sent in progress bar
 | 
			
		||||
		bar.SetCurrent(int64(event.Sent))
 | 
			
		||||
		// If transfer finished, break
 | 
			
		||||
		if event.Done {
 | 
			
		||||
			bar.Finish()
 | 
			
		||||
			break
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if c.Args().Get(1) == "-" {
 | 
			
		||||
		io.Copy(os.Stdout, tmpFile)
 | 
			
		||||
		os.Stdout.WriteString("\n")
 | 
			
		||||
		os.Stdout.Sync()
 | 
			
		||||
		tmpFile.Close()
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func fsRemove(c *cli.Context) error {
 | 
			
		||||
	if c.Args().Len() < 1 {
 | 
			
		||||
		return cli.Exit("Command remove requires one or more arguments", 1)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	err := client.Remove(c.Args().Slice()...)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func fsWrite(c *cli.Context) error {
 | 
			
		||||
	if c.Args().Len() != 2 {
 | 
			
		||||
		return cli.Exit("Command write requires two arguments", 1)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var tmpFile *os.File
 | 
			
		||||
	var path string
 | 
			
		||||
	var err error
 | 
			
		||||
	if c.Args().Get(0) == "-" {
 | 
			
		||||
		tmpFile, err = ioutil.TempFile("/tmp", "itctl.*")
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
		path = tmpFile.Name()
 | 
			
		||||
	} else {
 | 
			
		||||
		path, err = filepath.Abs(c.Args().Get(0))
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if c.Args().Get(0) == "-" {
 | 
			
		||||
		io.Copy(tmpFile, os.Stdin)
 | 
			
		||||
		defer tmpFile.Close()
 | 
			
		||||
		defer os.Remove(path)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	progress, err := client.WriteFile(path, c.Args().Get(1))
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Create progress bar template
 | 
			
		||||
	barTmpl := `{{counters . }} B {{bar . "|" "-" (cycle .) " " "|"}} {{percent . }} {{rtime . "%s"}}`
 | 
			
		||||
	// Start full bar at 0 total
 | 
			
		||||
	bar := pb.ProgressBarTemplate(barTmpl).Start(0)
 | 
			
		||||
	// Get progress events
 | 
			
		||||
	for event := range progress {
 | 
			
		||||
		// Set total bytes in progress bar
 | 
			
		||||
		bar.SetTotal(int64(event.Total))
 | 
			
		||||
		// Set amount of bytes sent in progress bar
 | 
			
		||||
		bar.SetCurrent(int64(event.Sent))
 | 
			
		||||
		// If transfer finished, break
 | 
			
		||||
		if event.Done {
 | 
			
		||||
			bar.Finish()
 | 
			
		||||
			break
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user