net-openvpn 0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +48 -0
- data/lib/net/openvpn.rb +30 -0
- data/lib/net/openvpn/client_config.rb +48 -0
- data/lib/net/openvpn/host.rb +32 -0
- data/lib/net/openvpn/parser/server_config.rb +33 -0
- data/lib/net/openvpn/server.rb +36 -0
- data/net-openvpn.gemspec +18 -0
- metadata +55 -0
data/README.md
ADDED
@@ -0,0 +1,48 @@
|
|
1
|
+
# Net-Openvpn
|
2
|
+
|
3
|
+
Net-Openvpn is a gem for configuring a local OpenVPN installation.
|
4
|
+
|
5
|
+
## Usage
|
6
|
+
|
7
|
+
### Server configuration
|
8
|
+
|
9
|
+
Modifying the config for a server (config file will be called `auckland-office.conf`):
|
10
|
+
|
11
|
+
```ruby
|
12
|
+
server = Net::Openvpn.server("auckland-office")
|
13
|
+
server.set :port, 1194
|
14
|
+
server.save
|
15
|
+
```
|
16
|
+
|
17
|
+
### Host Configuration (read: client-config-directive)
|
18
|
+
|
19
|
+
This is how you set the IP address of a VPN host with the hostname `optimus`:
|
20
|
+
|
21
|
+
```ruby
|
22
|
+
host = Net::Openvpn.host("optimus")
|
23
|
+
host.ip = 10.8.0.24
|
24
|
+
host.network = 10.8.0.0
|
25
|
+
host.save
|
26
|
+
```
|
27
|
+
|
28
|
+
This would create a file at `/etc/openvpn/ccd/optimus` containing the following:
|
29
|
+
|
30
|
+
```
|
31
|
+
ifconfig-push 10.8.0.24 10.8.0.0
|
32
|
+
```
|
33
|
+
|
34
|
+
So that any host connecting to the VPN with a hostname of `optimus` get assigned `10.8.0.24`.
|
35
|
+
|
36
|
+
## Rails Permissions
|
37
|
+
|
38
|
+
If you are running rails and you want to give the rails user access, you could do it like this:
|
39
|
+
|
40
|
+
```sh
|
41
|
+
groupadd openvpn
|
42
|
+
chown root.openvpn /etc/openvpn -R
|
43
|
+
chmod ug+rwx /etc/openvpn -R
|
44
|
+
chmod o-rwx /etc/openvpn -R
|
45
|
+
cd /etc/openvpn
|
46
|
+
chmod g-rwx easy-rsa *.key *.crt *.pem
|
47
|
+
usermod -aG openvpn rails-app-user
|
48
|
+
```
|
data/lib/net/openvpn.rb
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'net/openvpn/server'
|
2
|
+
require 'net/openvpn/host'
|
3
|
+
require 'net/openvpn/client_config'
|
4
|
+
require 'net/openvpn/parser/server_config'
|
5
|
+
|
6
|
+
module Net
|
7
|
+
module Openvpn
|
8
|
+
class << self
|
9
|
+
|
10
|
+
def basepath(path="")
|
11
|
+
path = "/#{path}" unless path.empty?
|
12
|
+
"/etc/openvpn#{path}"
|
13
|
+
end
|
14
|
+
|
15
|
+
def ccdpath(path="")
|
16
|
+
path = "/#{path}" unless path.empty?
|
17
|
+
basepath "ccd#{path}"
|
18
|
+
end
|
19
|
+
|
20
|
+
def host(hostname)
|
21
|
+
Net::Openvpn::Host.new(hostname)
|
22
|
+
end
|
23
|
+
|
24
|
+
def server(name)
|
25
|
+
Net::Openvpn::Server.new(name)
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
module Net
|
2
|
+
module Openvpn
|
3
|
+
class ClientConfig
|
4
|
+
|
5
|
+
def initialize(hostname)
|
6
|
+
@hostname = hostname
|
7
|
+
load if exists?
|
8
|
+
end
|
9
|
+
|
10
|
+
def load
|
11
|
+
ccd = File.read(path)
|
12
|
+
matches = ccd.match /ifconfig-push ([0-9\.]+) ([0-9\.]+)/
|
13
|
+
@ip = matches[1]
|
14
|
+
@network = matches[2]
|
15
|
+
end
|
16
|
+
|
17
|
+
def path
|
18
|
+
Net::Openvpn.ccdpath @hostname
|
19
|
+
end
|
20
|
+
|
21
|
+
def exists?
|
22
|
+
File.exists? path
|
23
|
+
end
|
24
|
+
|
25
|
+
def ip=(ip)
|
26
|
+
@ip = ip
|
27
|
+
end
|
28
|
+
|
29
|
+
def network=(network)
|
30
|
+
@network = network
|
31
|
+
end
|
32
|
+
|
33
|
+
def validate!
|
34
|
+
raise ArgumentError, "No IP set!" if @ip.nil? or @ip.empty?
|
35
|
+
raise ArgumentError, "No network set!" if @network.nil? or @network.empty?
|
36
|
+
end
|
37
|
+
|
38
|
+
def save
|
39
|
+
validate!
|
40
|
+
|
41
|
+
File.open(path, "w") do |f|
|
42
|
+
f.puts "ifconfig-push #{@ip} #{@network}"
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module Net
|
2
|
+
module Openvpn
|
3
|
+
class Host
|
4
|
+
|
5
|
+
def initialize(hostname)
|
6
|
+
@hostname = hostname
|
7
|
+
@config = Net::Openvpn::ClientConfig.new(@hostname)
|
8
|
+
end
|
9
|
+
|
10
|
+
def generate_key
|
11
|
+
|
12
|
+
end
|
13
|
+
|
14
|
+
def generate_ovpn
|
15
|
+
|
16
|
+
end
|
17
|
+
|
18
|
+
def ip=(ip)
|
19
|
+
@config.ip = ip
|
20
|
+
end
|
21
|
+
|
22
|
+
def network=(network)
|
23
|
+
@config.network = network
|
24
|
+
end
|
25
|
+
|
26
|
+
def save
|
27
|
+
@config.save
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module Net
|
2
|
+
module Openvpn
|
3
|
+
module Parser
|
4
|
+
module ServerConfig
|
5
|
+
class << self
|
6
|
+
|
7
|
+
def parse(path)
|
8
|
+
config = {}
|
9
|
+
|
10
|
+
File.read(path).each_line do |line|
|
11
|
+
next if line =~ /^$/
|
12
|
+
parts = line.split(" ")
|
13
|
+
key = parts.first
|
14
|
+
value = parts[1..parts.size].join(" ")
|
15
|
+
config[key.to_sym] = value
|
16
|
+
end
|
17
|
+
|
18
|
+
config
|
19
|
+
end
|
20
|
+
|
21
|
+
def save(path, config)
|
22
|
+
File.open(path, "w") do |f|
|
23
|
+
config.each do |key, value|
|
24
|
+
f.puts "#{key} #{value}"
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module Net
|
2
|
+
module Openvpn
|
3
|
+
class Server
|
4
|
+
|
5
|
+
def initialize(name)
|
6
|
+
@name = name
|
7
|
+
load if exists?
|
8
|
+
end
|
9
|
+
|
10
|
+
def load
|
11
|
+
@config = Net::Openvpn::Parser::ServerConfig.parse(path)
|
12
|
+
end
|
13
|
+
|
14
|
+
def get(key)
|
15
|
+
@config[key]
|
16
|
+
end
|
17
|
+
|
18
|
+
def set(key, value)
|
19
|
+
@config[key] = value
|
20
|
+
end
|
21
|
+
|
22
|
+
def path
|
23
|
+
Net::Openvpn.basepath "#{@name}.conf"
|
24
|
+
end
|
25
|
+
|
26
|
+
def exists?
|
27
|
+
File.exists? path
|
28
|
+
end
|
29
|
+
|
30
|
+
def save
|
31
|
+
Net::Openvpn::Parser::ServerConfig.save(path, @config)
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
data/net-openvpn.gemspec
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
#coding: utf-8
|
2
|
+
lib = File.expand_path("../lib", __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
|
5
|
+
Gem::Specification.new do |spec|
|
6
|
+
spec.name = "net-openvpn"
|
7
|
+
spec.version = "0.1"
|
8
|
+
spec.authors = ["Robert McLeod"]
|
9
|
+
spec.email = ["robert@penguinpower.co.nz"]
|
10
|
+
spec.description = %q{Net-Openvpn is an openvpn library for configuring a local OpenVPN service}
|
11
|
+
spec.summary = %q{Local OpenVPN configurator}
|
12
|
+
spec.homepage = "https://github.com/penguinpowernz/net-openvpn"
|
13
|
+
spec.license = "MIT"
|
14
|
+
|
15
|
+
spec.files = `git ls-files`.split($/)
|
16
|
+
spec.require_paths = ["lib", "lib/net", "lib/net/openvpn"]
|
17
|
+
end
|
18
|
+
|
metadata
ADDED
@@ -0,0 +1,55 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: net-openvpn
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: '0.1'
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Robert McLeod
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2013-12-07 00:00:00.000000000 Z
|
13
|
+
dependencies: []
|
14
|
+
description: Net-Openvpn is an openvpn library for configuring a local OpenVPN service
|
15
|
+
email:
|
16
|
+
- robert@penguinpower.co.nz
|
17
|
+
executables: []
|
18
|
+
extensions: []
|
19
|
+
extra_rdoc_files: []
|
20
|
+
files:
|
21
|
+
- README.md
|
22
|
+
- lib/net/openvpn.rb
|
23
|
+
- lib/net/openvpn/client_config.rb
|
24
|
+
- lib/net/openvpn/host.rb
|
25
|
+
- lib/net/openvpn/parser/server_config.rb
|
26
|
+
- lib/net/openvpn/server.rb
|
27
|
+
- net-openvpn.gemspec
|
28
|
+
homepage: https://github.com/penguinpowernz/net-openvpn
|
29
|
+
licenses:
|
30
|
+
- MIT
|
31
|
+
post_install_message:
|
32
|
+
rdoc_options: []
|
33
|
+
require_paths:
|
34
|
+
- lib
|
35
|
+
- lib/net
|
36
|
+
- lib/net/openvpn
|
37
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
38
|
+
none: false
|
39
|
+
requirements:
|
40
|
+
- - ! '>='
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
version: '0'
|
43
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
44
|
+
none: false
|
45
|
+
requirements:
|
46
|
+
- - ! '>='
|
47
|
+
- !ruby/object:Gem::Version
|
48
|
+
version: '0'
|
49
|
+
requirements: []
|
50
|
+
rubyforge_project:
|
51
|
+
rubygems_version: 1.8.25
|
52
|
+
signing_key:
|
53
|
+
specification_version: 3
|
54
|
+
summary: Local OpenVPN configurator
|
55
|
+
test_files: []
|