blob: c4d09b9b75fa15638fbbe8a3d19e6e4753fe49f7 [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"
"fmt"
"log"
"os"
"os/user"
vflag "veyron/security/flag"
"veyron/services/store/server"
"veyron/services/store/viewer"
"veyron2/rt"
"veyron2/storage/vstore"
_ "veyron/services/store/typeregistryhack"
)
var (
mountName string
// TODO(rthellend): Remove the protocol and address flags when the config
// manager is working.
protocol = flag.String("protocol", "tcp", "protocol to listen on")
address = flag.String("address", ":0", "address to listen on")
dbName = flag.String("db", "/var/tmp/veyron_store.db",
"Metadata database")
viewerPort = flag.Int("viewerPort", 5000,
"IPV4 port to serve viewer from, or 0 to disable viewer")
)
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 store service, taking args from 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(*protocol, *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)
}
// Run viewer if requested.
if *viewerPort > 0 {
go viewer.ListenAndServe(fmt.Sprintf(":%d", *viewerPort), mountName, vstore.New())
}
// Wait forever.
done := make(chan struct{})
<-done
}