From b6bbf30bd0fbbb9f04b029b00ac4536da4180ee2 Mon Sep 17 00:00:00 2001 From: durbok Date: Sat, 28 Dec 2024 15:54:49 +0100 Subject: [PATCH] update app --- .env | 5 +++++ config/env.go | 19 ++++++++++++++++++ db/mysql.go | 28 +++++++++++++++++++++++++++ main.go | 13 +++++++++++++ mysql-compose.yml | 24 +++++++++++++++++++++++ ssh/connect.go | 49 +++++++++++++++++++++++++++++++++++++++++++++++ tui/interface.go | 27 ++++++++++++++++++++++++++ 7 files changed, 165 insertions(+) create mode 100644 .env create mode 100644 config/env.go create mode 100644 db/mysql.go create mode 100644 main.go create mode 100644 mysql-compose.yml create mode 100644 ssh/connect.go create mode 100644 tui/interface.go diff --git a/.env b/.env new file mode 100644 index 0000000..5c93e97 --- /dev/null +++ b/.env @@ -0,0 +1,5 @@ +DB_USER=root +DB_PASSWORD=password +DB_HOST=127.0.0.1 +DB_PORT=3306 +DB_NAME=sessions \ No newline at end of file diff --git a/config/env.go b/config/env.go new file mode 100644 index 0000000..55fa1f8 --- /dev/null +++ b/config/env.go @@ -0,0 +1,19 @@ +package config + +import ( + "log" + "os" + + "github.com/joho/godotenv" +) + +func LoadEnv() { + err := godotenv.Load() + if err != nil { + log.Fatalf("Error loading .env file") + } +} + +func GetEnv(key string) string { + return os.Getenv(key) +} diff --git a/db/mysql.go b/db/mysql.go new file mode 100644 index 0000000..4162ad3 --- /dev/null +++ b/db/mysql.go @@ -0,0 +1,28 @@ +package db + +import ( + "database/sql" + "fmt" + "log" + + "tui-ssh-app/config" + + _ "github.com/go-sql-driver/mysql" +) + +var DB *sql.DB + +func ConnectDB() { + var err error + dsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s", + config.GetEnv("DB_USER"), + config.GetEnv("DB_PASSWORD"), + config.GetEnv("DB_HOST"), + config.GetEnv("DB_PORT"), + config.GetEnv("DB_NAME"), + ) + DB, err = sql.Open("mysql", dsn) + if err != nil { + log.Fatalf("Error connecting to database: %v", err) + } +} diff --git a/main.go b/main.go new file mode 100644 index 0000000..b1bfde1 --- /dev/null +++ b/main.go @@ -0,0 +1,13 @@ +package main + +import ( + "tui-ssh-app/config" + "tui-ssh-app/db" + "tui-ssh-app/tui" +) + +func main() { + config.LoadEnv() + db.ConnectDB() + tui.StartTUI() +} diff --git a/mysql-compose.yml b/mysql-compose.yml new file mode 100644 index 0000000..3bec24f --- /dev/null +++ b/mysql-compose.yml @@ -0,0 +1,24 @@ +services: + + mysql: + image: mysql:8.0 + container_name: mysql8 + hostname: mysql-8 + command: '--default-authentication-plugin=mysql_native_password' + # cap_add: + # - SYS_NICE # CAP_SYS_NICE + # volumes: + # - ./conf:/etc/mysql/conf.d + # - ./dbdata:/var/lib/mysql + ports: + - "3306:3306" + environment: + # MYSQL_ALLOW_EMPTY_PASSWORD: "yes" + MYSQL_ROOT_PASSWORD: password + MYSQL_USER: "user" + MYSQL_PASSWORD: "password" + MYSQL_DATABASE: "sessions" + healthcheck: + test: ["CMD", "mysqladmin" ,"ping", "-h", "localhost"] + timeout: 20s + retries: 10 \ No newline at end of file diff --git a/ssh/connect.go b/ssh/connect.go new file mode 100644 index 0000000..119c374 --- /dev/null +++ b/ssh/connect.go @@ -0,0 +1,49 @@ +package ssh + +import ( + "fmt" + "io/ioutil" + + "golang.org/x/crypto/ssh" +) + +type SSHConfig struct { + User string + Host string + Port string + Password string + PrivateKey string +} + +func ConnectSSH(config SSHConfig) error { + var auth ssh.AuthMethod + + if config.PrivateKey != "" { + key, err := ioutil.ReadFile(config.PrivateKey) + if err != nil { + return fmt.Errorf("failed to read private key: %v", err) + } + signer, err := ssh.ParsePrivateKey(key) + if err != nil { + return fmt.Errorf("failed to parse private key: %v", err) + } + auth = ssh.PublicKeys(signer) + } else { + auth = ssh.Password(config.Password) + } + + clientConfig := &ssh.ClientConfig{ + User: config.User, + Auth: []ssh.AuthMethod{auth}, + HostKeyCallback: ssh.InsecureIgnoreHostKey(), // Use a proper callback for production! + } + + client, err := ssh.Dial("tcp", fmt.Sprintf("%s:%s", config.Host, config.Port), clientConfig) + if err != nil { + return fmt.Errorf("failed to connect to SSH: %v", err) + } + defer client.Close() + + fmt.Println("Connected to SSH successfully!") + return nil +} diff --git a/tui/interface.go b/tui/interface.go new file mode 100644 index 0000000..08e1978 --- /dev/null +++ b/tui/interface.go @@ -0,0 +1,27 @@ +package tui + +import ( + "github.com/rivo/tview" +) + +func StartTUI() { + app := tview.NewApplication() + + form := tview.NewForm(). + AddInputField("User", "", 20, nil, nil). + AddInputField("Host", "", 20, nil, nil). + AddInputField("Port", "22", 5, nil, nil). + AddPasswordField("Password", "", 20, '*', nil). + AddInputField("Private Key", "", 20, nil, nil). + AddButton("Connect", func() { + // Handle SSH connection logic + }). + AddButton("Quit", func() { + app.Stop() + }) + + form.SetBorder(true).SetTitle("SSH Connection").SetTitleAlign(tview.AlignLeft) + if err := app.SetRoot(form, true).Run(); err != nil { + panic(err) + } +}