+-- Application specific information functions
+function app_description()
+ return I18N.translate("Dynamic DNS allows that your router can be reached with " ..
+ "a fixed hostname while having a dynamically changing IP address.")
+ .. [[<br />]]
+ .. I18N.translate("OpenWrt Wiki") .. ": "
+ .. [[<a href="http://wiki.openwrt.org/doc/howto/ddns.client" target="_blank">]]
+ .. I18N.translate("DDNS Client Documentation") .. [[</a>]]
+ .. " --- "
+ .. [[<a href="http://wiki.openwrt.org/doc/uci/ddns" target="_blank">]]
+ .. I18N.translate("DDNS Client Configuration") .. [[</a>]]
+end
+function app_title_back()
+ return [[<a href="]]
+ .. DISP.build_url("admin", "services", "ddns")
+ .. [[">]]
+ .. I18N.translate(app_title)
+ .. [[</a>]]
+end
+
+-- Standardized application/service functions
+function app_title_main()
+ return [[<a href="javascript:alert(']]
+ .. I18N.translate("Version Information")
+ .. [[\n\n]] .. app_name
+ .. [[\n\t]] .. I18N.translate("Version") .. [[:\t]] .. app_version
+ .. [[\n\n]] .. srv_name .. [[ ]] .. I18N.translate("required") .. [[:]]
+ .. [[\n\t]] .. I18N.translate("Version") .. [[:\t]]
+ .. srv_ver_min .. [[ ]] .. I18N.translate("or higher")
+ .. [[\n\n]] .. srv_name .. [[ ]] .. I18N.translate("installed") .. [[:]]
+ .. [[\n\t]] .. I18N.translate("Version") .. [[:\t]]
+ .. (service_version() or I18N.translate("NOT installed"))
+ .. [[\n\n]]
+ .. [[')">]]
+ .. I18N.translate(app_title)
+ .. [[</a>]]
+end
+function service_version()
+ local ver = nil
+ IPKG.list_installed(srv_name, function(n, ver, d)
+ -- nothing to do
+ end
+ )
+ if not ver then
+ ver = UTIL.exec(srv_ver_cmd)
+ if #ver == 0 then ver = nil end
+ end
+ return ver
+end
+function service_ok()
+ return IPKG.compare_versions((service_version() or "0"), ">=", srv_ver_min)
+end
+
+-- internal function to read all sections status and return data array