Changeset - 8db5f38a6c26
[Not reviewed]
Merge default
0 2 0
Nathan Brink (binki) - 16 years ago 2009-07-25 00:35:41
ohnobinki@ohnopublishing.net
merge
2 files changed with 41 insertions and 28 deletions:
0 comments (0 inline, 0 general)
src/server/slave.c
Show inline comments
 
@@ -31,37 +31,41 @@ int main(int argc, char *arvg[])
 
{
 

	
 
	///////////////////// Semi-pseudo Slave Code ///////////////////////////
 

	
 
	int slavestatus = 0;
 

	
 
	if(no username in config file, no key present){
 
	if('no username in config file, no key present'){
 
		fprintf(stderr "run distrend -c username] [emailaddr] to register")
 
	}
 
	if(they use a -c flag according to getopt, with 2 args){
 
		register_user(username, email); which returns a uniquely random url to a key
 
		get(uniquely-random-url-to-key);
 
	if('they use a -c flag according to getopt, with 2 args'){
 
		*key = register_user(username, email); // register_user returns a uniquely random url to a key
 
		get("http://protofusion.org/distren/key/%s",key);
 
		fprintf(stderr, "you registered, hopefully successfully. Invoke distrend with no args now.");
 
	}
 
	if(username is in conf file and key is present){
 
	if('username is in conf file and key is present'){
 
		loginuser(username);
 
	}
 

	
 
	if(slave recieves "start frame#, job#"){
 
		get(http://distren.protofusion.org/srv/job#.tgz);
 
		tar -xvf job#.tgz /tmp/distren/job#; somehow
 
		exec_blender(job#.blend, job#.frame#.JPG, job#); (check the args, we'll need to adjust for different output formats)... set SLAVESTATUS=1 while rendering, SLAVESTATUS=2 when done
 
	if('slave recieves "start frame#, job#"'){
 
		fprintf(stderr, "Got frame %d in job %d, preparing to render...",frame,job);
 
		get('http://distren.protofusion.org/srv/job#.tgz');
 
		exec('tar -xvf job#.tgz /tmp/distren/job#'); // somehow
 
		exec_blender(jobname.blendfile, jobnum.framenum.JPG, jobnum); // (check the args, we'll need to adjust for different output formats)... set SLAVESTATUS=1 while rendering, SLAVESTATUS=2 when done
 
	}
 
	if(SLAVESTATUS==2){
 
		tell the server "done with frame# in job#";
 
		SLAVESTATUS=0
 
		tell_the_server("Completed");
 
		fprintf(stderr, "Finished frame %d in job %d",framenum,jobnum);
 
		SLAVESTATUS=0;
 
	}
 
	if(SLAVESTATUS==0){
 
		tell the server "i ain't got no frames to render";
 
		tell_the_server("Idle");
 
		fprintf(stderr, "Idle. No frames to render.");
 
	}
 
	while(SLAVESTATUS==1){
 
		tell the server "rendering this friggn frame";
 
		delay(1000);
 
		tell_the_server("Rendering");
 
		fprintf(stderr, "Rendering frame %d in job %d...",framenum,jobnum);
 
		delay(1000); // or not... this should be more event-driven, but should still give a heartbeat to the server
 
	}
 

	
 
  return 0;
 
}
src/server/slavefuncs.c
Show inline comments
 
@@ -15,25 +15,22 @@
 

	
 
  You should have received a copy of the GNU Affero General Public License
 
  along with DistRen.  If not, see <http://www.gnu.org/licenses/>.
 
*/
 

	
 
/*
 
 * **********************************************************************************
 
 * Slave listens on server for a command in the format of each function...
 
 * We need if's for returns... ==> watchdog
 
 * **********************************************************************************
 
  * Registration on server. Needs attention. Prevent account spamming.
 
  * TODO: MAKE THIS FUNCTION RETURN THE UNIQUE URL TO THE USER'S KEY!!!
 
  * Set up something like: distrend -c username email@example.com
 
*/
 

	
 
// Registration on server. Needs attention. Prevent account spamming.
 
// Key transfer?
 
// Set up something like: distrend -c username email@example.com
 
void registeruser(char *username, char *email){
 
  // Logs into sandboxed user on zserver2 and registers a user. Should eventually generate a key on the server and return it to the user.
 
  // All created user accounts should be sandboxed accordingly, requiring a different skel, and the default shell to be rbash. Also,
 
  // a custom path defined in the .bash_profile of the skel is needed.
 
  /*
 
   * Logs into sandboxed user on zserver2 and registers a user. Should eventually generate a key on the server and return it to the user.
 
   * All created user accounts should be sandboxed accordingly, requiring a different skel, and the default shell to be rbash. Also,
 
   * a custom path defined in the .bash_profile of the skel is needed.
 
  */
 
  char buf[10];
 
  struct execio *testrem;
 
  char *execargv[] =
 
    {
 
  "ssh",
 
  "distren_setup@protofusion.org",
 
@@ -45,13 +42,13 @@ void registeruser(char *username, char *
 
  "-M",
 
  "-c",
 
  email,
 
  "-d",
 
  "/home/distren",
 
  "--gid",
 
  "541", // Add in shellscript to generate ssh key and return it to the user somehow
 
  "541", // Add in shellscript to generate ssh key and return it to the user somehow, probably post to http
 
  username,
 
  (char *)NULL
 
  };
 
  size_t readlen;
 
  fprintf(stderr, "Opening stream:\n", execio_open(&testrem, "ssh", execargv));
 
  buf[9] = '\0'; // null-terminating the array...
 
@@ -95,20 +92,32 @@ void loginuser(char *username){
 
    fprintf(stderr, "read \"%s\"\n", buf);
 
    }
 
  execio_close(testrem);
 
}
 

	
 

	
 
// Executors
 
/* Executors */
 

	
 
/*
 
  It seems that the client will need to know the job number. Is finish_frame going to be on the client or the server? we gotta figure that out!
 
*/
 
void exec_blender(struct blendjob* blendjob, char *input, char *output, int frame)
 
{
 
  char *frame_str;
 
  asprintf(frame,frame_str); // GNU/*nix compatible only, fix before releasing win32, although dll for windows for asprintf exists!
 
  int ret;
 
  char *cmd[] = { "blender", "-b", "-o", output, input, "-f", frame_str, (char *)0 };
 
  ret = execv("/usr/bin/blender", cmd);
 
  ret = execv("/usr/bin/blender", cmd); // This path will be absolute for testing, should be relative to install on production
 
  finish_frame(blendjob, frame);
 
}
 

	
 
/* Update me when the time comes:
 
void exec_luxrender(struct luxjob* luxjob, char *input, char *output, int frame)
 
{
 
  char *frame_str;
 
  asprintf(frame,frame_str);
 
  int ret;
 
  char *cmd[] = { "luxrender", "-b", "-o", output, input, "-f", frame_str, (char *)0 }; // Fix args later
 
  ret = execv("/usr/bin/luxrender", cmd); // Absolute for testing, relative on production
 
  finish_frame(luxjob, frame);
 
}
 
*/
0 comments (0 inline, 0 general)