/
main.go
106 lines (94 loc) · 2.12 KB
/
main.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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
package main
import (
"bufio"
"compress/zlib"
"context"
"log"
"net"
"os"
"strconv"
"strings"
"time"
_ "embed"
"github.com/owulveryck/goMarkableStream/certs"
"github.com/owulveryck/goMarkableStream/stream"
"github.com/sethvargo/go-envconfig"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials"
"google.golang.org/grpc/encoding/gzip"
)
type configuration struct {
BindAddr string `env:"RK_SERVER_BIND_ADDR,default=:2000"`
}
const (
screenWidth = 1872
screenHeight = 1404
// fbAddress = 4387048
)
func init() {
err := gzip.SetLevel(zlib.BestSpeed)
if err != nil {
panic(err)
}
}
func main() {
cert, err := certs.GetCertificateWrapper()
if err != nil {
log.Fatal(err)
}
grpcCreds := &callInfoAuthenticator{credentials.NewTLS(cert.ServerTLSConf)}
ctx, cancel := context.WithTimeout(context.Background(), time.Minute)
defer cancel()
var c configuration
if err := envconfig.Process(ctx, &c); err != nil {
log.Fatal(err)
}
pid := findPid()
if len(os.Args) == 2 {
pid = os.Args[1]
}
file, err := os.OpenFile("/proc/"+pid+"/mem", os.O_RDONLY, os.ModeDevice)
if err != nil {
log.Fatal("cannot open file: ", err)
}
defer file.Close()
addr, err := getPointer(pid)
if err != nil {
log.Fatal(err)
}
log.Println("listening on tcp " + c.BindAddr)
ln, err := net.Listen("tcp", c.BindAddr)
if err != nil {
log.Fatal(err)
}
defer ln.Close()
s := stream.NewServer(file, addr)
s.Start()
grpcServer := grpc.NewServer(grpc.Creds(grpcCreds))
stream.RegisterStreamServer(grpcServer, s)
if err := grpcServer.Serve(ln); err != nil {
log.Fatalf("failed to serve: %s", err)
}
}
func getPointer(pid string) (int64, error) {
file, err := os.OpenFile("/proc/"+pid+"/maps", os.O_RDONLY, os.ModeDevice)
if err != nil {
log.Fatal("cannot open file: ", err)
}
defer file.Close()
scanner := bufio.NewScanner(file)
scanner.Split(bufio.ScanWords)
scanAddr := false
var addr int64
for scanner.Scan() {
if scanAddr {
hex := strings.Split(scanner.Text(), "-")[0]
addr, err = strconv.ParseInt("0x"+hex, 0, 64)
break
}
if scanner.Text() == `/dev/fb0` {
scanAddr = true
}
}
return addr, err
}