tarbit 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 5fdb81b5d9d98958d081c9fb3fdc25ec216bd0b9b8d1ceb1284eb3e898482d9a
4
+ data.tar.gz: 5ca27088bb0c658716d09edb4236227f2ef298654eb9c166b86ec4261ffb8462
5
+ SHA512:
6
+ metadata.gz: b47d842599e19cedeb839f73ae732d85bd9059cba24dae157651ca8dd4ca802154849086b2d62b37c8a726091b95481fca1828d71fd825dc0df021a753ae2509
7
+ data.tar.gz: 02632a2259b571ced4bccf13c6d051ea83e3e9381252a1d2025ccfc1301e818bf92ec3f7a7b1693737bcb14147e6f11381a3bf092678be13a4cfe3907ea27a0a
data/.gitignore ADDED
@@ -0,0 +1,3 @@
1
+ .idea/
2
+ .DS_Store
3
+ data/*.png
data/Gemfile ADDED
@@ -0,0 +1,5 @@
1
+ source 'https://rubygems.org'
2
+
3
+ ruby "2.6.5"
4
+
5
+ gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,38 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ tarbit (1.0.0)
5
+ async-io
6
+ commander
7
+ gruff
8
+
9
+ GEM
10
+ remote: https://rubygems.org/
11
+ specs:
12
+ async (1.24.2)
13
+ console (~> 1.0)
14
+ nio4r (~> 2.3)
15
+ timers (~> 4.1)
16
+ async-io (1.27.3)
17
+ async (~> 1.14)
18
+ commander (4.5.0)
19
+ highline (~> 2.0.0)
20
+ console (1.8.1)
21
+ gruff (0.7.0)
22
+ rmagick (~> 2.13, >= 2.13.4)
23
+ highline (2.0.3)
24
+ nio4r (2.5.2)
25
+ rmagick (2.16.0)
26
+ timers (4.3.0)
27
+
28
+ PLATFORMS
29
+ ruby
30
+
31
+ DEPENDENCIES
32
+ tarbit!
33
+
34
+ RUBY VERSION
35
+ ruby 2.6.5p114
36
+
37
+ BUNDLED WITH
38
+ 1.17.3
data/bin/tarbit ADDED
@@ -0,0 +1,28 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'commander/import'
4
+ require 'tarbit'
5
+
6
+ # :name is optional, otherwise uses the basename of this executable
7
+ program :name, 'Tarbit - SSH Tarpit using Ruby'
8
+ program :version, Tarbit::VERSION
9
+ program :description, 'Stupid command that prints foo or bar.'
10
+
11
+ command :serve do |c|
12
+ c.syntax = 'apollo serve [options]'
13
+ c.description = 'Runs the apollo server'
14
+ c.option '--debug', nil, 'Runs the apollo server in debug mode'
15
+ c.option '--suffix STRING', String, 'Adds a suffix to bar'
16
+ c.action do |args, options|
17
+ puts "Starting tarbit ssh tarpit"
18
+
19
+ server = Tarbit::Server.new
20
+ statistic = Tarbit::Statistic.new(server, 10)
21
+
22
+ Async do |task|
23
+ statistic.watch
24
+ server.run
25
+ end
26
+
27
+ end
28
+ end
@@ -0,0 +1,51 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'async/io'
4
+ require 'async/io/stream'
5
+ require 'async/reactor'
6
+ require 'async/io/host_endpoint'
7
+ require 'async/io/protocol/line'
8
+ require 'securerandom'
9
+
10
+ module Tarbit
11
+ class Server
12
+ attr_reader :connections
13
+
14
+ def initialize
15
+ @connections = []
16
+ end
17
+
18
+ def run
19
+ endpoint = Async::IO::Endpoint.parse("tcp://localhost:1025")
20
+
21
+ Async do |task|
22
+ while true
23
+ task.sleep 1
24
+ Async.logger.info "Connection count: #{@connections.size}"
25
+ end
26
+ end
27
+
28
+ Async do |task|
29
+ endpoint.accept do |peer|
30
+ stream = Async::IO::Stream.new(peer)
31
+ Async.logger.info "New connection: #{stream}"
32
+
33
+ @connections << {
34
+ created_at: Date.new,
35
+ id: SecureRandom.uuid
36
+ }
37
+
38
+ while true do
39
+ task.sleep 1
40
+ stream.write "#{rand(10)}\r\n"
41
+ end
42
+ rescue Async::TimeoutError => e
43
+ @connections.delete stream
44
+ Async.logger.info "Connection closed: #{stream}"
45
+ end
46
+ end
47
+ end
48
+
49
+ end
50
+
51
+ end
@@ -0,0 +1,45 @@
1
+ require 'gruff'
2
+ require 'async'
3
+
4
+ module Tarbit
5
+ class Statistic
6
+
7
+ def initialize(server, interval)
8
+ @server = server
9
+ @interval = interval
10
+ @history = []
11
+ end
12
+
13
+ def watch
14
+ Async do |task|
15
+ while true
16
+ task.sleep @interval
17
+ write_line_chart
18
+ end
19
+ end
20
+ end
21
+
22
+ private
23
+
24
+ def write_line_chart
25
+
26
+ # Add point in time
27
+ @history << {
28
+ created_at: Date.new.strftime("%B %d, %Y"),
29
+ connections: @server.connections.clone # Cloning instead of referencing
30
+ }
31
+
32
+ g = Gruff::Line.new
33
+ g.title = 'History of connections over time'
34
+
35
+ labels = {}
36
+ @history.each_with_index{ |item, index| labels[index] = item.fetch(:created_at) }
37
+ g.labels = labels
38
+
39
+ g.data :Bots, @history.map {|point_in_time| point_in_time.fetch(:connections).size }
40
+
41
+ g.write('data/exciting.png')
42
+ end
43
+
44
+ end
45
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Tarbit
4
+ VERSION = "1.0.0"
5
+ end
data/lib/tarbit.rb ADDED
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+ #
3
+
4
+ require 'async/reactor'
5
+ require_relative 'tarbit/server'
6
+ require_relative 'tarbit/statistic'
7
+
8
+ Signal.trap "SIGINT" do
9
+ exit(0)
10
+ end
11
+
12
+ module Tarbit; end
data/tarbit.gemspec ADDED
@@ -0,0 +1,30 @@
1
+ lib = File.expand_path("lib", __dir__)
2
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
+ require "tarbit/version"
4
+
5
+ Gem::Specification.new do |s|
6
+
7
+ s.name = 'tarbit'
8
+ s.version = Tarbit::VERSION
9
+
10
+ s.summary = "Summary"
11
+ s.description = "Description"
12
+
13
+ s.authors = ['Niklas Hanft']
14
+ s.email = 'hello@niklashanft.com'
15
+ s.homepage = 'https://github.com/nhh/apollo'
16
+ s.license = 'ISC'
17
+
18
+ s.files = `git ls-files`.split("\n")
19
+ s.executables << 'tarbit'
20
+ s.required_ruby_version = '~> 2.5'
21
+ s.require_path = 'lib'
22
+
23
+ # Dependencies
24
+ s.add_dependency 'async-io'
25
+ s.add_dependency 'commander'
26
+ s.add_dependency 'gruff'
27
+
28
+ # Development Dependencies
29
+
30
+ end
metadata ADDED
@@ -0,0 +1,94 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: tarbit
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Niklas Hanft
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2020-02-26 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: async-io
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: commander
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: gruff
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ description: Description
56
+ email: hello@niklashanft.com
57
+ executables:
58
+ - tarbit
59
+ extensions: []
60
+ extra_rdoc_files: []
61
+ files:
62
+ - ".gitignore"
63
+ - Gemfile
64
+ - Gemfile.lock
65
+ - bin/tarbit
66
+ - lib/tarbit.rb
67
+ - lib/tarbit/server.rb
68
+ - lib/tarbit/statistic.rb
69
+ - lib/tarbit/version.rb
70
+ - tarbit.gemspec
71
+ homepage: https://github.com/nhh/apollo
72
+ licenses:
73
+ - ISC
74
+ metadata: {}
75
+ post_install_message:
76
+ rdoc_options: []
77
+ require_paths:
78
+ - lib
79
+ required_ruby_version: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - "~>"
82
+ - !ruby/object:Gem::Version
83
+ version: '2.5'
84
+ required_rubygems_version: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - ">="
87
+ - !ruby/object:Gem::Version
88
+ version: '0'
89
+ requirements: []
90
+ rubygems_version: 3.0.6
91
+ signing_key:
92
+ specification_version: 4
93
+ summary: Summary
94
+ test_files: []