manman-sync init
This commit is contained in:
		
							parent
							
								
									74b1044e4d
								
							
						
					
					
						commit
						703a51b3b9
					
				
							
								
								
									
										13
									
								
								package/gluon-config-mode-manman-sync/Makefile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								package/gluon-config-mode-manman-sync/Makefile
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,13 @@ | |||||||
|  | include $(TOPDIR)/rules.mk | ||||||
|  | 
 | ||||||
|  | PKG_NAME:=gluon-config-mode-manman-sync | ||||||
|  | PKG_VERSION:=2 | ||||||
|  | 
 | ||||||
|  | include ../gluon.mk | ||||||
|  | 
 | ||||||
|  | define Package/gluon-config-mode-manman-sync | ||||||
|  |   TITLE:=Sync location data from manman | ||||||
|  |   DEPENDS:=+gluon-config-mode-core +luci-lib-ip +gluon-manman-sync | ||||||
|  | endef | ||||||
|  | 
 | ||||||
|  | $(eval $(call BuildPackageGluon,gluon-config-mode-manman-sync)) | ||||||
							
								
								
									
										25
									
								
								package/gluon-config-mode-manman-sync/i18n/de.po
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								package/gluon-config-mode-manman-sync/i18n/de.po
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,25 @@ | |||||||
|  | msgid "" | ||||||
|  | msgstr "" | ||||||
|  | "Project-Id-Version: \n" | ||||||
|  | "POT-Creation-Date: \n" | ||||||
|  | "PO-Revision-Date: 2021-12-15 06:29+0100\n" | ||||||
|  | "Last-Translator: Cyrus Fox <cyrus@lambdacore.de>\n" | ||||||
|  | "Language-Team: German\n" | ||||||
|  | "Language: de\n" | ||||||
|  | "MIME-Version: 1.0\n" | ||||||
|  | "Content-Type: text/plain; charset=UTF-8\n" | ||||||
|  | "Content-Transfer-Encoding: 8bit\n" | ||||||
|  | "Plural-Forms: nplurals=2; plural=(n != 1);\n" | ||||||
|  | "X-Generator: Poedit 3.0\n" | ||||||
|  | 
 | ||||||
|  | msgid "Enable ManMan sync" | ||||||
|  | msgstr "ManMan synchronisierung aktivieren" | ||||||
|  | 
 | ||||||
|  | msgid "ManMan location ID" | ||||||
|  | msgstr "ManMan Knoten ID" | ||||||
|  | 
 | ||||||
|  | msgid "" | ||||||
|  | "Sync data from ManMan by entering ManMan location id here.\n" | ||||||
|  | "This will automatically keep name, location and ips in sync with the values " | ||||||
|  | "specified in ManMan." | ||||||
|  | msgstr "" | ||||||
							
								
								
									
										11
									
								
								package/gluon-config-mode-manman-sync/i18n/fr.po
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								package/gluon-config-mode-manman-sync/i18n/fr.po
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,11 @@ | |||||||
|  | msgid "" | ||||||
|  | msgstr "" | ||||||
|  | "Project-Id-Version: PACKAGE VERSION\n" | ||||||
|  | "PO-Revision-Date: 2015-08-12 23:30+0100\n" | ||||||
|  | "Last-Translator:Tobias Bernot <tqbs@airmail.cc>\n" | ||||||
|  | "Language-Team: French\n" | ||||||
|  | "Language: fr\n" | ||||||
|  | "MIME-Version: 1.0\n" | ||||||
|  | "Content-Type: text/plain; charset=UTF-8\n" | ||||||
|  | "Content-Transfer-Encoding: 8bit\n" | ||||||
|  | "Plural-Forms: nplurals=2; plural=(n != 1);\n" | ||||||
| @ -0,0 +1,15 @@ | |||||||
|  | msgid "" | ||||||
|  | msgstr "Content-Type: text/plain; charset=UTF-8" | ||||||
|  | 
 | ||||||
|  | msgid "Enable ManMan sync" | ||||||
|  | msgstr "" | ||||||
|  | 
 | ||||||
|  | msgid "ManMan location ID" | ||||||
|  | msgstr "" | ||||||
|  | 
 | ||||||
|  | msgid "" | ||||||
|  | "Sync data from ManMan " | ||||||
|  | "by entering ManMan location id here.\n" | ||||||
|  | "This will automatically keep name, location and ips " | ||||||
|  | "in sync with the values specified in ManMan." | ||||||
|  | msgstr "" | ||||||
| @ -0,0 +1,17 @@ | |||||||
|  | local site_i18n = i18n 'gluon-site' | ||||||
|  | 
 | ||||||
|  | local uci = require("simple-uci").cursor() | ||||||
|  | 
 | ||||||
|  | local msg | ||||||
|  | 
 | ||||||
|  | if uci:get_bool("gluon", "manman_sync", "enabled") then | ||||||
|  | 	msg = site_i18n._translate('gluon-config-mode:manman') | ||||||
|  | else | ||||||
|  | 	msg = site_i18n._translate('gluon-config-mode:no-manman') | ||||||
|  | end | ||||||
|  | 
 | ||||||
|  | if not msg then return end | ||||||
|  | 
 | ||||||
|  | renderer.render_string(msg, { | ||||||
|  | 	node_id = uci:get("gluon", "manman_sync", "node_id") | ||||||
|  | }) | ||||||
| @ -0,0 +1,36 @@ | |||||||
|  | return function(form, uci) | ||||||
|  | 	if active_vpn == nil then | ||||||
|  | 		return | ||||||
|  | 	end | ||||||
|  | 
 | ||||||
|  | 	local pkg_i18n = i18n 'gluon-config-mode-manman-sync' | ||||||
|  | 
 | ||||||
|  | 	local msg = pkg_i18n.translate( | ||||||
|  | 		'Sync data from ManMan ' .. | ||||||
|  | 		'by entering ManMan location id here.\n' .. | ||||||
|  | 		'This will automatically keep name, location and ips ' .. | ||||||
|  | 			'in sync with the values specified in ManMan.' | ||||||
|  | 	) | ||||||
|  | 
 | ||||||
|  | 	local s = form:section(Section, nil, msg) | ||||||
|  | 
 | ||||||
|  | 	local o | ||||||
|  | 
 | ||||||
|  | 	local manman = s:option(Flag, "manman_sync", pkg_i18n.translate("Enable ManMan sync")) | ||||||
|  | 	manman.default = uci:get_bool("gluon", "manman_sync", "enabled") | ||||||
|  | 	function manman:write(data) | ||||||
|  | 		uci:set("gluon", "manman_sync", "enabled", data) | ||||||
|  | 	end | ||||||
|  | 
 | ||||||
|  | 	local id = s:option(Value, "manman_id", pkg_i18n.translate("ManMan location ID")) | ||||||
|  | 	id:depends(manman, true) | ||||||
|  | 	id.default = uci:get("gluon", "manman_sync", "node_id") | ||||||
|  | 	id.datatype = "nfloat" -- TODO: int | ||||||
|  | 	function id:write(data) | ||||||
|  | 		uci:set("gluon", "manman_sync", "node_id", data) | ||||||
|  | 	end | ||||||
|  | 
 | ||||||
|  | 	function s:write() | ||||||
|  | 		uci:save('gluon') | ||||||
|  | 	end | ||||||
|  | end | ||||||
							
								
								
									
										13
									
								
								package/gluon-manman-sync/Makefile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								package/gluon-manman-sync/Makefile
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,13 @@ | |||||||
|  | include $(TOPDIR)/rules.mk | ||||||
|  | 
 | ||||||
|  | PKG_NAME:=gluon-manman-sync | ||||||
|  | PKG_VERSION:=1 | ||||||
|  | 
 | ||||||
|  | include ../gluon.mk | ||||||
|  | 
 | ||||||
|  | define Package/gluon-manman-sync | ||||||
|  |   DEPENDS:=+gluon-core +micrond | ||||||
|  |   TITLE:=Sync configuration with data from manman | ||||||
|  | endef | ||||||
|  | 
 | ||||||
|  | $(eval $(call BuildPackageGluon,gluon-manman-sync)) | ||||||
							
								
								
									
										21
									
								
								package/gluon-manman-sync/luasrc/lib/gluon/upgrade/500-manman-sync
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										21
									
								
								package/gluon-manman-sync/luasrc/lib/gluon/upgrade/500-manman-sync
									
									
									
									
									
										Executable file
									
								
							| @ -0,0 +1,21 @@ | |||||||
|  | #!/usr/bin/lua | ||||||
|  | 
 | ||||||
|  | -- Setup a cron for manman-sync if enabled | ||||||
|  | 
 | ||||||
|  | local uci = require('simple-uci').cursor() | ||||||
|  | 
 | ||||||
|  | local urandom = io.open('/dev/urandom', 'r') | ||||||
|  | local seed1, seed2 = urandom:read(2):byte(1, 2) | ||||||
|  | math.randomseed(seed1*0x100 + seed2) | ||||||
|  | urandom:close() | ||||||
|  | 
 | ||||||
|  | -- Perform sync at a random time each hour | ||||||
|  | local minute = math.random(0, 59) | ||||||
|  | 
 | ||||||
|  | local f = io.open('/usr/lib/micron.d/manman-sync', 'w') | ||||||
|  | -- Only setup cron if enabled | ||||||
|  | -- Write file regardless to clear old cron | ||||||
|  | if uci:get_bool('gluon', 'manman_sync', 'enabled') then | ||||||
|  |   f:write(string.format('%i * * * * /usr/bin/manman-sync\n', minute)) | ||||||
|  | end | ||||||
|  | f:close() | ||||||
							
								
								
									
										20
									
								
								package/gluon-manman-sync/luasrc/usr/bin/manman-sync
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										20
									
								
								package/gluon-manman-sync/luasrc/usr/bin/manman-sync
									
									
									
									
									
										Executable file
									
								
							| @ -0,0 +1,20 @@ | |||||||
|  | #!/usr/bin/lua | ||||||
|  | 
 | ||||||
|  | local uci = require('simple-uci').cursor() | ||||||
|  | 
 | ||||||
|  | local manman = 'https://manman.graz.funkfeuer.at' | ||||||
|  | 
 | ||||||
|  | if uci:get_bool('gluon', 'manman_sync', 'enabled') then | ||||||
|  |   if not uci:get('gluon', 'manman_sync', 'node_id') then | ||||||
|  |     print('E: manman node_id missing') | ||||||
|  |     return 2 | ||||||
|  |   end | ||||||
|  | 
 | ||||||
|  |   -- check manman location, abort if not reachable | ||||||
|  | 
 | ||||||
|  |   -- try to fetch data | ||||||
|  |   -- check if anything changed since last time | ||||||
|  |   -- if yes, apply changes and do gluon-reload | ||||||
|  | else | ||||||
|  |   print('manman-sync not enabled, skipping') | ||||||
|  | end | ||||||
							
								
								
									
										6
									
								
								package/gluon-manman-sync/src/Makefile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								package/gluon-manman-sync/src/Makefile
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,6 @@ | |||||||
|  | all: respondd.so | ||||||
|  | 
 | ||||||
|  | CFLAGS += -Wall | ||||||
|  | 
 | ||||||
|  | respondd.so: respondd.c | ||||||
|  | 	$(CC) $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) -shared -fPIC -D_GNU_SOURCE -o $@ $^ $(LDLIBS) -lgluonutil -luci | ||||||
							
								
								
									
										78
									
								
								package/gluon-manman-sync/src/respondd.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										78
									
								
								package/gluon-manman-sync/src/respondd.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,78 @@ | |||||||
|  | /*
 | ||||||
|  |   Copyright (c) 2016, Matthias Schiffer <mschiffer@universe-factory.net> | ||||||
|  |   All rights reserved. | ||||||
|  | 
 | ||||||
|  |   Redistribution and use in source and binary forms, with or without | ||||||
|  |   modification, are permitted provided that the following conditions are met: | ||||||
|  | 
 | ||||||
|  |     1. Redistributions of source code must retain the above copyright notice, | ||||||
|  |        this list of conditions and the following disclaimer. | ||||||
|  |     2. Redistributions in binary form must reproduce the above copyright notice, | ||||||
|  |        this list of conditions and the following disclaimer in the documentation | ||||||
|  |        and/or other materials provided with the distribution. | ||||||
|  | 
 | ||||||
|  |   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||||
|  |   AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||||
|  |   IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||||||
|  |   DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE | ||||||
|  |   FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | ||||||
|  |   DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR | ||||||
|  |   SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | ||||||
|  |   CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | ||||||
|  |   OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | ||||||
|  |   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||||
|  | */ | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #include <respondd.h> | ||||||
|  | 
 | ||||||
|  | #include <json-c/json.h> | ||||||
|  | #include <libgluonutil.h> | ||||||
|  | 
 | ||||||
|  | #include <uci.h> | ||||||
|  | 
 | ||||||
|  | #include <string.h> | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | static struct json_object * get_autoupdater(void) { | ||||||
|  | 	struct uci_context *ctx = uci_alloc_context(); | ||||||
|  | 	if (!ctx) | ||||||
|  | 		return NULL; | ||||||
|  | 	ctx->flags &= ~UCI_FLAG_STRICT; | ||||||
|  | 
 | ||||||
|  | 	struct uci_package *p; | ||||||
|  | 	if (uci_load(ctx, "gluon", &p)) | ||||||
|  | 		goto error; | ||||||
|  | 
 | ||||||
|  | 	struct uci_section *s = uci_lookup_section(ctx, p, "manman_sync"); | ||||||
|  | 	if (!s) | ||||||
|  | 		goto error; | ||||||
|  | 
 | ||||||
|  | 	struct json_object *ret = json_object_new_object(); | ||||||
|  | 
 | ||||||
|  | 	json_object_object_add(ret, "nodeid", gluonutil_wrap_string(uci_lookup_option_string(ctx, s, "nodeid"))); | ||||||
|  | 
 | ||||||
|  | 	const char *enabled = uci_lookup_option_string(ctx, s, "enabled"); | ||||||
|  | 	json_object_object_add(ret, "enabled", json_object_new_boolean(enabled && !strcmp(enabled, "1"))); | ||||||
|  | 
 | ||||||
|  | 	uci_free_context(ctx); | ||||||
|  | 
 | ||||||
|  | 	return ret; | ||||||
|  | 
 | ||||||
|  |  error: | ||||||
|  | 	uci_free_context(ctx); | ||||||
|  | 	return NULL; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static struct json_object * respondd_provider_nodeinfo(void) { | ||||||
|  | 	struct json_object *ret = json_object_new_object(); | ||||||
|  | 	json_object_object_add(ret, "manman", get_autoupdater()); | ||||||
|  | 
 | ||||||
|  | 	return ret; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | const struct respondd_provider_info respondd_providers[] = { | ||||||
|  | 	{"nodeinfo", respondd_provider_nodeinfo}, | ||||||
|  | 	{} | ||||||
|  | }; | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user