Compare commits

...

11 commits

Author SHA1 Message Date
97132550b0
f-8: code: move Load in DB to internal lib #8
Signed-off-by: GnomeZworc <nicolas.boufidjeline@g3e.fr>
2025-12-26 23:48:42 +01:00
38f2ed1b83
f-8: code: use recursive delete #8
Signed-off-by: GnomeZworc <nicolas.boufidjeline@g3e.fr>
2025-12-26 23:48:41 +01:00
b2d1922eaa
f-8: pkg: make delete in db recursif #8
Signed-off-by: GnomeZworc <nicolas.boufidjeline@g3e.fr>
2025-12-26 23:48:41 +01:00
df95d8b4a7
f-8: code: use flags in db binary #8
Signed-off-by: GnomeZworc <nicolas.boufidjeline@g3e.fr>
2025-12-26 23:48:36 +01:00
1ac1e61864
f-8: code: move binary name #8
Signed-off-by: GnomeZworc <nicolas.boufidjeline@g3e.fr>
2025-12-26 23:48:35 +01:00
55ed2c8e53
f-8: code: add module to load nocloud in db #8
Signed-off-by: GnomeZworc <nicolas.boufidjeline@g3e.fr>
2025-12-26 23:48:35 +01:00
b43e45488e
f-8: code: add func to control db #8
Signed-off-by: GnomeZworc <nicolas.boufidjeline@g3e.fr>
2025-12-26 23:48:35 +01:00
2418e08ee0
f-8: code: add params for meta_cli #8
Signed-off-by: GnomeZworc <nicolas.boufidjeline@g3e.fr>
2025-12-26 23:48:34 +01:00
014ae61dbb
f-8: internal/conf: delete conf file existance check #8
Signed-off-by: GnomeZworc <nicolas.boufidjeline@g3e.fr>
2025-12-26 23:48:25 +01:00
1ac5a9fe49
f-8: conf: move configuration files #8
Signed-off-by: GnomeZworc <nicolas.boufidjeline@g3e.fr>
2025-12-26 23:47:45 +01:00
e1f317aeb9
f-8: code: first implement of metadata cli #8
Signed-off-by: GnomeZworc <nicolas.boufidjeline@g3e.fr>
2025-12-26 23:47:31 +01:00
14 changed files with 216 additions and 22 deletions

View file

@ -5,10 +5,13 @@ import (
"os" "os"
) )
var (
bin_name = os.Args[0]
)
func main() { func main() {
bin_name := os.Args[0]
fmt.Printf("%s: Start process\n", bin_name) fmt.Printf("%s: Start process\n", bin_name)
os.Exit(5) os.Exit(0)
} }

View file

@ -1,6 +1,7 @@
package main package main
import ( import (
"flag"
"fmt" "fmt"
"os" "os"
"strings" "strings"
@ -59,9 +60,7 @@ func AddInDB(dbName string, line string) error {
func DeleteInDB(dbName, id string) error { func DeleteInDB(dbName, id string) error {
key := []byte(dbName + "/" + id + "/bash") key := []byte(dbName + "/" + id + "/bash")
return DB.Update(func(txn *badger.Txn) error { return kv.DeleteInDB(DB, string(key))
return txn.Delete(key)
})
} }
func CountInDB(dbName, id string) int { func CountInDB(dbName, id string) int {
@ -125,7 +124,13 @@ func printDB() {
} }
func main() { func main() {
conf, err := configuration.LoadConfig("/etc/two/agent.yml") conf_file := flag.String("conf", "/etc/two/agent.yml", "configuration file")
flag.Parse()
args := flag.Args()
conf, err := configuration.LoadConfig(*conf_file)
if err != nil { if err != nil {
fmt.Println(err) fmt.Println(err)
return return
@ -136,53 +141,53 @@ func main() {
}) })
defer DB.Close() defer DB.Close()
if len(os.Args) < 2 { if len(args) < 1 {
fmt.Println("Usage: db <cmd> [args...]") fmt.Println("Usage: db <cmd> [args...]")
return return
} }
cmd := os.Args[1] cmd := args[0]
switch cmd { switch cmd {
case "check_in_db": case "check_in_db":
if len(os.Args) != 4 { if len(args) != 3 {
fmt.Println("Usage: check_in_db <db_name> <id>") fmt.Println("Usage: check_in_db <db_name> <id>")
os.Exit(1) os.Exit(1)
} }
ret := CheckInDB(os.Args[2], os.Args[3]) ret := CheckInDB(args[1], args[2])
os.Exit(ret) os.Exit(ret)
case "add_in_db": case "add_in_db":
if len(os.Args) < 4 { if len(args) < 3 {
fmt.Println("Usage: add_in_db <db_name> <line...>") fmt.Println("Usage: add_in_db <db_name> <line...>")
os.Exit(1) os.Exit(1)
} }
line := strings.Join(os.Args[3:], ";") line := strings.Join(args[2:], ";")
if err := AddInDB(os.Args[2], line); err != nil { if err := AddInDB(args[1], line); err != nil {
fmt.Println("Error:", err) fmt.Println("Error:", err)
os.Exit(1) os.Exit(1)
} }
case "delete_in_db": case "delete_in_db":
if len(os.Args) != 4 { if len(args) != 3 {
fmt.Println("Usage: delete_in_db <db_name> <id>") fmt.Println("Usage: delete_in_db <db_name> <id>")
os.Exit(1) os.Exit(1)
} }
if err := DeleteInDB(os.Args[2], os.Args[3]); err != nil { if err := DeleteInDB(args[1], args[2]); err != nil {
fmt.Println("Error:", err) fmt.Println("Error:", err)
os.Exit(1) os.Exit(1)
} }
case "count_in_db": case "count_in_db":
if len(os.Args) != 4 { if len(args) != 3 {
fmt.Println("Usage: count_in_db <db_name> <id>") fmt.Println("Usage: count_in_db <db_name> <id>")
os.Exit(1) os.Exit(1)
} }
count := CountInDB(os.Args[2], os.Args[3]) count := CountInDB(args[1], args[2])
fmt.Println(count) fmt.Println(count)
case "get_from_db": case "get_from_db":
if len(os.Args) != 4 { if len(args) != 3 {
fmt.Println("Usage: get_from_db <db_name> <id>") fmt.Println("Usage: get_from_db <db_name> <id>")
os.Exit(1) os.Exit(1)
} }
line, _ := GetFromDB(os.Args[2], os.Args[3]) line, _ := GetFromDB(args[1], args[2])
fmt.Println(line) fmt.Println(line)
case "print": case "print":
printDB() printDB()

49
cmd/meta_cli/main.go Normal file
View file

@ -0,0 +1,49 @@
package main
import (
"flag"
"fmt"
configuration "git.g3e.fr/syonad/two/internal/config/agent"
"git.g3e.fr/syonad/two/internal/load_db/nocloud"
"git.g3e.fr/syonad/two/pkg/db/kv"
)
func main() {
conf_file := flag.String("conf", "/etc/two/agent.yml", "configuration file")
vm_name := flag.String("vm_name", "", "Nom de la vm")
vpc := flag.String("vpc_name", "", "vpc name")
bind_ip := flag.String("ip", "", "bind ip")
bind_port := flag.String("port", "", "bind port")
ssh_key := flag.String("key", "", "Clef ssh")
password := flag.String("pass", "", "password user")
start := flag.Bool("start", false, "start metadata server")
stop := flag.Bool("stop", false, "stop metadata server")
flag.Parse()
conf, err := configuration.LoadConfig(*conf_file)
if err != nil {
fmt.Println(err)
return
}
fmt.Print(conf)
db := kv.InitDB(kv.Config{
Path: conf.Database.Path,
})
defer db.Close()
if *start {
nocloud.LoadNcCloudInDB(nocloud.Config{
VpcName: *vpc,
Name: *vm_name,
BindIP: *bind_ip,
BindPort: *bind_port,
Password: *password,
SSHKEY: *ssh_key,
}, db)
} else if *stop {
nocloud.UnLoadNoCloudInDB(*vm_name, db)
}
}

View file

@ -0,0 +1,2 @@
database:
path: "./data/"

View file

@ -17,9 +17,7 @@ func LoadConfig(path string) (*Config, error) {
v.SetDefault("database.path", "/var/lib/two/data/") v.SetDefault("database.path", "/var/lib/two/data/")
if err := v.ReadInConfig(); err != nil { v.ReadInConfig()
return nil, err
}
var cfg Config var cfg Config
if err := v.Unmarshal(&cfg); err != nil { if err := v.Unmarshal(&cfg); err != nil {

View file

@ -0,0 +1,50 @@
package nocloud
import (
"bytes"
"embed"
"text/template"
"git.g3e.fr/syonad/two/pkg/db/kv"
"github.com/dgraph-io/badger/v4"
)
//go:embed templates/*.tmpl
var templateFS embed.FS
func renderConfig(path string, cfg Config) (string, error) {
tpl, err := template.ParseFS(templateFS, path)
if err != nil {
return "", err
}
var buf bytes.Buffer
if err := tpl.Execute(&buf, cfg); err != nil {
return "", err
}
return buf.String(), nil
}
var DB *badger.DB
func LoadNcCloudInDB(config Config, db *badger.DB) {
meta_data, _ := renderConfig("templates/meta-data.tmpl", config)
user_data, _ := renderConfig("templates/user-data.tmpl", config)
network_config, _ := renderConfig("templates/network-config.tmpl", config)
vendor_data, _ := renderConfig("templates/vendor-data.tmpl", config)
DB = db
kv.AddInDB(DB, "metadata/"+config.Name+"/meta-data", meta_data)
kv.AddInDB(DB, "metadata/"+config.Name+"/user-data", user_data)
kv.AddInDB(DB, "metadata/"+config.Name+"/network-config", network_config)
kv.AddInDB(DB, "metadata/"+config.Name+"/vendor-data", vendor_data)
kv.AddInDB(DB, "metadata/"+config.Name+"/vpc", config.VpcName)
kv.AddInDB(DB, "metadata/"+config.Name+"/bind_ip", config.BindIP)
kv.AddInDB(DB, "metadata/"+config.Name+"/bind_port", config.BindPort)
}
func UnLoadNoCloudInDB(vm_name string, db *badger.DB) {
kv.DeleteInDB(DB, "metadata/"+vm_name)
}

View file

@ -0,0 +1,10 @@
package nocloud
type Config struct {
VpcName string
BindIP string
BindPort string
Name string
Password string
SSHKEY string
}

View file

@ -0,0 +1,2 @@
instance-id: {{ .Name }}
local-hostname: {{ .Name }}

View file

@ -0,0 +1,4 @@
version: 2
ethernets:
eth0:
dhcp4: true

View file

@ -0,0 +1,3 @@
#!/bin/sh
passwd -d root

View file

@ -0,0 +1,13 @@
#cloud-config
users:
- name: syonad
lock_passwd: false
gecos: alpine Cloud User
groups: [adm, wheel]
doas:
- permit nopass syonad
sudo: ["ALL=(ALL) NOPASSWD:ALL"]
shell: /bin/ash
passwd: "{{ .Password }}"
ssh_authorized_keys:
- "{{ .SSHKEY }}"

11
pkg/db/kv/addInDB.go Normal file
View file

@ -0,0 +1,11 @@
package kv
import (
"github.com/dgraph-io/badger/v4"
)
func AddInDB(db *badger.DB, key string, value string) error {
return db.Update(func(txn *badger.Txn) error {
return txn.Set([]byte(key), []byte(value))
})
}

44
pkg/db/kv/deleteInDB.go Normal file
View file

@ -0,0 +1,44 @@
package kv
import (
"fmt"
"log"
"github.com/dgraph-io/badger/v4"
)
func deleteKey(db *badger.DB, key string) error {
return db.Update(func(txn *badger.Txn) error {
return txn.Delete([]byte(key))
})
}
func DeleteInDB(db *badger.DB, key string) error {
prefix := []byte(key + "/")
err := db.View(func(txn *badger.Txn) error {
opts := badger.DefaultIteratorOptions
opts.PrefetchValues = false
it := txn.NewIterator(opts)
defer it.Close()
for it.Seek(prefix); it.ValidForPrefix(prefix); it.Next() {
item := it.Item()
key := item.Key()
k := append([]byte{}, key...)
fmt.Println(string(k))
if err := deleteKey(db, string(k)); err != nil {
return err
}
}
return nil
})
if err != nil {
log.Fatal(err)
}
return deleteKey(db, key)
}