autodesk_backburner_client 0.1.0 → 0.2.2

Sign up to get free protection for your applications and to get access to all the features.
data/lib/backburner.rb CHANGED
@@ -1,4 +1,3 @@
1
- require 'active_support/core_ext/hash'
2
1
  require "backburner/version"
3
2
  require "backburner/connection"
4
3
  require "backburner/job"
@@ -6,4 +5,5 @@ require "backburner/server"
6
5
  require "backburner/client"
7
6
  require "backburner/string/string_operations"
8
7
  require "backburner/data_object"
9
- require "backburner/backburner_object"
8
+ require "backburner/backburner_object"
9
+ require "backburner/remote_command"
@@ -2,10 +2,13 @@ module Backburner
2
2
 
3
3
  class Client
4
4
 
5
+ attr_reader :data
6
+
5
7
  def initialize host, port=3234
6
8
  @host = host
7
9
  @port = port
8
10
  @connection = Connection.new @host, @port
11
+ send_client_info
9
12
  self
10
13
  end
11
14
 
@@ -53,25 +56,54 @@ module Backburner
53
56
 
54
57
  private
55
58
 
59
+ def generate_client_info
60
+ @data = DataObject.new
61
+ @data.client_info = {
62
+ version: 300,
63
+ udp_port: 0,
64
+ controler: 0,
65
+ system_info: {
66
+ total_memory: total_memory,
67
+ total_memory_f: total_memory_f,
68
+ num_cpus: num_cpus,
69
+ platform: platform,
70
+ user: user,
71
+ computer_name: computer_name,
72
+ mac: '00E052B9A2F20000',
73
+ work_disk_space: 0,
74
+ i_p_address: '172.50.0.170'
75
+ }
76
+ }
77
+ end
78
+
56
79
  def send_client_info
57
- # <?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
58
- # <ClientInfo>
59
- # <Version>300</Version>
60
- # <UdpPort>0</UdpPort>
61
- # <Controler>0</Controler>
62
- # <SystemInfo>
63
- # <TotalMemory>4294967295</TotalMemory>
64
- # <TotalMemoryF>34313162752.000000</TotalMemoryF>
65
- # <NumCpus>8</NumCpus>
66
- # <Platform>Windows XP 6.1 Build 7601 - Service Pack 1</Platform>
67
- # <User> </User>
68
- # <ComputerName>rendermama</ComputerName>
69
- # <Mac>00E052B9A2F20000</Mac>
70
- # <WorkDiskSPace>0</WorkDiskSPace>
71
- # <IPAddress>10.128.23.74</IPAddress>
72
- # </SystemInfo>
73
- #</ClientInfo>
80
+ generate_client_info unless @data
81
+ xml = @data.to_xml
82
+ @connection.set_clientinfo xml.bytesize
83
+ end
84
+
85
+ def total_memory
86
+ `free -b`.match(/\d+/).to_s.to_i
87
+ end
88
+
89
+ def total_memory_f
90
+ total_memory.to_f
91
+ end
92
+
93
+ def num_cpus
94
+ `cat /proc/cpuinfo`.split("\n\n" ).count
95
+ end
96
+
97
+ def platform
98
+ `uname`.gsub(/\n/, '')
99
+ end
100
+
101
+ def user
102
+ `whoami`.gsub(/\n/, '')
103
+ end
74
104
 
105
+ def computer_name
106
+ `hostname`.gsub(/\n/, '')
75
107
  end
76
108
 
77
109
  end
@@ -1,25 +1,23 @@
1
1
  require 'net/telnet'
2
+ require 'nori'
2
3
 
3
4
  module Backburner
4
5
 
5
6
  class Connection
6
7
 
7
- def initialize host, port=3234
8
- @session = Net::Telnet.new('Host' => host, 'Port' => port, 'Prompt' => /backburner>/i)
9
- @session.waitfor 'Match' => /backburner>/i
10
- end
8
+ STATUS_REGEXP = /(\d+) ([0-9A-z ]+)$/
9
+ PROMPT_REGEXP = /\nbackburner(\(controller\))?>/i
10
+ XML_COMMENT_REGEXP = /<!--.+-->/
11
11
 
12
- def method_missing name, *args
13
- if name =~ /^get_/
14
- object = name.to_s.gsub /^get_/, ''
15
- return get(object, args)
16
- end
17
- super
18
- end
12
+ attr_reader :last_message, :last_size, :last_status, :last_body, :last_response
19
13
 
20
- def get object, *params
21
- exec 'String' => "get #{object} #{params.join ' ' if params.kind_of?(Array)}"
14
+ def initialize host='127.0.0.1', port=3234
15
+ @session = Net::Telnet.new('Host' => host, 'Port' => port, 'Prompt' => PROMPT_REGEXP)
16
+ @session.waitfor 'Match' => PROMPT_REGEXP
17
+ end
22
18
 
19
+ def method_missing method_name
20
+ RemoteCommand.new method_name, self
23
21
  end
24
22
 
25
23
  def close
@@ -32,31 +30,68 @@ module Backburner
32
30
  raise
33
31
  end
34
32
 
33
+ def exec arg_hash
34
+ xml_string = ''
35
+ first = true
36
+ @session.cmd arg_hash do |response|
37
+ if first
38
+ response =~ /(\d+) (\d*)(.*)/
39
+ @last_status = $1.to_i
40
+ @last_size = $2.to_i
41
+ @last_message = $3
42
+ first = false
43
+ next
44
+ end
45
+ xml_string += response
46
+ end
47
+
48
+ xml_string = xml_string.sub(/backburner>$/, '')
49
+ DataObject.new xml_string
50
+ end
51
+
52
+ def send_data data
53
+ @session.cmd 'String' => data
54
+ end
55
+
56
+ def send_text data
57
+ @last_response = @session.cmd data
58
+ parse_response
59
+ end
60
+
61
+ def proceed?
62
+ @last_status < 200 || @last_status > 299
63
+ end
64
+
65
+ def ready?
66
+ @last_status == 250
67
+ end
68
+
35
69
  private
36
70
 
37
- def exec arg_hash
38
- xml_string = ""
39
- first = true
40
- @session.cmd arg_hash do |response|
41
- if first
42
- response =~ /(\d+) (\d*)(.*)/
43
- @last_status = $1.to_i
44
- @last_size = $2.to_i
45
- @last_message = $3
46
- first = false
47
- next
48
- end
49
- xml_string += response
50
- end
71
+ def parse_response
72
+ parse_status
73
+ parse_body
74
+ parse_object
75
+ end
51
76
 
52
- xml_string = xml_string.sub(/backburner>$/, '')
53
- DataObject.new xml_string
77
+ def parse_status
78
+ @last_response.scan STATUS_REGEXP
79
+ @last_status = $1.to_i
80
+ @last_size = $2.to_i
81
+ @last_message = $2
54
82
  end
55
83
 
56
- def send hash
84
+ def parse_body
85
+ @last_body = @last_response.gsub PROMPT_REGEXP, ''
86
+ @last_body.gsub! STATUS_REGEXP, ''
87
+ @last_body.gsub! XML_COMMENT_REGEXP, ''
88
+ end
57
89
 
90
+ def parse_object
91
+ parser = Nori.new :convert_tags_to => lambda { |tag| tag.snakecase.to_sym }
92
+ DataObject.new parser.parse @last_body
58
93
  end
59
94
 
60
95
  end
61
96
 
62
- end
97
+ end
@@ -1,18 +1,55 @@
1
- require 'nori'
2
1
  require 'recursive_open_struct'
3
- require 'builder'
2
+ require 'nokogiri'
4
3
 
5
4
  module Backburner
6
5
 
7
6
  class DataObject < RecursiveOpenStruct
8
7
 
9
- def initialize xml=''
10
- if xml
11
- parser = Nori.new :convert_tags_to => lambda { |tag| tag.snakecase.to_sym }
12
- super parser.parse(xml), recurse_over_arrays: true
13
- else
14
- super
8
+ TIME_REGEXP = /(^\d{4}\/\d{2}\/\d{2}-\d{2}:\d{2}:\d{2}:\d{4})(-\d{2})$/
9
+
10
+ def initialize h, args={recurse_over_arrays: true}
11
+ super
12
+ end
13
+
14
+ def new_ostruct_member(name)
15
+ name = name.to_sym
16
+ unless self.respond_to?(name)
17
+ class << self; self; end.class_eval do
18
+ define_method(name) do
19
+ v = @table[name]
20
+ if v.is_a?(Hash)
21
+ @sub_elements[name] ||= self.class.new(v, :recurse_over_arrays => @recurse_over_arrays)
22
+ elsif v.is_a?(Array) and @recurse_over_arrays
23
+ @sub_elements[name] ||= recurse_over_array v
24
+ elsif v.is_a?(String)
25
+ case v
26
+ when /^\d+$/ then v.to_i
27
+ when /^\d+\.\d+$/ then v.to_f
28
+ when TIME_REGEXP then parse_time(v)
29
+ when /^Yes$/i then true
30
+ when /^No$/i then false
31
+ else v
32
+ end
33
+ else
34
+ v
35
+ end
36
+ end
37
+ define_method("#{name}=") { |x| modifiable[name] = x }
38
+ define_method("#{name}_as_a_hash") { @table[name] }
39
+ end
15
40
  end
41
+ name
42
+ end
43
+
44
+ def parse_time(time_string)
45
+ res = time_string.scan TIME_REGEXP
46
+ time = Time.parse res[0][0]
47
+ time += res[0][1].to_i*60*60
48
+ time
49
+ end
50
+
51
+ def empty?
52
+ @table.empty?
16
53
  end
17
54
 
18
55
  def search name
@@ -32,7 +69,7 @@ module Backburner
32
69
  end
33
70
 
34
71
  def to_xml
35
- builder = Nokogiri::XML::Builder.new do |xml|
72
+ builder = Nokogiri::XML::Builder.new(encoding: 'UTF-8') do |xml|
36
73
  xml.send @table.keys.first.to_s.camelize
37
74
  end
38
75
  document = builder.doc
@@ -68,6 +105,8 @@ module Backburner
68
105
  end
69
106
  elsif data.kind_of?(String)
70
107
  children << data
108
+ elsif data.kind_of?(Numeric)
109
+ children << data.to_s
71
110
  end
72
111
 
73
112
  children.each do |child|
@@ -8,6 +8,10 @@ module Backburner
8
8
  @client.job!(@handler)
9
9
  end
10
10
 
11
+ def create name, file_path, *parameters
12
+
13
+ end
14
+
11
15
  end
12
16
 
13
17
  end
@@ -0,0 +1,32 @@
1
+ module Backburner
2
+ class RemoteCommand
3
+ attr_accessor :command_stack
4
+
5
+ def initialize command_name, connection, command_stack=nil
6
+ @command_stack = command_stack || []
7
+ @command_stack.unshift command_name
8
+ @connection = connection
9
+ end
10
+
11
+ def method_missing method_name, *args
12
+ self.class.new method_name, @command_stack
13
+ end
14
+
15
+ def flatten
16
+ @command_stack.join ' '
17
+ end
18
+
19
+ %w{get set new del kill exit}.each do |method_name|
20
+
21
+ define_method method_name do |*args|
22
+ request_array = []
23
+ request_array << method_name
24
+ request_array << flatten
25
+ request_array += args||[]
26
+ @connection.send_text request_array.join(' ')
27
+ end
28
+
29
+ end
30
+
31
+ end
32
+ end
@@ -1,3 +1,3 @@
1
1
  module Backburner
2
- VERSION = "0.1.0"
2
+ VERSION = "0.2.2"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: autodesk_backburner_client
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -96,6 +96,7 @@ files:
96
96
  - lib/backburner/data_object.rb
97
97
  - lib/backburner/job.rb
98
98
  - lib/backburner/open_struct_data.rb
99
+ - lib/backburner/remote_command.rb
99
100
  - lib/backburner/server.rb
100
101
  - lib/backburner/string/string_operations.rb
101
102
  - lib/backburner/version.rb