Updated watch

This commit is contained in:
darmiel 2021-03-27 17:23:40 +01:00
parent 2f5caf3a1f
commit e54fb8c079
5 changed files with 133 additions and 96 deletions

View file

@ -60,6 +60,4 @@ func init() {
pasteCmd.Flags().StringVarP(&pasteAnywherePath, "anywhere", "a", "", "Path (Anywhere)")
pasteCmd.Flags().StringVarP(&pastePassphrase, "passphrase", "s", "", "Encryption Key")
regStrP(pasteCmd, "passphrase", "s", "", "Secret")
}

View file

@ -34,25 +34,6 @@ var (
watchPassphrase string
)
// watchCmd represents the watch command
var watchCmd = &cobra.Command{
Use: "watch",
Long: `Watch Clipboard`,
Run: func(cmd *cobra.Command, args []string) {
// start watcher
// clipboard
go watchClipboard(watchAnywherePath, watchPassphrase)
go watchServer(watchAnywherePath, watchPassphrase)
log.Println("Started clipboard-watcher. Press CTRL-C to stop.")
sc := make(chan os.Signal, 1)
signal.Notify(sc, syscall.SIGINT, syscall.SIGTERM)
<-sc
log.Println("Stopped.")
},
}
var (
errors int
@ -63,6 +44,32 @@ var (
errMu = sync.Mutex{}
)
// watchCmd represents the watch command
var watchCmd = &cobra.Command{
Use: "watch",
Long: `Watch Clipboard`,
Run: func(cmd *cobra.Command, args []string) {
d := make(chan int, 1)
// start watcher
// clipboard
go watchClipboard(watchAnywherePath, watchPassphrase, d)
go watchServer(watchAnywherePath, watchPassphrase, d)
log.Println("Started clipboard-watcher. Press CTRL-C to stop.")
sc := make(chan os.Signal, 1)
signal.Notify(sc, syscall.SIGINT, syscall.SIGTERM)
<-sc
// stop watchers
d <- 1
d <- 1
log.Println("Stopped.")
},
}
func handleErr(err error, m string) {
errMu.Lock()
errors++
@ -76,94 +83,114 @@ func handleErr(err error, m string) {
log.Println("[err] ERROR reading clipboard:", err, errors, "/ 6")
}
func watchClipboard(path, pass string) {
func watchClipboard(path, pass string, done chan int) {
a := api.API()
t := time.NewTicker(100 * time.Millisecond)
for {
time.Sleep(100 * time.Millisecond)
mu.Lock()
select {
case <-t.C:
mu.Lock()
data, err := clipboard.ReadAll()
if err != nil {
data, err := clipboard.ReadAll()
if err != nil {
mu.Unlock()
handleErr(err, "clipboard-read")
continue
}
errors = 0
if lastClipboardData == data {
mu.Unlock()
continue
}
// calculate new hash
lastClipboardData = data
lastClipboardHash = common.MD5Hash(data)
// check if server has current clipboard
serverHash, err := a.GetHash(path)
if err != nil {
mu.Unlock()
handleErr(err, "read-server-hash")
continue
}
if serverHash == lastClipboardHash {
mu.Unlock()
log.Println("[ ~ ] (rea) Server Hash == Local Hash")
continue
}
// update server hash
if err := a.SetContent(path, pass, data); err != nil {
mu.Unlock()
handleErr(err, "set-server-content")
continue
}
log.Println("[ ok] Updated contents.")
mu.Unlock()
handleErr(err, "clipboard-read")
continue
break
case <-done:
log.Println("[ ok] Stopping watch clipboard")
return
}
errors = 0
if lastClipboardData == data {
mu.Unlock()
continue
}
// calculate new hash
lastClipboardData = data
lastClipboardHash = common.MD5Hash(data)
// check if server has current clipboard
serverHash, err := a.GetHash(path)
if err != nil {
mu.Unlock()
handleErr(err, "read-server-hash")
continue
}
if serverHash == lastClipboardHash {
mu.Unlock()
log.Println("[ ~ ] (rea) Server Hash == Local Hash")
continue
}
// update server hash
if err := a.SetContent(path, pass, data); err != nil {
mu.Unlock()
handleErr(err, "set-server-content")
continue
}
log.Println("[ ok] Updated contents.")
mu.Unlock()
}
}
func watchServer(path, pass string) {
func watchServer(path, pass string, done chan int) {
a := api.API()
t := time.NewTicker(1 * time.Second)
for {
time.Sleep(1 * time.Second)
mu.Lock()
select {
case <-t.C:
hash, err := a.GetHash(path)
if err != nil {
time.Sleep(1 * time.Second)
mu.Lock()
hash, err := a.GetHash(path)
if err != nil {
mu.Unlock()
handleErr(err, "read-server-hash")
continue
}
if hash == lastClipboardHash {
mu.Unlock()
continue
}
// get data
data, err := a.GetContent(path, pass)
if err != nil {
mu.Unlock()
handleErr(err, "read-server-contents")
continue
}
log.Println("[ ~ ] Received new data:", data)
lastClipboardData = data
lastClipboardHash = common.MD5Hash(data)
if err := clipboard.WriteAll(data); err != nil {
mu.Unlock()
handleErr(err, "write-clipboard")
continue
}
log.Println("[ ok] Wrote client content")
mu.Unlock()
handleErr(err, "read-server-hash")
continue
break
case <-done:
log.Println("[ ok] Stopping watch server")
return
}
if hash == lastClipboardHash {
mu.Unlock()
continue
}
// get data
data, err := a.GetContent(path, pass)
if err != nil {
mu.Unlock()
handleErr(err, "read-server-contents")
continue
}
log.Println("[ ~ ] Received new data:", data)
lastClipboardData = data
lastClipboardHash = common.MD5Hash(data)
if err := clipboard.WriteAll(data); err != nil {
mu.Unlock()
handleErr(err, "write-clipboard")
continue
}
log.Println("[ ok] Wrote client content")
mu.Unlock()
}
}

1
go.mod
View file

@ -3,6 +3,7 @@ module github.com/darmiel/yaxc
go 1.16
require (
github.com/atotto/clipboard v0.1.4 // indirect
github.com/go-redis/redis/v8 v8.8.0
github.com/gofiber/fiber/v2 v2.6.0
github.com/imroc/req v0.3.0

2
go.sum
View file

@ -21,6 +21,8 @@ github.com/andybalholm/brotli v1.0.0/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu
github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=
github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=
github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
github.com/atotto/clipboard v0.1.4 h1:EH0zSVneZPSuFR11BlR9YppQTVDbh5+16AmcJi4g1z4=
github.com/atotto/clipboard v0.1.4/go.mod h1:ZY9tmq7sm5xIbd9bOK4onWV4S6X0u6GY7Vn0Yu86PYI=
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=

View file

@ -33,3 +33,12 @@ func (a *api) SetContent(path, passphrase, content string) (err error) {
_, err = req.Post(a.ServerURL+"/"+path, content)
return
}
func (a *api) GetHash(path string) (res string, err error) {
var resp *req.Resp
if resp, err = req.Get(a.ServerURL + "/hash/" + path); err != nil {
return
}
res = resp.String()
return
}