Directly read/write files from ITD
This commit is contained in:
parent
488b5a7d89
commit
9bfdaef70c
35
api/fs.go
35
api/fs.go
@ -66,27 +66,26 @@ func (c *Client) ReadDir(path string) ([]types.FileInfo, error) {
|
|||||||
return out, nil
|
return out, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *Client) ReadFile(path string) (string, error) {
|
func (c *Client) ReadFile(localPath, remotePath string) error {
|
||||||
res, err := c.request(types.Request{
|
|
||||||
Type: types.ReqTypeFS,
|
|
||||||
Data: types.ReqDataFS{
|
|
||||||
Type: types.FSTypeRead,
|
|
||||||
Files: []string{path},
|
|
||||||
},
|
|
||||||
})
|
|
||||||
if err != nil {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
return res.Value.(string), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *Client) WriteFile(path, data string) error {
|
|
||||||
_, err := c.request(types.Request{
|
_, err := c.request(types.Request{
|
||||||
Type: types.ReqTypeFS,
|
Type: types.ReqTypeFS,
|
||||||
Data: types.ReqDataFS{
|
Data: types.ReqDataFS{
|
||||||
Type: types.FSTypeWrite,
|
Type: types.FSTypeRead,
|
||||||
Files: []string{path},
|
Files: []string{localPath, remotePath},
|
||||||
Data: data,
|
},
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *Client) WriteFile(localPath, remotePath string) error {
|
||||||
|
_, err := c.request(types.Request{
|
||||||
|
Type: types.ReqTypeFS,
|
||||||
|
Data: types.ReqDataFS{
|
||||||
|
Type: types.FSTypeWrite,
|
||||||
|
Files: []string{remotePath, localPath},
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -19,8 +19,9 @@
|
|||||||
package filesystem
|
package filesystem
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"io"
|
||||||
|
"io/ioutil"
|
||||||
"os"
|
"os"
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/rs/zerolog/log"
|
"github.com/rs/zerolog/log"
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
@ -38,33 +39,32 @@ var readCmd = &cobra.Command{
|
|||||||
log.Fatal().Msg("Command read requires two arguments")
|
log.Fatal().Msg("Command read requires two arguments")
|
||||||
}
|
}
|
||||||
|
|
||||||
start := time.Now()
|
var tmpFile *os.File
|
||||||
|
var path string
|
||||||
|
var err error
|
||||||
|
if args[1] == "-" {
|
||||||
|
tmpFile, err = ioutil.TempFile("/tmp", "itctl.*")
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal().Err(err).Msg("Error creating temporary file")
|
||||||
|
}
|
||||||
|
path = tmpFile.Name()
|
||||||
|
} else {
|
||||||
|
path = args[1]
|
||||||
|
}
|
||||||
|
|
||||||
client := viper.Get("client").(*api.Client)
|
client := viper.Get("client").(*api.Client)
|
||||||
|
|
||||||
data, err := client.ReadFile(args[0])
|
err = client.ReadFile(path, args[0])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatal().Err(err).Msg("Error moving file or directory")
|
log.Fatal().Err(err).Msg("Error reading remote file")
|
||||||
}
|
}
|
||||||
|
|
||||||
var suffix string
|
|
||||||
var out *os.File
|
|
||||||
if args[1] == "-" {
|
if args[1] == "-" {
|
||||||
out = os.Stdout
|
io.Copy(os.Stdout, tmpFile)
|
||||||
suffix = "\n"
|
os.Stdout.WriteString("\n")
|
||||||
} else {
|
tmpFile.Close()
|
||||||
out, err = os.Create(args[1])
|
os.Remove(path)
|
||||||
if err != nil {
|
|
||||||
log.Fatal().Err(err).Msg("Error opening local file")
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
n, err := out.WriteString(data)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal().Err(err).Msg("Error writing to local file")
|
|
||||||
}
|
|
||||||
out.WriteString(suffix)
|
|
||||||
|
|
||||||
log.Info().Msgf("Read %d bytes in %s", n, time.Since(start))
|
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -20,8 +20,8 @@ package filesystem
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"io"
|
"io"
|
||||||
|
"io/ioutil"
|
||||||
"os"
|
"os"
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/rs/zerolog/log"
|
"github.com/rs/zerolog/log"
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
@ -39,31 +39,31 @@ var writeCmd = &cobra.Command{
|
|||||||
log.Fatal().Msg("Command write requires two arguments")
|
log.Fatal().Msg("Command write requires two arguments")
|
||||||
}
|
}
|
||||||
|
|
||||||
start := time.Now()
|
var tmpFile *os.File
|
||||||
client := viper.Get("client").(*api.Client)
|
var path string
|
||||||
|
var err error
|
||||||
var in *os.File
|
|
||||||
if args[0] == "-" {
|
if args[0] == "-" {
|
||||||
in = os.Stdin
|
tmpFile, err = ioutil.TempFile("/tmp", "itctl.*")
|
||||||
} else {
|
|
||||||
fl, err := os.Open(args[0])
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatal().Err(err).Msg("Error opening local file")
|
log.Fatal().Err(err).Msg("Error creating temporary file")
|
||||||
}
|
}
|
||||||
in = fl
|
path = tmpFile.Name()
|
||||||
|
} else {
|
||||||
|
path = args[0]
|
||||||
}
|
}
|
||||||
|
|
||||||
data, err := io.ReadAll(in)
|
client := viper.Get("client").(*api.Client)
|
||||||
|
|
||||||
|
if args[0] == "-" {
|
||||||
|
io.Copy(tmpFile, os.Stdin)
|
||||||
|
defer tmpFile.Close()
|
||||||
|
defer os.Remove(path)
|
||||||
|
}
|
||||||
|
|
||||||
|
err = client.WriteFile(path, args[1])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatal().Err(err).Msg("Error moving file or directory")
|
log.Fatal().Err(err).Msg("Error moving file or directory")
|
||||||
}
|
}
|
||||||
|
|
||||||
err = client.WriteFile(args[1], string(data))
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal().Err(err).Msg("Error writing to remote file")
|
|
||||||
}
|
|
||||||
|
|
||||||
log.Info().Msgf("Wrote %d bytes in %s", len(data), time.Since(start))
|
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
41
socket.go
41
socket.go
@ -535,39 +535,56 @@ func handleConnection(conn net.Conn, dev *infinitime.Device, fs *blefs.FS) {
|
|||||||
Value: out,
|
Value: out,
|
||||||
})
|
})
|
||||||
case types.FSTypeWrite:
|
case types.FSTypeWrite:
|
||||||
if len(reqData.Files) != 1 {
|
if len(reqData.Files) != 2 {
|
||||||
connErr(conn, req.Type, nil, "Write FS command requires a path to the file to write")
|
connErr(conn, req.Type, nil, "Write FS command requires a path to the file to write")
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
file, err := fs.Create(reqData.Files[0], uint32(len(reqData.Data)))
|
|
||||||
|
localFile, err := os.Open(reqData.Files[1])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
connErr(conn, req.Type, err, "Error creating file")
|
connErr(conn, req.Type, err, "Error opening local file")
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
_, err = file.WriteString(reqData.Data)
|
defer localFile.Close()
|
||||||
|
|
||||||
|
localInfo, err := localFile.Stat()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
connErr(conn, req.Type, err, "Error writing to file")
|
connErr(conn, req.Type, err, "Error getting local file information")
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|
||||||
|
remoteFile, err := fs.Create(reqData.Files[0], uint32(localInfo.Size()))
|
||||||
|
if err != nil {
|
||||||
|
connErr(conn, req.Type, err, "Error creating remote file")
|
||||||
|
break
|
||||||
|
}
|
||||||
|
defer remoteFile.Close()
|
||||||
|
|
||||||
|
io.Copy(remoteFile, localFile)
|
||||||
|
|
||||||
json.NewEncoder(conn).Encode(types.Response{Type: req.Type})
|
json.NewEncoder(conn).Encode(types.Response{Type: req.Type})
|
||||||
case types.FSTypeRead:
|
case types.FSTypeRead:
|
||||||
if len(reqData.Files) != 1 {
|
fmt.Println(scanner.Text(), reqData)
|
||||||
|
if len(reqData.Files) != 2 {
|
||||||
connErr(conn, req.Type, nil, "Read FS command requires a path to the file to read")
|
connErr(conn, req.Type, nil, "Read FS command requires a path to the file to read")
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
file, err := fs.Open(reqData.Files[0])
|
localFile, err := os.Create(reqData.Files[0])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
connErr(conn, req.Type, err, "Error opening file")
|
connErr(conn, req.Type, err, "Error creating local file")
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
data, err := io.ReadAll(file)
|
|
||||||
|
remoteFile, err := fs.Open(reqData.Files[1])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
connErr(conn, req.Type, err, "Error reading from file")
|
connErr(conn, req.Type, err, "Error opening remote file")
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|
||||||
|
io.Copy(localFile, remoteFile)
|
||||||
|
|
||||||
json.NewEncoder(conn).Encode(types.Response{
|
json.NewEncoder(conn).Encode(types.Response{
|
||||||
Type: req.Type,
|
Type: req.Type,
|
||||||
Value: string(data),
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
case types.ReqTypeCancel:
|
case types.ReqTypeCancel:
|
||||||
|
Loading…
Reference in New Issue
Block a user