本文整理汇总了Golang中mig.Command.Results方法的典型用法代码示例。如果您正苦于以下问题:Golang Command.Results方法的具体用法?Golang Command.Results怎么用?Golang Command.Results使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类mig.Command
的用法示例。
在下文中一共展示了Command.Results方法的3个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Golang代码示例。
示例1: receiveModuleResults
// receiveResult listens on a temporary channels for results coming from modules. It aggregated them, and
// when all are received, it build a response that is passed to the Result channel
func receiveModuleResults(ctx Context, cmd mig.Command, resultChan chan moduleResult, opsCounter int) (err error) {
defer func() {
if e := recover(); e != nil {
err = fmt.Errorf("receiveModuleResults() -> %v", e)
}
ctx.Channels.Log <- mig.Log{CommandID: cmd.ID, ActionID: cmd.Action.ID, Desc: "leaving receiveModuleResults()"}.Debug()
}()
ctx.Channels.Log <- mig.Log{CommandID: cmd.ID, ActionID: cmd.Action.ID, Desc: "entering receiveModuleResults()"}.Debug()
resultReceived := 0
// for each result received, populate the content of cmd.Results with it
// stop when we received all the expected results
for result := range resultChan {
ctx.Channels.Log <- mig.Log{OpID: result.id, CommandID: cmd.ID, ActionID: cmd.Action.ID, Desc: "received results from module"}.Debug()
cmd.Status = result.status
cmd.Results = append(cmd.Results, result.output)
resultReceived++
if resultReceived >= opsCounter {
break
}
}
// forward the updated command
ctx.Channels.Results <- cmd
// close the channel, we're done here
close(resultChan)
return
}
示例2: createCommand
func createCommand(ctx Context, action mig.Action, agent mig.Agent, emptyResults []modules.Result) (err error) {
cmdid := mig.GenID()
defer func() {
if e := recover(); e != nil {
err = fmt.Errorf("createCommand() -> %v", e)
}
ctx.Channels.Log <- mig.Log{OpID: ctx.OpID, ActionID: action.ID, CommandID: cmdid, Desc: "leaving createCommand()"}.Debug()
}()
var cmd mig.Command
cmd.Status = "sent"
cmd.Action = action
cmd.Agent = agent
cmd.ID = cmdid
cmd.StartTime = time.Now().UTC()
cmd.Results = emptyResults
ctx.Channels.CommandReady <- cmd
return
}
示例3: parseCommands
// parseCommands transforms a message into a MIG Command struct, performs validation
// and run the command
func parseCommands(ctx Context, msg []byte) (err error) {
var cmd mig.Command
cmd.ID = 0 // safety net
defer func() {
if e := recover(); e != nil {
err = fmt.Errorf("parseCommands() -> %v", e)
// if we have a command to return, update status and send back
if cmd.ID > 0 {
errLog := mig.Log{CommandID: cmd.ID, ActionID: cmd.Action.ID, Desc: fmt.Sprintf("%v", err)}.Err()
cmd.Results = append(cmd.Results, errLog)
cmd.Status = "failed"
ctx.Channels.Results <- cmd
}
}
ctx.Channels.Log <- mig.Log{CommandID: cmd.ID, ActionID: cmd.Action.ID, Desc: "leaving parseCommands()"}.Debug()
}()
// unmarshal the received command into a command struct
// if this fails, inform the scheduler and skip this message
err = json.Unmarshal(msg, &cmd)
if err != nil {
panic(err)
}
// get an io.Reader from the public pgp key
keyring, keycount, err := pgp.ArmoredPubKeysToKeyring(PUBLICPGPKEYS[0:])
if err != nil {
panic(err)
}
ctx.Channels.Log <- mig.Log{CommandID: cmd.ID, ActionID: cmd.Action.ID, Desc: fmt.Sprintf("loaded %d keys", keycount)}.Debug()
// Check the action syntax and signature
err = cmd.Action.Validate()
if err != nil {
desc := fmt.Sprintf("action validation failed: %v", err)
ctx.Channels.Log <- mig.Log{CommandID: cmd.ID, ActionID: cmd.Action.ID, Desc: desc}.Err()
panic(desc)
}
err = cmd.Action.VerifySignature(keyring)
if err != nil {
desc := fmt.Sprintf("action signature verification failed: %v", err)
ctx.Channels.Log <- mig.Log{CommandID: cmd.ID, ActionID: cmd.Action.ID, Desc: desc}.Err()
panic(desc)
}
// Expiration is verified by the Validate() call above, but we need
// to verify the ScheduledDate ourselves
if time.Now().Before(cmd.Action.ValidFrom) {
ctx.Channels.Log <- mig.Log{CommandID: cmd.ID, ActionID: cmd.Action.ID, Desc: "action is scheduled for later"}.Err()
panic("ScheduledDateInFuture")
}
// Each operation is ran separately by a module, a channel is created to receive the results from each module
// a goroutine is created to read from the result channel, and when all modules are done, build the response
resultChan := make(chan moduleResult)
opsCounter := 0
for counter, operation := range cmd.Action.Operations {
// create an module operation object
currentOp := moduleOp{id: mig.GenID(),
mode: operation.Module,
params: operation.Parameters,
resultChan: resultChan}
desc := fmt.Sprintf("sending operation %d to module %s", counter, operation.Module)
ctx.Channels.Log <- mig.Log{OpID: currentOp.id, ActionID: cmd.Action.ID, CommandID: cmd.ID, Desc: desc}
// pass the module operation object to the proper channel
switch operation.Module {
case "filechecker":
// send the operation to the module
ctx.Channels.RunAgentCommand <- currentOp
opsCounter++
case "shell":
// send to the external execution path
ctx.Channels.RunExternalCommand <- currentOp
opsCounter++
case "terminate":
ctx.Channels.Terminate <- fmt.Errorf("Terminate order received from scheduler")
opsCounter++
default:
ctx.Channels.Log <- mig.Log{CommandID: cmd.ID, ActionID: cmd.Action.ID, Desc: fmt.Sprintf("module '%s' is invalid", operation.Module)}
}
}
// start the goroutine that will receive the results
go receiveModuleResults(ctx, cmd, resultChan, opsCounter)
return
}