From 4d785d5c461dadd0771f772d49f94ac9d41dda09 Mon Sep 17 00:00:00 2001 From: Refaldy Date: Thu, 10 Aug 2023 14:07:37 +0700 Subject: [PATCH] add server help --- README.md | 174 +++++++++++++++++++++++++++++++-------------- env/env.go | 5 ++ go.mod | 22 ++++++ key/key.go | 24 +++++++ main.go | 14 ++++ model/key.go | 11 +++ present/present.go | 81 +++++++++++++++++++++ 7 files changed, 276 insertions(+), 55 deletions(-) create mode 100644 model/key.go diff --git a/README.md b/README.md index 594f90e..3daebb2 100644 --- a/README.md +++ b/README.md @@ -1,87 +1,151 @@ +# Hydra-Env -# Hydra Environment Manager +Hydra-Env adalah alat baris perintah (command-line tool) untuk mengelola variabel lingkungan (environment variables) dan kunci (keys), serta memiliki kemampuan integrasi dengan MongoDB. Alat ini memungkinkan Anda dengan mudah membuat, mengelola, dan memuat variabel lingkungan dari berkas, menghasilkan dan menyimpan kunci dengan aman, serta berinteraksi dengan server MongoDB untuk penyimpanan data. -Hydra Environment Manager adalah alat baris perintah yang memungkinkan Anda mengelola konfigurasi lingkungan secara aman menggunakan pasangan kunci-nilai yang dienkripsi. Alat ini memungkinkan Anda untuk membuat, mengubah, dan menghapus kunci sambil memastikan nilai-nilai dienkripsi, menjaga privasi data. +## Instalasi -## Fitur +Untuk menginstal Hydra-Env, ikuti langkah-langkah berikut: -- Menghasilkan dan mencetak kunci enkripsi yang aman. -- Membuat, membaca, memperbarui, dan menghapus pasangan kunci-nilai dalam berkas lingkungan JSON. -- Melakukan enkripsi dan dekripsi nilai untuk keamanan yang lebih baik. -## Memulai +1. Buat berkas biner eksekusi: -1. Install aplikasi: - - ```shell + ```bash go install github.com/refaldyrk/hydra-env@latest ``` -2. Jalankan aplikasi: - ```shell - # Generate encryption key - hydra-env --gen-key +## Penggunaan - # Create an environment file (if not set) - hydra-env --env=mycustomenv.json +Hydra-Env menyediakan serangkaian perintah untuk mengelola variabel lingkungan, kunci, dan berinteraksi dengan server MongoDB. Berikut adalah perintah-perintah yang tersedia: - # Add a new key-value pair to the environment file - hydra-env --env=mycustomenv.json --add-key="api_key|my_secret_key" +### Menghasilkan dan Mencetak Kunci Baru - # Retrieve the value of a key from the environment file - hydra -env--env=mycustomenv.json --get-key=api_key +Menghasilkan kunci baru dan mencetaknya ke konsol. - # List all keys in the environment file - hydra-env --env=mycustomenv.json --list-keys +```bash +hydra-env -gen-key +``` - # Load all keys in the environment file - hydra-env --env=mycustomenv.json --load-env=example.env +### Menambahkan Kunci Baru - # Delete a key from the environment file - hydra-env --env=mycustomenv.json --del-key=api_key - ``` +Menambahkan kunci baru ke berkas lingkungan. -## Penggunaan +```bash +hydra-env -env=path/ke/berkas/env -add-key=namaKunci|nilaiKunci +``` -- Untuk menghasilkan kunci enkripsi baru: +### Mendapatkan Nilai Kunci - ```shell - hydra-env --gen-key - ``` +Mendapatkan nilai dari kunci tertentu dalam lingkungan. -- Untuk menambahkan pasangan kunci-nilai baru ke berkas lingkungan: +```bash +hydra-env -env=path/ke/berkas/env -get-key=namaKunci +``` - ```shell - hydra-env --env=mycustomenv.json --add-key="api_key|my_secret_key" - ``` +### Daftar Kunci -- Untuk mendapatkan nilai dari kunci dalam berkas lingkungan: +Menampilkan daftar semua kunci yang ada dalam berkas lingkungan. - ```shell - hydra-env --env=mycustomenv.json --get-key=api_key - ``` +```bash +hydra-env -env=path/ke/berkas/env -list-keys +``` -- Untuk menampilkan daftar semua kunci dalam berkas lingkungan: +### Menghapus Kunci - ```shell - hydra-env --env=mycustomenv.json --list-keys - ``` +Menghapus kunci tertentu dari lingkungan. -- Untuk menambahkan daftar semua kunci dalam berkas lingkungan: +```bash +hydra-env -env=path/ke/berkas/env -del-key=namaKunci +``` - ```shell - hydra-env --env=mycustomenv.json --load-env=example.env - ``` +### Memuat Lingkungan dari Berkas -- Untuk menghapus kunci dari berkas lingkungan: +Memuat variabel lingkungan dari berkas dan menambahkannya ke lingkungan. - ```shell - hydra-env --env=mycustomenv.json --del-key=api_key - ``` +```bash +hydra-env -env=custom.json -load-env=path/ke/berkas/env +``` + +### Perintah Server + +Berinteraksi dengan server MongoDB menggunakan perintah-perintah berikut: + +- Pengecekan koneksi server: + +```bash +hydra-env -server=ping -env=path/ke/berkas/env +``` + +- Menampilkan bantuan perintah server: + +```bash +hydra-env -server=help +``` + +## Konfigurasi + +Sebelum menggunakan Hydra-Env, pastikan Anda telah mengatur variabel lingkungan `HYDRA_MONGO_SERVER` untuk menentukan URL server MongoDB. + +```bash +export HYDRA_MONGO_SERVER=mongodb://localhost:27017 +``` + +## Contoh + +1. Menghasilkan dan mencetak kunci baru: + +```bash +hydra-env -gen-key +``` + +2. Menambahkan kunci baru: + +```bash +hydra-env -env=contoh.json -add-key=KUNCI_API|nilai-kunci-api-anda +``` + +3. Mendapatkan nilai kunci: + +```bash +hydra-env -env=contoh.json -get-key=KUNCI_API +``` + +4. Menampilkan daftar kunci: + +```bash +hydra-env -env=contoh.json -list-keys +``` + +5. Menghapus kunci: + +```bash +hydra-env -env=contoh.json -del-key=KUNCI_API +``` + +6. Memuat lingkungan dari berkas: + +```bash +hydra-env -load-env=berkas_env.env +``` + +7. Berinteraksi dengan server MongoDB - Pengecekan koneksi: + +```bash +hydra-env -server=ping -env=contoh.json +``` + +8. Berinteraksi dengan server MongoDB - Mengimpor kunci dan data lingkungan: + +```bash +hydra-env -server=import -env=contoh.json -serverURL=mongodb://localhost:27017 +``` + +9. Menampilkan bantuan perintah server: -## Kontribusi +```bash +hydra-env -server=help +``` -Kontribusi sangat diterima! Jika Anda menemukan bug atau memiliki saran perbaikan, jangan ragu untuk membuka *issue* atau mengajukan *pull request*. +## Kontak -.... +Untuk pertanyaan, silakan hubungi [Email](mailto:refaldy.rizky22@gmail.com). diff --git a/env/env.go b/env/env.go index eb96241..dd6ed79 100644 --- a/env/env.go +++ b/env/env.go @@ -23,6 +23,11 @@ func (e *Env) SetHelperConfig(filePath string, hcc *helper.HelperConfig) { e.hc = hcc } +func (e *Env) GetHC() *helper.HelperConfig { + fmt.Println(e.hc) + return e.hc +} + func (e *Env) CreateKeyFile(data map[string]interface{}) error { existingData, err := e.hc.ReadOrCreateJSON() if err != nil { diff --git a/go.mod b/go.mod index ffba5cf..59ea0af 100644 --- a/go.mod +++ b/go.mod @@ -5,4 +5,26 @@ go 1.20 require ( github.com/google/uuid v1.3.0 github.com/mervick/aes-everywhere/go/aes256 v0.0.0-20220903070135-f13ed3789ae1 + github.com/qiniu/qmgo v1.1.8 +) + +require ( + github.com/go-playground/locales v0.13.0 // indirect + github.com/go-playground/universal-translator v0.17.0 // indirect + github.com/go-playground/validator/v10 v10.4.1 // indirect + github.com/golang/snappy v0.0.1 // indirect + github.com/klauspost/compress v1.13.6 // indirect + github.com/leodido/go-urn v1.2.0 // indirect + github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/xdg-go/pbkdf2 v1.0.0 // indirect + github.com/xdg-go/scram v1.1.1 // indirect + github.com/xdg-go/stringprep v1.0.3 // indirect + github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d // indirect + go.mongodb.org/mongo-driver v1.11.6 // indirect + golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d // indirect + golang.org/x/sync v0.0.0-20210220032951-036812b2e83c // indirect + golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1 // indirect + golang.org/x/text v0.3.7 // indirect + gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22 ) diff --git a/key/key.go b/key/key.go index 9e2e393..6157b1e 100644 --- a/key/key.go +++ b/key/key.go @@ -1,7 +1,10 @@ package key import ( + "encoding/json" "errors" + "io/ioutil" + "os" "log" @@ -14,6 +17,27 @@ type Key struct { key string } +func (k *Key) ReadJSON() (map[string]interface{}, error) { + file, err := os.Open("key.json") + if err != nil { + return nil, err + } + defer file.Close() + + data, err := ioutil.ReadAll(file) + if err != nil { + return nil, err + } + + var jsonData map[string]interface{} + err = json.Unmarshal(data, &jsonData) + if err != nil { + return nil, err + } + + return jsonData, nil +} + func DefaultKey() *Key { hc := helper.NewHelperConfig(&helper.HelperConfig{FilePath: "key.json"}) return &Key{key: "hydra", hc: hc} diff --git a/main.go b/main.go index 093b105..222e2bc 100644 --- a/main.go +++ b/main.go @@ -2,6 +2,8 @@ package main import ( "flag" + "fmt" + "os" "github.com/refaldyrk/hydra-env/env" "github.com/refaldyrk/hydra-env/key" @@ -13,6 +15,8 @@ func main() { } func initFlag() { + //Get Environment HYDRA_MONGO_SERVER + mongoURL := os.Getenv("HYDRA_MONGO_SERVER") key := key.DefaultKey() envis := env.DefaultEnv() presents := present.NewPresent(envis, key) @@ -25,6 +29,9 @@ func initFlag() { listKeysFlag := flag.Bool("list-keys", false, "List all keys in the environment file") delKeyFlag := flag.String("del-key", "", "Delete a key by specifying the key name") + //Server Flag + serverFlag := flag.String("server", "", "run your server command, if u wanna see list command please send --server=help") + flag.Parse() if *envFlag != "" { @@ -56,4 +63,11 @@ func initFlag() { presents.LoadEnvFlag(*loadEnvFlag) } + if *serverFlag != "" { + if mongoURL == "" { + fmt.Println("[HYDRA] Not Found Your HYDRA_MONGO_SERVER: Set Your Environment And Try Again") + return + } + presents.ServerFlag(*envFlag, *serverFlag, mongoURL) + } } diff --git a/model/key.go b/model/key.go new file mode 100644 index 0000000..64d7129 --- /dev/null +++ b/model/key.go @@ -0,0 +1,11 @@ +package model + +import "go.mongodb.org/mongo-driver/bson/primitive" + +type Key struct { + ID primitive.ObjectID `bson:"_id"` + KeyID string `bson:"key_id"` + Key string `bson:"key"` + Directory string `bson:"directory"` + Filename string `bson:"filename"` +} diff --git a/present/present.go b/present/present.go index 7fa8bfb..fdefe42 100644 --- a/present/present.go +++ b/present/present.go @@ -1,14 +1,19 @@ package present import ( + "context" "fmt" "io/ioutil" "log" "os" "strings" + "github.com/google/uuid" + "github.com/qiniu/qmgo" "github.com/refaldyrk/hydra-env/env" "github.com/refaldyrk/hydra-env/key" + "github.com/refaldyrk/hydra-env/model" + "go.mongodb.org/mongo-driver/bson/primitive" ) type Present struct { @@ -155,3 +160,79 @@ func (p *Present) LoadEnvFlag(loadEnvFlag string) { } log.Println("[HYDRA] Success Load Env ", loadEnvFlag) } + +func (p *Present) ServerFlag(envFlag string, serverFlag string, serverURL string) { + //Connect MongoDB + cli, err := qmgo.NewClient(context.Background(), &qmgo.Config{Uri: serverURL}) + database := cli.Database("HYDRA") + if err != nil { + log.Println("[HYDRA] Error: ", err.Error()) + return + } + + switch serverFlag { + case "ping": + err := cli.Ping(3000) + if err != nil { + log.Println("[HYDRA] Error: ", err.Error()) + break + } else { + log.Println("[HYDRA] Ping Server Successfully") + } + break + case "import": + jsonKey, err := p.key.ReadJSON() + if err != nil { + log.Println("[HYDRA] Error: ", err.Error()) + break + } + + keyValue := jsonKey["key"] + pwd, err := os.Getwd() + existingData, err := p.envis.GetExistingData() + if err != nil { + log.Println("[HYDRA] Error: ", err.Error()) + break + } + + if err != nil { + log.Println("[HYDRA] Error: ", err.Error()) + break + } + + keyModel := model.Key{ + ID: primitive.NewObjectID(), + KeyID: uuid.NewString() + "SUNFLOWER" + uuid.NewString(), + Key: keyValue.(string), + Directory: pwd, + Filename: envFlag, + } + _, err = database.Collection("Key").InsertOne(context.Background(), keyModel) + if err != nil { + log.Println("[HYDRA] Error: ", err.Error()) + break + } + + _, err = database.Collection("Environment").InsertOne(context.Background(), map[string]interface{}{ + "_id": primitive.NewObjectID(), + "key_id": keyModel.KeyID, + "data": existingData, + }) + if err != nil { + log.Println("[HYDRA] Error: ", err.Error()) + break + } + + log.Println("[HYDRA] Key_ID: ", keyModel.KeyID) + break + case "help": + helpText := ` +Available commands: + ping - Ping the server + import - Import key and environment data + help - Display this help message +` + log.Println(helpText) + break + } +}