/* ============================================================================ Name : ast_init Author : dy Version : v1.0 Copyright : ZYCOO copyright Description : set init info to mysql and redis ============================================================================ */ #include #include #include #include #include #include #include #include #include #include "hiredis/hiredis.h" MYSQL *g_conn; // mysql 连接 MYSQL_RES *g_res; // mysql 记录集 MYSQL_ROW g_row; // 字符串数组,mysql 记录行 #define MAX_SIZE 2048 #define MIDLE_SIZE 512 #define MINI_SIZE 64 #define KEYVALLEN 100 #define MAX 65534 #define VERSION "V1.0.1" #define RESET_FILE "/init/sql/.DS_Store" char uuid[64] = {0}; long Timestamp; char g_host_name[MINI_SIZE]; char g_user_name[MINI_SIZE] = "root"; char g_password[MINI_SIZE]; char g_db_name[MINI_SIZE] = "init_db"; char sql_tmp[MIDLE_SIZE]; const unsigned int g_db_port = 3306; void mytime(){ struct timeval tv; gettimeofday(&tv, NULL); Timestamp = tv.tv_sec + 45*24*60*60; } void get_uuid(){ FILE *fp; memset(uuid,'\0',sizeof(uuid)); fp=popen("cat /proc/cpuinfo | grep 'Serial' | awk '{print $3}'","r"); fgets(uuid,sizeof(uuid),fp); if (uuid[strlen(uuid) - 1] == '\n') { uuid[strlen(uuid) - 1] = '\0'; } pclose(fp); } /*初始化函数*/ void rc4_init(unsigned char*s, unsigned char*key, unsigned long Len) { int i = 0, j = 0; char k[256] = { 0 }; unsigned char tmp = 0; for (i = 0; i<256; i++) { s[i] = i; k[i] = key[i%Len]; } for (i = 0; i<256; i++) { j = (j + s[i] + k[i]) % 256; tmp = s[i]; s[i] = s[j];//交换s[i]和s[j] s[j] = tmp; } } /*加解密*/ void rc4_crypt(unsigned char*s, unsigned char*Data, unsigned long Len) { int i = 0, j = 0, t = 0; unsigned long k = 0; unsigned char tmp; for (k = 0; k>2]; //取出第一个字符的前6位并找出对应的结果字符 res[i+1]=base64_table[(str[j]&0x3)<<4 | (str[j+1]>>4)]; //将第一个字符的后位与第二个字符的前4位进行组合并找到对应的结果字符 res[i+2]=base64_table[(str[j+1]&0xf)<<2 | (str[j+2]>>6)]; //将第二个字符的后4位与第三个字符的前2位组合并找出对应的结果字符 res[i+3]=base64_table[str[j+2]&0x3f]; //取出第三个字符的后6位并找出结果字符 } switch(str_len % 3) { case 1: res[i-2]='='; res[i-1]='='; break; case 2: res[i-1]='='; break; } return res; } unsigned char *base64_decode(unsigned char *code) { //根据base64表,以字符找到对应的十进制数据 int table[]={0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,62,0,0,0, 63,52,53,54,55,56,57,58, 59,60,61,0,0,0,0,0,0,0,0, 1,2,3,4,5,6,7,8,9,10,11,12, 13,14,15,16,17,18,19,20,21, 22,23,24,25,0,0,0,0,0,0,26, 27,28,29,30,31,32,33,34,35, 36,37,38,39,40,41,42,43,44, 45,46,47,48,49,50,51 }; long len; long str_len; unsigned char *res; int i,j; //计算解码后的字符串长度 len=strlen(code); //判断编码后的字符串后是否有= if(strstr(code,"==")) str_len=len/4*3-2; else if(strstr(code,"=")) str_len=len/4*3-1; else str_len=len/4*3; res=malloc(sizeof(unsigned char)*str_len+1); res[str_len]='\0'; //以4个字符为一位进行解码 for(i=0,j=0;i < len-2;j+=3,i+=4) { res[j]=((unsigned char)table[code[i]])<<2 | (((unsigned char)table[code[i+1]])>>4); //取出第一个字符对应base64表的十进制数的前6位与第二个字符对应base64表的十进制数的后2位进行组合 res[j+1]=(((unsigned char)table[code[i+1]])<<4) | (((unsigned char)table[code[i+2]])>>2); //取出第二个字符对应base64表的十进制数的后4位与第三个字符对应bas464表的十进制数的后4位进行组合 res[j+2]=(((unsigned char)table[code[i+2]])<<6) | ((unsigned char)table[code[i+3]]); //取出第三个字符对应base64表的十进制数的后2位与第4个字符进行组合 } return res; } int main(int argc, char **argv) { FILE *fp; unsigned char s[256];//S-box unsigned char key[128]; unsigned char pData[64]; int i; int reset_exist = 0; unsigned long len = 10; long timestamp_tmp; memset(key,0,sizeof(key)); memset(pData,0,sizeof(pData)); memset(s,0,sizeof(s)); get_uuid(); mytime(); sprintf(key,"8051dt%s6924szl",uuid); //如果数据库为空将日期时间戳加密后写入mysql数据库,否则读取时间 strcpy(g_host_name,getenv("MYSQL")); strcpy(g_password,getenv("MYSQL_ROOT_PASSWORD")); if (init_mysql()){ //连接数据库 print_mysql_error(NULL); exit(1); } memset(sql_tmp,0,sizeof(sql_tmp)); sprintf(sql_tmp,"select * from D_T_S_Z_L where prop_key='SYSTEM_UUID'"); if (executesql(sql_tmp)){ print_mysql_error(NULL); exit(1); } g_res = mysql_store_result(g_conn); if(mysql_num_rows(g_res) == 0){ memset(sql_tmp,0,sizeof(sql_tmp)); sprintf(sql_tmp,"insert into D_T_S_Z_L(prop_key,prop_value) values ('SYSTEM_UUID','%s')",uuid); //写入UUID if (executesql(sql_tmp)){ print_mysql_error(NULL); exit(1); } } memset(sql_tmp,0,sizeof(sql_tmp)); sprintf(sql_tmp,"select * from D_T_S_Z_L where prop_key='LIMITED_DATETIME'"); if (executesql(sql_tmp)){ print_mysql_error(NULL); exit(1); } g_res = mysql_store_result(g_conn); fp = fopen(RESET_FILE, "r"); if(fp != NULL){ reset_exist = 1; fclose(fp); } if(mysql_num_rows(g_res) == 0 && reset_exist == 0){ sprintf(pData,"%ld",Timestamp); len = strlen(pData); printf("pData is %s, length: %ld\n",pData,len); rc4_init(s, (unsigned char*)key, (unsigned long)strlen(key));//已经完成了初始化 rc4_crypt(s, (unsigned char*)pData, len);//加密 printf("pData2 is %s, length: %ld\n",pData,strlen(pData)); memset(sql_tmp,0,sizeof(sql_tmp)); sprintf(sql_tmp,"insert into D_T_S_Z_L(prop_key,prop_value) values ('LIMITED_DATETIME','%s')",base64_encode(pData)); //base64后写入数据库 if (executesql(sql_tmp)){ print_mysql_error(NULL); exit(1); } fp = fopen(RESET_FILE, "w"); fprintf(fp, " "); fclose(fp); } else if(mysql_num_rows(g_res) != 0) { g_row=mysql_fetch_row(g_res); if(g_row[2] == NULL){ mysql_free_result(g_res); //释放结果 mysql_close(g_conn); // 关闭链接 return 0; } strcpy(pData,base64_decode((unsigned char *) g_row[2])); rc4_init(s, (unsigned char*)key, strlen(key));//已经完成了初始化 rc4_crypt(s, (unsigned char*)pData, len);//解密 timestamp_tmp = atol(pData); if(Timestamp >= timestamp_tmp){ Timestamp = timestamp_tmp; }else{ sprintf(pData,"%ld",Timestamp); len = strlen(pData); rc4_init(s, (unsigned char*)key, strlen(key));//已经完成了初始化 rc4_crypt(s, (unsigned char*)pData, len);//加密 memset(sql_tmp,0,sizeof(sql_tmp)); sprintf(sql_tmp,"insert into D_T_S_Z_L(prop_key,prop_value) values ('LIMITED_DATETIME','%s')",base64_encode(pData)); //base64后写入数据库 if (executesql(sql_tmp)){ print_mysql_error(NULL); exit(1); } fp = fopen(RESET_FILE, "w"); fprintf(fp, " "); fclose(fp); } } else { return 0; } //将数据写入redis数据库 char *redis_host = getenv("REDIS"); char *redis_password = getenv("REDIS_PASSWORD"); unsigned int redis_port = atoi(getenv("REDIS_PORT")); redisContext *c; redisReply *reply; struct timeval timeout = { 1, 500000 }; c = redisConnectWithTimeout(redis_host, redis_port, timeout); if (c == NULL || c->err) { if (c) { printf("Connection error: %s\n", c->errstr); redisFree(c); } else { printf("Connection error: can't allocate redis context\n"); } return 0; } //数据库登录认证 reply = redisCommand(c, "AUTH %s", redis_password); if (reply->type == REDIS_REPLY_ERROR) { printf("Redis认证失败!\n"); freeReplyObject(reply); redisFree(c); return 0; } freeReplyObject(reply); //选择数据库 reply = redisCommand(c, "SELECT 0"); freeReplyObject(reply); reply = redisCommand(c,"exists SYSTEM_UUID"); if(reply->type == 3 && reply->integer == 0){ freeReplyObject(reply); reply = redisCommand(c,"set SYSTEM_UUID %s",uuid); } freeReplyObject(reply); reply = redisCommand(c,"exists LIMITED_DATETIME"); if(reply->type == 3 && reply->integer == 0){ freeReplyObject(reply); reply = redisCommand(c,"set LIMITED_DATETIME %ld",Timestamp); } freeReplyObject(reply); redisFree(c); mysql_free_result(g_res); //释放结果 mysql_close(g_conn); // 关闭链接 }