blob: 09889330849ea67ebb2e0c6c0e0033a9dc81e181 [file] [log] [blame]
// stored is a storage server.
//
// Usage:
//
// stored [--name=<mount>] [--db=<dbName>]
//
// - <name> is the Veyron mount point name, default /global/vstore/<hostname>/<username>.
// - <dbName> is the filename in which to store the data.
//
// The store service has Object name, <name>/.store.
// The raw store service has Object name, <name>/.store.raw.
// Individual values with path <path> have name <name>/<path>.
package main
import (
"flag"
"log"
"os"
"os/user"
vflag "veyron/security/flag"
"veyron/services/store/server"
"veyron2/rt"
_ "veyron/services/store/typeregistryhack"
)
var (
mountName string
dbName = flag.String("db", "/var/tmp/veyron_store.db", "Metadata database")
// TODO(rthellend): Remove the address flag when the config manager is working.
address = flag.String("address", ":0", "Address to listen on.")
)
func init() {
username := "unknown"
if u, err := user.Current(); err == nil {
username = u.Username
}
hostname := "unknown"
if h, err := os.Hostname(); err == nil {
hostname = h
}
dir := "global/vstore/" + hostname + "/" + username
flag.StringVar(&mountName, "name", dir, "Mount point for media")
}
// Main starts the content service, taking arguments from the command line
// flags.
func main() {
r := rt.Init()
// Create a new server instance.
s, err := r.NewServer()
if err != nil {
log.Fatal("r.NewServer() failed: ", err)
}
// Create a new StoreService.
storeService, err := server.New(server.ServerConfig{Admin: r.Identity().PublicID(), DBName: *dbName})
if err != nil {
log.Fatal("server.New() failed: ", err)
}
defer storeService.Close()
// Create the authorizer.
auth := vflag.NewAuthorizerOrDie()
// Register the services.
storeDisp := server.NewStoreDispatcher(storeService, auth)
// Create an endpoint and start listening.
ep, err := s.Listen("tcp", *address)
if err != nil {
log.Fatal("s.Listen() failed: ", err)
}
// Publish the service in the mount table.
log.Printf("Mounting store on %s, endpoint /%s", mountName, ep)
if err := s.Serve(mountName, storeDisp); err != nil {
log.Fatal("s.Serve() failed: ", err)
}
// Wait forever.
done := make(chan struct{})
<-done
}