ing
This commit is contained in:
parent
2ee7fa5853
commit
3ef6659f46
|
@ -1,9 +1,9 @@
|
||||||
package crawler
|
package crawler
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bytes"
|
||||||
"git.loafle.net/overflow/ssh_crawler/ssh"
|
"git.loafle.net/overflow/ssh_crawler/ssh"
|
||||||
"git.loafle.net/overflow/ssh_crawler/stat"
|
"git.loafle.net/overflow/ssh_crawler/stat"
|
||||||
"bytes"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type Crawler struct {
|
type Crawler struct {
|
||||||
|
@ -29,7 +29,6 @@ func (c *Crawler) connectSSH(ip, port, user, pw string) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
func (c *Crawler) CPUStat(ch chan interface{}) {
|
func (c *Crawler) CPUStat(ch chan interface{}) {
|
||||||
go func() {
|
go func() {
|
||||||
cpu := &stat.CPUStat{}
|
cpu := &stat.CPUStat{}
|
||||||
|
@ -45,7 +44,6 @@ func (c *Crawler) CPUStat(ch chan interface{}) {
|
||||||
}()
|
}()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
func (c *Crawler) MemStat(ch chan interface{}) {
|
func (c *Crawler) MemStat(ch chan interface{}) {
|
||||||
go func() {
|
go func() {
|
||||||
mem := &stat.MemStat{}
|
mem := &stat.MemStat{}
|
||||||
|
@ -109,7 +107,7 @@ func (c *Crawler) LoadAvgStat(ch chan interface{}) {
|
||||||
}()
|
}()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *Crawler) NetworkStat(ch chan interface{}) {
|
func (c *Crawler) NetworkStat(ch chan interface{}) {
|
||||||
go func() {
|
go func() {
|
||||||
net := &stat.NetDevStat{}
|
net := &stat.NetDevStat{}
|
||||||
b, err := c.sshCli.RunCommand(net.Command())
|
b, err := c.sshCli.RunCommand(net.Command())
|
||||||
|
@ -122,4 +120,19 @@ func (c *Crawler) NetworkStat(ch chan interface{}) {
|
||||||
}
|
}
|
||||||
ch <- res
|
ch <- res
|
||||||
}()
|
}()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *Crawler) ProcessStat(ch chan interface{}) {
|
||||||
|
go func() {
|
||||||
|
ps := &stat.ProcessStat{}
|
||||||
|
b, err := c.sshCli.RunCommand(ps.Command())
|
||||||
|
if err != nil {
|
||||||
|
ch <- err
|
||||||
|
}
|
||||||
|
res, err := ps.Parse(bytes.NewReader(b))
|
||||||
|
if err != nil {
|
||||||
|
ch <- err
|
||||||
|
}
|
||||||
|
ch <- res
|
||||||
|
}()
|
||||||
|
}
|
||||||
|
|
13
main.go
13
main.go
|
@ -6,7 +6,6 @@ import (
|
||||||
"runtime"
|
"runtime"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
runtime.GOMAXPROCS(4)
|
runtime.GOMAXPROCS(4)
|
||||||
|
|
||||||
|
@ -55,10 +54,10 @@ func main() {
|
||||||
cr.LoadAvgStat(loadCh)
|
cr.LoadAvgStat(loadCh)
|
||||||
fmt.Println(<-loadCh)
|
fmt.Println(<-loadCh)
|
||||||
close(loadCh)
|
close(loadCh)
|
||||||
|
|
||||||
|
//Process
|
||||||
|
psCh := make(chan interface{})
|
||||||
|
cr.ProcessStat(psCh)
|
||||||
|
fmt.Println(<-psCh)
|
||||||
|
close(psCh)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
17
ssh/ssh.go
17
ssh/ssh.go
|
@ -1,9 +1,9 @@
|
||||||
package ssh
|
package ssh
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bytes"
|
||||||
"fmt"
|
"fmt"
|
||||||
"golang.org/x/crypto/ssh"
|
"golang.org/x/crypto/ssh"
|
||||||
"bytes"
|
|
||||||
"strconv"
|
"strconv"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -16,12 +16,12 @@ type SSHConfig struct {
|
||||||
|
|
||||||
type SSHClient struct {
|
type SSHClient struct {
|
||||||
session *ssh.Session
|
session *ssh.Session
|
||||||
conf *SSHConfig
|
conf *SSHConfig
|
||||||
}
|
}
|
||||||
|
|
||||||
func New(ip, port, user, pw string) (*SSHClient, error) {
|
func New(ip, port, user, pw string) (*SSHClient, error) {
|
||||||
p, _ := strconv.Atoi(port)
|
p, _ := strconv.Atoi(port)
|
||||||
conf := &SSHConfig {
|
conf := &SSHConfig{
|
||||||
User: user,
|
User: user,
|
||||||
Auth: []ssh.AuthMethod{
|
Auth: []ssh.AuthMethod{
|
||||||
ssh.Password(pw),
|
ssh.Password(pw),
|
||||||
|
@ -30,19 +30,19 @@ func New(ip, port, user, pw string) (*SSHClient, error) {
|
||||||
Port: p,
|
Port: p,
|
||||||
}
|
}
|
||||||
|
|
||||||
return &SSHClient{conf:conf}, nil
|
return &SSHClient{conf: conf}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (cli *SSHClient) Session() error {
|
func (cli *SSHClient) Session() error {
|
||||||
sshConfig := &ssh.ClientConfig{
|
sshConfig := &ssh.ClientConfig{
|
||||||
User: cli.conf.User,
|
User: cli.conf.User,
|
||||||
Auth: cli.conf.Auth,
|
Auth: cli.conf.Auth,
|
||||||
HostKeyCallback:ssh.InsecureIgnoreHostKey(),
|
HostKeyCallback: ssh.InsecureIgnoreHostKey(),
|
||||||
}
|
}
|
||||||
|
|
||||||
connection, err := ssh.Dial("tcp", fmt.Sprintf("%s:%d", cli.conf.Host, cli.conf.Port), sshConfig)
|
connection, err := ssh.Dial("tcp", fmt.Sprintf("%s:%d", cli.conf.Host, cli.conf.Port), sshConfig)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
session, err := connection.NewSession()
|
session, err := connection.NewSession()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -65,7 +65,6 @@ func (cli *SSHClient) Session() error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
func (cli *SSHClient) RunCommand(command string) ([]byte, error) {
|
func (cli *SSHClient) RunCommand(command string) ([]byte, error) {
|
||||||
|
|
||||||
if err := cli.Session(); err != nil {
|
if err := cli.Session(); err != nil {
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
package stat
|
package stat
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"io"
|
|
||||||
"bufio"
|
"bufio"
|
||||||
|
"io"
|
||||||
"strings"
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -24,7 +24,7 @@ func (cpu CPUStat) Command() string {
|
||||||
return "cat /proc/stat"
|
return "cat /proc/stat"
|
||||||
}
|
}
|
||||||
|
|
||||||
func (cpu CPUStat) Parse(r io.Reader) ([]CPUStat, error) {
|
func (cpu CPUStat) Parse(r io.Reader) (*[]CPUStat, error) {
|
||||||
var (
|
var (
|
||||||
CPUStats = []CPUStat{}
|
CPUStats = []CPUStat{}
|
||||||
scanner = bufio.NewScanner(r)
|
scanner = bufio.NewScanner(r)
|
||||||
|
@ -63,5 +63,5 @@ func (cpu CPUStat) Parse(r io.Reader) ([]CPUStat, error) {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
return CPUStats, scanner.Err()
|
return &CPUStats, scanner.Err()
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
package stat
|
package stat
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"io"
|
|
||||||
"bufio"
|
"bufio"
|
||||||
|
"io"
|
||||||
"strings"
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -19,7 +19,7 @@ func (diskFree DiskFreeStat) Command() string {
|
||||||
return "df -k"
|
return "df -k"
|
||||||
}
|
}
|
||||||
|
|
||||||
func (diskio DiskFreeStat) Parse(r io.Reader) ([]DiskFreeStat, error) {
|
func (diskio DiskFreeStat) Parse(r io.Reader) (*[]DiskFreeStat, error) {
|
||||||
|
|
||||||
var scanner = bufio.NewScanner(r)
|
var scanner = bufio.NewScanner(r)
|
||||||
var stats = []DiskFreeStat{}
|
var stats = []DiskFreeStat{}
|
||||||
|
@ -29,21 +29,21 @@ func (diskio DiskFreeStat) Parse(r io.Reader) ([]DiskFreeStat, error) {
|
||||||
parts := strings.Fields(scanner.Text())
|
parts := strings.Fields(scanner.Text())
|
||||||
stats = append(stats, DiskFreeStat{
|
stats = append(stats, DiskFreeStat{
|
||||||
filesystem: parts[0],
|
filesystem: parts[0],
|
||||||
size: parts[1],
|
size: parts[1],
|
||||||
used: parts[2],
|
used: parts[2],
|
||||||
available: parts[3],
|
available: parts[3],
|
||||||
usePerc: removePercUnit(parts[4]),
|
usePerc: removePercUnit(parts[4]),
|
||||||
mountedOn: parts[5],
|
mountedOn: parts[5],
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
return stats, scanner.Err()
|
return &stats, scanner.Err()
|
||||||
}
|
}
|
||||||
|
|
||||||
func removePercUnit(str string) string {
|
func removePercUnit(str string) string {
|
||||||
if !strings.HasSuffix(str, "%"){
|
if !strings.HasSuffix(str, "%") {
|
||||||
return str
|
return str
|
||||||
}
|
}
|
||||||
str = str[:len(str)-1]
|
str = str[:len(str)-1]
|
||||||
return str
|
return str
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
package stat
|
package stat
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"io"
|
|
||||||
"bufio"
|
"bufio"
|
||||||
"strings"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"io"
|
||||||
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
type DiskIOStat struct {
|
type DiskIOStat struct {
|
||||||
|
@ -26,10 +26,10 @@ func (diskio DiskIOStat) Command() string {
|
||||||
return "cat /proc/diskstats"
|
return "cat /proc/diskstats"
|
||||||
}
|
}
|
||||||
|
|
||||||
func (diskio DiskIOStat) Parse(r io.Reader) ([]DiskIOStat, error) {
|
func (diskio DiskIOStat) Parse(r io.Reader) (*[]DiskIOStat, error) {
|
||||||
var (
|
var (
|
||||||
DiskIOStats = []DiskIOStat{}
|
stats = []DiskIOStat{}
|
||||||
scanner = bufio.NewScanner(r)
|
scanner = bufio.NewScanner(r)
|
||||||
)
|
)
|
||||||
|
|
||||||
for scanner.Scan() {
|
for scanner.Scan() {
|
||||||
|
@ -41,7 +41,7 @@ func (diskio DiskIOStat) Parse(r io.Reader) ([]DiskIOStat, error) {
|
||||||
if !strings.HasPrefix(deviceName, "sd") {
|
if !strings.HasPrefix(deviceName, "sd") {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
DiskIOStats = append(DiskIOStats, DiskIOStat{
|
stats = append(stats, DiskIOStat{
|
||||||
device: deviceName,
|
device: deviceName,
|
||||||
readCompleted: parts[3],
|
readCompleted: parts[3],
|
||||||
readMerged: parts[4],
|
readMerged: parts[4],
|
||||||
|
@ -58,5 +58,5 @@ func (diskio DiskIOStat) Parse(r io.Reader) ([]DiskIOStat, error) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return DiskIOStats, scanner.Err()
|
return &stats, scanner.Err()
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
package stat
|
package stat
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"io"
|
|
||||||
"bufio"
|
"bufio"
|
||||||
|
"io"
|
||||||
"strings"
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -16,7 +16,7 @@ func (loadavg LoadAvg) Command() string {
|
||||||
return "cat /proc/loadavg"
|
return "cat /proc/loadavg"
|
||||||
}
|
}
|
||||||
|
|
||||||
func (loadavg LoadAvg) Parse(r io.Reader) (LoadAvg, error) {
|
func (loadavg LoadAvg) Parse(r io.Reader) (*LoadAvg, error) {
|
||||||
var (
|
var (
|
||||||
scanner = bufio.NewScanner(r)
|
scanner = bufio.NewScanner(r)
|
||||||
)
|
)
|
||||||
|
@ -29,5 +29,5 @@ func (loadavg LoadAvg) Parse(r io.Reader) (LoadAvg, error) {
|
||||||
load.min5 = parts[1]
|
load.min5 = parts[1]
|
||||||
load.min15 = parts[2]
|
load.min15 = parts[2]
|
||||||
}
|
}
|
||||||
return load, scanner.Err()
|
return &load, scanner.Err()
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,20 +1,19 @@
|
||||||
package stat
|
package stat
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bufio"
|
||||||
"io"
|
"io"
|
||||||
"strings"
|
"strings"
|
||||||
"bufio"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type MemStat struct {
|
type MemStat struct {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (mem MemStat) Command() string {
|
func (mem MemStat) Command() string {
|
||||||
return "cat /proc/meminfo"
|
return "cat /proc/meminfo"
|
||||||
}
|
}
|
||||||
|
|
||||||
func (mem MemStat) Parse(r io.Reader) (map[string]string, error) {
|
func (mem MemStat) Parse(r io.Reader) (*map[string]string, error) {
|
||||||
var (
|
var (
|
||||||
memInfo = map[string]string{}
|
memInfo = map[string]string{}
|
||||||
scanner = bufio.NewScanner(r)
|
scanner = bufio.NewScanner(r)
|
||||||
|
@ -27,5 +26,5 @@ func (mem MemStat) Parse(r io.Reader) (map[string]string, error) {
|
||||||
memInfo[key] = parts[1]
|
memInfo[key] = parts[1]
|
||||||
}
|
}
|
||||||
|
|
||||||
return memInfo, scanner.Err()
|
return &memInfo, scanner.Err()
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
package stat
|
package stat
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"io"
|
|
||||||
"bufio"
|
"bufio"
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
"regexp"
|
"regexp"
|
||||||
"strings"
|
"strings"
|
||||||
"fmt"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type NetDevStat struct {
|
type NetDevStat struct {
|
||||||
|
@ -32,7 +32,7 @@ func (net *NetDevStat) Command() string {
|
||||||
return "cat /proc/net/dev"
|
return "cat /proc/net/dev"
|
||||||
}
|
}
|
||||||
|
|
||||||
func (net *NetDevStat) Parse(r io.Reader) ([]NetDevStat, error) {
|
func (net *NetDevStat) Parse(r io.Reader) (*[]NetDevStat, error) {
|
||||||
var (
|
var (
|
||||||
scanner = bufio.NewScanner(r)
|
scanner = bufio.NewScanner(r)
|
||||||
procNetDevFieldSep = regexp.MustCompile("[ :] *")
|
procNetDevFieldSep = regexp.MustCompile("[ :] *")
|
||||||
|
@ -75,5 +75,5 @@ func (net *NetDevStat) Parse(r io.Reader) ([]NetDevStat, error) {
|
||||||
transMulticast: parts[16],
|
transMulticast: parts[16],
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
return netDevStats, scanner.Err()
|
return &netDevStats, scanner.Err()
|
||||||
}
|
}
|
||||||
|
|
43
stat/process.go
Normal file
43
stat/process.go
Normal file
|
@ -0,0 +1,43 @@
|
||||||
|
package stat
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bufio"
|
||||||
|
"io"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
type ProcessStat struct {
|
||||||
|
user,
|
||||||
|
pid,
|
||||||
|
size,
|
||||||
|
pcpu,
|
||||||
|
pmem,
|
||||||
|
cmd string
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ps *ProcessStat) Command() string {
|
||||||
|
return "ps -eo user,pid,size,pcpu,pmem,comm --sort=-pmem c"
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ps *ProcessStat) Parse(r io.Reader) (*[]ProcessStat, error) {
|
||||||
|
var (
|
||||||
|
psStats = []ProcessStat{}
|
||||||
|
scanner = bufio.NewScanner(r)
|
||||||
|
)
|
||||||
|
scanner.Scan()
|
||||||
|
for scanner.Scan() {
|
||||||
|
line := scanner.Text()
|
||||||
|
parts := strings.Fields(line)
|
||||||
|
psStats = append(psStats, ProcessStat{
|
||||||
|
user: parts[0],
|
||||||
|
pid: parts[1],
|
||||||
|
size: parts[2],
|
||||||
|
pcpu: parts[3],
|
||||||
|
pmem: parts[4],
|
||||||
|
cmd: parts[5],
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
return &psStats, scanner.Err()
|
||||||
|
}
|
||||||
|
|
|
@ -1,8 +0,0 @@
|
||||||
package stat
|
|
||||||
|
|
||||||
import "io"
|
|
||||||
|
|
||||||
type Stat interface {
|
|
||||||
Command() string
|
|
||||||
Parse(r io.Reader) (interface{}, error)
|
|
||||||
}
|
|
Loading…
Reference in New Issue
Block a user