blob: ee2476aa619fa4bed2da7cfec8d06f8a4e0113d6 [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 },
gio03fd0c72024-06-18 12:31:42 +040044 RemoteName: "origin",
45 ReferenceName: "refs/heads/master",
46 Depth: 1,
47 RecurseSubmodules: git.DefaultSubmoduleRecursionDepth,
48 ShallowSubmodules: true,
49 InsecureSkipTLS: true,
gio0eaf2712024-04-14 13:08:46 +040050 })
51 return err
52}
53
54func main() {
55 flag.Parse()
56 self, ok := os.LookupEnv("SELF_IP")
57 if !ok {
58 panic("no SELF_IP")
59 }
60 key, err := os.ReadFile(*sshKey)
61 if err != nil {
62 panic(err)
63 }
64 signer, err := ssh.ParsePrivateKey(key)
65 if err != nil {
66 panic(err)
67 }
68 if err := CloneRepository(*repoAddr, signer, *appDir); err != nil {
69 panic(err)
70 }
71 r, err := os.Open(*runCfg)
72 if err != nil {
73 panic(err)
74 }
75 defer r.Close()
76 var cmds []Command
77 if err := json.NewDecoder(r).Decode(&cmds); err != nil {
78 panic(err)
79 }
80 s := NewServer(*port, *repoAddr, signer, *appDir, cmds, self, *manager)
81 s.Start()
82}