diff --git a/backend/backend.go b/backend/backend.go index a1614b7..4a71e1c 100644 --- a/backend/backend.go +++ b/backend/backend.go @@ -1,6 +1,7 @@ package main import ( + ricochet "github.com/special/ricochet-go/core" rpc "github.com/special/ricochet-go/rpc" "google.golang.org/grpc" "log" @@ -16,7 +17,18 @@ func main() { if err != nil { log.Fatalf("listen failed: %v", err) } + + config, err := ricochet.LoadConfig(".") + if err != nil { + log.Fatalf("config error: %v", err) + } + + ricochet := &RicochetCore{ + Network: ricochet.CreateNetwork(), + Config: config, + } + rpcServer := grpc.NewServer() - rpc.RegisterRicochetCoreServer(rpcServer, &RicochetCore{}) + rpc.RegisterRicochetCoreServer(rpcServer, ricochet) rpcServer.Serve(listener) } diff --git a/backend/rpc.go b/backend/rpc.go index b46309d..02d65dc 100644 --- a/backend/rpc.go +++ b/backend/rpc.go @@ -2,12 +2,15 @@ package main import ( "errors" + ricochet "github.com/special/ricochet-go/core" rpc "github.com/special/ricochet-go/rpc" "golang.org/x/net/context" - "time" + "log" ) type RicochetCore struct { + Network *ricochet.Network + Config *ricochet.Config } func (core *RicochetCore) GetServerStatus(ctx context.Context, req *rpc.ServerStatusRequest) (*rpc.ServerStatusReply, error) { @@ -29,19 +32,41 @@ func (core *RicochetCore) MonitorNetwork(req *rpc.MonitorNetworkRequest, stream }, } - for i := 0; i < 100; i++ { + events := core.Network.EventMonitor().Subscribe(20) + defer core.Network.EventMonitor().Unsubscribe(events) + + for { + event, ok := (<-events).(bool) + if !ok { + break + } + + log.Printf("RPC monitor event: %v", event) if err := stream.Send(status); err != nil { return err } - time.Sleep(100 * time.Millisecond) } + return nil } func (core *RicochetCore) StartNetwork(ctx context.Context, req *rpc.StartNetworkRequest) (*rpc.NetworkStatus, error) { - return nil, errors.New("Not implemented") + // err represents the result of the first connection attempt, but as long + // as 'ok' is true, the network has started and this call was successful. + ok, err := core.Network.Start("tcp://127.0.0.1:9051", "") + if !ok { + return nil, err + } + + // XXX real status + return &rpc.NetworkStatus{ + Control: &rpc.TorControlStatus{ + Status: rpc.TorControlStatus_CONNECTED, + }, + }, nil } func (core *RicochetCore) StopNetwork(ctx context.Context, req *rpc.StopNetworkRequest) (*rpc.NetworkStatus, error) { - return nil, errors.New("Not implemented") + core.Network.Stop() + return &rpc.NetworkStatus{}, nil } diff --git a/cli/cli.go b/cli/cli.go index a0645c2..222b2d1 100644 --- a/cli/cli.go +++ b/cli/cli.go @@ -47,8 +47,15 @@ func main() { } log.Printf("stream says: %v", resp) } - wait <- struct{}{} + close(wait) }() + status, err := c.StartNetwork(context.Background(), &rpc.StartNetworkRequest{}) + if err != nil { + log.Printf("start network error: %v", err) + } else { + log.Printf("network started: %v", status) + } + <-wait }