90 lines
1.6 KiB
Go
90 lines
1.6 KiB
Go
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
|
|
}
|