catflap 0.0.2.pre → 0.0.2

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.
Files changed (3) hide show
  1. data/bin/catflap +21 -9
  2. data/lib/catflap.rb +10 -0
  3. metadata +5 -5
data/bin/catflap CHANGED
@@ -53,16 +53,28 @@ optparse = OptionParser.new do |opts|
53
53
  end
54
54
  end.parse! ARGV
55
55
 
56
- cf = Catflap.new options['config_file']
56
+ begin
57
+ cf = Catflap.new options['config_file']
58
+ rescue Psych::SyntaxError
59
+ puts "There is a YAML syntax error in your catflap configuration file.\n"
60
+ exit 1
61
+ rescue NoMethodError
62
+ puts "Cannot read the configuration file (#{options['config_file']}) or default file location: /usr/local/etc/catflap.yaml\n"
63
+ exit 1
64
+ end
57
65
  unless options['start_server']
58
- cf.purge_rules! if options['purge']
59
- cf.install_rules! if options['install']
60
- cf.uninstall_rules! if options['uninstall']
61
- cf.add_address! options['add'] if options['add']
62
- cf.delete_address! options['del'] if options['del']
63
- cf.add_addresses_from_file! options['filepath'] if options['filepath']
64
- cf.check_address options['check'] if options['check']
65
- cf.list_rules if options['list']
66
+ begin
67
+ cf.purge_rules! if options['purge']
68
+ cf.install_rules! if options['install']
69
+ cf.uninstall_rules! if options['uninstall']
70
+ cf.add_address! options['add'] if options['add']
71
+ cf.delete_address! options['del'] if options['del']
72
+ cf.add_addresses_from_file! options['filepath'] if options['filepath']
73
+ cf.check_address options['check'] if options['check']
74
+ cf.list_rules if options['list']
75
+ rescue ArgumentError
76
+ puts "Invalid Argument: make sure IP address or range is correct (i.e. CIDR format)\n"
77
+ end
66
78
  else
67
79
  require 'catflap-http'
68
80
  CatflapWebserver::start_server cf
data/lib/catflap.rb CHANGED
@@ -1,10 +1,12 @@
1
1
  require 'yaml'
2
+ require 'ipaddr'
2
3
 
3
4
  class Catflap
4
5
 
5
6
  attr_accessor :config, :chain, :port, :dports, :print, :noop, :log_rejected
6
7
 
7
8
  def initialize config_file
9
+ config_file = config_file || '/usr/local/etc/catflap.yaml'
8
10
  @config = {}
9
11
  @config = YAML.load_file config_file if File.readable? config_file
10
12
  @port = @config['server']['port'] || 4777
@@ -43,15 +45,18 @@ class Catflap
43
45
  end
44
46
 
45
47
  def check_address ip
48
+ check_user_input ip
46
49
  return system "iptables -C #{@chain} -s #{ip} -p tcp -m multiport --dports #{@dports} -j ACCEPT\n"
47
50
  end
48
51
 
49
52
  def add_address! ip
53
+ check_user_input ip
50
54
  output = "iptables -I #{@chain} 1 -s #{ip} -p tcp -m multiport --dports #{@dports} -j ACCEPT\n"
51
55
  execute! output
52
56
  end
53
57
 
54
58
  def delete_address! ip
59
+ check_user_input ip
55
60
  output = "iptables -D #{@chain} -s #{ip} -p tcp -m multiport --dports #{@dports} -j ACCEPT\n"
56
61
  execute! output
57
62
  end
@@ -60,6 +65,7 @@ class Catflap
60
65
  if File.readable? filepath
61
66
  output = ""
62
67
  File.open(filepath, "r").each_line do |ip|
68
+ check_user_input ip
63
69
  output << "iptables -I #{@chain} 1 -s #{ip.chomp} -p tcp -m multiport --dports #{@dports} -j ACCEPT\n"
64
70
  end
65
71
  execute! output
@@ -74,4 +80,8 @@ class Catflap
74
80
  system output unless @noop
75
81
  end
76
82
 
83
+ def check_user_input suspect
84
+ return IPAddr.new(suspect)
85
+ end
86
+
77
87
  end
metadata CHANGED
@@ -1,15 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: catflap
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2.pre
5
- prerelease: 6
4
+ version: 0.0.2
5
+ prerelease:
6
6
  platform: ruby
7
7
  authors:
8
8
  - Nyk Cowham
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-12-01 00:00:00.000000000 Z
12
+ date: 2013-12-08 00:00:00.000000000 Z
13
13
  dependencies: []
14
14
  description: A simple solution to provide on-demand service access (e.g. port 80 on
15
15
  webserver), where a more robust and secure VPN solution is not available.
@@ -38,9 +38,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
38
38
  required_rubygems_version: !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
- - - ! '>'
41
+ - - ! '>='
42
42
  - !ruby/object:Gem::Version
43
- version: 1.3.1
43
+ version: '0'
44
44
  requirements:
45
45
  - NetFilters (iptables) installed and working.
46
46
  rubyforge_project: