diff --git a/src/mig/action.go b/src/mig/action.go index fe08c64b..fcf65de0 100644 --- a/src/mig/action.go +++ b/src/mig/action.go @@ -52,7 +52,7 @@ import ( // an Action is the json object that is created by an investigator // and provided to the MIG platform. It must be PGP signed. type Action struct { - ID uint64 `json:"id"` + ID float64 `json:"id"` Name string `json:"name"` Target string `json:"target"` Description Description `json:"description,omitempty"` @@ -83,10 +83,10 @@ type counters struct { // a description is a simple object that contains detail about the // action's author, and it's revision. type Description struct { - Author string `json:"author,omitempty"` - Email string `json:"email,omitempty"` - URL string `json:"url,omitempty"` - Revision int `json:"revision,omitempty"` + Author string `json:"author,omitempty"` + Email string `json:"email,omitempty"` + URL string `json:"url,omitempty"` + Revision float64 `json:"revision,omitempty"` } // a threat provides the investigator with an idea of how dangerous @@ -130,7 +130,7 @@ func ActionFromFile(path string) (Action, error) { } // GenID returns an ID composed of a unix timestamp and a random CRC32 -func GenID() uint64 { +func GenID() float64 { h := crc32.NewIEEE() t := time.Now().UTC().Format(time.RFC3339Nano) r := rand.New(rand.NewSource(65537)) @@ -138,16 +138,17 @@ func GenID() uint64 { h.Write([]byte(t + rand)) // concatenate timestamp and hash into 64 bits ID // id = <32 bits unix ts><32 bits CRC hash> - id := uint64(time.Now().Unix()) - id = id << 32 - id += uint64(h.Sum32()) + uid := uint64(time.Now().Unix()) + uid = uid << 32 + sum := float64(h.Sum32()) + id := float64(uid) + sum return id } // GenHexID returns a string with an hexadecimal encoded ID func GenB32ID() string { id := GenID() - return strconv.FormatUint(id, 32) + return strconv.FormatFloat(id, 'f', 6, 64) } // Validate verifies that the Action received contained all the diff --git a/src/mig/agent.go b/src/mig/agent.go index 02c34aee..54499685 100644 --- a/src/mig/agent.go +++ b/src/mig/agent.go @@ -37,7 +37,7 @@ package mig import "time" type Agent struct { - ID uint64 `json:"id,omitempty"` + ID float64 `json:"id,omitempty"` Name string `json:"name"` QueueLoc string `json:"queueloc"` OS string `json:"os,omitempty"` diff --git a/src/mig/agent/agent.go b/src/mig/agent/agent.go index 116320c4..a50404df 100644 --- a/src/mig/agent/agent.go +++ b/src/mig/agent/agent.go @@ -61,14 +61,14 @@ import ( var version string type moduleResult struct { - id uint64 + id float64 err error status string output interface{} } type moduleOp struct { - id uint64 + id float64 mode string params interface{} resultChan chan moduleResult diff --git a/src/mig/agent/context.go b/src/mig/agent/context.go index 269be878..10dc80d2 100644 --- a/src/mig/agent/context.go +++ b/src/mig/agent/context.go @@ -84,7 +84,7 @@ type Context struct { Chan <-chan amqp.Delivery } } - OpID uint64 // ID of the current operation, used for tracking + OpID float64 // ID of the current operation, used for tracking Sleeper time.Duration // timer used when the agent has to sleep for a while Stats struct { } diff --git a/src/mig/api/api.go b/src/mig/api/api.go index 76a9fb67..2d61d227 100644 --- a/src/mig/api/api.go +++ b/src/mig/api/api.go @@ -114,7 +114,7 @@ func main() { } // respond builds a Collection+JSON body and sends it to the client -func respond(code int, response *cljs.Resource, respWriter http.ResponseWriter, request *http.Request, opid uint64) (err error) { +func respond(code int, response *cljs.Resource, respWriter http.ResponseWriter, request *http.Request, opid float64) (err error) { defer func() { if e := recover(); e != nil { ctx.Channels.Log <- mig.Log{OpID: opid, Desc: fmt.Sprintf("%v", e)}.Err() @@ -422,7 +422,7 @@ func getAction(respWriter http.ResponseWriter, request *http.Request) { } ctx.Channels.Log <- mig.Log{OpID: opid, Desc: "leaving getAction()"}.Debug() }() - actionID, err := strconv.ParseUint(request.URL.Query()["actionid"][0], 10, 64) + actionID, err := strconv.ParseFloat(request.URL.Query()["actionid"][0], 64) if err != nil { err = fmt.Errorf("Wrong parameters 'actionid': '%v'", err) panic(err) @@ -461,7 +461,7 @@ func getCommand(respWriter http.ResponseWriter, request *http.Request) { } ctx.Channels.Log <- mig.Log{OpID: opid, Desc: "leaving getCommand()"}.Debug() }() - commandID, err := strconv.ParseUint(request.URL.Query()["commandid"][0], 10, 64) + commandID, err := strconv.ParseFloat(request.URL.Query()["commandid"][0], 64) if err != nil { err = fmt.Errorf("Wrong parameters 'commandid': '%v'", err) panic(err) diff --git a/src/mig/api/context.go b/src/mig/api/context.go index b889ce7a..bfdf87aa 100644 --- a/src/mig/api/context.go +++ b/src/mig/api/context.go @@ -48,7 +48,7 @@ import ( // database and logging. It also contains some statistics. // Context is intended as a single structure that can be passed around easily. type Context struct { - OpID uint64 // ID of the current operation, used for tracking + OpID float64 // ID of the current operation, used for tracking Channels struct { Log chan mig.Log } diff --git a/src/mig/api/search.go b/src/mig/api/search.go index 6941ec20..40f3744f 100644 --- a/src/mig/api/search.go +++ b/src/mig/api/search.go @@ -91,7 +91,7 @@ func search(respWriter http.ResponseWriter, request *http.Request) { panic("report not implemented") } case "limit": - p.Limit, err = strconv.ParseUint(request.URL.Query()["limit"][0], 10, 64) + p.Limit, err = strconv.ParseFloat(request.URL.Query()["limit"][0], 64) if err != nil { panic("invalid limit parameter") } diff --git a/src/mig/command.go b/src/mig/command.go index 621788bc..e43c3a0b 100644 --- a/src/mig/command.go +++ b/src/mig/command.go @@ -44,7 +44,7 @@ import ( ) type Command struct { - ID uint64 `json:"id"` + ID float64 `json:"id"` Action Action `json:"action,omitempty"` Agent Agent `json:"agent,omitempty"` Status string `json:"status"` diff --git a/src/mig/database/queries.go b/src/mig/database/queries.go index 3d06eb8a..1092719d 100644 --- a/src/mig/database/queries.go +++ b/src/mig/database/queries.go @@ -71,7 +71,7 @@ type SearchParameters struct { ActionName string `json:"actionname"` ThreatFamily string `json:"threatfamily"` Status string `json:"status"` - Limit uint64 `json:"limit"` + Limit float64 `json:"limit"` } // NewSearchParameters initializes search parameters @@ -286,7 +286,7 @@ func (db *DB) Last10Actions() (actions []mig.Action, err error) { } // ActionByID retrieves an action from the database using its ID -func (db *DB) ActionByID(id uint64) (a mig.Action, err error) { +func (db *DB) ActionByID(id float64) (a mig.Action, err error) { var jDesc, jThreat, jOps, jSig []byte err = db.c.QueryRow(`SELECT id, name, target, description, threat, operations, validfrom, expireafter, starttime, finishtime, lastupdatetime, @@ -379,7 +379,7 @@ func (db *DB) UpdateAction(a mig.Action) (err error) { // InsertOrUpdateAction looks for an existing action in DB and update it, // or insert a new one if none is found func (db *DB) InsertOrUpdateAction(a mig.Action) (inserted bool, err error) { - var id uint64 + var id float64 err = db.c.QueryRow(`SELECT id FROM actions WHERE id=$1`, a.ID).Scan(&id) if err != nil && err != sql.ErrNoRows { return inserted, fmt.Errorf("Error while retrieving action: '%v'", err) @@ -409,7 +409,7 @@ func (db *DB) FinishAction(a mig.Action) (err error) { // InsertSignature create an entry in the signatures tables that map an investigator // to an action and a signature -func (db *DB) InsertSignature(aid, iid uint64, sig string) (err error) { +func (db *DB) InsertSignature(aid, iid float64, sig string) (err error) { _, err = db.c.Exec(`INSERT INTO signatures(actionid, investigatorid, pgpsignature) VALUES($1, $2, $3)`, aid, iid, sig) if err != nil { @@ -420,7 +420,7 @@ func (db *DB) InsertSignature(aid, iid uint64, sig string) (err error) { // FindInvestigatorByFingerprint searches the database for an investigator that // has a given fingerprint -func (db *DB) InvestigatorByFingerprint(fp string) (iid uint64, err error) { +func (db *DB) InvestigatorByFingerprint(fp string) (iid float64, err error) { err = db.c.QueryRow("SELECT id FROM investigators WHERE LOWER(pgpfingerprint)=LOWER($1)", fp).Scan(&iid) if err != nil && err != sql.ErrNoRows { err = fmt.Errorf("Error while finding investigator: '%v'", err) @@ -434,7 +434,7 @@ func (db *DB) InvestigatorByFingerprint(fp string) (iid uint64, err error) { } //InvestigatorByActionID returns the list of investigators that signed a given action -func (db *DB) InvestigatorByActionID(aid uint64) (ivgts []mig.Investigator, err error) { +func (db *DB) InvestigatorByActionID(aid float64) (ivgts []mig.Investigator, err error) { rows, err := db.c.Query(`SELECT investigators.id, investigators.name, investigators.pgpfingerprint FROM investigators, signatures WHERE signatures.actionid=$1 @@ -463,7 +463,7 @@ func (db *DB) InvestigatorByActionID(aid uint64) (ivgts []mig.Investigator, err } // CommandByID retrieves a command from the database using its ID -func (db *DB) CommandByID(id uint64) (cmd mig.Command, err error) { +func (db *DB) CommandByID(id float64) (cmd mig.Command, err error) { var jRes, jDesc, jThreat, jOps, jSig []byte err = db.c.QueryRow(`SELECT commands.id, commands.status, commands.results, commands.starttime, commands.finishtime, actions.id, actions.name, actions.target, actions.description, actions.threat, @@ -512,7 +512,7 @@ func (db *DB) CommandByID(id uint64) (cmd mig.Command, err error) { return } -func (db *DB) CommandsByActionID(actionid uint64) (commands []mig.Command, err error) { +func (db *DB) CommandsByActionID(actionid float64) (commands []mig.Command, err error) { rows, err := db.c.Query(`SELECT commands.id, commands.status, commands.results, commands.starttime, commands.finishtime, actions.id, actions.name, actions.target, actions.description, actions.threat, actions.operations, actions.validfrom, actions.expireafter, diff --git a/src/mig/investigator.go b/src/mig/investigator.go index 267c78e2..ceaa0260 100644 --- a/src/mig/investigator.go +++ b/src/mig/investigator.go @@ -35,8 +35,8 @@ the terms of any one of the MPL, the GPL or the LGPL. package mig type Investigator struct { - ID uint64 `json:"id,omitempty"` - Name string `json:"name"` - PGPFingerprint string `json:"pgpfingerprint"` - PublicKey []byte `json:"publickey,omitempty"` + ID float64 `json:"id,omitempty"` + Name string `json:"name"` + PGPFingerprint string `json:"pgpfingerprint"` + PublicKey []byte `json:"publickey,omitempty"` } diff --git a/src/mig/logging.go b/src/mig/logging.go index 87760709..b0865a3a 100644 --- a/src/mig/logging.go +++ b/src/mig/logging.go @@ -61,7 +61,7 @@ type Logging struct { // Log defines a log entry type Log struct { - OpID, ActionID, CommandID uint64 + OpID, ActionID, CommandID float64 Sev, Desc string Priority syslog.Priority } diff --git a/src/mig/scheduler/context.go b/src/mig/scheduler/context.go index 4680373e..be79caea 100644 --- a/src/mig/scheduler/context.go +++ b/src/mig/scheduler/context.go @@ -55,7 +55,7 @@ import ( // database and message brokers. It also contains some statistics. // Context is intended as a single structure that can be passed around easily. type Context struct { - OpID uint64 // ID of the current operation, used for tracking + OpID float64 // ID of the current operation, used for tracking Agent struct { // configuration TimeOut, HeartbeatFreq, Whitelist string diff --git a/src/mig/scheduler/scheduler.go b/src/mig/scheduler/scheduler.go index 61e060a9..fe17cd00 100644 --- a/src/mig/scheduler/scheduler.go +++ b/src/mig/scheduler/scheduler.go @@ -397,7 +397,7 @@ func processNewAction(actionPath string, ctx Context) (err error) { // it retrieves a list of target agents from the database, creates one // command for each target agent, and stores the command into ctx.Directories.Command.Ready. // An array of command IDs is returned -func prepareCommands(action mig.Action, ctx Context) (cmdIDs []uint64, err error) { +func prepareCommands(action mig.Action, ctx Context) (cmdIDs []float64, err error) { defer func() { if e := recover(); e != nil { err = fmt.Errorf("prepareCommands() -> %v", e) @@ -440,7 +440,7 @@ func prepareCommands(action mig.Action, ctx Context) (cmdIDs []uint64, err error return } -func createCommand(ctx Context, action mig.Action, agent mig.Agent) (cmdid uint64, err error) { +func createCommand(ctx Context, action mig.Action, agent mig.Agent) (cmdid float64, err error) { defer func() { if e := recover(); e != nil { err = fmt.Errorf("createCommand() -> %v", e)