diff options
Diffstat (limited to '')
-rw-r--r-- | c_exec.go | 18 | ||||
-rw-r--r-- | c_hardflip.go | 1 | ||||
-rw-r--r-- | c_lhosts.go | 12 | ||||
-rw-r--r-- | c_parse.go | 14 | ||||
-rw-r--r-- | i_ui.go | 140 |
5 files changed, 159 insertions, 26 deletions
@@ -101,7 +101,8 @@ func c_format_ssh(host *HostNode) []string { return cmd_fmt } -func c_format_rdp() { +func c_format_rdp(host *HostNode) []string { + return []string{""} } func c_format_cmd(id uint64, lhost *HostList) { @@ -114,21 +115,18 @@ func c_format_cmd(id uint64, lhost *HostList) { } if host.Type == 0 { cmd_fmt = c_format_ssh(host) + } else if host.Type == 1 { + cmd_fmt = c_format_rdp(host) + } else if host.Type > 1 { + c_die("type not found", nil) } c_exec_cmd(cmd_fmt) } -func c_display_servers(lhost *HostList) { - host := lhost.head - +func c_exec(id uint64, lhost *HostList) { if lhost.head == nil { fmt.Println("no hosts") return } - for host != nil { - fmt.Println(host.ID, host.Folder + host.Name) - host = host.next - } - fmt.Println() - c_format_cmd(4, lhost) + c_format_cmd(id, lhost) } diff --git a/c_hardflip.go b/c_hardflip.go index 07e6112..93a179b 100644 --- a/c_hardflip.go +++ b/c_hardflip.go @@ -52,6 +52,5 @@ func main() { data_dir = c_get_data_dir() lhost := c_load_data_dir(data_dir) - // c_display_servers(lhost) i_ui(lhost) } diff --git a/c_lhosts.go b/c_lhosts.go index 8e9a416..d98305c 100644 --- a/c_lhosts.go +++ b/c_lhosts.go @@ -110,6 +110,7 @@ func (lhost *HostList) del(id uint64) { // return the list node with the according id func (lhost *HostList) sel(id uint64) *HostNode { curr := lhost.head + for curr.next != nil && curr.ID != id { curr = curr.next } @@ -118,3 +119,14 @@ func (lhost *HostList) sel(id uint64) *HostNode { } return curr } + +func (lhost *HostList) count() uint64 { + curr := lhost.head + var count uint64 = 0 + + for curr != nil { + curr = curr.next + count++ + } + return count +} @@ -68,5 +68,19 @@ func c_read_yaml_file(file string) *HostNode { if len(host.Host) == 0 { return nil } + if host.Type == 0 { + if host.Port == 0 { + host.Port = 22 + } + if len(host.User) == 0 { + host.User = "root" + } + } else if host.Type == 1 { + if host.Port == 0 { + host.Port = 3389 + } + } else if host.Type > 1 { + host_type = "Unknown" + } return &host } @@ -39,7 +39,7 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * hardflip: src/c_hardflip.go - * Mon, 18 Dec 2023 17:59:45 +0100 + * Mon, 18 Dec 2023 19:01:59 +0100 * Joe * * interfacing with the user @@ -49,6 +49,7 @@ package main import ( "os" + "strconv" "github.com/gdamore/tcell/v2" "golang.org/x/term" ) @@ -71,9 +72,7 @@ func i_draw_text(s tcell.Screen, } } -func i_draw_box(s tcell.Screen, - x1, y1, x2, y2 int, - title string, content string) { +func i_draw_box(s tcell.Screen, x1, y1, x2, y2 int, title string) { style := tcell.StyleDefault.Background(tcell.ColorReset).Foreground(tcell.ColorReset) if y2 < y1 { @@ -101,27 +100,118 @@ func i_draw_box(s tcell.Screen, } i_draw_text(s, x1 + 1, y1, x2 - 1, y2 - 1, style, title) - i_draw_text(s, x1 + 1, y1 + 1, x2 - 1, y2 - 1, style, content) } func i_bottom_text(s tcell.Screen, term_w, term_h int, style tcell.Style) { i_draw_text(s, 0, term_h - 1, term_w - 1, term_h, style, "(q) Quit") } -func i_hosts_panel(s tcell.Screen, term_w, term_h int, lhost *HostList) { +func i_hosts_panel(s tcell.Screen, + term_w, term_h int, + def_style tcell.Style, lhost *HostList, + sel uint64, sel_max uint64) { i_draw_box(s, 0, 0, term_w / 3, term_h - 2, - " hosts ", "") + " hosts ") + host := lhost.head + for host != nil { + style := def_style + if sel == host.ID { + style = tcell.StyleDefault. + Background(tcell.ColorWhite). + Foreground(tcell.ColorBlack) + } + spaces := "" + i := 0 + for i < (term_w / 3) - len(host.Folder + host.Name) - 3 { + spaces += " " + i++ + } + i_draw_text(s, + 1, int(host.ID) + 1, term_w / 3 - 1, int(host.ID) + 1, + style, " " + host.Folder + host.Name + spaces) + host = host.next + } + i_draw_text(s, + 1, term_h - 2, (term_w / 3) - 1, term_h - 1, + def_style, " " + strconv.Itoa(int(sel_max)) + " hosts ") } -func i_info_panel(s tcell.Screen, term_w, term_h int) { +func i_info_panel(s tcell.Screen, + term_w, term_h int, + def_style tcell.Style, lhost *HostList, sel uint64) { + title_style := tcell.StyleDefault. + Background(tcell.ColorReset). + Foreground(tcell.ColorBlue).Dim(true).Bold(true) + host := lhost.sel(sel) + curr_line := 2 + var host_type string + var pass string + var port int + i_draw_box(s, (term_w / 3) + 1, 0, term_w - 1, term_h - 2, - " infos ", "") + " infos ") + if host.Type == 0 { + host_type = "SSH" + } else if host.Type == 1 { + host_type = "RDP" + } else if host.Type > 1 { + host_type = "Unknown" + } + if len(host.Pass) > 0 { + pass = "***" + } + + i_draw_text(s, + (term_w / 3) + 4, curr_line, term_w - 2, curr_line, + title_style, "Name: ") + i_draw_text(s, + (term_w / 3) + 10, curr_line, term_w - 2, curr_line, + def_style, host.Name) + curr_line += 1 + i_draw_text(s, + (term_w / 3) + 4, curr_line, term_w - 2, curr_line, + title_style, "Type: ") + i_draw_text(s, + (term_w / 3) + 10, curr_line, term_w - 2, curr_line, + def_style, host_type) + curr_line += 2 + i_draw_text(s, + (term_w / 3) + 4, curr_line, term_w - 2, curr_line, + title_style, "Host: ") + i_draw_text(s, + (term_w / 3) + 10, curr_line, term_w - 2, curr_line, + def_style, host.Host) + curr_line += 1 + i_draw_text(s, + (term_w / 3) + 4, curr_line, term_w - 2, curr_line, + title_style, "Port: ") + i_draw_text(s, + (term_w / 3) + 10, curr_line, term_w - 2, curr_line, + def_style, strconv.Itoa(port)) + curr_line += 2 + i_draw_text(s, + (term_w / 3) + 4, curr_line, term_w - 2, curr_line, + title_style, "User: ") + i_draw_text(s, + (term_w / 3) + 10, curr_line, term_w - 2, curr_line, + def_style, host.User) + curr_line += 1 + i_draw_text(s, + (term_w / 3) + 4, curr_line, term_w - 2, curr_line, + title_style, "Pass: ") + i_draw_text(s, + (term_w / 3) + 10, curr_line, term_w - 2, curr_line, + def_style, pass) + curr_line += 1 } func i_ui(lhost *HostList) { screen, err := tcell.NewScreen() + var sel uint64 = 0 + sel_max := lhost.count() + if err != nil { c_die("view", err) } @@ -134,22 +224,42 @@ func i_ui(lhost *HostList) { screen.SetStyle(def_style) quit := func() { screen.Fini() - os.Exit(0) } for { term_w, term_h, _ := term.GetSize(0) screen.Clear() i_bottom_text(screen, term_w, term_h, def_style) - i_hosts_panel(screen, term_w, term_h, lhost) - i_info_panel(screen, term_w, term_h) + i_hosts_panel(screen, term_w, term_h, def_style, lhost, sel, sel_max) + i_info_panel(screen, term_w, term_h, def_style, lhost, sel) screen.Show() - ev := screen.PollEvent() - switch ev := ev.(type) { + event := screen.PollEvent() + switch event := event.(type) { case *tcell.EventResize: screen.Sync() case *tcell.EventKey: - if ev.Key() == tcell.KeyEscape || ev.Key() == tcell.KeyCtrlC || ev.Rune() == 'q' || ev.Rune() == 'Q' { + if event.Key() == tcell.KeyEscape || + event.Key() == tcell.KeyCtrlC || + event.Rune() == 'q' || + event.Rune() == 'Q' { + quit() + os.Exit(0) + } + if event.Rune() == 'j' || + event.Key() == tcell.KeyDown { + if sel < sel_max - 1 { + sel += 1 + } + } + if event.Rune() == 'k' || + event.Key() == tcell.KeyUp { + if sel > 0 { + sel -= 1 + } + } + if event.Key() == tcell.KeyEnter { quit() + c_exec(sel, lhost) + os.Exit(0) } } } |