X-Git-Url: https://code.wpia.club/?a=blobdiff_plain;f=src%2Fmain.cpp;h=dc3e9bbd3f9833aadb0980de9195097cb3c08949;hb=d6d75b59ce6c70b26147f878bb8194106d2ea761;hp=49baf9714d720ffd40abda6f87fb0699fe3fc0ec;hpb=aef2ba57f652658f3bebfa24e706c0083a56e6bf;p=cassiopeia.git diff --git a/src/main.cpp b/src/main.cpp index 49baf97..dc3e9bb 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -17,6 +17,7 @@ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #include +#include #include #include @@ -26,6 +27,15 @@ #include "mysql.h" #include "simpleOpensslSigner.h" +#ifdef NO_DAEMON +#define DAEMON false +#else +#define DAEMON true +#endif + +std::string keyDir; +std::vector profiles; + std::string writeBackFile( uint32_t serial, std::string cert ) { std::string filename = "keys"; mkdir( filename.c_str(), 0755 ); @@ -47,41 +57,114 @@ int main( int argc, const char* argv[] ) { return 1; } - std::shared_ptr jp( new MySQLJobProvider( "localhost", "cacert", argv[1], "cacert" ) ); - std::shared_ptr sign( new SimpleOpensslSigner() ); - std::shared_ptr job = jp->fetchJob(); + std::ifstream config; + config.open( "config.txt" ); - if( !job ) { - std::cout << "Nothing to work on" << std::endl; - return 2; + if( !config.is_open() ) { + std::cerr << "config missing" << std::endl; + return 1; } - if( job->task == "sign" ) { - try { - std::shared_ptr cert = jp->fetchTBSCert( job ); + std::string line1; - if( !cert ) { - std::cout << "wasn't able to load CSR" << std::endl; - return 2; + while( config >> line1 ) { + if( line1[0] == '#' ) { + continue; + } + + int splitter = line1.find( "=" ); + + if( splitter == -1 ) { + std::cerr << "Ignoring malformed config line: " << line1 << std::endl; + continue; + } + + std::string key = line1.substr( 0, splitter ); + std::string value = line1.substr( splitter + 1 ); + + if( key == "key.directory" ) { + keyDir = value; + continue; + } + + if( key.compare( 0, 8, "profile." ) == 0 ) { + int numE = key.find( ".", 9 ); + + if( numE == 0 ) { + std::cout << "invalid line: " << line1 << std::endl; + continue; } - std::cout << "Found a CSR at '" << cert->csr << "' signing" << std::endl; - std::ifstream t( cert->csr ); - cert->csr_content = std::string( std::istreambuf_iterator( t ), std::istreambuf_iterator() ); - - std::shared_ptr res = sign->sign( cert ); - std::string fn = writeBackFile( res->serial, res->certificate ); - res->crt_name = fn; - jp->writeBack( job, res ); - } catch( const char* c ) { - std::cerr << c << std::endl; - return 2; + unsigned int i = atoi( key.substr( 8, numE - 8 ).c_str() ); + std::string rest = key.substr( numE + 1 ); + + if( i + 1 > profiles.size() ) { + profiles.resize( i + 1 ); + } + + if( rest == "key" ) { + profiles[i].cert = value; + } else if( rest == "cert" ) { + profiles[i].key = value; + } else { + std::cout << "invalid line: " << line1 << std::endl; + continue; + } } } - if( !jp->finishJob( job ) ) { - return 1; + std::cout << profiles.size() << " profiles loaded." << std::endl; + + if( keyDir == "" ) { + std::cerr << "Missing config property key.directory" << std::endl; + return -1; } - return 0; + config.close(); + + std::shared_ptr jp( new MySQLJobProvider( "localhost", "cacert", argv[1], "cacert" ) ); + std::shared_ptr sign( new SimpleOpensslSigner() ); + + while( true ) { + std::shared_ptr job = jp->fetchJob(); + + if( !job ) { + std::cout << "Nothing to work on" << std::endl; + sleep( 5 ); + continue; + } + + if( job->task == "sign" ) { + try { + std::shared_ptr cert = jp->fetchTBSCert( job ); + + if( !cert ) { + std::cout << "wasn't able to load CSR" << std::endl; + return 2; + } + + std::cout << "Found a CSR at '" << cert->csr << "' signing" << std::endl; + std::ifstream t( cert->csr ); + cert->csr_content = std::string( std::istreambuf_iterator( t ), std::istreambuf_iterator() ); + + std::shared_ptr res = sign->sign( cert ); + std::string fn = writeBackFile( res->serial, res->certificate ); + res->crt_name = fn; + jp->writeBack( job, res ); + } catch( const char* c ) { + std::cerr << c << std::endl; + return 2; + } + } else { + std::cout << "Unknown job type" << job->task << std::endl; + } + + if( DAEMON && !jp->finishJob( job ) ) { + return 1; + } + + if( !DAEMON ) { + return 0; + } + } }