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:
херетик
2023-02-27 11:02:10 +00:00
36 changed files with 1358 additions and 287 deletions

View File

@@ -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))

View File

@@ -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
}
},
}

View File

@@ -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
View File

@@ -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
View File

@@ -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=

View File

@@ -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"),

View File

@@ -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,
}

View File

@@ -1,4 +1,4 @@
package seed
package p2p
import (
"git-indra.lan/indra-labs/indra/pkg/cfg"

57
pkg/p2p/configure.go Normal file
View 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
View 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
View 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
)

View File

@@ -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():

View File

@@ -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
}

View File

@@ -1,4 +1,4 @@
package seed
package p2p
import (
"crypto/rand"

View File

@@ -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)
}

View File

@@ -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)

View File

@@ -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
View 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
View 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
)

View 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)
}

View 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)
}

View 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
}
}

View File

@@ -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()

View File

@@ -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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
}
}
}

View 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
View 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
View 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) {}
}

View 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",
}