bugfix for [#23737] reported by Mariusz Maximus

netrender client's functions to get slaves and jobs info didn't work anymore (was reading response content twice).

At the same time, I switched to json for the dump and load, instead of using eval and repr (for obvious security reasons). I should have done this much earlier.
This commit is contained in:
2010-09-12 14:04:54 +00:00
parent 74059891e9
commit 797bb93b21
4 changed files with 19 additions and 15 deletions

View File

@@ -20,6 +20,7 @@ import bpy
import sys, os, re import sys, os, re
import http, http.client, http.server, urllib import http, http.client, http.server, urllib
import subprocess, shutil, time, hashlib import subprocess, shutil, time, hashlib
import json
import netrender import netrender
import netrender.model import netrender.model
@@ -169,7 +170,7 @@ def clientSendJob(conn, scene, anim = False):
job.priority = netsettings.priority job.priority = netsettings.priority
# try to send path first # try to send path first
conn.request("POST", "/job", repr(job.serialize())) conn.request("POST", "/job", json.dumps(job.serialize()))
response = conn.getresponse() response = conn.getresponse()
response.read() response.read()

View File

@@ -21,6 +21,7 @@ import http, http.client, http.server, urllib, socket, socketserver, threading
import subprocess, shutil, time, hashlib import subprocess, shutil, time, hashlib
import pickle import pickle
import select # for select.error import select # for select.error
import json
from netrender.utils import * from netrender.utils import *
import netrender.model import netrender.model
@@ -90,7 +91,7 @@ class MRenderJob(netrender.model.RenderJob):
def save(self): def save(self):
if self.save_path: if self.save_path:
f = open(os.path.join(self.save_path, "job.txt"), "w") f = open(os.path.join(self.save_path, "job.txt"), "w")
f.write(repr(self.serialize())) f.write(json.dumps(self.serialize()))
f.close() f.close()
def edit(self, info_map): def edit(self, info_map):
@@ -384,7 +385,7 @@ class RenderHandler(http.server.BaseHTTPRequestHandler):
self.server.stats("", "Sending status") self.server.stats("", "Sending status")
self.send_head() self.send_head()
self.wfile.write(bytes(repr(message), encoding='utf8')) self.wfile.write(bytes(json.dumps(message), encoding='utf8'))
# =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
elif self.path == "/job": elif self.path == "/job":
@@ -410,7 +411,7 @@ class RenderHandler(http.server.BaseHTTPRequestHandler):
message = job.serialize(frames) message = job.serialize(frames)
self.wfile.write(bytes(repr(message), encoding='utf8')) self.wfile.write(bytes(json.dumps(message), encoding='utf8'))
self.server.stats("", "Sending job to slave") self.server.stats("", "Sending job to slave")
else: else:
@@ -468,7 +469,7 @@ class RenderHandler(http.server.BaseHTTPRequestHandler):
self.send_head() self.send_head()
self.wfile.write(bytes(repr(message), encoding='utf8')) self.wfile.write(bytes(json.dumps(message), encoding='utf8'))
# =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
else: else:
# hand over the rest to the html section # hand over the rest to the html section
@@ -486,7 +487,7 @@ class RenderHandler(http.server.BaseHTTPRequestHandler):
length = int(self.headers['content-length']) length = int(self.headers['content-length'])
job_info = netrender.model.RenderJob.materialize(eval(str(self.rfile.read(length), encoding='utf8'))) job_info = netrender.model.RenderJob.materialize(json.loads(str(self.rfile.read(length), encoding='utf8')))
job_id = self.server.nextJobID() job_id = self.server.nextJobID()
@@ -657,7 +658,7 @@ class RenderHandler(http.server.BaseHTTPRequestHandler):
self.server.stats("", "New slave connected") self.server.stats("", "New slave connected")
slave_info = netrender.model.RenderSlave.materialize(eval(str(self.rfile.read(length), encoding='utf8')), cache = False) slave_info = netrender.model.RenderSlave.materialize(json.loads(str(self.rfile.read(length), encoding='utf8')), cache = False)
slave_id = self.server.addSlave(slave_info.name, self.client_address, slave_info.stats) slave_id = self.server.addSlave(slave_info.name, self.client_address, slave_info.stats)
@@ -666,7 +667,7 @@ class RenderHandler(http.server.BaseHTTPRequestHandler):
elif self.path == "/log": elif self.path == "/log":
length = int(self.headers['content-length']) length = int(self.headers['content-length'])
log_info = netrender.model.LogFile.materialize(eval(str(self.rfile.read(length), encoding='utf8'))) log_info = netrender.model.LogFile.materialize(json.loads(str(self.rfile.read(length), encoding='utf8')))
slave_id = log_info.slave_id slave_id = log_info.slave_id

View File

@@ -20,6 +20,7 @@ import bpy
import sys, os import sys, os
import http, http.client, http.server, urllib, socket import http, http.client, http.server, urllib, socket
import webbrowser import webbrowser
import json
import netrender import netrender
from netrender.utils import * from netrender.utils import *
@@ -205,10 +206,10 @@ class RENDER_OT_netclientstatus(bpy.types.Operator):
conn.request("GET", "/status") conn.request("GET", "/status")
response = conn.getresponse() response = conn.getresponse()
response.read() content = response.read()
print( response.status, response.reason ) print( response.status, response.reason )
jobs = (netrender.model.RenderJob.materialize(j) for j in eval(str(response.read(), encoding='utf8'))) jobs = (netrender.model.RenderJob.materialize(j) for j in json.loads(str(content, encoding='utf8')))
while(len(netsettings.jobs) > 0): while(len(netsettings.jobs) > 0):
netsettings.jobs.remove(0) netsettings.jobs.remove(0)
@@ -307,10 +308,10 @@ class RENDER_OT_netclientslaves(bpy.types.Operator):
conn.request("GET", "/slaves") conn.request("GET", "/slaves")
response = conn.getresponse() response = conn.getresponse()
response.read() content = response.read()
print( response.status, response.reason ) print( response.status, response.reason )
slaves = (netrender.model.RenderSlave.materialize(s) for s in eval(str(response.read(), encoding='utf8'))) slaves = (netrender.model.RenderSlave.materialize(s) for s in json.loads(str(content, encoding='utf8')))
while(len(netsettings.slaves) > 0): while(len(netsettings.slaves) > 0):
netsettings.slaves.remove(0) netsettings.slaves.remove(0)

View File

@@ -19,6 +19,7 @@
import sys, os, platform, shutil import sys, os, platform, shutil
import http, http.client, http.server, urllib import http, http.client, http.server, urllib
import subprocess, time import subprocess, time
import json
from netrender.utils import * from netrender.utils import *
import netrender.model import netrender.model
@@ -111,7 +112,7 @@ def render_slave(engine, netsettings, threads):
conn = clientConnection(netsettings.server_address, netsettings.server_port) conn = clientConnection(netsettings.server_address, netsettings.server_port)
if conn: if conn:
conn.request("POST", "/slave", repr(slave_Info().serialize())) conn.request("POST", "/slave", json.dumps(slave_Info().serialize()))
response = conn.getresponse() response = conn.getresponse()
response.read() response.read()
@@ -130,7 +131,7 @@ def render_slave(engine, netsettings, threads):
if response.status == http.client.OK: if response.status == http.client.OK:
timeout = 1 # reset timeout on new job timeout = 1 # reset timeout on new job
job = netrender.model.RenderJob.materialize(eval(str(response.read(), encoding='utf8'))) job = netrender.model.RenderJob.materialize(json.loads(str(response.read(), encoding='utf8')))
engine.update_stats("", "Network render processing job from master") engine.update_stats("", "Network render processing job from master")
JOB_PREFIX = os.path.join(NODE_PREFIX, "job_" + job.id) JOB_PREFIX = os.path.join(NODE_PREFIX, "job_" + job.id)
@@ -156,7 +157,7 @@ def render_slave(engine, netsettings, threads):
# announce log to master # announce log to master
logfile = netrender.model.LogFile(job.id, slave_id, [frame.number for frame in job.frames]) logfile = netrender.model.LogFile(job.id, slave_id, [frame.number for frame in job.frames])
conn.request("POST", "/log", bytes(repr(logfile.serialize()), encoding='utf8')) conn.request("POST", "/log", bytes(json.dumps(logfile.serialize()), encoding='utf8'))
response = conn.getresponse() response = conn.getresponse()
response.read() response.read()