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