-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathserver.go
80 lines (71 loc) · 1.62 KB
/
server.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
package main
import (
"bufio"
"crypto/sha256"
"encoding/hex"
"fmt"
"io/ioutil"
"log"
"net"
"os/exec"
"strconv"
"strings"
"github.com/ramantehlan/mateix/packages/command"
"github.com/ramantehlan/mateix/packages/e"
)
// GetHash is to get the hash of a file
func GetHash(path string) string {
hasher := sha256.New()
s, err := ioutil.ReadFile(path)
hasher.Write(s)
if err != nil {
log.Fatal(err)
}
return hex.EncodeToString(hasher.Sum(nil))
}
func listenToClinet(addr string, port int) net.Listener {
src := addr + ":" + strconv.Itoa(port)
server, err := net.Listen("tcp", src)
e.Check(err)
fmt.Printf("Listening on %s.\n", src)
return server
}
func server(action bool) {
if action {
// Start the server
fmt.Println("Starting server")
server := listenToClinet("0.0.0.0", 1248)
defer server.Close()
for {
conn, err := server.Accept()
e.Check(err)
go handleConnection(conn)
}
} else {
command.Execute(exec.Command("sudo", "pkill", "mateix"))
}
}
func handleConnection(conn net.Conn) {
remoteAddr := conn.RemoteAddr().String()
fmt.Println("Client connected from " + remoteAddr)
fileLoc, err := bufio.NewReader(conn).ReadString('\n')
fileLoc = strings.ReplaceAll(fileLoc, "\n", "")
e.Check(err)
dataFile := fileLoc + "/data"
conn.Write([]byte(GetHash(dataFile) + "\n"))
scanner := bufio.NewScanner(conn)
incomingData := ""
for {
ok := scanner.Scan()
if !ok {
break
}
incomingData += scanner.Text() + "\n"
}
if incomingData != "" {
d1 := []byte(incomingData)
err := ioutil.WriteFile(dataFile, d1, 0644)
e.Check(err)
}
fmt.Println("Client at " + remoteAddr + " disconnected.")
}