// 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) } }