From mboxrd@z Thu Jan 1 00:00:00 1970 From: Marcel Lorenz <marcel.lorenz@ipfire.org> To: development@lists.ipfire.org Subject: [PATCH] new package: unbound 1.5.9 Date: Tue, 02 Aug 2016 20:48:17 +0200 Message-ID: <1470163697-30802-2-git-send-email-marcel.lorenz@ipfire.org> In-Reply-To: <1470163697-30802-1-git-send-email-marcel.lorenz@ipfire.org> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============6610858721895677634==" List-Id: <development.lists.ipfire.org> --===============6610858721895677634== Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Unbound is a validating, recursive, and caching DNS resolver. https://www.unbound.net Signed-off-by: Marcel Lorenz <marcel.lorenz(a)ipfire.org> --- config/rootfiles/packages/unbound | 70 ++++++++ config/unbound/blocklists/ms-telemetry.conf | 49 ++++++ config/unbound/forward.conf | 6 + config/unbound/root.hints | 90 ++++++++++ config/unbound/root.key | 9 + config/unbound/site-packages/daemonize.py | 247 +++++++++++++++++++++++++= ++ config/unbound/site-packages/dhcpd.py | 108 ++++++++++++ config/unbound/site-packages/params.py | 46 +++++ config/unbound/site-packages/watcherdhcpd.py | 107 ++++++++++++ config/unbound/unbound-dhcpd.py | 145 ++++++++++++++++ config/unbound/unbound-switch | 80 +++++++++ config/unbound/unbound-zone | 78 +++++++++ config/unbound/unbound.conf | 123 +++++++++++++ lfs/unbound | 103 +++++++++++ make.sh | 1 + src/initscripts/init.d/network-unbound | 114 +++++++++++++ src/initscripts/init.d/unbound | 178 +++++++++++++++++++ src/initscripts/init.d/unbound-dhcpd | 61 +++++++ src/paks/unbound/install.sh | 70 ++++++++ src/paks/unbound/uninstall.sh | 27 +++ src/paks/unbound/update.sh | 26 +++ 21 files changed, 1738 insertions(+) create mode 100644 config/rootfiles/packages/unbound create mode 100644 config/unbound/blocklists/ms-telemetry.conf create mode 100644 config/unbound/forward.conf create mode 100644 config/unbound/root.hints create mode 100644 config/unbound/root.key create mode 100644 config/unbound/site-packages/daemonize.py create mode 100644 config/unbound/site-packages/dhcpd.py create mode 100644 config/unbound/site-packages/params.py create mode 100644 config/unbound/site-packages/watcherdhcpd.py create mode 100644 config/unbound/unbound-dhcpd.py create mode 100755 config/unbound/unbound-switch create mode 100644 config/unbound/unbound-zone create mode 100644 config/unbound/unbound.conf create mode 100644 lfs/unbound create mode 100644 src/initscripts/init.d/network-unbound create mode 100644 src/initscripts/init.d/unbound create mode 100644 src/initscripts/init.d/unbound-dhcpd create mode 100644 src/paks/unbound/install.sh create mode 100644 src/paks/unbound/uninstall.sh create mode 100644 src/paks/unbound/update.sh diff --git a/config/rootfiles/packages/unbound b/config/rootfiles/packages/un= bound new file mode 100644 index 0000000..c468167 --- /dev/null +++ b/config/rootfiles/packages/unbound @@ -0,0 +1,70 @@ +etc/rc.d/init.d/network-unbound +etc/rc.d/init.d/unbound +etc/rc.d/init.d/unbound-dhcpd +#etc/unbound +#etc/unbound/blocklists +etc/unbound/blocklists/ms-telemetry.conf +etc/unbound/forward.conf +etc/unbound/root.hints +etc/unbound/root.key +etc/unbound/unbound.conf +etc/unbound/unbound_org.conf +usr/bin/unbound-host +#usr/include/unbound.h +#usr/lib/libunbound.la +usr/lib/libunbound.so +usr/lib/libunbound.so.2 +usr/lib/libunbound.so.2.4.1 +#usr/lib/python2.7/site-packages/_unbound.la +usr/lib/python2.7/site-packages/_unbound.so +usr/lib/python2.7/site-packages/daemonize.py +usr/lib/python2.7/site-packages/dhcpd.py +usr/lib/python2.7/site-packages/params.py +usr/lib/python2.7/site-packages/unbound.py +usr/lib/python2.7/site-packages/watcherdhcpd.py +usr/sbin/unbound +usr/sbin/unbound-anchor +usr/sbin/unbound-checkconf +usr/sbin/unbound-dhcpd.py +usr/sbin/unbound-control +usr/sbin/unbound-control-setup +usr/sbin/unbound-switch +usr/sbin/unbound-zone +#usr/share/man/man1/unbound-host.1 +#usr/share/man/man3/libunbound.3 +#usr/share/man/man3/ub_cancel.3 +#usr/share/man/man3/ub_ctx.3 +#usr/share/man/man3/ub_ctx_add_ta.3 +#usr/share/man/man3/ub_ctx_add_ta_file.3 +#usr/share/man/man3/ub_ctx_async.3 +#usr/share/man/man3/ub_ctx_config.3 +#usr/share/man/man3/ub_ctx_create.3 +#usr/share/man/man3/ub_ctx_data_add.3 +#usr/share/man/man3/ub_ctx_data_remove.3 +#usr/share/man/man3/ub_ctx_debuglevel.3 +#usr/share/man/man3/ub_ctx_debugout.3 +#usr/share/man/man3/ub_ctx_delete.3 +#usr/share/man/man3/ub_ctx_get_option.3 +#usr/share/man/man3/ub_ctx_hosts.3 +#usr/share/man/man3/ub_ctx_print_local_zones.3 +#usr/share/man/man3/ub_ctx_resolvconf.3 +#usr/share/man/man3/ub_ctx_set_fwd.3 +#usr/share/man/man3/ub_ctx_set_option.3 +#usr/share/man/man3/ub_ctx_trustedkeys.3 +#usr/share/man/man3/ub_ctx_zone_add.3 +#usr/share/man/man3/ub_ctx_zone_remove.3 +#usr/share/man/man3/ub_fd.3 +#usr/share/man/man3/ub_poll.3 +#usr/share/man/man3/ub_process.3 +#usr/share/man/man3/ub_resolve.3 +#usr/share/man/man3/ub_resolve_async.3 +#usr/share/man/man3/ub_resolve_free.3 +#usr/share/man/man3/ub_result.3 +#usr/share/man/man3/ub_strerror.3 +#usr/share/man/man3/ub_wait.3 +#usr/share/man/man5/unbound.conf.5 +#usr/share/man/man8/unbound-anchor.8 +#usr/share/man/man8/unbound-checkconf.8 +#usr/share/man/man8/unbound-control-setup.8 +#usr/share/man/man8/unbound-control.8 +#usr/share/man/man8/unbound.8 diff --git a/config/unbound/blocklists/ms-telemetry.conf b/config/unbound/blo= cklists/ms-telemetry.conf new file mode 100644 index 0000000..7801e76 --- /dev/null +++ b/config/unbound/blocklists/ms-telemetry.conf @@ -0,0 +1,49 @@ +# Windows telemetry +local-data: "a-0001.a-msedge.net A 127.0.0.1" +local-data: "asimov-win.settings.data.microsoft.com.akadns.net. A 127.0.0.1" +local-data: "asimov-win.vortex.data.microsoft.com.akadns.net. A 127.0.0.1" +local-data: "choice.microsoft.com A 127.0.0.1" +local-data: "choice.microsoft.com.nsatc.net A 127.0.0.1" +local-data: "compatexchange.cloudapp.net A 127.0.0.1" +local-data: "corpext.msitadfs.glbdns2.microsoft.com A 127.0.0.1" +local-data: "corp.sts.microsoft.com A 127.0.0.1" +local-data: "cs1.wpc.v0cdn.net A 127.0.0.1" +local-data: "df.telemetry.microsoft.com A 127.0.0.1" +local-data: "diagnostics.support.microsoft.com A 127.0.0.1" +local-data: "fe2.update.microsoft.com.akadns.net A 127.0.0.1" +local-data: "feedback.microsoft-hohm.com A 127.0.0.1" +local-data: "feedback.search.microsoft.com A 127.0.0.1" +local-data: "feedback.windows.com A 127.0.0.1" +local-data: "i1.services.social.microsoft.com A 127.0.0.1" +local-data: "i1.services.social.microsoft.com.nsatc.net A 127.0.0.1" +local-data: "nexus.officeapps.live.com A 127.0.0.1" +local-data: "oca.telemetry.microsoft.com A 127.0.0.1" +local-data: "oca.telemetry.microsoft.com.nsatc.net A 127.0.0.1" +local-data: "pre.footprintpredict.com A 127.0.0.1" +local-data: "redir.metaservices.microsoft.com A 127.0.0.1" +local-data: "reports.wes.df.telemetry.microsoft.com A 127.0.0.1" +local-data: "services.wes.df.telemetry.microsoft.com A 127.0.0.1" +local-data: "settings-sandbox.data.microsoft.com A 127.0.0.1" +local-data: "settings-win.data.microsoft.com A 127.0.0.1" +local-data: "sls.update.microsoft.com.akadns.net A 127.0.0.1" +local-data: "sqm.df.telemetry.microsoft.com A 127.0.0.1" +local-data: "sqm.telemetry.microsoft.com A 127.0.0.1" +local-data: "sqm.telemetry.microsoft.com.nsatc.net A 127.0.0.1" +local-data: "statsfe1.ws.microsoft.com A 127.0.0.1" +local-data: "statsfe2.update.microsoft.com.akadns.net A 127.0.0.1" +local-data: "statsfe2.ws.microsoft.com A 127.0.0.1" +local-data: "survey.watson.microsoft.com A 127.0.0.1" +local-data: "telecommand.telemetry.microsoft.com A 127.0.0.1" +local-data: "telecommand.telemetry.microsoft.com.nsatc.net A 127.0.0.1" +local-data: "telemetry.appex.bing.net A 127.0.0.1" +local-data: "telemetry.microsoft.com A 127.0.0.1" +local-data: "telemetry.urs.microsoft.com A 127.0.0.1" +local-data: "vortex.data.microsoft.com A 127.0.0.1" +local-data: "vortex-sandbox.data.microsoft.com A 127.0.0.1" +local-data: "vortex-win.data.microsoft.com A 127.0.0.1" +local-data: "watson.live.com A 127.0.0.1" +local-data: "watson.microsoft.com A 127.0.0.1" +local-data: "watson.ppe.telemetry.microsoft.com A 127.0.0.1" +local-data: "watson.telemetry.microsoft.com A 127.0.0.1" +local-data: "watson.telemetry.microsoft.com.nsatc.net A 127.0.0.1" +local-data: "wes.df.telemetry.microsoft.com A 127.0.0.1" diff --git a/config/unbound/forward.conf b/config/unbound/forward.conf new file mode 100644 index 0000000..5784f9f --- /dev/null +++ b/config/unbound/forward.conf @@ -0,0 +1,6 @@ +forward-zone: + name: "." + forward-addr: 85.214.20.141 + forward-addr: 194.150.168.168 + forward-addr: 208.67.222.222 + forward-addr: 208.67.220.220 diff --git a/config/unbound/root.hints b/config/unbound/root.hints new file mode 100644 index 0000000..3c82146 --- /dev/null +++ b/config/unbound/root.hints @@ -0,0 +1,90 @@ +; This file holds the information on root name servers needed to +; initialize cache of Internet domain name servers +; (e.g. reference this file in the "cache . <file>" +; configuration file of BIND domain name servers). +; +; This file is made available by InterNIC=20 +; under anonymous FTP as +; file /domain/named.cache +; on server FTP.INTERNIC.NET +; -OR- RS.INTERNIC.NET +; +; last update: March 23, 2016 +; related version of root zone: 2016032301 +; +; formerly NS.INTERNIC.NET +; +. 3600000 NS A.ROOT-SERVERS.NET. +A.ROOT-SERVERS.NET. 3600000 A 198.41.0.4 +A.ROOT-SERVERS.NET. 3600000 AAAA 2001:503:ba3e::2:30 +; +; FORMERLY NS1.ISI.EDU +; +. 3600000 NS B.ROOT-SERVERS.NET. +B.ROOT-SERVERS.NET. 3600000 A 192.228.79.201 +B.ROOT-SERVERS.NET. 3600000 AAAA 2001:500:84::b +; +; FORMERLY C.PSI.NET +; +. 3600000 NS C.ROOT-SERVERS.NET. +C.ROOT-SERVERS.NET. 3600000 A 192.33.4.12 +C.ROOT-SERVERS.NET. 3600000 AAAA 2001:500:2::c +; +; FORMERLY TERP.UMD.EDU +; +. 3600000 NS D.ROOT-SERVERS.NET. +D.ROOT-SERVERS.NET. 3600000 A 199.7.91.13 +D.ROOT-SERVERS.NET. 3600000 AAAA 2001:500:2d::d +; +; FORMERLY NS.NASA.GOV +; +. 3600000 NS E.ROOT-SERVERS.NET. +E.ROOT-SERVERS.NET. 3600000 A 192.203.230.10 +; +; FORMERLY NS.ISC.ORG +; +. 3600000 NS F.ROOT-SERVERS.NET. +F.ROOT-SERVERS.NET. 3600000 A 192.5.5.241 +F.ROOT-SERVERS.NET. 3600000 AAAA 2001:500:2f::f +; +; FORMERLY NS.NIC.DDN.MIL +; +. 3600000 NS G.ROOT-SERVERS.NET. +G.ROOT-SERVERS.NET. 3600000 A 192.112.36.4 +; +; FORMERLY AOS.ARL.ARMY.MIL +; +. 3600000 NS H.ROOT-SERVERS.NET. +H.ROOT-SERVERS.NET. 3600000 A 198.97.190.53 +H.ROOT-SERVERS.NET. 3600000 AAAA 2001:500:1::53 +; +; FORMERLY NIC.NORDU.NET +; +. 3600000 NS I.ROOT-SERVERS.NET. +I.ROOT-SERVERS.NET. 3600000 A 192.36.148.17 +I.ROOT-SERVERS.NET. 3600000 AAAA 2001:7fe::53 +; +; OPERATED BY VERISIGN, INC. +; +. 3600000 NS J.ROOT-SERVERS.NET. +J.ROOT-SERVERS.NET. 3600000 A 192.58.128.30 +J.ROOT-SERVERS.NET. 3600000 AAAA 2001:503:c27::2:30 +; +; OPERATED BY RIPE NCC +; +. 3600000 NS K.ROOT-SERVERS.NET. +K.ROOT-SERVERS.NET. 3600000 A 193.0.14.129 +K.ROOT-SERVERS.NET. 3600000 AAAA 2001:7fd::1 +; +; OPERATED BY ICANN +; +. 3600000 NS L.ROOT-SERVERS.NET. +L.ROOT-SERVERS.NET. 3600000 A 199.7.83.42 +L.ROOT-SERVERS.NET. 3600000 AAAA 2001:500:9f::42 +; +; OPERATED BY WIDE +; +. 3600000 NS M.ROOT-SERVERS.NET. +M.ROOT-SERVERS.NET. 3600000 A 202.12.27.33 +M.ROOT-SERVERS.NET. 3600000 AAAA 2001:dc3::35 +; End of file diff --git a/config/unbound/root.key b/config/unbound/root.key new file mode 100644 index 0000000..fb540e3 --- /dev/null +++ b/config/unbound/root.key @@ -0,0 +1,9 @@ +; autotrust trust anchor file +;;id: . 1 +;;last_queried: 1467576595 ;;Sun Jul 3 22:09:55 2016 +;;last_success: 1467576595 ;;Sun Jul 3 22:09:55 2016 +;;next_probe_time: 1467616562 ;;Mon Jul 4 09:16:02 2016 +;;query_failed: 0 +;;query_interval: 43200 +;;retry_time: 8640 +. 172800 IN DNSKEY 257 3 8 AwEAAagAIKlVZrpC6Ia7gEzahOR+9W29euxhJhVVLOyQbSEW0= O8gcCjFFVQUTf6v58fLjwBd0YI0EzrAcQqBGCzh/RStIoO8g0NfnfL2MTJRkxoXbfDaUeVPQuYEhg= 37NZWAJQ9VnMVDxP/VHL496M/QZxkjf5/Efucp2gaDX6RS6CXpoY68LsvPVjR0ZSwzz1apAzvN9dl= zEheX7ICJBBtuA6G3LQpzW5hOA2hzCTMjJPJ8LbqF6dsV6DoBQzgul0sGIcGOYl7OyQdXfZ57relS= Qageu+ipAdTTJ25AsRTAoub8ONGcLmqrAmRLKBP1dfwhYB4N7knNnulqQxA+Uk1ihz0=3D ;{id = =3D 19036 (ksk), size =3D 2048b} ;;state=3D2 [ VALID ] ;;count=3D0 ;;lastch= ange=3D1467575383 ;;Sun Jul 3 21:49:43 2016 diff --git a/config/unbound/site-packages/daemonize.py b/config/unbound/site-= packages/daemonize.py new file mode 100644 index 0000000..e083feb --- /dev/null +++ b/config/unbound/site-packages/daemonize.py @@ -0,0 +1,247 @@ +# #!/usr/bin/python + +import fcntl +import os +import pwd +import grp +import sys +import signal +import resource +import logging +import atexit +from logging import handlers +import traceback + + +__version__ =3D "2.4.6" + + +class Daemonize(object): + """ + Daemonize object. + + Object constructor expects three arguments. + + :param app: contains the application name which will be sent to syslog. + :param pid: path to the pidfile. + :param action: your custom function which will be executed after daemoni= zation. + :param keep_fds: optional list of fds which should not be closed. + :param auto_close_fds: optional parameter to not close opened fds. + :param privileged_action: action that will be executed before drop privi= leges if user or + group parameter is provided. + If you want to transfer anything from privileg= ed_action to action, such as + opened privileged file descriptor, you should = return it from + privileged_action function and catch it inside= action function. + :param user: drop privileges to this user if provided. + :param group: drop privileges to this group if provided. + :param verbose: send debug messages to logger if provided. + :param logger: use this logger object instead of creating new one, if pr= ovided. + :param foreground: stay in foreground; do not fork (for debugging) + :param chdir: change working directory if provided or / + """ + def __init__(self, app, pid, action, + keep_fds=3DNone, auto_close_fds=3DTrue, privileged_action= =3DNone, + user=3DNone, group=3DNone, verbose=3DFalse, logger=3DNone, + foreground=3DFalse, chdir=3D"/"): + self.app =3D app + self.pid =3D os.path.abspath(pid) + self.action =3D action + self.keep_fds =3D keep_fds or [] + self.privileged_action =3D privileged_action or (lambda: ()) + self.user =3D user + self.group =3D group + self.logger =3D logger + self.verbose =3D verbose + self.auto_close_fds =3D auto_close_fds + self.foreground =3D foreground + self.chdir =3D chdir + + def sigterm(self, signum, frame): + """ + These actions will be done after SIGTERM. + """ + self.logger.warn("Caught signal %s. Stopping daemon." % signum) + sys.exit(0) + + def exit(self): + """ + Cleanup pid file at exit. + """ + self.logger.warn("Stopping daemon.") + os.remove(self.pid) + sys.exit(0) + + def start(self): + """ + Start daemonization process. + """ + # If pidfile already exists, we should read pid from there; to overw= rite it, if locking + # will fail, because locking attempt somehow purges the file content= s. + if os.path.isfile(self.pid): + with open(self.pid, "r") as old_pidfile: + old_pid =3D old_pidfile.read() + # Create a lockfile so that only one instance of this daemon is runn= ing at any time. + try: + lockfile =3D open(self.pid, "w") + except IOError: + print("Unable to create the pidfile.") + sys.exit(1) + try: + # Try to get an exclusive lock on the file. This will fail if an= other process has the file + # locked. + fcntl.flock(lockfile, fcntl.LOCK_EX | fcntl.LOCK_NB) + except IOError: + print("Unable to lock on the pidfile.") + # We need to overwrite the pidfile if we got here. + with open(self.pid, "w") as pidfile: + pidfile.write(old_pid) + sys.exit(1) + + # skip fork if foreground is specified + if not self.foreground: + # Fork, creating a new process for the child. + try: + process_id =3D os.fork() + except OSError as e: + self.logger.error("Unable to fork, errno: {0}".format(e.errn= o)) + sys.exit(1) + if process_id !=3D 0: + # This is the parent process. Exit without cleanup, + # see https://github.com/thesharp/daemonize/issues/46 + os._exit(0) + # This is the child process. Continue. + + # Stop listening for signals that the parent process receives. + # This is done by getting a new process id. + # setpgrp() is an alternative to setsid(). + # setsid puts the process in a new parent group and detaches its= controlling terminal. + process_id =3D os.setsid() + if process_id =3D=3D -1: + # Uh oh, there was a problem. + sys.exit(1) + + # Add lockfile to self.keep_fds. + self.keep_fds.append(lockfile.fileno()) + + # Close all file descriptors, except the ones mentioned in self.= keep_fds. + devnull =3D "/dev/null" + if hasattr(os, "devnull"): + # Python has set os.devnull on this system, use it instead a= s it might be different + # than /dev/null. + devnull =3D os.devnull + + if self.auto_close_fds: + for fd in range(3, resource.getrlimit(resource.RLIMIT_NOFILE= )[0]): + if fd not in self.keep_fds: + try: + os.close(fd) + except OSError: + pass + + devnull_fd =3D os.open(devnull, os.O_RDWR) + os.dup2(devnull_fd, 0) + os.dup2(devnull_fd, 1) + os.dup2(devnull_fd, 2) + + if self.logger is None: + # Initialize logging. + self.logger =3D logging.getLogger(self.app) + self.logger.setLevel(logging.DEBUG) + # Display log messages only on defined handlers. + self.logger.propagate =3D False + + # Initialize syslog. + # It will correctly work on OS X, Linux and FreeBSD. + if sys.platform =3D=3D "darwin": + syslog_address =3D "/var/run/syslog" + else: + syslog_address =3D "/dev/log" + + # We will continue with syslog initialization only if actually h= ave such capabilities + # on the machine we are running this. + if os.path.exists(syslog_address): + syslog =3D handlers.SysLogHandler(syslog_address) + if self.verbose: + syslog.setLevel(logging.DEBUG) + else: + syslog.setLevel(logging.INFO) + # Try to mimic to normal syslog messages. + formatter =3D logging.Formatter("%(asctime)s %(name)s: %(mes= sage)s", + "%b %e %H:%M:%S") + syslog.setFormatter(formatter) + + self.logger.addHandler(syslog) + + # Set umask to default to safe file permissions when running as a ro= ot daemon. 027 is an + # octal number which we are typing as 0o27 for Python3 compatibility. + os.umask(0o27) + + # Change to a known directory. If this isn't done, starting a daemon= in a subdirectory that + # needs to be deleted results in "directory busy" errors. + os.chdir(self.chdir) + + # Execute privileged action + privileged_action_result =3D self.privileged_action() + if not privileged_action_result: + privileged_action_result =3D [] + + # Change owner of pid file, it's required because pid file will be r= emoved at exit. + uid, gid =3D -1, -1 + + if self.group: + try: + gid =3D grp.getgrnam(self.group).gr_gid + except KeyError: + self.logger.error("Group {0} not found".format(self.group)) + sys.exit(1) + + if self.user: + try: + uid =3D pwd.getpwnam(self.user).pw_uid + except KeyError: + self.logger.error("User {0} not found.".format(self.user)) + sys.exit(1) + + if uid !=3D -1 or gid !=3D -1: + os.chown(self.pid, uid, gid) + + # Change gid + if self.group: + try: + os.setgid(gid) + except OSError: + self.logger.error("Unable to change gid.") + sys.exit(1) + + # Change uid + if self.user: + try: + uid =3D pwd.getpwnam(self.user).pw_uid + except KeyError: + self.logger.error("User {0} not found.".format(self.user)) + sys.exit(1) + try: + os.setuid(uid) + except OSError: + self.logger.error("Unable to change uid.") + sys.exit(1) + + try: + lockfile.write("%s" % (os.getpid())) + lockfile.flush() + except IOError: + self.logger.error("Unable to write pid to the pidfile.") + print("Unable to write pid to the pidfile.") + sys.exit(1) + + # Set custom action on SIGTERM. + signal.signal(signal.SIGTERM, self.sigterm) + atexit.register(self.exit) + + self.logger.warn("Starting daemon.") + + try: + self.action(*privileged_action_result) + except Exception as e: + for line in traceback.format_exc(e).split("\n"): + self.logger.error(line) diff --git a/config/unbound/site-packages/dhcpd.py b/config/unbound/site-pack= ages/dhcpd.py new file mode 100644 index 0000000..6d586c7 --- /dev/null +++ b/config/unbound/site-packages/dhcpd.py @@ -0,0 +1,108 @@ +""" + Copyright (c) 2016 Ad Schellevis + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are m= et: + + 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 ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIE= S, + INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL T= HE + AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLAR= Y, + 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 T= HE + POSSIBILITY OF SUCH DAMAGE. +""" +import os +import time +import datetime + +class DHCPDLease(object): + watch_file =3D '/var/dhcpd/var/db/dhcpd.leases' + + def __init__(self): + """ init watcher + :return: watcher object + """ + self._section_data =3D [] + self._fhandle =3D None + self._last_pos =3D None + self._open() + + def _open(self): + """ (re)open watched file + :return: watcher object + """ + try: + self._fhandle =3D open(self.watch_file, 'r') + self._last_pos =3D None + self._section_data =3D [] + return True + except IOError: + self._fhandle =3D None + return False + + @staticmethod + def parse_lease(lines): + """ parse dhcp lease + :param lines: lease section as list item + :return: dictionary + """ + lease =3D dict() + lease['address'] =3D lines[0].split()[1] + for line in lines: + parts =3D line.split() + field_name =3D parts[0] + field_value =3D None + if field_name in ('starts', 'ends', 'tstp', 'tsfp', 'atsfp', 'cl= tt') and len(parts) >=3D 3: + dt =3D '%s %s'%(parts[2], parts[3]) + try: + field_value =3D time.mktime(datetime.datetime.strptime(d= t, "%Y/%m/%d %H:%M:%S;").timetuple()) + except ValueError: + field_value =3D None + elif field_name =3D=3D 'hardware' and len(parts) >=3D 3: + field_value =3D {'hardware-type': parts[1], 'mac-address': p= arts[2]} + elif field_name in('uid', 'client-hostname') and len(parts) >=3D= 2 and parts[1].find('"') > -1: + field_value =3D parts[1].split('"')[1] + + if field_value is not None: + lease[field_name] =3D field_value + + return lease + + def watch(self): + """ watch file, return lease dictionaries + :return: iterator for leases + """ + if self._fhandle is None or os.fstat(self._fhandle.fileno()).st_nlin= k =3D=3D 0: + # nothing to watch, try to (re)open return when failed + if not self._open(): + return + elif self._last_pos is not None: + self._fhandle.seek(self._last_pos) + + while True: + line =3D self._fhandle.readline() + if line: + if len(line) > 5 and line[0:5] =3D=3D 'lease': + self._section_data.append(line) + elif len(line) > 1 and line[0] =3D=3D '}': + self._section_data.append(line) + yield self.parse_lease(self._section_data) + self._section_data =3D [] + elif len(self._section_data) > 0: + self._section_data.append(line) + else: + break + + self._last_pos =3D self._fhandle.tell() diff --git a/config/unbound/site-packages/params.py b/config/unbound/site-pac= kages/params.py new file mode 100644 index 0000000..6be3244 --- /dev/null +++ b/config/unbound/site-packages/params.py @@ -0,0 +1,46 @@ +""" + Copyright (c) 2015-2016 Ad Schellevis + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are m= et: + + 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 ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIE= S, + INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL T= HE + AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLAR= Y, + 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 T= HE + POSSIBILITY OF SUCH DAMAGE. +""" + +import sys + + +def update_params(parameters): + """ update predefined parameters with given list from shell (as switches) + for example /a valA /b valB + converts to + {'a':'valA','b':'valB'} + (assuming parameters contains both a and b) + :param parameters: parameter dictionary + :return: + """ + cmd =3D None + for arg in sys.argv[1:]: + if cmd is None: + cmd =3D arg[1:] + else: + if cmd in parameters and arg.strip() !=3D '': + parameters[cmd] =3D arg.strip() + cmd =3D None diff --git a/config/unbound/site-packages/watcherdhcpd.py b/config/unbound/si= te-packages/watcherdhcpd.py new file mode 100644 index 0000000..c726d5c --- /dev/null +++ b/config/unbound/site-packages/watcherdhcpd.py @@ -0,0 +1,107 @@ +""" + Copyright (c) 2016 Ad Schellevis + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are m= et: + + 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 ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIE= S, + INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL T= HE + AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLAR= Y, + 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 T= HE + POSSIBILITY OF SUCH DAMAGE. +""" +import os +import time +import datetime + +class DHCPDLease(object): + watch_file =3D '/var/state/dhcp/dhcpd.leases' + + def __init__(self): + """ init watcher + :return: watcher object + """ + self._section_data =3D [] + self._fhandle =3D None + self._last_pos =3D None + self._open() + + def _open(self): + """ (re)open watched file + :return: watcher object + """ + try: + self._fhandle =3D open(self.watch_file, 'r') + self._last_pos =3D None + self._section_data =3D [] + return True + except IOError: + self._fhandle =3D None + return False + + @staticmethod + def parse_lease(lines): + """ parse dhcp lease + :param lines: lease section as list item + :return: dictionary + """ + lease =3D dict() + lease['address'] =3D lines[0].split()[1] + for line in lines: + parts =3D line.split() + field_name =3D parts[0] + field_value =3D None + if field_name in ('starts', 'ends', 'tstp', 'tsfp', 'atsfp', 'cl= tt') and len(parts) >=3D 3: + dt =3D '%s %s'%(parts[2], parts[3]) + try: + field_value =3D time.mktime(datetime.datetime.strptime(d= t, "%Y/%m/%d %H:%M:%S;").timetuple()) + except ValueError: + field_value =3D None + elif field_name =3D=3D 'hardware' and len(parts) >=3D 3: + field_value =3D {'hardware-type': parts[1], 'mac-address': p= arts[2]} + elif field_name in('uid', 'client-hostname') and len(parts) >=3D= 2 and parts[1].find('"') > -1: + field_value =3D parts[1].split('"')[1] + + if field_value is not None: + lease[field_name] =3D field_value + return lease + + def watch(self): + """ watch file, return lease dictionaries + :return: iterator for leases + """ + if self._fhandle is None or os.fstat(self._fhandle.fileno()).st_nlin= k =3D=3D 0: + # nothing to watch, try to (re)open return when failed + if not self._open(): + return + elif self._last_pos is not None: + self._fhandle.seek(self._last_pos) + + while True: + line =3D self._fhandle.readline() + if line: + if len(line) > 5 and line[0:5] =3D=3D 'lease': + self._section_data.append(line) + elif len(line) > 1 and line[0] =3D=3D '}': + self._section_data.append(line) + yield self.parse_lease(self._section_data) + self._section_data =3D [] + elif len(self._section_data) > 0: + self._section_data.append(line) + else: + break + + self._last_pos =3D self._fhandle.tell() diff --git a/config/unbound/unbound-dhcpd.py b/config/unbound/unbound-dhcpd.py new file mode 100644 index 0000000..0afedc9 --- /dev/null +++ b/config/unbound/unbound-dhcpd.py @@ -0,0 +1,145 @@ +#!/usr/bin/python2.7 + +""" + Copyright (c) 2016 Ad Schellevis + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are m= et: + + 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 ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIE= S, + INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL T= HE + AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLAR= Y, + 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 T= HE + POSSIBILITY OF SUCH DAMAGE. + + ------------------------------------------------------------------------= -------------- + watch dhcp lease file and build include file for unbound +""" +import os +import sys + +sys.path.insert(0, "/usr/lib/python2.7/site-packages") +import subprocess +import time +import tempfile +from daemonize import Daemonize +import watcherdhcpd +import params + + +def unbound_control(commands, output_stream=3DNone): + """ execute (chrooted) unbound-control command + :param commands: command list (parameters) + :param output_stream: (optional)output stream + :return: None + """ + output_stream =3D open(os.devnull, 'w') + subprocess.check_call(['/usr/sbin/chroot', '--userspec=3Dunbound:unbound= ', '/', + '/usr/sbin/unbound-control', '-c', '/etc/unbound/= unbound.conf'] + commands, + stdout=3Doutput_stream, stderr=3Dsubprocess.STDOUT) + output_stream.seek(0) + + +def unbound_known_addresses(): + """ fetch known addresses + :return: list + """ + result =3D list() + with tempfile.NamedTemporaryFile() as output_stream: + unbound_control(['list_local_data'], output_stream) + for line in output_stream.read().split('\n'): + parts =3D line.split() + if len(parts) > 4 and parts[3] =3D=3D 'A': + result.append(parts[4]) + print result + return result + + +# parse input params +app_params =3D {'pid': '/var/run/unbound_dhcpd.pid', + 'domain': 'local', + 'target': '/etc/unbound/dhcpleases.conf', + 'background': '1'} +params.update_params(app_params) + + +def main(): + # cleanup interval (seconds) + cleanup_interval =3D 60 + + # All times in the lease database are in Coordinated Universal Time (UTC= ), not local time! + tzone =3D 0 + if app_params['background'] <> 1: + print "Add leases for domian:",app_params['domain'] + + # initiate lease watcher and setup cache + dhcpdleases =3D watcherdhcpd.DHCPDLease() + cached_leases =3D dict() + known_addresses =3D unbound_known_addresses() + + # start watching dhcp leases + last_cleanup =3D time.time() + while True: + dhcpd_changed =3D False + if time.daylight <> 0: + utctime =3D time.time() + time.altzone + else: + utctime =3D time.time() + time.timezone + + for lease in dhcpdleases.watch(): + if 'ends' in lease and lease['ends'] > utctime and 'client-hostn= ame' in lease and 'address' in lease: + cached_leases[lease['address']] =3D lease + dhcpd_changed =3D True + if app_params['background'] <> 1: + print "IP:",lease['address'],"Hostname:",lease['client-ho= stname'],"Start:",lease['starts'],"End:",lease['ends'] + + if time.time() - last_cleanup > cleanup_interval: + # cleanup every x seconds + last_cleanup =3D time.time() + addresses =3D cached_leases.keys() + for address in addresses: + if cached_leases[address]['ends'] < time.time(): + del cached_leases[address] + dhcpd_changed =3D True + + if dhcpd_changed: + # dump dns output to target + with open(app_params['target'], 'w') as unbound_conf: + for address in cached_leases: + unbound_conf.write('local-data-ptr: "%s %s.%s"\n' % (add= ress, + cac= hed_leases[address]['client-hostname'], + app= _params['domain'])) + + unbound_conf.write('local-data: "%s.%s IN A %s"\n' % (ca= ched_leases[address]['client-hostname'], + ap= p_params['domain'], + ad= dress)) + # signal unbound + for address in cached_leases: + if address not in known_addresses: + fqdn =3D '%s.%s' % (cached_leases[address]['client-hostn= ame'], app_params['domain']) + unbound_control(['local_data', address, 'PTR', fqdn]) + unbound_control(['local_data', fqdn, 'IN A', address]) + known_addresses.append(address) + # wait for next cycle + time.sleep(5) + + +# startup +if app_params['background'] =3D=3D '1': + daemon =3D Daemonize(app=3D"unbound_dhcpd", pid=3Dapp_params['pid'], act= ion=3Dmain) + daemon.start() +else: + main() diff --git a/config/unbound/unbound-switch b/config/unbound/unbound-switch new file mode 100755 index 0000000..60eeb89 --- /dev/null +++ b/config/unbound/unbound-switch @@ -0,0 +1,80 @@ +#!/bin/bash +############################################################################= ### +# = # +# IPFire.org - A linux based firewall = # +# This program is free software: you can redistribute it and/or modify = # +# it under the terms of the GNU General Public License as published by = # +# the Free Software Foundation, either version 3 of the License, or = # +# (at your option) any later version. = # +# = # +# This program is distributed in the hope that it will be useful, = # +# but WITHOUT ANY WARRANTY; without even the implied warranty of = # +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the = # +# GNU General Public License for more details. = # +# = # +# You should have received a copy of the GNU General Public License = # +# along with this program. If not, see <http://www.gnu.org/licenses/>. = # +# = # +# Description : script to switch the DNS server/proxy in IPfire = # +# rerun to easy go back to dnsmasq = # +# = # +# Author : Marcel Lorenz <marcel.lorenz(a)ipfire.org> = # +# = # +############################################################################= ### + +CGIFILE=3D"/srv/web/ipfire/cgi-bin/services.cgi" + +install_cron_jobs() { +cat > /etc/fcron.weekly/update_unbound_anchor << "EOF" +#!/bin/bash +# allow max all 30 minutes to update files +if [[ $(( (`date +%s` - `stat -L --format %Y /etc/unbound/root.key`) > (30*6= 0) )) !=3D 0 ]]; then + wget -q ftp://ftp.internic.net/domain/named.cache -O /etc/unbound/root.hin= ts + curl -sS -L --compressed "http://pgl.yoyo.org/adservers/serverlist.php?hos= tformat=3Dunbound&showintro=3D0&mimetype=3Dplaintext" > /etc/unbound/blocklis= ts/ad-servers.conf + unbound-anchor +fi +exit 0 +EOF +chmod +x /etc/fcron.weekly/update_unbound_anchor +cat > /etc/fcron.hourly/update_unbound_zone << "EOF" +#!/bin/bash +unbound-zone +EOF +chmod +x /etc/fcron.hourly/update_unbound_zone +} + +# main switch +if [[ -e /etc/rc.d/init.d/networking/red.up/05-RS-dnsmasq ]]; then + echo -e "\033[32mActivate Unbound DNS-proxy at start...\033[0m"; + # autostart symlinks + rm -f /etc/rc.d/init.d/networking/red.up/05-RS-dnsmasq /etc/rc.d/init.d/ne= tworking/red.down/05-RS-dnsmasq + mv -f /etc/init.d/network /etc/init.d/network-dnsmasq + mv -f /etc/init.d/network-unbound /etc/init.d/network + # WebIF services.cgi=20 + sed -i "s|\$Lang::tr{'dns proxy server'} =3D> 'dnsmasq',.*|\$Lang::tr{'dns= proxy server'} =3D> 'unbound',|" ${CGIFILE} + install_cron_jobs + /etc/fcron.weekly/update_unbound_anchor + # Stop and start services=20 + /etc/rc.d/init.d/dnsmasq stop + sleep 1 + /etc/rc.d/init.d/unbound start + +else + echo -e "\033[32mActivate dnsmasq DNS-proxy at start...\033[0m"; + # autostart symlinks + ln -sf /etc/rc.d/init.d/dnsmasq /etc/rc.d/init.d/networking/red.up/05-RS-d= nsmasq + ln -sf /etc/rc.d/init.d/dnsmasq /etc/rc.d/init.d/networking/red.down/05-RS= -dnsmasq + mv -f /etc/init.d/network /etc/init.d/network-unbound + mv -f /etc/init.d/network-dnsmasq /etc/init.d/network + # WebIF services.cgi=20 + sed -i "s|\$Lang::tr{'dns proxy server'} =3D> 'unbound',.*|\$Lang::tr{'dns= proxy server'} =3D> 'dnsmasq',|" ${CGIFILE} + # Stop and start services=20 + /etc/rc.d/init.d/unbound stop + sleep 1 + /etc/rc.d/init.d/dnsmasq start + rm -f /etc/fcron.weekly/update_unbound_anchor /etc/fcron.hourly/update_unb= ound_zone; +fi +unset CGIFILE +echo -e "\033[32mdone...\033[0m"; +exit 0 +# end of unbound-proxy diff --git a/config/unbound/unbound-zone b/config/unbound/unbound-zone new file mode 100644 index 0000000..9a0de1f --- /dev/null +++ b/config/unbound/unbound-zone @@ -0,0 +1,78 @@ +#!/bin/bash +############################################################################= ### +# = # +# IPFire.org - A linux based firewall = # +# This program is free software: you can redistribute it and/or modify = # +# it under the terms of the GNU General Public License as published by = # +# the Free Software Foundation, either version 3 of the License, or = # +# (at your option) any later version. = # +# = # +# This program is distributed in the hope that it will be useful, = # +# but WITHOUT ANY WARRANTY; without even the implied warranty of = # +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the = # +# GNU General Public License for more details. = # +# = # +# You should have received a copy of the GNU General Public License = # +# along with this program. If not, see <http://www.gnu.org/licenses/>. = # +# = # +# Description : small script to create the zone file for ipfire's = # +# internal domain (for example ipfire.local) = # +# = # +# Author : Marcel Lorenz <marcel.lorenz(a)ipfire.org> = # +# = # +############################################################################= ### + +ZONEFILE=3D"/etc/unbound/zones/local.conf" +HOSTSFILE=3D"/var/ipfire/main/hosts" + +eval $(/usr/local/bin/readhash /var/ipfire/main/settings) +eval $(/usr/local/bin/readhash /var/ipfire/ethernet/settings) +REV_GREEN=3D$(echo ${GREEN_ADDRESS} |awk -F. '{print $4"."$3"."$2"."$1}') + +# overwrite existing file +cat > ${ZONEFILE} << "EOF" +# This is the automatically created zone file for unbound +# please do not edit this file, use the webinterface to add or remove hosts +# if need more zones, create a new zone file and restart unbound=20 +# +EOF + +# create zone header=20 +echo "# Zone file created at $(date)" >> ${ZONEFILE} +echo "">> ${ZONEFILE}=20 +echo "# zone definition " >> ${ZONEFILE} +echo "private-domain: \"${DOMAINNAME}\"" >> ${ZONEFILE} +echo "local-zone: \"${DOMAINNAME}.\" static" >> ${ZONEFILE} +echo "local-data: \"${HOSTNAME}.${DOMAINNAME}. IN A ${GREEN_ADDRESS}\"" >> $= {ZONEFILE} +echo "local-data: \"wpad.${DOMAINNAME}. IN A ${GREEN_ADDRESS}\"" >> ${ZONEFI= LE} +echo "local-data: \"${REV_GREEN}.in-addr.arpa. 10800 IN PTR ${HOSTNAME}.${DO= MAINNAME}.\"" >> ${ZONEFILE} + +# write forward entrys to zone file +echo "" >> ${ZONEFILE}=20 +echo "# Hosts from /var/ipfire/main/hosts" >> ${ZONEFILE} + +while read line =20 +do =20 + if [[ $(echo ${line}|awk -F, '{print $1}') =3D on ]]; then + IP=3D$(echo ${line}|awk -F, '{print $2}') + HOST=3D$(echo ${line}|awk -F, '{print $3}') + DOMAIN=3D$(echo ${line}|awk -F, '{print $4}') + echo "local-data: \"${HOST}.${DOMAIN}. IN A ${IP}\"" >> ${ZONEFILE} + fi +done < ${HOSTSFILE} + +# write reverse entrys to zone file +echo "" >> ${ZONEFILE}=20 +echo "# reverse entrys" >> ${ZONEFILE} +while read line =20 +do =20 + if [[ $(echo ${line}|awk -F, '{print $1}') =3D on ]]; then + IP=3D$(echo ${line}|awk -F, '{print $2}'|awk -F. '{print $4"."$3"."$2"."= $1}') + HOST=3D$(echo ${line}|awk -F, '{print $3}') + DOMAIN=3D$(echo ${line}|awk -F, '{print $4}') + echo "local-data: \"${IP}.in-addr.arpa. 10800 IN PTR ${HOST}.${DOMAIN}\"= " >> ${ZONEFILE} + fi +done < ${HOSTSFILE} +unset IP HOST DOMAIN REV_GREEN; +exit 0 +# end of unbound-zone diff --git a/config/unbound/unbound.conf b/config/unbound/unbound.conf new file mode 100644 index 0000000..8dc72e6 --- /dev/null +++ b/config/unbound/unbound.conf @@ -0,0 +1,123 @@ +# +# Unbound configuration file for IPFire +# +# The full documentation is available at: +# https://www.unbound.net/documentation/unbound.conf.html +# + +server: + # common server options + chroot: "/etc/unbound" + username: "unbound" + pidfile: "/var/run/unbound.pid" + num-threads: 2 + port: 53 + do-ip4: yes + do-ip6: no + do-udp: yes + do-tcp: yes + prefetch: yes + so-reuseport: yes + cache-min-ttl: 3600 + cache-max-ttl: 86400 + unwanted-reply-threshold: 10000 + do-not-query-localhost: yes + + # logging options + logfile: "log/unbound.log" + use-syslog: no + verbosity: 1 + log-queries: no + log-time-ascii: yes + + # Unbound Statistics + statistics-interval: 3600 + statistics-cumulative: yes + extended-statistics: yes + + # privacy options + hide-identity: yes + hide-version: yes + qname-minimisation: yes + minimal-responses: yes + + # hardening options (some experimental) + harden-glue: yes + harden-large-queries: yes + harden-dnssec-stripped: yes + harden-short-bufsize: no + harden-below-nxdomain: no + harden-referral-path: no + harden-algo-downgrade: no + use-caps-for-id: yes + + # listen on localhost interface + interface: 127.0.0.1 + + # file with ipfire interfaces + include: "/etc/unbound/interfaces.conf" + + # control which clients are allowed to make (recursive) queries + access-control: 0.0.0.0/0 refuse + access-control: 127.0.0.0/8 allow + access-control: ::0/0 refuse + access-control: ::1 allow + access-control: ::ffff:127.0.0.1 allow + + # file with ipfire networks + include: "/etc/unbound/access.conf" + + # dnssec main options + val-clean-additional: yes + val-log-level: 1 + # file with ipfire dnssec configuration + include: "/etc/unbound/dnssec.conf" + + # DNS Rebinding + # For DNS Rebinding prevention + # + # All these addresses are either private or should not be routable in the g= lobal IPv4 or IPv6 internet. + # IPv4 Addresses + private-address: 0.0.0.0/8 # Broadcast address + private-address: 10.0.0.0/8 + private-address: 127.0.0.0/8 # Loopback Localhost + private-address: 172.16.0.0/12 + private-address: 192.168.0.0/16 + private-address: 169.254.0.0/16 + private-address: 198.18.0.0/15 # Used for testing inter-network communica= tions + private-address: 198.51.100.0/24 # Documentation network TEST-NET-2 + private-address: 203.0.113.0/24 # Documentation network TEST-NET-3 + private-address: 233.252.0.0/24 # Documentation network MCAST-TEST-NET + # IPv6 Addresses + private-address: ::1/128 # Loopback Localhost + private-address: 2001:db8::/32 # Documentation network IPv6 + private-address: fc00::/8 # Unique local address (ULA) part of "fc00= ::/7", not defined yet + private-address: fd00::/8 # Unique local address (ULA) part of "fc00= ::/7", "/48" prefix group + private-address: fe80::/10 # Link-local address (LLA) + + # file with root servers=20 + root-hints: "/etc/unbound/root.hints" + + # custom DNS zone files + include: "/etc/unbound/zones/*.conf" + + # DHCP leases (if configured) + include: /etc/unbound/dhcpleases.conf + + # Blocklists + include: "/etc/unbound/blocklists/*.conf" +# end server config + +# enable remote control only on localhost +remote-control: + control-enable: yes + control-use-cert: yes + control-interface: 127.0.0.1 + server-key-file: "/etc/unbound/unbound_server.key" + server-cert-file: "/etc/unbound/unbound_server.pem" + control-key-file: "/etc/unbound/unbound_control.key" + control-cert-file: "/etc/unbound/unbound_control.pem" +# end remote control config + +# custom DNS forward config +include: "/etc/unbound/forward.conf" diff --git a/lfs/unbound b/lfs/unbound new file mode 100644 index 0000000..d91c0f9 --- /dev/null +++ b/lfs/unbound @@ -0,0 +1,103 @@ +############################################################################= ### +# = # +# IPFire.org - A linux based firewall = # +# Copyright (C) 2007 Michael Tremer & Christian Schmidt = # +# = # +# This program is free software: you can redistribute it and/or modify = # +# it under the terms of the GNU General Public License as published by = # +# the Free Software Foundation, either version 3 of the License, or = # +# (at your option) any later version. = # +# = # +# This program is distributed in the hope that it will be useful, = # +# but WITHOUT ANY WARRANTY; without even the implied warranty of = # +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the = # +# GNU General Public License for more details. = # +# = # +# You should have received a copy of the GNU General Public License = # +# along with this program. If not, see <http://www.gnu.org/licenses/>. = # +# = # +############################################################################= ### + +############################################################################= ### +# Definitions +############################################################################= ### + +include Config + +VER =3D 1.5.9 +THISAPP =3D unbound-$(VER) +DL_FILE =3D $(THISAPP).tar.gz +DL_FROM =3D $(URL_IPFIRE) +DIR_APP =3D $(DIR_SRC)/$(THISAPP) +TARGET =3D $(DIR_INFO)/$(THISAPP) +PROG =3D unbound +PAK_VER =3D 1 +DEPS =3D "" + +############################################################################= ### +# Top-level Rules +############################################################################= ### + +objects =3D $(DL_FILE) + +$(DL_FILE) =3D $(DL_FROM)/$(DL_FILE) + +$(DL_FILE)_MD5 =3D 0cefa62c1690b4db18583db84bff00e3 + +install : $(TARGET) + +check : $(patsubst %,$(DIR_CHK)/%,$(objects)) + +download :$(patsubst %,$(DIR_DL)/%,$(objects)) + +md5 : $(subst %,%_MD5,$(objects)) + +dist:=20 + $(PAK) + +############################################################################= ### +# Downloading, checking, md5sum +############################################################################= ### + +$(patsubst %,$(DIR_CHK)/%,$(objects)) : + @$(CHECK) + +$(patsubst %,$(DIR_DL)/%,$(objects)) : + @$(LOAD) + +$(subst %,%_MD5,$(objects)) : + @$(MD5) + +############################################################################= ### +# Installation Details +############################################################################= ### + +$(TARGET) : $(patsubst %,$(DIR_DL)/%,$(objects)) + @$(PREBUILD) + @rm -rf $(DIR_APP) && cd $(DIR_SRC) && tar axf $(DIR_DL)/$(DL_FILE) + cd $(DIR_APP) && ./configure \ + --prefix=3D/usr \ + --sysconfdir=3D/etc \ + --disable-static \ + --with-libevent \ + --with-pyunbound \ + --with-pidfile=3D/var/run/unbound.pid + cd $(DIR_APP) && make $(MAKETUNING) + cd $(DIR_APP) && make install + mv -v /usr/sbin/unbound-host /usr/bin/ + # add ipfire config + mkdir -pv /etc/unbound/blocklists + mv -v /etc/unbound/unbound.conf /etc/unbound/unbound_org.conf + install -v -m 644 $(DIR_SRC)/config/unbound/*.conf /etc/unbound/ + install -v -m 644 $(DIR_SRC)/config/unbound/root.hints /etc/unbound/ + install -v -m 644 $(DIR_SRC)/config/unbound/root.key /etc/unbound/ + install -v -m 644 $(DIR_SRC)/config/unbound/blocklists/*.conf /etc/unbound/= blocklists/ + install -v -m 644 $(DIR_SRC)/config/unbound/site-packages/* /usr/lib/python= 2.7/site-packages/ + install -v -m 754 $(DIR_SRC)/config/unbound/unbound-switch /usr/sbin/ + install -v -m 754 $(DIR_SRC)/config/unbound/unbound-zone /usr/sbin/ + install -v -m 754 $(DIR_SRC)/config/unbound/unbound-dhcpd.py /usr/sbin/ + install -v -m 754 $(DIR_SRC)/src/initscripts/init.d/unbound /etc/rc.d/init.= d/ + install -v -m 754 $(DIR_SRC)/src/initscripts/init.d/unbound-dhcpd /etc/rc.d= /init.d/ + install -v -m 754 $(DIR_SRC)/src/initscripts/init.d/network-unbound /etc/rc= .d/init.d/ + @rm -rf $(DIR_APP) + @$(POSTBUILD) diff --git a/make.sh b/make.sh index a9fac52..74bc06a 100755 --- a/make.sh +++ b/make.sh @@ -870,6 +870,7 @@ buildipfire() { ipfiremake libpciaccess ipfiremake libyajl ipfiremake libvirt + ipfiremake unbound } =20 buildinstaller() { diff --git a/src/initscripts/init.d/network-unbound b/src/initscripts/init.d/= network-unbound new file mode 100644 index 0000000..31fe173 --- /dev/null +++ b/src/initscripts/init.d/network-unbound @@ -0,0 +1,114 @@ +#!/bin/sh +######################################################################## +# Begin $rc_base/init.d/network +# +# Description : Network Control Script +# +# Authors : Michael Tremer - mitch(a)ipfire.org +# +# Version : 01.00 +# +# Notes : Written for IPFire by its team +# +######################################################################## + +. /etc/sysconfig/rc +. ${rc_functions} +eval $(/usr/local/bin/readhash /var/ipfire/ethernet/settings) + + +DO=3D"${1}" +shift + +if [ -n "${1}" ]; then + ALL=3D0 + for i in green red blue orange; do + eval "${i}=3D0" + done +else + ALL=3D1 + for i in green red blue orange; do + eval "${i}=3D1" + done +fi + +while [ ! $# =3D 0 ]; do + for i in green red blue orange; do + if [ "${i}" =3D=3D "${1}" ]; then + eval "${i}=3D1" + shift + fi + done +done + +case "${DO}" in + start) + + # Starting interfaces... + # GREEN + [ "$green" =3D=3D "1" ] && /etc/rc.d/init.d/networking/green start + + # BLUE + [ "$blue" =3D=3D "1" ] && [ "$CONFIG_TYPE" =3D "3" -o "$CONFIG_TYPE" =3D "= 4" ] && \ + /etc/rc.d/init.d/networking/blue start + + # ORANGE + [ "$orange" =3D=3D "1" ] && [ "$CONFIG_TYPE" =3D "2" -o "$CONFIG_TYPE" =3D= "4" ] && \ + /etc/rc.d/init.d/networking/orange start + + # RED + if [ "$red" =3D=3D "1" ]; then + if [ "$CONFIG_TYPE" =3D "1" -o "$CONFIG_TYPE" =3D "2" -o "$CONFIG_TYPE" = =3D "3" -o "$CONFIG_TYPE" =3D "4" ]; then + # Remove possible leftover files + rm -f /var/ipfire/red/{active,device,dial-on-demand,dns1,dns2,local-ipad= dress,remote-ipaddress,resolv.conf} + [ "$AUTOCONNECT" =3D=3D "off" ] || /etc/rc.d/init.d/networking/red start + fi + fi + + /etc/rc.d/init.d/static-routes start + [ "${ALL}" =3D=3D "1" ] && /etc/rc.d/init.d/unbound start + ;; + + stop) + + [ "${ALL}" =3D=3D "1" ] && /etc/rc.d/init.d/unbound stop + # Stopping interfaces... + # GREEN + [ "$green" =3D=3D "1" ] && /etc/rc.d/init.d/networking/green stop +=09 + # BLUE + [ "$blue" =3D=3D "1" ] && [ "$CONFIG_TYPE" =3D "3" -o "$CONFIG_TYPE" =3D "= 4" ] && \ + /etc/rc.d/init.d/networking/blue stop + + # ORANGE + [ "$orange" =3D=3D "1" ] && [ "$CONFIG_TYPE" =3D "2" -o "$CONFIG_TYPE" =3D= "4" ] && \ + /etc/rc.d/init.d/networking/orange stop + + # RED + if [ "$red" =3D=3D "1" ]; then + if [ "$CONFIG_TYPE" =3D "1" -o "$CONFIG_TYPE" =3D "2" -o "$CONFIG_TYPE" = =3D "3" -o "$CONFIG_TYPE" =3D "4" ]; then + /etc/rc.d/init.d/networking/red stop + fi + fi + + exit 0 + ;; + + restart) + for i in green red blue orange; do + if [ "${!i}" =3D=3D "1" ]; then + ARGS+=3D" ${i}" + fi + done + ${0} stop ${ARGS} + sleep 1 + ${0} start ${ARGS} + ;; + + *) + echo "Usage: ${0} {start|stop|restart} [device(s)]" + exit 1 + ;; +esac + +# End /etc/rc.d/init.d/network diff --git a/src/initscripts/init.d/unbound b/src/initscripts/init.d/unbound new file mode 100644 index 0000000..8e6881e --- /dev/null +++ b/src/initscripts/init.d/unbound @@ -0,0 +1,178 @@ +#!/bin/sh +# Begin $rc_base/init.d/unbound + +# Description : Unbound DNS resolver boot script for IPfire +# Author : Marcel Lorenz <marcel.lorenz(a)ipfire.org> +# +# Comment : This init script additional starts the dhcpd watcher daemon +# if DNS-Update (RFC2136) in web interface enabled + +. /etc/sysconfig/rc +. ${rc_functions} + +if [[ ! -d /run/var ]]; then mkdir /run/var; fi; + +CONTROL_INTERFACE_FILE=3D1 +CONTROL_ACCESS_FILE=3D1 +USE_CUSTOM_FORWARDS=3D0 +ENABLE_DNSSEC=3D1 + +# Unbound daemon pid file +PIDFILE=3D/var/run/unbound.pid + +# Watcher deamon pid file must be the same in unbound main init script +WAPIDFILE=3D/var/run/unbound_dhcpd.pid + +function cidr() { + local cidr nbits IFS; + IFS=3D. read -r i1 i2 i3 i4 <<< ${1} + IFS=3D. read -r m1 m2 m3 m4 <<< ${2} + cidr=3D$(printf "%d.%d.%d.%d\n" "$((i1 & m1))" "$((i2 & m2))" "$((i3 & m= 3))" "$((i4 & m4))") + nbits=3D0 + IFS=3D. + for dec in $2 ; do + case $dec in + 255) let nbits+=3D8;; + 254) let nbits+=3D7;; + 252) let nbits+=3D6;; + 248) let nbits+=3D5;; + 240) let nbits+=3D4;; + 224) let nbits+=3D3;; + 192) let nbits+=3D2;; + 128) let nbits+=3D1;; + 0);; + *) echo "Error: $dec is not recognised"; exit 1 + esac + done + echo "${cidr}/${nbits}" +} + +case "$1" in + start) + + if [[ -f ${PIDFILE} ]]; then + log_warning_msg "Unbound daemon is running with Process ID $(cat ${PIDF= ILE})" + else + eval $(/usr/local/bin/readhash /var/ipfire/ethernet/settings) + #ARGS=3D"$CUSTOM_ARGS" + #[ "$DOMAIN_NAME_GREEN" !=3D "" ] && ARGS=3D"$ARGS -s $DOMAIN_NAME_GREE= N" + + echo > /var/ipfire/red/resolv.conf # Clear it + if [ -e "/var/ipfire/red/dns1" ]; then + DNS1=3D$(cat /var/ipfire/red/dns1 2>/dev/null) + if [ ! -z ${DNS1} ]; then + echo "nameserver ${DNS1}" >> /var/ipfire/red/resolv.conf + NAMESERVERS=3D"${DNS1} " + fi + fi + if [ -e "/var/ipfire/red/dns2" ]; then + DNS2=3D$(cat /var/ipfire/red/dns2 2>/dev/null) + if [ ! -z ${DNS2} ]; then + echo "nameserver ${DNS2}" >> /var/ipfire/red/resolv.conf + NAMESERVERS+=3D"${DNS2} " + fi + fi + + # create unbound interfaces.conf + if [ ${CONTROL_INTERFACE_FILE} =3D 1 ]; then + echo -n > /etc/unbound/interfaces.conf # Clear it + if [ ! -z ${GREEN_ADDRESS} ]; then + echo "interface: ${GREEN_ADDRESS}" >> /etc/unbound/interfaces.conf + fi + if [ ! -z ${BLUE_ADDRESS} ]; then + echo "interface: ${BLUE_ADDRESS}" >> /etc/unbound/interfaces.conf + fi + if [ ! -z ${ORANGE_ADDRESS} ]; then + echo "interface: ${ORANGE_ADDRESS}" >> /etc/unbound/interfaces.conf + fi + fi + + # create unbound access.conf + if [ ${CONTROL_ACCESS_FILE} =3D 1 ]; then + echo -n > /etc/unbound/access.conf # Clear it + if [ ! -z ${GREEN_ADDRESS} ]; then + echo "access-control: $(cidr ${GREEN_ADDRESS} ${GREEN_NETMASK}) allow" >> = /etc/unbound/access.conf + fi + if [ ! -z ${BLUE_ADDRESS} ]; then + echo "access-control: $(cidr ${BLUE_ADDRESS} ${BLUE_NETMASK}) allow" >> /e= tc/unbound/access.conf + fi + if [ ! -z ${ORANGE_ADDRESS} ]; then + echo "access-control: $(cidr ${ORANGE_ADDRESS} ${ORANGE_NETMASK}) allow" >= > /etc/unbound/access.conf + fi + fi + + # create unbound dnssec.conf + echo -n > /etc/unbound/dnssec.conf # Clear it + if [ ${ENABLE_DNSSEC} =3D 1 ]; then + echo " # dessec enabled per default" >> /etc/unbound/dnssec.conf + echo " # no necessary config options in this file" >> /etc/unbound/dn= ssec.conf + else + echo " # dnssec now disabled" >> /etc/unbound/dnssec.conf + echo " module-config: iterator" >> /etc/unbound/dnssec.conf + echo " val-permissive-mode: yes" >> /etc/unbound/dnssec.conf + fi + + # create zone file for internal ipfire domain=20 + unbound-zone + + boot_mesg "Starting Unbound DNS proxy..." + unbound-anchor + loadproc /usr/sbin/unbound + + # start dhcpd watcher daemon if DNS-Update (RFC2136) activated + eval $(/usr/local/bin/readhash /var/ipfire/dhcp/settings) + if [[ ${DNS_UPDATE_ENABLED} =3D on && ! -f ${WAPIDFILE} ]]; then + /etc/rc.d/init.d/unbound-dhcpd start + fi + + # use setup configured DNS servers=20 + if [ "${USE_CUSTOM_FORWARDS}" -eq 0 ]; then + unbound-control forward_add +i . ${NAMESERVERS} &> /dev/null + fi; + + FORWADRS=3D$(unbound-control list_forwards |sed 's|. IN forward ||g'|se= d 's|+i ||g') + if [ "${USE_CUSTOM_FORWARDS}" -eq 0 ]; then + boot_mesg "Using DNS server(s): ${FORWADRS}" + else + boot_mesg "Using custom DNS server(s): ${FORWADRS}" + fi + if [ ${ENABLE_DNSSEC} =3D 1 ]; then + boot_mesg "DNSSEC is enabled!" + else + boot_mesg "DNSSEC is disabled!" + fi + fi=20 + ;; + + stop) + + if [[ -f ${PIDFILE} ]]; then + # stop dhcpd watcher daemon if activted + if [[ -f ${WAPIDFILE} ]]; then + /etc/rc.d/init.d/unbound-dhcpd stop + fi + # stop Unbound daemon + boot_mesg "Stopping Unbound DNS proxy..." + killproc -p "/var/run/unbound.pid" /usr/sbin/unbound + else + log_warning_msg "Unbound daemon is not running..." + fi + ;; + + restart) + $0 stop + sleep 1 + $0 start + ;; + + status) + statusproc /usr/sbin/unbound + ;; + + *) + echo "Usage: $0 {start|stop|restart|status}" + exit 1 + ;; +esac + +# End $rc_base/init.d/unbound diff --git a/src/initscripts/init.d/unbound-dhcpd b/src/initscripts/init.d/un= bound-dhcpd new file mode 100644 index 0000000..4c24a3c --- /dev/null +++ b/src/initscripts/init.d/unbound-dhcpd @@ -0,0 +1,61 @@ +#!/bin/sh +# Begin $rc_base/init.d/unbound-dhcpd + +# Description : Unbound dhcpd lease file wachter daemon boot script for IPFi= re +# Author : Marcel Lorenz <marcel.lorenz(a)ipfire.org> + +. /etc/sysconfig/rc +. $rc_functions + +PIDFILE=3D/var/run/unbound_dhcpd.pid +SETFILE=3D/var/ipfire/main/settings + +case "$1" in + start) + if [[ -f ${PIDFILE} ]]; then + log_warning_msg "Unbound dhcpd watcher daemon is running with Process ID= $(cat ${PIDFILE})" + else + eval $(/usr/local/bin/readhash ${SETFILE}) + boot_mesg "Starting Unbound dhcpd watcher deamon..." + loadproc /usr/bin/python /usr/sbin/unbound-dhcpd.py /domain ${DOMAINNAME= } /pid ${PIDFILE} + fi + ;; + + stop) + if [[ -f ${PIDFILE} ]]; then + boot_mesg "Stopping Unbound dhcpd watcher deamon..." + kill $(/bin/cat ${PIDFILE}) + sleep 1 + if [[ -f ${PIDFILE} ]]; then + echo_failure + else + echo_ok + fi + else + log_warning_msg "Unbound dhcpd watcher daemon is not running..." + fi + ;; + + restart) + $0 stop + sleep 1 + $0 start + ;; + + status) + if [[ -f "$PIDFILE" ]]; then=20 + echo -e "\\033[1;36mUnbound dhcpd watcher daemon is running with Process= ID $(cat ${PIDFILE})\\033[0;39m" + exit 0 + else + echo -e "\\033[1;36mUnbound dhcpd watcher daemon is not running...\\033[= 0;39m" + exit 0 + fi + ;; + + *) + echo "Usage: $0 {start|stop|restart|status}" + exit 1 + ;; +esac + +# End $rc_base/init.d/unbound-dhcpd \ No newline at end of file diff --git a/src/paks/unbound/install.sh b/src/paks/unbound/install.sh new file mode 100644 index 0000000..84c93f3 --- /dev/null +++ b/src/paks/unbound/install.sh @@ -0,0 +1,70 @@ +#!/bin/bash +############################################################################ +# # +# This file is part of the IPFire Firewall. # +# # +# IPFire is free software; you can redistribute it and/or modify # +# it under the terms of the GNU General Public License as published by # +# the Free Software Foundation; either version 2 of the License, or # +# (at your option) any later version. # +# # +# IPFire is distributed in the hope that it will be useful, # +# but WITHOUT ANY WARRANTY; without even the implied warranty of # +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # +# GNU General Public License for more details. # +# # +# You should have received a copy of the GNU General Public License # +# along with IPFire; if not, write to the Free Software # +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # +# # +# Copyright (C) 2016 IPFire-Team <info(a)ipfire.org>. = # +# # +############################################################################ +# +. /opt/pakfire/lib/functions.sh +extract_files +restore_backup ${NAME} + +# add unbound user and group +groupadd -g 85 unbound=20 +useradd -c "Unbound DNS resolver" -d /var/lib/unbound -u 85 -g unbound -s /b= in/false unbound + +# create config subdir's +mkdir -pv /etc/unbound/log /etc/unbound/zones /var/log/unbound +chown unbound:unbound -R /var/log/unbound/ /etc/unbound/log/; + +echo "Add logrotate config for unbound now..." +LOGROTATE=3D$(grep -A 1 '/var/log/unbound/unbound.log' /etc/logrotate.conf) +if [[ ! "${LOGROTATE}" ]]; then +cat >> /etc/logrotate.conf << "EOF" +# Unbound +/var/log/unbound/unbound.log { + daily + rotate 30 + copytruncate + compress + missingok + prerotate + /bin/mv -f /etc/unbound/log/unbound.log /var/log/unbound/unbound.log + /usr/sbin/unbound-control log_reopen &> /dev/null + endscript +} + +EOF +touch /etc/unbound/dhcpleases.conf +touch /var/log/unbound/unbound.log +chown unbound:unbound /var/log/unbound/unbound.log +fi + +# create link to current logfile +ln -svf /etc/unbound/log/unbound.log /var/log/unbound/current.log + +# create remote control key files and set rights=20 +/usr/sbin/unbound-control-setup &> /dev/null +chown unbound:unbound /etc/unbound/{unbound_control.*,unbound_server.*,root.= key,root.hints} + +# at last switch the DNS-Resolver to unbound +/usr/sbin/unbound-switch + +unset LOGROTATE +exit 0 diff --git a/src/paks/unbound/uninstall.sh b/src/paks/unbound/uninstall.sh new file mode 100644 index 0000000..fc39f9f --- /dev/null +++ b/src/paks/unbound/uninstall.sh @@ -0,0 +1,27 @@ +#!/bin/bash +############################################################################ +# # +# This file is part of the IPFire Firewall. # +# # +# IPFire is free software; you can redistribute it and/or modify # +# it under the terms of the GNU General Public License as published by # +# the Free Software Foundation; either version 2 of the License, or # +# (at your option) any later version. # +# # +# IPFire is distributed in the hope that it will be useful, # +# but WITHOUT ANY WARRANTY; without even the implied warranty of # +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # +# GNU General Public License for more details. # +# # +# You should have received a copy of the GNU General Public License # +# along with IPFire; if not, write to the Free Software # +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # +# # +# Copyright (C) 2007 IPFire-Team <info(a)ipfire.org>. = # +# # +############################################################################ +# +. /opt/pakfire/lib/functions.sh +/usr/sbin/resolver.sh +make_backup ${NAME} +remove_files diff --git a/src/paks/unbound/update.sh b/src/paks/unbound/update.sh new file mode 100644 index 0000000..89c40d0 --- /dev/null +++ b/src/paks/unbound/update.sh @@ -0,0 +1,26 @@ +#!/bin/bash +############################################################################ +# # +# This file is part of the IPFire Firewall. # +# # +# IPFire is free software; you can redistribute it and/or modify # +# it under the terms of the GNU General Public License as published by # +# the Free Software Foundation; either version 2 of the License, or # +# (at your option) any later version. # +# # +# IPFire is distributed in the hope that it will be useful, # +# but WITHOUT ANY WARRANTY; without even the implied warranty of # +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # +# GNU General Public License for more details. # +# # +# You should have received a copy of the GNU General Public License # +# along with IPFire; if not, write to the Free Software # +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # +# # +# Copyright (C) 2007 IPFire-Team <info(a)ipfire.org>. = # +# # +############################################################################ +# +. /opt/pakfire/lib/functions.sh +./uninstall.sh +./install.sh --=20 1.9.1 --===============6610858721895677634==--