103 lines
2.7 KiB
Go
103 lines
2.7 KiB
Go
package cmd
|
|
|
|
import (
|
|
"os"
|
|
"fmt"
|
|
"log"
|
|
"io/ioutil"
|
|
"gocage/jail"
|
|
"encoding/json"
|
|
"github.com/spf13/viper"
|
|
)
|
|
|
|
|
|
var gJails []Jail
|
|
|
|
|
|
func listJails(args []string) {
|
|
for _, d := range viper.GetStringSlice("datastore") {
|
|
listJailsFromDatastore(d)
|
|
}
|
|
|
|
for _, j := range (gJails) {
|
|
if j.Running {
|
|
fmt.Printf("%d ; %s ; %s ; %s\n", j.JID, j.Name, j.Config.Ip4_addr, j.Config.Release)
|
|
} else {
|
|
fmt.Printf(" ; %s ; %s ; %s\n", j.Name, j.Config.Ip4_addr, j.Config.Release)
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
func listJailsFromDatastore(datastore string) {
|
|
fileInfo, err := os.Stat(datastore)
|
|
if err != nil { log.Fatalln(fmt.Sprintf("Unable to access %s, check path and/or rights", datastore)) }
|
|
if fileInfo.IsDir() == false { log.Fatalln(fmt.Sprintf("%s is not a directory", datastore)) }
|
|
|
|
// A datastore have to contain a "jails" directory
|
|
jailsDir := fmt.Sprintf("%s/jails", datastore)
|
|
fileInfo, err = os.Stat(jailsDir)
|
|
if err != nil { log.Fatalln(fmt.Sprintf("Unable to access %s, check path and/or rights", jailsDir)) }
|
|
if fileInfo.IsDir() == false { log.Fatalln(fmt.Sprintf("%s is not a directory", jailsDir)) }
|
|
|
|
listJailsFromDirectory(jailsDir)
|
|
}
|
|
|
|
|
|
func listJailsFromDirectory(dir string) ([]Jail) {
|
|
files, err := ioutil.ReadDir(dir)
|
|
if err != nil { log.Fatalln(fmt.Sprintf("Unable to browse %s, check path and/or rights", dir)) }
|
|
|
|
for _, fi := range files {
|
|
if fi.IsDir() == true {
|
|
|
|
// 1. Get conf from config.json
|
|
jailConfPath := fmt.Sprintf("%s/%s/%s", dir, fi.Name(), "config.json")
|
|
jailConf, err := getJailConfig(jailConfPath)
|
|
if err != nil { log.Println("ERROR reading jail config for %s", jailConfPath) }
|
|
|
|
// 2. Build jail object from config
|
|
jailRootPath := fmt.Sprintf("%s/%s/%s", dir, fi.Name(), "root")
|
|
j := Jail{
|
|
Name: jailConf.Host_hostname,
|
|
Config: jailConf,
|
|
ConfigPath: jailConfPath,
|
|
RootPath: jailRootPath,
|
|
Running: false,
|
|
}
|
|
|
|
// 3. Add current running informations
|
|
// FIXME : use rj.host.hostname
|
|
//j.Internal_name = fmt.Sprintf("ioc-%s", j.Name)
|
|
|
|
rjails, err := jail.GetJails()
|
|
if err != nil { log.Fatalln("Unable to list running jails") }
|
|
for _, rj := range rjails {
|
|
if rj.Path == j.RootPath {
|
|
j.JID = rj.Jid
|
|
j.Running = true
|
|
j.InternalName = rj.Name
|
|
}
|
|
}
|
|
|
|
gJails = append(gJails, j)
|
|
}
|
|
}
|
|
|
|
return gJails
|
|
}
|
|
|
|
|
|
func getJailConfig(jailConfigPath string) (JailConfig, error) {
|
|
content, err := ioutil.ReadFile(jailConfigPath)
|
|
if err != nil { log.Fatalln(fmt.Sprintf("Unable to read %s, check path and/or rights", jailConfigPath)) }
|
|
|
|
var jc JailConfig
|
|
err = json.Unmarshal([]byte(content), &jc)
|
|
if err != nil { log.Fatalln(fmt.Sprintf("Error occured during unmarshaling %s: %s", jailConfigPath, err.Error())) }
|
|
|
|
//fmt.Printf("Jail Config: %#v\n", jc)
|
|
|
|
return jc, err
|
|
}
|