// Wraps your custom service in Skynet func CreateService(sd ServiceDelegate, si *skynet.ServiceInfo) (s *Service) { s = &Service{ Delegate: sd, ServiceInfo: si, methods: make(map[string]reflect.Value), connectionChan: make(chan *net.TCPConn), registeredChan: make(chan bool), shutdownChan: make(chan bool), ClientInfo: make(map[string]ClientInfo), shuttingDown: false, } // Override LogLevel for Service if l, err := config.String(s.Name, s.Version, "log.level"); err != nil { log.SetLogLevel(log.LevelFromString(l)) } // the main rpc server s.RPCServ = rpc.NewServer() rpcForwarder := NewServiceRPC(s) s.RPCServ.RegisterName(si.Name, rpcForwarder) // Daemon doesn't accept commands over pipe if si.Name != "SkynetDaemon" { // Listen for admin requests go s.serveAdminRequests() } return }
func (s *SkynetDaemon) LogLevel(requestInfo *skynet.RequestInfo, in daemon.LogLevelRequest, out *daemon.LogLevelResponse) (err error) { log.SetLogLevel(log.LevelFromString(in.Level)) out.Ok = true out.Level = in.Level return }
func (s *Service) serveAdminRequests() { rId := os.Stderr.Fd() + 2 wId := os.Stderr.Fd() + 3 pipeReader := os.NewFile(uintptr(rId), "") pipeWriter := os.NewFile(uintptr(wId), "") s.pipe = daemon.NewPipe(pipeReader, pipeWriter) b := make([]byte, daemon.MAX_PIPE_BYTES) for { n, err := s.pipe.Read(b) if err != nil { if err != io.EOF { log.Printf(log.ERROR, "Error reading from admin pipe "+err.Error()) } else { // We received EOF, ensure we shutdown (if daemon died we could be orphaned) s.Shutdown() } return } cmd := string(b[:n]) log.Println(log.TRACE, "Received "+cmd+" from daemon") switch cmd { case "SHUTDOWN": s.Shutdown() s.pipe.Write([]byte("ACK")) break case "REGISTER": s.Register() s.pipe.Write([]byte("ACK")) case "UNREGISTER": s.Unregister() s.pipe.Write([]byte("ACK")) case "LOG DEBUG", "LOG TRACE", "LOG INFO", "LOG WARN", "LOG ERROR", "LOG FATAL", "LOG PANIC": parts := strings.Split(cmd, " ") log.SetLogLevel(log.LevelFromString(parts[1])) log.Println(log.INFO, "Setting log level to "+parts[1]) s.pipe.Write([]byte("ACK")) } } }
func init() { flagset := flag.NewFlagSet("config", flag.ContinueOnError) flagset.StringVar(&configFile, "config", "", "Config File") flagset.StringVar(&uuid, "uuid", "", "uuid") args, _ := SplitFlagsetFromArgs(flagset, os.Args[1:]) flagset.Parse(args) // Ensure we have a UUID if uuid == "" { uuid = NewUUID() } if configFile == "" { for _, f := range defaultConfigFiles { if _, err := os.Stat(f); err == nil { configFile = f break } } } if configFile == "" { log.Println(log.ERROR, "Failed to find config file") conf = config.NewDefault() return } if _, err := os.Stat(configFile); os.IsNotExist(err) { log.Println(log.ERROR, "Config file does not exist", err) conf = config.NewDefault() return } var err error if conf, err = config.ReadDefault(configFile); err != nil { conf = config.NewDefault() log.Fatal(err) } // Set default log level from config, this can be overriden at the service level when the service is created if l, err := conf.RawStringDefault("log.level"); err == nil { log.SetLogLevel(log.LevelFromString(l)) } }
func main() { log.SetLogLevel(log.ERROR) var args []string criteria, args := criteriaFromArgs(os.Args[1:]) if len(args) == 0 { CommandLineHelp() return } switch args[0] { case "help", "h": CommandLineHelp() case "build", "b": flagset := flag.NewFlagSet("build", flag.ExitOnError) configFile := flagset.String("build", "./build.cfg", "build config file") flagsetArgs, _ := config.SplitFlagsetFromArgs(flagset, args) err := flagset.Parse(flagsetArgs) if err != nil { log.Fatal(err) return } Build(*configFile) case "deploy", "d": flagset := flag.NewFlagSet("deploy", flag.ExitOnError) configFile := flagset.String("build", "./build.cfg", "build config file") flagsetArgs, _ := config.SplitFlagsetFromArgs(flagset, args) err := flagset.Parse(flagsetArgs) if err != nil { log.Fatal(err) return } Deploy(*configFile, criteria) case "hosts": ListHosts(criteria) case "regions": ListRegions(criteria) case "services": ListServices(criteria) case "versions": ListVersions(criteria) case "instances": ListInstances(criteria) case "start": Start(criteria, args[1:]) case "stop": Stop(criteria) case "restart": Restart(criteria) case "register": Register(criteria) case "unregister": Unregister(criteria) case "log": SetLogLevel(criteria, args[1]) case "daemon": if len(args) >= 2 { switch args[1] { case "log": if len(args) >= 3 { SetDaemonLogLevel(criteria, args[2]) } else { fmt.Println("Must supply a log level") } case "stop": StopDaemon(criteria) } } else { fmt.Println("Supported subcommands for daemon are log, and stop") } case "cli": InteractiveShell() default: fmt.Println("Unknown Command: ", args[0]) CommandLineHelp() } }