ty rustfmt
This commit is contained in:
parent
65f87d678f
commit
2e8d262d90
1 changed files with 28 additions and 23 deletions
51
src/main.rs
51
src/main.rs
|
@ -1,18 +1,17 @@
|
||||||
|
extern crate byteorder;
|
||||||
extern crate glob;
|
extern crate glob;
|
||||||
extern crate hex;
|
extern crate hex;
|
||||||
extern crate byteorder;
|
|
||||||
extern crate terminal_size;
|
extern crate terminal_size;
|
||||||
|
|
||||||
use std::fs::{File, read_link};
|
|
||||||
use std::io::{BufRead, BufReader};
|
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
use std::net::{IpAddr, Ipv4Addr, Ipv6Addr};
|
|
||||||
use std::fmt;
|
use std::fmt;
|
||||||
|
use std::fs::{read_link, File};
|
||||||
|
use std::io::{BufRead, BufReader};
|
||||||
|
use std::net::{IpAddr, Ipv4Addr, Ipv6Addr};
|
||||||
|
|
||||||
use byteorder::{ByteOrder, LittleEndian};
|
use byteorder::{ByteOrder, LittleEndian};
|
||||||
use glob::glob;
|
use glob::glob;
|
||||||
use terminal_size::{Width, terminal_size};
|
use terminal_size::{terminal_size, Width};
|
||||||
|
|
||||||
|
|
||||||
fn parse_ipv4(ip: &str) -> IpAddr {
|
fn parse_ipv4(ip: &str) -> IpAddr {
|
||||||
let bytes = hex::decode(ip).unwrap();
|
let bytes = hex::decode(ip).unwrap();
|
||||||
|
@ -20,19 +19,18 @@ fn parse_ipv4(ip: &str) -> IpAddr {
|
||||||
IpAddr::V4(ipv4)
|
IpAddr::V4(ipv4)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
fn parse_ipv6(ip: &str) -> IpAddr {
|
fn parse_ipv6(ip: &str) -> IpAddr {
|
||||||
let bytes = hex::decode(ip).unwrap();
|
let bytes = hex::decode(ip).unwrap();
|
||||||
let mut words = [0; 8];
|
let mut words = [0; 8];
|
||||||
|
|
||||||
LittleEndian::read_u16_into(&bytes, &mut words);
|
LittleEndian::read_u16_into(&bytes, &mut words);
|
||||||
|
|
||||||
let ipv6 = Ipv6Addr::new(words[7], words[6], words[5], words[4],
|
let ipv6 = Ipv6Addr::new(
|
||||||
words[3], words[2], words[1], words[0]);
|
words[7], words[6], words[5], words[4], words[3], words[2], words[1], words[0],
|
||||||
|
);
|
||||||
IpAddr::V6(ipv6)
|
IpAddr::V6(ipv6)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
enum Protocol {
|
enum Protocol {
|
||||||
Tcp,
|
Tcp,
|
||||||
Udp,
|
Udp,
|
||||||
|
@ -40,10 +38,12 @@ enum Protocol {
|
||||||
|
|
||||||
impl fmt::Display for Protocol {
|
impl fmt::Display for Protocol {
|
||||||
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||||
write!(f, "{}", match self {
|
let protocol = match self {
|
||||||
Protocol::Tcp => "tcp",
|
Protocol::Tcp => "tcp",
|
||||||
Protocol::Udp => "udp",
|
Protocol::Udp => "udp",
|
||||||
})
|
};
|
||||||
|
|
||||||
|
write!(f, "{}", protocol)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -62,7 +62,7 @@ impl<'a> fmt::Display for Address<'a> {
|
||||||
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||||
match self.ip {
|
match self.ip {
|
||||||
IpAddr::V4(ip) => write!(f, "{} {}:{}", self.protocol, ip, self.port),
|
IpAddr::V4(ip) => write!(f, "{} {}:{}", self.protocol, ip, self.port),
|
||||||
IpAddr::V6(ip) => write!(f, "{} [{}]:{}", self.protocol, ip, self.port)
|
IpAddr::V6(ip) => write!(f, "{} [{}]:{}", self.protocol, ip, self.port),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -81,7 +81,6 @@ impl<'a> INode<'a> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
fn get_inodes(inodes: &mut HashMap<usize, INode>) {
|
fn get_inodes(inodes: &mut HashMap<usize, INode>) {
|
||||||
for fd in glob("/proc/*/fd/*").unwrap() {
|
for fd in glob("/proc/*/fd/*").unwrap() {
|
||||||
let path = match fd {
|
let path = match fd {
|
||||||
|
@ -106,13 +105,15 @@ fn get_inodes(inodes: &mut HashMap<usize, INode>) {
|
||||||
let inode = inode_str[1..(inode_str.len() - 1)].parse().unwrap();
|
let inode = inode_str[1..(inode_str.len() - 1)].parse().unwrap();
|
||||||
|
|
||||||
let mut inode = inodes.entry(inode).or_insert_with(INode::new);
|
let mut inode = inodes.entry(inode).or_insert_with(INode::new);
|
||||||
let process = Process { pid: pid.unwrap(), command_line: None };
|
let process = Process {
|
||||||
|
pid: pid.unwrap(),
|
||||||
|
command_line: None,
|
||||||
|
};
|
||||||
inode.processes.push(process);
|
inode.processes.push(process);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
fn get_command_lines(inodes: &mut HashMap<usize, INode>) {
|
fn get_command_lines(inodes: &mut HashMap<usize, INode>) {
|
||||||
for inode in inodes.values_mut() {
|
for inode in inodes.values_mut() {
|
||||||
for process in &mut inode.processes {
|
for process in &mut inode.processes {
|
||||||
|
@ -128,7 +129,6 @@ fn get_command_lines(inodes: &mut HashMap<usize, INode>) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
fn get_addresses(inodes: &mut HashMap<usize, INode>) {
|
fn get_addresses(inodes: &mut HashMap<usize, INode>) {
|
||||||
for protocol in &[Protocol::Tcp, Protocol::Udp] {
|
for protocol in &[Protocol::Tcp, Protocol::Udp] {
|
||||||
for version in &["", "6"] {
|
for version in &["", "6"] {
|
||||||
|
@ -147,7 +147,10 @@ fn get_addresses(inodes: &mut HashMap<usize, INode>) {
|
||||||
}
|
}
|
||||||
|
|
||||||
let address: Vec<_> = fields[1].split(':').collect();
|
let address: Vec<_> = fields[1].split(':').collect();
|
||||||
let ip = match *version { "6" => parse_ipv6, _ => parse_ipv4 }(address[0]);
|
let ip = match *version {
|
||||||
|
"6" => parse_ipv6,
|
||||||
|
_ => parse_ipv4,
|
||||||
|
}(address[0]);
|
||||||
let port = u16::from_str_radix(address[1], 16).unwrap();
|
let port = u16::from_str_radix(address[1], 16).unwrap();
|
||||||
|
|
||||||
let inode_id = fields[9].parse().unwrap();
|
let inode_id = fields[9].parse().unwrap();
|
||||||
|
@ -161,7 +164,6 @@ fn get_addresses(inodes: &mut HashMap<usize, INode>) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
fn print_all(inodes: &HashMap<usize, INode>) {
|
fn print_all(inodes: &HashMap<usize, INode>) {
|
||||||
let columns = match terminal_size() {
|
let columns = match terminal_size() {
|
||||||
Some((Width(value), _)) => usize::from(value),
|
Some((Width(value), _)) => usize::from(value),
|
||||||
|
@ -175,10 +177,14 @@ fn print_all(inodes: &HashMap<usize, INode>) {
|
||||||
for address in &inode.addresses {
|
for address in &inode.addresses {
|
||||||
for (i, process) in inode.processes.iter().enumerate() {
|
for (i, process) in inode.processes.iter().enumerate() {
|
||||||
let command_line = process.command_line.clone().unwrap_or_default();
|
let command_line = process.command_line.clone().unwrap_or_default();
|
||||||
let address_str = if i == 0 { format!("{}", address) } else { String::new() };
|
let address_str = if i == 0 {
|
||||||
|
format!("{}", address)
|
||||||
|
} else {
|
||||||
|
String::new()
|
||||||
|
};
|
||||||
|
|
||||||
let mut output = format!(
|
let mut output =
|
||||||
"{: <45} {: >6} {}", address_str, process.pid, command_line);
|
format!("{: <45} {: >6} {}", address_str, process.pid, command_line);
|
||||||
output.truncate(columns);
|
output.truncate(columns);
|
||||||
|
|
||||||
println!("{}", output);
|
println!("{}", output);
|
||||||
|
@ -187,7 +193,6 @@ fn print_all(inodes: &HashMap<usize, INode>) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
let mut inodes: HashMap<usize, INode> = HashMap::new();
|
let mut inodes: HashMap<usize, INode> = HashMap::new();
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue