1
0
Fork 0
forked from External/grumble

Add interesting comments to grumble.go!

This commit is contained in:
Mikkel Krautz 2011-11-10 12:49:23 +01:00
parent ede1c7735e
commit 76747e0b71

View file

@ -35,11 +35,24 @@ func main() {
log.SetPrefix("[G] ") log.SetPrefix("[G] ")
log.SetFlags(log.LstdFlags | log.Lmicroseconds) log.SetFlags(log.LstdFlags | log.Lmicroseconds)
log.SetOutput(&logtarget.Target) log.SetOutput(&logtarget.Target)
log.Printf("Grumble") log.Printf("Grumble")
log.Printf("Using data directory: %s", Args.DataDir) log.Printf("Using data directory: %s", Args.DataDir)
// Open the blobstore // Open the data dir. We need it later for looking up
// the virtual server folders in the data dir.
// We need it now to make sure the data dir actually exists.
dataDir, err := os.Open(Args.DataDir)
if err != nil {
log.Fatalf("Unable to open data directory: %v", err)
return
}
// Open the blobstore. If the directory doesn't
// already exist, create the directory and open
// the blobstore.
// The Open method of the blobstore performs simple
// sanity checking of content of the blob directory,
// and will return an error if something's amiss.
blobDir := filepath.Join(Args.DataDir, "blob") blobDir := filepath.Join(Args.DataDir, "blob")
err = os.Mkdir(blobDir, 0700) err = os.Mkdir(blobDir, 0700)
if err != nil { if err != nil {
@ -58,6 +71,11 @@ func main() {
log.Fatalf("Unable to initialize blobstore: %v", err.Error()) log.Fatalf("Unable to initialize blobstore: %v", err.Error())
} }
// Check whether we should regenerate the default global keypair
// and corresponding certificate.
// These are used as the default certificate of all virtual servers
// and the SSH admin console, but can be overridden using the "key"
// and "cert" arguments to Grumble.
certFn := filepath.Join(Args.DataDir, "cert") certFn := filepath.Join(Args.DataDir, "cert")
keyFn := filepath.Join(Args.DataDir, "key") keyFn := filepath.Join(Args.DataDir, "key")
shouldRegen := false shouldRegen := false
@ -125,34 +143,39 @@ func main() {
return return
} }
f, err := os.Open(Args.DataDir) // Read all entries of the data directory.
// We need these to load our virtual servers.
names, err := dataDir.Readdirnames(-1)
if err != nil { if err != nil {
log.Fatal(err) log.Fatal("Unable to read file from data directory: %v", err.Error())
} }
defer f.Close() // The data dir file descriptor.
err = dataDir.Close()
names, err := f.Readdirnames(-1)
if err != nil { if err != nil {
log.Fatal(err) log.Fatalf("Unable to close data directory: %v", err.Error())
return
} }
// Look through the list of files in the data directory, and
// load all virtual servers from disk.
servers = make(map[int64]*Server) servers = make(map[int64]*Server)
for _, name := range names { for _, name := range names {
if matched, _ := regexp.MatchString("^[0-9]+$", name); matched { if matched, _ := regexp.MatchString("^[0-9]+$", name); matched {
log.Printf("Loading server %v", name) log.Printf("Loading server %v", name)
s, err := NewServerFromFrozen(name) s, err := NewServerFromFrozen(name)
if err != nil { if err != nil {
log.Fatalf("Unable to load server: %v", err) log.Fatalf("Unable to load server: %v", err.Error())
} }
err = s.FreezeToFile() err = s.FreezeToFile()
if err != nil { if err != nil {
log.Fatalf("Unable to freeze server to disk: %v", err) log.Fatalf("Unable to freeze server to disk: %v", err.Error())
} }
servers[s.Id] = s servers[s.Id] = s
go s.ListenAndMurmur() go s.ListenAndMurmur()
} }
} }
// If no servers were found, create the default virtual server.
if len(servers) == 0 { if len(servers) == 0 {
s, err := NewServer(1, "0.0.0.0", 64738) s, err := NewServer(1, "0.0.0.0", 64738)
if err != nil { if err != nil {
@ -166,8 +189,11 @@ func main() {
go s.ListenAndMurmur() go s.ListenAndMurmur()
} }
// Run the SSH admin console.
go RunSSH() go RunSSH()
// If any servers were loaded, launch the signal
// handler goroutine and sleep...
if len(servers) > 0 { if len(servers) > 0 {
go SignalHandler() go SignalHandler()
select {} select {}