pwnix-api-client 1.3 → 1.4
Sign up to get free protection for your applications and to get access to all the features.
- data/.bundle/config +1 -0
- data/Gemfile +1 -3
- data/Gemfile.lock +1 -1
- data/bin/console.sh +7 -0
- data/lib/pwnix-api-client/api_client.rb +123 -23
- data/lib/pwnix-api-client/config/config_file.rb +30 -0
- data/lib/pwnix-api-client/mode.rb +7 -9
- data/lib/pwnix-api-client/node.rb +68 -0
- data/lib/pwnix-api-client/node/api_config.rb +19 -0
- data/lib/pwnix-api-client/node/client/client_manager.rb +79 -0
- data/lib/pwnix-api-client/node/client/console_client.rb +51 -0
- data/lib/pwnix-api-client/node/cookbook.rb +23 -0
- data/lib/pwnix-api-client/service.rb +9 -11
- data/lib/pwnix-api-client/shell.rb +6 -8
- data/lib/pwnix-api-client/shell_receiver_config.rb +3 -5
- data/lib/pwnix-api-client/system.rb +5 -7
- data/lib/pwnix-api-client/system/hardware.rb +2 -4
- data/lib/pwnix-api-client/system/logs.rb +5 -7
- data/lib/pwnix-api-client/system/network.rb +18 -10
- data/lib/pwnix-api-client/system/os.rb +12 -10
- data/lib/pwnix-api-client/system/sms.rb +5 -16
- data/lib/pwnix-api-client/system/ssh.rb +3 -5
- data/lib/pwnix-api-client/system/utility.rb +30 -0
- data/lib/pwnix-api-client/version.rb +1 -1
- data/util/console.rb +0 -0
- metadata +16 -8
- data/lib/pwnix-api-client/system/server.rb +0 -37
data/.bundle/config
CHANGED
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
data/bin/console.sh
ADDED
@@ -1,46 +1,137 @@
|
|
1
1
|
require 'httparty'
|
2
|
+
require 'json'
|
3
|
+
require 'singleton'
|
4
|
+
|
5
|
+
require_relative 'config/config_file'
|
2
6
|
|
3
7
|
module Pwnix
|
4
8
|
module Api
|
5
9
|
module Client
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
+
class Config < Pwnix::Api::Client::ConfigFile
|
11
|
+
|
12
|
+
include Singleton
|
13
|
+
|
14
|
+
def initialize
|
15
|
+
@config_file = "/opt/pwnix/pwnix-config/pwnix-ui/config.json"
|
16
|
+
read
|
17
|
+
end
|
18
|
+
|
19
|
+
def base_uri
|
20
|
+
@config_hash['api_uri']
|
21
|
+
end
|
22
|
+
|
23
|
+
def debug_mode
|
24
|
+
@config_hash['debug_mode']
|
25
|
+
end
|
26
|
+
|
27
|
+
def [](key)
|
28
|
+
@config_hash[key]
|
29
|
+
end
|
10
30
|
end
|
11
31
|
end
|
12
32
|
end
|
13
33
|
end
|
14
34
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
35
|
+
module Pwnix
|
36
|
+
module Api
|
37
|
+
module Client
|
38
|
+
class ErrorQueue
|
39
|
+
include Singleton
|
40
|
+
|
41
|
+
attr_accessor :queue
|
42
|
+
|
43
|
+
def initialize
|
44
|
+
@queue =[]
|
45
|
+
end
|
46
|
+
|
47
|
+
def clear
|
48
|
+
@queue = []
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
20
55
|
|
21
56
|
module Pwnix
|
22
57
|
module Api
|
23
58
|
module Client
|
59
|
+
module HTTPartyTime
|
24
60
|
|
61
|
+
def self.included(base)
|
62
|
+
base.base_uri Pwnix::Api::Client::Config.instance['api_base_uri']
|
63
|
+
base.basic_auth Pwnix::Api::Client::Config.instance['api_username'],
|
64
|
+
Pwnix::Api::Client::Config.instance['api_password']
|
65
|
+
base.debug_output
|
66
|
+
base.format :json
|
25
67
|
|
26
|
-
=
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
68
|
+
@@errors = ErrorQueue.instance
|
69
|
+
end
|
70
|
+
|
71
|
+
def has_errors?
|
72
|
+
!@@errors.queue.empty?
|
73
|
+
end
|
74
|
+
|
75
|
+
def errors
|
76
|
+
@@errors.queue
|
77
|
+
end
|
78
|
+
|
79
|
+
def last_error
|
80
|
+
@@errors.queue.last
|
81
|
+
end
|
82
|
+
|
83
|
+
def clear_errors
|
84
|
+
@@errors.queue = []
|
85
|
+
end
|
86
|
+
|
87
|
+
def safe_api_call(endpoint,params={})
|
88
|
+
begin
|
89
|
+
|
90
|
+
response = self.class.post(endpoint,{:body => params})
|
91
|
+
case response.code
|
92
|
+
|
93
|
+
when 200
|
94
|
+
|
95
|
+
# TODO - everything should return a hash
|
96
|
+
parsed_response = response.parsed_response['result']
|
97
|
+
|
98
|
+
if parsed_response.is_a? Hash
|
99
|
+
|
100
|
+
if parsed_response['error']
|
101
|
+
@@errors.queue.push "Handled exception: #{parsed_response['error']}"
|
102
|
+
end
|
103
|
+
|
104
|
+
end
|
34
105
|
|
35
|
-
|
36
|
-
|
37
|
-
|
106
|
+
return parsed_response
|
107
|
+
|
108
|
+
when 404
|
109
|
+
@@errors.queue.push "404 - not found! #{endpoint} #{parsed_response}"
|
110
|
+
|
111
|
+
when 500...600
|
112
|
+
@@errors.queue.push "500 - server exception! #{response}"
|
113
|
+
end
|
114
|
+
rescue Exception => e
|
115
|
+
@@errors.queue.push "Client error: #{e}"
|
116
|
+
return nil
|
38
117
|
end
|
39
118
|
end
|
40
119
|
|
41
120
|
end
|
42
|
-
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
43
124
|
|
125
|
+
require_relative 'system'
|
126
|
+
require_relative 'shell'
|
127
|
+
require_relative 'shell_receiver_config'
|
128
|
+
require_relative 'mode'
|
129
|
+
require_relative 'node'
|
130
|
+
require_relative 'service'
|
131
|
+
|
132
|
+
module Pwnix
|
133
|
+
module Api
|
134
|
+
module Client
|
44
135
|
class ApiClient
|
45
136
|
|
46
137
|
attr_accessor :base_uri
|
@@ -49,10 +140,13 @@ module Pwnix
|
|
49
140
|
attr_accessor :shell_receiver_config
|
50
141
|
attr_accessor :services
|
51
142
|
attr_accessor :modes
|
143
|
+
attr_accessor :node
|
144
|
+
attr_accessor :error_string
|
52
145
|
|
146
|
+
include HTTParty
|
147
|
+
include HTTPartyTime
|
53
148
|
|
54
149
|
def initialize(config={})
|
55
|
-
|
56
150
|
@shell_receiver_config = ShellReceiverConfig.new
|
57
151
|
|
58
152
|
@shells = {
|
@@ -66,9 +160,11 @@ module Pwnix
|
|
66
160
|
}
|
67
161
|
|
68
162
|
@modes = {
|
69
|
-
"normal_mode" => Mode.new("normal_mode")
|
163
|
+
"normal_mode" => Mode.new("normal_mode")
|
70
164
|
}
|
71
165
|
|
166
|
+
@node = Node.new
|
167
|
+
|
72
168
|
@system = System.new
|
73
169
|
|
74
170
|
@services = {
|
@@ -80,8 +176,12 @@ module Pwnix
|
|
80
176
|
"stealth" => Service.new("stealth"),
|
81
177
|
"text_to_bash" => Service.new("text_to_bash")
|
82
178
|
}
|
179
|
+
end
|
83
180
|
|
181
|
+
def connected?
|
182
|
+
safe_api_call("/node/connected") == "ok"
|
84
183
|
end
|
184
|
+
|
85
185
|
end
|
86
186
|
end
|
87
187
|
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module Pwnix
|
2
|
+
module Api
|
3
|
+
module Client
|
4
|
+
class ConfigFile
|
5
|
+
|
6
|
+
def initialize(config_file)
|
7
|
+
@config_file=config_file
|
8
|
+
@config_hash = JSON.parse(File.read(@config_file))
|
9
|
+
end
|
10
|
+
|
11
|
+
def [](key, value=nil)
|
12
|
+
if value
|
13
|
+
@config_hash[key] = value
|
14
|
+
else
|
15
|
+
@config_hash[key]
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def read
|
20
|
+
@config_hash = JSON.parse(File.read(@config_file))
|
21
|
+
end
|
22
|
+
|
23
|
+
def write
|
24
|
+
File.open(@config_file,'w'){ |f| JSON.dump(@config_hash, f) }
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -3,36 +3,34 @@ module Pwnix
|
|
3
3
|
module Client
|
4
4
|
class Mode
|
5
5
|
include HTTParty
|
6
|
-
|
7
|
-
debug_output
|
8
|
-
format :json
|
6
|
+
include HTTPartyTime
|
9
7
|
|
10
8
|
def initialize(mode_name)
|
11
9
|
@mode_name = mode_name
|
12
10
|
end
|
13
11
|
|
14
12
|
def start
|
15
|
-
|
13
|
+
safe_api_call("/mode/#{@mode_name}/start")
|
16
14
|
end
|
17
15
|
|
18
16
|
def stop
|
19
|
-
|
17
|
+
safe_api_call("/mode/#{@mode_name}/stop")
|
20
18
|
end
|
21
19
|
|
22
20
|
def status
|
23
|
-
|
21
|
+
safe_api_call("/mode/#{@mode_name}/status")
|
24
22
|
end
|
25
23
|
|
26
24
|
def status_string
|
27
|
-
|
25
|
+
safe_api_call("/mode/#{@mode_name}/status_string")
|
28
26
|
end
|
29
27
|
|
30
28
|
def running?
|
31
|
-
|
29
|
+
safe_api_call("/mode/#{@mode_name}/running")
|
32
30
|
end
|
33
31
|
|
34
32
|
def available?
|
35
|
-
|
33
|
+
safe_api_call("/mode/#{@mode_name}/available")
|
36
34
|
end
|
37
35
|
|
38
36
|
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
require_relative 'node/api_config'
|
2
|
+
require_relative 'node/cookbook'
|
3
|
+
require_relative 'node/client/client_manager'
|
4
|
+
require_relative 'node/client/console_client'
|
5
|
+
|
6
|
+
module Pwnix
|
7
|
+
module Api
|
8
|
+
module Client
|
9
|
+
class Node
|
10
|
+
include HTTParty
|
11
|
+
include HTTPartyTime
|
12
|
+
|
13
|
+
attr_accessor :client_manager, :api_config
|
14
|
+
|
15
|
+
def initialize
|
16
|
+
@client_manager = Pwnix::Api::Client::ClientManager.new
|
17
|
+
@api_config = Pwnix::Api::Client::ApiConfig.new
|
18
|
+
end
|
19
|
+
|
20
|
+
def connected?
|
21
|
+
return true if safe_api_call("/node/check") == "ok"
|
22
|
+
end
|
23
|
+
|
24
|
+
def cookbooks
|
25
|
+
cookbook_list = safe_api_call("/node/cookbook/list")
|
26
|
+
cookbooks = []
|
27
|
+
cookbook_list.each do |cookbook_name|
|
28
|
+
cookbooks << Cookbook.new(cookbook_name)
|
29
|
+
end
|
30
|
+
cookbooks
|
31
|
+
end
|
32
|
+
|
33
|
+
def status
|
34
|
+
safe_api_call("/node/status")
|
35
|
+
end
|
36
|
+
|
37
|
+
def version
|
38
|
+
safe_api_call("/node/version")
|
39
|
+
end
|
40
|
+
|
41
|
+
def release
|
42
|
+
safe_api_call("/node/release")
|
43
|
+
end
|
44
|
+
|
45
|
+
def last_commit(product)
|
46
|
+
safe_api_call("/node/last_commit", { :product => product } )
|
47
|
+
end
|
48
|
+
|
49
|
+
def update
|
50
|
+
safe_api_call("/node/update", { :options => {:timeout => 600} } )
|
51
|
+
end
|
52
|
+
|
53
|
+
def updating?
|
54
|
+
safe_api_call("/node/updating")
|
55
|
+
end
|
56
|
+
|
57
|
+
def clear
|
58
|
+
safe_api_call("/node/clear")
|
59
|
+
end
|
60
|
+
|
61
|
+
def restart
|
62
|
+
safe_api_call("/node/restart")
|
63
|
+
end
|
64
|
+
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Pwnix
|
2
|
+
module Api
|
3
|
+
module Client
|
4
|
+
class ApiConfig
|
5
|
+
include HTTParty
|
6
|
+
include HTTPartyTime
|
7
|
+
|
8
|
+
def dump
|
9
|
+
safe_api_call("/node/config/api/dump")
|
10
|
+
end
|
11
|
+
|
12
|
+
def set(config)
|
13
|
+
safe_api_call("/node/config/api/set", :config => config)
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
module Pwnix
|
2
|
+
module Api
|
3
|
+
module Client
|
4
|
+
class ClientManager
|
5
|
+
include HTTParty
|
6
|
+
include HTTPartyTime
|
7
|
+
|
8
|
+
#attr_accessor :clients
|
9
|
+
|
10
|
+
def initialize
|
11
|
+
@clients = []
|
12
|
+
end
|
13
|
+
|
14
|
+
def status
|
15
|
+
safe_api_call("/node/clients/status")
|
16
|
+
end
|
17
|
+
|
18
|
+
# Public: Check if the client exists in the API
|
19
|
+
#
|
20
|
+
# API might be down, so lets make sure this returns a true or false
|
21
|
+
# othewise it could be an exception string
|
22
|
+
#
|
23
|
+
def client_exists?(id)
|
24
|
+
return true if safe_api_call("/node/clients/#{id}/exist") == true
|
25
|
+
false
|
26
|
+
end
|
27
|
+
|
28
|
+
def create(type)
|
29
|
+
# Go ahead and try to create the client
|
30
|
+
id = safe_api_call("/node/clients/create", :type => type )
|
31
|
+
|
32
|
+
# Check to make sure it was successfully created before adding it to our
|
33
|
+
# local list of clients
|
34
|
+
if client_exists?(id)
|
35
|
+
@clients << Pwnix::Api::Client::ConsoleClient.new(id)
|
36
|
+
return true
|
37
|
+
end
|
38
|
+
|
39
|
+
false
|
40
|
+
end
|
41
|
+
|
42
|
+
def get_client(id)
|
43
|
+
@clients.select{|c| c.id == id }.first
|
44
|
+
end
|
45
|
+
|
46
|
+
def destroy_client(id)
|
47
|
+
if client_exists?(id)
|
48
|
+
destroyable_client = @clients.select{|c| c.id == id }.first
|
49
|
+
destroyable_client.disconnect
|
50
|
+
destroyable_client.destroy # destroy it remotely
|
51
|
+
@clients.delete(destroyable_client)
|
52
|
+
return true
|
53
|
+
end
|
54
|
+
false
|
55
|
+
end
|
56
|
+
|
57
|
+
def list
|
58
|
+
@clients = []
|
59
|
+
|
60
|
+
# Since the API & UI are disconnected, we need to check to see if there are
|
61
|
+
# any other remote clients at this time - we might be out of sync.
|
62
|
+
remote_clients = safe_api_call("/node/clients/list")
|
63
|
+
if remote_clients
|
64
|
+
remote_clients.each do |remote_client_id|
|
65
|
+
# Now go through our clients and see if we have an id that matches
|
66
|
+
# TODO - these ids should probably be hard to spoof - needs more
|
67
|
+
# thought than i have time for right now.
|
68
|
+
unless (@clients.select{|c| c.id == remote_client_id }).count > 0
|
69
|
+
@clients << Pwnix::Api::Client::ConsoleClient.new(remote_client_id)
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
@clients
|
74
|
+
end
|
75
|
+
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
module Pwnix
|
2
|
+
module Api
|
3
|
+
module Client
|
4
|
+
class ConsoleClient
|
5
|
+
include HTTParty
|
6
|
+
include HTTPartyTime
|
7
|
+
|
8
|
+
attr_reader :id
|
9
|
+
attr_reader :type
|
10
|
+
|
11
|
+
def initialize(id)
|
12
|
+
@id = id
|
13
|
+
@type = "console_client"
|
14
|
+
end
|
15
|
+
|
16
|
+
def status
|
17
|
+
safe_api_call("/node/clients/#{@id}/status")
|
18
|
+
end
|
19
|
+
|
20
|
+
def config
|
21
|
+
safe_api_call("/node/clients/#{@id}/config")
|
22
|
+
end
|
23
|
+
|
24
|
+
def get_config_value(key)
|
25
|
+
safe_api_call("/node/clients/#{@id}/config/#{key}")
|
26
|
+
end
|
27
|
+
|
28
|
+
def set_config_value(key,value)
|
29
|
+
safe_api_call("/node/clients/#{@id}/config/#{key}/set", :value => value)
|
30
|
+
end
|
31
|
+
|
32
|
+
def connected?
|
33
|
+
safe_api_call("/node/clients/#{@id}/connected") == true
|
34
|
+
end
|
35
|
+
|
36
|
+
def connect
|
37
|
+
safe_api_call("/node/clients/#{@id}/connect")
|
38
|
+
end
|
39
|
+
|
40
|
+
def disconnect
|
41
|
+
safe_api_call("/node/clients/#{@id}/disconnect")
|
42
|
+
end
|
43
|
+
|
44
|
+
def destroy
|
45
|
+
safe_api_call("/node/clients/#{@id}/destroy")
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Pwnix
|
2
|
+
module Api
|
3
|
+
module Client
|
4
|
+
class Cookbook
|
5
|
+
include HTTParty
|
6
|
+
include HTTPartyTime
|
7
|
+
|
8
|
+
def initialize(name)
|
9
|
+
@name = name
|
10
|
+
end
|
11
|
+
|
12
|
+
def metadata
|
13
|
+
safe_api_call("/node/cookbook/#{@name}/metadata")
|
14
|
+
end
|
15
|
+
|
16
|
+
def name
|
17
|
+
safe_api_call("/node/cookbook/#{@name}/name")
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -3,44 +3,42 @@ module Pwnix
|
|
3
3
|
module Client
|
4
4
|
class Service
|
5
5
|
include HTTParty
|
6
|
-
|
7
|
-
debug_output
|
8
|
-
format :json
|
6
|
+
include HTTPartyTime
|
9
7
|
|
10
8
|
def initialize(service_name)
|
11
9
|
@service_name = service_name
|
12
10
|
end
|
13
11
|
|
14
12
|
def status
|
15
|
-
|
13
|
+
safe_api_call("/services/#{@service_name}/status")
|
16
14
|
end
|
17
15
|
|
18
16
|
def status_string
|
19
|
-
|
17
|
+
safe_api_call("/services/#{@service_name}/status_string")
|
20
18
|
end
|
21
19
|
|
22
20
|
def running?
|
23
|
-
|
21
|
+
safe_api_call("/services/#{@service_name}/running")
|
24
22
|
end
|
25
23
|
|
26
24
|
def available?
|
27
|
-
|
25
|
+
safe_api_call("/services/#{@service_name}/available")
|
28
26
|
end
|
29
27
|
|
30
28
|
def start(params)
|
31
|
-
|
29
|
+
safe_api_call("/services/#{@service_name}/start", params )
|
32
30
|
end
|
33
31
|
|
34
32
|
def stop
|
35
|
-
|
33
|
+
safe_api_call("/services/#{@service_name}/stop")
|
36
34
|
end
|
37
35
|
|
38
36
|
def enable(params={})
|
39
|
-
|
37
|
+
safe_api_call("/services/#{@service_name}/enable", params )
|
40
38
|
end
|
41
39
|
|
42
40
|
def disable
|
43
|
-
|
41
|
+
safe_api_call("/services/#{@service_name}/disable")
|
44
42
|
end
|
45
43
|
|
46
44
|
end
|
@@ -3,32 +3,30 @@
|
|
3
3
|
module Client
|
4
4
|
class Shell
|
5
5
|
include HTTParty
|
6
|
-
|
7
|
-
debug_output
|
8
|
-
format :json
|
6
|
+
include HTTPartyTime
|
9
7
|
|
10
8
|
def initialize(shell_name)
|
11
9
|
@shell_name = shell_name
|
12
10
|
end
|
13
11
|
|
14
12
|
def status
|
15
|
-
|
13
|
+
safe_api_call("/shells/#{@shell_name}/status")
|
16
14
|
end
|
17
15
|
|
18
16
|
def running?
|
19
|
-
|
17
|
+
safe_api_call("/shells/#{@shell_name}/running")
|
20
18
|
end
|
21
19
|
|
22
20
|
def configure(config={}) # Configuration options
|
23
|
-
|
21
|
+
safe_api_call("/shells/#{@shell_name}/configure", config )
|
24
22
|
end
|
25
23
|
|
26
24
|
def enable
|
27
|
-
|
25
|
+
safe_api_call("/shells/#{@shell_name}/enable")
|
28
26
|
end
|
29
27
|
|
30
28
|
def disable
|
31
|
-
|
29
|
+
safe_api_call("/shells/#{@shell_name}/disable")
|
32
30
|
end
|
33
31
|
|
34
32
|
end
|
@@ -3,16 +3,14 @@ module Pwnix
|
|
3
3
|
module Client
|
4
4
|
class ShellReceiverConfig
|
5
5
|
include HTTParty
|
6
|
-
|
7
|
-
debug_output
|
8
|
-
format :json
|
6
|
+
include HTTPartyTime
|
9
7
|
|
10
8
|
def backtrack_generate
|
11
|
-
|
9
|
+
safe_api_call("/shells/backtrack_receiver_config/generate")
|
12
10
|
end
|
13
11
|
|
14
12
|
def pwnix_generate
|
15
|
-
|
13
|
+
safe_api_call("/shells/pwnix_receiver_config/generate")
|
16
14
|
end
|
17
15
|
|
18
16
|
end
|
@@ -2,34 +2,32 @@ require_relative 'system/hardware'
|
|
2
2
|
require_relative 'system/logs'
|
3
3
|
require_relative 'system/network'
|
4
4
|
require_relative 'system/os'
|
5
|
-
require_relative 'system/server'
|
6
5
|
require_relative 'system/sms'
|
7
6
|
require_relative 'system/ssh'
|
7
|
+
require_relative 'system/utility'
|
8
8
|
|
9
9
|
module Pwnix
|
10
10
|
module Api
|
11
11
|
module Client
|
12
12
|
class System
|
13
13
|
include HTTParty
|
14
|
-
|
15
|
-
debug_output
|
16
|
-
format :json
|
14
|
+
include HTTPartyTime
|
17
15
|
|
18
16
|
attr_accessor :logs, :network, :hardware
|
19
|
-
attr_accessor :os, :
|
17
|
+
attr_accessor :os, :sms, :ssh, :utility
|
20
18
|
|
21
19
|
def initialize
|
22
20
|
@hardware = Hardware.new
|
23
21
|
@logs = Logs.new
|
24
22
|
@network = Network.new
|
25
23
|
@os = Os.new
|
26
|
-
@server = Server.new
|
27
24
|
@sms = Sms.new
|
28
25
|
@ssh = Ssh.new
|
26
|
+
@utility = Utility.new
|
29
27
|
end
|
30
28
|
|
31
29
|
def status
|
32
|
-
|
30
|
+
safe_api_call("/system/status")
|
33
31
|
end
|
34
32
|
|
35
33
|
end
|
@@ -3,12 +3,10 @@ module Pwnix
|
|
3
3
|
module Client
|
4
4
|
class Hardware
|
5
5
|
include HTTParty
|
6
|
-
|
7
|
-
debug_output
|
8
|
-
format :json
|
6
|
+
include HTTPartyTime
|
9
7
|
|
10
8
|
def status
|
11
|
-
|
9
|
+
safe_api_call("/system/hardware/status")
|
12
10
|
end
|
13
11
|
end
|
14
12
|
end
|
@@ -3,24 +3,22 @@ module Pwnix
|
|
3
3
|
module Client
|
4
4
|
class Logs
|
5
5
|
include HTTParty
|
6
|
-
|
7
|
-
debug_output
|
8
|
-
format :json
|
6
|
+
include HTTPartyTime
|
9
7
|
|
10
8
|
def list
|
11
|
-
|
9
|
+
safe_api_call("/system/logs/list")
|
12
10
|
end
|
13
11
|
|
14
12
|
def tail(name)
|
15
|
-
|
13
|
+
safe_api_call("/system/logs/tail", { :log_name => name } )
|
16
14
|
end
|
17
15
|
|
18
16
|
def head(name)
|
19
|
-
|
17
|
+
safe_api_call("/system/logs/head", { :log_name => name } )
|
20
18
|
end
|
21
19
|
|
22
20
|
def contents(name)
|
23
|
-
|
21
|
+
safe_api_call("/system/logs/contents", { :log_name => name } )
|
24
22
|
end
|
25
23
|
|
26
24
|
end
|
@@ -3,41 +3,49 @@ module Pwnix
|
|
3
3
|
module Client
|
4
4
|
class Network
|
5
5
|
include HTTParty
|
6
|
-
|
7
|
-
debug_output
|
8
|
-
format :json
|
6
|
+
include HTTPartyTime
|
9
7
|
|
10
8
|
def status
|
11
|
-
|
9
|
+
safe_api_call("/system/network/status")
|
10
|
+
end
|
11
|
+
|
12
|
+
|
13
|
+
def primary_dns
|
14
|
+
safe_api_call("/system/network/primary_dns")
|
12
15
|
end
|
13
16
|
|
14
17
|
def list_interfaces
|
15
|
-
details =
|
18
|
+
details = safe_api_call("/system/network/status")
|
16
19
|
# Read http://blog.jayfields.com/2008/03/ruby-inject.html if you're not super-familiar w/ inject
|
17
20
|
details.inject([]){|interface_list, (interface,interface_details)| interface_list << interface; }
|
18
21
|
end
|
19
22
|
|
20
23
|
# Done
|
21
24
|
def interface_status(interface)
|
22
|
-
|
25
|
+
safe_api_call("/system/network/#{interface}/status")
|
26
|
+
end
|
27
|
+
|
28
|
+
# Done
|
29
|
+
def interface_mode(interface)
|
30
|
+
safe_api_call("/system/network/#{interface}/mode")
|
23
31
|
end
|
24
32
|
|
25
33
|
# Done
|
26
34
|
def interface_reset(interface)
|
27
|
-
|
35
|
+
safe_api_call("/system/network/#{interface}/reset")
|
28
36
|
end
|
29
37
|
|
30
38
|
def interface_set_dhcp(interface)
|
31
|
-
|
39
|
+
safe_api_call("/system/network/#{interface}/dhcp/enable")
|
32
40
|
end
|
33
41
|
|
34
42
|
def interface_set_static_ip(interface,options)
|
35
43
|
# [ :ip, :netmask, :gateway, :dns]
|
36
|
-
|
44
|
+
safe_api_call("/system/network/#{interface}/static_ip/set", options )
|
37
45
|
end
|
38
46
|
|
39
47
|
def interface_set_mac(interface, mac=nil)
|
40
|
-
|
48
|
+
safe_api_call("/system/network/#{interface}/mac/set", { :mac => mac } )
|
41
49
|
end
|
42
50
|
|
43
51
|
end
|
@@ -3,36 +3,38 @@ module Pwnix
|
|
3
3
|
module Client
|
4
4
|
class Os
|
5
5
|
include HTTParty
|
6
|
-
|
7
|
-
debug_output
|
8
|
-
format :json
|
6
|
+
include HTTPartyTime
|
9
7
|
|
10
8
|
def status
|
11
|
-
|
9
|
+
safe_api_call("/system/os/status")
|
12
10
|
end
|
13
11
|
|
14
12
|
def filesystem
|
15
|
-
|
13
|
+
safe_api_call("/system/os/filesystem")
|
16
14
|
end
|
17
15
|
|
18
16
|
def netstat
|
19
|
-
|
17
|
+
safe_api_call("/system/os/netstat")
|
20
18
|
end
|
21
19
|
|
22
20
|
def cleanup
|
23
|
-
|
21
|
+
safe_api_call("/system/os/cleanup")
|
24
22
|
end
|
25
23
|
|
26
24
|
def restart
|
27
|
-
|
25
|
+
safe_api_call("/system/os/restart")
|
28
26
|
end
|
29
27
|
|
30
28
|
def hostname
|
31
|
-
|
29
|
+
safe_api_call("/system/os/hostname")
|
32
30
|
end
|
33
31
|
|
34
32
|
def set_hostname(hostname)
|
35
|
-
|
33
|
+
safe_api_call("/system/os/hostname/set", { :hostname => hostname } )
|
34
|
+
end
|
35
|
+
|
36
|
+
def set_password(username,password)
|
37
|
+
safe_api_call("/system/os/password/set", { :username => username, :password => password } )
|
36
38
|
end
|
37
39
|
|
38
40
|
end
|
@@ -3,30 +3,19 @@ module Pwnix
|
|
3
3
|
module Client
|
4
4
|
class Sms
|
5
5
|
include HTTParty
|
6
|
-
|
7
|
-
debug_output
|
8
|
-
format :json
|
6
|
+
include HTTPartyTime
|
9
7
|
|
10
8
|
def status
|
11
|
-
|
9
|
+
safe_api_call("/system/sms/status")
|
12
10
|
end
|
13
11
|
|
14
12
|
def set(options={})
|
15
|
-
|
16
|
-
"/system/sms/set",
|
17
|
-
:body => {
|
18
|
-
:configuration => options
|
19
|
-
}
|
20
|
-
).parsed_response['result']
|
13
|
+
safe_api_call("/system/sms/set", { :configuration => options })
|
21
14
|
end
|
22
15
|
|
23
16
|
def test(options={})
|
24
|
-
|
25
|
-
|
26
|
-
:body => {
|
27
|
-
:configuration => options
|
28
|
-
}
|
29
|
-
).parsed_response['result']
|
17
|
+
safe_api_call("/system/sms/test", { :configuration => options })
|
18
|
+
|
30
19
|
end
|
31
20
|
|
32
21
|
def hint
|
@@ -3,16 +3,14 @@ module Pwnix
|
|
3
3
|
module Client
|
4
4
|
class Ssh
|
5
5
|
include HTTParty
|
6
|
-
|
7
|
-
debug_output
|
8
|
-
format :json
|
6
|
+
include HTTPartyTime
|
9
7
|
|
10
8
|
def public_key
|
11
|
-
|
9
|
+
safe_api_call("/system/ssh/public_key")
|
12
10
|
end
|
13
11
|
|
14
12
|
def reset
|
15
|
-
|
13
|
+
safe_api_call("/system/ssh/reset")
|
16
14
|
end
|
17
15
|
|
18
16
|
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module Pwnix
|
2
|
+
module Api
|
3
|
+
module Client
|
4
|
+
class Utility
|
5
|
+
include HTTParty
|
6
|
+
include HTTPartyTime
|
7
|
+
|
8
|
+
def initialize
|
9
|
+
end
|
10
|
+
|
11
|
+
def ping(ip)
|
12
|
+
safe_api_call("/system/utility/ping", { :ip => ip } )
|
13
|
+
end
|
14
|
+
|
15
|
+
def nmap(ip)
|
16
|
+
safe_api_call("/system/utility/nmap", { :ip => ip } )
|
17
|
+
end
|
18
|
+
|
19
|
+
def traceroute(ip)
|
20
|
+
safe_api_call("/system/utility/traceroute", { :ip => ip } )
|
21
|
+
end
|
22
|
+
|
23
|
+
def run_command(command)
|
24
|
+
safe_api_call("/system/utility/run_command", { :command => command } )
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
data/util/console.rb
CHANGED
File without changes
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pwnix-api-client
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: '1.
|
4
|
+
version: '1.4'
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-11-24 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: httparty
|
16
|
-
requirement: &
|
16
|
+
requirement: &23148180 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *23148180
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: json
|
27
|
-
requirement: &
|
27
|
+
requirement: &23147380 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,11 +32,12 @@ dependencies:
|
|
32
32
|
version: '0'
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *23147380
|
36
36
|
description: ! ' Manage a Pwnix device. '
|
37
37
|
email:
|
38
38
|
- info@pwnieexpress.com
|
39
|
-
executables:
|
39
|
+
executables:
|
40
|
+
- console.sh
|
40
41
|
extensions: []
|
41
42
|
extra_rdoc_files: []
|
42
43
|
files:
|
@@ -46,10 +47,17 @@ files:
|
|
46
47
|
- Gemfile.lock
|
47
48
|
- README.md
|
48
49
|
- Rakefile
|
50
|
+
- bin/console.sh
|
49
51
|
- examples/configure_shells.rb
|
50
52
|
- lib/pwnix-api-client.rb
|
51
53
|
- lib/pwnix-api-client/api_client.rb
|
54
|
+
- lib/pwnix-api-client/config/config_file.rb
|
52
55
|
- lib/pwnix-api-client/mode.rb
|
56
|
+
- lib/pwnix-api-client/node.rb
|
57
|
+
- lib/pwnix-api-client/node/api_config.rb
|
58
|
+
- lib/pwnix-api-client/node/client/client_manager.rb
|
59
|
+
- lib/pwnix-api-client/node/client/console_client.rb
|
60
|
+
- lib/pwnix-api-client/node/cookbook.rb
|
53
61
|
- lib/pwnix-api-client/service.rb
|
54
62
|
- lib/pwnix-api-client/shell.rb
|
55
63
|
- lib/pwnix-api-client/shell_receiver_config.rb
|
@@ -59,9 +67,9 @@ files:
|
|
59
67
|
- lib/pwnix-api-client/system/logs.rb
|
60
68
|
- lib/pwnix-api-client/system/network.rb
|
61
69
|
- lib/pwnix-api-client/system/os.rb
|
62
|
-
- lib/pwnix-api-client/system/server.rb
|
63
70
|
- lib/pwnix-api-client/system/sms.rb
|
64
71
|
- lib/pwnix-api-client/system/ssh.rb
|
72
|
+
- lib/pwnix-api-client/system/utility.rb
|
65
73
|
- lib/pwnix-api-client/version.rb
|
66
74
|
- pwnix-api-client.gemspec
|
67
75
|
- util/console.rb
|
@@ -1,37 +0,0 @@
|
|
1
|
-
module Pwnix
|
2
|
-
module Api
|
3
|
-
module Client
|
4
|
-
class Server
|
5
|
-
include HTTParty
|
6
|
-
base_uri Pwnix::Api::Client::BASE_URI
|
7
|
-
debug_output
|
8
|
-
format :json
|
9
|
-
|
10
|
-
def status
|
11
|
-
self.class.post("/system/server/status", :body => {}).parsed_response['result']
|
12
|
-
end
|
13
|
-
|
14
|
-
def version
|
15
|
-
self.class.post("/system/server/version", :body => {}).parsed_response['result']
|
16
|
-
end
|
17
|
-
|
18
|
-
def release
|
19
|
-
self.class.post("/system/server/release", :body => {}).parsed_response['result']
|
20
|
-
end
|
21
|
-
|
22
|
-
def update
|
23
|
-
self.class.post("/system/server/update", :options => {:timeout => 600}, :body => {}).parsed_response['result']
|
24
|
-
end
|
25
|
-
|
26
|
-
def clear
|
27
|
-
self.class.post("/system/server/clear", :body => {}).parsed_response['result']
|
28
|
-
end
|
29
|
-
|
30
|
-
def restart
|
31
|
-
self.class.post("/system/server/restart", :body => {}).parsed_response['result']
|
32
|
-
end
|
33
|
-
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|