2021-03-18 21:12:48 +01:00
package main
2021-03-18 22:14:56 +01:00
import (
"context"
2021-04-19 21:25:34 +02:00
"fmt"
2021-03-18 22:14:56 +01:00
"log"
"net"
2021-05-31 03:34:57 +02:00
"os"
2021-06-04 18:38:17 +02:00
"strings"
2021-03-18 22:14:56 +01:00
"time"
2021-05-31 03:34:57 +02:00
"github.com/akamensky/argparse"
2021-03-18 22:14:56 +01:00
pb "github.com/lbryio/hub/protobuf/go"
2021-04-19 21:25:34 +02:00
"github.com/lbryio/hub/server"
2021-06-28 19:54:49 +02:00
"github.com/lbryio/lbry.go/v2/extras/util"
2021-03-18 22:14:56 +01:00
"google.golang.org/grpc"
2021-05-31 03:34:57 +02:00
"google.golang.org/grpc/reflection"
2021-03-18 22:14:56 +01:00
)
const (
2021-10-04 23:58:27 +02:00
defaultHost = "0.0.0.0"
defaultPort = "50051"
defaultEsHost = "http://localhost"
defaultEsIndex = "claims"
defaultEsPort = "9200"
defaultRefreshDelta = 5
defaultCacheTTL = 5
2021-03-18 22:14:56 +01:00
)
2021-03-18 21:12:48 +01:00
2021-06-10 02:04:06 +02:00
func GetEnvironment ( data [ ] string , getkeyval func ( item string ) ( key , val string ) ) map [ string ] string {
items := make ( map [ string ] string )
for _ , item := range data {
key , val := getkeyval ( item )
items [ key ] = val
}
return items
2021-05-25 02:09:28 +02:00
}
2021-06-10 02:04:06 +02:00
func GetEnvironmentStandard ( ) map [ string ] string {
return GetEnvironment ( os . Environ ( ) , func ( item string ) ( key , val string ) {
2021-06-04 18:38:17 +02:00
splits := strings . Split ( item , "=" )
key = splits [ 0 ]
val = splits [ 1 ]
return
} )
2021-06-10 02:04:06 +02:00
}
2021-07-06 02:20:38 +02:00
/ *
func makeServeCmd ( parser * argparse . Parser ) * argparse . Command {
serveCmd := parser . NewCommand ( "serve" , "start the hub server" )
host := serveCmd . String ( "" , "rpchost" , & argparse . Options { Required : false , Help : "host" , Default : defaultHost } )
port := serveCmd . String ( "" , "rpcport" , & argparse . Options { Required : false , Help : "port" , Default : defaultPort } )
esHost := serveCmd . String ( "" , "eshost" , & argparse . Options { Required : false , Help : "host" , Default : defaultEsHost } )
esPort := serveCmd . String ( "" , "esport" , & argparse . Options { Required : false , Help : "port" , Default : defaultEsPort } )
dev := serveCmd . Flag ( "" , "dev" , & argparse . Options { Required : false , Help : "port" , Default : false } )
return serveCmd
}
2021-09-21 20:02:09 +02:00
* /
2021-07-06 02:20:38 +02:00
2021-09-18 19:21:32 +02:00
func parseArgs ( searchRequest * pb . SearchRequest ) * server . Args {
2021-06-04 18:38:17 +02:00
2021-06-10 02:04:06 +02:00
environment := GetEnvironmentStandard ( )
2021-05-31 03:34:57 +02:00
parser := argparse . NewParser ( "hub" , "hub server and client" )
serveCmd := parser . NewCommand ( "serve" , "start the hub server" )
2021-07-06 02:20:38 +02:00
searchCmd := parser . NewCommand ( "search" , "claim search" )
2021-08-13 23:36:43 +02:00
debug := parser . Flag ( "" , "debug" , & argparse . Options { Required : false , Help : "enable debug logging" , Default : false } )
2021-05-31 03:34:57 +02:00
2021-08-11 06:46:21 +02:00
host := parser . String ( "" , "rpchost" , & argparse . Options { Required : false , Help : "RPC host" , Default : defaultHost } )
port := parser . String ( "" , "rpcport" , & argparse . Options { Required : false , Help : "RPC port" , Default : defaultPort } )
esHost := parser . String ( "" , "eshost" , & argparse . Options { Required : false , Help : "elasticsearch host" , Default : defaultEsHost } )
esPort := parser . String ( "" , "esport" , & argparse . Options { Required : false , Help : "elasticsearch port" , Default : defaultEsPort } )
esIndex := parser . String ( "" , "esindex" , & argparse . Options { Required : false , Help : "elasticsearch index name" , Default : defaultEsIndex } )
2021-10-04 23:58:27 +02:00
refreshDelta := parser . Int ( "" , "refresh-delta" , & argparse . Options { Required : false , Help : "elasticsearch index refresh delta in seconds" , Default : defaultRefreshDelta } )
cacheTTL := parser . Int ( "" , "cachettl" , & argparse . Options { Required : false , Help : "Cache TTL in minutes" , Default : defaultCacheTTL } )
2021-05-31 03:34:57 +02:00
2021-05-31 20:53:08 +02:00
text := parser . String ( "" , "text" , & argparse . Options { Required : false , Help : "text query" } )
2021-05-31 03:34:57 +02:00
name := parser . String ( "" , "name" , & argparse . Options { Required : false , Help : "name" } )
claimType := parser . String ( "" , "claim_type" , & argparse . Options { Required : false , Help : "claim_type" } )
id := parser . String ( "" , "id" , & argparse . Options { Required : false , Help : "id" } )
author := parser . String ( "" , "author" , & argparse . Options { Required : false , Help : "author" } )
title := parser . String ( "" , "title" , & argparse . Options { Required : false , Help : "title" } )
description := parser . String ( "" , "description" , & argparse . Options { Required : false , Help : "description" } )
channelId := parser . String ( "" , "channel_id" , & argparse . Options { Required : false , Help : "channel id" } )
channelIds := parser . StringList ( "" , "channel_ids" , & argparse . Options { Required : false , Help : "channel ids" } )
// Now parse the arguments
err := parser . Parse ( os . Args )
if err != nil {
log . Fatalln ( parser . Usage ( err ) )
}
2021-05-16 05:13:14 +02:00
2021-06-04 18:38:17 +02:00
args := & server . Args {
2021-10-04 23:58:27 +02:00
CmdType : server . SearchCmd ,
Host : * host ,
Port : ":" + * port ,
EsHost : * esHost ,
EsPort : * esPort ,
EsIndex : * esIndex ,
Debug : * debug ,
RefreshDelta : * refreshDelta ,
CacheTTL : * cacheTTL ,
2021-06-04 18:38:17 +02:00
}
if esHost , ok := environment [ "ELASTIC_HOST" ] ; ok {
args . EsHost = esHost
}
2021-06-17 17:38:27 +02:00
if ! strings . HasPrefix ( args . EsHost , "http" ) {
args . EsHost = "http://" + args . EsHost
}
2021-06-04 18:38:17 +02:00
if esPort , ok := environment [ "ELASTIC_PORT" ] ; ok {
args . EsPort = esPort
}
2021-05-25 05:28:43 +02:00
2021-05-31 03:34:57 +02:00
/ *
2021-08-11 05:39:37 +02:00
Verify no invalid argument combinations
* /
2021-05-31 03:34:57 +02:00
if len ( * channelIds ) > 0 && * channelId != "" {
log . Fatal ( "Cannot specify both channel_id and channel_ids" )
}
if serveCmd . Happened ( ) {
2021-07-06 02:20:38 +02:00
args . CmdType = server . ServeCmd
} else if searchCmd . Happened ( ) {
args . CmdType = server . SearchCmd
2021-05-25 05:28:43 +02:00
}
2021-05-31 03:34:57 +02:00
2021-05-31 20:53:08 +02:00
if * text != "" {
searchRequest . Text = * text
2021-05-16 05:13:14 +02:00
}
2021-08-11 05:39:37 +02:00
if * name != "" {
2021-08-12 09:19:25 +02:00
searchRequest . ClaimName = * name
2021-05-25 05:28:43 +02:00
}
2021-05-16 05:13:14 +02:00
if * claimType != "" {
searchRequest . ClaimType = [ ] string { * claimType }
}
if * id != "" {
2021-08-12 09:19:25 +02:00
searchRequest . ClaimId = & pb . InvertibleField { Invert : false , Value : [ ] string { * id } }
2021-05-16 05:13:14 +02:00
}
if * author != "" {
2021-08-12 09:19:25 +02:00
searchRequest . Author = * author
2021-05-16 05:13:14 +02:00
}
if * title != "" {
2021-08-12 09:19:25 +02:00
searchRequest . Title = * title
2021-05-16 05:13:14 +02:00
}
2021-05-18 12:02:55 +02:00
if * description != "" {
2021-08-12 09:19:25 +02:00
searchRequest . Description = * description
2021-05-18 12:02:55 +02:00
}
2021-05-31 03:34:57 +02:00
if * channelId != "" {
searchRequest . ChannelId = & pb . InvertibleField { Invert : false , Value : [ ] string { * channelId } }
}
if len ( * channelIds ) > 0 {
searchRequest . ChannelId = & pb . InvertibleField { Invert : false , Value : * channelIds }
}
2021-05-25 02:09:28 +02:00
2021-05-25 05:28:43 +02:00
return args
2021-05-25 02:09:28 +02:00
}
2021-03-18 21:12:48 +01:00
func main ( ) {
2021-07-06 02:20:38 +02:00
2021-05-25 05:28:43 +02:00
searchRequest := & pb . SearchRequest { }
2021-09-18 19:21:32 +02:00
args := parseArgs ( searchRequest )
2021-05-25 05:28:43 +02:00
2021-07-06 02:20:38 +02:00
if args . CmdType == server . ServeCmd {
2021-05-25 02:09:28 +02:00
l , err := net . Listen ( "tcp" , args . Port )
2021-03-18 22:14:56 +01:00
if err != nil {
log . Fatalf ( "failed to listen: %v" , err )
}
2021-05-25 02:09:28 +02:00
s := server . MakeHubServer ( args )
2021-06-01 04:19:10 +02:00
pb . RegisterHubServer ( s . GrpcServer , s )
reflection . Register ( s . GrpcServer )
2021-03-18 22:14:56 +01:00
log . Printf ( "listening on %s\n" , l . Addr ( ) . String ( ) )
2021-06-17 01:42:11 +02:00
log . Println ( s . Args )
2021-07-06 02:20:38 +02:00
go s . PromethusEndpoint ( "2112" , "metrics" )
2021-06-01 04:19:10 +02:00
if err := s . GrpcServer . Serve ( l ) ; err != nil {
2021-03-18 22:14:56 +01:00
log . Fatalf ( "failed to serve: %v" , err )
}
return
}
2021-05-25 02:09:28 +02:00
conn , err := grpc . Dial ( "localhost" + args . Port ,
grpc . WithInsecure ( ) ,
2021-05-31 03:34:57 +02:00
grpc . WithBlock ( ) ,
2021-05-25 02:09:28 +02:00
)
2021-03-18 22:14:56 +01:00
if err != nil {
log . Fatalf ( "did not connect: %v" , err )
}
defer conn . Close ( )
c := pb . NewHubClient ( conn )
ctx , cancel := context . WithTimeout ( context . Background ( ) , time . Second )
defer cancel ( )
2021-07-06 02:20:38 +02:00
log . Println ( args )
switch args . CmdType {
case server . SearchCmd :
r , err := c . Search ( ctx , searchRequest )
if err != nil {
log . Fatal ( err )
}
2021-05-16 05:13:14 +02:00
2021-07-06 02:20:38 +02:00
log . Printf ( "found %d results\n" , r . GetTotal ( ) )
2021-04-19 21:25:34 +02:00
2021-07-06 02:20:38 +02:00
for _ , t := range r . Txos {
fmt . Printf ( "%s:%d\n" , util . TxHashToTxId ( t . TxHash ) , t . Nout )
}
default :
log . Fatalln ( "Unknown Command Type!" )
2021-04-19 21:25:34 +02:00
}
2021-03-18 21:12:48 +01:00
}