让monit支持中文

来源:互联网 发布:cydia软件源 编辑:程序博客网 时间:2024/05/16 08:55
前几天因为项目的需要,找到了monit,最看重它的一个功能是能够监控进程,如果进程掉了可以自动重启起来,基本上可以实现无人职守。同时,monit还提供一个简单的web server可以通过浏览器远程监控管理进程等,给我们提供了很大的方便。

但是有一个问题就是这个web server实现的比较简单,没有考虑多语言的支持。不过,我们可以通过简单修改一下monit的源代码,让它支持中文。

修改的方法有两个:
1、http/cervlet.h里面HEAD_HTML这个宏,是monit页面的html头,可以考虑增加:
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
然后,用unicode的方式来编辑monit的控制文件,这样,就能够在页面上用unicode的方式来访问了

这个方法有一个不方便的地方就是必须要用unicode的方式来编辑控制文件。

2、对cervlet.c进行修改,用iconv库把url进行编码转换。在cervlet.c增加如下函数
  1. #include <iconv.h>
  2. int code_convert(char *from_charset,char *to_charset,char *inbuf,int inlen,char *outbuf,int outlen)
  3. {
  4.     iconv_t cd;
  5.     //int rc;
  6.     char **pin = &inbuf;
  7.     char **pout = &outbuf;
  8.     cd = iconv_open(to_charset,from_charset);
  9.     if (cd==0) return -1;
  10.     
  11.     memset(outbuf, 0, outlen);
  12.     if (iconv(cd, (const char **)pin, (unsigned int *)&inlen, pout, &outlen) == -1) 
  13.     {   
  14.         perror("iconv error:");
  15.         return -1;
  16.     }
  17.     iconv_close(cd);
  18.     return 0;
  19. }

再把handle_action函数的前面几行进行修改
  1. static void handle_action(HttpRequest req, HttpResponse res) {
  2.   char *org_name= req->url;
  3.   const char *action= get_parameter(req, "action");
  4.   
  5.   char new_name[512];
  6.   code_convert("UTF-8""GBK", org_name, strlen(org_name), new_name, 512);
  7.   char *name = new_name;
重新编译之后就可以使用了,这个方式的缺点是修改的量有点大,但是以后使用起来就比较方便了。


注:以上代码基于monit-4.6

原创粉丝点击