diff options
Diffstat (limited to 'cmd/mist/main.go')
-rw-r--r-- | cmd/mist/main.go | 119 |
1 files changed, 119 insertions, 0 deletions
diff --git a/cmd/mist/main.go b/cmd/mist/main.go new file mode 100644 index 000000000..3abe16767 --- /dev/null +++ b/cmd/mist/main.go @@ -0,0 +1,119 @@ +/* + This file is part of go-ethereum + + go-ethereum is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + go-ethereum is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with go-ethereum. If not, see <http://www.gnu.org/licenses/>. +*/ +/** + * @authors + * Jeffrey Wilcke <i@jev.io> + */ +package main + +import ( + "fmt" + "os" + "runtime" + "time" + + "github.com/ethereum/go-ethereum/cmd/utils" + "github.com/ethereum/go-ethereum/eth" + "github.com/ethereum/go-ethereum/logger" + "github.com/ethereum/go-ethereum/p2p" + "github.com/ethereum/go-ethereum/ui/qt/webengine" + "github.com/obscuren/qml" +) + +const ( + ClientIdentifier = "Mist" + Version = "0.8.6" +) + +var ethereum *eth.Ethereum +var mainlogger = logger.NewLogger("MAIN") + +func run() error { + webengine.Initialize() + + // precedence: code-internal flag default < config file < environment variables < command line + Init() // parsing command line + + tstart := time.Now() + config := utils.InitConfig(VmType, ConfigFile, Datadir, "ETH") + + ethereum, err := eth.New(ð.Config{ + Name: p2p.MakeName(ClientIdentifier, Version), + KeyStore: KeyStore, + DataDir: Datadir, + LogFile: LogFile, + LogLevel: LogLevel, + MaxPeers: MaxPeer, + Port: OutboundPort, + NAT: NAT, + Shh: true, + BootNodes: BootNodes, + NodeKey: NodeKey, + KeyRing: KeyRing, + Dial: true, + MinerThreads: MinerThreads, + }) + if err != nil { + mainlogger.Fatalln(err) + } + utils.KeyTasks(ethereum.KeyManager(), KeyRing, GenAddr, SecretFile, ExportDir, NonInteractive) + + if StartRpc { + utils.StartRpc(ethereum, RpcPort) + } + + if StartWebSockets { + utils.StartWebSockets(ethereum, WsPort) + } + + gui := NewWindow(ethereum, config, KeyRing, LogLevel) + + utils.RegisterInterrupt(func(os.Signal) { + gui.Stop() + }) + go utils.StartEthereum(ethereum) + + fmt.Println("ETH stack took", time.Since(tstart)) + + // gui blocks the main thread + gui.Start(AssetPath) + + return nil +} + +func main() { + runtime.GOMAXPROCS(runtime.NumCPU()) + + // This is a bit of a cheat, but ey! + os.Setenv("QTWEBKIT_INSPECTOR_SERVER", "127.0.0.1:99999") + + qml.Run(run) + + var interrupted = false + utils.RegisterInterrupt(func(os.Signal) { + interrupted = true + }) + + utils.HandleInterrupt() + + // we need to run the interrupt callbacks in case gui is closed + // this skips if we got here by actual interrupt stopping the GUI + if !interrupted { + utils.RunInterruptCallbacks(os.Interrupt) + } + logger.Flush() +} |