mirror of
https://github.com/bettercap/bettercap
synced 2025-08-19 21:13:18 -07:00
new: custom prompt
This commit is contained in:
parent
2cda9c8c67
commit
7dccb87aa8
2 changed files with 91 additions and 8 deletions
86
session/prompt.go
Normal file
86
session/prompt.go
Normal file
|
@ -0,0 +1,86 @@
|
||||||
|
package session
|
||||||
|
|
||||||
|
import (
|
||||||
|
"regexp"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"github.com/evilsocket/bettercap-ng/core"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
PromptVariable = "$"
|
||||||
|
DefaultPrompt = "{by}{fw}{iface.cidr} {fb}> {iface.addr} {reset} {bold}» {reset}"
|
||||||
|
)
|
||||||
|
|
||||||
|
var PromptEffects = map[string]string{
|
||||||
|
"{bold}": core.BOLD,
|
||||||
|
"{dim}": core.DIM,
|
||||||
|
"{r}": core.RED,
|
||||||
|
"{g}": core.GREEN,
|
||||||
|
"{b}": core.BLUE,
|
||||||
|
"{y}": core.YELLOW,
|
||||||
|
"{fb}": core.FG_BLACK,
|
||||||
|
"{fw}": core.FG_WHITE,
|
||||||
|
"{bdg}": core.BG_DGRAY,
|
||||||
|
"{br}": core.BG_RED,
|
||||||
|
"{bg}": core.BG_GREEN,
|
||||||
|
"{by}": core.BG_YELLOW,
|
||||||
|
"{blb}": core.BG_LBLUE, // Ziggy this is for you <3
|
||||||
|
"{reset}": core.RESET,
|
||||||
|
}
|
||||||
|
|
||||||
|
var PromptCallbacks = map[string]func(s *Session) string{
|
||||||
|
"{iface.cidr}": func(s *Session) string {
|
||||||
|
return s.Interface.CIDR()
|
||||||
|
},
|
||||||
|
"{iface.addr}": func(s *Session) string {
|
||||||
|
return s.Interface.IpAddress
|
||||||
|
},
|
||||||
|
"{iface.mac}": func(s *Session) string {
|
||||||
|
return s.Interface.HwAddress
|
||||||
|
},
|
||||||
|
"{gw.addr}": func(s *Session) string {
|
||||||
|
return s.Gateway.IpAddress
|
||||||
|
},
|
||||||
|
"{gw.mac}": func(s *Session) string {
|
||||||
|
return s.Gateway.HwAddress
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
var envRe = regexp.MustCompile("{env\\.(.+)}")
|
||||||
|
|
||||||
|
type Prompt struct {
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewPrompt() Prompt {
|
||||||
|
return Prompt{}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p Prompt) Render(s *Session) string {
|
||||||
|
found, prompt := s.Env.Get(PromptVariable)
|
||||||
|
if found == false {
|
||||||
|
prompt = DefaultPrompt
|
||||||
|
}
|
||||||
|
|
||||||
|
for tok, effect := range PromptEffects {
|
||||||
|
prompt = strings.Replace(prompt, tok, effect, -1)
|
||||||
|
}
|
||||||
|
|
||||||
|
for tok, cb := range PromptCallbacks {
|
||||||
|
prompt = strings.Replace(prompt, tok, cb(s), -1)
|
||||||
|
}
|
||||||
|
|
||||||
|
m := envRe.FindStringSubmatch(prompt)
|
||||||
|
if len(m) == 2 {
|
||||||
|
name := m[1]
|
||||||
|
_, value := s.Env.Get(name)
|
||||||
|
prompt = strings.Replace(prompt, m[0], value, -1)
|
||||||
|
}
|
||||||
|
|
||||||
|
// make sure an user error does not screw all terminal
|
||||||
|
if strings.HasPrefix(prompt, core.RESET) == false {
|
||||||
|
prompt += core.RESET
|
||||||
|
}
|
||||||
|
|
||||||
|
return prompt
|
||||||
|
}
|
|
@ -32,6 +32,7 @@ type Session struct {
|
||||||
Queue *packets.Queue `json:"-"`
|
Queue *packets.Queue `json:"-"`
|
||||||
Input *readline.Instance `json:"-"`
|
Input *readline.Instance `json:"-"`
|
||||||
Active bool `json:"active"`
|
Active bool `json:"active"`
|
||||||
|
Prompt Prompt `json:"-"`
|
||||||
|
|
||||||
CoreHandlers []CommandHandler `json:"-"`
|
CoreHandlers []CommandHandler `json:"-"`
|
||||||
Modules []Module `json:"-"`
|
Modules []Module `json:"-"`
|
||||||
|
@ -44,6 +45,7 @@ func New() (*Session, error) {
|
||||||
var err error
|
var err error
|
||||||
|
|
||||||
s := &Session{
|
s := &Session{
|
||||||
|
Prompt: NewPrompt(),
|
||||||
Env: nil,
|
Env: nil,
|
||||||
Active: false,
|
Active: false,
|
||||||
Queue: nil,
|
Queue: nil,
|
||||||
|
@ -161,6 +163,8 @@ func (s *Session) Start() error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
s.Env.Set(PromptVariable, DefaultPrompt)
|
||||||
|
|
||||||
s.Env.Set("iface.name", s.Interface.Name())
|
s.Env.Set("iface.name", s.Interface.Name())
|
||||||
s.Env.Set("iface.address", s.Interface.IpAddress)
|
s.Env.Set("iface.address", s.Interface.IpAddress)
|
||||||
s.Env.Set("iface.mac", s.Interface.HwAddress)
|
s.Env.Set("iface.mac", s.Interface.HwAddress)
|
||||||
|
@ -224,14 +228,7 @@ func (s *Session) Start() error {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Session) ReadLine() (string, error) {
|
func (s *Session) ReadLine() (string, error) {
|
||||||
prompt := core.FG_WHITE + core.BG_YELLOW + " " + s.Interface.CIDR() +
|
s.Input.SetPrompt(s.Prompt.Render(s))
|
||||||
core.FG_BLACK +
|
|
||||||
" > " +
|
|
||||||
s.Interface.IpAddress +
|
|
||||||
" " + core.RESET +
|
|
||||||
core.BOLD + " » " + core.RESET
|
|
||||||
|
|
||||||
s.Input.SetPrompt(prompt)
|
|
||||||
s.Input.Refresh()
|
s.Input.Refresh()
|
||||||
return s.Input.Readline()
|
return s.Input.Readline()
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue