{
    "name"  : "检查是否存在路由震荡导致网络闪断",
    "precondition" : ["name"],
    "problems" : {
        "problem1" : {
            "desc"      : "【问题】检查到链路DOWN导致OSPF路由重新计算造成路由振荡，异常接口为${0}",
            "advice"    : "【建议】检查链路是否有异常，比如接口光模块是否存在光衰，接口线是否松动等。"
        },
		"problem2" : {
			"desc"      : "【问题】检查到设备接收不到数据包导致发生震荡。异常接口为${0}",
            "advice"    : "【建议】检查设备的包发送接收情况，保证与邻居通信良好"
		},
		"problem3" : {
			"desc"      : "【问题】检查到设备间邻居发生震荡。异常接口为${0}",
            "advice"    : "【建议】检查设备邻居的链路状态是否正常。"
		}
    }
}
---------------------------code-------------------------------
#判断是否支持ospf
cli('config')
result = cli('router ?')
if result.indexOf('ospf') == -1 :
    cli('exit')
	return 'skip'
end

cli('exit')
#检查网络闪断是否是由链路DOWN造成的
result=cli('show logging')
#result = '*Jan  1 01:37:13: %OSPF-5-ADJCHG: Process 100, Nbr 2.2.2.2-TenGigabitEthernet 0/41 from Full to Down, KillNbr.'
result=result.split(/\r?\n/)
#缓存cli命令结果
set_share_value('show_logging',result)
reg=(/%OSPF-5-ADJCHG/)
check=(/from\sFull\sto\sDown,\sKillNbr/)
foreach item in result :
    if reg.test(item) :
	    if check.test(item) :
		    item=item.split(/\s+/)
			item=item[7]
            item=item.split(/-/)			
            interface_index=item[1]
			add_problem('problem1',[interface_index])
			return 'warn'
		end
	end
end

#检查震荡是否由设备接收不到数据包导致的
check=(/from\sFull\sto\sDown,\sInactivityTimer/)
foreach item in result :
    if reg.test(item) :
	    if check.test(item) :
		    item=item.split(/\s+/)
			item=item[7]
            item=item.split(/-/)			
            interface_index=item[1]
			add_problem('problem2',[interface_index])
			return 'warn'
		end
	end
end

#检查设备间邻居是否发生震荡
check=(/from\sFull\sto\sInit,\s1-WayReceived/)
foreach item in result :
    if reg.test(item) :
	    if check.test(item) :
		    item=item.split(/\s+/)
			item=item[7]
            item=item.split(/-/)			
            interface_index=item[1]
			add_problem('problem3',[interface_index])
			return 'warn'
		end
	end
end

return 'success'