netsoul 1.9.2 → 1.9.3
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
- data/README.md +18 -1
- data/bin/netsoul-ruby +4 -86
- data/lib/netsoul/client.rb +81 -0
- data/lib/netsoul/version.rb +1 -1
- metadata +2 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 40ae5cdd054a7d3eb6d72265a45714d49367e18f
|
4
|
+
data.tar.gz: 6046d54fe9e388c0dd33ffde354d69205c1bc062
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e4937e3a77f5d7a3fdd3cf916a5d1d235c05baaf2622ebdcd9d68741f136f97d00d0b39f815b72eef8346e0c6bb9d426ed450edc4978273c1ee6313616014830
|
7
|
+
data.tar.gz: 87271293e474120ff9d712135250b2bcd166bf22c45dbc7a37b60298601ba98c4a7e83de32bf8d483e6ad360293675775d8d41ec21ec4060855fbdb1e2b02740
|
data/README.md
CHANGED
@@ -86,7 +86,24 @@ netsoul-ruby -config netsoul-config.yml
|
|
86
86
|
## Use the library in custom Netsoul Ruby client
|
87
87
|
|
88
88
|
Look at the client implementation in this gem: [https://github.com/fenicks/netsoul-ruby/blob/master/bin/netsoul-ruby]().
|
89
|
-
This client is implemented in less than
|
89
|
+
This client is implemented in less than 80 lines of code ; including option parser, client reconnection, ...
|
90
|
+
|
91
|
+
```ruby
|
92
|
+
require 'netsou/client'
|
93
|
+
|
94
|
+
c = Netsoul::Client.new options[:user_opts]
|
95
|
+
c.connect
|
96
|
+
# ...
|
97
|
+
if c.started
|
98
|
+
# ...
|
99
|
+
c.sock_send str
|
100
|
+
# ...
|
101
|
+
msg = c.sock_get
|
102
|
+
#...
|
103
|
+
end
|
104
|
+
# ...
|
105
|
+
c.disconnect
|
106
|
+
```
|
90
107
|
|
91
108
|
## Contributing
|
92
109
|
|
data/bin/netsoul-ruby
CHANGED
@@ -3,90 +3,7 @@
|
|
3
3
|
lib = File.expand_path('../../lib', __FILE__)
|
4
4
|
$LOAD_PATH.unshift lib unless $LOAD_PATH.include?(lib)
|
5
5
|
|
6
|
-
require 'netsoul/
|
7
|
-
require 'netsoul/errors'
|
8
|
-
require 'netsoul/logging'
|
9
|
-
require 'netsoul/message'
|
10
|
-
require 'socket'
|
11
|
-
|
12
|
-
module Netsoul
|
13
|
-
class Client
|
14
|
-
include Logging
|
15
|
-
attr_reader :started
|
16
|
-
SOCKET_READ_TIMEOUT = 12 * 60
|
17
|
-
SOCKET_WRITE_TIMEOUT = 10
|
18
|
-
|
19
|
-
def initialize(*args)
|
20
|
-
opts = args.last.is_a?(Hash) ? args.last : {}
|
21
|
-
@config = Config.new(opts)
|
22
|
-
@started = false
|
23
|
-
end
|
24
|
-
|
25
|
-
def auth_ag
|
26
|
-
sock_send(Message.auth_ag)
|
27
|
-
fail Netsoul::IdentificationError, 'Identification failed.'.freeze unless sock_get.split(' ')[1] == '002'.freeze
|
28
|
-
end
|
29
|
-
private :auth_ag
|
30
|
-
|
31
|
-
def auth_method
|
32
|
-
if @config.auth_method == :krb5
|
33
|
-
sock_send(Message.kerberos_auth(@config))
|
34
|
-
else
|
35
|
-
sock_send(Message.standard_auth(@config))
|
36
|
-
end
|
37
|
-
fail Netsoul::AuthenticationError, 'Authentication failed. See your config file or environment variables'.freeze unless sock_get.split(' ')[1] == '002'
|
38
|
-
end
|
39
|
-
private :auth_method
|
40
|
-
|
41
|
-
def auth_status
|
42
|
-
sock_send(Message.attach)
|
43
|
-
sock_send(Message.user_state(@config.state, Time.now.to_i))
|
44
|
-
end
|
45
|
-
private :auth_status
|
46
|
-
|
47
|
-
def connect
|
48
|
-
@sock = TCPSocket.new(@config.server_host, @config.server_port)
|
49
|
-
fail Netsoul::SocketError, 'Could not open a socket. Connection is unavailable.'.freeze unless @sock
|
50
|
-
_cmd, _socket_num, md5_hash, client_ip, client_port, _server_timestamp = sock_get.split
|
51
|
-
|
52
|
-
@config.build_user_connection_info md5_hash: md5_hash, client_ip: client_ip, client_port: client_port
|
53
|
-
|
54
|
-
auth_ag
|
55
|
-
auth_method
|
56
|
-
auth_status
|
57
|
-
|
58
|
-
@started = true
|
59
|
-
end
|
60
|
-
|
61
|
-
def disconnect
|
62
|
-
sock_send(Message.ns_exit)
|
63
|
-
ensure
|
64
|
-
sock_close
|
65
|
-
end
|
66
|
-
|
67
|
-
def sock_send(str)
|
68
|
-
_, sock = IO.select(nil, [@sock], nil, SOCKET_WRITE_TIMEOUT)
|
69
|
-
fail Netsoul::SocketError, 'Timeout or fail on write socket' if sock.nil? || sock.empty?
|
70
|
-
sock.first.puts str
|
71
|
-
log :info, "[send] #{str.chomp}"
|
72
|
-
end
|
73
|
-
|
74
|
-
def sock_get
|
75
|
-
sock, = IO.select([@sock], nil, nil, SOCKET_READ_TIMEOUT)
|
76
|
-
fail Netsoul::SocketError, 'Timeout or fail on read socket' if sock.nil? || sock.empty?
|
77
|
-
res = sock.first.gets
|
78
|
-
log :info, "[get ] #{res.chomp}" if res
|
79
|
-
res || ''
|
80
|
-
end
|
81
|
-
|
82
|
-
def sock_close
|
83
|
-
@started = false
|
84
|
-
@sock.close
|
85
|
-
rescue
|
86
|
-
nil
|
87
|
-
end
|
88
|
-
end
|
89
|
-
end
|
6
|
+
require 'netsoul/client'
|
90
7
|
|
91
8
|
$stderr.sync = true
|
92
9
|
require 'optparse'
|
@@ -110,6 +27,7 @@ OptionParser.new do |opts|
|
|
110
27
|
exit 42
|
111
28
|
end
|
112
29
|
end.parse!
|
30
|
+
|
113
31
|
if options.empty? || options[:user_opts].size == 0
|
114
32
|
unless ENV.to_a.count { |k, _v| %w(NETSOUL_LOGIN NETSOUL_SOCKS_PASSWORD NETSOUL_LOGIN NETSOUL_UNIX_PASSWORD NETSOUL_AUTH_METHOD).include?(k) } >= 2
|
115
33
|
puts '[ERROR] You have to specify a configuration file or environment variables'
|
@@ -118,8 +36,8 @@ if options.empty? || options[:user_opts].size == 0
|
|
118
36
|
end
|
119
37
|
|
120
38
|
retry_count = 10
|
121
|
-
retry_wait_time =
|
122
|
-
RETRY_WAIT_FACTOR =
|
39
|
+
retry_wait_time = 1.0
|
40
|
+
RETRY_WAIT_FACTOR = 2.0 # Each time retry is called in Exception block, current 'retry_wait_time' is increased with this factor
|
123
41
|
begin
|
124
42
|
c = Netsoul::Client.new options[:user_opts]
|
125
43
|
c.connect
|
@@ -0,0 +1,81 @@
|
|
1
|
+
require_relative '../netsoul'
|
2
|
+
require 'socket'
|
3
|
+
|
4
|
+
module Netsoul
|
5
|
+
class Client
|
6
|
+
include Logging
|
7
|
+
attr_reader :started
|
8
|
+
SOCKET_READ_TIMEOUT = 12 * 60
|
9
|
+
SOCKET_WRITE_TIMEOUT = 10
|
10
|
+
|
11
|
+
def initialize(*args)
|
12
|
+
opts = args.last.is_a?(Hash) ? args.last : {}
|
13
|
+
@config = Config.new(opts)
|
14
|
+
@started = false
|
15
|
+
end
|
16
|
+
|
17
|
+
def auth_ag
|
18
|
+
sock_send(Message.auth_ag)
|
19
|
+
fail Netsoul::IdentificationError, 'Identification failed.'.freeze unless sock_get.split(' ')[1] == '002'.freeze
|
20
|
+
end
|
21
|
+
private :auth_ag
|
22
|
+
|
23
|
+
def auth_method
|
24
|
+
if @config.auth_method == :krb5
|
25
|
+
sock_send(Message.kerberos_auth(@config))
|
26
|
+
else
|
27
|
+
sock_send(Message.standard_auth(@config))
|
28
|
+
end
|
29
|
+
fail Netsoul::AuthenticationError, 'Authentication failed. See your config file or environment variables'.freeze unless sock_get.split(' ')[1] == '002'
|
30
|
+
end
|
31
|
+
private :auth_method
|
32
|
+
|
33
|
+
def auth_status
|
34
|
+
sock_send(Message.attach)
|
35
|
+
sock_send(Message.user_state(@config.state, Time.now.to_i))
|
36
|
+
end
|
37
|
+
private :auth_status
|
38
|
+
|
39
|
+
def connect
|
40
|
+
@sock = TCPSocket.new(@config.server_host, @config.server_port)
|
41
|
+
fail Netsoul::SocketError, 'Could not open a socket. Connection is unavailable.'.freeze unless @sock
|
42
|
+
_cmd, _socket_num, md5_hash, client_ip, client_port, _server_timestamp = sock_get.split
|
43
|
+
|
44
|
+
@config.build_user_connection_info md5_hash: md5_hash, client_ip: client_ip, client_port: client_port
|
45
|
+
|
46
|
+
auth_ag
|
47
|
+
auth_method
|
48
|
+
auth_status
|
49
|
+
|
50
|
+
@started = true
|
51
|
+
end
|
52
|
+
|
53
|
+
def disconnect
|
54
|
+
sock_send(Message.ns_exit)
|
55
|
+
ensure
|
56
|
+
sock_close
|
57
|
+
end
|
58
|
+
|
59
|
+
def sock_send(str)
|
60
|
+
_, sock = IO.select(nil, [@sock], nil, SOCKET_WRITE_TIMEOUT)
|
61
|
+
fail Netsoul::SocketError, 'Timeout or fail on write socket' if sock.nil? || sock.empty?
|
62
|
+
sock.first.puts str
|
63
|
+
log :info, "[send] #{str.chomp}"
|
64
|
+
end
|
65
|
+
|
66
|
+
def sock_get
|
67
|
+
sock, = IO.select([@sock], nil, nil, SOCKET_READ_TIMEOUT)
|
68
|
+
fail Netsoul::SocketError, 'Timeout or fail on read socket' if sock.nil? || sock.empty?
|
69
|
+
res = sock.first.gets
|
70
|
+
log :info, "[get ] #{res.chomp}" if res
|
71
|
+
res || ''
|
72
|
+
end
|
73
|
+
|
74
|
+
def sock_close
|
75
|
+
@started = false
|
76
|
+
@sock.close
|
77
|
+
rescue
|
78
|
+
nil
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
data/lib/netsoul/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: netsoul
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.9.
|
4
|
+
version: 1.9.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Christian Kakesa
|
@@ -153,6 +153,7 @@ files:
|
|
153
153
|
- ext/netsoul_kerberos/kerberos.h
|
154
154
|
- ext/netsoul_kerberos/netsoul_kerberos.c
|
155
155
|
- lib/netsoul.rb
|
156
|
+
- lib/netsoul/client.rb
|
156
157
|
- lib/netsoul/config.rb
|
157
158
|
- lib/netsoul/errors.rb
|
158
159
|
- lib/netsoul/location.rb
|