update app
This commit is contained in:
5
.env
Normal file
5
.env
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
DB_USER=root
|
||||||
|
DB_PASSWORD=password
|
||||||
|
DB_HOST=127.0.0.1
|
||||||
|
DB_PORT=3306
|
||||||
|
DB_NAME=sessions
|
||||||
19
config/env.go
Normal file
19
config/env.go
Normal file
@@ -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)
|
||||||
|
}
|
||||||
28
db/mysql.go
Normal file
28
db/mysql.go
Normal file
@@ -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)
|
||||||
|
}
|
||||||
|
}
|
||||||
13
main.go
Normal file
13
main.go
Normal file
@@ -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()
|
||||||
|
}
|
||||||
24
mysql-compose.yml
Normal file
24
mysql-compose.yml
Normal file
@@ -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
|
||||||
49
ssh/connect.go
Normal file
49
ssh/connect.go
Normal file
@@ -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
|
||||||
|
}
|
||||||
27
tui/interface.go
Normal file
27
tui/interface.go
Normal file
@@ -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)
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user