spior 0.3.6 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 07b4daf3d6c06b689e2d584b43e419eb4e9e9ea8e19c4bf71c3116428955f957
4
- data.tar.gz: '08699ad87b9abc01147df75938c744268e33d313955bb046b736ad674f93820e'
3
+ metadata.gz: 35ecc00833e5ba627984058a35375d1773ebdb707fb9218bb5060029d91a08a8
4
+ data.tar.gz: d688befe355c53c3af9bdf110144f3d91f9a9f2c254b6a5b0ea995f8beec85ab
5
5
  SHA512:
6
- metadata.gz: 92014306180514cf8b3f9bea57544054fc961127161a6ca8e067a7baeaec256fc365ca8c6e58fe4f88bfeb7f01c24b85350d7ac031dd44e4532b7c8c5ddbc497
7
- data.tar.gz: 2971e056165009f5ef1dda7dcbc5e282ba1769076ffc99d439e3b8741a44d1aeb01197087b628e3f6103b1d23cfbb1861bfa27d1c843c52a5bb0e84caeba03f2
6
+ metadata.gz: df077eb2f83b2b084a2a78378fe1f46d5b8f47fc9482a60e980250fed407e4e662d9c14abe9e8880a3fb0307ad40e1be9e465a4e0ba9bf70bca082ce7b150401
7
+ data.tar.gz: 703939ff956cf9601aa367be2e28c987e63b3a8e5560318e7c16eb02ce5d956604a96b71270454d1d9de36fa7f26ade4ac463a2ab7ca0a67e644a6e57cafb41d
checksums.yaml.gz.sig CHANGED
Binary file
@@ -0,0 +1,48 @@
1
+ name: Ruby Gem
2
+
3
+ on:
4
+ push:
5
+ branches: [ "master" ]
6
+ pull_request:
7
+ branches: [ "master" ]
8
+
9
+ jobs:
10
+ build:
11
+ name: Build + Publish
12
+ runs-on: ubuntu-latest
13
+ permissions:
14
+ contents: read
15
+ packages: write
16
+
17
+ steps:
18
+ - uses: actions/checkout@v4
19
+ - name: Set up Ruby 2.6
20
+ # To automatically get bug fixes and new Ruby versions for ruby/setup-ruby,
21
+ # change this to (see https://github.com/ruby/setup-ruby#versioning):
22
+ # uses: ruby/setup-ruby@v1
23
+ uses: ruby/setup-ruby@55283cc23133118229fd3f97f9336ee23a179fcf # v1.146.0
24
+ with:
25
+ ruby-version: 2.6.10
26
+
27
+ - name: Publish to GPR
28
+ run: |
29
+ mkdir -p $HOME/.gem
30
+ touch $HOME/.gem/credentials
31
+ chmod 0600 $HOME/.gem/credentials
32
+ printf -- "---\n:github: ${GEM_HOST_API_KEY}\n" > $HOME/.gem/credentials
33
+ gem build *.gemspec
34
+ gem push --KEY github --host https://rubygems.pkg.github.com/${OWNER} *.gem
35
+ env:
36
+ GEM_HOST_API_KEY: "Bearer ${{secrets.GITHUB_TOKEN}}"
37
+ OWNER: ${{ github.repository_owner }}
38
+
39
+ # - name: Publish to RubyGems
40
+ # run: |
41
+ # mkdir -p $HOME/.gem
42
+ # touch $HOME/.gem/credentials
43
+ # chmod 0600 $HOME/.gem/credentials
44
+ # printf -- "---\n:rubygems_api_key: ${GEM_HOST_API_KEY}\n" > $HOME/.gem/credentials
45
+ # gem build *.gemspec
46
+ # gem push *.gem
47
+ # env:
48
+ # GEM_HOST_API_KEY: "${{secrets.RUBYGEMS_AUTH_TOKEN}}"
data/CHANGELOG.md CHANGED
@@ -1,3 +1,18 @@
1
+ ## 0.5.0, release 2024-10
2
+ * Correct runtime with openrc on Gentoo
3
+ * Remove a lots of old codes.
4
+ * Correct `root`, `doas` or `sudo` detection.
5
+ * For Debian, enable iptables-legacy instead of nftables, see
6
+ https://wiki.debian.org/iptables (you need to use `spior -i`).
7
+ * Persist Mode on Debian add a script under /etc/network/if-pre-up.d/iptables
8
+ like in the doc.
9
+
10
+ ## 0.3.7, release 2023-10-27
11
+ * Persist mode may require manual intervention to work, look the [readme](https://github.com/szorfein/spior/tree/master#left-over)
12
+ * Persist and runtime corrected on Voidlinux.
13
+ * Spior check the presence of 'simple_firewall.rules' when you use the --clearnet
14
+ * Create a `/etc/sysctl.d/40-ipv6.conf` with the persist mode in order to block ipv6 at boot.
15
+
1
16
  ## 0.3.5, release 2023-10-26
2
17
  * Better code style, only 11 alerts from rubocop.
3
18
  * spior -t also block ipv6 traffic, no need to reboot.
data/README.md CHANGED
@@ -4,13 +4,12 @@
4
4
  <br/>
5
5
 
6
6
  [![Gem Version](https://badge.fury.io/rb/spior.svg)](https://badge.fury.io/rb/spior)
7
- ![GitHub Workflow Status (branch)](https://img.shields.io/github/workflow/status/szorfein/spior/Rubocop/develop)
7
+ ![GitHub Workflow Status (branch)](https://img.shields.io/github/workflow/status/szorfein/spior/Rubocop/devel)
8
8
  [![Ruby Style Guide](https://img.shields.io/badge/code_style-rubocop-brightgreen.svg)](https://github.com/rubocop/rubocop)
9
9
  ![GitHub](https://img.shields.io/github/license/szorfein/spior)
10
10
 
11
11
  </div>
12
12
 
13
-
14
13
  (Spider|Tor) A tool to redirect all your local traffic to the [Tor](https://www.torproject.org/) network.
15
14
 
16
15
  ## Install
@@ -31,6 +30,20 @@ Spior use `iptables` and `tor`, which can be installed with (if your distro is s
31
30
 
32
31
  $ spior --install
33
32
 
33
+ ## Configuration
34
+ Spior look the /etc/tor/torrc for any of:
35
+
36
+ ```conf
37
+ DNSPort 9061
38
+ TransPort 9040
39
+ VirtualAddrNetworkIpv4 10.192.0.0/10
40
+ ```
41
+
42
+ You can customize any of theses variables.
43
+
44
+ When using `spior -c | --clearnet`, if you want Spior load custom iptables rules, place
45
+ them at `/etc/iptables/simple_firewall.rules`.
46
+
34
47
  ## Usage
35
48
 
36
49
  $ spior -h
@@ -54,11 +67,22 @@ Return to clearnet navigation
54
67
 
55
68
  ## Left Over
56
69
 
70
+ ### [Check for Leak](https://github.com/brainfucksec/kalitorify#checking-for-leaks)
71
+ ### Troubleshoooting
72
+ When you enable the `--persist` mode, Spior try to block ipv6 with sysctl. It can fail on some system, so you may need to manually disable ipv6 via kernel argument.
73
+ An exemple with GRUB, edit `/etc/default/grub.cfg` and change the line bellow:
74
+
75
+ ```
76
+ GRUB_CMDLINE_LINUX_DEFAULT="ipv6.disable=1 quiet"
77
+ ```
78
+
79
+ Reload grub after that `grub-mkconfig -o /boot/grub/grub.cfg`
80
+
57
81
  ### Issues
58
82
  For any questions, comments, feedback or issues, submit a [new issue](https://github.com/szorfein/spior/issues/new).
59
83
 
60
84
  ### links
61
- + https://rubyreferences.github.io/rubyref
62
- + https://rubystyle.guide/
63
85
  + https://gitlab.torproject.org/legacy/trac/-/wikis/doc/TransparentProxy
64
- + https://github.com/epidemics-scepticism/writing/blob/master/misconception.md
86
+ + https://github.com/epidemics-scepticism/writing/blob/master/misconception.md
87
+ + [in perl - Nipe](https://github.com/htrgouvea/nipe)
88
+ + [in bash - Kalitorify](https://github.com/brainfucksec/kalitorify)
data/bin/spior CHANGED
@@ -2,5 +2,45 @@
2
2
  # frozen_string_literal: true
3
3
 
4
4
  require 'spior'
5
+ require 'optparse'
5
6
 
6
- Spior::Main.new(ARGV)
7
+ Msg.banner
8
+
9
+ OptionParser.new do |opts|
10
+ opts.on('-i', '--install', 'Install the dependencies.') do
11
+ Spior::Dep.looking
12
+ end
13
+
14
+ opts.on('-t', '--tor', 'Redirect traffic through TOR.') do
15
+ Spior::Service.start
16
+ end
17
+
18
+ opts.on('-r', '--reload', 'Reload TOR to change your IP.') do
19
+ Spior::Service.restart
20
+ exit
21
+ end
22
+
23
+ opts.on('-c', '--clearnet', 'Reset iptables and return to clearnet navigation.') do
24
+ Spior::Service.stop
25
+ end
26
+
27
+ opts.on('-s', '--status', 'Look infos about your current IP.') do
28
+ Spior::Status.info
29
+ exit
30
+ end
31
+
32
+ opts.on('-p', '--persist', 'Active Spior at every boot.') do
33
+ Spior::Service::Enable.new
34
+ end
35
+
36
+ opts.on('-m', '--menu', 'Display an interactive menu.') do
37
+ Spior::Menu.run
38
+ end
39
+
40
+ begin
41
+ opts.parse!(['-m']) if ARGV.empty?
42
+ rescue OptionParser::ParseError => e
43
+ warn e.message, "\n", opts
44
+ exit(-1)
45
+ end
46
+ end.parse!
data/lib/auth.rb CHANGED
@@ -10,7 +10,7 @@ class Auth
10
10
  end
11
11
 
12
12
  def mkdir(path)
13
- return if File.exist?(path)
13
+ return if Dir.exist?(path)
14
14
 
15
15
  x("mkdir -p #{path}")
16
16
  end
@@ -21,6 +21,12 @@ class Auth
21
21
  x("sysctl -w #{flag}=#{value}")
22
22
  end
23
23
 
24
+ def write(content, file)
25
+ temp = Tempfile.new
26
+ File.write(temp.path, "#{content}\n")
27
+ x("cp #{temp.path} #{file}")
28
+ end
29
+
24
30
  protected
25
31
 
26
32
  def search_app
data/lib/spior/dep.rb CHANGED
@@ -11,42 +11,44 @@ module Spior
11
11
  def looking
12
12
  case Nomansland.distro?
13
13
  when :archlinux
14
- installing_deps('Arch', %w[iptables tor])
14
+ installing_deps('pacman -S', %w[iptables tor])
15
15
  when :debian
16
- installing_deps('Debian', %w[iptables tor])
16
+ installing_deps('apt-get install', %w[iptables tor])
17
+ use_iptables
17
18
  when :gentoo
18
- installing_deps('Gentoo', %w[iptables tor])
19
+ installing_deps('emerge -av', %w[iptables tor])
19
20
  when :void
20
- installing_deps('Void', %w[iptables tor])
21
+ installing_deps('xbps-install -S', %w[iptables tor])
22
+ when :fedora
23
+ installing_deps('dnf install -y', %w[iptables tor])
24
+ when :suse
25
+ installing_deps('zypper install -y', %w[iptables tor])
21
26
  else
22
27
  Msg.report 'Install for your distro is not yet supported.'
23
28
  end
24
29
  end
25
30
 
26
- def installing_deps(distro, names)
31
+ def installing_deps(distro_cmd, names)
27
32
  names.map do |n|
28
- Msg.p "Search #{n} for #{distro}..."
29
- install(n) unless search_dep(n)
33
+ Msg.p "Search #{n}..."
34
+ install(distro_cmd, n) unless search_dep(n)
30
35
  end
31
36
  end
32
37
 
33
- def install(name)
34
- case Nomansland.installer?
35
- when :apt_get
36
- Helpers::Exec.new('apt-get').run("install #{name}")
37
- when :emerge
38
- Helpers::Exec.new('emerge').run("-av #{name}")
39
- when :pacman
40
- Helpers::Exec.new('pacman').run("-S #{name}")
41
- when :void
42
- Helpers::Exec.new('xbps-install').run("-y #{name}")
43
- when :yum
44
- Helpers::Exec.new('yum').run("install #{name}")
45
- end
38
+ def install(cmd, package)
39
+ Helpers.cmd("#{cmd} #{package}")
46
40
  end
47
41
 
48
42
  def search_dep(name)
49
43
  TTY::Which.exist?(name) ? true : false
50
44
  end
45
+
46
+ # https://wiki.debian.org/iptables
47
+ def use_iptables
48
+ Helpers.cmd('update-alternatives --set iptables /usr/sbin/iptables-legacy')
49
+ Helpers.cmd('update-alternatives --set ip6tables /usr/sbin/ip6tables-legacy')
50
+ Helpers.cmd('update-alternatives --set arptables /usr/sbin/arptables-legacy')
51
+ Helpers.cmd('update-alternatives --set ebtables /usr/sbin/ebtables-legacy')
52
+ end
51
53
  end
52
54
  end
data/lib/spior/helpers.rb CHANGED
@@ -5,21 +5,47 @@ require 'tempfile'
5
5
  require 'open3'
6
6
 
7
7
  module Helpers
8
+ def self.auth?
9
+ return :root if Process.uid == '0'
10
+ return :doas if File.exist?('/bin/doas') || File.exist?('/sbin/doas')
11
+ return :sudo if File.exist?('/bin/sudo') || File.exist?('/sbin/sudo')
12
+ end
13
+
14
+ def self.cmd(command)
15
+ case auth?
16
+ when :root
17
+ syscmd(command)
18
+ when :doas
19
+ syscmd("doas #{command}")
20
+ when :sudo
21
+ syscmd("sudo #{command}")
22
+ end
23
+ end
24
+
25
+ def self.syscmd(cmd)
26
+ Open3.popen2e(cmd) do |_, stdout_and_stderr, wait_thr|
27
+ puts stdout_and_stderr.gets while stdout_and_stderr.gets
28
+ exit_status = wait_thr.value
29
+ raise "Error, Running #{cmd}" unless exit_status.success?
30
+ end
31
+ end
32
+
33
+ def self.mv(src, dest)
34
+ if Process::Sys.getuid == '0'
35
+ FileUtils.mv(src, dest)
36
+ else
37
+ cmd("mv #{src} #{dest}")
38
+ end
39
+ end
40
+
8
41
  # Execute program using sudo when permission is required
9
42
  class Exec
10
43
  def initialize(name)
11
- @search_uid = Process::Sys.getuid
12
44
  @name = name
13
45
  end
14
46
 
15
47
  def run(args)
16
- cmd = (@search_uid == '0' ? @name : "sudo #{@name}")
17
- Open3.popen2e("#{cmd} #{args}") do |_, stdout_err, wait_thr|
18
- puts stdout_err.gets while stdout_err.gets
19
-
20
- exit_status = wait_thr.value
21
- raise "Error, Running #{cmd} #{args}" unless exit_status.success?
22
- end
48
+ Helpers.cmd("#{@name} #{args}")
23
49
  end
24
50
  end
25
51
 
@@ -10,19 +10,17 @@ module Spior
10
10
  class Rules
11
11
  def initialize
12
12
  @tmp_iptables_rules = Tempfile.new('iptables_rules')
13
- @tmp_spior_rules = Tempfile.new('spior_rules')
14
13
  @save_path = search_iptables_config
15
14
  end
16
15
 
17
16
  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)
17
+ Helpers.cmd("iptables-save > #{@tmp_iptables_rules.path}")
18
+ Helpers.mv(@tmp_iptables_rules.path, @save_path)
21
19
  Msg.p "Iptables rules saved at #{@save_path}"
22
20
  end
23
21
 
24
22
  def restore
25
- return if restoring_older_rules(@save_path)
23
+ return if restoring_older_rules
26
24
 
27
25
  Msg.p 'Adding clearnet navigation...'
28
26
  Iptables::Default.new.run!
@@ -30,57 +28,15 @@ module Spior
30
28
 
31
29
  protected
32
30
 
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
- return unless File.exist? filename
47
-
48
- File.open(filename) do |f|
49
- f.each do |line|
50
- return true if line.match(/saved by Spior/)
51
- end
52
- end
53
- false
54
- end
55
-
56
- def move(src, dest)
57
- if Process::Sys.getuid == '0'
58
- FileUtils.mv(src, dest)
59
- else
60
- Helpers::Exec.new('mv').run("#{src} #{dest}")
61
- end
62
- end
63
-
64
- def create_file(tmpfile, dest)
65
- if File.exist? dest
66
- if search_for_comment(dest)
67
- Msg.p "Older Spior rules found #{dest}, erasing..."
68
- else
69
- Msg.p "File exist #{dest}, create backup #{dest}-backup..."
70
- move(dest, "#{dest}-backup")
71
- end
72
- end
73
- move(tmpfile.path, dest)
74
- end
75
-
76
- def restoring_older_rules(filename)
77
- files = %W[#{filename}-backup #{filename}]
31
+ def restoring_older_rules
32
+ files = %w[/etc/iptables/simple_firewall.rules /usr/share/iptables/simple_firewall.rules]
78
33
  files.each do |f|
79
- next unless File.exist?(f) || search_for_comment(f)
34
+ next unless File.exist?(f)
80
35
 
81
36
  Iptables::Root.new.stop!
82
37
  Msg.p "Found older rules #{f}, restoring..."
83
- Helpers::Exec.new('iptables-restore').run(f)
38
+ Helpers.cmd("cp #{f} #{@save_path}")
39
+ Helpers.cmd("iptables-restore < #{@save_path}")
84
40
  return true
85
41
  end
86
42
  false
@@ -90,16 +46,12 @@ module Spior
90
46
 
91
47
  def search_iptables_config
92
48
  case Nomansland.distro?
93
- when :archlinux
94
- '/etc/iptables/iptables.rules'
95
- when :void
96
- '/etc/iptables/iptables.rules'
97
49
  when :debian
98
50
  '/etc/iptables.up.rules'
99
51
  when :gentoo
100
52
  '/var/lib/iptables/rules-save'
101
53
  else
102
- Msg.report 'I don`t know where you distro save the rules for iptables yet'
54
+ '/etc/iptables/iptables.rules'
103
55
  end
104
56
  end
105
57
  end
data/lib/spior/ipv6.rb CHANGED
@@ -1,35 +1,41 @@
1
- # lib/ipv6.rb
2
1
  # frozen_string_literal: true
3
2
 
4
3
  require 'auth'
4
+ require 'interfacez'
5
5
 
6
6
  module Spior
7
7
  # Block or Allow ipv6 traffic with sysctl
8
8
  class Ipv6
9
9
  def initialize
10
- @changed = false
10
+ @dest = '/etc/sysctl.d/40-ipv6.conf'
11
+ gen_flags
11
12
  end
12
13
 
13
14
  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
15
+ @flags.each { |f| Helpers.cmd("sysctl -w '#{f}=0'") }
16
+ Msg.p 'ipv6 allowed'
17
+ Helpers.cmd("rm #{@dest}") if File.exist? @dest
17
18
  end
18
19
 
19
20
  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
21
+ @flags.each { |f| Helpers.cmd("sysctl -w '#{f}=1'") }
22
+ Msg.p 'ipv6 blocked'
23
23
  end
24
24
 
25
- private
25
+ def block_persist
26
+ Auth.new.mkdir '/etc/sysctl.d'
27
+ myflags = []
28
+ @flags.each { |f| myflags << "#{f}=1" }
29
+ File.write('/tmp/flags.conf', myflags.join("\n"))
30
+ Helpers.cmd("cp /tmp/flags.conf #{@dest}")
31
+ end
26
32
 
27
- def apply_option(flag, value)
28
- flag_path = flag.gsub('.', '/')
29
- return unless File.exist?("/proc/sys/#{flag_path}")
33
+ private
30
34
 
31
- Auth.new.sysctl(flag, value)
32
- @changed = true
35
+ def gen_flags
36
+ @flags = ['net.ipv6.conf.all.disable_ipv6',
37
+ 'net.ipv6.conf.default.disable_ipv6']
38
+ Interfacez.all { |i| @flags << "net.ipv6.conf.#{i}.disable_ipv6" }
33
39
  end
34
40
  end
35
41
  end
data/lib/spior/options.rb CHANGED
@@ -1,61 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'optparse'
4
-
5
3
  module Spior
6
4
  # Options for the CLI
7
5
  class Options
8
- def initialize(argv)
9
- parse(argv)
10
- end
11
-
12
- private
13
-
14
- def parse(argv)
15
- OptionParser.new do |opts|
16
- opts.on('-i', '--install', 'Install the dependencies.') do
17
- Dep.looking
18
- end
19
-
20
- opts.on('-t', '--tor', 'Redirect traffic through TOR.') do
21
- Service.start
22
- end
23
-
24
- opts.on('-r', '--reload', 'Reload TOR to change your IP.') do
25
- Service.restart
26
- exit
27
- end
28
-
29
- opts.on('-c', '--clearnet', 'Reset iptables and return to clearnet navigation.') do
30
- Service.stop
31
- end
32
-
33
- opts.on('-s', '--status', 'Look infos about your current IP.') do
34
- Status.info
35
- exit
36
- end
37
-
38
- opts.on('-p', '--persist', 'Active Spior at every boot.') do
39
- Service::Enable.new
40
- end
41
-
42
- opts.on('-m', '--menu', 'Display an interactive menu.') do
43
- Menu.run
44
- end
45
-
46
- opts.on('-h', '--help', 'Show this message.') do
47
- puts opts
48
- exit
49
- end
50
-
51
- begin
52
- argv = ['-m'] if argv.empty?
53
- opts.parse!(argv)
54
- rescue OptionParser::ParseError => e
55
- warn e.message, "\n", opts
56
- exit(-1)
57
- end
58
- end
59
- end
60
6
  end
61
7
  end
@@ -17,6 +17,10 @@ module Spior
17
17
  for_gentoo
18
18
  when :archlinux
19
19
  for_arch
20
+ when :void
21
+ for_void
22
+ when :debian
23
+ for_debian
20
24
  else
21
25
  Msg.report 'Your distro is not yet supported.'
22
26
  end
@@ -25,41 +29,75 @@ module Spior
25
29
  protected
26
30
 
27
31
  def for_gentoo
28
- Iptables::Rules.new.save
29
32
  case Nomansland.init?
30
33
  when :systemd
34
+ Iptables::Rules.new.save
31
35
  systemd_enable('iptables-restore', 'tor')
32
36
  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
+ Helpers.cmd('rc-service iptables save')
38
+ Helpers.cmd('rc-update add iptables boot') # default or boot ?
39
+ Helpers.cmd('rc-update add tor default')
37
40
  else
38
41
  Msg.report 'Init no yet supported for start Iptables at boot'
39
42
  end
43
+ Ipv6.new.block_persist
44
+ Msg.p 'Persist enabled for Gentoo...'
40
45
  end
41
46
 
42
47
  def for_arch
43
48
  Iptables::Rules.new.save
44
49
  Tor::Config.new(Tempfile.new('torrc')).backup
45
50
  systemd_enable('iptables', 'tor')
46
- Msg.p 'Services enabled for Archlinux...'
51
+ Ipv6.new.block_persist
52
+ Msg.p 'Persist enabled for Arch...'
53
+ end
54
+
55
+ def for_void
56
+ Iptables::Rules.new.save
57
+ Tor::Config.new(Tempfile.new('torrc')).backup
58
+ runit_enable('iptables', 'tor')
59
+ Ipv6.new.block_persist
60
+ Msg.p 'Persist enabled for Void...'
61
+ end
62
+
63
+ # https://wiki.debian.org/iptables
64
+ def for_debian
65
+ Iptables::Rules.new.save
66
+ Tor::Config.new(Tempfile.new('torrc')).backup
67
+ systemd_enable('tor')
68
+ File.write('/tmp/start_iptables',
69
+ "#!/bin/sh\n/sbin/iptables-restore < /etc/iptables.up.rules\n")
70
+ Helpers.mv('/tmp/start_iptables', '/etc/network/if-pre-up.d/iptables')
71
+ Helpers.cmd('chmod +x /etc/network/if-pre-up.d/iptables')
72
+ Ipv6.new.block_persist
73
+ Msg.p 'Persist mode enabled for Debian...'
47
74
  end
48
75
 
49
76
  private
50
77
 
51
78
  def systemd_enable(*services)
52
- systemctl = Helpers::Exec.new('systemctl')
53
79
  services.each do |s|
54
- Msg.p "Search for service #{s}..."
55
- systemctl.run("enable #{s}") unless system("systemctl is-enabled #{s}")
80
+ next if system("systemctl is-enabled #{s} >/dev/null")
81
+
82
+ Helpers.cmd("systemctl enable #{s}")
83
+ Msg.p "Enabling #{s}..."
84
+ end
85
+ end
86
+
87
+ def runit_enable(*services)
88
+ services.each do |s|
89
+ next if File.exist? "/var/service/#{s}"
90
+
91
+ Helpers.cmd("ln -s /etc/sv/#{s} /var/service/#{s}")
92
+ Msg.p "Enabling #{s}"
56
93
  end
57
94
  end
58
95
 
59
96
  def systemd_start(service)
60
- systemctl = Helpers::Exec.new('systemctl')
97
+ return if system("systemctl is-active #{service} >/dev/null")
98
+
61
99
  Msg.p "Search for service #{service}..."
62
- systemctl.run("start #{service}") unless system("systemctl is-active #{service}")
100
+ Helpers.cmd("systemctl start #{service}")
63
101
  end
64
102
  end
65
103
  end
@@ -1,14 +1,24 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'nomansland'
4
+
3
5
  module Spior
4
6
  # Interact with Spior::Tor and Spior::Iptables
5
7
  module Service
6
8
  module_function
7
9
 
8
10
  def restart
9
- Service.stop(clean: false)
10
- Service.start
11
- Msg.p 'ip changed.'
11
+ case Nomansland.init?
12
+ when :systemd
13
+ Helpers.cmd('systemctl restart tor')
14
+ when :openrc
15
+ Helpers.cmd('/etc/init.d/tor restart')
16
+ when :runit
17
+ Helpers.cmd('sv restart tor')
18
+ else
19
+ puts 'No init found (systemd, openrc, runit)...'
20
+ end
21
+ Msg.p 'Tor restarting, ip changed.'
12
22
  end
13
23
  end
14
24
  end
data/lib/spior/status.rb CHANGED
@@ -38,6 +38,8 @@ module Spior
38
38
  puts " Timezone ===> #{hash['time_zone']}"
39
39
  end
40
40
  puts " Status ===> #{enable}"
41
+ rescue SocketError => e
42
+ Msg.err e
41
43
  rescue OpenURI::HTTPError => e
42
44
  res = e.io
43
45
  puts "Fail to join server #{res.status}"
@@ -32,7 +32,7 @@ module Spior
32
32
  cn = @content.join("\n")
33
33
  File.write(@filename.path, "#{cn}\n")
34
34
  Msg.p "Generating #{@config_spiorrc}..."
35
- move(@filename.path, @config_spiorrc)
35
+ Helpers.mv(@filename.path, @config_spiorrc)
36
36
  end
37
37
 
38
38
  def write_file(content, file, mode = 'a')
@@ -55,7 +55,7 @@ module Spior
55
55
  write_file @content_torrc, @filename.path, 'w'
56
56
 
57
57
  Msg.p 'Saving Tor options...'
58
- move(@filename.path, @config_spiorrc)
58
+ Helpers.mv(@filename.path, @config_spiorrc)
59
59
  end
60
60
 
61
61
  protected
@@ -64,9 +64,9 @@ module Spior
64
64
  return if Dir.exist? @config_dir
65
65
 
66
66
  if Process::Sys.getuid == '0'
67
- File.mkdir @config_dir
67
+ FileUtils.mkdir_p @config_dir
68
68
  else
69
- Auth.new.mkdir @config_dir
69
+ Helpers.cmd("mkdir -p #{@config_dir}")
70
70
  end
71
71
  end
72
72
 
@@ -75,7 +75,7 @@ module Spior
75
75
  content = File.read(@config_torrc)
76
76
  adding content, "%include #{@config_dir}/*.conf"
77
77
  write_file content, temp.path
78
- move(temp.path, @config_torrc)
78
+ Helpers.mv(temp.path, @config_torrc)
79
79
  end
80
80
 
81
81
  def generate_content(content)
@@ -112,26 +112,6 @@ module Spior
112
112
  md5_dest = Digest::MD5.file dest
113
113
  md5_src == md5_dest
114
114
  end
115
-
116
- # Permission for Archlinux on a torrc are chmod 644, chown root:root
117
- def fix_perm(file)
118
- if Process::Sys.getuid == '0'
119
- file.chown(0, 0)
120
- else
121
- Helpers::Exec.new('chown').run("root:root #{file}")
122
- end
123
- end
124
-
125
- def move(src, dest)
126
- return if digest_match? src, dest
127
-
128
- fix_perm(@filename.path)
129
- if Process::Sys.getuid == '0'
130
- FileUtils.mv(src, dest)
131
- else
132
- Helpers::Exec.new('mv').run("#{src} #{dest}")
133
- end
134
- end
135
115
  end
136
116
  end
137
117
  end
@@ -45,6 +45,8 @@ module Spior
45
45
  case Nomansland.distro?
46
46
  when :debian || :ubuntu
47
47
  `id -u debian-tor`.chomp
48
+ when :fedora
49
+ `id -u toranon`.chomp
48
50
  else
49
51
  `id -u #{@user}`.chomp
50
52
  end
@@ -38,28 +38,22 @@ module Spior
38
38
  return if state == 'active'
39
39
 
40
40
  Msg.p 'Starting Tor with Systemd...'
41
- Helpers::Exec.new('systemctl').run('start tor')
41
+ Helpers.cmd('systemctl start tor')
42
42
  end
43
43
 
44
44
  def start_openrc
45
45
  Msg.p 'Starting Tor with OpenRC...'
46
- Helpers::Exec.new('/etc/init.d/tor').run('start')
46
+ Helpers.cmd('/etc/init.d/tor start')
47
47
  end
48
48
 
49
49
  def start_runit
50
50
  Msg.p 'Starting Tor with Runit...'
51
51
  if File.exist? '/var/service/tor'
52
- Helpers::Exec.new('sv').run('start tor')
52
+ Helpers.cmd('sv start tor')
53
53
  else
54
- Helpers::Exec.new('ln').run('-s /etc/sv/tor /var/service/tor')
54
+ Helpers.cmd('ln -s /etc/sv/tor /var/service/tor')
55
55
  end
56
56
  end
57
-
58
- def x(arg)
59
- auth = (Process::Sys.getuid == '0' ? '' : 'sudo')
60
- pid = spawn("#{auth} #{arg}", out: '/dev/null') or raise 'Error'
61
- Process.wait pid
62
- end
63
57
  end
64
58
  end
65
59
  end
data/lib/spior/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Spior
4
- VERSION = '0.3.6'
4
+ VERSION = '0.5.0'
5
5
  end
data/lib/spior.rb CHANGED
@@ -21,19 +21,4 @@ module Spior
21
21
  # Spior::CONFIG.user = 'Tor-User-System'
22
22
  # Spior::CONFIG.virt_addr = '10.192.0.0/10'
23
23
  CONFIG = Tor::Data.new
24
-
25
- # Main for the CLI
26
- class Main
27
- def initialize(argv)
28
- @argv = argv
29
- x
30
- end
31
-
32
- private
33
-
34
- def x
35
- Msg.banner
36
- Options.new(@argv)
37
- end
38
- end
39
24
  end
data/spior.gemspec CHANGED
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "#{File.dirname(__FILE__)}/lib/spior/version"
3
+ require_relative "lib/spior/version"
4
4
 
5
5
  Gem::Specification.new do |s|
6
6
  s.name = 'spior'
@@ -31,8 +31,8 @@ Gem::Specification.new do |s|
31
31
 
32
32
  s.test_files = Dir['test/test_*.rb']
33
33
 
34
- s.cert_chain = ['certs/szorfein.pem']
35
- s.signing_key = File.expand_path('~/.ssh/gem-private_key.pem')
34
+ #s.cert_chain = ['certs/szorfein.pem']
35
+ #s.signing_key = File.expand_path('~/.ssh/gem-private_key.pem')
36
36
 
37
37
  s.requirements << 'tor'
38
38
  s.requirements << 'iptables'
@@ -40,7 +40,7 @@ Gem::Specification.new do |s|
40
40
  s.required_ruby_version = '>= 2.6'
41
41
 
42
42
  s.add_runtime_dependency('interfacez', '~> 1.0')
43
- s.add_runtime_dependency('nomansland', '~> 0.0')
43
+ s.add_runtime_dependency('nomansland', '~> 0.0.5')
44
44
  s.add_runtime_dependency('rainbow', '~> 3.1')
45
- s.add_runtime_dependency('tty-which', '~> 0.5')
45
+ s.add_runtime_dependency('tty-which', '~> 0.5.0')
46
46
  end
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: spior
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.6
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - szorfein
@@ -36,7 +36,7 @@ cert_chain:
36
36
  urXgRIzALxd/xazPCnoLSXPzfJSI6Y77S1EBvhPd9RaSO8IyH9RhPDP9mnTvW2Kl
37
37
  NAUnoL+txK5a
38
38
  -----END CERTIFICATE-----
39
- date: 2023-10-26 00:00:00.000000000 Z
39
+ date: 2024-10-10 00:00:00.000000000 Z
40
40
  dependencies:
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: interfacez
@@ -58,14 +58,14 @@ dependencies:
58
58
  requirements:
59
59
  - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: '0.0'
61
+ version: 0.0.5
62
62
  type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: '0.0'
68
+ version: 0.0.5
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: rainbow
71
71
  requirement: !ruby/object:Gem::Requirement
@@ -86,14 +86,14 @@ dependencies:
86
86
  requirements:
87
87
  - - "~>"
88
88
  - !ruby/object:Gem::Version
89
- version: '0.5'
89
+ version: 0.5.0
90
90
  type: :runtime
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
94
  - - "~>"
95
95
  - !ruby/object:Gem::Version
96
- version: '0.5'
96
+ version: 0.5.0
97
97
  description: " A tool to make TOR your default gateway\n"
98
98
  email: szorfein@protonmail.com
99
99
  executables:
@@ -103,6 +103,7 @@ extra_rdoc_files:
103
103
  - README.md
104
104
  - CHANGELOG.md
105
105
  files:
106
+ - ".github/workflows/gem-push.yml"
106
107
  - ".github/workflows/rubocop-analysis.yml"
107
108
  - ".gitignore"
108
109
  - CHANGELOG.md
metadata.gz.sig CHANGED
Binary file