Changeset - bb3ccc3030b4
[Not reviewed]
default
0 1 0
ethanzonca@localhost.localdomain - 16 years ago 2009-07-01 13:07:16
ethanzonca@localhost.localdomain
Added some user-adding, it\'s interactive for testing purposes. I\'ll make it non-interactive soon if I am not beaten to the task
1 file changed with 25 insertions and 10 deletions:
0 comments (0 inline, 0 general)
src/server/distrend.c
Show inline comments
 
@@ -7,197 +7,212 @@
 
  it under the terms of the GNU Affero General Public License as published by
 
  the Free Software Foundation, either version 3 of the License, or
 
  (at your option) any later version.
 

	
 
  DistRen is distributed in the hope that it will be useful,
 
  but WITHOUT ANY WARRANTY; without even the implied warranty of
 
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
  GNU Affero General Public License for more details.
 

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

	
 
*/
 

	
 
/* This file contains the code which both processes (renders) jobs as a slave, and the code which distributes frames to slaves after receiving them from the client portion of the codebase. */
 

	
 
 /* Just some notes -- Ethan Zonca
 
 * ++ Make data availible for other apps to parse
 
 * Server<==>Client Communication
 
 * Upload while rendering
 
 */
 

	
 
#include <stdio.h>
 
#include "execio.h"
 

	
 
// needs to be implemented
 
#include "options.h"
 

	
 
#include <confuse.h>
 

	
 
#define max 100
 
 // maximum number of stored jobs in memory, per job type (lux/blend). Eventually we can dump this data to disk, or atleast the remainder not in memory...
 

	
 
int jobnum = 0;
 

	
 
// Structures for storing job information
 
struct {
 
  char *name;
 
  char *submitter;
 
  char *email;
 
  int priority;
 
  struct frameset **frameset; // What exactly is this now? hehe
 
} blendjob[max];
 

	
 
struct {
 
  char *name;
 
  char *submitter;
 
  char *email;
 
  int priority;
 
  int mode; // 0 = Static Render, stop at Spp, or infinity if spp is null. Framerange is ignored || 1 = animation, stop at Spp and stay in framerange.
 
  int spp;
 
  struct frameset ** frameset;
 
} luxjob[max];
 

	
 

	
 

	
 

	
 
int main(int argc, char *argv[])
 
{
 

	
 

	
 

	
 

	
 
// We need the conf parser code from options.c here!!!
 

	
 

	
 
char *username = "unregistered";
 
// Registered checker, needs input from conf file to see if the default username exists
 
char *username = "unregistered"; // get this from conf
 
int registered;
 
if(username == "unregistered") {
 
  fprintf(stderr,"You have not set your username in distrend.conf!\nIf you need to register a username, run distrend --createuser=username"); // This is what it should maybe be like lol...
 
  registered = 0;
 
}
 

	
 

	
 

	
 

	
 

	
 
// Registration on server. Needs attention. (e.g., people could make tons of accounts with the key we give them...
 
// This should really not be an interactive process... after contemplation, a user should run distrend --createuser=username which does this, or something. But we must prevent multi-user-creation abuse, too.
 
if(registered==0) {
 
char newusername[100];
 

	
 
  fprintf(stderr, "Please enter your desired username: ");
 
  fprintf(stderr, "**** Please enter your desired username: ");
 
  fgets(newusername,100,stdin);
 
  fprintf(stderr, "\nChecking availibility of username: %s\n\n",newusername);
 
  fprintf(stderr, "\n**** Checking availibility of username: %s\n",newusername);
 
  // Mostly kinda copied from old code, but I understand it a tad better now :)
 
  // Logs into sandboxed user on zserver2 and registers a user
 
  char buf[10];
 
  struct execio *testrem;
 
  char *execargv[] =
 
    {
 
  "ssh",
 
  "distren_setup@protofusion.org",
 
  "-i",
 
  "setup.rsa",
 
  "-p",
 
  "23",
 
  "sh",
 
  "-c",
 
  "sudo /usr/sbin/useradd",
 
  "-M",
 
  "-c",
 
  "email",
 
  "-d",
 
  "/home/distren",
 
  "--gid 537",
 
  "--gid",
 
  "541",
 
  newusername,
 
  (char *)NULL
 
  };
 
  size_t readlen;
 
  fprintf(stderr, "execio_open:", execio_open(&testrem, "ssh", execargv));
 
  fprintf(stderr, "Opening stream:\n", execio_open(&testrem, "ssh", execargv));
 
  buf[9] = '\0'; // null-terminating the array...
 
  while(!execio_read(testrem, buf, 9, &readlen)) // What's with the readlen stuff?
 
    {
 
      if(readlen > 9) {
 
	fprintf(stderr, "Something is terribly wrong!\n");
 
	fprintf(stderr, "**** Something is terribly wrong!\n");
 
      }
 
      if(buf == 0) {
 
	fprintf(stderr, "**** Operation successful, or so we hope. We got no output.");
 
      }
 
    buf[readlen] = '\0'; // Null-terminating the end of it again based on how large the data is?
 
    fprintf(stderr, "read \"%s\"\n", buf);
 
    }
 
  execio_close(testrem);
 
  
 
 }
 
else{
 
  // Login with credentials
 
}
 

	
 

	
 

	
 

	
 

	
 

	
 

	
 

	
 
/*
 
 frame[frame] Assignments:
 
  "0" - cancelled
 
  "1" - unassigned
 
  "2" - assigned to slave
 
  "3" - completed by slave and uploaded
 
 Have a script crawl through each job in the arrays, ordered by priority?, and assign a certain number of frames to each slave.
 
 Then we will need some sort of watchdog to monitor slaves on the main server to check for stales.
 
*/
 

	
 

	
 
// Queuer: this function should add files to the queue
 
// Type: 0 = blender, 1 = luxrender
 
// jobnum is the current job number
 
void queue(int type, char *name, char *submitter, char *email, int priority, int mode, int spp, struct frameset **frameset) {
 
  if(type == 1){
 
    blendjob[jobnum].name = name;
 
    blendjob[jobnum].submitter = submitter;
 
    blendjob[jobnum].email = email;
 
    blendjob[jobnum].priority = priority;
 
    blendjob[jobnum].frameset =  frameset;
 
  }
 
  if(type == 2){
 
    luxjob[jobnum].name = name;
 
    luxjob[jobnum].submitter = submitter;
 
    luxjob[jobnum].email = email;
 
    luxjob[jobnum].priority = priority;
 
    luxjob[jobnum].mode = mode;
 
    luxjob[jobnum].spp = spp;
 
    luxjob[jobnum].frameset = frameset;
 
    // handle lux modes somehow.
 
}
 
  else{
 
    // Throw error.
 
  }
 
jobnum++;
 
}
 

	
 

	
 

	
 

	
 

	
 

	
 

	
 

	
 

	
 

	
 
///////////////////////// SLAVE ///////////////////////////////
 

	
 
/*
 
Slave execution code lies below
 

	
 

	
 
Slave listens on server for a command in the format of each function...
 
We need if's for returns... ==> watchdog
 
*/
 

	
 

	
 
// Executors
 

	
 
void exec_blender(char *input, char *output, int sframe, int eframe) {
 
  int ret;
 
  /* SEGFAULTAGE :-D */
 
  char *cmd[] = { "blender", "-b", "-o", output, input, "-s", sframe, "-e", eframe, (char *)0 };
 
  ret = execv("/usr/bin/blender", cmd);
 
}
 

	
 
void exec_luxrender_single(char *input, char *output) {
 
  int ret;
 
  char *cmd[] = { "luxrender", "-something", "something", "something", (char *)0 };
 
  ret = execv("/usr/bin/luxrender", cmd);
 
}
 

	
 
void exec_luxrender_anim(char *input, char *output, int sframe, int eframe, int spp) {
 
// spp is samples per pixel limitation on each frame
 
  int ret;
 
  char *cmd[] = { "luxrender", "-something", "something", "something", (char *)0 };
0 comments (0 inline, 0 general)