Changeset - b95115259ec9
[Not reviewed]
default
0 2 0
ethanzonca - 16 years ago 2009-07-25 01:18:31

Conf files are now parsed!
2 files changed with 25 insertions and 3 deletions:
0 comments (0 inline, 0 general)
src/common/options.c
Show inline comments
 
/*
 
  Copyright 2008 Nathan Phillip Brink, Ethan Zonca
 

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

	
 
/* The purpose of this file is to... */
 

	
 
#include "options.h"
 

	
 
/* privat-ish files for components we need to config */
 
#include "libremoteio.h"
 

	
 
#include <confuse.h>
 
#include <string.h>
 
#include <stdio.h>
 
#include <stdlib.h>
 

	
 
struct options_common_data 
 
{
 
  cfg_t *cfg;
 
};
 

	
 

	
 
int options_init(int argc, char *argv[], cfg_t **mycfg, cfg_opt_t *myopts, char *myname, struct options_common **allopts)
 
{
 
  char *configfile;
 

	
 
  size_t i;
 

	
 
  /* For those of you who don't know, the following is an example of concatenation of constant strings by the C compiler. Now, that doesn't mean you can do run-time string concatenation ;-) 
 
   strdup is because someday configfile will be customizable via argv[]
 
   */
 

	
 
  i = strlen(SYSCONFDIR "/distren.conf") + strlen(myname) + 1;
 
  configfile = malloc(i);
 
  if(!configfile)
 
    {
 
      perror("malloc");
 
      return 1;
 
    }
 
  strncpy(configfile, SYSCONFDIR "/distren", strlen(SYSCONFDIR "/distren") + 1);
 
  strcat(configfile, myname);
 
  strcat(configfile, ".conf");
 
  
 
  *allopts = malloc(sizeof(struct options_common));
 
  if(!*allopts)
 
    {
 
      perror("malloc");
 
      free(configfile);
 
      return 1;
 
    }
 
  memset(*allopts, '\0', sizeof(struct options_common));
 
  
 
  (*allopts)->data = malloc(sizeof(struct options_common_data));
 
  if(!(*allopts)->data)
 
    {
 
      perror("malloc");
 
      free(configfile);
 
      free(*allopts);
 
      return 1;
 
    }
 
  memset((*allopts)->data, '\0', sizeof(struct options_common_data));
 

	
 
  (*allopts)->remoteio = malloc(sizeof(struct remoteio_opts));
 
  if(!(*allopts)->data)
 
    {
 
      perror("malloc");
 
      free(configfile);
 
      free((*allopts)->data);
 
      free(*allopts);
 
      return 1;
 
    }
 
  memset((*allopts)->remoteio, '\0', sizeof(struct remoteio_opts));
 
  (*allopts)->remoteio->ssh_command = strdup("ssh");
 
  /** @TODO: check for NULL return above */
 
  
 
  cfg_opt_t common_opts[] =
 
    {
 
      CFG_SIMPLE_STR("ssh-command", &(*allopts)->remoteio->ssh_command),
 
      CF
 
      CFG_END()
 
    };
 
  
 
  /*
 
    In these arrays, I should replace NULL with a pointer to a string in the struct which should hold the result of confuse processing an option. This is partially because confuse will not free the values it parses.
 
   */
 
  cfg_opt_t server_opts[] = 
 
    {
 
      CFG_STR("username", NULL, CFGF_NONE),
 
      CFG_STR("hostname", NULL, CFGF_NONE),
 
      CFG_STR("method", "ssh", CFGF_NONE),
 
      CFG_STR_LIST("types", NULL, CFGF_NONE),
 
      CFG_END()
 
    };
 

	
 
  cfg_opt_t opts[] =
 
    {
 
      CFG_SEC("common",
 
	      common_opts,
 
	      CFGF_NONE),
 
      CFG_SEC("server",
 
	      server_opts,
 
	      CFGF_MULTI | CFGF_TITLE),
 
      CFG_SEC(myname,
 
	      myopts,
 
	      0),
 
      CFG_FUNC("include",
 
	       &cfg_include),
 
      CFG_END()
 
    };
 

	
 

	
 

	
 
  (*allopts)->data->cfg = cfg_init(opts, 0);
 
  switch(cfg_parse((*allopts)->data->cfg, configfile))
 
    {
 
    default:
 
      fprintf(stderr, "cfg_parse returned an unknown error code\n");
 
    case CFG_FILE_ERROR:
 
      cfg_error((*allopts)->data->cfg, "Couldn't open file ``%s''\n", configfile);
 
      /* no break; on purpose */
 

	
 
    case CFG_PARSE_ERROR:
 
      
 
      free((*allopts)->data);
 
      free(*allopts);
 
      free(configfile);
 
      
 
      return 1;
 
      
 
    case CFG_SUCCESS:
 
      break;
 
    }
 
  
 
  free(configfile);
 
  
 
  *mycfg = cfg_getsec((*allopts)->data->cfg, myname);
 

	
 
  return 0;
 
}
 

	
 
int options_free(struct options_common *opts)
 
{
 
  /* free the other common_options struct's members */
 

	
 
  cfg_free(opts->data->cfg);
 

	
 
  free(opts->remoteio);
 
  free(opts->data);
 
  free(opts);
 
  
 
  return 0;
 
}
src/server/slave.c
Show inline comments
 
/*
 
  Copyright 2009 Nathan Phillip Brink, Ethan Zonca, Matthew 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/>.
 

	
 
 */
 

	
 
/*
 
 * **********************************************************************************
 
 * Slave functions / etc resides below. Wouldn't a seperate file make this easier??
 
 *
 
 * Slave listens on server for a command in the format of each function...
 
 * We need if's for returns... ==> watchdog
 
 * **********************************************************************************
 
*/
 

	
 
// Provides DISTREN_REQUEST* which is in reality, DISTREN_SEND(signal) in the minds of your average joe
 
#include "protocol.h"
 
#include "options.h" // Confuse, etc.
 
#include <string.h>
 

	
 
int slavestatus = 0; // Ugh global vars
 

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

	
 
/* Parses arguments, skips if there are no args */
 
	if(argc>1
 
		&& (strcmp("-c", argv[1]) == 0))
 
	{
 
		char *username;
 
		char *email;
 

	
 
		if(argc != 4)
 
		{
 
			fprintf(stderr, "I need more arguments!\n%d is not enough!\n Invoke 'slave -c <username> <emailaddr> to register'", argc - 1);
 
			fprintf(stderr, "I need more arguments!\n%d is not enough!\n Invoke 'slave -c <username> <emailaddr> to register. \n Already registered? Edit your distrend.conf file!'", argc - 1);
 
			return 234;
 
		}
 

	
 
		username = argv[2];
 
		email = argv[3];
 

	
 
		if(!strchr(email, '@'))
 
		{
 
			fprintf(stderr, "I want to see an '@' in your email address!\n%s may be good enough for you, but I need more!\n", email);
 
			return 235;
 
		}
 
		*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.");
 
		exec('echo %s >> distrend.conf',key);
 
	}
 
/* End arg parser */
 

	
 
char *username;
 
char *key;
 

	
 
username = NULL;
 
key = NULL;
 

	
 
	if('username and the user\'s key filename are in conf file'){
 
		loginuser(username);
 
cfg_t * my_cfg;
 
cfg_opt_t myopts = {
 
		CFG_SIMPLE_STR("username"), &username),
 
		CFG_SIMPLE_STR("key"), &key),
 
		CFG_END()
 
		};
 
struct options_common *commonopts
 
options_init(argc,argv,&my_cfg, &myopts, "slave", &commonopts);
 

	
 
	if(key == NULL || username == NULL){
 
		fprintf(stderr,"You didn't register! Please register or add your username to distrend.conf");
 
	}
 
	else if(key != NULL || username != NULL){
 
		loginuser(username); // Logs in user to the server
 
	}
 
	else{
 
		fprintf(stderr,"Something is terribly wrong!!!");
 
	}
 

	
 

	
 
	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, include this in the blendjob struct later)
 
			while('blender is running'){
 
				SLAVESTATUS=1; // really quite pointless now, but why not. Could be nice for logging.
 
				tell_the_server(DISTREN_REQUEST_PROGRESS);
 
				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
 
			}
 
		SLAVESTATUS=2; // When done rendering, set this.
 
	}
 
	if(SLAVESTATUS==2){
 
		fprintf(stderr, "Finished frame %d in job %d",framenum,jobnum);
 
		SLAVESTATUS=0;
 
	}
 
	if(SLAVESTATUS==0){
 
		tell_the_server(DISTREN_REQUEST_DONEFRAME);
 
		fprintf(stderr, "Idle. No frames to render.");
 
	}
 

	
 
  return 0;
 
}
0 comments (0 inline, 0 general)