main.rs 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. extern crate mio;
  2. #[macro_use]
  3. extern crate log;
  4. extern crate syslog;
  5. use log::*;
  6. use mio::*;
  7. use mio::tcp::TcpListener;
  8. use std::io::Write;
  9. use syslog::{Facility,Severity};
  10. const LISTENADDR : &'static str = "127.0.0.1:13265";
  11. struct SyslogLogger {
  12. writer: Box<syslog::Logger>
  13. }
  14. impl SyslogLogger {
  15. fn init() -> Result<(), SetLoggerError> {
  16. let writer = syslog::unix(Facility::LOG_USER)
  17. .expect("impossible to connect to syslog.");
  18. log::set_logger(|max_log_level| {
  19. max_log_level.set(LogLevelFilter::Info);
  20. Box::new(SyslogLogger {writer: writer} )
  21. })
  22. }
  23. }
  24. impl log::Log for SyslogLogger {
  25. fn enabled(&self, metadata: &LogMetadata) -> bool {
  26. metadata.level() <= LogLevel::Info
  27. }
  28. fn log(&self, record: &LogRecord) {
  29. if self.enabled(record.metadata()) {
  30. let message = format!("{} {}", record.level(), record.args());
  31. let r = self.writer.send(Severity::LOG_ALERT, &message);
  32. if r.is_err() {
  33. println!("error sending the log {}", r.err().expect("got error"));
  34. }
  35. }
  36. }
  37. }
  38. struct StderrLogger;
  39. impl StderrLogger {
  40. fn init() -> Result<(), SetLoggerError> {
  41. log::set_logger(|max_log_level| {
  42. max_log_level.set(LogLevelFilter::Info);
  43. Box::new(StderrLogger)
  44. })
  45. }
  46. }
  47. impl log::Log for StderrLogger {
  48. fn enabled(&self, metadata: &LogMetadata) -> bool {
  49. metadata.level() <= LogLevel::Info
  50. }
  51. fn log(&self, record: &LogRecord) {
  52. if self.enabled(record.metadata()) {
  53. writeln!(&mut std::io::stderr(), "{} {}", record.level(), record.args())
  54. .expect("error sending the log")
  55. }
  56. }
  57. }
  58. fn malformed_packet(err: std::io::Error) {
  59. info!("Somebody sent an invalid tcp packet: {}", err.to_string());
  60. }
  61. fn handle(stream: tcp::TcpStream) {
  62. // let _ = stream.write(&"go fuck you kthxbye".as_bytes());
  63. match stream.local_addr() {
  64. Ok(addr) =>
  65. info!("new connection to {}:{}", addr.ip(), addr.port()),
  66. Err(err) => malformed_packet(err),
  67. }
  68. }
  69. fn main() {
  70. SyslogLogger::init().expect("can't set up logger.");
  71. info!("Starting up!");
  72. // Setup some tokens to allow us to identify which event is
  73. // for which socket.
  74. const SERVER: Token = Token(0);
  75. // Setup the server socket
  76. let addr = LISTENADDR.parse().unwrap();
  77. let server = TcpListener::bind(&addr)
  78. .expect(&format!("Can't bind to address {}", LISTENADDR));
  79. // Create an poll instance
  80. let poll = Poll::new().expect("Cannot create pool.");
  81. // Start listening for incoming connections
  82. poll.register(&server, SERVER, Ready::all(), PollOpt::edge())
  83. .expect("Cannot register server");
  84. // Create storage for events
  85. let mut events = Events::with_capacity(1024);
  86. loop {
  87. poll.poll(&mut events, None).unwrap();
  88. for event in events.iter() {
  89. match (event.token(), event.kind().is_readable()) {
  90. (SERVER, true) => {
  91. match server.accept() {
  92. Err(err) => malformed_packet(err),
  93. Ok((stream, _)) => handle(stream),
  94. }
  95. },
  96. _ => {
  97. info!("something happened: {:?}", event.kind());
  98. // unreachable!(),
  99. }
  100. }
  101. }
  102. }
  103. }