Skip to content

Commit 78e7d5c

Browse files
author
JkLondon
committed
commit
1 parent 3d203a2 commit 78e7d5c

File tree

11 files changed

+792
-3
lines changed

11 files changed

+792
-3
lines changed

cmd/etui/README.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
# Erigon TUI
2+
3+
## Contents
4+
TODO)

cmd/etui/cmd/root.go

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package cmd
2+
3+
import (
4+
"fmt"
5+
"os"
6+
7+
"github.com/spf13/cobra"
8+
)
9+
10+
var rootCmd = &cobra.Command{
11+
Use: "etui",
12+
Short: "Erigon TUI",
13+
Long: `Managing and monitoring tools for erigon
14+
`,
15+
}
16+
17+
func Execute() {
18+
if err := rootCmd.Execute(); err != nil {
19+
fmt.Fprintln(os.Stderr, err)
20+
os.Exit(1)
21+
}
22+
}
23+
24+
func init() {
25+
rootCmd.AddCommand(infoCmd)
26+
}

cmd/etui/cmd/stages.go

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
package cmd
2+
3+
import (
4+
"fmt"
5+
6+
"github.com/erigontech/erigon/cmd/etui/internals/tui"
7+
"github.com/erigontech/erigon/cmd/integration/commands"
8+
log "github.com/erigontech/erigon/common/log/v3"
9+
"github.com/spf13/cobra"
10+
)
11+
12+
var (
13+
datadirCli string
14+
)
15+
16+
var infoCmd = &cobra.Command{
17+
Use: "info",
18+
Short: "Stages info of Erigon",
19+
Example: `To start eTUI in the datadir: go run ./cmd/etui info --datadir /path/to/your/datadir`,
20+
RunE: func(cmd *cobra.Command, args []string) error {
21+
if datadirCli == "" {
22+
return fmt.Errorf("--datadir flag is required")
23+
}
24+
logger := log.New()
25+
infoCh := make(chan *commands.StagesInfo)
26+
errCh := make(chan error, 1)
27+
go func() {
28+
defer close(infoCh)
29+
defer func() {
30+
if r := recover(); r != nil {
31+
println("recovered from panic: ", r)
32+
}
33+
}()
34+
err := commands.InfoAllStages(cmd.Context(), logger, datadirCli, infoCh)
35+
if err != nil {
36+
select {
37+
case errCh <- err:
38+
default:
39+
}
40+
}
41+
}()
42+
tuiApp := tui.NewTUI(datadirCli)
43+
err := tuiApp.Run(infoCh, errCh)
44+
if err != nil {
45+
return err
46+
}
47+
return nil
48+
},
49+
}
50+
51+
func init() {
52+
infoCmd.Flags().StringVar(&datadirCli, "datadir", "", "Directory containing versioned files")
53+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package modules
2+
3+
import (
4+
"github.com/rivo/tview"
5+
)
6+
7+
func Header() tview.Primitive {
8+
return tview.NewTextView().SetText("Erigon TUI v0.0.2").SetTextAlign(tview.AlignCenter)
9+
}
10+
11+
func Footer() *tview.TextView {
12+
return tview.NewTextView().SetDynamicColors(true).
13+
SetTextAlign(tview.AlignCenter).
14+
SetText("[green]navigation left right arrows [yellow]Press [red]q [yellow]or [red]Ctrl+C [yellow]to quit")
15+
}
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
package nodeinfo
2+
3+
import (
4+
"context"
5+
"encoding/json"
6+
"fmt"
7+
"github.com/rivo/tview"
8+
"net/http"
9+
"time"
10+
)
11+
12+
func Body() (*tview.Flex, *BodyView) {
13+
view := &BodyView{
14+
Overview: tview.NewTextView().SetText("waiting for fetch data from erigon...").SetDynamicColors(true),
15+
Stages: tview.NewTextView().SetDynamicColors(true),
16+
DomainII: tview.NewTextView().SetDynamicColors(true),
17+
Clock: tview.NewTextView().SetTextAlign(tview.AlignRight).SetDynamicColors(true),
18+
Downloader: tview.NewTextView().SetDynamicColors(true).SetText("loading pls wait [=====------]"),
19+
}
20+
21+
topPanel := tview.NewFlex().
22+
AddItem(view.Overview, 0, 1, false).
23+
AddItem(tview.NewFlex().SetDirection(tview.FlexRow).
24+
AddItem(view.Clock, 1, 1, false).
25+
AddItem(view.Downloader, 0, 5, false), 0, 1, false)
26+
topPanel.GetItem(1).(*tview.Flex).GetItem(1).(*tview.TextView).Box.SetBorder(true)
27+
flex := tview.NewFlex().SetDirection(tview.FlexRow).
28+
AddItem(topPanel,
29+
9, 1, false).
30+
AddItem(tview.NewFlex().
31+
AddItem(view.Stages, 0, 1, false).
32+
AddItem(view.DomainII, 0, 1, false),
33+
0, 1, false)
34+
flex.Box.SetBorder(true)
35+
return flex, view
36+
}
37+
38+
type BodyView struct {
39+
Overview *tview.TextView
40+
Stages *tview.TextView
41+
DomainII *tview.TextView
42+
Clock *tview.TextView
43+
Downloader *tview.TextView
44+
}
45+
46+
type TorrentsInfo struct {
47+
Total int `json:"total"`
48+
Complete int `json:"complete"`
49+
}
50+
51+
type DownloaderPinger struct {
52+
BaseURL string
53+
Client *http.Client
54+
}
55+
56+
func NewDownloaderPinger(baseURL string) *DownloaderPinger {
57+
return &DownloaderPinger{
58+
BaseURL: baseURL,
59+
Client: &http.Client{Timeout: 10 * time.Second},
60+
}
61+
}
62+
63+
func (d *DownloaderPinger) GetTorrentsInfo(ctx context.Context) (*TorrentsInfo, error) {
64+
req, err := http.NewRequestWithContext(ctx, http.MethodGet, d.BaseURL+"/downloader/torrentsInfo", nil)
65+
if err != nil {
66+
return nil, fmt.Errorf("create request error: %w", err)
67+
}
68+
69+
resp, err := d.Client.Do(req)
70+
if err != nil {
71+
return nil, fmt.Errorf("http do error: %w", err)
72+
}
73+
defer resp.Body.Close()
74+
75+
if resp.StatusCode != http.StatusOK {
76+
return nil, fmt.Errorf("unexpected status: %s", resp.Status)
77+
}
78+
79+
var info TorrentsInfo
80+
if err := json.NewDecoder(resp.Body).Decode(&info); err != nil {
81+
return nil, fmt.Errorf("decode json error: %w", err)
82+
}
83+
84+
return &info, nil
85+
}
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
package startpage
2+
3+
import (
4+
"fmt"
5+
"github.com/rivo/tview"
6+
)
7+
8+
const E3Logo = ` ________ __ ______
9+
/ | / | / \
10+
$$$$$$$$/ ______ $$/ ______ ______ _______ /$$$$$$ |
11+
$$ |__ / \ / | / \ / \ / \ $$ ___$$ |
12+
$$ | /$$$$$$ |$$ |/$$$$$$ |/$$$$$$ |$$$$$$$ | / $$<
13+
$$$$$/ $$ | $$/ $$ |$$ | $$ |$$ | $$ |$$ | $$ | _$$$$$ |
14+
$$ |_____ $$ | $$ |$$ \__$$ |$$ \__$$ |$$ | $$ | / \__$$ |
15+
$$ |$$ | $$ |$$ $$ |$$ $$/ $$ | $$ | $$ $$/
16+
$$$$$$$$/ $$/ $$/ $$$$$$$ | $$$$$$/ $$/ $$/ $$$$$$/
17+
/ \__$$ |
18+
$$ $$/
19+
$$$$$$/ `
20+
21+
func Body(clock *tview.TextView, datadir string) (*tview.Flex, *BodyView) {
22+
netInf := tview.NewTextView().SetDynamicColors(true).SetText("network info...")
23+
view := &BodyView{
24+
Logo: tview.NewTextView().SetText(E3Logo).SetDynamicColors(true),
25+
Network: NetworkDropdown(netInf),
26+
NetworkInfo: netInf,
27+
Execution: tview.NewTextView().SetDynamicColors(true).SetText("exec/stop"),
28+
Status: tview.NewTextView().SetDynamicColors(true).SetText("status..."),
29+
Clock: clock,
30+
Datadir: tview.NewTextView().SetDynamicColors(true).SetTextAlign(tview.AlignRight).
31+
SetText(fmt.Sprintf("datadir: %s", datadir)),
32+
}
33+
34+
topPanel := tview.NewFlex().
35+
AddItem(view.Logo, 0, 1, false).
36+
AddItem(tview.NewFlex().SetDirection(tview.FlexRow).
37+
AddItem(view.Clock, 1, 1, false).
38+
AddItem(view.Datadir, 0, 5, false), 0, 1, false)
39+
//topPanel.GetItem(1).(*tview.Flex).GetItem(1).(*tview.TextView).Box.SetBorder(true)
40+
networkWidget := tview.NewFlex().SetDirection(tview.FlexRow).
41+
AddItem(view.Network, 0, 1, false).
42+
AddItem(view.NetworkInfo, 0, 1, false)
43+
flex := tview.NewFlex().SetDirection(tview.FlexRow).
44+
AddItem(topPanel,
45+
15, 1, false).
46+
AddItem(tview.NewFlex().
47+
AddItem(networkWidget, 0, 1, false).
48+
AddItem(view.Status, 0, 1, false).
49+
AddItem(view.Execution, 0, 1, false),
50+
0, 1, false)
51+
flex.Box.SetBorder(true)
52+
return flex, view
53+
}
54+
55+
type BodyView struct {
56+
Logo *tview.TextView
57+
Network *tview.DropDown
58+
NetworkInfo *tview.TextView
59+
Datadir *tview.TextView
60+
Execution *tview.TextView
61+
Clock *tview.TextView
62+
Status *tview.TextView
63+
}
64+
65+
var Networks = []string{"mainnet", "hoodi", "sepolia"}
66+
var Network = "mainnet"
67+
68+
func NetworkDropdown(netInf *tview.TextView) *tview.DropDown {
69+
dd := tview.NewDropDown().SetLabel("choose network: ").
70+
SetOptions(Networks, func(text string, index int) {
71+
Network = Networks[index]
72+
netInf.SetText(Network)
73+
}).SetCurrentOption(0)
74+
return dd
75+
}

0 commit comments

Comments
 (0)