"help()\n show this help\n"
"quit()\n quit\n"
"hostname()\n hostname\n"
+ "package_version()\n return package version\n"
"user(name[, group])\n change process user (and group)\n"
"verbose(true|false)\n toggle verbose mode\n"
"option(opt[, new_val])\n get/set server option\n"
return 1;
}
+/** Return server package version. */
+static int l_package_version(lua_State *L)
+{
+ lua_pushliteral(L, PACKAGE_VERSION);
+ return 1;
+}
+
char *engine_get_moduledir(struct engine *engine) {
return engine->moduledir;
}
lua_setglobal(engine->L, "quit");
lua_pushcfunction(engine->L, l_hostname);
lua_setglobal(engine->L, "hostname");
+ lua_pushcfunction(engine->L, l_package_version);
+ lua_setglobal(engine->L, "package_version");
lua_pushcfunction(engine->L, l_moduledir);
lua_setglobal(engine->L, "moduledir");
lua_pushcfunction(engine->L, l_verbose);
+++ /dev/null
-local M = {}
-
-local function parseCVE(str)
- local _, last = str:find("CVE")
- local position = last+2
- return str:sub(position,-1)
-end
-
-local function parseVersion(str)
- local branch = "stable"
- local _, last = str:find(branch)
- local position = last+3
- local delimiter = #str
- if str:find("|",position) then
- delimiter = str:find("|",position)-1
- end
- return str:sub(position, delimiter)
-end
-
---Parses version from server and compares it to the installed one
-local function parse(record)
- local output = ""
- local str = record:tostring(0)
- local CVE = parseCVE(str)
- local version = parseVersion(str)
- local localVersion = '@VERSION@'
- if version ~= localVersion then
- output = output .. string.format(
- "[version] Current version of Knot DNS Resolver is different from the latest stable one available."
- .. " (Current: %s, Latest stable: %s)\n",
- localVersion, version)
- if CVE ~= "N/A" then
- output = output .. string.format("[version] CVE: %s\n", CVE)
- end
- end
- io.write(output)
-end
-
---Parses record from answer
-local function request (answer)
- local pkt = kres.pkt_t(answer)
- if pkt:rcode() == kres.rcode.NOERROR then
- parse(pkt:rrsets(kres.section.ANSWER)[1])
- else
- log('[version] Request for version ended with rcode: ', pkt:rcode())
- return
- end
-end
-
-local function callhome()
- resolve('et.knot-resolver.cz', kres.type.TXT, kres.class.IN, 0, request)
-end
-
-function M.config(period)
- if not period or type(period) ~= "number" then
- log("[version] Using default version.config(1*day)")
- return
- end
- M.period = period
- if M.ev then event.cancel(M.ev) end
- M.ev = event.recurrent(M.period, callhome)
-end
-
-
-function M.init()
- M.period = M.period or 1 * day
- M.ev = event.recurrent(M.period, callhome)
-end
-
-function M.deinit()
- if M.ev then event.cancel(M.ev) end
-end
-
-return M