bettercap 1.6.1 → 1.6.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +33 -34
- data/bin/bettercap +1 -1
- data/lib/bettercap/context.rb +1 -1
- data/lib/bettercap/discovery/agents/mdns.rb +61 -0
- data/lib/bettercap/discovery/agents/upnp.rb +60 -0
- data/lib/bettercap/discovery/agents/wsd.rb +75 -0
- data/lib/bettercap/firewalls/linux.rb +0 -4
- data/lib/bettercap/logger.rb +63 -34
- data/lib/bettercap/network/network.rb +1 -1
- data/lib/bettercap/options/core_options.rb +1 -1
- data/lib/bettercap/proxy/http/modules/redirect.rb +1 -1
- data/lib/bettercap/proxy/http/proxy.rb +1 -9
- data/lib/bettercap/proxy/http/sslstrip/strip.rb +5 -5
- data/lib/bettercap/sniffer/parsers/asterisk.rb +37 -0
- data/lib/bettercap/sniffer/parsers/bfd.rb +159 -0
- data/lib/bettercap/sniffer/parsers/dhcp.rb +23 -23
- data/lib/bettercap/sniffer/parsers/dict.rb +13 -11
- data/lib/bettercap/sniffer/parsers/hsrp.rb +262 -0
- data/lib/bettercap/sniffer/parsers/https.rb +17 -19
- data/lib/bettercap/sniffer/parsers/mpd.rb +12 -10
- data/lib/bettercap/sniffer/parsers/nntp.rb +5 -1
- data/lib/bettercap/sniffer/parsers/post.rb +8 -9
- data/lib/bettercap/sniffer/parsers/radius.rb +410 -0
- data/lib/bettercap/sniffer/parsers/redis.rb +15 -13
- data/lib/bettercap/sniffer/parsers/rlogin.rb +20 -19
- data/lib/bettercap/sniffer/parsers/snmp.rb +16 -17
- data/lib/bettercap/sniffer/parsers/snpp.rb +13 -11
- data/lib/bettercap/sniffer/parsers/teamtalk.rb +41 -0
- data/lib/bettercap/sniffer/parsers/teamviewer.rb +8 -8
- data/lib/bettercap/sniffer/parsers/url.rb +6 -6
- data/lib/bettercap/sniffer/parsers/whatsapp.rb +6 -7
- data/lib/bettercap/sniffer/parsers/wol.rb +68 -0
- data/lib/bettercap/spoofers/arp.rb +3 -3
- data/lib/bettercap/spoofers/hsrp.rb +351 -0
- data/lib/bettercap/spoofers/mac.rb +126 -0
- data/lib/bettercap/version.rb +1 -1
- metadata +13 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b7b14d5a93e46311f7abcb2a9bb1ae008ead71ea
|
4
|
+
data.tar.gz: c9a0bc4f745b7b37d8d5313048a554a6d24c0895
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3b64319b9bc5243c6976e341a3d8f62867224c8c3dd0a85511c76133e3798660d19c10e8285ebb0c966fe4f3468328e766ba4a9f42310550b939ca2056f524d8
|
7
|
+
data.tar.gz: 925bb24ab784ee2e4ce4644eab36d658a48b313b825a3aa7f7262503f5e20d6ca9c0e3beac1c7a3ec69bbbea317be7849b73fcf3928e2918c969f8de4f98c9ae
|
data/README.md
CHANGED
@@ -1,8 +1,6 @@
|
|
1
1
|
**bettercap** is a complete, modular, portable and easily extensible **MITM** tool and framework with every kind of diagnostic
|
2
2
|
and offensive feature you could need in order to perform a man in the middle attack.
|
3
3
|
|
4
|
-
Before submitting issues, please read the relevant [section](https://www.bettercap.org/docs/contribute/) in the documentation.
|
5
|
-
|
6
4
|
<table>
|
7
5
|
<tr>
|
8
6
|
<th>Version</th>
|
@@ -17,16 +15,9 @@ Before submitting issues, please read the relevant [section](https://www.betterc
|
|
17
15
|
<td><a href="https://www.bettercap.org/">https://www.bettercap.org/</a></td>
|
18
16
|
</tr>
|
19
17
|
<tr>
|
20
|
-
<th>
|
21
|
-
<td><a href="https://www.bettercap.org/blog/">https://www.bettercap.org/blog/</a></td>
|
22
|
-
<tr>
|
23
|
-
<th>Github</th>
|
18
|
+
<th>GitHub</th>
|
24
19
|
<td><a href="https://github.com/evilsocket/bettercap">https://github.com/evilsocket/bettercap</a></td>
|
25
20
|
<tr/>
|
26
|
-
<tr>
|
27
|
-
<th>Documentation</th>
|
28
|
-
<td><a href="https://www.bettercap.org/docs/">https://www.bettercap.org/docs/</a></td>
|
29
|
-
</tr>
|
30
21
|
<tr>
|
31
22
|
<th>Code Documentation</th>
|
32
23
|
<td>
|
@@ -46,16 +37,8 @@ Before submitting issues, please read the relevant [section](https://www.betterc
|
|
46
37
|
<td><a href="https://twitter.com/bettercap">@bettercap</a></td>
|
47
38
|
</tr>
|
48
39
|
<tr>
|
49
|
-
<th>
|
50
|
-
<td>
|
51
|
-
<a href="https://gitter.im/evilsocket/bettercap" target="_blank">
|
52
|
-
<img src="https://badges.gitter.im/evilsocket/bettercap.svg"/>
|
53
|
-
</a>
|
54
|
-
</td>
|
55
|
-
</tr>
|
56
|
-
<tr>
|
57
|
-
<th>Copyright</th>
|
58
|
-
<td>2015-2016 Simone Margaritelli</td>
|
40
|
+
<th>Copyleft</th>
|
41
|
+
<td>Simone Margaritelli</td>
|
59
42
|
</tr>
|
60
43
|
<tr>
|
61
44
|
<th>License</th>
|
@@ -68,33 +51,49 @@ Installation
|
|
68
51
|
|
69
52
|
**Dependencies**
|
70
53
|
|
71
|
-
All dependencies will be automatically installed through the
|
72
|
-
dependency in order to make everything work
|
54
|
+
All dependencies will be automatically installed through the RubyGems system but in some cases you might need to install some system
|
55
|
+
dependency in order to make everything work.
|
56
|
+
|
57
|
+
**On OSX** (install brew and xcode tools first):
|
58
|
+
|
59
|
+
```shell
|
60
|
+
brew install libpcap
|
61
|
+
```
|
62
|
+
|
63
|
+
**On Linux**:
|
73
64
|
|
74
|
-
|
65
|
+
```shell
|
66
|
+
sudo apt-get install build-essential ruby-dev libpcap-dev net-tools
|
67
|
+
```
|
75
68
|
|
76
69
|
This should solve issues such as [this one](https://github.com/evilsocket/bettercap/issues/22) or [this one](https://github.com/evilsocket/bettercap/issues/100).
|
77
70
|
|
78
|
-
**Stable Release (
|
71
|
+
**Stable Release (RubyGems)**
|
79
72
|
|
80
|
-
|
73
|
+
```shell
|
74
|
+
gem install bettercap
|
75
|
+
```
|
81
76
|
|
82
77
|
**From Source**
|
83
78
|
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
79
|
+
```shell
|
80
|
+
git clone https://github.com/evilsocket/bettercap
|
81
|
+
cd bettercap
|
82
|
+
gem build bettercap.gemspec
|
83
|
+
sudo gem install bettercap*.gem
|
84
|
+
```
|
88
85
|
|
89
86
|
**Installation on Kali Linux**
|
90
87
|
|
91
88
|
Kali Linux has bettercap packaged and added to the **kali-rolling** repositories. To install bettercap and all dependencies in one fell swoop on the latest version of Kali Linux:
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
89
|
+
|
90
|
+
```shell
|
91
|
+
apt-get update
|
92
|
+
apt-get dist-upgrade
|
93
|
+
apt-get install bettercap
|
94
|
+
```
|
96
95
|
|
97
96
|
Documentation and Examples
|
98
97
|
============
|
99
98
|
|
100
|
-
Please refer to the [official website](https://www.bettercap.org/
|
99
|
+
Please refer to the [official website](https://www.bettercap.org/).
|
data/bin/bettercap
CHANGED
data/lib/bettercap/context.rb
CHANGED
@@ -0,0 +1,61 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
=begin
|
3
|
+
|
4
|
+
BETTERCAP
|
5
|
+
|
6
|
+
Author : Simone 'evilsocket' Margaritelli
|
7
|
+
Email : evilsocket@gmail.com
|
8
|
+
Blog : https://www.evilsocket.net/
|
9
|
+
|
10
|
+
mDNS DNS-SD broadcast discovery agent:
|
11
|
+
Author : Brendan Coles
|
12
|
+
Email : bcoles[at]gmail.com
|
13
|
+
|
14
|
+
This project is released under the GPL 3 license.
|
15
|
+
|
16
|
+
=end
|
17
|
+
|
18
|
+
# Send a broadcast mDNS query trying to fill the ARP table.
|
19
|
+
module BetterCap
|
20
|
+
module Discovery
|
21
|
+
module Agents
|
22
|
+
# Class responsible for sending mDNS broadcast queries to the network.
|
23
|
+
class Mdns
|
24
|
+
# Create a thread which will send an mDNS broadcast query
|
25
|
+
# in order to populate the ARP cache with active targets.
|
26
|
+
# http://www.multicastdns.org/
|
27
|
+
# http://www.ietf.org/rfc/rfc6762.txt
|
28
|
+
# https://en.wikipedia.org/wiki/Multicast_DNS
|
29
|
+
# https://en.wikipedia.org/wiki/Zero-configuration_networking#DNS-SD_with_multicast
|
30
|
+
def initialize( ctx, address = nil )
|
31
|
+
pkt = PacketFu::UDPPacket.new
|
32
|
+
|
33
|
+
pkt.eth_saddr = ctx.iface.mac
|
34
|
+
pkt.eth_daddr = '01:00:5e:00:00:fb'
|
35
|
+
pkt.ip_saddr = ctx.iface.ip
|
36
|
+
pkt.ip_daddr = '224.0.0.251'
|
37
|
+
pkt.udp_src = (rand((2 ** 16) - 1024) + 1024).to_i
|
38
|
+
pkt.udp_dst = 5353
|
39
|
+
|
40
|
+
query = "\x09_services\x07_dns-sd\x04_udp\x05local"
|
41
|
+
|
42
|
+
payload = "\x00\x01" # Transaction ID
|
43
|
+
payload << "\x00\x00" # Flags
|
44
|
+
payload << "\x00\x01" # Number of questions
|
45
|
+
payload << "\x00\x00" # Number of answers
|
46
|
+
payload << "\x00\x00" # Number of authority resource records
|
47
|
+
payload << "\x00\x00" # Number of additional resource records
|
48
|
+
payload << query # Query
|
49
|
+
payload << "\x00" # Terminator
|
50
|
+
payload << "\x00\x0c" # Type (PTR)
|
51
|
+
payload << "\x00\x01" # Class
|
52
|
+
|
53
|
+
pkt.payload = payload
|
54
|
+
pkt.recalc
|
55
|
+
|
56
|
+
ctx.packets.push(pkt)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
=begin
|
3
|
+
|
4
|
+
BETTERCAP
|
5
|
+
|
6
|
+
Author : Simone 'evilsocket' Margaritelli
|
7
|
+
Email : evilsocket@gmail.com
|
8
|
+
Blog : https://www.evilsocket.net/
|
9
|
+
|
10
|
+
UPnP SSDP broadcast discovery agent:
|
11
|
+
Author : Brendan Coles
|
12
|
+
Email : bcoles[at]gmail.com
|
13
|
+
|
14
|
+
This project is released under the GPL 3 license.
|
15
|
+
|
16
|
+
=end
|
17
|
+
|
18
|
+
# Send a broadcast UPnP query trying to fill the ARP table.
|
19
|
+
module BetterCap
|
20
|
+
module Discovery
|
21
|
+
module Agents
|
22
|
+
# Class responsible for sending UPnP SSDP broadcast queries to the network.
|
23
|
+
class Upnp
|
24
|
+
# Create a thread which will send a UPnP SSDP M-SEARCH broadcast query
|
25
|
+
# in order to populate the ARP cache with active targets.
|
26
|
+
# https://tools.ietf.org/html/draft-cai-ssdp-v1-03#section-4
|
27
|
+
# https://en.wikipedia.org/wiki/Simple_Service_Discovery_Protocol
|
28
|
+
# https://en.wikipedia.org/wiki/Zero-configuration_networking#SSDP
|
29
|
+
def initialize( ctx, address = nil )
|
30
|
+
host = '239.255.255.250'
|
31
|
+
port = 1900
|
32
|
+
|
33
|
+
pkt = PacketFu::UDPPacket.new
|
34
|
+
|
35
|
+
pkt.eth_saddr = ctx.iface.mac
|
36
|
+
pkt.eth_daddr = '01:00:5e:7f:ff:fa'
|
37
|
+
pkt.ip_saddr = ctx.iface.ip
|
38
|
+
pkt.ip_daddr = host
|
39
|
+
pkt.udp_src = (rand((2 ** 16) - 1024) + 1024).to_i
|
40
|
+
pkt.udp_dst = port
|
41
|
+
|
42
|
+
query = []
|
43
|
+
query << 'M-SEARCH * HTTP/1.1'
|
44
|
+
query << "Host: #{host}:#{port}"
|
45
|
+
query << 'Man: ssdp:discover'
|
46
|
+
query << 'ST: ssdp:all' # Search Target
|
47
|
+
query << 'MX: 2' # Delay response (2 seconds)
|
48
|
+
|
49
|
+
payload = query.join("\r\n").to_s
|
50
|
+
payload << "\r\n"
|
51
|
+
|
52
|
+
pkt.payload = payload
|
53
|
+
pkt.recalc
|
54
|
+
|
55
|
+
ctx.packets.push(pkt)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,75 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
=begin
|
3
|
+
|
4
|
+
BETTERCAP
|
5
|
+
|
6
|
+
Author : Simone 'evilsocket' Margaritelli
|
7
|
+
Email : evilsocket@gmail.com
|
8
|
+
Blog : https://www.evilsocket.net/
|
9
|
+
|
10
|
+
WS-Discovery broadcast discovery agent:
|
11
|
+
Author : Brendan Coles
|
12
|
+
Email : bcoles[at]gmail.com
|
13
|
+
|
14
|
+
This project is released under the GPL 3 license.
|
15
|
+
|
16
|
+
=end
|
17
|
+
|
18
|
+
# Send a broadcast WS-Discovery query trying to fill the ARP table.
|
19
|
+
module BetterCap
|
20
|
+
module Discovery
|
21
|
+
module Agents
|
22
|
+
# Class responsible for sending WS-Discovery broadcast queries to the network.
|
23
|
+
class Wsd
|
24
|
+
# Create a thread which will send a WS-Discovery broadcast query
|
25
|
+
# in order to populate the ARP cache with active targets.
|
26
|
+
|
27
|
+
# References:
|
28
|
+
# - https://msdn.microsoft.com/en-us/library/windows/desktop/bb513684(v=vs.85).aspx
|
29
|
+
# - http://specs.xmlsoap.org/ws/2005/04/discovery/ws-discovery.pdf
|
30
|
+
# - https://en.wikipedia.org/wiki/Web_Services_for_Devices
|
31
|
+
# - https://en.wikipedia.org/wiki/WS-Discovery
|
32
|
+
# - https://en.wikipedia.org/wiki/Zero-configuration_networking#WS-Discovery
|
33
|
+
|
34
|
+
def initialize( ctx, address = nil )
|
35
|
+
pkt = PacketFu::UDPPacket.new
|
36
|
+
|
37
|
+
pkt.eth_saddr = ctx.iface.mac
|
38
|
+
pkt.eth_daddr = '01:00:5e:7f:ff:fa'
|
39
|
+
pkt.ip_saddr = ctx.iface.ip
|
40
|
+
pkt.ip_daddr = '239.255.255.250'
|
41
|
+
pkt.udp_src = (rand((2 ** 16) - 1024) + 1024).to_i
|
42
|
+
pkt.udp_dst = 3702
|
43
|
+
|
44
|
+
uuid = SecureRandom.uuid
|
45
|
+
|
46
|
+
payload = '<?xml version="1.0" encoding="utf-8" ?>'
|
47
|
+
payload << '<soap:Envelope'
|
48
|
+
payload << ' xmlns:soap="http://www.w3.org/2003/05/soap-envelope"'
|
49
|
+
payload << ' xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing"'
|
50
|
+
payload << ' xmlns:wsd="http://schemas.xmlsoap.org/ws/2005/04/discovery"'
|
51
|
+
payload << ' xmlns:wsdp="http://schemas.xmlsoap.org/ws/2006/02/devprof">'
|
52
|
+
|
53
|
+
payload << '<soap:Header>'
|
54
|
+
# WS-Discovery
|
55
|
+
payload << '<wsa:To>urn:schemas-xmlsoap-org:ws:2005:04:discovery</wsa:To>'
|
56
|
+
# Action (Probe)
|
57
|
+
payload << "<wsa:Action>http://schemas.xmlsoap.org/ws/2005/04/discovery/Probe</wsa:Action>"
|
58
|
+
# Message identifier (unique GUID)
|
59
|
+
payload << "<wsa:MessageID>urn:uuid:#{uuid}</wsa:MessageID>"
|
60
|
+
payload << '</soap:Header>'
|
61
|
+
|
62
|
+
payload << '<soap:Body>'
|
63
|
+
payload << '<wsd:Probe/>' # WS-Discovery type (blank)
|
64
|
+
payload << '</soap:Body>'
|
65
|
+
payload << '</env:Envelope>'
|
66
|
+
|
67
|
+
pkt.payload = payload
|
68
|
+
pkt.recalc
|
69
|
+
|
70
|
+
ctx.packets.push(pkt)
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
@@ -75,8 +75,6 @@ class Linux < Base
|
|
75
75
|
# Ipv6 uses a different ip + port representation
|
76
76
|
cal_dst_address = "[#{r.dst_address}]"
|
77
77
|
end
|
78
|
-
# post route
|
79
|
-
Shell.execute("#{table} -t nat -I POSTROUTING -s 0/0 -j MASQUERADE")
|
80
78
|
# accept all
|
81
79
|
Shell.execute("#{table} -P FORWARD ACCEPT")
|
82
80
|
# add redirection
|
@@ -92,8 +90,6 @@ class Linux < Base
|
|
92
90
|
# Ipv6 uses a different ip + port representation
|
93
91
|
cal_dst_address = "[#{r.dst_address}]"
|
94
92
|
end
|
95
|
-
# remove post route
|
96
|
-
Shell.execute("#{table} -t nat -D POSTROUTING -s 0/0 -j MASQUERADE")
|
97
93
|
# remove redirection
|
98
94
|
Shell.execute("#{table} -t nat -D PREROUTING -i #{r.interface} -p #{r.protocol} #{r.src_address.nil? ? '' : "-d #{r.src_address}"} --dport #{r.src_port} -j DNAT --to #{cal_dst_address}:#{r.dst_port}")
|
99
95
|
end
|
data/lib/bettercap/logger.rb
CHANGED
@@ -13,6 +13,53 @@ This project is released under the GPL 3 license.
|
|
13
13
|
module BetterCap
|
14
14
|
# Class responsible for console and file logging.
|
15
15
|
module Logger
|
16
|
+
L_RAW = 0
|
17
|
+
L_DBG = 1
|
18
|
+
L_INF = 2
|
19
|
+
L_WRN = 3
|
20
|
+
L_ERR = 4
|
21
|
+
|
22
|
+
class Entry
|
23
|
+
def initialize( ts, level, message )
|
24
|
+
@timestamp = ts
|
25
|
+
@level = level
|
26
|
+
@message = message
|
27
|
+
end
|
28
|
+
|
29
|
+
def create
|
30
|
+
case @level
|
31
|
+
when Logger::L_RAW
|
32
|
+
formatted_message( @message, nil )
|
33
|
+
when Logger::L_DBG
|
34
|
+
formatted_message( @message, 'D' ).light_black
|
35
|
+
when Logger::L_INF
|
36
|
+
formatted_message( @message, 'I' )
|
37
|
+
when Logger::L_WRN
|
38
|
+
formatted_message( @message, 'W' ).yellow
|
39
|
+
when Logger::L_ERR
|
40
|
+
formatted_message( @message, 'E' ).red
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
private
|
45
|
+
|
46
|
+
# Format +message+ for the given +message_type+.
|
47
|
+
def formatted_message(message, message_type)
|
48
|
+
# raw message?
|
49
|
+
if message_type.nil?
|
50
|
+
if @timestamp and !message.strip.empty?
|
51
|
+
"[#{Time.now}] #{message}"
|
52
|
+
else
|
53
|
+
message
|
54
|
+
end
|
55
|
+
elsif @timestamp
|
56
|
+
"[#{Time.now}] [#{message_type}] #{message}"
|
57
|
+
else
|
58
|
+
"[#{message_type}] #{message}"
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
16
63
|
class << self
|
17
64
|
@@ctx = nil
|
18
65
|
@@queue = Queue.new
|
@@ -39,48 +86,45 @@ module Logger
|
|
39
86
|
"Message : #{e.message}\n" +
|
40
87
|
"Backtrace :\n\n #{e.backtrace.join("\n ")}\n"
|
41
88
|
|
42
|
-
|
43
|
-
self.warn(msg)
|
44
|
-
else
|
45
|
-
self.debug(msg)
|
46
|
-
end
|
89
|
+
self.debug(msg)
|
47
90
|
end
|
48
91
|
|
49
92
|
# Log an error +message+.
|
50
93
|
def error(message)
|
51
|
-
@@queue.push
|
94
|
+
@@queue.push Logger::Entry.new( @@timestamp, Logger::L_ERR, message )
|
52
95
|
end
|
53
96
|
|
54
97
|
# Log an information +message+.
|
55
98
|
def info(message)
|
56
|
-
@@queue.push(
|
99
|
+
@@queue.push( Logger::Entry.new( @@timestamp, Logger::L_INF, message ) ) unless @silent
|
57
100
|
end
|
58
101
|
|
59
102
|
# Log a warning +message+.
|
60
103
|
def warn(message)
|
61
|
-
@@queue.push
|
104
|
+
@@queue.push Logger::Entry.new( @@timestamp, Logger::L_WRN, message )
|
62
105
|
end
|
63
106
|
|
64
107
|
# Log a debug +message+.
|
65
108
|
def debug(message)
|
66
109
|
if @@debug and not @@silent
|
67
|
-
@@queue.push
|
110
|
+
@@queue.push Logger::Entry.new( @@timestamp, Logger::L_DBG, message )
|
68
111
|
end
|
69
112
|
end
|
70
113
|
|
71
114
|
# Log a +message+ as it is.
|
72
115
|
def raw(message)
|
73
|
-
@@queue.push(
|
116
|
+
@@queue.push( Logger::Entry.new( @@timestamp, Logger::L_RAW, message ) ) unless @silent
|
74
117
|
end
|
75
118
|
|
76
119
|
# Wait for the messages queue to be empty.
|
77
120
|
def wait!
|
78
121
|
while not @@queue.empty?
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
sleep 0.3
|
122
|
+
msg = @@queue.pop(true) rescue nil
|
123
|
+
if msg
|
124
|
+
emit msg.create
|
83
125
|
end
|
126
|
+
|
127
|
+
sleep(0.3) if msg.nil?
|
84
128
|
end
|
85
129
|
end
|
86
130
|
|
@@ -89,15 +133,16 @@ module Logger
|
|
89
133
|
# Main logger logic.
|
90
134
|
def worker
|
91
135
|
loop do
|
92
|
-
|
93
|
-
if @@ctx.nil? or @@ctx.running
|
136
|
+
msg = @@queue.pop(true) rescue nil
|
137
|
+
if msg and ( @@ctx.nil? or @@ctx.running )
|
94
138
|
begin
|
95
|
-
emit
|
139
|
+
emit msg.create
|
96
140
|
rescue Exception => e
|
97
|
-
Logger.warn "Logger error: #{e.message}"
|
98
141
|
Logger.exception e
|
99
142
|
end
|
100
143
|
end
|
144
|
+
|
145
|
+
sleep(0.3) if msg.nil?
|
101
146
|
end
|
102
147
|
end
|
103
148
|
|
@@ -110,22 +155,6 @@ module Logger
|
|
110
155
|
f.close
|
111
156
|
end
|
112
157
|
end
|
113
|
-
|
114
|
-
# Format +message+ for the given +message_type+.
|
115
|
-
def formatted_message(message, message_type)
|
116
|
-
# raw message?
|
117
|
-
if message_type.nil?
|
118
|
-
if @@timestamp and !message.strip.empty?
|
119
|
-
"[#{Time.now}] #{message}"
|
120
|
-
else
|
121
|
-
message
|
122
|
-
end
|
123
|
-
elsif @@timestamp
|
124
|
-
"[#{Time.now}] [#{message_type}] #{message}"
|
125
|
-
else
|
126
|
-
"[#{message_type}] #{message}"
|
127
|
-
end
|
128
|
-
end
|
129
158
|
end
|
130
159
|
end
|
131
160
|
end
|