前言:
服务器会随着应用的需求而改变功能,因此我们需要对服务器版本进行升级。
远程升级需要使用curl工具。
假设A是待升级服务器,B是提供升级服务的机器。
首先我们在B机器上搭建tomcat环境,将升级包放上去,开启服务。(升级包是经过加密的压缩包,用tar工具即可完成,压缩包的密码要保证A机器能知道)
首先判断A机器现有的版本和升级包版本进行对比,判断是否需要升级。
如需要升级,在A机器上利用curl工具,将升级包通过curl函数传输过来。并将升级包进行解密解压缩安装。
curl简介:
curl是利用url语法的开源文件传输工具。
安装curl:
下载源码包,安装三部曲。
使用curl:
直接在C代码test.c中使用。
头文件:
#include
#include
编译:
gcc test.c -o test -I /curl/include -L /curl/lib -lcurl
函数接口:
例如下载地址是:https://10.10.10.11:8443/test/test.txt
//写入文件回调函数
static size_t downLoad_Package_Func(void *ptr, size_t size, size_t nmemb, void *userdata)
{
FILE *fp = (FILE*)userdata;
size_t written = fwrite(ptr, size, nmemb, fp);
return written;
}
//获取文件下载进度的回调函数
static int get_Progress_Func(void *ptr, double totalToDownload, double nowDownloaded, double totalToUpLoad, double nowUpLoaded)
{
int percent = 0;
long int localLen = *(long int *)ptr;
if ( totalToDownload > 0 )
{
percent = (int)((nowDownloaded + (double)localLen) / (totalToDownload + (double)localLen) * 100);
}
printf("Download percent is %0d%%\r", percent);
return 0;
}
static int downloadFile()
{
char down_url[100]="https://10.10.10.11:8443/test/test.txt";
char local_file[100]="/local/test/test.txt"
long int localLen=10000000000;
CURL *curlhandle;
CURLcode res;
// Create a file to save package.
FILE *fp = fopen(local_file, "ab+");
if (! fp)
{
return -1;
}
fseek(fp, 0, SEEK_END);
//初始化
curlhandle = curl_easy_init();
if (!curlhandle)
{
printf("get downloadFile error!\n");
return -1;
}
#if 0
//双向ssl使用
curl_easy_setopt(curlhandle, CURLOPT_SSL_VERIFYPEER, 1L);
curl_easy_setopt(curlhandle, CURLOPT_SSL_VERIFYHOST, 0L);
curl_easy_setopt(curlhandle, CURLOPT_CAINFO,CAFILE);
curl_easy_setopt(curlhandle, CURLOPT_SSLCERT,CERTF);
curl_easy_setopt(curlhandle, CURLOPT_SSLKEY,KEYF);
curl_easy_setopt(curlhandle, CURLOPT_SSLKEYPASSWD,PASSWD);
#endif
//如果是ssl,不验证服务端证书
curl_easy_setopt(curlhandle, CURLOPT_SSL_VERIFYPEER, 0L);
//如果是ssl,不验证服务端name
curl_easy_setopt(curlhandle, CURLOPT_SSL_VERIFYHOST, 0L);
//设置url
curl_easy_setopt(curlhandle, CURLOPT_URL, down_url);
//下载文件的回调函数和文件指针
curl_easy_setopt(curlhandle, CURLOPT_WRITEFUNCTION, downLoad_Package_Func);
curl_easy_setopt(curlhandle, CURLOPT_WRITEDATA, fp);
//进度条
curl_easy_setopt(curlhandle, CURLOPT_NOPROGRESS, 0L);
curl_easy_setopt(curlhandle, CURLOPT_PROGRESSFUNCTION, get_Progress_Func);
curl_easy_setopt(curlhandle, CURLOPT_PROGRESSDATA, &localLen);
//设置一个长整形数,控制传送多少字节
curl_easy_setopt(curlhandle, CURLOPT_LOW_SPEED_LIMIT, 1L);
//设置一个长整形数,控制多少秒传送CURLOPT_LOW_SPEED_LIMIT规定的字节数
curl_easy_setopt(curlhandle, CURLOPT_LOW_SPEED_TIME, 10L);
//不输出header头
curl_easy_setopt(curlhandle, CURLOPT_HEADER, 0L);
//接收body
curl_easy_setopt(curlhandle, CURLOPT_NOBODY, 0L);
//断点续传
curl_easy_setopt(curlhandle, CURLOPT_RESUME_FROM, localLen);
//不输出冗余信息
curl_easy_setopt(curlhandle, CURLOPT_VERBOSE, 0L);
//多线程时建议设置
//curl_easy_setopt(curlhandle, CURLOPT_NOSIGNAL, 1L);
//下载文件
res = curl_easy_perform(curlhandle);
curl_easy_cleanup(curlhandle);
if (res != 0)
{
fclose(fp);
printf("get downloadFile error!\n");
return -1;
}
fclose(fp);
return 0;
}
完!!