All pastes #2085959 Raw Edit

dbbackup.c

public c v1 · immutable
#2085959 ·published 2011-09-30 22:36 UTC
rendered paste body
#include <stdio.h>#include <stdlib.h>#include <string.h>#include <time.h>/*mysql_user='******'mysql_pass='******'mysql='mysql'mysql_dump='mysqldump'config='config.txt'backup_base_dir='/backups'time=$(date +"%Y%m%d-%H%M%S")date=$(date +"%Y%m%d")year=$(date +"%Y")month=$(date +"%m")backup_dir="$backup_base_dir/$year/$month"mkdir -p $backup_dir$mysql_dump --no-create-db --disable-keys --add-drop-table --add-locks --create-options \--quick --extended-insert --lock-tables --set-charset \-h $host -u $mysql_user -p$mysql_pass $database $table | gzip > $backup_dir/$backup_file.sql.gztend=$(date +%s)let tdiff=$tend-$tstartecho $(date +"%Y-%m-%d %H:%M:%S") " Backup of $database/$table on $host stored to $backup_file in $tdiff seconds."*/int load_conf( const char *filename, char **result );int get_hosts( int s, char *data, char *hosts );int get_dbs( int s, char *data, char *dbs );char *replace(char *s, char old, char new);void chomp ( char *s );void get_time( char *timestr );int main( int argc, char **argv ){    char mdump[] = "mysqldump";    char dumpopts[] = "--no-create-db --disable-keys --add-drop-table --add-locks --create-options --quick --extended-insert --lock-tables --set-charset";    char dumpopts2[] = "-u ****** -p******";    char *cf;    FILE *file;    if ( argc != 2 ) /* argc should be 2 for correct execution */    {        printf( "\n  Usage: %s configfile\n\n", argv[0] );	return 1;    } else {	cf = argv[1];    }    printf ("Loading config file: %s\n\n", cf);    char *content;     char hosts[1024];    char dbs[1024];    int size;    int sizeh;    int sized;    size = load_conf( cf, &content );    sizeh = get_hosts ( size, content , hosts );    sized = get_dbs ( size, content, dbs );    // debug !    /*    printf ("CONF CHARS FOUND: %d\n", size);    printf ("HOST CHARS FOUND: %d\n", sizeh);    printf ("DB CHARS FOUND: %d\n", sized);    */    int a = 0;    int b = 0;    char *h[64];    char *d[64];    int i;    for ( i=0; i<=sized-1; i++ )    {        int x;	char dline[128];	for ( x=0; dbs[i+x] != '\0'; x++ )	{	    dline[x] = dbs[i+x];	}	dline[x] = '\0';	chomp(dline);	d[b] = strdup(dline);	b++;	i = i + x;    }    for ( i=0; i<=sizeh-1; i++ )    {        int x;	char hline[128];	for ( x=0; hosts[i+x] != '\0'; x++ )	{	    hline[x] = hosts[i+x];	}	hline[x] = '\0';	chomp(hline);	h[a] = strdup(hline);	a++;	i = i + x;    }    int z;    int y;    for ( z = 0; z<a; z++ )    {	//printf ("HOST \"%s\"\n", *(h+z) );	for ( y = 0; y<b; y++ )	{	    // match MYSQL_BACKUP:<hostname> lines	    if ( strstr( *(d+y), *(h+z) ) != NULL )	    {		char *str;		char *str1;		char *dbname;		char hostname[64];		char *p1;		char *p2;		str = strdup ( *(d+y) );		str1 = index( str, ':' ) + 1;		p1 = str1;		p2 = hostname;		dbname = str1;		while ( p1 <= index ( str1, ':' ) - 1 )		{		    *p2++ = *p1++;		}		*p2++ = '\0';		while ( index( str1, ':' ) != NULL )		{		    *dbname++ = *str1++;		}		char *dbtable = strdup( dbname );		char command[256];		int t = 1;		for ( int c=0; c<= strlen ( dbtable ); c++ )		{		    if ( dbtable[c] == ',' )		    {		        t++;		    }		}		while ( index ( dbtable, ',' ) !=NULL )		{		    replace ( dbtable, ',', '\0' );		}		if ( t < 2 )		{		    char time_str[32];		    get_time( time_str );		    char *backup_file = strdup ( dbtable );		    replace ( dbtable, '.', ' ' );		    sprintf (command, "%s %s %s -h %s %s | gzip > %s.%s.%s.sql.gz", mdump, dumpopts, dumpopts2, hostname, dbtable, time_str, hostname, backup_file );		    printf ("Total tables found: \"%d\"\n", t);		    printf ("RUNNING COMMAND: \"%s\"\n\n", command);		    system ( command );		}		else		{		    for ( ; t>0 ; t-- )		    {			char time_str[32];			get_time( time_str );		        char *dbtable1 = dbname;		        char dbtable2[128], *pt1, *pt2;		        pt1 = dbtable1;		        pt2 = dbtable2;		        while( pt1 <= index( dbname, '\0' ) - 1 && *pt1 != ',' )		        {			    *pt2++ = *pt1++;		        }		        *pt2++ = '\0';			char *backup_file = strdup ( dbtable2 );			replace ( dbtable2, '.', ' ' );			sprintf (command, "%s %s %s -h %s %s | gzip > %s.%s.%s.sql.gz", mdump, dumpopts, dumpopts2, hostname, dbtable2, time_str, hostname, backup_file );			printf ("Total tables found: \"%d\"\n", t);			printf ("RUNNING COMMAND: \"%s\"\n\n", command);			dbname = strchr ( dbname, ',' ) + 1;			system ( command );		    }		}	    }	}    }}int load_conf( const char *filename, char **result ){     /* load config file into memory as a multi-dimensional array */    int size = 0;    FILE *f = fopen( filename, "r" );    if ( f == NULL )     { 	*result = NULL;	return -1; // -1 means file opening fail     }     fseek( f, 0, SEEK_END );    size = ftell( f );    fseek( f, 0, SEEK_SET );    *result = ( char * ) malloc( size+1 );    if ( size != fread( *result, sizeof( char ), size, f ) )     { 	free( *result );	return -2; // -2 means file reading fail     }     fclose( f );    ( *result )[size] = 0;    return size;}int get_hosts( int s, char *data, char *hosts ){    /* parse all lines starting with INSTALL: */    int i;    int z = 0;    for ( i=0; i<=s; i++ )    {        if ( data[i] == 'I' && data[i+1] == 'N' && data[i+2] == 'S' && data[i+3] == 'T' && data[i+4] == 'A' && data[i+5] == 'L' && data[i+6] == 'L' )        {            int x;	    char line[128];            for ( x = 0; data[i+x] != '\n'; x++ )            {		line[x] = data[i+x];            }	    line[x++] = '\0';	    if ( strstr ( line, "mysql_backup" ) != NULL )	    {		char *subtext = index( line, ':' ) + 1;		char subtext2[80], *p1, *p2;		p1 = subtext;		p2 = subtext2;		while( p1 <= index( subtext, ':' ) - 1 )		{		    *p2++ = *p1++;		}		*p2++ = '\n';		*p2++ = '\0';		for ( int x=0; x<=strlen( subtext2 ); x++ )		{		    hosts[z] = subtext2[x];		    z++;		}	    }        }    }    return z;}int get_dbs( int s, char *data, char *dbs ){    /* parse all lines begining with string MYSQL_BACKUP: */    int d = 0;    int z;    int y;    for ( z=0; z<=s; z++ )    {	char mline[128];	if ( data[z] == 'M' && data[z+1] == 'Y' && data[z+2] == 'S' && data[z+3] == 'Q' && data[z+4] == 'L' && data[z+5] == '_' && data[z+6] == 'B' &&		data[z+7] == 'A' && data[z+8] == 'C' && data[z+9] == 'K' && data[z+10] == 'U' && data[z+11] == 'P' )	{	    for ( y = 0; data[z+y] != '\n'; y++ )	    {		mline[y] = data[z+y];	    }	    mline[y++] = '\0';		for ( int x=0; x<=strlen( mline ); x++ )		{	    	    dbs[d] = mline[x];		    d++;		}	}    }    return d;}void chomp(char *s) {    /* remove trailing carriage returns */    while(*s && *s != '\n' && *s != '\r') s++;    *s = 0;}char *replace(char *s, char old, char new){    /* search and replace old with new in string s */    char *p = s;    while(*p)    {	if(*p == old)	*p = new;	++p;    }    return s;}void get_time( char *result ){    /* stores time in result formatted: YYYYmmdd_HHMMSS */    char buffer[256];    time_t curtime;    struct tm *loctime;    /* Get the current time. */    curtime = time (NULL);    /* Convert it to local time representation. */    loctime = localtime (&curtime);    strftime ( result, 256, "%Y%m%d_%H%M%S\n", loctime );    chomp( result );}