Esempio n. 1
0
// Boot runs preparatory steps for ruleset execution
func (r *pluginRuleset) Boot(self *bot.Self) {
	for _, pluginBin := range r.pluginBins {
		l, err := net.Listen("tcp4", "0.0.0.0:0")
		if err != nil {
			log.Println("could not start plugin %s. error while setting listener: %v", pluginBin, err)
			continue
		}
		log.Printf("plugin: starting %s", pluginBin)
		rs := rpc.New(l)
		rs.Boot(self)
		cmd := exec.Command(pluginBin)
		cmd.Env = os.Environ()
		cmd.Env = append(cmd.Env, fmt.Sprintf("GOCHATBOT_RPC_BIND=%s", l.Addr()))
		cmd.Env = append(cmd.Env, fmt.Sprintf("GOCHATBOT_NAME=%s", self.Name()))
		cmd.Stderr = os.Stderr
		if err := cmd.Start(); err != nil {
			log.Printf("plugin: %s - error: %v", pluginBin, err)
			log.Printf("plugin: %s closing listener.", pluginBin)
			l.Close()
			continue
		}
		r.plugins = append(r.plugins, rs)
	}
}