iptables-web 0.3.0 → 0.3.1

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
  SHA1:
3
- metadata.gz: 60035381ec896cdd96b0892e60dd1cb43949f853
4
- data.tar.gz: e211d23ba54a7b389323c7723df8b5565f9adf0d
3
+ metadata.gz: 16475aa736b21d189399f8b3c85279cfe14e6fe7
4
+ data.tar.gz: 9a726d97f74ce4611a3d25731ce82a94ed2a9983
5
5
  SHA512:
6
- metadata.gz: 9d74bd5fc7379eddccefc52857f182196aa9bafdbf0c75eaf6e319fb5cef673919b93e8f568410c504985025137df3e32ebb5f8e93d76da97b149bc551dc05b0
7
- data.tar.gz: f7c0656a71cd42fcf58bac89a39f5592ef7c4afb6f41b986b259be66b97f7c881c06e7e7cfa06ffd71f8ab461dead64bbce6f899dd46e847d477625589ed8e23
6
+ metadata.gz: b7f4461010b110bcebafec026d25dfd00ff1562ba2100eb6a88c0b5486266d5132eaed67277fda8134a616262c6815c1cb9605289bc659e119cfd4a15d719921
7
+ data.tar.gz: 5d6d6e84c2cf422f622a8cd8ab7e182f32f2791844f1fcce2186ccbd0acd9fc8ad1e2da5bc94517bb856cc710a0d27e1c659e79cd2418738a4a7457792da3f82
data/bin/iptables-web CHANGED
@@ -1,100 +1,6 @@
1
1
  #!/usr/bin/env ruby
2
- require 'commander/import'
2
+
3
3
  require 'system/getifaddrs'
4
4
  require 'iptables_web'
5
- # :name is optional, otherwise uses the basename of this executable
6
- program :name, 'IPtables Web client'
7
- program :version, IptablesWeb::VERSION
8
- program :description, 'Update iptables '
9
- default_command :update
10
- command :install do |c|
11
- c.syntax = 'iptables-web install'
12
- c.description = 'Displays foo'
13
- c.option '--force', 'Force config '
14
- c.action do |args, options|
15
- config = IptablesWeb::Configuration.new
16
- api_url = ask('Api base url: ') { |q| q.default = config['api_base_url'] }
17
- token = ask('Access token: ') { |q| q.default = config['access_token'] }
18
- update_period = ask('Update every [min]', Integer) { |q| q.default = 1; q.in = 0..59 }
19
- config_dir = IptablesWeb::Configuration.config_dir
20
- unless File.exist?(config_dir)
21
- say "Create config directory: #{config_dir}"
22
- Dir.mkdir(config_dir)
23
- end
24
- config_file = File.join(config_dir, 'config.yml')
25
- say "Write config to #{config_file}"
26
- File.write config_file, <<CONFIG
27
- api_base_url: #{api_url}
28
- access_token: #{token}
29
- CONFIG
30
- if system("LANG=C bash -l -c \"type rvm | cat | head -1 | grep -q '^rvm is a function$'\"")
31
- wrapper = "#{ENV['HOME']}/.rvm/wrappers/#{`rvm current`.strip}/iptables-web"
32
- else
33
- wrapper = 'iptables-web'
34
- end
35
-
36
- cron_file = File.join(config_dir, 'cron.sh')
37
- say "Write file #{cron_file}"
38
- File.write cron_file, <<CONFIG
39
- #/bin/env ruby
40
- #{wrapper} update
41
- CONFIG
42
- File.chmod(0700, cron_file)
43
- say "Add cronjob #{cron_file}"
44
- crontab = IptablesWeb::Crontab.new(false)
45
- jobs = crontab.jobs
46
- jobs.reject! { |job| job.include?('.iptables-web') }
47
- jobs << "*/#{update_period} * * * * #{File.join(ENV['HOME'], '.iptables-web', 'cron.sh')}"
48
- crontab.save(jobs)
49
-
50
- static_rules = File.join(config_dir, 'static_rules')
51
-
52
- say "Create file for static rules #{static_rules}"
53
- say "* * * * * * * * * * * * * * * * * * * * * * * *\n"
54
- say "* You can write predefined rules to this file.\n"
55
- say "* This file will be concat with rules \n"
56
- say "* See 'iptables-save' format.\n"
57
- say "* * * * * * * * * * * * * * * * * * * * * * * * \n"
58
-
59
- if File.exist?(static_rules) && !options.force
60
- say 'File already exist!'
61
- else
62
- File.write static_rules, <<STATIC_RULES
63
- *filter
64
- -A INPUT -i lo -j ACCEPT
65
- -A FORWARD -i lo -j ACCEPT
66
- -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
67
- -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
68
- COMMIT
69
- STATIC_RULES
70
- end
71
- end
72
- end
73
-
74
- command :update do |c|
75
- c.syntax = 'iptables-web update'
76
- c.description = 'Display bar with optional prefix and suffix'
77
- c.option '--config STRING', String, 'Path to config file'
78
- c.option '--print', 'Show rules without restoring'
79
- c.option '--force', 'Set rules omit checksum check'
80
- c.action do |_, options|
81
- IptablesWeb.configuration.load(options.config) if options.config
82
- IptablesWeb::Model::Node.handshake do
83
- rules = IptablesWeb::Model::AccessRule.all
84
- iptables = IptablesWeb::Iptables.new
85
- last_checksum = rules.response.headers[:etag].first
86
- if options.print
87
- say "Loading rules from #{IptablesWeb.configuration['api_base_url']}"
88
- say 'Nothing changed.' if IptablesWeb::Configuration.checksum?(last_checksum)
89
- say iptables.render(rules)
90
- else
91
- if IptablesWeb::Configuration.checksum?(rules.response.headers[:etag].first) && !options.force
92
- say 'Skip iptables update. Nothing changed.'
93
- else
94
- iptables.restore(rules)
95
- IptablesWeb::Configuration.checksum = last_checksum
96
- end
97
- end
98
- end
99
- end
100
- end
5
+ require 'iptables_web/cli'
6
+ IptablesWeb::Cli.new if $0 == __FILE__
data/lib/iptables_web.rb CHANGED
@@ -1,3 +1,4 @@
1
+
1
2
  require 'iptables_web/version'
2
3
  require 'iptables_web/configuration'
3
4
  require 'system/getifaddrs'
@@ -8,20 +9,17 @@ require 'iptables_web/model/node'
8
9
  require 'iptables_web/crontab'
9
10
  require 'iptables_web/iptables'
10
11
 
11
- module IptablesWeb
12
- class << self
13
- attr_accessor :configuration
14
- def configuration
15
- self.configuration = Configuration.new unless @configuration
16
- @configuration
17
- end
12
+ require 'commander'
13
+ require 'iptables_web/cli/command/install'
14
+ require 'iptables_web/cli/command/update'
15
+ require 'iptables_web/cli/logged_output'
16
+ require 'iptables_web/cli/import'
17
+ require 'iptables_web/cli'
18
+
18
19
 
19
- def configuration=(config)
20
- @configuration = config
21
- IptablesWeb::Model::Base.configure(config)
22
- @configuration
23
- end
24
- end
20
+ module IptablesWeb
21
+ extend Configuration
25
22
  end
26
23
 
27
- IptablesWeb.configuration = IptablesWeb::Configuration.new #set default configuration
24
+ IptablesWeb.reload
25
+
@@ -0,0 +1,38 @@
1
+ require 'commander'
2
+
3
+ module IptablesWeb
4
+ class Cli
5
+ attr_reader :output
6
+ include ::Commander::Methods
7
+ include IptablesWeb::Cli::Command::Install
8
+ include IptablesWeb::Cli::Command::Update
9
+
10
+ def initialize
11
+ program :name, 'Iptables Web Client'
12
+ program :version, IptablesWeb::VERSION
13
+ program :description, 'Desc'
14
+ default_command :update
15
+
16
+ global_option('--config FILE', 'Configuration file') do |config|
17
+ IptablesWeb.config_path = config
18
+ IptablesWeb.reload
19
+ end
20
+
21
+ global_option('--log_file FILE', 'Log file path') do |log_path|
22
+ IptablesWeb.log_path = log_path
23
+ end
24
+
25
+ global_option('--host URL', 'Server base url') do |server_base_url|
26
+ IptablesWeb.api_base_url = server_base_url
27
+ end
28
+
29
+ global_option('--token TOKEN', 'Server base url') do |access_token|
30
+ IptablesWeb.access_token = access_token
31
+ end
32
+
33
+ install_command
34
+ update_command
35
+ run!
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,73 @@
1
+ module IptablesWeb
2
+ class Cli
3
+ module Command
4
+ module Install
5
+ def install_command
6
+ command :install do |c|
7
+ c.syntax = 'iptables-web install'
8
+ c.description = 'Displays foo'
9
+ c.option '--force', 'Force config '
10
+ c.action do |args, options|
11
+ config = IptablesWeb::Configuration.new
12
+ api_url = ask('Api base url: ') { |q| q.default = config['api_base_url'] }
13
+ token = ask('Access token: ') { |q| q.default = config['access_token'] }
14
+ update_period = ask('Update every [min]', Integer) { |q| q.default = 1; q.in = 0..59 }
15
+ config_dir = IptablesWeb::Configuration.config_dir
16
+ unless File.exist?(config_dir)
17
+ say "Create config directory: #{config_dir}"
18
+ Dir.mkdir(config_dir)
19
+ end
20
+ config_file = File.join(config_dir, 'config.yml')
21
+ say "Write config to #{config_file}"
22
+ File.write config_file, <<CONFIG
23
+ api_base_url: #{api_url}
24
+ access_token: #{token}
25
+ CONFIG
26
+ if system("LANG=C bash -l -c \"type rvm | cat | head -1 | grep -q '^rvm is a function$'\"")
27
+ wrapper = "#{ENV['HOME']}/.rvm/wrappers/#{`rvm current`.strip}/iptables-web"
28
+ else
29
+ wrapper = 'iptables-web'
30
+ end
31
+
32
+ cron_file = File.join(config_dir, 'cron.sh')
33
+ say "Write file #{cron_file}"
34
+ File.write cron_file, <<CONFIG
35
+ #/bin/env ruby
36
+ #{wrapper} update
37
+ CONFIG
38
+ File.chmod(0700, cron_file)
39
+ say "Add cronjob #{cron_file}"
40
+ crontab = IptablesWeb::Crontab.new(false)
41
+ jobs = crontab.jobs
42
+ jobs.reject! { |job| job.include?('.iptables-web') }
43
+ jobs << "*/#{update_period} * * * * #{File.join(ENV['HOME'], '.iptables-web', 'cron.sh')}"
44
+ crontab.save(jobs)
45
+
46
+ static_rules = File.join(config_dir, 'static_rules')
47
+
48
+ say "Create file for static rules #{static_rules}"
49
+ say "* * * * * * * * * * * * * * * * * * * * * * * *\n"
50
+ say "* You can write predefined rules to this file.\n"
51
+ say "* This file will be concat with rules \n"
52
+ say "* See 'iptables-save' format.\n"
53
+ say "* * * * * * * * * * * * * * * * * * * * * * * * \n"
54
+
55
+ if File.exist?(static_rules) && !options.force
56
+ say 'File already exist!'
57
+ else
58
+ File.write static_rules, <<STATIC_RULES
59
+ *filter
60
+ -A INPUT -i lo -j ACCEPT
61
+ -A FORWARD -i lo -j ACCEPT
62
+ -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
63
+ -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
64
+ COMMIT
65
+ STATIC_RULES
66
+ end
67
+ end
68
+ end
69
+ end
70
+ end
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,46 @@
1
+ require 'iptables_web/cli/pid_file'
2
+ module IptablesWeb
3
+ class Cli
4
+ module Command
5
+ module Update
6
+ def update_command
7
+ command :update do |c|
8
+ c.syntax = 'iptables-web update'
9
+ c.description = 'Display bar with optional prefix and suffix'
10
+ c.option '--config STRING', String, 'Path to config file'
11
+ c.option '--print', 'Show rules without restoring'
12
+ c.option '--force', 'Set rules omit checksum check'
13
+ c.action do |_, options|
14
+ begin
15
+
16
+ IptablesWeb.configuration.load(options.config) if options.config
17
+ logged_say "Use iptables server #{IptablesWeb.api_base_url}"
18
+ IptablesWeb.pid_file do
19
+ IptablesWeb::Model::Node.handshake do
20
+ rules = IptablesWeb::Model::AccessRule.all
21
+ iptables = IptablesWeb::Iptables.new
22
+ last_checksum = rules.response.headers[:etag].first
23
+ if options.print
24
+ logged_say 'Nothing changed.' if IptablesWeb.checksum?(last_checksum)
25
+ say iptables.render(rules)
26
+ else
27
+ if IptablesWeb.checksum?(rules.response.headers[:etag].first) && !options.force
28
+ logged_say 'Skip iptables update. Nothing changed.'
29
+ else
30
+ iptables.restore(rules)
31
+ IptablesWeb.checksum = last_checksum
32
+ end
33
+ end
34
+ end
35
+ end
36
+ rescue Exception => e
37
+ logged_say(e.message)
38
+ logged_say(e.backtrace.join("\n"))
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,8 @@
1
+ require 'highline'
2
+ require 'forwardable'
3
+
4
+ $terminal = IptablesWeb::Cli::LoggedOutput.new
5
+ module Kernel
6
+ extend Forwardable
7
+ def_delegators :$terminal, :agree, :ask, :choose, :say, :logged_say
8
+ end
@@ -0,0 +1,24 @@
1
+ module IptablesWeb
2
+ class Cli
3
+ class LoggedOutput < ::HighLine
4
+ def logger
5
+ @logger ||= begin
6
+ logfile = IptablesWeb::log_path
7
+ say("Open log file #{logfile}")
8
+ logger =::Logger.new(logfile)
9
+ logger.formatter = ::Logger::Formatter.new
10
+ logger
11
+ end
12
+ end
13
+
14
+ def reset
15
+ @logger = nil
16
+ end
17
+
18
+ def logged_say(message, log_level = Logger::INFO)
19
+ logger.log(log_level, message) if logger
20
+ say(message)
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,65 @@
1
+ module IptablesWeb
2
+ class Cli
3
+ class PidFile
4
+
5
+ def initialize(pidfile_path)
6
+ @pidfile = pidfile_path
7
+ end
8
+
9
+ def create
10
+ raise AnotherLaunched.new("Another process with #{pid} already launched!") if another_exist?
11
+ logged_say("Create pidfile #{self} for pid #{Process.pid}")
12
+ logged_say("Grab pidfile #{self} for pid #{Process.pid} due process #{pid} is down.") if other?
13
+ File.open(@pidfile, 'w') do |file|
14
+ file.write(Process.pid)
15
+ end
16
+ pid
17
+ end
18
+
19
+ def delete
20
+ raise AnotherLaunched.new("Delete error. Another process with #{pid} already launched!") if another_exist?
21
+ logged_say("Delete pidfile #{self} for pid #{pid}")
22
+ File.unlink(@pidfile) if exist?
23
+ end
24
+
25
+ def pid
26
+ if exist?
27
+ File.read(@pidfile).to_i
28
+ else
29
+ 0
30
+ end
31
+ end
32
+
33
+ def another_exist?
34
+ process_exist? && other?
35
+ end
36
+
37
+ def other?
38
+ pid > 0 && Process.pid != pid
39
+ end
40
+
41
+ def process_exist?
42
+ pid > 0 && Process.kill(0, pid)
43
+ rescue Errno::ESRCH
44
+ false
45
+ end
46
+
47
+ def exist?
48
+ ::File.exists?(@pidfile)
49
+ end
50
+
51
+ def to_s
52
+ @pidfile
53
+ end
54
+
55
+ class PidFileException < Exception
56
+ end
57
+
58
+ class AlreadyLaunched < PidFileException
59
+ end
60
+
61
+ class AnotherLaunched < PidFileException
62
+ end
63
+ end
64
+ end
65
+ end
@@ -1,30 +1,20 @@
1
1
  require 'yaml'
2
2
  module IptablesWeb
3
- class Configuration < Hash
4
- attr_accessor :loaded
5
- CONFIG_FILES = %W(#{ENV['HOME']}/.iptables-web/config.yml /etc/iptables-web/config.yml)
6
- STATIC_RULES_FILES = %W(#{ENV['HOME']}/.iptables-web/static_rules /etc/iptables-web/static_rules)
7
- CHECKSUM_FILE = "#{ENV['HOME']}/.iptables-web/checksum"
8
-
9
- def initialize
10
- CONFIG_FILES.each do |config|
11
- puts "Load configuration from #{config}"
12
- if load(config)
13
- @loaded = true
14
- break
3
+ module Configuration
4
+ def reload
5
+ if File.exists?(config_path)
6
+ logged_say("Load config file #{config_path}")
7
+ YAML.load_file(config_path).each do |method, value|
8
+ send("#{method}=".to_sym, value)
15
9
  end
10
+ else
11
+ logged_say("Config file #{config_path} does not exist")
16
12
  end
17
13
  end
18
14
 
19
- def load(config)
20
- clear
21
- merge! YAML.load File.read(config) if File.exist?(config)
22
- end
23
-
24
- def self.static_rules
25
- rules = STATIC_RULES_FILES.map do |file|
26
- File.exist?(file) ? File.read(file) : nil
27
- end.compact.join("\n").strip
15
+ def static_rules
16
+ return {} unless static_rules?
17
+ rules = File.read(static_rules_path)
28
18
  chains = rules.scan(/\*([a-z]+)(.*?)COMMIT/m)
29
19
  if chains && chains.size > 0
30
20
  chains.each_with_object({}) do |r, obj|
@@ -37,16 +27,148 @@ module IptablesWeb
37
27
  end
38
28
  end
39
29
 
40
- def self.checksum?(checksum)
41
- File.exists?(CHECKSUM_FILE) && File.read(CHECKSUM_FILE) == checksum
30
+ def static_rules?
31
+ File.exist?(static_rules_path)
32
+ end
33
+
34
+ def home
35
+ @home || ENV['HOME']
36
+ end
37
+
38
+ def home=(home)
39
+ @home = home
40
+ end
41
+
42
+ def dir
43
+ @dir ||= begin
44
+ if root?
45
+ '/var/run/iptables_web'
46
+ else
47
+ File.expand_path(File.join(home, '.iptables-web'))
48
+ end
49
+ end
50
+ end
51
+
52
+ def dir=(d)
53
+ @dir = d
54
+ end
55
+
56
+ def path(path)
57
+ File.expand_path(path, dir)
42
58
  end
43
59
 
44
- def self.checksum=(checksum)
45
- File.write(CHECKSUM_FILE, checksum)
60
+ def root?
61
+ Process::UID.eid == 0
62
+ end
63
+
64
+ #
65
+ def config_path
66
+ if root?
67
+ '/etc/iptables_web/config.yml'
68
+ else
69
+ path(@config_path || 'config.yml')
70
+ end
71
+ end
72
+
73
+ def config_path=(config_path)
74
+ @config_path = config_path
75
+ end
76
+
77
+ #
78
+ def pid_path
79
+ path(@pid_path || 'run.pid')
80
+ end
81
+
82
+ def pid_path=(pid_path)
83
+ @pid_path = pid_path
84
+ end
85
+
86
+ #
87
+ def log_path
88
+ if root?
89
+ '/var/log/iptables-web.log'
90
+ else
91
+ path(@log_path || 'run.log')
92
+ end
46
93
  end
47
94
 
48
- def self.config_dir
49
- File.join(ENV['HOME'], '.iptables-web')
95
+ def log_path=(pid_path)
96
+ @log_path = pid_path
97
+ $terminal.reset if $terminal.present? && $terminal.is_a?(Cli::LoggedOutput)
98
+ end
99
+
100
+ #
101
+ def checksum_path
102
+ path(@checksum_path || 'checksum')
103
+ end
104
+
105
+ def checksum_path=(pid_path)
106
+ @checksum_path = pid_path
107
+ end
108
+
109
+ def checksum?(checksum)
110
+ File.exists?(checksum_path) && File.read(checksum_path) == make_checksum(checksum)
111
+ end
112
+
113
+ def checksum=(checksum)
114
+ File.write(checksum_path, make_checksum(checksum))
115
+ end
116
+
117
+ def make_checksum(check_sum)
118
+ check_sum = check_sum.to_s
119
+ check_sum += Digest::MD5.file(static_rules_path).hexdigest if static_rules?
120
+ Digest::MD5.hexdigest(check_sum)
121
+ end
122
+
123
+ #
124
+ def static_rules_path
125
+ if root?
126
+ '/etc/iptables_web/static_rules'
127
+ else
128
+ path(@static_rules_path || 'static_rules')
129
+ end
130
+ end
131
+
132
+ def static_rules_path=(static_rules_path)
133
+ @static_rules_path = static_rules_path
134
+ end
135
+
136
+ #
137
+ def api_base_url
138
+ # raise 'api_base_url is required' unless @api_base_url
139
+ @api_base_url
140
+ end
141
+
142
+ def api_base_url=(api_base_url)
143
+ @api_base_url = api_base_url
144
+ IptablesWeb::Model::Base.api_base_url = api_base_url
145
+ end
146
+
147
+ def access_token
148
+ raise 'Access_token is required' unless @access_token
149
+ @access_token
150
+ end
151
+
152
+ def access_token=(access_token)
153
+ @access_token = access_token
154
+ IptablesWeb::Model::Base.access_token = access_token
155
+ end
156
+
157
+ def pid_file(&block)
158
+ pid_file = Cli::PidFile.new(pid_path)
159
+ begin
160
+ pid_file.create
161
+ block.call(pid_file)
162
+ pid_file.delete
163
+ rescue Cli::PidFile::AnotherLaunched => e
164
+
165
+ pid_file.delete
166
+ logged_say(e.message)
167
+ return
168
+ rescue Exception => e
169
+ pid_file.delete
170
+ raise e
171
+ end
50
172
  end
51
173
  end
52
174
  end
@@ -4,8 +4,15 @@ module IptablesWeb
4
4
  include IptablesWeb::Mixin::Sudo
5
5
 
6
6
  def restore(access_rules)
7
+ lines = combine(access_rules)
8
+ if lines.size == 0
9
+ logged_say('Skip restore because no rules found')
10
+ return
11
+ end
12
+
7
13
  temp_file = Tempfile.new('rules')
8
- temp_file.write render(access_rules)
14
+ logged_say("Save rules to file #{temp_file.path}")
15
+ temp_file.write lines.join("\n")
9
16
  temp_file.rewind
10
17
  execute("/sbin/iptables-restore -c #{temp_file.path}")
11
18
  ensure
@@ -20,26 +27,37 @@ module IptablesWeb
20
27
  end
21
28
 
22
29
  def static_rules
23
- IptablesWeb::Configuration.static_rules
30
+ IptablesWeb.static_rules
24
31
  end
25
32
 
26
- def render(rules)
33
+ def combine(rules)
27
34
  static_rules = self.static_rules
28
35
  static_filter = static_rules.delete('filter')
36
+
37
+ filter_rules =[]
38
+ filter_rules = filter_rules | Array(static_filter)
39
+ filter_rules = filter_rules | Array(rules).map(&:to_s)
40
+ filter_rules.reject! { |r| r.strip.empty? }
29
41
  lines = []
30
- lines << '*filter'
31
- lines << ':INPUT DROP [0:0]'
32
- lines << ':FORWARD ACCEPT [0:0]'
33
- lines << ':OUTPUT ACCEPT [0:0]'
34
- lines << static_filter.join("\n").strip if static_filter
35
- lines << Array(rules).map(&:to_s).join("\n").strip
36
- lines << "COMMIT\n"
42
+ if filter_rules.size > 0
43
+ lines << '*filter'
44
+ lines << ':INPUT DROP [0:0]'
45
+ lines << ':FORWARD ACCEPT [0:0]'
46
+ lines << ':OUTPUT ACCEPT [0:0]'
47
+ lines = lines | filter_rules
48
+ lines << "COMMIT\n"
49
+ end
50
+
37
51
  static_rules.each do |chain, sub_rules|
38
52
  lines << "*#{chain}"
39
53
  lines << sub_rules.join("\n").strip
40
54
  lines << "COMMIT\n"
41
55
  end
42
- lines.join("\n")
56
+ lines
57
+ end
58
+
59
+ def render(rules)
60
+ combine(rules).join("\n")
43
61
  end
44
62
  end
45
63
  end
@@ -5,9 +5,14 @@ module IptablesWeb
5
5
  module Model
6
6
  class Base < ActiveResource::Base
7
7
  add_response_method :response
8
- def self.configure(config)
9
- self.site = "#{config['api_base_url']}/api"
10
- headers['X-Node-Access-Token'] = config['access_token']
8
+ class << self
9
+ def api_base_url=(api_base_url)
10
+ self.site = "#{api_base_url}/api"
11
+ end
12
+
13
+ def access_token=(access_token)
14
+ self.headers['X-Node-Access-Token'] = access_token
15
+ end
11
16
  end
12
17
  end
13
18
  end
@@ -4,23 +4,32 @@ module IptablesWeb
4
4
  self.element_name = 'node'
5
5
  self.include_root_in_json = true
6
6
 
7
- def self.handshake
7
+ def self.handshake(&block)
8
8
  node = find('current')
9
- if node
10
- yield if block_given?
11
- # save node after updating
12
- node.ips = []
13
- ::System.get_ifaddrs.each do |interface, config|
14
- next if interface.to_s.include?('lo')
15
- node.ips.push({
16
- interface: interface,
17
- ip: config[:inet_addr],
18
- netmask: config[:netmask]
19
- })
9
+ if node
10
+ begin
11
+ block.call if block
12
+ rescue Exception => e
13
+ node.has_errors = true
14
+ node.report = 'Exception: ' + e.message
15
+ node.report << "\n"
16
+ node.report << 'Backtrace: ' + e.backtrace.join("\n")
17
+ raise e
18
+ ensure
19
+ # save node after updating
20
+ node.ips = []
21
+ ::System.get_ifaddrs.each do |interface, config|
22
+ next if interface.to_s.include?('lo')
23
+ node.ips.push({
24
+ interface: interface,
25
+ ip: config[:inet_addr],
26
+ netmask: config[:netmask]
27
+ })
28
+ end
29
+ node.ips.uniq! { |ip| ip[:ip] }
30
+ node.hostname = `hostname -f`
31
+ node.save
20
32
  end
21
- node.ips.uniq! { |ip| ip[:ip] }
22
- node.hostname = `hostname -f`
23
- node.save
24
33
  end
25
34
  end
26
35
  end
@@ -1,3 +1,3 @@
1
1
  module IptablesWeb
2
- VERSION = '0.3.0'
2
+ VERSION = '0.3.1'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: iptables-web
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - NikolayMurga
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-08-04 00:00:00.000000000 Z
11
+ date: 2015-08-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: system-getifaddrs
@@ -84,6 +84,26 @@ dependencies:
84
84
  - - '>='
85
85
  - !ruby/object:Gem::Version
86
86
  version: 1.1.1
87
+ - !ruby/object:Gem::Dependency
88
+ name: lockfile
89
+ requirement: !ruby/object:Gem::Requirement
90
+ requirements:
91
+ - - ~>
92
+ - !ruby/object:Gem::Version
93
+ version: '2'
94
+ - - '>='
95
+ - !ruby/object:Gem::Version
96
+ version: 2.1.3
97
+ type: :runtime
98
+ prerelease: false
99
+ version_requirements: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ~>
102
+ - !ruby/object:Gem::Version
103
+ version: '2'
104
+ - - '>='
105
+ - !ruby/object:Gem::Version
106
+ version: 2.1.3
87
107
  - !ruby/object:Gem::Dependency
88
108
  name: bundler
89
109
  requirement: !ruby/object:Gem::Requirement
@@ -124,6 +144,12 @@ files:
124
144
  - README.md
125
145
  - bin/iptables-web
126
146
  - lib/iptables_web.rb
147
+ - lib/iptables_web/cli.rb
148
+ - lib/iptables_web/cli/command/install.rb
149
+ - lib/iptables_web/cli/command/update.rb
150
+ - lib/iptables_web/cli/import.rb
151
+ - lib/iptables_web/cli/logged_output.rb
152
+ - lib/iptables_web/cli/pid_file.rb
127
153
  - lib/iptables_web/configuration.rb
128
154
  - lib/iptables_web/crontab.rb
129
155
  - lib/iptables_web/iptables.rb