aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--LICENSE24
-rw-r--r--c_exec.go6
-rw-r--r--c_hardflip.go10
-rw-r--r--go.mod2
-rw-r--r--i_ui.go70
5 files changed, 97 insertions, 15 deletions
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..2d4af86
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,24 @@
+Copyright (c) 2023 Joe
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+3. Neither the name of the organization nor the
+ names of its contributors may be used to endorse or promote products
+ derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY JOE ''AS IS'' AND ANY
+EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL JOE BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/c_exec.go b/c_exec.go
index b0145f6..fc42957 100644
--- a/c_exec.go
+++ b/c_exec.go
@@ -106,16 +106,16 @@ func c_format_rdp() {
func c_format_cmd(id uint64, lhost *HostList) {
host := lhost.head
- // var cmd_fmt []string
+ var cmd_fmt []string
host = lhost.sel(id)
if host == nil {
c_die("host id not found", nil)
}
if host.Type == 0 {
- // cmd_fmt = format_ssh(host)
+ cmd_fmt = c_format_ssh(host)
}
- // exec_cmd(cmd_fmt)
+ c_exec_cmd(cmd_fmt)
}
func c_display_servers(lhost *HostList) {
diff --git a/c_hardflip.go b/c_hardflip.go
index ed4581a..07e6112 100644
--- a/c_hardflip.go
+++ b/c_hardflip.go
@@ -48,10 +48,10 @@
package main
func main() {
- // var data_dir string
+ var data_dir string
- // data_dir = c_get_data_dir()
- // lhost := c_load_data_dir(data_dir)
- // display_servers(lhost)
- i_ui()
+ data_dir = c_get_data_dir()
+ lhost := c_load_data_dir(data_dir)
+ // c_display_servers(lhost)
+ i_ui(lhost)
}
diff --git a/go.mod b/go.mod
index 01c0257..a68dd53 100644
--- a/go.mod
+++ b/go.mod
@@ -4,6 +4,7 @@ go 1.18
require (
github.com/gdamore/tcell/v2 v2.7.0
+ golang.org/x/term v0.15.0
gopkg.in/yaml.v3 v3.0.1
)
@@ -13,6 +14,5 @@ require (
github.com/mattn/go-runewidth v0.0.15 // indirect
github.com/rivo/uniseg v0.4.3 // indirect
golang.org/x/sys v0.15.0 // indirect
- golang.org/x/term v0.15.0 // indirect
golang.org/x/text v0.14.0 // indirect
)
diff --git a/i_ui.go b/i_ui.go
index 6bc11ff..133f276 100644
--- a/i_ui.go
+++ b/i_ui.go
@@ -39,7 +39,7 @@
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* hardflip: src/c_hardflip.go
- * Mon, 18 Dec 2023 16:50:31 +0100
+ * Mon, 18 Dec 2023 17:59:45 +0100
* Joe
*
* interfacing with the user
@@ -50,9 +50,12 @@ package main
import (
"os"
"github.com/gdamore/tcell/v2"
+ "golang.org/x/term"
)
-func i_draw_text(s tcell.Screen, x1, y1, x2, y2 int, style tcell.Style, text string) {
+func i_draw_text(s tcell.Screen,
+ x1, y1, x2, y2 int,
+ style tcell.Style, text string) {
row := y1
col := x1
for _, r := range []rune(text) {
@@ -68,7 +71,56 @@ func i_draw_text(s tcell.Screen, x1, y1, x2, y2 int, style tcell.Style, text str
}
}
-func i_ui() {
+func i_draw_box(s tcell.Screen,
+ x1, y1, x2, y2 int,
+ title string, content string) {
+ style := tcell.StyleDefault.Background(tcell.ColorReset).Foreground(tcell.ColorReset)
+
+ if y2 < y1 {
+ y1, y2 = y2, y1
+ }
+ if x2 < x1 {
+ x1, x2 = x2, x1
+ }
+ // Draw borders
+ for col := x1; col <= x2; col++ {
+ s.SetContent(col, y1, tcell.RuneHLine, nil, style)
+ s.SetContent(col, y2, tcell.RuneHLine, nil, style)
+ }
+ for row := y1 + 1; row < y2; row++ {
+ s.SetContent(x1, row, tcell.RuneVLine, nil, style)
+ s.SetContent(x2, row, tcell.RuneVLine, nil, style)
+ }
+
+ // Only draw corners if necessary
+ if y1 != y2 && x1 != x2 {
+ s.SetContent(x1, y1, tcell.RuneULCorner, nil, style)
+ s.SetContent(x2, y1, tcell.RuneURCorner, nil, style)
+ s.SetContent(x1, y2, tcell.RuneLLCorner, nil, style)
+ s.SetContent(x2, y2, tcell.RuneLRCorner, nil, style)
+ }
+
+ 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) {
+ i_draw_box(s, 0, 0,
+ term_w / 3, term_h - 2,
+ " hosts ", "")
+}
+
+func i_info_panel(s tcell.Screen, term_w, term_h int) {
+ i_draw_box(s, (term_w / 3) + 1, 0,
+ term_w - 1, term_h - 2,
+ " infos ", "")
+}
+
+func i_ui(lhost *HostList) {
screen, err := tcell.NewScreen()
if err != nil {
c_die("view", err)
@@ -76,21 +128,27 @@ func i_ui() {
if err := screen.Init(); err != nil {
c_die("view", err)
}
- def_style := tcell.StyleDefault.Background(tcell.ColorReset).Foreground(tcell.ColorReset)
+ def_style := tcell.StyleDefault.
+ Background(tcell.ColorReset).
+ Foreground(tcell.ColorReset)
screen.SetStyle(def_style)
quit := func() {
screen.Fini()
os.Exit(0)
}
for {
- i_draw_text(screen, 0, 0, 30, 0, def_style, "hey fuck you")
+ 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)
screen.Show()
ev := screen.PollEvent()
switch ev := ev.(type) {
case *tcell.EventResize:
screen.Sync()
case *tcell.EventKey:
- if ev.Key() == tcell.KeyEscape || ev.Key() == tcell.KeyCtrlC {
+ if ev.Key() == tcell.KeyEscape || ev.Key() == tcell.KeyCtrlC || ev.Rune() == 'q' || ev.Rune() == 'Q' {
quit()
}
}