29
2020
11

解决Cacti无法选择时间、图形无法框选放大(即时间筛选功能失效)的方法

今天突然发现公司网络流量监控工具Cacti突然间不能框选放大流量图了,而且也不能自定义时间查找流量图了,感觉挺奇怪的,还以为是OS或者什么出现了问题,结果网上一搜,发现这个问题原来很早就有人发现了,各种搜索下来也明白到底是怎么回事了,所以写下这篇文章作为一个个人笔记了~


首先要说的是发生这个问题的原因,简单的来说就是Cacti的开发人员/开发团队给相关的代码上加了一个Unix时间戳,设定筛选的起始时间和结束时间必须得早于2020/9/13 20:26:40才行,过了这个时间Cacti的筛选功能就会失效,至于为什么这么做?我也不清楚是Cacti团队“不讲武德”,还是其它更深层次的原因,这个咱们这里就不讨论了。


那么问题既然找到了,解决起来也简单了,根据网上各路大神们的说法,跟时间筛选功能有关的文件主要有两个,分别是Cacti根目录下的graph_image.php文件和graph_xport.php文件,我们打开这两个文件,找到下面两段代码(以下以0.8.8h版本为例,上面一段代码出自文件graph_xport.php,下面一段代码出自文件graph_image.php):

/* override: graph start time (unix time) */
if (!empty($_GET["graph_start"]) && is_numeric($_GET["graph_start"]) && $_GET["graph_start"] < 1600000000) {
    $graph_data_array["graph_start"] = get_request_var("graph_start");
}

/* override: graph end time (unix time) */
if (!empty($_GET["graph_end"]) && is_numeric($_GET["graph_end"]) && $_GET["graph_end"] < 1600000000) {
    $graph_data_array["graph_end"] = get_request_var("graph_end");
}


/* override: graph end time (unix time) */
if (!empty($_GET["graph_end"]) && $_GET["graph_end"] < 1600000000) {
    $graph_data_array["graph_end"] = $_GET["graph_end"];
}

/* override: graph height (in pixels) */
if (!empty($_GET["graph_height"]) && $_GET["graph_height"] < 3000) {
    $graph_data_array["graph_height"] = $_GET["graph_height"];
}

这两个地方的两段代码中,1600000000这个时间戳便是这个问题的“罪魁祸首”,解决方案就是把这个时间改大就可以了,当然建议大家养成修改之前先做备份的习惯~

至于改成多少,Cacti官方在后续版本里把这个参数做成了一个名为FILTER_VALIDATE_MAX_DATE_AS_INT的变量,而这个变量的赋值是2088385563,所以作为保守派的我觉得就改成这个值就可以了,也就是北京时间2036年3月6日11时6分3秒,也就是说这个时间点之后这个BUG又会出现,然而……谁知道这个时间点之后咱们还会不会用Cacti呢?对吧

当然对PHP比较熟悉的朋友们也可以直接类似if (!empty($_GET["graph_end"]))把这个功能给屏蔽掉,不过咱保守派,且对PHP不是很熟,就不用这么狠的方法了,有需要的话大家可以酌情使用哦~


这里稍微解释一下“1600000000”和“2020/9/13 20:26:40”的关系,上面我们提到过这个数字指的是Unix时间戳,那么什么是Unix时间戳呢,简单的理解就是从UTC/GMT时间1970年1月1日0时0分0秒开始所经过的秒数,这个时间点开始往后数1600000000秒,便是北京时间2020年9月13日20时26分40秒了,上面提到的官方后续版本用的值,也就是往后数2088385563秒,所以就是北京时间2036年3月6日11时6分3秒了,网上有很多计算这个的工具的,直接搜索“Unix时间戳计算”就会出来很多了。


最后P.S.一下,根据网友们的统计,这个BUG会影响到0.8.7至1.2.10的所有版本,之前和之后的版本均不受影响,这篇文章所有内容都是基于我正在使用的0.8.8h版本写的,1.x版本的代码段会稍微有点不一样,但是值是一样的,也就是说检索文件内容的时候可以通过“1600000000”来搜比较稳妥,具体大家可以再网上搜搜,这个问题的文章特别多……

« 上一篇 下一篇 »

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。