Files @ 03937b2315eb
Branch filter:

Location: DistRen/src/client/distren.c

ethanzonca
Build-breaking goodness!
/*
  Copyright 2008 Nathan Phillip Brink, Ethan Zonca, Matt Orlando

  This file is a part of DistRen.

  DistRen is free software: you can redistribute it and/or modify
  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/>.
*/


/* Ideas for php-side stuff:
 *
 * PHP adds the users... has captcha and email confirmation wth a pseudo-random number that
 * the user must enter on the site. Apache should be running mod_peruser for safety, and I'm
 * thinking zserver2 for web serving for convenience...
 */


#include <distren.h>

#include <stdio.h> /* sprintf, printf */
#include <stdlib.h> /* malloc, free */
#include <unistd.h> /* getopt */
#include <confuse.h>
#include <string.h> // for strcat


int main(int argc, char *argv[])
{
  char *input;
  char *output;
  char *jobid;

  char curopt;

  distren_t distren;
  distren_job_t distren_job;

  input = NULL;
  output = NULL;

  while(-1 != (curopt = getopt(argc, argv, "i:o:h")))
    {
      if(curopt == ':')
	{
	  fprintf(stderr, "-%c: is missing an argument\n", optopt);
	  return 1;
	}
      else if(curopt == '?')
	{
	  fprintf(stderr, "-%c: invalid option specified\n", optopt);
	  return 1;
	}
      else if(curopt == 'h')
	{
	  fprintf(stderr, "Usage: %s -i <inputfile> -o <outputfile>\n", argv[0]);
	  fprintf(stderr, "\t-i\tSpecifies the input file\n\
\t-o\tSpecifies the output file\n\
\t-h\tShows this help message\n");
	  /*
	    don't return here because options_init will have an overall
	    options help page
	  */
	}
      else if(curopt == 'i')
	/*
	   TODO: is strdup good or bad? what about
	   the idea that all libs should allow plugging different
	   malloc/free implementations in?
	 */
	input = strdup(optarg);
      else if(curopt == 'o')
	output = strdup(optarg);
    }

  /*
     give this error after the general arguments parsing so that
     the general help from options_init can have effect
  */
  if(!input
     || !output)
    {
      fprintf(stderr, "Input and output files must be specified\n");
      return 1;
    }

  fprintf(stderr, "reading from %s\nwriting to %s\n", input, output);

  if(distren_init_mf(&distren, &malloc, &free))
    {
      fprintf(stderr, "error initializing distren handle\n");
      return 1;
    }

  if(distren_submit_file(distren, &distren_job, input))
    {
      fprintf(stderr, "error submitting file\n");
      return 1;
    }

  if(distren_job_getid(distren_job, &jobid))
    {
      fprintf(stderr, "error retrieving job id\n");
      return 1;
    }
  fprintf(stdout, "jobid: %s\n", jobid);

  if(distren_job_retrieve_file(distren_job, output))
    {
      fprintf(stderr, "error retrieving output file\n");
      return 1;
    }

  /* if these following lines fail, it'll be reported as a core dump ;-) */
  distren_job_free(distren_job);
  distren_free(distren);

// !!! Killed for now because I'm doing other randomness !!! //
  // Please find a better way of doing this :( you can't strcat multiple strings.. meh
  // use something like sprintf
  //char *username = cfg_getstr(cfg, "username");
  //char *hostname = cfg_getstr(cfg, "hostname");
  //strcat(username, "@");
  //strcat(username, hostname);

  // SSH's to client machine with the username speficied.
  /*
    char buf[10];
    struct execio *testrem;
    char *execargv[] =
      {
	"ssh",
	"username", //cfg_getstr(cfg, "username") . "@" . cfg_getstr(cfg, "hostname"),
	"-i guest.rsa", //yeaaaah any better ideas?
	"sh",
	"-c",
	"\"echo hello from ${HOSTNAME}\"", // "\"useradd -M -c" strcat( cfg_getstr(cfg, "name") cfg_getstr(cfg, "email")) "-d /home/distren --gid 537" cfg_getstr(cfg, "username") "\"",
	(char *)NULL
      };

    size_t readlen;
    fprintf(stderr, "execio madness is occuring!");
    fprintf(stderr, "execio_open returns %d\n", execio_open(&testrem, "ssh", execargv));
    buf[9] = '\0';
*/

    /*
    while(!execio_read(testrem, buf, 9, &readlen))
      {
	if(readlen > 9 )
	  {
	    fprintf(stderr, "execio_read doesn't set readlen correctly or read() is messed up\n");
	    return 1;
	  }
	buf[readlen] = '\0';
	fprintf(stderr, "read \"%s\"\n", buf);
      }
    execio_close(testrem);
    */
  // Can we prune off some of this code up here^? I'm not exactly sure how execio returns output, but it seems like more could be happening in execio itself, and less happening where it is actually called.
  // We need some code to ssh, and if the SSH fails, tell the user to register.
  // Killed the user reg code, as the php interface will take care of this. Although it should check for users...



  // ------------------------------
  // Ok, this is just to do something to keep distren aliveish... Kill if needed/wanted/meh'd. Borrowed some code from matt's blender.c

    // We need calls to populate os. This is pretty rudimentary. Should be moved to shared, or use bultin something. Change on compiletime?
    char *os = "nix";
    if(os == 'win32'){char *bin = 'blender.exe'}
    else{char *bin = 'blender'} // mac/*nix

    // Placeholders? figure out what the last one is...
    char *format = "%s -b \"%s\" -o %s -f %d -F JPEG -x 1",bin,input,output; /* the format string to pass to sprintf */

     unsigned int frame_to_render; // initialize this somewhere else...
     size_t blenderstrlen;
     frame_to_render = 10; // temporary, the number 10 will be replaced with a function call

// This seems pretty ridik. Just sayin'. We gotta switch this up.
     blenderstrlen = strlen(format) - 2 * 2 /* format string minus placeholders */ + strlen(filename) + intstrlen(frame_to_render) + 1 /* NULL terminator */;
     blendercmd = malloc(blenderstrlen);
     snprintf(blendercmd, blenderstrlen, format, filename, frame_to_render);

     fprintf(stderr, "will run job num. %d ``%s''\n",jobid,blendercmd);
     free(blendercmd);


  // -------------End cruddy code that will eventually compose blender.c-----------------



 return 0;
};