blob: fb1741561f16456ef2f8d99fe4c2959183437b3c [file] [log] [blame]
gio0eaf2712024-04-14 13:08:46 +04001package main
2
3import (
4 "encoding/json"
5 "flag"
6 "fmt"
7 "net"
8 "os"
9
10 "golang.org/x/crypto/ssh"
11
12 "github.com/go-git/go-billy/v5/osfs"
13 "github.com/go-git/go-git/v5"
14 gitssh "github.com/go-git/go-git/v5/plumbing/transport/ssh"
15 "github.com/go-git/go-git/v5/storage/memory"
16)
17
18var port = flag.Int("port", 3000, "Port to listen on")
19var repoAddr = flag.String("repo-addr", "", "Git repository address")
20var sshKey = flag.String("ssh-key", "", "Private SSH key to access Git repository")
21var appDir = flag.String("app-dir", "", "Path to store application repository locally")
22var runCfg = flag.String("run-cfg", "", "Run configuration")
23var manager = flag.String("manager", "", "Address of the manager")
24
25type Command struct {
26 Bin string `json:"bin"`
27 Args []string `json:"args"`
28}
29
30func CloneRepository(addr string, signer ssh.Signer, path string) error {
31 _, err := git.Clone(memory.NewStorage(), osfs.New(path, osfs.WithBoundOS()), &git.CloneOptions{
32 URL: addr,
33 Auth: &gitssh.PublicKeys{
34 User: "git",
35 Signer: signer,
36 HostKeyCallbackHelper: gitssh.HostKeyCallbackHelper{
37 HostKeyCallback: func(hostname string, remote net.Addr, key ssh.PublicKey) error {
38 // TODO(giolekva): verify server public key
39 fmt.Printf("--- %+v\n", ssh.MarshalAuthorizedKey(key))
40 return nil
41 },
42 },
43 },
44 RemoteName: "origin",
45 ReferenceName: "refs/heads/master",
46 Depth: 1,
47 InsecureSkipTLS: true,
48 })
49 return err
50}
51
52func main() {
53 flag.Parse()
54 self, ok := os.LookupEnv("SELF_IP")
55 if !ok {
56 panic("no SELF_IP")
57 }
58 key, err := os.ReadFile(*sshKey)
59 if err != nil {
60 panic(err)
61 }
62 signer, err := ssh.ParsePrivateKey(key)
63 if err != nil {
64 panic(err)
65 }
66 if err := CloneRepository(*repoAddr, signer, *appDir); err != nil {
67 panic(err)
68 }
69 r, err := os.Open(*runCfg)
70 if err != nil {
71 panic(err)
72 }
73 defer r.Close()
74 var cmds []Command
75 if err := json.NewDecoder(r).Decode(&cmds); err != nil {
76 panic(err)
77 }
78 s := NewServer(*port, *repoAddr, signer, *appDir, cmds, self, *manager)
79 s.Start()
80}