package stats import ( "database/sql" "fmt" ) func Run(d *sql.DB) error { var total int d.QueryRow("SELECT COUNT(*) FROM history").Scan(&total) fmt.Printf("Total commands: %d\n\n", total) fmt.Println("Commands per host:") rows, err := d.Query("SELECT hostname, COUNT(*) as cnt FROM history GROUP BY hostname ORDER BY cnt DESC") if err != nil { return err } for rows.Next() { var host string var cnt int rows.Scan(&host, &cnt) fmt.Printf(" %-30s %d\n", host, cnt) } rows.Close() fmt.Println("\nTop 20 commands:") rows, err = d.Query(` SELECT CASE INSTR(command, ' ') WHEN 0 THEN command ELSE SUBSTR(command, 1, INSTR(command, ' ') - 1) END as cmd, COUNT(*) as cnt FROM history GROUP BY cmd ORDER BY cnt DESC LIMIT 20 `) if err != nil { return err } for rows.Next() { var cmd string var cnt int rows.Scan(&cmd, &cnt) fmt.Printf(" %-30s %d\n", cmd, cnt) } rows.Close() fmt.Println("\nCommands per month:") rows, err = d.Query(` SELECT SUBSTR(timestamp, 1, 7) as month, COUNT(*) as cnt FROM history GROUP BY month ORDER BY month DESC LIMIT 24 `) if err != nil { return err } for rows.Next() { var month string var cnt int rows.Scan(&month, &cnt) fmt.Printf(" %-10s %d\n", month, cnt) } rows.Close() fmt.Println("\nTop 10 directories:") rows, err = d.Query(` SELECT working_dir, COUNT(*) as cnt FROM history GROUP BY working_dir ORDER BY cnt DESC LIMIT 10 `) if err != nil { return err } for rows.Next() { var dir string var cnt int rows.Scan(&dir, &cnt) fmt.Printf(" %-50s %d\n", dir, cnt) } rows.Close() return nil }