spior 0.1.6 → 0.3.5
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 +4 -4
- checksums.yaml.gz.sig +0 -0
- data/.github/workflows/rubocop-analysis.yml +47 -0
- data/.gitignore +1 -0
- data/CHANGELOG.md +21 -0
- data/Gemfile +5 -0
- data/README.md +13 -3
- data/Rakefile +20 -9
- data/bin/spior +1 -0
- data/lib/auth.rb +46 -0
- data/lib/spior/dep.rb +38 -23
- data/lib/spior/helpers.rb +22 -25
- data/lib/spior/iptables/default.rb +19 -13
- data/lib/spior/iptables/root.rb +37 -37
- data/lib/spior/iptables/rules.rb +103 -0
- data/lib/spior/iptables/tor.rb +24 -23
- data/lib/spior/iptables.rb +4 -0
- data/lib/spior/ipv6.rb +35 -0
- data/lib/spior/menu.rb +18 -24
- data/lib/spior/msg.rb +30 -8
- data/lib/spior/options.rb +20 -22
- data/lib/spior/service/enable.rb +66 -0
- data/lib/spior/service/restart.rb +5 -12
- data/lib/spior/service/start.rb +7 -17
- data/lib/spior/service/stop.rb +14 -0
- data/lib/spior/service.rb +5 -0
- data/lib/spior/status.rb +32 -24
- data/lib/spior/tor/config.rb +137 -0
- data/lib/spior/tor/data.rb +53 -0
- data/lib/spior/tor/start.rb +65 -0
- data/lib/spior/tor/stop.rb +53 -0
- data/lib/spior/tor.rb +7 -1
- data/lib/spior/version.rb +3 -1
- data/lib/spior.rb +18 -23
- data/spior.gemspec +24 -21
- data/test/test_install.rb +2 -2
- data/test/test_options.rb +2 -0
- data.tar.gz.sig +2 -2
- metadata +59 -51
- metadata.gz.sig +0 -0
- data/lib/spior/clear.rb +0 -35
- data/lib/spior/copy.rb +0 -84
- data/lib/spior/persist.rb +0 -51
- data/lib/spior/tor/info.rb +0 -96
@@ -0,0 +1,103 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'tempfile'
|
4
|
+
require 'fileutils'
|
5
|
+
require 'nomansland'
|
6
|
+
|
7
|
+
module Spior
|
8
|
+
module Iptables
|
9
|
+
# Iptables::Rules, used to save or restore iptables rules
|
10
|
+
class Rules
|
11
|
+
def initialize
|
12
|
+
@tmp_iptables_rules = Tempfile.new('iptables_rules')
|
13
|
+
@tmp_spior_rules = Tempfile.new('spior_rules')
|
14
|
+
@save_path = search_iptables_config
|
15
|
+
end
|
16
|
+
|
17
|
+
def save
|
18
|
+
save_rules(@tmp_iptables_rules)
|
19
|
+
insert_comment(@tmp_spior_rules, @tmp_iptables_rules)
|
20
|
+
create_file(@tmp_spior_rules, @save_path)
|
21
|
+
Msg.p "Iptables rules saved at #{@save_path}"
|
22
|
+
end
|
23
|
+
|
24
|
+
def restore
|
25
|
+
return if restoring_older_rules(@save_path)
|
26
|
+
|
27
|
+
Msg.p 'Adding clearnet navigation...'
|
28
|
+
Iptables::Default.new.run!
|
29
|
+
end
|
30
|
+
|
31
|
+
protected
|
32
|
+
|
33
|
+
def save_rules(tmp_file)
|
34
|
+
Msg.p 'Saving Iptables rules...'
|
35
|
+
Helpers::Exec.new('iptables-save').run("> #{tmp_file.path}")
|
36
|
+
end
|
37
|
+
|
38
|
+
def insert_comment(spior_file, iptable_file)
|
39
|
+
outfile = File.open(spior_file.path, 'w')
|
40
|
+
outfile.puts '# Rules saved by Spior.'
|
41
|
+
outfile.puts(File.read(iptable_file.path))
|
42
|
+
outfile.close
|
43
|
+
end
|
44
|
+
|
45
|
+
def search_for_comment(filename)
|
46
|
+
File.open(filename) do |f|
|
47
|
+
f.each do |line|
|
48
|
+
return true if line.match(/saved by Spior/)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
false
|
52
|
+
end
|
53
|
+
|
54
|
+
def move(src, dest)
|
55
|
+
if Process::Sys.getuid == '0'
|
56
|
+
FileUtils.mv(src, dest)
|
57
|
+
else
|
58
|
+
Helpers::Exec.new('mv').run("#{src} #{dest}")
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
def create_file(tmpfile, dest)
|
63
|
+
if File.exist? dest
|
64
|
+
if search_for_comment(dest)
|
65
|
+
Msg.p "Older Spior rules found #{dest}, erasing..."
|
66
|
+
else
|
67
|
+
Msg.p "File exist #{dest}, create backup #{dest}-backup..."
|
68
|
+
move(dest, "#{dest}-backup")
|
69
|
+
end
|
70
|
+
end
|
71
|
+
move(tmpfile.path, dest)
|
72
|
+
end
|
73
|
+
|
74
|
+
def restoring_older_rules(filename)
|
75
|
+
files = %W[#{filename}-backup #{filename}]
|
76
|
+
files.each do |f|
|
77
|
+
next unless File.exist?(f) || search_for_comment(f)
|
78
|
+
|
79
|
+
Iptables::Root.new.stop!
|
80
|
+
Msg.p "Found older rules #{f}, restoring..."
|
81
|
+
Helpers::Exec.new('iptables-restore').run(f)
|
82
|
+
return true
|
83
|
+
end
|
84
|
+
false
|
85
|
+
end
|
86
|
+
|
87
|
+
private
|
88
|
+
|
89
|
+
def search_iptables_config
|
90
|
+
case Nomansland.distro?
|
91
|
+
when :archlinux || :void
|
92
|
+
'/etc/iptables/iptables.rules'
|
93
|
+
when :debian
|
94
|
+
'/etc/iptables.up.rules'
|
95
|
+
when :gentoo
|
96
|
+
'/var/lib/iptables/rules-save'
|
97
|
+
else
|
98
|
+
Msg.report 'I don`t know where you distro save the rules for iptables yet'
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
data/lib/spior/iptables/tor.rb
CHANGED
@@ -1,58 +1,59 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Spior
|
2
4
|
module Iptables
|
5
|
+
# Make Local Redirection Through Tor.
|
3
6
|
class Tor < Iptables::Root
|
4
7
|
def initialize
|
5
8
|
super
|
6
|
-
@
|
7
|
-
@
|
8
|
-
@tables = ["nat", "filter"]
|
9
|
+
@non_tor = %W[#{@lo_addr}/8 192.168.0.0/16 172.16.0.0/12 10.0.0.0/8]
|
10
|
+
@tables = %w[nat filter]
|
9
11
|
end
|
10
12
|
|
11
13
|
private
|
12
14
|
|
13
15
|
def redirect
|
14
|
-
|
15
|
-
|
16
|
-
target =
|
16
|
+
Msg.p 'Redirecting local traffic though Tor...'
|
17
|
+
@tables.map do |table|
|
18
|
+
target = 'ACCEPT'
|
19
|
+
target = 'RETURN' if table == 'nat'
|
17
20
|
|
18
21
|
ipt "-t #{table} -F OUTPUT"
|
19
22
|
ipt "-t #{table} -A OUTPUT -m state --state ESTABLISHED -j #{target}"
|
20
|
-
ipt "-t #{table} -A OUTPUT -m owner --uid #{
|
23
|
+
ipt "-t #{table} -A OUTPUT -m owner --uid #{CONFIG.uid} -j #{target}"
|
21
24
|
|
22
|
-
match_dns_port =
|
23
|
-
if table ==
|
24
|
-
target = "REDIRECT --to-ports #{
|
25
|
-
match_dns_port =
|
25
|
+
match_dns_port = CONFIG.dns_port
|
26
|
+
if table == 'nat'
|
27
|
+
target = "REDIRECT --to-ports #{CONFIG.dns_port}"
|
28
|
+
match_dns_port = '53'
|
26
29
|
end
|
27
30
|
|
28
31
|
ipt "-t #{table} -A OUTPUT -p udp --dport #{match_dns_port} -j #{target}"
|
29
32
|
ipt "-t #{table} -A OUTPUT -p tcp --dport #{match_dns_port} -j #{target}"
|
30
33
|
|
31
|
-
target = "REDIRECT --to-ports #{
|
32
|
-
ipt "-t #{table} -A OUTPUT -d #{
|
34
|
+
target = "REDIRECT --to-ports #{CONFIG.trans_port}" if table == 'nat'
|
35
|
+
ipt "-t #{table} -A OUTPUT -d #{CONFIG.virt_addr} -p tcp -j #{target}"
|
33
36
|
|
34
|
-
target =
|
35
|
-
@non_tor.each { |ip|
|
36
|
-
ipt "-t #{table} -A OUTPUT -d #{ip} -j #{target}"
|
37
|
-
}
|
37
|
+
target = 'RETURN' if table == 'nat'
|
38
|
+
@non_tor.each { |ip| ipt "-t #{table} -A OUTPUT -d #{ip} -j #{target}" }
|
38
39
|
|
39
|
-
target = "REDIRECT --to-ports #{
|
40
|
+
target = "REDIRECT --to-ports #{CONFIG.trans_port}" if table == 'nat'
|
40
41
|
ipt "-t #{table} -A OUTPUT -p tcp -j #{target}"
|
41
|
-
|
42
|
+
end
|
42
43
|
end
|
43
44
|
|
44
45
|
def input
|
45
46
|
# SSH
|
46
|
-
ipt
|
47
|
+
ipt '-A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -j ACCEPT'
|
47
48
|
# Allow loopback
|
48
49
|
ipt "-A INPUT -i #{@lo} -j ACCEPT"
|
49
50
|
# Accept related
|
50
|
-
ipt
|
51
|
+
ipt '-A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT'
|
51
52
|
end
|
52
53
|
|
53
54
|
def all
|
54
|
-
ipt
|
55
|
-
ipt
|
55
|
+
ipt '-t filter -A OUTPUT -p udp -j REJECT'
|
56
|
+
ipt '-t filter -A OUTPUT -p icmp -j REJECT'
|
56
57
|
end
|
57
58
|
end
|
58
59
|
end
|
data/lib/spior/iptables.rb
CHANGED
@@ -1,4 +1,7 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Spior
|
4
|
+
# Interact with iptables
|
2
5
|
module Iptables
|
3
6
|
end
|
4
7
|
end
|
@@ -6,3 +9,4 @@ end
|
|
6
9
|
require_relative 'iptables/root'
|
7
10
|
require_relative 'iptables/tor'
|
8
11
|
require_relative 'iptables/default'
|
12
|
+
require_relative 'iptables/rules'
|
data/lib/spior/ipv6.rb
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
# lib/ipv6.rb
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require 'auth'
|
5
|
+
|
6
|
+
module Spior
|
7
|
+
# Block or Allow ipv6 traffic with sysctl
|
8
|
+
class Ipv6
|
9
|
+
def initialize
|
10
|
+
@changed = false
|
11
|
+
end
|
12
|
+
|
13
|
+
def allow
|
14
|
+
apply_option('net.ipv6.conf.all.disable_ipv6', '0')
|
15
|
+
apply_option('net.ipv6.conf.default.disable_ipv6', '0')
|
16
|
+
Msg.p 'ipv6 allowed' if @changed
|
17
|
+
end
|
18
|
+
|
19
|
+
def block
|
20
|
+
apply_option('net.ipv6.conf.all.disable_ipv6', '1')
|
21
|
+
apply_option('net.ipv6.conf.default.disable_ipv6', '1')
|
22
|
+
Msg.p 'ipv6 blocked' if @changed
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
def apply_option(flag, value)
|
28
|
+
flag_path = flag.gsub('.', '/')
|
29
|
+
return unless File.exist?("/proc/sys/#{flag_path}")
|
30
|
+
|
31
|
+
Auth.new.sysctl(flag, value)
|
32
|
+
@changed = true
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
data/lib/spior/menu.rb
CHANGED
@@ -1,43 +1,37 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Spior
|
4
|
+
# Build an interactive menu for spior
|
2
5
|
module Menu
|
3
|
-
|
4
|
-
|
5
|
-
def run
|
6
|
-
banner
|
6
|
+
def self.run
|
7
7
|
loop do
|
8
8
|
Msg.head
|
9
|
-
puts
|
9
|
+
puts 'Please select an option:
|
10
10
|
|
11
|
-
1. Redirect traffic through
|
12
|
-
2. Reload
|
13
|
-
3.
|
14
|
-
4. Check info on your current
|
15
|
-
5.
|
11
|
+
1. Redirect traffic through Tor
|
12
|
+
2. Reload Spior and change your IP
|
13
|
+
3. Stop Tor and use a clearnet navigation
|
14
|
+
4. Check info on your current IP
|
15
|
+
5. Install all the dependencies
|
16
|
+
6. Quit'
|
16
17
|
|
17
18
|
puts
|
18
|
-
print
|
19
|
+
print '>> '
|
19
20
|
case gets.chomp
|
20
21
|
when '1'
|
21
|
-
|
22
|
+
Service.start
|
22
23
|
when '2'
|
23
|
-
|
24
|
+
Service.restart
|
24
25
|
when '3'
|
25
|
-
|
26
|
+
Service.stop
|
26
27
|
when '4'
|
27
|
-
|
28
|
+
Status.info
|
28
29
|
when '5'
|
30
|
+
Dep.looking
|
31
|
+
else
|
29
32
|
exit
|
30
33
|
end
|
31
34
|
end
|
32
35
|
end
|
33
|
-
|
34
|
-
private
|
35
|
-
|
36
|
-
def banner
|
37
|
-
puts "┏━┓┏━┓╻┏━┓┏━┓"
|
38
|
-
puts "┗━┓┣━┛┃┃ ┃┣┳┛"
|
39
|
-
puts "┗━┛╹ ╹┗━┛╹┗╸"
|
40
|
-
# generated with toilet -F crop -f future spior
|
41
|
-
end
|
42
36
|
end
|
43
37
|
end
|
data/lib/spior/msg.rb
CHANGED
@@ -1,28 +1,50 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'rainbow'
|
2
4
|
|
5
|
+
# Used to display various message
|
3
6
|
module Msg
|
4
|
-
|
7
|
+
module_function
|
8
|
+
|
9
|
+
def banner
|
10
|
+
puts
|
11
|
+
puts '┏━┓┏━┓╻┏━┓┏━┓'
|
12
|
+
puts '┗━┓┣━┛┃┃ ┃┣┳┛'
|
13
|
+
puts '┗━┛╹ ╹┗━┛╹┗╸'
|
14
|
+
puts
|
15
|
+
# generated with toilet -F crop -f future spior
|
16
|
+
end
|
5
17
|
|
6
18
|
def head
|
7
|
-
puts Rainbow(
|
19
|
+
puts Rainbow('------------------------------------------------').cyan
|
8
20
|
end
|
9
21
|
|
10
22
|
def p(text)
|
11
|
-
|
23
|
+
opn = Rainbow('[').cyan
|
24
|
+
msg = Rainbow('+').white
|
25
|
+
cls = Rainbow(']').cyan
|
26
|
+
puts "#{opn}#{msg}#{cls} #{text}"
|
12
27
|
end
|
13
28
|
|
14
29
|
def err(text)
|
15
|
-
|
30
|
+
opn = Rainbow('[').red
|
31
|
+
msg = Rainbow('-').white
|
32
|
+
cls = Rainbow(']').red
|
33
|
+
puts "#{opn}#{msg}#{cls} #{text}"
|
16
34
|
end
|
17
35
|
|
18
36
|
def info(text)
|
19
|
-
|
37
|
+
one = Rainbow('_').blue
|
38
|
+
two = Rainbow('-').white
|
39
|
+
thr = Rainbow('_').blue
|
40
|
+
puts "#{one}#{two}#{thr} #{text} #{one}#{two}#{thr}"
|
20
41
|
end
|
21
42
|
|
22
43
|
def report(text)
|
23
|
-
puts
|
44
|
+
puts
|
24
45
|
info text
|
25
|
-
puts
|
26
|
-
puts
|
46
|
+
puts 'Please, report this issue at https://github.com/szorfein/spior/issues'
|
47
|
+
puts
|
48
|
+
exit 1
|
27
49
|
end
|
28
50
|
end
|
data/lib/spior/options.rb
CHANGED
@@ -1,13 +1,11 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'optparse'
|
2
4
|
|
3
5
|
module Spior
|
6
|
+
# Options for the CLI
|
4
7
|
class Options
|
5
|
-
attr_reader :install , :tor , :persist
|
6
|
-
|
7
8
|
def initialize(argv)
|
8
|
-
@install = false
|
9
|
-
@tor = false
|
10
|
-
@persist = false
|
11
9
|
parse(argv)
|
12
10
|
end
|
13
11
|
|
@@ -15,46 +13,46 @@ module Spior
|
|
15
13
|
|
16
14
|
def parse(argv)
|
17
15
|
OptionParser.new do |opts|
|
18
|
-
opts.on(
|
19
|
-
|
16
|
+
opts.on('-i', '--install', 'Install the dependencies.') do
|
17
|
+
Dep.looking
|
20
18
|
end
|
21
19
|
|
22
|
-
opts.on(
|
23
|
-
|
20
|
+
opts.on('-t', '--tor', 'Redirect traffic through TOR.') do
|
21
|
+
Service.start
|
24
22
|
end
|
25
23
|
|
26
|
-
opts.on(
|
27
|
-
|
24
|
+
opts.on('-r', '--reload', 'Reload TOR to change your IP.') do
|
25
|
+
Service.restart
|
28
26
|
exit
|
29
27
|
end
|
30
28
|
|
31
|
-
opts.on(
|
32
|
-
|
29
|
+
opts.on('-c', '--clearnet', 'Reset iptables and return to clearnet navigation.') do
|
30
|
+
Service.stop
|
33
31
|
end
|
34
32
|
|
35
|
-
opts.on(
|
36
|
-
|
33
|
+
opts.on('-s', '--status', 'Look infos about your current IP.') do
|
34
|
+
Status.info
|
37
35
|
exit
|
38
36
|
end
|
39
37
|
|
40
|
-
opts.on(
|
41
|
-
|
38
|
+
opts.on('-p', '--persist', 'Active Spior at every boot.') do
|
39
|
+
Service::Enable.new
|
42
40
|
end
|
43
41
|
|
44
|
-
opts.on(
|
45
|
-
|
42
|
+
opts.on('-m', '--menu', 'Display an interactive menu.') do
|
43
|
+
Menu.run
|
46
44
|
end
|
47
45
|
|
48
|
-
opts.on(
|
46
|
+
opts.on('-h', '--help', 'Show this message.') do
|
49
47
|
puts opts
|
50
48
|
exit
|
51
49
|
end
|
52
50
|
|
53
51
|
begin
|
54
|
-
argv = [
|
52
|
+
argv = ['-m'] if argv.empty?
|
55
53
|
opts.parse!(argv)
|
56
54
|
rescue OptionParser::ParseError => e
|
57
|
-
|
55
|
+
warn e.message, "\n", opts
|
58
56
|
exit(-1)
|
59
57
|
end
|
60
58
|
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'nomansland'
|
4
|
+
|
5
|
+
module Spior
|
6
|
+
# Service make Spior persistent using services on system like iptables and tor
|
7
|
+
module Service
|
8
|
+
# Enable the Tor redirection when you boot your system
|
9
|
+
#
|
10
|
+
# It should use and enable the services:
|
11
|
+
# + tor
|
12
|
+
# + iptables
|
13
|
+
class Enable
|
14
|
+
def initialize
|
15
|
+
case Nomansland.distro?
|
16
|
+
when :gentoo
|
17
|
+
for_gentoo
|
18
|
+
when :archlinux
|
19
|
+
for_arch
|
20
|
+
else
|
21
|
+
Msg.report 'Your distro is not yet supported.'
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
protected
|
26
|
+
|
27
|
+
def for_gentoo
|
28
|
+
Iptables::Rules.new.save
|
29
|
+
case Nomansland.init?
|
30
|
+
when :systemd
|
31
|
+
systemd_enable('iptables-restore', 'tor')
|
32
|
+
when :openrc
|
33
|
+
rc_upd = Helpers::Exec.new('rc-update')
|
34
|
+
rc_upd.run('rc-update add iptables boot')
|
35
|
+
rc_upd.run('rc-update add tor')
|
36
|
+
rc_upd.run('rc-update add tor default')
|
37
|
+
else
|
38
|
+
Msg.report 'Init no yet supported for start Iptables at boot'
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def for_arch
|
43
|
+
Iptables::Rules.new.save
|
44
|
+
Tor::Config.new(Tempfile.new('torrc')).backup
|
45
|
+
systemd_enable('iptables', 'tor')
|
46
|
+
Msg.p 'Services enabled for Archlinux...'
|
47
|
+
end
|
48
|
+
|
49
|
+
private
|
50
|
+
|
51
|
+
def systemd_enable(*services)
|
52
|
+
systemctl = Helpers::Exec.new('systemctl')
|
53
|
+
services.each do |s|
|
54
|
+
Msg.p "Search for service #{s}..."
|
55
|
+
systemctl.run("enable #{s}") unless system("systemctl is-enabled #{s}")
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def systemd_start(service)
|
60
|
+
systemctl = Helpers::Exec.new('systemctl')
|
61
|
+
Msg.p "Search for service #{service}..."
|
62
|
+
systemctl.run("start #{service}") unless system("systemctl is-active #{service}")
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
@@ -1,21 +1,14 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module Spior
|
4
|
+
# Interact with Spior::Tor and Spior::Iptables
|
4
5
|
module Service
|
5
6
|
module_function
|
6
7
|
|
7
8
|
def restart
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
elsif TTY::Which.exist? 'sv'
|
12
|
-
Helpers::Exec.new('sv').run('restart tor')
|
13
|
-
Msg.p 'ip changed.'
|
14
|
-
elsif File.exist? '/etc/init.d/tor'
|
15
|
-
Helpers::Exec.new('/etc/init.d/tor').run('restart')
|
16
|
-
else
|
17
|
-
Msg.report "Don't known yet how to restart Tor for your system."
|
18
|
-
end
|
9
|
+
Service.stop(clean: false)
|
10
|
+
Service.start
|
11
|
+
Msg.p 'ip changed.'
|
19
12
|
end
|
20
13
|
end
|
21
14
|
end
|
data/lib/spior/service/start.rb
CHANGED
@@ -1,26 +1,16 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module Spior
|
4
|
+
# Interact with Spior::Tor and Spior::Iptables
|
4
5
|
module Service
|
5
6
|
module_function
|
6
7
|
|
8
|
+
# Service.start should start Tor if not alrealy running
|
9
|
+
# And start to redirect the local traffic with Iptables
|
7
10
|
def start
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
Helpers::Exec.new("systemctl").run("start tor")
|
12
|
-
Msg.p "TOR started."
|
13
|
-
end
|
14
|
-
elsif TTY::Which.exist? 'sv'
|
15
|
-
unless File.exist? '/var/service/tor'
|
16
|
-
Helpers::Exec.new('ln').run('-s /etc/sv/tor /var/service/tor')
|
17
|
-
Msg.p "TOR started."
|
18
|
-
end
|
19
|
-
elsif File.exist? '/etc/init.d/tor'
|
20
|
-
Helpers::Exec.new('/etc/init.d/tor').run('start')
|
21
|
-
else
|
22
|
-
Msg.report "Don't known yet how to start Tor for your system."
|
23
|
-
end
|
11
|
+
Tor::Start.new
|
12
|
+
Iptables::Tor.new.run!
|
13
|
+
Ipv6.new.block
|
24
14
|
end
|
25
15
|
end
|
26
16
|
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Spior
|
4
|
+
# Interact with Spior::Tor and Spior::Iptables
|
5
|
+
module Service
|
6
|
+
module_function
|
7
|
+
|
8
|
+
def stop(clean: true)
|
9
|
+
Tor::Stop.new
|
10
|
+
Iptables::Rules.new.restore if clean
|
11
|
+
Ipv6.new.allow if clean
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
data/lib/spior/service.rb
CHANGED
@@ -1,7 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Spior
|
4
|
+
# Service should start/stop/restart Tor and Iptable.
|
2
5
|
module Service
|
3
6
|
end
|
4
7
|
end
|
5
8
|
|
6
9
|
require_relative 'service/start'
|
10
|
+
require_relative 'service/stop'
|
7
11
|
require_relative 'service/restart'
|
12
|
+
require_relative 'service/enable'
|
data/lib/spior/status.rb
CHANGED
@@ -1,38 +1,46 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'open-uri'
|
2
4
|
require 'json'
|
3
5
|
|
4
6
|
module Spior
|
7
|
+
# Status display information on your current IP addresse
|
8
|
+
#
|
9
|
+
# If you use an IPV6 address, it should fail to display a Tor IP...
|
5
10
|
module Status
|
11
|
+
# Check on https://check.torproject.org/api/ip if Tor is enable or not
|
12
|
+
# and display the result.
|
6
13
|
def self.enable
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
hash = JSON.parse l.read
|
12
|
-
status = "Enable" if hash["IsTor"] == true
|
13
|
-
end
|
14
|
-
status
|
15
|
-
rescue OpenURI::HTTPError => error
|
16
|
-
res = error.io
|
17
|
-
puts "Fail to join server #{res.status}"
|
14
|
+
status = 'Disable'
|
15
|
+
URI.open('https://check.torproject.org/api/ip') do |l|
|
16
|
+
hash = JSON.parse l.read
|
17
|
+
status = 'Enable' if hash['IsTor'] == true
|
18
18
|
end
|
19
|
+
status
|
20
|
+
rescue OpenURI::HTTPError => e
|
21
|
+
res = e.io
|
22
|
+
puts "Fail to join server #{res.status}"
|
19
23
|
end
|
20
24
|
|
25
|
+
# info check and display information from https://ipleak.net/json
|
26
|
+
#
|
27
|
+
# Check for:
|
28
|
+
# * +ip+
|
29
|
+
# * +continent_name+
|
30
|
+
# * +time_zone+
|
31
|
+
#
|
32
|
+
# We can add later info on City/Region or other things.
|
21
33
|
def self.info
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
puts " Current ip ===> #{hash["ip"]}"
|
28
|
-
puts " Continent ===> #{hash["continent_name"]}"
|
29
|
-
puts " Timezone ===> #{hash["time_zone"]}"
|
30
|
-
end
|
31
|
-
puts " Status ===> #{enable}"
|
32
|
-
rescue OpenURI::HTTPError => error
|
33
|
-
res = error.io
|
34
|
-
puts "Fail to join server #{res.status}"
|
34
|
+
URI.open('https://ipleak.net/json') do |l|
|
35
|
+
hash = JSON.parse l.read
|
36
|
+
puts " Current ip ===> #{hash['ip']}"
|
37
|
+
puts " Continent ===> #{hash['continent_name']}"
|
38
|
+
puts " Timezone ===> #{hash['time_zone']}"
|
35
39
|
end
|
40
|
+
puts " Status ===> #{enable}"
|
41
|
+
rescue OpenURI::HTTPError => e
|
42
|
+
res = e.io
|
43
|
+
puts "Fail to join server #{res.status}"
|
36
44
|
end
|
37
45
|
end
|
38
46
|
end
|