autodesk_backburner_client 0.1.0 → 0.2.2

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.
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