added ipcapi commandline flag

This commit is contained in:
Bas van Kervel 2015-06-04 12:39:14 +02:00
parent 1768d51244
commit b036853917
10 changed files with 115 additions and 15 deletions

View file

@ -10,6 +10,11 @@ geth:
@echo "Done building." @echo "Done building."
@echo "Run \"$(GOBIN)/geth\" to launch geth." @echo "Run \"$(GOBIN)/geth\" to launch geth."
console:
build/env.sh go install -v $(shell build/ldflags.sh) ./cmd/console
@echo "Done building."
@echo "Run \"$(GOBIN)/console\" to launch the console."
mist: mist:
build/env.sh go install -v $(shell build/ldflags.sh) ./cmd/mist build/env.sh go install -v $(shell build/ldflags.sh) ./cmd/mist
@echo "Done building." @echo "Done building."

View file

@ -239,6 +239,7 @@ JavaScript API. See https://github.com/ethereum/go-ethereum/wiki/Javascipt-Conso
utils.RPCListenAddrFlag, utils.RPCListenAddrFlag,
utils.RPCPortFlag, utils.RPCPortFlag,
utils.IPCDisabledFlag, utils.IPCDisabledFlag,
utils.IPCApiFlag,
utils.IPCPathFlag, utils.IPCPathFlag,
utils.WhisperEnabledFlag, utils.WhisperEnabledFlag,
utils.VMDebugFlag, utils.VMDebugFlag,

View file

@ -208,6 +208,11 @@ var (
Name: "ipcdisable", Name: "ipcdisable",
Usage: "Disable the IPC-RPC server", Usage: "Disable the IPC-RPC server",
} }
IPCApiFlag = cli.StringFlag{
Name: "ipcapi",
Usage: "Specify the API's which are offered over this interface",
Value: api.DEFAULT_IPC_APIS,
}
IPCPathFlag = cli.StringFlag{ IPCPathFlag = cli.StringFlag{
Name: "ipcpath", Name: "ipcpath",
Usage: "Filename for IPC socket/pipe", Usage: "Filename for IPC socket/pipe",
@ -382,19 +387,19 @@ func StartRPC(eth *eth.Ethereum, ctx *cli.Context) error {
} }
func StartIPC(eth *eth.Ethereum, ctx *cli.Context) error { func StartIPC(eth *eth.Ethereum, ctx *cli.Context) error {
config := comms.IpcConfig{ codec := codec.JSON
apis, err := api.ParseApiString(ctx.GlobalString(IPCApiFlag.Name), codec, eth)
if err != nil {
return err
}
glog.V(logger.Error).Infof("IPC api's: %s", ctx.GlobalString(IPCApiFlag.Name))
cfg := comms.IpcConfig{
Endpoint: ctx.GlobalString(IPCPathFlag.Name), Endpoint: ctx.GlobalString(IPCPathFlag.Name),
} }
xeth := xeth.New(eth, nil) return comms.StartIpc(cfg, codec, apis...)
// offered API over IPC
codec := codec.JSON
web3Api := api.NewWeb3(xeth, codec)
ethApi := api.NewEth(xeth, codec)
netApi := api.NewNet(xeth, codec)
minerApi := api.NewMiner(eth, codec)
return comms.StartIpc(config, codec, web3Api, ethApi, netApi, minerApi)
} }
func StartPProf(ctx *cli.Context) { func StartPProf(ctx *cli.Context) {

View file

@ -22,13 +22,13 @@ type adminhandler func(*admin, *shared.Request) (interface{}, error)
// admin api provider // admin api provider
type admin struct { type admin struct {
ethereum ethereum.Ethereum ethereum *ethereum.Ethereum
methods map[string]adminhandler methods map[string]adminhandler
codec codec.ApiCoder codec codec.ApiCoder
} }
// create a new admin api instance // create a new admin api instance
func NewAdmin(ethereum ethereum.Ethereum, coder codec.Codec) *admin { func NewAdmin(ethereum *ethereum.Ethereum, coder codec.Codec) *admin {
return &admin{ return &admin{
ethereum: ethereum, ethereum: ethereum,
methods: AdminMapping, methods: AdminMapping,
@ -46,3 +46,16 @@ func (self *admin) Methods() []string {
} }
return methods return methods
} }
// Execute given request
func (self *admin) Execute(req *shared.Request) (interface{}, error) {
if callback, ok := self.methods[req.Method]; ok {
return callback(self, req)
}
return nil, &shared.NotImplementedError{req.Method}
}
func (self *admin) Id() string {
return "admin"
}

View file

@ -1,9 +1,24 @@
package api package api
import "github.com/ethereum/go-ethereum/rpc/shared" import (
"fmt"
"github.com/ethereum/go-ethereum/rpc/shared"
e "github.com/ethereum/go-ethereum/eth"
"strings"
"github.com/ethereum/go-ethereum/rpc/codec"
"github.com/ethereum/go-ethereum/xeth"
)
const (
DEFAULT_IPC_APIS = "admin,debug,eth,miner,net,web3"
DEFAULT_HTTP_APIS = "web3,eth"
)
// Descriptor for all API implementations // Descriptor for all API implementations
type Ethereum interface { type Ethereum interface {
// API identifier, e.g. admin or web3
Id() string
// Execute single API request // Execute single API request
Execute(*shared.Request) (interface{}, error) Execute(*shared.Request) (interface{}, error)
// List with supported methods // List with supported methods
@ -37,6 +52,38 @@ func (self *mergedEthereumApi) Execute(req *shared.Request) (interface{}, error)
return nil, shared.NewNotImplementedError(req.Method) return nil, shared.NewNotImplementedError(req.Method)
} }
func (self *mergedEthereumApi) Id() string {
return "mergedEthereumApi"
}
func Merge(apis ...Ethereum) Ethereum { func Merge(apis ...Ethereum) Ethereum {
return newMergedEthereumApi(apis...) return newMergedEthereumApi(apis...)
} }
// Parses the given apiString (comma separated list with api identifiers) to a collection of API's
func ParseApiString(apiString string, codec codec.Codec, eth *e.Ethereum) ([]Ethereum, error) {
xeth := xeth.New(eth, nil)
apiNames := strings.Split(apiString, ",")
apis := make([]Ethereum, len(apiNames))
for i, name := range apiNames {
switch name {
case "admin":
apis[i] = NewAdmin(eth, codec)
case "eth":
apis[i] = NewEth(xeth, codec)
case "debug":
apis[i] = NewDebug(xeth, eth, codec)
case "miner":
apis[i] = NewMiner(eth, codec)
case "net":
apis[i] = NewNet(xeth, codec)
case "web3":
apis[i] = NewWeb3(xeth, codec)
default:
return nil, fmt.Errorf("Api '%s' isn't supported", name)
}
}
return apis, nil
}

View file

@ -35,13 +35,13 @@ type debughandler func(*debug, *shared.Request) (interface{}, error)
// admin api provider // admin api provider
type debug struct { type debug struct {
xeth *xeth.XEth xeth *xeth.XEth
ethereum ethereum.Ethereum ethereum *ethereum.Ethereum
methods map[string]debughandler methods map[string]debughandler
codec codec.ApiCoder codec codec.ApiCoder
} }
// create a new debug api instance // create a new debug api instance
func NewDebug(xeth *xeth.XEth, ethereum ethereum.Ethereum, coder codec.Codec) *debug { func NewDebug(xeth *xeth.XEth, ethereum *ethereum.Ethereum, coder codec.Codec) *debug {
return &debug{ return &debug{
xeth: xeth, xeth: xeth,
ethereum: ethereum, ethereum: ethereum,
@ -61,6 +61,19 @@ func (self *debug) Methods() []string {
return methods return methods
} }
// Execute given request
func (self *debug) Execute(req *shared.Request) (interface{}, error) {
if callback, ok := self.methods[req.Method]; ok {
return callback(self, req)
}
return nil, &shared.NotImplementedError{req.Method}
}
func (self *debug) Id() string {
return "debug"
}
func (self *debug) PrintBlock(req *shared.Request) (interface{}, error) { func (self *debug) PrintBlock(req *shared.Request) (interface{}, error) {
args := new(BlockNumArg) args := new(BlockNumArg)
if err := self.codec.Decode(req.Params, &args); err != nil { if err := self.codec.Decode(req.Params, &args); err != nil {

View file

@ -107,6 +107,10 @@ func (self *eth) Version() string {
return ethVersion return ethVersion
} }
func (self *eth) Id() string {
return "eth"
}
func (self *eth) Accounts(req *shared.Request) (interface{}, error) { func (self *eth) Accounts(req *shared.Request) (interface{}, error) {
return self.xeth.Accounts(), nil return self.xeth.Accounts(), nil
} }

View file

@ -65,6 +65,10 @@ func (self *miner) Methods() []string {
return methods return methods
} }
func (self *miner) Id() string {
return "miner"
}
func (self *miner) StartMiner(req *shared.Request) (interface{}, error) { func (self *miner) StartMiner(req *shared.Request) (interface{}, error) {
args := new(StartMinerArgs) args := new(StartMinerArgs)
if err := self.codec.Decode(req.Params, &args); err != nil { if err := self.codec.Decode(req.Params, &args); err != nil {

View file

@ -54,6 +54,10 @@ func (self *net) Execute(req *shared.Request) (interface{}, error) {
return nil, shared.NewNotImplementedError(req.Method) return nil, shared.NewNotImplementedError(req.Method)
} }
func (self *net) Id() string {
return "net"
}
// Network version // Network version
func (self *net) Version(req *shared.Request) (interface{}, error) { func (self *net) Version(req *shared.Request) (interface{}, error) {
return self.xeth.NetworkVersion(), nil return self.xeth.NetworkVersion(), nil

View file

@ -59,6 +59,10 @@ func (self *web3) Execute(req *shared.Request) (interface{}, error) {
return nil, &shared.NotImplementedError{req.Method} return nil, &shared.NotImplementedError{req.Method}
} }
func (self *web3) Id() string {
return "web3"
}
// Version of the API this instance provides // Version of the API this instance provides
func (self *web3) Version() string { func (self *web3) Version() string {
return Web3Version return Web3Version