Merge branch 'distro' into protocol
# Conflicts: # cmd/indra/seed_rpc.go # cmd/indra/seed_serve.go # pkg/cfg/params.go
This commit is contained in:
@@ -57,11 +57,12 @@ func init() {
|
||||
|
||||
func initData() {
|
||||
|
||||
if dataDir == "" {
|
||||
if viper.GetString("data-dir") == "" {
|
||||
home, err := os.UserHomeDir()
|
||||
|
||||
cobra.CheckErr(err)
|
||||
|
||||
dataDir = home + "/indra/data"
|
||||
viper.Set("data-dir", home+"/.indra/data")
|
||||
}
|
||||
|
||||
}
|
||||
@@ -73,7 +74,7 @@ func initLogging() {
|
||||
home, err := os.UserHomeDir()
|
||||
cobra.CheckErr(err)
|
||||
|
||||
logsDir = home + "/indra/logs"
|
||||
logsDir = home + "/.indra/logs"
|
||||
}
|
||||
|
||||
log2.SetLogLevel(log2.GetLevelByString(viper.GetString("logs-level"), log2.Debug))
|
||||
|
||||
@@ -1,25 +1,90 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"git-indra.lan/indra-labs/indra/pkg/rpc"
|
||||
"git-indra.lan/indra-labs/indra/pkg/storage"
|
||||
"github.com/spf13/cobra"
|
||||
"github.com/spf13/viper"
|
||||
"golang.org/x/term"
|
||||
"google.golang.org/grpc"
|
||||
"os"
|
||||
"syscall"
|
||||
)
|
||||
|
||||
func init() {
|
||||
|
||||
// // Init flags belonging to the seed package
|
||||
// seed.InitFlags(seedServeCommand)
|
||||
|
||||
//// Init flags belonging to the seed package
|
||||
//seed.InitFlags(seedServeCommand)
|
||||
//
|
||||
// // Init flags belonging to the rpc package
|
||||
// rpc.InitFlags(seedServeCommand)
|
||||
|
||||
seedCmd.AddCommand(seedRPCCmd)
|
||||
//// Init flags belonging to the rpc package
|
||||
//rpc.InitFlags(seedServeCommand)
|
||||
|
||||
seedCommand.AddCommand(seedRPCCmd)
|
||||
|
||||
initUnlock(unlockRPCCmd)
|
||||
|
||||
seedRPCCmd.AddCommand(unlockRPCCmd)
|
||||
}
|
||||
|
||||
var seedRPCCmd = &cobra.Command{
|
||||
Use: "rpc",
|
||||
Short: "A list of commands for interacting with a seed",
|
||||
Long: `A list of commands for interacting with a seed.`,
|
||||
}
|
||||
|
||||
var (
|
||||
unlockTargetFlag = "target"
|
||||
)
|
||||
|
||||
var (
|
||||
unlockTarget string
|
||||
)
|
||||
|
||||
func initUnlock(cmd *cobra.Command) {
|
||||
|
||||
cmd.PersistentFlags().StringVarP(&unlockTarget, unlockTargetFlag, "",
|
||||
"unix:///tmp/indra.sock",
|
||||
"the url of the rpc server",
|
||||
)
|
||||
|
||||
viper.BindPFlag(unlockTargetFlag, cmd.PersistentFlags().Lookup(unlockTargetFlag))
|
||||
|
||||
}
|
||||
|
||||
var unlockRPCCmd = &cobra.Command{
|
||||
Use: "unlock",
|
||||
Short: "unlocks the encrypted storage",
|
||||
Long: `unlocks the encrypted storage.`,
|
||||
Run: func(cmd *cobra.Command, args []string) {
|
||||
|
||||
|
||||
var err error
|
||||
var conn *grpc.ClientConn
|
||||
|
||||
conn, err = rpc.Dial(viper.GetString("target"))
|
||||
|
||||
if err != nil {
|
||||
check(err)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
var password []byte
|
||||
|
||||
fmt.Print("Enter Encryption Key: ")
|
||||
password, err = term.ReadPassword(int(syscall.Stdin))
|
||||
fmt.Println()
|
||||
|
||||
u := storage.NewUnlockServiceClient(conn)
|
||||
|
||||
_, err = u.Unlock(context.Background(), &storage.UnlockRequest{
|
||||
Key: string(password),
|
||||
})
|
||||
|
||||
if err != nil {
|
||||
check(err)
|
||||
return
|
||||
}
|
||||
|
||||
},
|
||||
}
|
||||
|
||||
@@ -2,35 +2,24 @@ package main
|
||||
|
||||
import (
|
||||
"context"
|
||||
"os"
|
||||
"time"
|
||||
|
||||
"github.com/multiformats/go-multiaddr"
|
||||
"github.com/spf13/cobra"
|
||||
"github.com/spf13/viper"
|
||||
"github.com/tutorialedge/go-grpc-tutorial/chat"
|
||||
"google.golang.org/grpc"
|
||||
|
||||
"git-indra.lan/indra-labs/indra"
|
||||
"git-indra.lan/indra-labs/indra/pkg/interrupt"
|
||||
"git-indra.lan/indra-labs/indra/pkg/p2p"
|
||||
log2 "git-indra.lan/indra-labs/indra/pkg/proc/log"
|
||||
"git-indra.lan/indra-labs/indra/pkg/rpc"
|
||||
"git-indra.lan/indra-labs/indra/pkg/seed"
|
||||
)
|
||||
|
||||
var (
|
||||
err error
|
||||
"git-indra.lan/indra-labs/indra/pkg/storage"
|
||||
"github.com/spf13/cobra"
|
||||
"github.com/spf13/viper"
|
||||
)
|
||||
|
||||
func init() {
|
||||
|
||||
// Init flags belonging to the seed package
|
||||
seed.InitFlags(seedServeCommand)
|
||||
|
||||
// Init flags belonging to the rpc package
|
||||
|
||||
storage.InitFlags(seedServeCommand)
|
||||
p2p.InitFlags(seedServeCommand)
|
||||
rpc.InitFlags(seedServeCommand)
|
||||
|
||||
seedCmd.AddCommand(seedServeCommand)
|
||||
|
||||
seedCommand.AddCommand(seedServeCommand)
|
||||
}
|
||||
|
||||
var seedServeCommand = &cobra.Command{
|
||||
@@ -38,93 +27,22 @@ var seedServeCommand = &cobra.Command{
|
||||
Short: "Serves an instance of the seed node",
|
||||
Long: `Serves an instance of the seed node.`,
|
||||
Run: func(cmd *cobra.Command, args []string) {
|
||||
|
||||
|
||||
log.I.Ln("-- ", log2.App, "("+viper.GetString("network")+") -", indra.SemVer, "- Network Freedom. --")
|
||||
|
||||
log.I.Ln("running seed")
|
||||
|
||||
var ctx context.Context
|
||||
var cancel context.CancelFunc
|
||||
|
||||
ctx, cancel = context.WithCancel(context.Background())
|
||||
|
||||
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
|
||||
interrupt.AddHandler(cancel)
|
||||
|
||||
//
|
||||
// RPC
|
||||
//
|
||||
|
||||
rpc.RunWith(ctx, func(srv *grpc.Server) {
|
||||
chat.RegisterChatServiceServer(srv, &chat.Server{})
|
||||
})
|
||||
|
||||
|
||||
// Seed //
|
||||
|
||||
go seed.Run(ctx)
|
||||
|
||||
select {
|
||||
case <-rpc.CantStart():
|
||||
|
||||
log.I.Ln("issues starting the rpc server")
|
||||
log.I.Ln("attempting a graceful shutdown")
|
||||
|
||||
ctx, cancel = context.WithTimeout(context.Background(), 30*time.Second)
|
||||
|
||||
rpc.Shutdown(ctx)
|
||||
|
||||
select {
|
||||
case <-ctx.Done():
|
||||
|
||||
log.I.Ln("can't shutdown gracefully, exiting.")
|
||||
|
||||
os.Exit(1)
|
||||
|
||||
default:
|
||||
|
||||
log.I.Ln("graceful shutdown complete")
|
||||
|
||||
os.Exit(0)
|
||||
}
|
||||
|
||||
case <-rpc.IsReady():
|
||||
|
||||
log.I.Ln("rpc server is ready")
|
||||
case <-seed.IsShutdown():
|
||||
log.I.Ln("shutdown complete")
|
||||
}
|
||||
|
||||
rpc.Run(ctx)
|
||||
|
||||
//
|
||||
// P2P
|
||||
//
|
||||
|
||||
var config = seed.DefaultConfig
|
||||
|
||||
config.SetNetwork(viper.GetString("network"))
|
||||
|
||||
if config.PrivKey, err = seed.GetOrGeneratePrivKey(viper.GetString("key")); check(err) {
|
||||
return
|
||||
}
|
||||
|
||||
for _, listener := range viper.GetStringSlice("listen") {
|
||||
config.ListenAddresses = append(config.ListenAddresses, multiaddr.StringCast(listener))
|
||||
}
|
||||
|
||||
for _, seed := range viper.GetStringSlice("seed") {
|
||||
config.SeedAddresses = append(config.SeedAddresses, multiaddr.StringCast(seed))
|
||||
}
|
||||
|
||||
for _, connector := range viper.GetStringSlice("connect") {
|
||||
config.ConnectAddresses = append(config.ConnectAddresses, multiaddr.StringCast(connector))
|
||||
}
|
||||
|
||||
var srv *seed.Server
|
||||
|
||||
if srv, err = seed.New(config); check(err) {
|
||||
return
|
||||
}
|
||||
|
||||
if err = srv.Serve(); check(err) {
|
||||
return
|
||||
}
|
||||
|
||||
|
||||
log.I.Ln("-- fin --")
|
||||
|
||||
return
|
||||
},
|
||||
}
|
||||
|
||||
9
go.mod
9
go.mod
@@ -51,6 +51,7 @@ require (
|
||||
github.com/btcsuite/btcwallet/wtxmgr v1.5.0 // indirect
|
||||
github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd // indirect
|
||||
github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792 // indirect
|
||||
github.com/cespare/xxhash v1.1.0 // indirect
|
||||
github.com/cespare/xxhash/v2 v2.2.0 // indirect
|
||||
github.com/containerd/cgroups v1.0.4 // indirect
|
||||
github.com/containerd/containerd v1.6.15 // indirect
|
||||
@@ -58,10 +59,13 @@ require (
|
||||
github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c // indirect
|
||||
github.com/decred/dcrd/crypto/blake256 v1.0.0 // indirect
|
||||
github.com/decred/dcrd/lru v1.0.0 // indirect
|
||||
github.com/dgraph-io/badger/v3 v3.2103.5 // indirect
|
||||
github.com/dgraph-io/ristretto v0.1.1 // indirect
|
||||
github.com/docker/distribution v2.8.1+incompatible // indirect
|
||||
github.com/docker/docker-credential-helpers v0.7.0 // indirect
|
||||
github.com/docker/go-connections v0.4.0 // indirect
|
||||
github.com/docker/go-units v0.5.0 // indirect
|
||||
github.com/dustin/go-humanize v1.0.1 // indirect
|
||||
github.com/elastic/gosigar v0.14.2 // indirect
|
||||
github.com/emirpasic/gods v1.12.0 // indirect
|
||||
github.com/flynn/noise v1.0.0 // indirect
|
||||
@@ -71,10 +75,13 @@ require (
|
||||
github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0 // indirect
|
||||
github.com/godbus/dbus/v5 v5.1.0 // indirect
|
||||
github.com/gogo/protobuf v1.3.2 // indirect
|
||||
github.com/golang/glog v1.0.0 // indirect
|
||||
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
|
||||
github.com/golang/mock v1.6.0 // indirect
|
||||
github.com/golang/protobuf v1.5.2 // indirect
|
||||
github.com/golang/snappy v0.0.4 // indirect
|
||||
github.com/google/btree v1.0.1 // indirect
|
||||
github.com/google/flatbuffers v23.1.21+incompatible // indirect
|
||||
github.com/google/gopacket v1.1.19 // indirect
|
||||
github.com/google/pprof v0.0.0-20221203041831-ce31453925ec // indirect
|
||||
github.com/google/uuid v1.3.0 // indirect
|
||||
@@ -98,7 +105,7 @@ require (
|
||||
github.com/jbenet/goprocess v0.1.4 // indirect
|
||||
github.com/kevinburke/ssh_config v0.0.0-20190725054713-01f96b0aa0cd // indirect
|
||||
github.com/kkdai/bstream v1.0.0 // indirect
|
||||
github.com/klauspost/compress v1.15.12 // indirect
|
||||
github.com/klauspost/compress v1.15.15 // indirect
|
||||
github.com/klauspost/cpuid/v2 v2.2.1 // indirect
|
||||
github.com/koron/go-ssdp v0.0.3 // indirect
|
||||
github.com/kylelemons/godebug v1.1.0 // indirect
|
||||
|
||||
26
go.sum
26
go.sum
@@ -189,6 +189,7 @@ github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b/go.mod h1:obH5gd0Bsq
|
||||
github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0/go.mod h1:D/8v3kj0zr8ZAKg1AQ6crr+5VwKN5eIywRkfhyM/+dE=
|
||||
github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw=
|
||||
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
|
||||
github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko=
|
||||
github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
|
||||
github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
|
||||
github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
|
||||
@@ -305,6 +306,7 @@ github.com/containers/ocicrypt v1.1.0/go.mod h1:b8AOe0YR67uU8OqfVNcznfFpAzu3rdgU
|
||||
github.com/containers/ocicrypt v1.1.1/go.mod h1:Dm55fwWm1YZAjYRaJ94z2mfZikIyIN4B0oB3dj3jFxY=
|
||||
github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk=
|
||||
github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
|
||||
github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk=
|
||||
github.com/coreos/go-iptables v0.4.5/go.mod h1:/mVI274lEDI2ns62jHCDnCyBF9Iwsmekav8Dbxlm1MU=
|
||||
github.com/coreos/go-iptables v0.5.0/go.mod h1:/mVI274lEDI2ns62jHCDnCyBF9Iwsmekav8Dbxlm1MU=
|
||||
github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc=
|
||||
@@ -321,6 +323,7 @@ github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8
|
||||
github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
|
||||
github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
|
||||
github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
|
||||
github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE=
|
||||
github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
|
||||
github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
|
||||
github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
|
||||
@@ -349,8 +352,14 @@ github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0/go.mod h1:DZGJHZMqrU4JJqFAWUS2U
|
||||
github.com/decred/dcrd/lru v1.0.0 h1:Kbsb1SFDsIlaupWPwsPp+dkxiBY1frcS07PCPgotKz8=
|
||||
github.com/decred/dcrd/lru v1.0.0/go.mod h1:mxKOwFd7lFjN2GZYsiz/ecgqR6kkYAl+0pz0tEMk218=
|
||||
github.com/denverdino/aliyungo v0.0.0-20190125010748-a747050bb1ba/go.mod h1:dV8lFg6daOBZbT6/BDGIz6Y3WFGn8juu6G+CQ6LHtl0=
|
||||
github.com/dgraph-io/badger v1.6.2 h1:mNw0qs90GVgGGWylh0umH5iag1j6n/PeJtNvL6KY/x8=
|
||||
github.com/dgraph-io/badger/v3 v3.2103.5 h1:ylPa6qzbjYRQMU6jokoj4wzcaweHylt//CH0AKt0akg=
|
||||
github.com/dgraph-io/badger/v3 v3.2103.5/go.mod h1:4MPiseMeDQ3FNCYwRbbcBOGJLf5jsE0PPFzRiKjtcdw=
|
||||
github.com/dgraph-io/ristretto v0.1.1 h1:6CWw5tJNgpegArSHpNHJKldNeq03FQCwYvfMVWajOK8=
|
||||
github.com/dgraph-io/ristretto v0.1.1/go.mod h1:S1GPSBCYCIhmVNfcth17y2zZtQT6wzkzgwUve0VDWWA=
|
||||
github.com/dgrijalva/jwt-go v0.0.0-20170104182250-a601269ab70c/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
|
||||
github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
|
||||
github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw=
|
||||
github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no=
|
||||
github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E=
|
||||
github.com/docker/cli v0.0.0-20191017083524-a8ff7f821017/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8=
|
||||
@@ -381,6 +390,8 @@ github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZ
|
||||
github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE=
|
||||
github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
|
||||
github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
|
||||
github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY=
|
||||
github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto=
|
||||
github.com/elastic/gosigar v0.12.0/go.mod h1:iXRIGg2tLnu7LBdpqzyQfGDEidKCfWcCMS0WKyPWoMs=
|
||||
github.com/elastic/gosigar v0.14.2 h1:Dg80n8cr90OZ7x+bAax/QjoW/XqTI11RmA79ZwIm9/4=
|
||||
github.com/elastic/gosigar v0.14.2/go.mod h1:iXRIGg2tLnu7LBdpqzyQfGDEidKCfWcCMS0WKyPWoMs=
|
||||
@@ -466,6 +477,8 @@ github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXP
|
||||
github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
|
||||
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
|
||||
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
|
||||
github.com/golang/glog v1.0.0 h1:nfP3RFugxnNRyKgeWd4oI1nYvXpxrx8ck8ZrcizshdQ=
|
||||
github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4=
|
||||
github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
||||
github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
||||
github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
||||
@@ -500,12 +513,16 @@ github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw
|
||||
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
|
||||
github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=
|
||||
github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
|
||||
github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
|
||||
github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM=
|
||||
github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
|
||||
github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
|
||||
github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
|
||||
github.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4=
|
||||
github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA=
|
||||
github.com/google/flatbuffers v1.12.1/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8=
|
||||
github.com/google/flatbuffers v23.1.21+incompatible h1:bUqzx/MXCDxuS0hRJL2EfjyZL3uQrPbMocUa8zGqsTA=
|
||||
github.com/google/flatbuffers v23.1.21+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8=
|
||||
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
|
||||
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
|
||||
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
|
||||
@@ -667,8 +684,11 @@ github.com/kkdai/bstream v1.0.0 h1:Se5gHwgp2VT2uHfDrkbbgbgEvV9cimLELwrPJctSjg8=
|
||||
github.com/kkdai/bstream v1.0.0/go.mod h1:FDnDOHt5Yx4p3FaHcioFT0QjDOtgUpvjeZqAs+NVZZA=
|
||||
github.com/klauspost/compress v1.11.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=
|
||||
github.com/klauspost/compress v1.11.13/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=
|
||||
github.com/klauspost/compress v1.12.3/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg=
|
||||
github.com/klauspost/compress v1.15.12 h1:YClS/PImqYbn+UILDnqxQCZ3RehC9N318SU3kElDUEM=
|
||||
github.com/klauspost/compress v1.15.12/go.mod h1:QPwzmACJjUTFsnSHH934V6woptycfrDDJnH7hvFVbGM=
|
||||
github.com/klauspost/compress v1.15.15 h1:EF27CXIuDsYJ6mmvtBRlEuB2UVOqHG1tAXgZ7yIO+lw=
|
||||
github.com/klauspost/compress v1.15.15/go.mod h1:ZcK2JAFqKOpnBlxcLsJzYfrS9X1akm9fHZNnD9+Vo/4=
|
||||
github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
|
||||
github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
|
||||
github.com/klauspost/cpuid/v2 v2.2.1 h1:U33DW0aiEj633gHYw3LoDNfkDiYnE5Q8M/TKJn2f2jI=
|
||||
@@ -1060,6 +1080,7 @@ github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w=
|
||||
github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU=
|
||||
github.com/spf13/cobra v0.0.2-0.20171109065643-2da4a54c5cee/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
|
||||
github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
|
||||
github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU=
|
||||
github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE=
|
||||
github.com/spf13/cobra v1.6.1 h1:o94oiPyS4KD1mPy2fmcYYHHfCxLqYjJOhGsCHFZtEzA=
|
||||
github.com/spf13/cobra v1.6.1/go.mod h1:IOw/AERYS7UzyrGinqmz6HLUo219MORXGxhbaJUqzrY=
|
||||
@@ -1072,6 +1093,7 @@ github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnIn
|
||||
github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
|
||||
github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
|
||||
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
|
||||
github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s=
|
||||
github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE=
|
||||
github.com/spf13/viper v1.15.0 h1:js3yy885G8xwJa6iOISGFwd+qlUo5AvyXb7CiihdtiU=
|
||||
github.com/spf13/viper v1.15.0/go.mod h1:fFcTBJxvhhzSJiZy8n+PeW6t8l+KeT/uTARa0jHOQLA=
|
||||
@@ -1115,6 +1137,7 @@ github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1
|
||||
github.com/tutorialedge/go-grpc-tutorial v0.0.0-20200509091100-f8d1b5b15b01 h1:dVcYTEMB9QwRqslGxkvYGXI3fL7twjdbTTADm7J3TU8=
|
||||
github.com/tutorialedge/go-grpc-tutorial v0.0.0-20200509091100-f8d1b5b15b01/go.mod h1:LBdTyeyzGK4jRGHXkC3z2BFf/Fml8peKISp1OtHDmvs=
|
||||
github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc=
|
||||
github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0=
|
||||
github.com/urfave/cli v0.0.0-20171014202726-7bc6a0acffa5/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA=
|
||||
github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA=
|
||||
github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0=
|
||||
@@ -1198,6 +1221,7 @@ golang.org/x/crypto v0.0.0-20171113213409-9f005a07e0d3/go.mod h1:6SG95UA2DQfeDnf
|
||||
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
||||
golang.org/x/crypto v0.0.0-20181009213950-7c1a557ab941/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
||||
golang.org/x/crypto v0.0.0-20181030102418-4d3f4d9ffa16/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
||||
golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
||||
golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
||||
golang.org/x/crypto v0.0.0-20190219172222-a4c6cb3142f2/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||
@@ -1349,6 +1373,7 @@ golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5h
|
||||
golang.org/x/sys v0.0.0-20181029174526-d69651ed3497/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20190221075227-b4e8571b14e0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20190228124157-a34e9553db1e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
@@ -1444,6 +1469,7 @@ golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBc
|
||||
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20221010170243-090e33056c14/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU=
|
||||
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
|
||||
|
||||
@@ -1,10 +1,9 @@
|
||||
package cfg
|
||||
|
||||
import (
|
||||
"os"
|
||||
|
||||
"github.com/multiformats/go-multiaddr"
|
||||
|
||||
"os"
|
||||
|
||||
"git-indra.lan/indra-labs/indra"
|
||||
"git-indra.lan/indra-labs/indra/pkg/node"
|
||||
log2 "git-indra.lan/indra-labs/indra/pkg/proc/log"
|
||||
@@ -16,68 +15,68 @@ var (
|
||||
)
|
||||
|
||||
type Params struct {
|
||||
|
||||
|
||||
// Name defines a human-readable identifier for the network
|
||||
Name string
|
||||
|
||||
|
||||
// Net is a uint32 magic byte identifier for the network
|
||||
Net node.IndraNet
|
||||
|
||||
|
||||
// DefaultPort is the default port for p2p listening
|
||||
DefaultPort string
|
||||
|
||||
|
||||
// DNSSeedAddresses is a list of DNS hostnames used to bootstrap a new node on the network
|
||||
DNSSeedAddresses []*DNSSeedAddress
|
||||
DNSSeedAddresses []*SeedAddress
|
||||
}
|
||||
|
||||
func SelectNetworkParams(network string) *Params {
|
||||
|
||||
|
||||
if network == "mainnet" {
|
||||
return MainNetServerParams
|
||||
}
|
||||
|
||||
|
||||
if network == "testnet" {
|
||||
return TestNetServerParams
|
||||
}
|
||||
|
||||
|
||||
if network == "simnet" {
|
||||
return SimnetServerParams
|
||||
}
|
||||
|
||||
|
||||
panic("invalid network, exiting...")
|
||||
|
||||
|
||||
os.Exit(1)
|
||||
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (self *Params) ParseSeedMultiAddresses() (addresses []multiaddr.Multiaddr, err error) {
|
||||
|
||||
|
||||
var adr multiaddr.Multiaddr
|
||||
|
||||
|
||||
addresses = []multiaddr.Multiaddr{}
|
||||
|
||||
|
||||
for _, addr := range self.DNSSeedAddresses {
|
||||
|
||||
|
||||
if adr, err = multiaddr.NewMultiaddr("/dns4/" + addr.DNSAddress + "/tcp/" + self.DefaultPort + "/p2p/" + addr.ID); check(err) {
|
||||
return
|
||||
}
|
||||
|
||||
|
||||
addresses = append(addresses, adr)
|
||||
}
|
||||
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
var MainNetServerParams = &Params{
|
||||
|
||||
|
||||
Name: "mainnet",
|
||||
|
||||
|
||||
Net: node.MainNet,
|
||||
|
||||
DefaultPort: "8336",
|
||||
|
||||
DNSSeedAddresses: []*DNSSeedAddress{
|
||||
|
||||
DefaultPort: "8337",
|
||||
|
||||
DNSSeedAddresses: []*SeedAddress{
|
||||
NewSeedAddress("seed0.indra.org", "12D3KooWCfTmWavthiVV7Vkm9eouCdiLdGnhd2PShQ2hiu2VVU6Q"),
|
||||
NewSeedAddress("seed1.indra.org", "12D3KooWASwYWP2gMh581EQG25nauvWfwAU3g6v8TugEoEzL5Ags"),
|
||||
NewSeedAddress("seed2.indra.org", "12D3KooWFW7k2YcxjZrqWXJhmoCTNiNtgjLkEUeqgvZRAF3xHZjs"),
|
||||
@@ -90,14 +89,14 @@ var MainNetServerParams = &Params{
|
||||
}
|
||||
|
||||
var TestNetServerParams = &Params{
|
||||
|
||||
|
||||
Name: "testnet",
|
||||
|
||||
|
||||
Net: node.TestNet,
|
||||
|
||||
|
||||
DefaultPort: "58337",
|
||||
|
||||
DNSSeedAddresses: []*DNSSeedAddress{
|
||||
|
||||
DNSSeedAddresses: []*SeedAddress{
|
||||
// NewSeedAddress("seed0.indra.org", "12D3KooWCfTmWavthiVV7Vkm9eouCdiLdGnhd2PShQ2hiu2VVU6Q"),
|
||||
// NewSeedAddress("seed1.indra.org", "12D3KooWASwYWP2gMh581EQG25nauvWfwAU3g6v8TugEoEzL5Ags"),
|
||||
// NewSeedAddress("seed2.indra.org", "12D3KooWFW7k2YcxjZrqWXJhmoCTNiNtgjLkEUeqgvZRAF3xHZjs"),
|
||||
@@ -110,15 +109,15 @@ var TestNetServerParams = &Params{
|
||||
}
|
||||
|
||||
var SimnetServerParams = &Params{
|
||||
|
||||
|
||||
Name: "simnet",
|
||||
|
||||
|
||||
Net: node.SimNet,
|
||||
|
||||
|
||||
DefaultPort: "62134",
|
||||
|
||||
|
||||
// Should be passed via --seed
|
||||
DNSSeedAddresses: []*DNSSeedAddress{
|
||||
DNSSeedAddresses: []*SeedAddress{
|
||||
NewSeedAddress("seed0", "16Uiu2HAmCxWoKp4vs7xrmzbScHEhUK7trCgCPhKPZRBiUvSxS7xA"),
|
||||
NewSeedAddress("seed1", "16Uiu2HAmTKk6BvJFPmcQ6q92XgvQ4ZPu1AVjQxMvCfM4you9Zyvc"),
|
||||
NewSeedAddress("seed2", "16Uiu2HAm8tCAW7D9WFLxkda52R73nSk9yBCFW8uwA4MZPzHYVhnW"),
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
package cfg
|
||||
|
||||
type DNSSeedAddress struct {
|
||||
type SeedAddress struct {
|
||||
|
||||
// ID is the p2p identifier
|
||||
ID string
|
||||
@@ -9,9 +9,9 @@ type DNSSeedAddress struct {
|
||||
DNSAddress string
|
||||
}
|
||||
|
||||
func NewSeedAddress(dns string, id string) *DNSSeedAddress {
|
||||
func NewSeedAddress(dns string, id string) *SeedAddress {
|
||||
|
||||
return &DNSSeedAddress{
|
||||
return &SeedAddress{
|
||||
ID: id,
|
||||
DNSAddress: dns,
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
package seed
|
||||
package p2p
|
||||
|
||||
import (
|
||||
"git-indra.lan/indra-labs/indra/pkg/cfg"
|
||||
57
pkg/p2p/configure.go
Normal file
57
pkg/p2p/configure.go
Normal file
@@ -0,0 +1,57 @@
|
||||
package p2p
|
||||
|
||||
import (
|
||||
"github.com/multiformats/go-multiaddr"
|
||||
"github.com/spf13/viper"
|
||||
)
|
||||
|
||||
func configure() {
|
||||
configureSeeds()
|
||||
}
|
||||
|
||||
func configureKey() {
|
||||
|
||||
if viper.GetString(keyFlag) == "" {
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
func configureListeners() {
|
||||
|
||||
if len(viper.GetString(listenFlag)) > 0 {
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
func configureSeeds() {
|
||||
|
||||
if len(viper.GetStringSlice(connectFlag)) > 0 {
|
||||
|
||||
log.I.Ln("connect only detected, using only the connect seed addresses")
|
||||
|
||||
for _, connector := range viper.GetStringSlice(connectFlag) {
|
||||
seedAddresses = append(seedAddresses, multiaddr.StringCast(connector))
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
var err error
|
||||
|
||||
if seedAddresses, err = netParams.ParseSeedMultiAddresses(); err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
if len(viper.GetStringSlice("seed")) > 0 {
|
||||
|
||||
log.I.Ln("found", len(viper.GetStringSlice("seed")), "additional seeds.")
|
||||
|
||||
for _, seed := range viper.GetStringSlice("seed") {
|
||||
seedAddresses = append(seedAddresses, multiaddr.StringCast(seed))
|
||||
}
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
53
pkg/p2p/flags.go
Normal file
53
pkg/p2p/flags.go
Normal file
@@ -0,0 +1,53 @@
|
||||
package p2p
|
||||
|
||||
import (
|
||||
"github.com/spf13/cobra"
|
||||
"github.com/spf13/viper"
|
||||
)
|
||||
|
||||
var (
|
||||
keyFlag = "p2p-key"
|
||||
listenFlag = "p2p-listen"
|
||||
seedFlag = "p2p-seed"
|
||||
connectFlag = "p2p-connect"
|
||||
)
|
||||
|
||||
var (
|
||||
key string
|
||||
listeners []string
|
||||
seeds []string
|
||||
connectors []string
|
||||
)
|
||||
|
||||
func InitFlags(cmd *cobra.Command) {
|
||||
|
||||
cmd.Flags().StringVarP(&key, keyFlag, "",
|
||||
"",
|
||||
"the base58 encoded private key for the seed node")
|
||||
|
||||
viper.BindPFlag(keyFlag, cmd.Flags().Lookup(keyFlag))
|
||||
|
||||
cmd.PersistentFlags().StringSliceVarP(&listeners, listenFlag, "",
|
||||
[]string{
|
||||
"/ip4/127.0.0.1/tcp/8337",
|
||||
"/ip6/::1/tcp/8337",
|
||||
},
|
||||
"binds to an interface",
|
||||
)
|
||||
|
||||
viper.BindPFlag(listenFlag, cmd.PersistentFlags().Lookup(listenFlag))
|
||||
|
||||
cmd.PersistentFlags().StringSliceVarP(&seeds, seedFlag, "",
|
||||
[]string{},
|
||||
"adds an additional seed connection (e.g /dns4/seed0.indra.org/tcp/8337/p2p/<pub_key>)",
|
||||
)
|
||||
|
||||
viper.BindPFlag(seedFlag, cmd.PersistentFlags().Lookup(seedFlag))
|
||||
|
||||
cmd.PersistentFlags().StringSliceVarP(&connectors, connectFlag, "",
|
||||
[]string{},
|
||||
"connects only to the seed multi-addresses specified",
|
||||
)
|
||||
|
||||
viper.BindPFlag(connectFlag, cmd.PersistentFlags().Lookup(connectFlag))
|
||||
}
|
||||
11
pkg/p2p/log.go
Normal file
11
pkg/p2p/log.go
Normal file
@@ -0,0 +1,11 @@
|
||||
package p2p
|
||||
|
||||
import (
|
||||
"git-indra.lan/indra-labs/indra"
|
||||
log2 "git-indra.lan/indra-labs/indra/pkg/proc/log"
|
||||
)
|
||||
|
||||
var (
|
||||
log = log2.GetLogger(indra.PathBase)
|
||||
check = log.E.Chk
|
||||
)
|
||||
@@ -1,7 +1,10 @@
|
||||
package seed
|
||||
package p2p
|
||||
|
||||
import (
|
||||
"context"
|
||||
"git-indra.lan/indra-labs/indra/pkg/cfg"
|
||||
"git-indra.lan/indra-labs/indra/pkg/p2p/metrics"
|
||||
"github.com/libp2p/go-libp2p/core/crypto"
|
||||
"time"
|
||||
|
||||
"github.com/libp2p/go-libp2p"
|
||||
@@ -11,19 +14,25 @@ import (
|
||||
"git-indra.lan/indra-labs/indra"
|
||||
"git-indra.lan/indra-labs/indra/pkg/interrupt"
|
||||
"git-indra.lan/indra-labs/indra/pkg/p2p/introducer"
|
||||
log2 "git-indra.lan/indra-labs/indra/pkg/proc/log"
|
||||
"git-indra.lan/indra-labs/indra/pkg/seed/metrics"
|
||||
)
|
||||
|
||||
var (
|
||||
log = log2.GetLogger(indra.PathBase)
|
||||
check = log.E.Chk
|
||||
)
|
||||
|
||||
var (
|
||||
userAgent = "/indra:" + indra.SemVer + "/"
|
||||
)
|
||||
|
||||
var (
|
||||
privKey crypto.PrivKey
|
||||
p2pHost host.Host
|
||||
seedAddresses []multiaddr.Multiaddr
|
||||
listenAddresses []multiaddr.Multiaddr
|
||||
netParams *cfg.Params
|
||||
)
|
||||
|
||||
func init() {
|
||||
seedAddresses = []multiaddr.Multiaddr{}
|
||||
listenAddresses = []multiaddr.Multiaddr{}
|
||||
}
|
||||
|
||||
type Server struct {
|
||||
context.Context
|
||||
|
||||
@@ -32,13 +41,6 @@ type Server struct {
|
||||
host host.Host
|
||||
}
|
||||
|
||||
func (srv *Server) Restart() (err error) {
|
||||
|
||||
log.I.Ln("restarting the server.")
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (srv *Server) Shutdown() (err error) {
|
||||
|
||||
if err = srv.host.Close(); check(err) {
|
||||
@@ -73,14 +75,6 @@ func (srv *Server) Serve() (err error) {
|
||||
|
||||
go metrics.HostStatus(ctx, srv.host)
|
||||
|
||||
//var client *rpc.RPCClient
|
||||
//
|
||||
//if client, err = rpc.NewClient(rpc.DefaultClientConfig); check(err) {
|
||||
// return err
|
||||
//}
|
||||
//
|
||||
//client.Start()
|
||||
|
||||
select {
|
||||
|
||||
case <-ctx.Done():
|
||||
@@ -1,49 +1,11 @@
|
||||
package seed
|
||||
package p2p
|
||||
|
||||
import (
|
||||
"github.com/btcsuite/btcd/btcutil/base58"
|
||||
"github.com/btcsuite/btcd/btcutil/bech32"
|
||||
"github.com/libp2p/go-libp2p/core/crypto"
|
||||
"github.com/spf13/viper"
|
||||
)
|
||||
|
||||
func bech32encode(key crypto.PrivKey) (keyStr string, err error) {
|
||||
|
||||
var raw []byte
|
||||
|
||||
if raw, err = key.Raw(); check(err) {
|
||||
return
|
||||
}
|
||||
|
||||
var conv []byte
|
||||
|
||||
if conv, err = bech32.ConvertBits(raw, 8, 5, true); check(err) {
|
||||
return
|
||||
}
|
||||
|
||||
if keyStr, err = bech32.Encode("ind", conv); check(err) {
|
||||
return
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
func bech32decode(keyStr string) (privKey crypto.PrivKey, err error) {
|
||||
|
||||
// var hnd string
|
||||
var key []byte
|
||||
|
||||
if _, key, err = bech32.Decode(keyStr); check(err) {
|
||||
return
|
||||
}
|
||||
|
||||
if privKey, err = crypto.UnmarshalSecp256k1PrivateKey(key); check(err) {
|
||||
return
|
||||
}
|
||||
|
||||
return privKey, nil
|
||||
}
|
||||
|
||||
func GeneratePrivKey() (privKey crypto.PrivKey) {
|
||||
|
||||
var err error
|
||||
@@ -89,7 +51,7 @@ func GetOrGeneratePrivKey(key string) (privKey crypto.PrivKey, err error) {
|
||||
return
|
||||
}
|
||||
|
||||
viper.Set("key", key)
|
||||
viper.Set(keyFlag, key)
|
||||
|
||||
return
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
package seed
|
||||
package p2p
|
||||
|
||||
import (
|
||||
"crypto/rand"
|
||||
@@ -1,15 +1,11 @@
|
||||
package rpc
|
||||
|
||||
import (
|
||||
"context"
|
||||
"github.com/tutorialedge/go-grpc-tutorial/chat"
|
||||
"golang.zx2c4.com/wireguard/conn"
|
||||
"golang.zx2c4.com/wireguard/device"
|
||||
"golang.zx2c4.com/wireguard/tun"
|
||||
"golang.zx2c4.com/wireguard/tun/netstack"
|
||||
"google.golang.org/grpc"
|
||||
"net/netip"
|
||||
"os"
|
||||
"strconv"
|
||||
)
|
||||
|
||||
@@ -27,8 +23,8 @@ func getNetworkInstance(opts *dialOptions) (net *netstack.Net, err error) {
|
||||
|
||||
deviceConf := "" +
|
||||
"public_key=" + opts.peerPubKey.HexString() + "\n" +
|
||||
"endpoint=0.0.0.0:18222" + "\n" +
|
||||
"allowed_ip=" + rpcEndpointIp + "/32\n" +
|
||||
"endpoint=" + opts.endpoint.String() + "\n" +
|
||||
"allowed_ip=" + opts.rpcEndpoint.Address() + "/32\n" +
|
||||
"persistent_keepalive_interval=" + strconv.Itoa(opts.keepAliveInterval) + "\n"
|
||||
|
||||
if err = dev.IpcSet(deviceConf); check(err) {
|
||||
@@ -37,34 +33,3 @@ func getNetworkInstance(opts *dialOptions) (net *netstack.Net, err error) {
|
||||
|
||||
return net, nil
|
||||
}
|
||||
|
||||
func Run(ctx context.Context) {
|
||||
|
||||
var err error
|
||||
var conn *grpc.ClientConn
|
||||
|
||||
//conn, err = Dial("unix:///tmp/indra.sock")
|
||||
|
||||
conn, err = DialContext(ctx,
|
||||
"noise://0.0.0.0:18222",
|
||||
WithPrivateKey("Aj9CfbE1pXEVxPfjSaTwdY3B4kYHbwsTSyT3nrc34ATN"),
|
||||
WithPeer("G52UmsQpUmN2zFMkJaP9rwCvqQJzi1yHKA9RTrLJTk9f"),
|
||||
WithKeepAliveInterval(5),
|
||||
)
|
||||
|
||||
if err != nil {
|
||||
check(err)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
c := chat.NewChatServiceClient(conn)
|
||||
|
||||
response, err := c.SayHello(context.Background(), &chat.Message{Body: "Hello From Client!"})
|
||||
|
||||
if err != nil {
|
||||
check(err)
|
||||
return
|
||||
}
|
||||
|
||||
log.I.F(response.Body)
|
||||
}
|
||||
|
||||
@@ -28,7 +28,12 @@ func DialContext(ctx context.Context, target string, opts ...DialOption) (conn *
|
||||
return nil, errors.New("Unsupported protocol. Only unix:// or noise://")
|
||||
}
|
||||
|
||||
dialOpts := &dialOptions{peerRPCIP: "192.168.37.2", mtu: 1420}
|
||||
dialOpts := &dialOptions{
|
||||
endpoint: EndpointString(target),
|
||||
rpcEndpoint: EndpointString("192.168.37.1:80"),
|
||||
peerRPCIP: "192.168.37.2",
|
||||
mtu: 1420,
|
||||
}
|
||||
|
||||
for _, opt := range opts {
|
||||
opt.apply(dialOpts)
|
||||
@@ -41,7 +46,7 @@ func DialContext(ctx context.Context, target string, opts ...DialOption) (conn *
|
||||
}
|
||||
|
||||
return grpc.DialContext(ctx,
|
||||
rpcEndpointIp+":"+rpcEndpointPort,
|
||||
dialOpts.rpcEndpoint.String(),
|
||||
grpc.WithTransportCredentials(insecure.NewCredentials()),
|
||||
grpc.WithContextDialer(func(ctx context.Context, address string) (net.Conn, error) {
|
||||
return network.DialContext(ctx, "tcp4", address)
|
||||
|
||||
@@ -3,6 +3,8 @@ package rpc
|
||||
// dialOptions configure a Dial call. dialOptions are set by the DialOption
|
||||
// values passed to Dial.
|
||||
type dialOptions struct {
|
||||
endpoint Endpoint
|
||||
rpcEndpoint Endpoint
|
||||
key RPCPrivateKey
|
||||
peerPubKey RPCPublicKey
|
||||
peerRPCIP string
|
||||
|
||||
46
pkg/rpc/endpoint.go
Normal file
46
pkg/rpc/endpoint.go
Normal file
@@ -0,0 +1,46 @@
|
||||
package rpc
|
||||
|
||||
import "strings"
|
||||
|
||||
type Endpoint string
|
||||
|
||||
func (e Endpoint) Address() string {
|
||||
|
||||
before, _, found := strings.Cut(string(e), ":")
|
||||
|
||||
if !found {
|
||||
return ""
|
||||
}
|
||||
|
||||
return before
|
||||
}
|
||||
|
||||
func (e Endpoint) Port() string {
|
||||
|
||||
_, after, found := strings.Cut(string(e), ":")
|
||||
|
||||
if !found {
|
||||
return ""
|
||||
}
|
||||
|
||||
return after
|
||||
}
|
||||
|
||||
func (e Endpoint) String() string {
|
||||
return string(e)
|
||||
}
|
||||
|
||||
func EndpointString(endpoint string) (ep Endpoint) {
|
||||
|
||||
_, after, found := strings.Cut(string(endpoint), "//")
|
||||
|
||||
if !found {
|
||||
ep = Endpoint(endpoint)
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
ep = Endpoint(after)
|
||||
|
||||
return
|
||||
}
|
||||
11
pkg/rpc/examples/log.go
Normal file
11
pkg/rpc/examples/log.go
Normal file
@@ -0,0 +1,11 @@
|
||||
package examples
|
||||
|
||||
import (
|
||||
"git-indra.lan/indra-labs/indra"
|
||||
log2 "git-indra.lan/indra-labs/indra/pkg/proc/log"
|
||||
)
|
||||
|
||||
var (
|
||||
log = log2.GetLogger(indra.PathBase)
|
||||
check = log.E.Chk
|
||||
)
|
||||
38
pkg/rpc/examples/tunnel_hello.go
Normal file
38
pkg/rpc/examples/tunnel_hello.go
Normal file
@@ -0,0 +1,38 @@
|
||||
package examples
|
||||
|
||||
import (
|
||||
"context"
|
||||
"git-indra.lan/indra-labs/indra/pkg/rpc"
|
||||
"github.com/tutorialedge/go-grpc-tutorial/chat"
|
||||
"google.golang.org/grpc"
|
||||
"os"
|
||||
)
|
||||
|
||||
func TunnelHello(ctx context.Context) {
|
||||
|
||||
var err error
|
||||
var conn *grpc.ClientConn
|
||||
|
||||
conn, err = rpc.DialContext(ctx,
|
||||
"noise://[::1]:18222",
|
||||
rpc.WithPrivateKey("Aj9CfbE1pXEVxPfjSaTwdY3B4kYHbwsTSyT3nrc34ATN"),
|
||||
rpc.WithPeer("G52UmsQpUmN2zFMkJaP9rwCvqQJzi1yHKA9RTrLJTk9f"),
|
||||
rpc.WithKeepAliveInterval(5),
|
||||
)
|
||||
|
||||
if err != nil {
|
||||
check(err)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
c := chat.NewChatServiceClient(conn)
|
||||
|
||||
response, err := c.SayHello(context.Background(), &chat.Message{Body: "Hello From Client!"})
|
||||
|
||||
if err != nil {
|
||||
check(err)
|
||||
return
|
||||
}
|
||||
|
||||
log.I.F(response.Body)
|
||||
}
|
||||
33
pkg/rpc/examples/unix_hello.go
Normal file
33
pkg/rpc/examples/unix_hello.go
Normal file
@@ -0,0 +1,33 @@
|
||||
package examples
|
||||
|
||||
import (
|
||||
"context"
|
||||
"git-indra.lan/indra-labs/indra/pkg/rpc"
|
||||
"github.com/tutorialedge/go-grpc-tutorial/chat"
|
||||
"google.golang.org/grpc"
|
||||
"os"
|
||||
)
|
||||
|
||||
func UnixHello(ctx context.Context) {
|
||||
|
||||
var err error
|
||||
var conn *grpc.ClientConn
|
||||
|
||||
conn, err = rpc.Dial("unix:///tmp/indra.sock")
|
||||
|
||||
if err != nil {
|
||||
check(err)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
c := chat.NewChatServiceClient(conn)
|
||||
|
||||
response, err := c.SayHello(context.Background(), &chat.Message{Body: "Hello From Client!"})
|
||||
|
||||
if err != nil {
|
||||
check(err)
|
||||
return
|
||||
}
|
||||
|
||||
log.I.F(response.Body)
|
||||
}
|
||||
33
pkg/rpc/examples/unix_unlock.go
Normal file
33
pkg/rpc/examples/unix_unlock.go
Normal file
@@ -0,0 +1,33 @@
|
||||
package examples
|
||||
|
||||
import (
|
||||
"context"
|
||||
"git-indra.lan/indra-labs/indra/pkg/rpc"
|
||||
"git-indra.lan/indra-labs/indra/pkg/storage"
|
||||
"google.golang.org/grpc"
|
||||
"os"
|
||||
)
|
||||
|
||||
func UnixUnlock(ctx context.Context) {
|
||||
|
||||
var err error
|
||||
var conn *grpc.ClientConn
|
||||
|
||||
conn, err = rpc.Dial("unix:///tmp/indra.sock")
|
||||
|
||||
if err != nil {
|
||||
check(err)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
u := storage.NewUnlockServiceClient(conn)
|
||||
|
||||
_, err = u.Unlock(ctx, &storage.UnlockRequest{
|
||||
Key: "979nrx9ry9Re6UqWXYaGqLEne8NS7TzgHFiS8KARABV8",
|
||||
})
|
||||
|
||||
if err != nil {
|
||||
check(err)
|
||||
return
|
||||
}
|
||||
}
|
||||
@@ -11,8 +11,8 @@ func init() {
|
||||
|
||||
var (
|
||||
server *grpc.Server
|
||||
startupErrors = make(chan error)
|
||||
isReady = make(chan bool)
|
||||
startupErrors = make(chan error, 128)
|
||||
isReady = make(chan bool, 1)
|
||||
)
|
||||
|
||||
func RunWith(ctx context.Context, r func(srv *grpc.Server)) {
|
||||
@@ -59,8 +59,6 @@ func Start(ctx context.Context) {
|
||||
|
||||
func Shutdown(ctx context.Context) {
|
||||
|
||||
defer ctx.Done()
|
||||
|
||||
log.I.Ln("shutting down rpc server")
|
||||
|
||||
stopUnixSocket()
|
||||
|
||||
@@ -1,25 +0,0 @@
|
||||
package seed
|
||||
|
||||
import (
|
||||
"github.com/spf13/cobra"
|
||||
"github.com/spf13/viper"
|
||||
)
|
||||
|
||||
var (
|
||||
key string
|
||||
listeners []string
|
||||
seeds []string
|
||||
connectors []string
|
||||
)
|
||||
|
||||
func InitFlags(cmd *cobra.Command) {
|
||||
cmd.PersistentFlags().StringVarP(&key, "key", "k", "", "the base58 encoded private key for the seed node")
|
||||
cmd.PersistentFlags().StringSliceVarP(&listeners, "listen", "l", []string{"/ip4/127.0.0.1/tcp/8337", "/ip6/::1/tcp/8337"}, "binds to an interface")
|
||||
cmd.PersistentFlags().StringSliceVarP(&seeds, "seed", "s", []string{}, "adds an additional seed connection (e.g /dns4/seed0.indra.org/tcp/8337/p2p/<pub_key>)")
|
||||
cmd.PersistentFlags().StringSliceVarP(&connectors, "connect", "c", []string{}, "connects only to the seed multi-addresses specified")
|
||||
|
||||
viper.BindPFlag("key", cmd.PersistentFlags().Lookup("key"))
|
||||
viper.BindPFlag("listen", cmd.PersistentFlags().Lookup("listen"))
|
||||
viper.BindPFlag("seed", cmd.PersistentFlags().Lookup("seed"))
|
||||
viper.BindPFlag("connect", cmd.PersistentFlags().Lookup("connect"))
|
||||
}
|
||||
11
pkg/seed/log.go
Normal file
11
pkg/seed/log.go
Normal file
@@ -0,0 +1,11 @@
|
||||
package seed
|
||||
|
||||
import (
|
||||
"git-indra.lan/indra-labs/indra"
|
||||
log2 "git-indra.lan/indra-labs/indra/pkg/proc/log"
|
||||
)
|
||||
|
||||
var (
|
||||
log = log2.GetLogger(indra.PathBase)
|
||||
check = log.E.Chk
|
||||
)
|
||||
80
pkg/seed/proc.go
Normal file
80
pkg/seed/proc.go
Normal file
@@ -0,0 +1,80 @@
|
||||
package seed
|
||||
|
||||
import (
|
||||
"context"
|
||||
"git-indra.lan/indra-labs/indra/pkg/storage"
|
||||
"sync"
|
||||
)
|
||||
|
||||
var (
|
||||
inUse sync.Mutex
|
||||
)
|
||||
|
||||
var (
|
||||
startupErrors = make(chan error, 32)
|
||||
isReadyChan = make(chan bool, 1)
|
||||
isShutdownChan = make(chan bool, 1)
|
||||
)
|
||||
|
||||
func CantStart() chan error {
|
||||
return startupErrors
|
||||
}
|
||||
|
||||
func IsReady() chan bool {
|
||||
return isReadyChan
|
||||
}
|
||||
|
||||
func IsShutdown() chan bool {
|
||||
return isShutdownChan
|
||||
}
|
||||
|
||||
func Shutdown() {
|
||||
|
||||
log.I.Ln("shutting down seed")
|
||||
|
||||
err := storage.Shutdown()
|
||||
check(err)
|
||||
|
||||
isShutdownChan <- true
|
||||
}
|
||||
|
||||
func Run(ctx context.Context) {
|
||||
|
||||
if !inUse.TryLock() {
|
||||
log.E.Ln("seed is in use")
|
||||
return
|
||||
}
|
||||
|
||||
log.I.Ln("running seed")
|
||||
|
||||
var err error
|
||||
|
||||
go storage.Run(ctx)
|
||||
|
||||
signals:
|
||||
for {
|
||||
select {
|
||||
case err = <-CantStart():
|
||||
log.E.Ln("startup error:", err)
|
||||
return
|
||||
case <-storage.IsLocked():
|
||||
|
||||
log.I.Ln("storage is locked, waiting for unlock")
|
||||
|
||||
//go rpc.RunWith(ctx, func(srv *grpc.Server) {
|
||||
// storage.RegisterUnlockServiceServer(srv, storage.NewUnlockService())
|
||||
//})
|
||||
|
||||
// Run RPC unlock
|
||||
case <-storage.IsReady():
|
||||
break signals
|
||||
case <-ctx.Done():
|
||||
Shutdown()
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
log.I.Ln("seed is ready")
|
||||
|
||||
isReadyChan <- true
|
||||
}
|
||||
160
pkg/storage/cmd.go
Normal file
160
pkg/storage/cmd.go
Normal file
@@ -0,0 +1,160 @@
|
||||
package storage
|
||||
|
||||
import (
|
||||
"github.com/spf13/viper"
|
||||
"os"
|
||||
"strings"
|
||||
)
|
||||
|
||||
var (
|
||||
isNewKey bool
|
||||
isNewDB bool
|
||||
isLocked bool
|
||||
key Key
|
||||
)
|
||||
|
||||
func configure() {
|
||||
|
||||
log.I.Ln("initializing storage")
|
||||
|
||||
configureDirPath()
|
||||
configureFile()
|
||||
configureKey()
|
||||
}
|
||||
|
||||
func configureKey() {
|
||||
|
||||
log.I.Ln("looking for encryption key")
|
||||
|
||||
var err error
|
||||
|
||||
if viper.GetString(storeKeyFlag) != "" {
|
||||
|
||||
log.I.Ln("found key")
|
||||
|
||||
key.Decode(viper.GetString(storeKeyFlag))
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
log.I.Ln("no key found, checking for keyfile")
|
||||
|
||||
if viper.GetString(storeKeyFileFlag) != "" {
|
||||
|
||||
var fileInfo os.FileInfo
|
||||
|
||||
if fileInfo, err = os.Stat(viper.GetString(storeKeyFileFlag)); err != nil {
|
||||
startupErrors <- err
|
||||
return
|
||||
}
|
||||
|
||||
log.I.Ln("keyfile found")
|
||||
|
||||
if fileInfo.Mode() != 0600 {
|
||||
log.W.Ln("keyfile permissions are too open:", fileInfo.Mode())
|
||||
log.W.Ln("It is recommended that you change them to 0600")
|
||||
}
|
||||
|
||||
var keyBytes []byte
|
||||
|
||||
if keyBytes, err = os.ReadFile(viper.GetString(storeKeyFileFlag)); err != nil {
|
||||
startupErrors <- err
|
||||
return
|
||||
}
|
||||
|
||||
key.Decode(string(keyBytes))
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
if !isNewDB {
|
||||
|
||||
log.I.Ln("no keyfile found")
|
||||
|
||||
isLocked = true
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
log.I.Ln("no keyfile found, generating a new key")
|
||||
|
||||
isNewKey = true
|
||||
|
||||
if key, err = KeyGen(); err != nil {
|
||||
startupErrors <- err
|
||||
return
|
||||
}
|
||||
|
||||
log.W.Ln("")
|
||||
log.W.Ln("--------------------------------------------------------")
|
||||
log.W.Ln("--")
|
||||
log.W.Ln("-- WARNING: The following key will be used to store")
|
||||
log.W.Ln("-- your database securely, please ensure that you make")
|
||||
log.W.Ln("-- a copy and store it in a secure place before using")
|
||||
log.W.Ln("-- this software in a production environment.")
|
||||
log.W.Ln("--")
|
||||
log.W.Ln("--")
|
||||
log.W.Ln("-- Failure to store this key properly will result in")
|
||||
log.W.Ln("-- no longer being able to decrypt this database.")
|
||||
log.W.Ln("--")
|
||||
log.W.Ln("--")
|
||||
log.W.Ln("-- It is recommended to use the following to generate")
|
||||
log.W.Ln("-- your key:")
|
||||
log.W.Ln("--")
|
||||
log.W.Ln("-- indra seed keygen")
|
||||
log.W.Ln("--")
|
||||
log.W.Ln("-- OR")
|
||||
log.W.Ln("--")
|
||||
log.W.Ln("-- indra seed keygen --keyfile=/path/to/keyfile")
|
||||
log.W.Ln("--")
|
||||
log.W.Ln("--")
|
||||
log.W.Ln("-- YOU HAVE BEEN WARNED!")
|
||||
log.W.Ln("--")
|
||||
log.W.Ln("-------------------------------------------------------")
|
||||
log.W.Ln("-- KEY:", key.Encode(), "--")
|
||||
log.W.Ln("-------------------------------------------------------")
|
||||
log.W.Ln("")
|
||||
|
||||
viper.Set(storeKeyFlag, key.Encode())
|
||||
}
|
||||
|
||||
func configureDirPath() {
|
||||
|
||||
var err error
|
||||
|
||||
if viper.GetString(storeFilePathFlag) == "" {
|
||||
viper.Set(storeFilePathFlag, viper.GetString("data-dir")+"/"+fileName)
|
||||
}
|
||||
|
||||
err = os.MkdirAll(
|
||||
strings.TrimSuffix(viper.GetString(storeFilePathFlag), "/"+fileName),
|
||||
0755,
|
||||
)
|
||||
|
||||
if err != nil {
|
||||
startupErrors <- err
|
||||
return
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
func configureFile() {
|
||||
|
||||
log.I.Ln("using storage db path:")
|
||||
log.I.Ln("-", viper.GetString(storeFilePathFlag))
|
||||
|
||||
log.I.Ln("checking if database exists")
|
||||
|
||||
var err error
|
||||
|
||||
if _, err = os.Stat(viper.GetString(storeFilePathFlag)); err != nil {
|
||||
|
||||
log.I.Ln("no database found, creating a new one")
|
||||
|
||||
isNewDB = true
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
log.I.Ln("database found")
|
||||
}
|
||||
60
pkg/storage/flags.go
Normal file
60
pkg/storage/flags.go
Normal file
@@ -0,0 +1,60 @@
|
||||
package storage
|
||||
|
||||
import (
|
||||
"github.com/spf13/cobra"
|
||||
"github.com/spf13/viper"
|
||||
)
|
||||
|
||||
var (
|
||||
storeKeyFlag = "store-key"
|
||||
storeKeyFileFlag = "store-keyfile"
|
||||
storeKeyRPCFlag = "store-key-rpc"
|
||||
storeFilePathFlag = "store-path"
|
||||
storeAskPassFlag = "store-ask-pass"
|
||||
)
|
||||
|
||||
var (
|
||||
storeEncryptionKey string
|
||||
storeEncryptionKeyFile string
|
||||
storeEncryptionKeyRPC bool
|
||||
storeFilePath string
|
||||
storeAskPass bool
|
||||
)
|
||||
|
||||
func InitFlags(cmd *cobra.Command) {
|
||||
|
||||
cmd.PersistentFlags().StringVarP(&storeEncryptionKey, storeKeyFlag, "",
|
||||
"",
|
||||
"the key required to unlock storage",
|
||||
)
|
||||
|
||||
viper.BindPFlag(storeKeyFlag, cmd.PersistentFlags().Lookup(storeKeyFlag))
|
||||
|
||||
cmd.PersistentFlags().StringVarP(&storeEncryptionKeyFile, storeKeyFileFlag, "",
|
||||
"",
|
||||
"the path of the keyfile required to unlock storage",
|
||||
)
|
||||
|
||||
viper.BindPFlag(storeKeyFileFlag, cmd.PersistentFlags().Lookup(storeKeyFileFlag))
|
||||
|
||||
cmd.PersistentFlags().StringVarP(&storeFilePath, storeFilePathFlag, "",
|
||||
"",
|
||||
"the path of the database (defaults to --data-dir/indra.db)",
|
||||
)
|
||||
|
||||
viper.BindPFlag(storeFilePathFlag, cmd.PersistentFlags().Lookup(storeFilePathFlag))
|
||||
|
||||
cmd.PersistentFlags().BoolVarP(&storeEncryptionKeyRPC, storeKeyRPCFlag, "",
|
||||
false,
|
||||
"looks for the encryption key via RPC",
|
||||
)
|
||||
|
||||
viper.BindPFlag(storeKeyRPCFlag, cmd.PersistentFlags().Lookup(storeKeyRPCFlag))
|
||||
|
||||
cmd.PersistentFlags().BoolVarP(&storeAskPass, storeAskPassFlag, "",
|
||||
false,
|
||||
"prompts the user for a password to unlock storage",
|
||||
)
|
||||
|
||||
viper.BindPFlag(storeAskPassFlag, cmd.PersistentFlags().Lookup(storeAskPassFlag))
|
||||
}
|
||||
40
pkg/storage/key.go
Normal file
40
pkg/storage/key.go
Normal file
@@ -0,0 +1,40 @@
|
||||
package storage
|
||||
|
||||
import (
|
||||
"crypto/rand"
|
||||
"github.com/btcsuite/btcd/btcutil/base58"
|
||||
"strings"
|
||||
)
|
||||
|
||||
type Key [32]byte
|
||||
|
||||
func (k Key) Bytes() []byte {
|
||||
return k[:]
|
||||
}
|
||||
|
||||
func (k Key) Encode() string {
|
||||
return base58.Encode(k[:])
|
||||
}
|
||||
|
||||
func (k *Key) Decode(key string) {
|
||||
|
||||
key = strings.TrimSpace(key)
|
||||
|
||||
copy(k[:], base58.Decode(key))
|
||||
}
|
||||
|
||||
func KeyGen() (Key, error) {
|
||||
|
||||
var err error
|
||||
var sk [32]byte
|
||||
var key Key
|
||||
|
||||
_, err = rand.Read(sk[:])
|
||||
|
||||
sk[0] &= 248
|
||||
sk[31] = (sk[31] & 127) | 64
|
||||
|
||||
key = sk
|
||||
|
||||
return key, err
|
||||
}
|
||||
11
pkg/storage/log.go
Normal file
11
pkg/storage/log.go
Normal file
@@ -0,0 +1,11 @@
|
||||
package storage
|
||||
|
||||
import (
|
||||
"git-indra.lan/indra-labs/indra"
|
||||
log2 "git-indra.lan/indra-labs/indra/pkg/proc/log"
|
||||
)
|
||||
|
||||
var (
|
||||
log = log2.GetLogger(indra.PathBase)
|
||||
check = log.E.Chk
|
||||
)
|
||||
121
pkg/storage/service.go
Normal file
121
pkg/storage/service.go
Normal file
@@ -0,0 +1,121 @@
|
||||
package storage
|
||||
|
||||
import (
|
||||
"context"
|
||||
"git-indra.lan/indra-labs/indra/pkg/interrupt"
|
||||
"github.com/dgraph-io/badger/v3"
|
||||
"github.com/spf13/viper"
|
||||
"sync"
|
||||
)
|
||||
|
||||
var (
|
||||
fileName string = "indra.db"
|
||||
)
|
||||
|
||||
var (
|
||||
db *badger.DB
|
||||
opts badger.Options
|
||||
startupErrors = make(chan error, 128)
|
||||
isLockedChan = make(chan bool, 1)
|
||||
isReadyChan = make(chan bool, 1)
|
||||
)
|
||||
|
||||
func CantStart() chan error {
|
||||
return startupErrors
|
||||
}
|
||||
|
||||
func IsLocked() chan bool {
|
||||
return isLockedChan
|
||||
}
|
||||
|
||||
func IsReady() chan bool {
|
||||
return isReadyChan
|
||||
}
|
||||
|
||||
func Shutdown() (err error) {
|
||||
|
||||
log.I.Ln("shutting down storage")
|
||||
|
||||
if db == nil {
|
||||
return nil
|
||||
}
|
||||
|
||||
if err = db.Close(); check(err) {
|
||||
return
|
||||
}
|
||||
|
||||
log.I.Ln("storage shutdown completed")
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
func Txn(tx func(txn *badger.Txn) error, update bool) error {
|
||||
|
||||
txn := db.NewTransaction(update)
|
||||
|
||||
return tx(txn)
|
||||
}
|
||||
|
||||
var (
|
||||
running sync.Mutex
|
||||
)
|
||||
|
||||
func open() {
|
||||
|
||||
var err error
|
||||
|
||||
opts.EncryptionKey = key.Bytes()
|
||||
|
||||
if db, err = badger.Open(opts); check(err) {
|
||||
startupErrors <- err
|
||||
return
|
||||
}
|
||||
|
||||
log.I.Ln("successfully opened database")
|
||||
log.I.Ln("storage is ready")
|
||||
|
||||
isReadyChan <- true
|
||||
}
|
||||
|
||||
func Run(ctx context.Context) {
|
||||
|
||||
if !running.TryLock() {
|
||||
return
|
||||
}
|
||||
|
||||
configure()
|
||||
|
||||
opts = badger.DefaultOptions(viper.GetString(storeFilePathFlag))
|
||||
opts.IndexCacheSize = 128 << 20
|
||||
opts.Logger = nil
|
||||
|
||||
if !isLocked {
|
||||
|
||||
log.I.Ln("attempting to open database with key")
|
||||
|
||||
open()
|
||||
}
|
||||
|
||||
isLockedChan <- true
|
||||
|
||||
lockedCtx, cancel := context.WithCancel(context.Background())
|
||||
|
||||
interrupt.AddHandler(cancel)
|
||||
|
||||
for {
|
||||
select {
|
||||
case <-IsReady():
|
||||
log.I.Ln("storage is ready")
|
||||
|
||||
//case <-unlock.IsSuccessful():
|
||||
//
|
||||
// log.I.Ln("storage successfully unlocked")
|
||||
//
|
||||
// isReadyChan <- true
|
||||
|
||||
case <-lockedCtx.Done():
|
||||
Shutdown()
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
43
pkg/storage/service_unlock.go
Normal file
43
pkg/storage/service_unlock.go
Normal file
@@ -0,0 +1,43 @@
|
||||
package storage
|
||||
|
||||
import (
|
||||
"context"
|
||||
"github.com/dgraph-io/badger/v3"
|
||||
)
|
||||
|
||||
type Service struct {
|
||||
success chan bool
|
||||
}
|
||||
|
||||
func (s *Service) IsSuccessful() chan bool {
|
||||
return s.success
|
||||
}
|
||||
|
||||
func (s *Service) Unlock(ctx context.Context, req *UnlockRequest) (res *UnlockResponse, err error) {
|
||||
|
||||
var key Key
|
||||
|
||||
key.Decode(req.Key)
|
||||
|
||||
opts.EncryptionKey = key.Bytes()
|
||||
|
||||
if db, err = badger.Open(opts); check(err) {
|
||||
return &UnlockResponse{
|
||||
Success: false,
|
||||
}, err
|
||||
}
|
||||
|
||||
s.success <- true
|
||||
|
||||
return &UnlockResponse{
|
||||
Success: true,
|
||||
}, nil
|
||||
}
|
||||
|
||||
func (s *Service) mustEmbedUnimplementedUnlockServiceServer() {}
|
||||
|
||||
func NewUnlockService() *Service {
|
||||
return &Service{
|
||||
success: make(chan bool, 1),
|
||||
}
|
||||
}
|
||||
222
pkg/storage/unlock.pb.go
Normal file
222
pkg/storage/unlock.pb.go
Normal file
@@ -0,0 +1,222 @@
|
||||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||
// versions:
|
||||
// protoc-gen-go v1.28.1
|
||||
// protoc v3.21.12
|
||||
// source: unlock.proto
|
||||
|
||||
package storage
|
||||
|
||||
import (
|
||||
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
|
||||
protoimpl "google.golang.org/protobuf/runtime/protoimpl"
|
||||
reflect "reflect"
|
||||
sync "sync"
|
||||
)
|
||||
|
||||
const (
|
||||
// Verify that this generated code is sufficiently up-to-date.
|
||||
_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
|
||||
// Verify that runtime/protoimpl is sufficiently up-to-date.
|
||||
_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
|
||||
)
|
||||
|
||||
type UnlockRequest struct {
|
||||
state protoimpl.MessageState
|
||||
sizeCache protoimpl.SizeCache
|
||||
unknownFields protoimpl.UnknownFields
|
||||
|
||||
Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"`
|
||||
}
|
||||
|
||||
func (x *UnlockRequest) Reset() {
|
||||
*x = UnlockRequest{}
|
||||
if protoimpl.UnsafeEnabled {
|
||||
mi := &file_unlock_proto_msgTypes[0]
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
}
|
||||
|
||||
func (x *UnlockRequest) String() string {
|
||||
return protoimpl.X.MessageStringOf(x)
|
||||
}
|
||||
|
||||
func (*UnlockRequest) ProtoMessage() {}
|
||||
|
||||
func (x *UnlockRequest) ProtoReflect() protoreflect.Message {
|
||||
mi := &file_unlock_proto_msgTypes[0]
|
||||
if protoimpl.UnsafeEnabled && x != nil {
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
if ms.LoadMessageInfo() == nil {
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
return ms
|
||||
}
|
||||
return mi.MessageOf(x)
|
||||
}
|
||||
|
||||
// Deprecated: Use UnlockRequest.ProtoReflect.Descriptor instead.
|
||||
func (*UnlockRequest) Descriptor() ([]byte, []int) {
|
||||
return file_unlock_proto_rawDescGZIP(), []int{0}
|
||||
}
|
||||
|
||||
func (x *UnlockRequest) GetKey() string {
|
||||
if x != nil {
|
||||
return x.Key
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
type UnlockResponse struct {
|
||||
state protoimpl.MessageState
|
||||
sizeCache protoimpl.SizeCache
|
||||
unknownFields protoimpl.UnknownFields
|
||||
|
||||
Success bool `protobuf:"varint,1,opt,name=success,proto3" json:"success,omitempty"`
|
||||
Message *string `protobuf:"bytes,2,opt,name=message,proto3,oneof" json:"message,omitempty"`
|
||||
}
|
||||
|
||||
func (x *UnlockResponse) Reset() {
|
||||
*x = UnlockResponse{}
|
||||
if protoimpl.UnsafeEnabled {
|
||||
mi := &file_unlock_proto_msgTypes[1]
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
}
|
||||
|
||||
func (x *UnlockResponse) String() string {
|
||||
return protoimpl.X.MessageStringOf(x)
|
||||
}
|
||||
|
||||
func (*UnlockResponse) ProtoMessage() {}
|
||||
|
||||
func (x *UnlockResponse) ProtoReflect() protoreflect.Message {
|
||||
mi := &file_unlock_proto_msgTypes[1]
|
||||
if protoimpl.UnsafeEnabled && x != nil {
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
if ms.LoadMessageInfo() == nil {
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
return ms
|
||||
}
|
||||
return mi.MessageOf(x)
|
||||
}
|
||||
|
||||
// Deprecated: Use UnlockResponse.ProtoReflect.Descriptor instead.
|
||||
func (*UnlockResponse) Descriptor() ([]byte, []int) {
|
||||
return file_unlock_proto_rawDescGZIP(), []int{1}
|
||||
}
|
||||
|
||||
func (x *UnlockResponse) GetSuccess() bool {
|
||||
if x != nil {
|
||||
return x.Success
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func (x *UnlockResponse) GetMessage() string {
|
||||
if x != nil && x.Message != nil {
|
||||
return *x.Message
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
var File_unlock_proto protoreflect.FileDescriptor
|
||||
|
||||
var file_unlock_proto_rawDesc = []byte{
|
||||
0x0a, 0x0c, 0x75, 0x6e, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x03,
|
||||
0x72, 0x70, 0x63, 0x22, 0x21, 0x0a, 0x0d, 0x55, 0x6e, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x71,
|
||||
0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28,
|
||||
0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x22, 0x55, 0x0a, 0x0e, 0x55, 0x6e, 0x6c, 0x6f, 0x63, 0x6b,
|
||||
0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63,
|
||||
0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65,
|
||||
0x73, 0x73, 0x12, 0x1d, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20,
|
||||
0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x88, 0x01,
|
||||
0x01, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x32, 0x44, 0x0a,
|
||||
0x0d, 0x55, 0x6e, 0x6c, 0x6f, 0x63, 0x6b, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x33,
|
||||
0x0a, 0x06, 0x55, 0x6e, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x12, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x55,
|
||||
0x6e, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x72,
|
||||
0x70, 0x63, 0x2e, 0x55, 0x6e, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
|
||||
0x65, 0x22, 0x00, 0x42, 0x07, 0x5a, 0x05, 0x2e, 0x2f, 0x72, 0x70, 0x63, 0x62, 0x06, 0x70, 0x72,
|
||||
0x6f, 0x74, 0x6f, 0x33,
|
||||
}
|
||||
|
||||
var (
|
||||
file_unlock_proto_rawDescOnce sync.Once
|
||||
file_unlock_proto_rawDescData = file_unlock_proto_rawDesc
|
||||
)
|
||||
|
||||
func file_unlock_proto_rawDescGZIP() []byte {
|
||||
file_unlock_proto_rawDescOnce.Do(func() {
|
||||
file_unlock_proto_rawDescData = protoimpl.X.CompressGZIP(file_unlock_proto_rawDescData)
|
||||
})
|
||||
return file_unlock_proto_rawDescData
|
||||
}
|
||||
|
||||
var file_unlock_proto_msgTypes = make([]protoimpl.MessageInfo, 2)
|
||||
var file_unlock_proto_goTypes = []interface{}{
|
||||
(*UnlockRequest)(nil), // 0: rpc.UnlockRequest
|
||||
(*UnlockResponse)(nil), // 1: rpc.UnlockResponse
|
||||
}
|
||||
var file_unlock_proto_depIdxs = []int32{
|
||||
0, // 0: rpc.UnlockService.Unlock:input_type -> rpc.UnlockRequest
|
||||
1, // 1: rpc.UnlockService.Unlock:output_type -> rpc.UnlockResponse
|
||||
1, // [1:2] is the sub-list for method output_type
|
||||
0, // [0:1] is the sub-list for method input_type
|
||||
0, // [0:0] is the sub-list for extension type_name
|
||||
0, // [0:0] is the sub-list for extension extendee
|
||||
0, // [0:0] is the sub-list for field type_name
|
||||
}
|
||||
|
||||
func init() { file_unlock_proto_init() }
|
||||
func file_unlock_proto_init() {
|
||||
if File_unlock_proto != nil {
|
||||
return
|
||||
}
|
||||
if !protoimpl.UnsafeEnabled {
|
||||
file_unlock_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
|
||||
switch v := v.(*UnlockRequest); i {
|
||||
case 0:
|
||||
return &v.state
|
||||
case 1:
|
||||
return &v.sizeCache
|
||||
case 2:
|
||||
return &v.unknownFields
|
||||
default:
|
||||
return nil
|
||||
}
|
||||
}
|
||||
file_unlock_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
|
||||
switch v := v.(*UnlockResponse); i {
|
||||
case 0:
|
||||
return &v.state
|
||||
case 1:
|
||||
return &v.sizeCache
|
||||
case 2:
|
||||
return &v.unknownFields
|
||||
default:
|
||||
return nil
|
||||
}
|
||||
}
|
||||
}
|
||||
file_unlock_proto_msgTypes[1].OneofWrappers = []interface{}{}
|
||||
type x struct{}
|
||||
out := protoimpl.TypeBuilder{
|
||||
File: protoimpl.DescBuilder{
|
||||
GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
|
||||
RawDescriptor: file_unlock_proto_rawDesc,
|
||||
NumEnums: 0,
|
||||
NumMessages: 2,
|
||||
NumExtensions: 0,
|
||||
NumServices: 1,
|
||||
},
|
||||
GoTypes: file_unlock_proto_goTypes,
|
||||
DependencyIndexes: file_unlock_proto_depIdxs,
|
||||
MessageInfos: file_unlock_proto_msgTypes,
|
||||
}.Build()
|
||||
File_unlock_proto = out.File
|
||||
file_unlock_proto_rawDesc = nil
|
||||
file_unlock_proto_goTypes = nil
|
||||
file_unlock_proto_depIdxs = nil
|
||||
}
|
||||
19
pkg/storage/unlock.proto
Normal file
19
pkg/storage/unlock.proto
Normal file
@@ -0,0 +1,19 @@
|
||||
|
||||
syntax = "proto3";
|
||||
|
||||
option go_package = ".";
|
||||
|
||||
package rpc;
|
||||
|
||||
message UnlockRequest {
|
||||
string key = 1;
|
||||
}
|
||||
|
||||
message UnlockResponse {
|
||||
bool success = 1;
|
||||
optional string message = 2;
|
||||
}
|
||||
|
||||
service UnlockService {
|
||||
rpc Unlock(UnlockRequest) returns (UnlockResponse) {}
|
||||
}
|
||||
105
pkg/storage/unlock_grpc.pb.go
Normal file
105
pkg/storage/unlock_grpc.pb.go
Normal file
@@ -0,0 +1,105 @@
|
||||
// Code generated by protoc-gen-go-grpc. DO NOT EDIT.
|
||||
// versions:
|
||||
// - protoc-gen-go-grpc v1.2.0
|
||||
// - protoc v3.21.12
|
||||
// source: unlock.proto
|
||||
|
||||
package storage
|
||||
|
||||
import (
|
||||
context "context"
|
||||
grpc "google.golang.org/grpc"
|
||||
codes "google.golang.org/grpc/codes"
|
||||
status "google.golang.org/grpc/status"
|
||||
)
|
||||
|
||||
// This is a compile-time assertion to ensure that this generated file
|
||||
// is compatible with the grpc package it is being compiled against.
|
||||
// Requires gRPC-Go v1.32.0 or later.
|
||||
const _ = grpc.SupportPackageIsVersion7
|
||||
|
||||
// UnlockServiceClient is the client API for UnlockService service.
|
||||
//
|
||||
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
|
||||
type UnlockServiceClient interface {
|
||||
Unlock(ctx context.Context, in *UnlockRequest, opts ...grpc.CallOption) (*UnlockResponse, error)
|
||||
}
|
||||
|
||||
type unlockServiceClient struct {
|
||||
cc grpc.ClientConnInterface
|
||||
}
|
||||
|
||||
func NewUnlockServiceClient(cc grpc.ClientConnInterface) UnlockServiceClient {
|
||||
return &unlockServiceClient{cc}
|
||||
}
|
||||
|
||||
func (c *unlockServiceClient) Unlock(ctx context.Context, in *UnlockRequest, opts ...grpc.CallOption) (*UnlockResponse, error) {
|
||||
out := new(UnlockResponse)
|
||||
err := c.cc.Invoke(ctx, "/rpc.UnlockService/Unlock", in, out, opts...)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return out, nil
|
||||
}
|
||||
|
||||
// UnlockServiceServer is the server API for UnlockService service.
|
||||
// All implementations must embed UnimplementedUnlockServiceServer
|
||||
// for forward compatibility
|
||||
type UnlockServiceServer interface {
|
||||
Unlock(context.Context, *UnlockRequest) (*UnlockResponse, error)
|
||||
mustEmbedUnimplementedUnlockServiceServer()
|
||||
}
|
||||
|
||||
// UnimplementedUnlockServiceServer must be embedded to have forward compatible implementations.
|
||||
type UnimplementedUnlockServiceServer struct {
|
||||
}
|
||||
|
||||
func (UnimplementedUnlockServiceServer) Unlock(context.Context, *UnlockRequest) (*UnlockResponse, error) {
|
||||
return nil, status.Errorf(codes.Unimplemented, "method Unlock not implemented")
|
||||
}
|
||||
func (UnimplementedUnlockServiceServer) mustEmbedUnimplementedUnlockServiceServer() {}
|
||||
|
||||
// UnsafeUnlockServiceServer may be embedded to opt out of forward compatibility for this service.
|
||||
// Use of this interface is not recommended, as added methods to UnlockServiceServer will
|
||||
// result in compilation errors.
|
||||
type UnsafeUnlockServiceServer interface {
|
||||
mustEmbedUnimplementedUnlockServiceServer()
|
||||
}
|
||||
|
||||
func RegisterUnlockServiceServer(s grpc.ServiceRegistrar, srv UnlockServiceServer) {
|
||||
s.RegisterService(&UnlockService_ServiceDesc, srv)
|
||||
}
|
||||
|
||||
func _UnlockService_Unlock_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
|
||||
in := new(UnlockRequest)
|
||||
if err := dec(in); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if interceptor == nil {
|
||||
return srv.(UnlockServiceServer).Unlock(ctx, in)
|
||||
}
|
||||
info := &grpc.UnaryServerInfo{
|
||||
Server: srv,
|
||||
FullMethod: "/rpc.UnlockService/Unlock",
|
||||
}
|
||||
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
|
||||
return srv.(UnlockServiceServer).Unlock(ctx, req.(*UnlockRequest))
|
||||
}
|
||||
return interceptor(ctx, in, info, handler)
|
||||
}
|
||||
|
||||
// UnlockService_ServiceDesc is the grpc.ServiceDesc for UnlockService service.
|
||||
// It's only intended for direct use with grpc.RegisterService,
|
||||
// and not to be introspected or modified (even as a copy)
|
||||
var UnlockService_ServiceDesc = grpc.ServiceDesc{
|
||||
ServiceName: "rpc.UnlockService",
|
||||
HandlerType: (*UnlockServiceServer)(nil),
|
||||
Methods: []grpc.MethodDesc{
|
||||
{
|
||||
MethodName: "Unlock",
|
||||
Handler: _UnlockService_Unlock_Handler,
|
||||
},
|
||||
},
|
||||
Streams: []grpc.StreamDesc{},
|
||||
Metadata: "unlock.proto",
|
||||
}
|
||||
Reference in New Issue
Block a user