From 29912626562d07970018cd31b28c3962abcf87b6 Mon Sep 17 00:00:00 2001 From: KatolaZ Date: Sat, 7 Jan 2017 23:47:32 +0000 Subject: [PATCH] Package created for version 0.2.1 --- debian_package/setnet-0.2.1/ChangeLog | 11 + .../setnet-0.2.1/debian/README.Debian | 132 ++ .../setnet-0.2.1/debian/README.source | 10 + debian_package/setnet-0.2.1/debian/changelog | 34 + debian_package/setnet-0.2.1/debian/compat | 1 + debian_package/setnet-0.2.1/debian/control | 19 + debian_package/setnet-0.2.1/debian/copyright | 21 + .../setnet-0.2.1/debian/debhelper-build-stamp | 1 + debian_package/setnet-0.2.1/debian/files | 1 + debian_package/setnet-0.2.1/debian/init.d.ex | 26 + debian_package/setnet-0.2.1/debian/install | 5 + .../setnet-0.2.1/debian/manpage.1.ex | 56 + .../setnet-0.2.1/debian/manpage.sgml.ex | 154 ++ .../setnet-0.2.1/debian/manpage.xml.ex | 291 +++ debian_package/setnet-0.2.1/debian/menu.ex | 2 + .../setnet-0.2.1/debian/postinst.ex | 39 + debian_package/setnet-0.2.1/debian/postrm.ex | 37 + debian_package/setnet-0.2.1/debian/preinst.ex | 35 + debian_package/setnet-0.2.1/debian/prerm.ex | 38 + debian_package/setnet-0.2.1/debian/rules | 25 + .../setnet-0.2.1/debian/setnet-docs.docs | 2 + .../setnet-0.2.1/debian/setnet.cron.d.ex | 4 + .../setnet-0.2.1/debian/setnet.debhelper.log | 20 + .../setnet-0.2.1/debian/setnet.default.ex | 10 + .../setnet-0.2.1/debian/setnet.doc-base.EX | 20 + .../setnet-0.2.1/debian/setnet.substvars | 2 + .../debian/setnet/DEBIAN/conffiles | 2 + .../setnet-0.2.1/debian/setnet/DEBIAN/control | 14 + .../setnet-0.2.1/debian/setnet/DEBIAN/md5sums | 7 + .../setnet-0.2.1/debian/setnet/etc/setnetrc | 28 + .../setnet/etc/wpa_supplicant/wpa_setnet.conf | 4 + .../debian/setnet/usr/sbin/setnet.sh | 1916 +++++++++++++++++ .../setnet/usr/share/doc/setnet/ChangeLog | 11 + .../setnet/usr/share/doc/setnet/README.Debian | 132 ++ .../usr/share/doc/setnet/changelog.Debian.gz | Bin 0 -> 495 bytes .../setnet/usr/share/doc/setnet/changelog.gz | Bin 0 -> 304 bytes .../setnet/usr/share/doc/setnet/copyright | 21 + .../setnet/usr/share/man/man8/setnet.8.gz | Bin 0 -> 2824 bytes .../setnet-0.2.1/debian/source/format | 1 + debian_package/setnet-0.2.1/debian/watch.ex | 39 + debian_package/setnet-0.2.1/setnet.8.gz | Bin 0 -> 2835 bytes debian_package/setnet-0.2.1/setnet.sh | 1916 +++++++++++++++++ debian_package/setnet-0.2.1/setnetrc | 28 + debian_package/setnet-0.2.1/wpa_setnet.conf | 4 + debian_package/setnet_0.2.1-1.debian.tar.xz | Bin 0 -> 9744 bytes debian_package/setnet_0.2.1-1.dsc | 31 + debian_package/setnet_0.2.1-1_all.deb | Bin 0 -> 17164 bytes debian_package/setnet_0.2.1-1_amd64.changes | 42 + debian_package/setnet_0.2.1.orig.tar.xz | Bin 0 -> 13512 bytes setnetrc | 12 +- 50 files changed, 5201 insertions(+), 3 deletions(-) create mode 100644 debian_package/setnet-0.2.1/ChangeLog create mode 100644 debian_package/setnet-0.2.1/debian/README.Debian create mode 100644 debian_package/setnet-0.2.1/debian/README.source create mode 100644 debian_package/setnet-0.2.1/debian/changelog create mode 100644 debian_package/setnet-0.2.1/debian/compat create mode 100644 debian_package/setnet-0.2.1/debian/control create mode 100644 debian_package/setnet-0.2.1/debian/copyright create mode 100644 debian_package/setnet-0.2.1/debian/debhelper-build-stamp create mode 100644 debian_package/setnet-0.2.1/debian/files create mode 100644 debian_package/setnet-0.2.1/debian/init.d.ex create mode 100644 debian_package/setnet-0.2.1/debian/install create mode 100644 debian_package/setnet-0.2.1/debian/manpage.1.ex create mode 100644 debian_package/setnet-0.2.1/debian/manpage.sgml.ex create mode 100644 debian_package/setnet-0.2.1/debian/manpage.xml.ex create mode 100644 debian_package/setnet-0.2.1/debian/menu.ex create mode 100644 debian_package/setnet-0.2.1/debian/postinst.ex create mode 100644 debian_package/setnet-0.2.1/debian/postrm.ex create mode 100644 debian_package/setnet-0.2.1/debian/preinst.ex create mode 100644 debian_package/setnet-0.2.1/debian/prerm.ex create mode 100755 debian_package/setnet-0.2.1/debian/rules create mode 100644 debian_package/setnet-0.2.1/debian/setnet-docs.docs create mode 100644 debian_package/setnet-0.2.1/debian/setnet.cron.d.ex create mode 100644 debian_package/setnet-0.2.1/debian/setnet.debhelper.log create mode 100644 debian_package/setnet-0.2.1/debian/setnet.default.ex create mode 100644 debian_package/setnet-0.2.1/debian/setnet.doc-base.EX create mode 100644 debian_package/setnet-0.2.1/debian/setnet.substvars create mode 100644 debian_package/setnet-0.2.1/debian/setnet/DEBIAN/conffiles create mode 100644 debian_package/setnet-0.2.1/debian/setnet/DEBIAN/control create mode 100644 debian_package/setnet-0.2.1/debian/setnet/DEBIAN/md5sums create mode 100644 debian_package/setnet-0.2.1/debian/setnet/etc/setnetrc create mode 100644 debian_package/setnet-0.2.1/debian/setnet/etc/wpa_supplicant/wpa_setnet.conf create mode 100755 debian_package/setnet-0.2.1/debian/setnet/usr/sbin/setnet.sh create mode 100644 debian_package/setnet-0.2.1/debian/setnet/usr/share/doc/setnet/ChangeLog create mode 100644 debian_package/setnet-0.2.1/debian/setnet/usr/share/doc/setnet/README.Debian create mode 100644 debian_package/setnet-0.2.1/debian/setnet/usr/share/doc/setnet/changelog.Debian.gz create mode 100644 debian_package/setnet-0.2.1/debian/setnet/usr/share/doc/setnet/changelog.gz create mode 100644 debian_package/setnet-0.2.1/debian/setnet/usr/share/doc/setnet/copyright create mode 100644 debian_package/setnet-0.2.1/debian/setnet/usr/share/man/man8/setnet.8.gz create mode 100644 debian_package/setnet-0.2.1/debian/source/format create mode 100644 debian_package/setnet-0.2.1/debian/watch.ex create mode 100644 debian_package/setnet-0.2.1/setnet.8.gz create mode 100755 debian_package/setnet-0.2.1/setnet.sh create mode 100644 debian_package/setnet-0.2.1/setnetrc create mode 100644 debian_package/setnet-0.2.1/wpa_setnet.conf create mode 100644 debian_package/setnet_0.2.1-1.debian.tar.xz create mode 100644 debian_package/setnet_0.2.1-1.dsc create mode 100644 debian_package/setnet_0.2.1-1_all.deb create mode 100644 debian_package/setnet_0.2.1-1_amd64.changes create mode 100644 debian_package/setnet_0.2.1.orig.tar.xz diff --git a/debian_package/setnet-0.2.1/ChangeLog b/debian_package/setnet-0.2.1/ChangeLog new file mode 100644 index 0000000..016aab7 --- /dev/null +++ b/debian_package/setnet-0.2.1/ChangeLog @@ -0,0 +1,11 @@ +2017-01-07 KatolaZ + + * setnet.sh (configure_device): Improved wifi detection + * (netdiag_ping), (netdiag_traceroute),(netdiag_query): + changed dialog to programbox + * solved viasualitation bug in ip config + * added a manpage + * Added configuration variable "WIFI_DEVICES" + * The "Setup interface" menu has been reorganised + * added "Config IP Address" and "Manage Wifi Networking" + diff --git a/debian_package/setnet-0.2.1/debian/README.Debian b/debian_package/setnet-0.2.1/debian/README.Debian new file mode 100644 index 0000000..0cad044 --- /dev/null +++ b/debian_package/setnet-0.2.1/debian/README.Debian @@ -0,0 +1,132 @@ ++--------------+ +| setnet | ++--------------+ + +Copyleft (C) Vincenzo "KatolaZ" Nicosia + 2016, 2017 + +=== DESCRIPTION === + +setnet is a shell script with a dialog UI to configure ethernet and +wifi connections. It is meant to be POSIX-compliant, and has been +tested with bash, busybox, dash, ksh, mksh, posh, and yash. It is +still to be considered beta software, so you should use it AT YOUR OWN +RISK, but it is already fully functional. + +=== LICENSE === + +setnet is Free Software, and can be used and distributed under the +terms of the GNU General Public License, either version 3 of the +licence or, at your option, any later version. + +Please see the file LICENSE for more information + +=== DEPENDENCIES === + +In order to run setset, you MUST satisfy this (relatively small) set +of dependencies: + + - a posix-compliant shell (bash, busybox, dash, ksh, mksh, posh, and + yash have been tested) + + - dialog (version 1.2 tested, but it should work with previous + versions as well) + + - dhcp-client (for dhclient, tested with isc-dhcp-client) + + - iproute2 (for ip) + + - wireless-tools (for iwconfig, currently required for interface + identification) + +Most of those tools might already be installed in your system anyway. +In particular, setnet uses: + + - dialog: to provide a minimal Text-based User Interface, + - ip: to configure network interfaces and get information about them, + - dhclient: for DHCP-based IP configuration + - iwconfig: to check whether a network device is a wifi adapter + +In order to use the full set of functionalities provided by setnet, +you MIGHT also need the following packages: + + - wpa_supplicant (for wifi configuration) + + - net-tools (for netstat, to gather information about network status) + + - iputils-ping (for ping) + + - bind9-nost (for host, used to check DNS configuration) + + - traceroute (to trace the route between your host and any other host + in the Internet) + +Again, most of them should be already installed in your system anyway. + +=== USAGE === + +setnet is installed under /usr/sbin/setnet.sh. If invoked with "-h", +it provides a list of supported options: + +$ ./setnet.sh -h +Usage: setnet.sh [OPTION] +Options: + -c cfg_file Load configuration from cfg_file. + -v Print version number and exit. + -h Show this help. +$ + +If the argument "-c" is specified, setnet will use the provided +configuration file. Otherwise, it will look for its configuration file +in one of the following locations: + + - /etc/setnetrc + - ~/.setnetrc + +in the given order. The following configuration variables should be +defined in setnetrc: + + + - WPA_FILE + This is the file configuration file used by wpa_supplicant. + + - LOGNAME + This is the file used for logging. + + - TRUNCATE_LOG + if equal to "yes", the log file will be truncated when setnet + starts + + +=== root vs. mortal users === + +Networking is an amdinistration task, and as such should be performed +by the host administrator, i.e., the user with UID 0 (normally called +"root"). However, in many modern GNU/Linux systems it is customary to +allow normal users to perform some administration tasks. There are at +least two concrete possibilities to allow a particular user (in the +following we call such user "fool") to configure network interfaces +using setnet. + + +-- 1) First approach: using sudo + +If sudo is installed in your system, it is sufficient to add the +following line: + + fool ALL=NOPASSWD: /usr/sbin/setnet.sh + +to the file /etc/sudoers, and the user "fool" will be able to run +setnet.sh with effective UID 0 (i.e., as if it was root), by using the +command: + +[fool@host]$ sudo /usr/sbin/setnet.sh + +and thus will be able to perform all the needed admin tasks to +configure networking. + +-- 2) Second approach: using sup + +......TO BE DOCUMENTED...... + + diff --git a/debian_package/setnet-0.2.1/debian/README.source b/debian_package/setnet-0.2.1/debian/README.source new file mode 100644 index 0000000..acbd725 --- /dev/null +++ b/debian_package/setnet-0.2.1/debian/README.source @@ -0,0 +1,10 @@ +setnet for Debian +---------------- + + + + + + -- Vincenzo (KatolaZ) Nicosia Wed, 04 Jan 2017 18:52:56 +0000 + diff --git a/debian_package/setnet-0.2.1/debian/changelog b/debian_package/setnet-0.2.1/debian/changelog new file mode 100644 index 0000000..3543ddc --- /dev/null +++ b/debian_package/setnet-0.2.1/debian/changelog @@ -0,0 +1,34 @@ +setnet (0.2.1-1) unstable; urgency=medium + + + * Version 0.2.1 -- See ChangeLog for details + + -- Vincenzo (KatolaZ) Nicosia Sat, 07 Jan 2017 23:29:44 +0000 + +setnet (0.2-1) unstable; urgency=medium + + * Initial release (20170104) + + == Major Changes == + + + Polished code to make it posix-shell compliant + + + Tested with bash, busybox, dash, ksh, mksh, posh, yash + + + Added support and checks for hard, soft, and optional + dependencies + + + Added standard command line options (-c, -h, -v) + + + Added submenu "Info" with basic network testing tools + + + Added submenu "Dump" to dump network information to a file + + + Added submenu "Log" (shows setnet logfile) + + + Added status information in device configuration panel + + + Added minimal README.Debian file + + + -- Vincenzo (KatolaZ) Nicosia Wed, 04 Jan 2017 18:52:56 +0000 diff --git a/debian_package/setnet-0.2.1/debian/compat b/debian_package/setnet-0.2.1/debian/compat new file mode 100644 index 0000000..ec63514 --- /dev/null +++ b/debian_package/setnet-0.2.1/debian/compat @@ -0,0 +1 @@ +9 diff --git a/debian_package/setnet-0.2.1/debian/control b/debian_package/setnet-0.2.1/debian/control new file mode 100644 index 0000000..e68853b --- /dev/null +++ b/debian_package/setnet-0.2.1/debian/control @@ -0,0 +1,19 @@ +Source: setnet +Section: unknown +Priority: optional +Maintainer: Vincenzo (KatolaZ) Nicosia +Build-Depends: debhelper (>=9) +Standards-Version: 3.9.8 +Homepage: http://kalos.mine.nu/setnet +#Vcs-Git: git://anonscm.debian.org/collab-maint/setnet.git +#Vcs-Browser: https://anonscm.debian.org/cgit/collab-maint/setnet.git + +Package: setnet +Architecture: all +Depends: ${shlibs:Depends}, ${misc:Depends}, bash | busybox | dash | ksh | mksh | posh | yash , dhcp-client, dialog, iproute2, iw +Suggests: wpasupplicant, pastebinit, net-tools, iputils-ping, bind9-host, traceroute +Description: simple shell/dialog tool to configure networks + setnet is a shell script with a dialog UI to configure ethernet + and wifi connections. It is meant to be POSIX-compliant, and has + been tested on bash, busybox, dash, ksh, mksh, posh, and yash. + diff --git a/debian_package/setnet-0.2.1/debian/copyright b/debian_package/setnet-0.2.1/debian/copyright new file mode 100644 index 0000000..f425891 --- /dev/null +++ b/debian_package/setnet-0.2.1/debian/copyright @@ -0,0 +1,21 @@ +Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ +Upstream-Name: setnet +Source: + +Files: debian/* +Copyright: 2016 Vincenzo (KatolaZ) Nicosia +License: GPL-3+ + This package 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 package 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 + . + diff --git a/debian_package/setnet-0.2.1/debian/debhelper-build-stamp b/debian_package/setnet-0.2.1/debian/debhelper-build-stamp new file mode 100644 index 0000000..c166bc0 --- /dev/null +++ b/debian_package/setnet-0.2.1/debian/debhelper-build-stamp @@ -0,0 +1 @@ +setnet diff --git a/debian_package/setnet-0.2.1/debian/files b/debian_package/setnet-0.2.1/debian/files new file mode 100644 index 0000000..475f706 --- /dev/null +++ b/debian_package/setnet-0.2.1/debian/files @@ -0,0 +1 @@ +setnet_0.2.1-1_all.deb unknown optional diff --git a/debian_package/setnet-0.2.1/debian/init.d.ex b/debian_package/setnet-0.2.1/debian/init.d.ex new file mode 100644 index 0000000..08360e2 --- /dev/null +++ b/debian_package/setnet-0.2.1/debian/init.d.ex @@ -0,0 +1,26 @@ +#!/bin/sh +# kFreeBSD do not accept scripts as interpreters, using #!/bin/sh and sourcing. +if [ true != "$INIT_D_SCRIPT_SOURCED" ] ; then + set "$0" "$@"; INIT_D_SCRIPT_SOURCED=true . /lib/init/init-d-script +fi +### BEGIN INIT INFO +# Provides: setnet +# Required-Start: $remote_fs $syslog +# Required-Stop: $remote_fs $syslog +# Default-Start: 2 3 4 5 +# Default-Stop: 0 1 6 +# Short-Description: +# Description: +# <...> +# <...> +### END INIT INFO + +# Author: Vincenzo (KatolaZ) Nicosia + +DESC="setnet" +DAEMON=/usr/bin/setnet + +# This is an example to start a single forking daemon capable of writing +# a pid file. To get other behaviors, implement do_start(), do_stop() or +# other functions to override the defaults in /lib/init/init-d-script. +# See also init-d-script(5) diff --git a/debian_package/setnet-0.2.1/debian/install b/debian_package/setnet-0.2.1/debian/install new file mode 100644 index 0000000..dab18fe --- /dev/null +++ b/debian_package/setnet-0.2.1/debian/install @@ -0,0 +1,5 @@ +setnet.sh /usr/sbin +setnetrc /etc/ +wpa_setnet.conf /etc/wpa_supplicant/ +setnet.8.gz /usr/share/man/man8/ +ChangeLog /usr/share/doc/setnet/ diff --git a/debian_package/setnet-0.2.1/debian/manpage.1.ex b/debian_package/setnet-0.2.1/debian/manpage.1.ex new file mode 100644 index 0000000..c48d1ce --- /dev/null +++ b/debian_package/setnet-0.2.1/debian/manpage.1.ex @@ -0,0 +1,56 @@ +.\" Hey, EMACS: -*- nroff -*- +.\" (C) Copyright 2017 Vincenzo (KatolaZ) Nicosia , +.\" +.\" First parameter, NAME, should be all caps +.\" Second parameter, SECTION, should be 1-8, maybe w/ subsection +.\" other parameters are allowed: see man(7), man(1) +.TH Setnet SECTION "January 4 2017" +.\" Please adjust this date whenever revising the manpage. +.\" +.\" Some roff macros, for reference: +.\" .nh disable hyphenation +.\" .hy enable hyphenation +.\" .ad l left justify +.\" .ad b justify to both left and right margins +.\" .nf disable filling +.\" .fi enable filling +.\" .br insert line break +.\" .sp insert n+1 empty lines +.\" for manpage-specific macros, see man(7) +.SH NAME +setnet \- program to do something +.SH SYNOPSIS +.B setnet +.RI [ options ] " files" ... +.br +.B bar +.RI [ options ] " files" ... +.SH DESCRIPTION +This manual page documents briefly the +.B setnet +and +.B bar +commands. +.PP +.\" TeX users may be more comfortable with the \fB\fP and +.\" \fI\fP escape sequences to invode bold face and italics, +.\" respectively. +\fBsetnet\fP is a program that... +.SH OPTIONS +These programs follow the usual GNU command line syntax, with long +options starting with two dashes (`-'). +A summary of options is included below. +For a complete description, see the Info files. +.TP +.B \-h, \-\-help +Show summary of options. +.TP +.B \-v, \-\-version +Show version of program. +.SH SEE ALSO +.BR bar (1), +.BR baz (1). +.br +The programs are documented fully by +.IR "The Rise and Fall of a Fooish Bar" , +available via the Info system. diff --git a/debian_package/setnet-0.2.1/debian/manpage.sgml.ex b/debian_package/setnet-0.2.1/debian/manpage.sgml.ex new file mode 100644 index 0000000..8e6d551 --- /dev/null +++ b/debian_package/setnet-0.2.1/debian/manpage.sgml.ex @@ -0,0 +1,154 @@ + manpage.1'. You may view + the manual page with: `docbook-to-man manpage.sgml | nroff -man | + less'. A typical entry in a Makefile or Makefile.am is: + +manpage.1: manpage.sgml + docbook-to-man $< > $@ + + + The docbook-to-man binary is found in the docbook-to-man package. + Please remember that if you create the nroff version in one of the + debian/rules file targets (such as build), you will need to include + docbook-to-man in your Build-Depends control field. + + --> + + + FIRSTNAME"> + SURNAME"> + + January 4 2017"> + + SECTION"> + katolaz@freaknet.org"> + + Setnet"> + + + Debian"> + GNU"> + GPL"> +]> + + + +
+ &dhemail; +
+ + &dhfirstname; + &dhsurname; + + + 2003 + &dhusername; + + &dhdate; +
+ + &dhucpackage; + + &dhsection; + + + &dhpackage; + + program to do something + + + + &dhpackage; + + + + + + + + DESCRIPTION + + This manual page documents briefly the + &dhpackage; and bar + commands. + + This manual page was written for the &debian; distribution + because the original program does not have a manual page. + Instead, it has documentation in the &gnu; + Info format; see below. + + &dhpackage; is a program that... + + + + OPTIONS + + These programs follow the usual &gnu; command line syntax, + with long options starting with two dashes (`-'). A summary of + options is included below. For a complete description, see the + Info files. + + + + + + + + Show summary of options. + + + + + + + + Show version of program. + + + + + + SEE ALSO + + bar (1), baz (1). + + The programs are documented fully by The Rise and + Fall of a Fooish Bar available via the + Info system. + + + AUTHOR + + This manual page was written by &dhusername; &dhemail; for + the &debian; system (and may be used by others). Permission is + granted to copy, distribute and/or modify this document under + the terms of the &gnu; General Public License, Version 2 any + later version published by the Free Software Foundation. + + + On Debian systems, the complete text of the GNU General Public + License can be found in /usr/share/common-licenses/GPL. + + + +
+ + diff --git a/debian_package/setnet-0.2.1/debian/manpage.xml.ex b/debian_package/setnet-0.2.1/debian/manpage.xml.ex new file mode 100644 index 0000000..ae9864a --- /dev/null +++ b/debian_package/setnet-0.2.1/debian/manpage.xml.ex @@ -0,0 +1,291 @@ + +.
will be generated. You may view the +manual page with: nroff -man .
| less'. A typical entry +in a Makefile or Makefile.am is: + +DB2MAN = /usr/share/sgml/docbook/stylesheet/xsl/docbook-xsl/manpages/docbook.xsl +XP = xsltproc -''-nonet -''-param man.charmap.use.subset "0" + +manpage.1: manpage.xml + $(XP) $(DB2MAN) $< + +The xsltproc binary is found in the xsltproc package. The XSL files are in +docbook-xsl. A description of the parameters you can use can be found in the +docbook-xsl-doc-* packages. Please remember that if you create the nroff +version in one of the debian/rules file targets (such as build), you will need +to include xsltproc and docbook-xsl in your Build-Depends control field. +Alternatively use the xmlto command/package. That will also automatically +pull in xsltproc and docbook-xsl. + +Notes for using docbook2x: docbook2x-man does not automatically create the +AUTHOR(S) and COPYRIGHT sections. In this case, please add them manually as + ... . + +To disable the automatic creation of the AUTHOR(S) and COPYRIGHT sections +read /usr/share/doc/docbook-xsl/doc/manpages/authors.html. This file can be +found in the docbook-xsl-doc-html package. + +Validation can be done using: `xmllint -''-noout -''-valid manpage.xml` + +General documentation about man-pages and man-page-formatting: +man(1), man(7), http://www.tldp.org/HOWTO/Man-Page/ + +--> + + + + + + + + + + + + + +]> + + + + &dhtitle; + &dhpackage; + + + &dhfirstname; + &dhsurname; + Wrote this manpage for the Debian system. +
+ &dhemail; +
+
+
+ + 2007 + &dhusername; + + + This manual page was written for the Debian system + (and may be used by others). + Permission is granted to copy, distribute and/or modify this + document under the terms of the GNU General Public License, + Version 2 or (at your option) any later version published by + the Free Software Foundation. + On Debian systems, the complete text of the GNU General Public + License can be found in + /usr/share/common-licenses/GPL. + +
+ + &dhucpackage; + &dhsection; + + + &dhpackage; + program to do something + + + + &dhpackage; + + + + + + + + + this + + + + + + + + this + that + + + + + &dhpackage; + + + + + + + + + + + + + + + + + + + DESCRIPTION + This manual page documents briefly the + &dhpackage; and bar + commands. + This manual page was written for the Debian distribution + because the original program does not have a manual page. + Instead, it has documentation in the GNU + info + 1 + format; see below. + &dhpackage; is a program that... + + + OPTIONS + The program follows the usual GNU command line syntax, + with long options starting with two dashes (`-'). A summary of + options is included below. For a complete description, see the + + info + 1 + files. + + + + + + + Does this and that. + + + + + + + Show summary of options. + + + + + + + Show version of program. + + + + + + FILES + + + /etc/foo.conf + + The system-wide configuration file to control the + behaviour of &dhpackage;. See + + foo.conf + 5 + for further details. + + + + ${HOME}/.foo.conf + + The per-user configuration file to control the + behaviour of &dhpackage;. See + + foo.conf + 5 + for further details. + + + + + + ENVIRONMENT + + + FOO_CONF + + If used, the defined file is used as configuration + file (see also ). + + + + + + DIAGNOSTICS + The following diagnostics may be issued + on stderr: + + + Bad configuration file. Exiting. + + The configuration file seems to contain a broken configuration + line. Use the option, to get more info. + + + + + &dhpackage; provides some return codes, that can + be used in scripts: + + Code + Diagnostic + + 0 + Program exited successfully. + + + 1 + The configuration file seems to be broken. + + + + + + BUGS + The program is currently limited to only work + with the foobar library. + The upstreams BTS can be found + at . + + + SEE ALSO + + + bar + 1 + , + baz + 1 + , + foo.conf + 5 + + The programs are documented fully by The Rise and + Fall of a Fooish Bar available via the + info + 1 + system. + +
+ diff --git a/debian_package/setnet-0.2.1/debian/menu.ex b/debian_package/setnet-0.2.1/debian/menu.ex new file mode 100644 index 0000000..3f6b8bb --- /dev/null +++ b/debian_package/setnet-0.2.1/debian/menu.ex @@ -0,0 +1,2 @@ +?package(setnet):needs="X11|text|vc|wm" section="Applications/see-menu-manual"\ + title="setnet" command="/usr/bin/setnet" diff --git a/debian_package/setnet-0.2.1/debian/postinst.ex b/debian_package/setnet-0.2.1/debian/postinst.ex new file mode 100644 index 0000000..63f6b54 --- /dev/null +++ b/debian_package/setnet-0.2.1/debian/postinst.ex @@ -0,0 +1,39 @@ +#!/bin/sh +# postinst script for setnet +# +# see: dh_installdeb(1) + +set -e + +# summary of how this script can be called: +# * `configure' +# * `abort-upgrade' +# * `abort-remove' `in-favour' +# +# * `abort-remove' +# * `abort-deconfigure' `in-favour' +# `removing' +# +# for details, see https://www.debian.org/doc/debian-policy/ or +# the debian-policy package + + +case "$1" in + configure) + ;; + + abort-upgrade|abort-remove|abort-deconfigure) + ;; + + *) + echo "postinst called with unknown argument \`$1'" >&2 + exit 1 + ;; +esac + +# dh_installdeb will replace this with shell code automatically +# generated by other debhelper scripts. + +#DEBHELPER# + +exit 0 diff --git a/debian_package/setnet-0.2.1/debian/postrm.ex b/debian_package/setnet-0.2.1/debian/postrm.ex new file mode 100644 index 0000000..14fe7e0 --- /dev/null +++ b/debian_package/setnet-0.2.1/debian/postrm.ex @@ -0,0 +1,37 @@ +#!/bin/sh +# postrm script for setnet +# +# see: dh_installdeb(1) + +set -e + +# summary of how this script can be called: +# * `remove' +# * `purge' +# * `upgrade' +# * `failed-upgrade' +# * `abort-install' +# * `abort-install' +# * `abort-upgrade' +# * `disappear' +# +# for details, see https://www.debian.org/doc/debian-policy/ or +# the debian-policy package + + +case "$1" in + purge|remove|upgrade|failed-upgrade|abort-install|abort-upgrade|disappear) + ;; + + *) + echo "postrm called with unknown argument \`$1'" >&2 + exit 1 + ;; +esac + +# dh_installdeb will replace this with shell code automatically +# generated by other debhelper scripts. + +#DEBHELPER# + +exit 0 diff --git a/debian_package/setnet-0.2.1/debian/preinst.ex b/debian_package/setnet-0.2.1/debian/preinst.ex new file mode 100644 index 0000000..09a88b6 --- /dev/null +++ b/debian_package/setnet-0.2.1/debian/preinst.ex @@ -0,0 +1,35 @@ +#!/bin/sh +# preinst script for setnet +# +# see: dh_installdeb(1) + +set -e + +# summary of how this script can be called: +# * `install' +# * `install' +# * `upgrade' +# * `abort-upgrade' +# for details, see https://www.debian.org/doc/debian-policy/ or +# the debian-policy package + + +case "$1" in + install|upgrade) + ;; + + abort-upgrade) + ;; + + *) + echo "preinst called with unknown argument \`$1'" >&2 + exit 1 + ;; +esac + +# dh_installdeb will replace this with shell code automatically +# generated by other debhelper scripts. + +#DEBHELPER# + +exit 0 diff --git a/debian_package/setnet-0.2.1/debian/prerm.ex b/debian_package/setnet-0.2.1/debian/prerm.ex new file mode 100644 index 0000000..725e2b8 --- /dev/null +++ b/debian_package/setnet-0.2.1/debian/prerm.ex @@ -0,0 +1,38 @@ +#!/bin/sh +# prerm script for setnet +# +# see: dh_installdeb(1) + +set -e + +# summary of how this script can be called: +# * `remove' +# * `upgrade' +# * `failed-upgrade' +# * `remove' `in-favour' +# * `deconfigure' `in-favour' +# `removing' +# +# for details, see https://www.debian.org/doc/debian-policy/ or +# the debian-policy package + + +case "$1" in + remove|upgrade|deconfigure) + ;; + + failed-upgrade) + ;; + + *) + echo "prerm called with unknown argument \`$1'" >&2 + exit 1 + ;; +esac + +# dh_installdeb will replace this with shell code automatically +# generated by other debhelper scripts. + +#DEBHELPER# + +exit 0 diff --git a/debian_package/setnet-0.2.1/debian/rules b/debian_package/setnet-0.2.1/debian/rules new file mode 100755 index 0000000..2f54c47 --- /dev/null +++ b/debian_package/setnet-0.2.1/debian/rules @@ -0,0 +1,25 @@ +#!/usr/bin/make -f +# See debhelper(7) (uncomment to enable) +# output every command that modifies files on the build system. +#export DH_VERBOSE = 1 + + +# see FEATURE AREAS in dpkg-buildflags(1) +#export DEB_BUILD_MAINT_OPTIONS = hardening=+all + +# see ENVIRONMENT in dpkg-buildflags(1) +# package maintainers to append CFLAGS +#export DEB_CFLAGS_MAINT_APPEND = -Wall -pedantic +# package maintainers to append LDFLAGS +#export DEB_LDFLAGS_MAINT_APPEND = -Wl,--as-needed + + +%: + dh $@ + + +# dh_make generated override targets +# This is example for Cmake (See https://bugs.debian.org/641051 ) +#override_dh_auto_configure: +# dh_auto_configure -- # -DCMAKE_LIBRARY_PATH=$(DEB_HOST_MULTIARCH) + diff --git a/debian_package/setnet-0.2.1/debian/setnet-docs.docs b/debian_package/setnet-0.2.1/debian/setnet-docs.docs new file mode 100644 index 0000000..efea0a6 --- /dev/null +++ b/debian_package/setnet-0.2.1/debian/setnet-docs.docs @@ -0,0 +1,2 @@ +README.Debian +README.source diff --git a/debian_package/setnet-0.2.1/debian/setnet.cron.d.ex b/debian_package/setnet-0.2.1/debian/setnet.cron.d.ex new file mode 100644 index 0000000..fd54f7d --- /dev/null +++ b/debian_package/setnet-0.2.1/debian/setnet.cron.d.ex @@ -0,0 +1,4 @@ +# +# Regular cron jobs for the setnet package +# +0 4 * * * root [ -x /usr/bin/setnet_maintenance ] && /usr/bin/setnet_maintenance diff --git a/debian_package/setnet-0.2.1/debian/setnet.debhelper.log b/debian_package/setnet-0.2.1/debian/setnet.debhelper.log new file mode 100644 index 0000000..a058680 --- /dev/null +++ b/debian_package/setnet-0.2.1/debian/setnet.debhelper.log @@ -0,0 +1,20 @@ +dh_update_autotools_config +dh_auto_configure +dh_auto_build +dh_auto_test +dh_prep +dh_auto_install +dh_install +dh_installdocs +dh_installchangelogs +dh_installman +dh_perl +dh_link +dh_strip_nondeterminism +dh_compress +dh_fixperms +dh_installdeb +dh_gencontrol +dh_md5sums +dh_builddeb +dh_builddeb diff --git a/debian_package/setnet-0.2.1/debian/setnet.default.ex b/debian_package/setnet-0.2.1/debian/setnet.default.ex new file mode 100644 index 0000000..ade741e --- /dev/null +++ b/debian_package/setnet-0.2.1/debian/setnet.default.ex @@ -0,0 +1,10 @@ +# Defaults for setnet initscript +# sourced by /etc/init.d/setnet +# installed at /etc/default/setnet by the maintainer scripts + +# +# This is a POSIX shell fragment +# + +# Additional options that are passed to the Daemon. +DAEMON_OPTS="" diff --git a/debian_package/setnet-0.2.1/debian/setnet.doc-base.EX b/debian_package/setnet-0.2.1/debian/setnet.doc-base.EX new file mode 100644 index 0000000..42bd26a --- /dev/null +++ b/debian_package/setnet-0.2.1/debian/setnet.doc-base.EX @@ -0,0 +1,20 @@ +Document: setnet +Title: Debian setnet Manual +Author: +Abstract: This manual describes what setnet is + and how it can be used to + manage online manuals on Debian systems. +Section: unknown + +Format: debiandoc-sgml +Files: /usr/share/doc/setnet/setnet.sgml.gz + +Format: postscript +Files: /usr/share/doc/setnet/setnet.ps.gz + +Format: text +Files: /usr/share/doc/setnet/setnet.text.gz + +Format: HTML +Index: /usr/share/doc/setnet/html/index.html +Files: /usr/share/doc/setnet/html/*.html diff --git a/debian_package/setnet-0.2.1/debian/setnet.substvars b/debian_package/setnet-0.2.1/debian/setnet.substvars new file mode 100644 index 0000000..978fc8b --- /dev/null +++ b/debian_package/setnet-0.2.1/debian/setnet.substvars @@ -0,0 +1,2 @@ +misc:Depends= +misc:Pre-Depends= diff --git a/debian_package/setnet-0.2.1/debian/setnet/DEBIAN/conffiles b/debian_package/setnet-0.2.1/debian/setnet/DEBIAN/conffiles new file mode 100644 index 0000000..3479547 --- /dev/null +++ b/debian_package/setnet-0.2.1/debian/setnet/DEBIAN/conffiles @@ -0,0 +1,2 @@ +/etc/setnetrc +/etc/wpa_supplicant/wpa_setnet.conf diff --git a/debian_package/setnet-0.2.1/debian/setnet/DEBIAN/control b/debian_package/setnet-0.2.1/debian/setnet/DEBIAN/control new file mode 100644 index 0000000..9ca6b07 --- /dev/null +++ b/debian_package/setnet-0.2.1/debian/setnet/DEBIAN/control @@ -0,0 +1,14 @@ +Package: setnet +Version: 0.2.1-1 +Architecture: all +Maintainer: Vincenzo (KatolaZ) Nicosia +Installed-Size: 98 +Depends: bash | busybox | dash | ksh | mksh | posh | yash, dhcp-client, dialog, iproute2, iw +Suggests: wpasupplicant, pastebinit, net-tools, iputils-ping, bind9-host, traceroute +Section: unknown +Priority: optional +Homepage: http://kalos.mine.nu/setnet +Description: simple shell/dialog tool to configure networks + setnet is a shell script with a dialog UI to configure ethernet + and wifi connections. It is meant to be POSIX-compliant, and has + been tested on bash, busybox, dash, ksh, mksh, posh, and yash. diff --git a/debian_package/setnet-0.2.1/debian/setnet/DEBIAN/md5sums b/debian_package/setnet-0.2.1/debian/setnet/DEBIAN/md5sums new file mode 100644 index 0000000..e5a5aca --- /dev/null +++ b/debian_package/setnet-0.2.1/debian/setnet/DEBIAN/md5sums @@ -0,0 +1,7 @@ +980d58c2cd00e288713afd4a6531adb8 usr/sbin/setnet.sh +4172998fd574b48830832ab309394f0b usr/share/doc/setnet/ChangeLog +d690d59753d9fcd42667d50efb859a68 usr/share/doc/setnet/README.Debian +3cfe3b32a34f3283b5c35b4ca64d3a61 usr/share/doc/setnet/changelog.Debian.gz +99816219e17b3947549385cc94e2a822 usr/share/doc/setnet/changelog.gz +e5218c2f383b136780a03ba5e3f610b2 usr/share/doc/setnet/copyright +a70e42957c6759bdc0cf56a827a1e30a usr/share/man/man8/setnet.8.gz diff --git a/debian_package/setnet-0.2.1/debian/setnet/etc/setnetrc b/debian_package/setnet-0.2.1/debian/setnet/etc/setnetrc new file mode 100644 index 0000000..725868a --- /dev/null +++ b/debian_package/setnet-0.2.1/debian/setnet/etc/setnetrc @@ -0,0 +1,28 @@ +## +## +## setnetrc -- configuration file for setnet +## +## + +## +## WPA_FILE: The default configuration file for wpa_supplicant +## +WPA_FILE=/etc/wpa_supplicant/wpa_setnet.conf + + +## +## LOGFILE: Location of the logfile +## +LOGFILE=/var/log/setnet.log + +## +## TRUNCATE_LOG: Truncate the log file at startup +## +TRUNCATE_LOG="yes" + +## +## WIFI_DEVICES: List of Wi-Fi devices, to be used if automatic +## detection fails +## + +##WIFI_DEVICES="wlan1 wlan3" diff --git a/debian_package/setnet-0.2.1/debian/setnet/etc/wpa_supplicant/wpa_setnet.conf b/debian_package/setnet-0.2.1/debian/setnet/etc/wpa_supplicant/wpa_setnet.conf new file mode 100644 index 0000000..9ce4275 --- /dev/null +++ b/debian_package/setnet-0.2.1/debian/setnet/etc/wpa_supplicant/wpa_setnet.conf @@ -0,0 +1,4 @@ +ctrl_interface=/var/run/wpa_supplicant +update_config=1 +GROUP=wheel + diff --git a/debian_package/setnet-0.2.1/debian/setnet/usr/sbin/setnet.sh b/debian_package/setnet-0.2.1/debian/setnet/usr/sbin/setnet.sh new file mode 100755 index 0000000..1400319 --- /dev/null +++ b/debian_package/setnet-0.2.1/debian/setnet/usr/sbin/setnet.sh @@ -0,0 +1,1916 @@ +#!/bin/sh + +# 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 . +# +# ---------------------------------------------------------------------- +# +# setnet.sh -- view and configure network interfaces +# +# ---------------------------------------------------------------------- +# +# Copyleft (C) Vincenzo "KatolaZ" Nicosia (katolaz@freaknet.org) -- +# (2016, 2017) +# +# + + +## +## Initialisation +## + +VERSION=0.2.1 + + +TOPSTR="setnet-${VERSION} [user: $(id -run)]" +DIALOG="dialog --backtitle \"${TOPSTR}\" " + + +############################### +## ## +## Internal config variables ## +## ## +############################### + +## +## Required dependencies. If any of those commands is missing, +## the script will exit +## + +HARD_DEPS="ip dhclient dialog iw sed grep cat awk which" + +## +## Suggested dependencies. The script will issue a warning if any of +## those commands is missing +## + +SOFT_DEPS="wpa_cli wpa_supplicant" + +## +## Optional dependencies. The script will check if those dependencies +## exist, and if they do, will set a variable HAS_OPTS which contains +## the names of the commands actually found +## + +OPT_DEPS="host ping traceroute netstat pastebinit" + +################################# + +##################################### +## ## +## HEIGHT/WIDTH of various dialogs ## +## ## +##################################### + +## +## Regular windows +## + +WINDOW_WIDTH=75 +WINDOW_HEIGHT=20 + +## +## Infoboxes +## +INFO_WIDTH=40 +INFO_HEIGHT=10 + + +## +## Forms +## +FORM_WIDTH=60 +FORM_HEIGHT=12 + +## +## Large windows +## + +LARGE_WIDTH=80 +LARGE_HEIGHT=20 + + +################################# + +################################ +## ## +## Supported network families ## +## ## +################################ + +NET_FAMILIES="inet inet6" + +################################# + +## +## Load the configuration file "setnetrc" +## + +##function +load_setnetrc(){ + + WPA_FILE="" + LOGFILE="" + ## If we were given a parameter, that is the rc file to load... + ## + if [ $# -ge 1 ]; then + . "$1" + return + fi + + ## + ## Otherwise, let's look in the standard locations, namely: + ## + + ## + ## 1) /etc/setnetrc + ## + + if [ -f /etc/setnetrc ]; then + SETNETRC=/etc/setnetrc + fi + + ## + ## 2) ~/.setnetrc + ## + + if [ -f ~/.setnetrc ]; then + SETNETRC=~/.setnetrc + fi + + if [ -n "${SETNETRC}" ] && + [ -f "${SETNETRC}" ]; then + . ${SETNETRC} + fi + + if [ -z ${WPA_FILE} ]; then + echo "Could not find WPA_FILE defined anywhere. Exiting" + exit 1 + fi + + if [ -z ${LOGFILE} ]; then + echo "Could not find LOGFILE defined anywhere. Exiting" + exit 1 + fi +} + + +## +## handler called upon exit/signal (NONE HUP INT TRAP TERM QUIT) +## + +##function +cleanup(){ + rm -f ${TMPFILE} + rm -f ${WPA_PIDFILE} +} + + +################### +# # +# LOGGING # +# # +################### + +## +## log() takes two arguments, namely the label and the message +## +## +##function +log(){ + + ##local + LABEL=$1 + ##local + MSG=$2 + + echo "${LABEL}:" "${MSG}" >> "${LOGFILE}" + +} + +## +## Check whether the shell which called the script is supported, or +## exit. Currently, we support the follwing shells: +## +## - bash +## - busybox +## - dash +## - ksh +## - mksh +## - posh +## - sh +## - yash +## + +##function +check_shell(){ + + ## + ## FIXME!!! THIS TEST DOES NOT WORK yet... + ## + CUR_SH=$(ps -p $$ -o comm=) + case ${CUR_SH} in + ash|bash|busybox|dash|ksh|mksh|posh|sh|yash) + log "check_shell" "The current shell (${CUR_SH}) is supported" + return + ;; + *) + log "check_shell" "The current shell (${CUR_SH}) is not supported" + echo "The current shell (${CUR_SH}) is not supported. Exiting..." + exit 1 + ;; + esac +} + + +## +## Check dependencies +## +## - check if the current shell is supported through check_shell +## +## - each command in HARD_DEPS MUST exist, or the script exits +## +## - each command in SOFT_DEPS SHOULD exist, or the script will log a +## warning +## +## - each command in OPT_DEPS MIGHT exist, and if it does its name is +## included in the variable "HAS_OPTS" +## + +##function +check_deps(){ + + ## FIXME FIRST.... check_shell + + for h in ${HARD_DEPS}; do + _W=$(which ${h}) + if [ -z "${_W}" ]; then + echo "Error: required command \"${h}\" not found. Exiting..." + exit 1 + fi + log "check_deps" "NOTICE: required command '${h}'...found" + done + + for s in ${SOFT_DEPS}; do + _S=$(which ${s}) + if [ -z "${_S}" ]; then + log "check_deps" "WARNING: suggested command '${s}' not found! Some functions might not work properly" + fi + done + + HAS_OPTS="" + for o in ${OPT_DEPS}; do + _O=$(which ${o}) + if [ -n "${_O}" ]; then + HAS_OPTS=" ${HAS_OPTS} ${o} " + log "check_deps" "NOTICE: optional command '${o}'...found" + else + log "check_deps" "NOTICE: optional command '${o}' not found!" + fi + done + + log "check_deps" "HAS_OPTS: \"${HAS_OPTS}\"" + +} + +## +## Generic function fo unimplemented features. It just pops up a +## message-box and returns +## + +##function +unimplemented(){ + + LABEL=$1 + + eval "${DIALOG} --msgbox 'Sorry! '$LABEL' not implemented, yet!' \ + ${INFO_HEIGHT} ${INFO_WIDTH}" 2>${TMPFILE} +} + + +##function +check_sudo(){ + + LABEL="$1" + + if [ "${USING_SUDO}" = "1" ]; then + eval "${DIALOG} --msgbox '${LABEL}' ${INFO_HEIGHT} ${INFO_WIDTH} " 2>${TMPFILE} + return 1 + else + return 0 + fi + +} + + +########################################## + +##function +edit_file(){ + + ##local + FILEIN=$1 + log "edit_file" "editing file ${FILEIN}" + eval "${DIALOG} --title 'Editing file: ${FILEIN}' \ + --editbox ${FILEIN} ${WINDOW_HEIGHT} ${WINDOW_WIDTH}" 2> ${TMPFILE} + + if [ $? -eq 0 ]; then + log "edit_file" "Copying ${TMPFILE} into ${FILEIN}" + if cp "${TMPFILE}" "${FILEIN}" + then + eval "${DIALOG} --msgbox 'File ${FILEIN} saved successfully' \ + ${INFO_HEIGHT} ${INFO_WIDTH}" + else + eval "${DIALOG} --msgbox 'Error saving file ${FILEIN}' \ + ${INFO_HEIGHT} ${INFO_WIDTH}" + fi + else + log "edit_file" "Editing of ${FILEIN} aborted..." + eval "${DIALOG} --msgbox 'File ${FILEIN} not saved' \ + ${INFO_HEIGHT} ${INFO_WIDTH}" + fi +} + + + + +## +## Read all the configured addresses for a given inet family +## +##function +get_addr_family(){ + +##local + DEVNAME=$1 + ##local + DEVFAMILY=$2 + + NUMADDR=$(ip -f "${DEVFAMILY}" addr show "${DEVNAME}" | grep -c "${DEVFAMILY}") + ADDR_STR="" + for i in $(seq ${NUMADDR}); do + ADDR=$(ip -f "${DEVFAMILY}" addr show "${DEVNAME}" | grep "${DEVFAMILY}" | \ + tail -n +$i | head -1 | sed -r -e "s:^\ +::g" | cut -d " " -f 2,4,6 |\ + sed -r -e "s:\ : -- :g") + ADDR_STR="${ADDR_STR}\n${DEVFAMILY}: ${ADDR}\n" + done +} + +## +## Show the current configuration of a given device +## + +##function +show_device_conf(){ + +##local +DEVNAME=$1 + if [ -z "${DEVNAME}" ]; then + return -1 + fi + + DEVMAC=$(ip link show "${DEVNAME}" | tail -n +2 | sed -r 's/^\ +//g' | cut -d " " -f 2) + DEV_STATUS=$(ip -o link | cut -d " " -f 2,9 | grep -E "^${DEVNAME}: " | cut -d " " -f 2) + + DEVCONF="MAC: ${DEVMAC}\nLINK STATUS: ${DEV_STATUS}\n" + + log "show_device_conf" "NET_FAMILIES: \"${NET_FAMILIES}\"" + + for f in ${NET_FAMILIES}; do + get_addr_family ${DEVNAME} ${f} + log "show_device_conf" "family: ${f} ADDR_STR: \"${ADDR_STR}\"" + + if [ -z "${ADDR_STR}" ]; then + DEVCONF="${DEVCONF}${f}: Unconfigured\n" + else + DEVCONF="${DEVCONF}${ADDR_STR}" + fi + log "show_device_conf" "DEVCONF: ${DEVCONF}" + done + + DEVCONF="${DEVCONF}\n== name servers ==\n$(grep '^nameserver' /etc/resolv.conf)" + + eval "${DIALOG} --title 'Current configuration of device: ${DEVNAME}' \ + --msgbox '\n\n${DEVCONF}' ${WINDOW_HEIGHT} ${WINDOW_WIDTH} " + return 0 + +} + + + +##function +config_ip_static(){ + + ##local + DEV_IP="192.168.1.2" + ##local + DEV_NET="192.168.1.0" + ##local + DEV_NETMASK="255.255.255.0" + ##local + DEV_GW="192.168.1.1" + ##local + DEV_DNS1="208.67.222.222" + ##local + DEV_DNS2="208.67.220.220" + + ##local + DEVNAME=$1 + + exec 3>&1 + eval "${DIALOG} --form 'Set network for device: ${DEVNAME}' \ + ${FORM_HEIGHT} ${FORM_WIDTH} 0 \ + 'IP' 1 1 '${DEV_IP}' 1 16 16 16 \ + 'Network' 2 1 '${DEV_NET}' 2 16 16 16 \ + 'Netmask' 3 1 '${DEV_NETMASK}' 3 16 16 16 \ + 'Gateway' 4 1 '${DEV_GW}' 4 16 16 16 \ + 'Primary DNS' 5 1 '${DEV_DNS1}' 5 16 16 16 \ + 'Secondary DNS' 6 1 '${DEV_DNS2}' 6 16 16 16 " \ + 2> ${TMPFILE} + + if [ $? -eq 1 ]; then + eval "${DIALOG} --infobox 'Configuration of ${DEVNAME} aborted' \ + ${INFO_HEIGHT} ${INFO_WIDTH}" + return + fi + + read -d "*" DEV_IP DEV_NET DEV_NETMASK DEV_GW DEV_DNS1 DEV_DNS2 < ${TMPFILE} + eval "${DIALOG} --msgbox 'Proposed configuration of ${DEVNAME}:\n \ +IP: ${DEV_IP}\nNetwork: ${DEV_NET}\nNetmask: ${DEV_NETMASK}\nGateway: \ +${DEV_GW}\nDNS1: ${DEV_DNS1}\nDNS2: ${DEV_DNS2}'\ + ${WINDOW_HEIGHT} ${WINDOW_WIDTH}" + + ## Configure IP + + ip link set "${DEVNAME}" down + ip link set "${DEVNAME}" up + ip address flush dev "${DEVNAME}" + ip address add "${DEV_IP}/${DEV_NETMASK}" dev "${DEVNAME}" + + ## Configure GW + #if [ -n "${DEV_GW}" ]; then + ip route flush dev "${DEVNAME}" + ip route add "${DEV_NET}/${DEV_NETMASK}" dev "${DEVNAME}" + ip route add default via "${DEV_GW}" + #fi + ## Configure DNS + #if [ -n "${DEV_DNS1}" ] || + # [ -n "${DEV_DNS1}" ]; then + mv /etc/resolv.conf /etc/resolv.conf.bak + if [ -n "${DEV_DNS1}" ]; then + echo "nameserver ${DEV_DNS1}" >> /etc/resolv.conf + fi + if [ -n "${DEV_DNS2}" ]; then + echo "nameserver ${DEV_DNS2}" >> /etc/resolv.conf + fi + show_device_conf "${DEVNAME}" + #fi +} + +##function +config_ip_dhcp(){ + +##local + DEVNAME=$1 + + ##eval "${DIALOG} --msgbox 'Running \"dhclient ${DEVNAME}\"' ${INFO_HEIGHT} ${INFO_WIDTH}" + dhclient -r ${DEVNAME} 2>/dev/null + dhclient -v ${DEVNAME} 2>&1 | + eval "${DIALOG} --title 'Running dhclient ${DEVNAME}' \ + --programbox ${WINDOW_HEIGHT} ${WINDOW_WIDTH}" 2>${TMPFILE} + if [ $! -ne 0 ];then + log "config_ip_dhcp" "dhclient aborted" + fi + show_device_conf ${DEVNAME} +} + + +##function +configure_ip_address(){ + +##local + DEVNAME=$1 + + eval "${DIALOG} --cancel-label 'Up' \ + --menu 'Configuring ${DEVNAME}' ${INFO_HEIGHT} ${INFO_WIDTH} 4 \ + 'DHCP' ''\ + 'Static' ''" 2>${TMPFILE} + if [ $? -eq 1 ]; then + return + fi + ACTION=$(cat ${TMPFILE}) + case ${ACTION} in + "Static") + config_ip_static ${DEVNAME} + ;; + "DHCP") + config_ip_dhcp ${DEVNAME} + ;; + esac +} + +##function +wifi_essid_from_mac(){ + + ##local + DEVNAME=$1 + ##local + W_MAC=$2 + + W_ESSID=$(wpa_cli -i "${DEVNAME}" scan_results | grep -E "^${W_MAC}" | \ + sed -r -e 's/\t/\|/g' | cut -d "|" -f 5) + + log "wifi_essid_from_mac" "Recovered ESSID: ${W_ESSID}" +} + +##function +wifi_flags_from_mac(){ +##local + DEVNAME=$1 +##local + W_MAC=$2 + + W_FLAGS=$(wpa_cli -i "${DEVNAME}" scan_results | grep -E "^${W_MAC}" | \ + sed -r -e 's/\t/\|/g' | cut -d "|" -f 4) + log "wifi_essid_from_mac" "Recovered W_FLAGS: ${W_FLAGS}" + +} + + +##function +wifi_network_list(){ + +##local + DEVNAME=$1 + wpa_cli -i ${DEVNAME} list_networks | tail -n +2 | sed -r -e 's/\t/\|/g' > ${TMPFILE} + + NETLIST="" + LAST_IFS=$IFS + IFS="|" + while read NETNUM NETESSID NETBSSID NETFLAGS; do + IS_DIS=$(echo ${NETFLAGS} | sed -r -e 's/\[//g;s/\]//g' | grep -c -i disabled ) + if [ ${IS_DIS} -eq 1 ]; then + STATUS="(DIS)" + else + STATUS="(ENAB)" + fi + IS_CUR=$(echo ${NETFLAGS} | sed -r -e 's/\[//g;s/\]//g' | grep -c -i current ) + if [ ${IS_CUR} -eq 1 ]; then + STATUS="${STATUS}(CUR)" + fi + + + NETLIST="${NETLIST} ${NETNUM} \"${NETESSID}-${STATUS}\"" + done < ${TMPFILE} + IFS=${LAST_IFS} + + log "wifi_network_list" "NETLIST: ${NETLIST}" +} + + +## +## Manage the authentication for a given wifi ESSID +## +##function +wifi_authenticate(){ + +##local + DEVNAME=$1 +##local + W_MAC=$2 + + + log "wifi_authenticate" "configuring ${DEVNAME} on ${W_MAC}" + ## This will set the variable W_ESSID appropriately + wifi_essid_from_mac ${DEVNAME} ${W_MAC} + + ## This will set the variable W_FLAGS appropriately + wifi_flags_from_mac ${DEVNAME} ${W_MAC} + + + log "wifi_authenticate" "configuring essid: ${W_ESSID} on device: ${DEVNAME}" + log "wifi_authenticate" "W_FLAGS: ${W_FLAGS}" + + + NET_EXISTS=$(wpa_cli -i ${DEVNAME} list_networks | tail -n +2 | sed -r -e 's/\t/\|/g' \ + | cut -d "|" -f 2 | grep -c "${W_ESSID}$" ) + if [ ${NET_EXISTS} != 0 ]; then + NET_NUM=$(wpa_cli -i ${DEVNAME} list_networks | tail -n +2 | sed -r -e 's/\t/\|/g' \ + | cut -d "|" -f 1,2 | grep "${W_ESSID}$" | cut -d "|" -f 1) + wpa_cli -i ${DEVNAME} remove_network ${NET_NUM} > ${TMPFILE} + STATUS=$(cat ${TMPFILE}) + if [ "${STATUS}" != "OK" ]; then + eval "${DIALOG} --msgbox 'Error while removing existing \ + network:\n$essid: {W_ESSID}'" ${INFO_HEIGHT} ${INFO_WIDTH} + return + fi + fi + + + HAS_WPA=$(echo "${W_FLAGS}" | grep -E -c "WPA.*-PSK" ) + + log "wifi_authenticate" "HAS_WPA: \"${HAS_WPA}\"" + + ### This section will configure WPA-PSK or WPA2-PSK + if [ "${HAS_WPA}" != "0" ]; then + PSK="" + PSK_LENGTH=${#PSK} + while [ ${PSK_LENGTH} -le 7 ]; do + eval "${DIALOG} --insecure --inputbox 'Please insert WPA PSK\n(8 characters)' \ + ${INFO_HEIGHT} ${INFO_WIDTH}" 2> ${TMPFILE} + if [ $? -eq 1 ]; then + eval "${DIALOG} --msgbox 'Network configuration aborted!!!' \ + ${INFO_HEIGHT} ${INFO_WIDTH}" + return 1 + fi + PSK=$(cat ${TMPFILE}) + PSK_LENGTH=${#PSK} + done + + + NET_NUM=$(wpa_cli -i ${DEVNAME} add_network | tail -1) + + wpa_cli -i ${DEVNAME} set_network ${NET_NUM} ssid "\"${W_ESSID}\"" + wpa_cli -i ${DEVNAME} set_network ${NET_NUM} psk \"${PSK}\" + ## remove the password from tmpfile + echo "" > ${TMPFILE} + eval "${DIALOG} --defaultno --yesno \ + 'Network \"${W_ESSID}\" added\nSave configuration file?' \ + ${INFO_HEIGHT} ${INFO_WIDTH} " 2> ${TMPFILE} + if [ $? -eq 0 ]; then + ## Save the config file + wifi_save_file ${DEVNAME} + fi + + eval "${DIALOG} --msgbox 'Network added successfully' ${INFO_HEIGHT} ${INFO_WIDTH}" + return 0 + fi + + HAS_ESS=$(echo "${W_FLAGS}" | grep -E -c "ESS" ) + + log "wifi_authenticate" "HAS_ESS: \"${HAS_ESS}\"" + + if [ "${HAS_ESS}" != "0" ]; then + NET_NUM=$(wpa_cli -i ${DEVNAME} add_network | tail -1) + + log "wifi_authenticate" "NET_NUM: ${NET_NUM}" + wpa_cli -i ${DEVNAME} set_network ${NET_NUM} ssid "\"${W_ESSID}\"" + wpa_cli -i ${DEVNAME} set_network ${NET_NUM} key_mgmt NONE + eval "${DIALOG} --defaultno --yesno \ + 'Network \"${W_ESSID}\" added\nSave configuration file?' \ + ${INFO_HEIGHT} ${INFO_WIDTH} " 2> ${TMPFILE} + if [ $? -eq 0 ]; then + ## Save the config file + wifi_save_file ${DEVNAME} + fi + + return 0 + else + eval " ${DIALOG} --msgbox 'Error occurred!!!!' ${INFO_HEIGHT} ${INFO_WIDTH}" + return 0 + fi + + ## No available authentication methods.... + + eval "${DIALOG} --msgbox 'No supported authentication method for ${W_ESSID}'" + return 1 +} + + + + +## +## Configure a new connection from a list of available wi-fi networks +## + +##function +wifi_add(){ + +##local +DEVNAME=$1 + + wpa_cli -i ${DEVNAME} scan + eval "${DIALOG} --timeout 4 --msgbox 'Scanning for networks...' \ + ${INFO_HEIGHT} ${INFO_WIDTH}" + wpa_cli -i ${DEVNAME} scan_results | grep -E "^[0-9a-f][0-9a-f]:" | \ + sed -r -e 's/\t/|/g' |\ + sort -t "|" -r -n -k 3 > ${TMPFILE} + + wifinets="" + LAST_IFS=$IFS + IFS="|" + while read W_MAC W_FREQ W_STRNGT W_FLAGS W_ESSID; do + + log "wifi_add" "W_ESSID: \"${W_ESSID}\"" + wifinets="${wifinets} ${W_MAC} \"${W_ESSID} -- ${W_FLAGS}\"" + done < ${TMPFILE} + IFS=${LAST_IFS} + + + log "wifi_add" "Wifi nets: \n${wifinets}\n===" + eval "dialog --menu 'Select a network' ${WINDOW_HEIGHT} ${WINDOW_WIDTH} 10 \ + ${wifinets} " 2> ${TMPFILE} + if [ $? -eq 1 ]; then + return + fi + + W_MAC=$(cat ${TMPFILE}) + + + wifi_authenticate ${DEVNAME} ${W_MAC} + if [ $? != "0" ]; then + eval "${DIALOG} --msgbox 'Error while configuring ${DEVNAME}' " + fi + return $? +} + + +##function +wifi_save_file(){ + +##local +DEVNAME=$1 + + wpa_cli -i ${DEVNAME} save_config | tail -1 > ${TMPFILE} + SAVE_STATUS=$(cat ${TMPFILE}) + if [ "${SAVE_STATUS}" = "OK" ]; then + eval "${DIALOG} --msgbox 'Current configuration dumped to file ${WPA_FILE}' \ + ${INFO_HEIGHT} ${INFO_WIDTH}" + else + eval "${DIALOG} --msgbox 'Error while saving configuration to file ${WPA_FILE}' \ + ${INFO_HEIGHT} ${INFO_WIDTH}" + fi +} + +##function +wifi_remove(){ + +##local + DEVNAME=$1 + + wifi_network_list ${DEVNAME} + + eval "${DIALOG} --menu 'Select network to remove' \ + ${WINDOW_HEIGHT} ${WINDOW_WIDTH} 10 ${NETLIST}" \ + 2> ${TMPFILE} + + if [ $? -eq 0 ]; then + ## a network has been selected + NETNUM=$(cat ${TMPFILE}) + WPA_STATUS=$(wpa_cli -i ${DEVNAME} remove_network ${NETNUM} | tail -1 ) + if [ "${WPA_STATUS}" = "OK" ]; then + eval "${DIALOG} --defaultno --yesno \ + 'Network ${NETNUM} removed\nSave configuration file?' \ + ${INFO_HEIGHT} ${INFO_WIDTH}" 2> ${TMPFILE} + if [ $? -eq 0 ]; then + ## Save the config file + wifi_save_file ${DEVNAME} + fi + + return + else + eval "${DIALOG} --msgbox 'Network ${NETNUM} NOT removed' \ + ${INFO_HEIGHT} ${INFO_WIDTH}" + return + fi + else + eval "${DIALOG} --msgbox 'No network removed!!!' \ + ${INFO_HEIGHT} ${INFO_WIDTH}" + return + fi + +} + + +##function +wifi_restart_wpa(){ + +##local + DEVNAME=$1 +##local + WPA_FILE=$2 + + WPA_PID=$(ps ax | grep wpa_supplicant | grep " -i ${DEVNAME}" | +sed -r -e 's/^\ +//g' | cut -d " " -f 1) + + log "wifi_restart_wpa" "WPA_PID: ${WPA_PID}" + kill -9 ${WPA_PID} + + wpa_supplicant -B -i ${DEVNAME} -c ${WPA_FILE} -P${WPA_PIDFILE} 2>&1 >/dev/null + WPA_PID=$(ps ax | grep wpa_supplicant | grep " -i ${DEVNAME}" | \ + sed -r -e 's/^\ +//g' | cut -d " " -f 1 ) + WPA_PID_SAVED=$(cat ${WPA_PIDFILE}) + log "wifi_restart_wpa" "WPA_PID: ${WPA_PID} WPA_PID_SAVED: ${WPA_PID_SAVED}" + if [ -n "${WPA_PID}" ] && [ "${WPA_PID}" != "${WPA_PID_SAVED}" ]; then + eval "${DIALOG} --msgbox 'Error restarting wpa_supplicant' \ + ${INFO_HEIGHT} ${INFO_WIDTH}" + else + eval "${DIALOG} --msgbox 'wpa_supplicant restarted successfully' \ + ${INFO_HEIGHT} ${INFO_WIDTH}" + fi + +} + + + +## +## wifi_enable: show the list of configured networks, and enable the +## one the used has clicked on +## + +##function +wifi_enable(){ + +##local + DEVNAME=$1 + + wifi_network_list ${DEVNAME} + + eval "${DIALOG} --menu 'Select configured network' \ + ${WINDOW_HEIGHT} ${WINDOW_WIDTH} 10 ${NETLIST}" \ + 2> ${TMPFILE} + + if [ $? -eq 0 ]; then + ## a network has been selected + NETNUM=$(cat ${TMPFILE}) + WPA_STATUS=$(wpa_cli -i ${DEVNAME} enable ${NETNUM} | tail -1 ) + if [ "${WPA_STATUS}" = "OK" ]; then + eval "${DIALOG} --msgbox 'Network ${NETNUM} enabled' \ + ${INFO_HEIGHT} ${INFO_WIDTH}" + #config_ethernet ${DEVNAME} + return + else + eval "${DIALOG} --msgbox 'Network ${NETNUM} NOT enabled' \ + ${INFO_HEIGHT} ${INFO_WIDTH}" + return + fi + else + eval "${DIALOG} --msgbox 'No network enabled!!!' \ + ${INFO_HEIGHT} ${INFO_WIDTH}" + return + fi +} + + +##function +wifi_disable(){ + +##local + DEVNAME=$1 + wifi_network_list ${DEVNAME} + eval "${DIALOG} --menu 'Select configured network' \ + ${WINDOW_HEIGHT} ${WINDOW_WIDTH} 10 ${NETLIST}" \ + 2> ${TMPFILE} + + if [ $? -eq 0 ]; then + ## a network has been selected + NETNUM=$(cat ${TMPFILE}) + WPA_STATUS=$(wpa_cli -i ${DEVNAME} disable ${NETNUM} | tail -1 ) + if [ "${WPA_STATUS}" = "OK" ]; then + eval "${DIALOG} --msgbox 'Network ${NETNUM} disabled' \ + ${INFO_HEIGHT} ${INFO_WIDTH}" + return + else + eval "${DIALOG} --msgbox 'Network ${NETNUM} NOT disabled' \ + ${INFO_HEIGHT} ${INFO_WIDTH}" + return + fi + else + eval "${DIALOG} --msgbox 'No network disabled!!!' \ + ${INFO_HEIGHT} ${INFO_WIDTH}" + return + fi +} + + + + + +##function +wifi_load_file(){ + +##local + DEVNAME=$1 + + MSG="You are running setnet through sudo or sup!!!\nLoad file is + disabled!" check_sudo "${MSG}" + + if [ $? -eq 1 ]; then + return + fi + + + eval "${DIALOG} --fselect ${WPA_FILE} ${WINDOW_HEIGHT} ${WINDOW_WIDTH}" \ + 2>${TMPFILE} + + if [ $? -eq 0 ]; then + SEL_FILE=$(cat ${TMPFILE}) + while [ -d "${SEL_FILE}" ]; do + eval "${DIALOG} --fselect ${SEL_FILE} ${WINDOW_HEIGHT} ${WINDOW_WIDTH}" \ + 2>${TMPFILE} + if [ $? -eq 0 ]; then + SEL_FILE=$(cat ${TMPFILE}) + else + eval "${DIALOG} --msgbox 'WPA_FILE was not modified' \ + ${INFO_HEIGHT} ${INFO_WIDTH}" + return + fi + done + + if [ -f "${SEL_FILE}" ]; then + WPA_FILE=${SEL_FILE} + eval "${DIALOG} --defaultno --yesno \ + 'WPA_FILE changed to ${WPA_FILE}\nRestart wpa_supplicant?' \ + ${INFO_HEIGHT} ${INFO_WIDTH}" + if [ $? -eq 0 ]; then + wifi_restart_wpa ${DEVNAME} ${WPA_FILE} + fi + else + eval "${DIALOG} --msgbox 'Invalid file name!\n WPA_FILE *not* changed' \ + ${WINDOW_HEIGHT} ${WINDOW_WIDTH}" + return + fi + else + eval "${DIALOG} --msgbox 'WPA_FILE was not modified' \ + ${INFO_HEIGHT} ${INFO_WIDTH}" + fi + +} + + + +##function +config_wifi(){ + +##local + DEVNAME=$1 + + while true; do + eval "${DIALOG} --cancel-label 'Up' \ + --menu 'Configuring ${DEVNAME}\n(Current file: ${WPA_FILE})' \ + ${WINDOW_HEIGHT} ${WINDOW_WIDTH} 12 \ + 'Restart' 'Restart wpa_supplicant' \ + 'Enable' 'Enable a configured network' \ + 'Disable' 'Disable a configured network' \ + 'Add' 'Configure a new network' \ + 'Remove' 'Delete an existing network' \ + 'Show' 'Show current configuration file' \ + 'Edit' 'Edit current configuration file' \ + 'Save' 'Save configuration to file'\ + 'Load' 'Load configuration from file'\ + 'New' 'Create new configuration file' " \ + 2>${TMPFILE} + + if [ $? = "1" ]; then + return + fi + ACTION=$(cat ${TMPFILE}) + case ${ACTION} in + "Restart") + ## Restart wpa_supplicant + wifi_restart_wpa ${DEVNAME} ${WPA_FILE} + ;; + "Enable") + wifi_enable ${DEVNAME} + ;; + "Disable") + wifi_disable ${DEVNAME} + ;; + "Add") + wifi_add ${DEVNAME} + ;; + "Remove") + wifi_remove ${DEVNAME} + ;; + "Show") + eval "${DIALOG} --title 'Current file: ${WPA_FILE}' \ + --textbox ${WPA_FILE} ${WINDOW_HEIGHT} ${WINDOW_WIDTH}" + ;; + "Edit") + edit_file ${WPA_FILE} + ;; + "Save") + wifi_save_file ${DEVNAME} + ;; + "Load") + wifi_load_file ${DEVNAME} + ;; + "New") + unimplemented "New" + ;; + esac + done + +} + + + +## +## (Re)-Configure +## + +##function +configure_wifi(){ + +##local + DEVNAME=$1 + + ## Automatically Check if the network device is a wifi -- this + ## should be robust... + ! iw ${DEVNAME} info 2>&1 >/dev/null + IS_WIFI=$? + log "configure_device" "Device ${DEVNAME} -- IS_WIFI: ${IS_WIFI} (automatic)" + if [ "${IS_WIFI}" = "0" ] && \ + [ -n "${WIFI_DEVICES}" ]; then + ## WIFI_DEVICES is set, hence we check whether the current + ## device is in the list + IS_WIFI=$(echo " ${WIFI_DEVICES} " | grep -E -c "(\ ${DEVNAME}\ )") + log "configure_device" "Device ${DEVNAME} -- IS_WIFI: ${IS_WIFI} (config file)" + fi + + + case ${IS_WIFI} in + 1) + config_wifi ${DEVNAME} + ;; + *) + ## Show a message here + eval "${DIALOG} --msgbox '${DEVNAME} is not a WiFi device... ' \ + ${INFO_HEIGHT} ${INFO_WIDTH}" + ;; + esac + +} + + +##function +set_device_up(){ + +##local +DEVNAME=$1 + + ip link set ${DEVNAME} up + +} + +##function +set_device_down(){ + +##local +DEVNAME=$1 + + ip link set ${DEVNAME} down + +} + +##function +show_device_menu(){ + +##local + DEVNAME=$1 + + while true; do + DEV_STATUS=$(ip -o link | cut -d " " -f 2,9 | grep -E "^${DEVNAME}: " | cut -d " " -f 2) + log "show_device_menu" "DEVNAME: ${DEVNAME} DEV_STATUS: ${DEV_STATUS}" + eval "${DIALOG} --cancel-label 'Up' --menu\ + 'Device: ${DEVNAME}\nStatus: ${DEV_STATUS}' \ + ${WINDOW_HEIGHT} ${WINDOW_WIDTH} 8 \ + 'View' 'View current configuration' \ + 'Conf' 'Configure IP Address' \ + 'WiFi' 'Manage WiFi networking' \ + 'Start' 'Bring interface up' \ + 'Stop' 'Put interface down' \ + 'Restart' 'Restart interface'" 2> ${TMPFILE} + + if [ $? -eq 1 ]; then + return + fi + + DEV_ACTION=$(cat ${TMPFILE}) + case ${DEV_ACTION} in + "View") + show_device_conf ${DEVNAME} + ;; + "Conf") + configure_ip_address ${DEVNAME} + ;; + "WiFi") + configure_wifi ${DEVNAME} + ;; + "Start") + set_device_up ${DEVNAME} + ;; + "Stop") + set_device_down ${DEVNAME} + ;; + "Restart") + set_device_down ${DEVNAME} + set_device_up ${DEVNAME} + ;; + *) + ;; + + esac + done +} + +## +## Show all the available network devices +## + +##function +show_devs() { + + DEVICES=$(ip link show | awk 'NR % 2 == 1' | cut -d ":" -f 2) + + DEVICE_TAGS="" + + for i in $DEVICES; do + if [ "$i" != "lo" ]; then + DEVICE_TAGS="${DEVICE_TAGS} $i $i" + fi + done + + eval "${DIALOG} --cancel-label 'Up' \ + --menu 'Select Interface to configure' ${WINDOW_HEIGHT} ${WINDOW_WIDTH} 4 \ + ${DEVICE_TAGS}" 2> ${TMPFILE} + return $? +} + + +##function +dev_config_menu(){ + + while true; do + show_devs + if [ $? -eq 1 ]; then + return + fi + DEVNAME=$(cat ${TMPFILE}) + show_device_menu ${DEVNAME} + done +} + +##function +show_info(){ + + cat < ${TMPFILE} + + -+- setnet.sh ${VERSION} -+- + +setnet.sh is a simple state-less tool to manage and configure network +interfaces. It is a shell wrapper around the functionalities of +standard command-line tools, including "ip", "dhclient", "wpa_cli", +etc., and can be used to configure network connections via +Ethernet/Wi-Fi interfaces. + +Both Static and DHCP-based IP configuration are supported. + +At the moment, only WPA-PSK and open (no key) Wi-Fi connections are +available. + +For more information, please visit the webpage of the project: + + http://kalos.mine.nu/setnet/ + +Please report bugs at: + + https://git.devuan.org/KatolaZ/setnet + +EOF + eval "${DIALOG} --cr-wrap --textbox ${TMPFILE} ${WINDOW_HEIGHT} ${WINDOW_WIDTH}" + return +} + +##function +show_copyright(){ + + cat < ${TMPFILE} + + -+- setnet.sh ${VERSION} -+- + +-------------------------------------------------------------------- + + Copyleft (C) Vincenzo "KatolaZ" Nicosia + 2016, 2017 + +-------------------------------------------------------------------- + + +EOF + eval "${DIALOG} --cr-wrap --textbox ${TMPFILE} ${WINDOW_HEIGHT} ${WINDOW_WIDTH}" + return +} + + +##function +show_license(){ + + cat < ${TMPFILE} + + -+- setnet.sh ${VERSION} -+- + +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 . + +-------------------------------------------------------------------- + + Copyleft (C) Vincenzo "KatolaZ" Nicosia + 2016, 2017 + +-------------------------------------------------------------------- + +EOF + eval "${DIALOG} --cr-wrap --textbox ${TMPFILE} ${WINDOW_HEIGHT} ${WINDOW_WIDTH}" + return +} + + + +##function +about_menu(){ + + while true; do + eval "${DIALOG} --cancel-label 'Up' --menu 'setnet ${VERSION} -- About' \ + ${WINDOW_HEIGHT} ${WINDOW_WIDTH} 6 \ + 'Info' 'General information' \ + 'Copyleft' 'Copyleft information' \ + 'License' 'How to distribute this program' " \ + 2> ${TMPFILE} + if [ $? -eq 1 ];then + return; + fi + + ACTION=$(cat ${TMPFILE}) + case ${ACTION} in + "Info") + show_info + ;; + "Copyleft") + show_copyright + ;; + "License") + show_license + ;; + esac + done +} + +##function +notfound(){ + + CMDNAME=$1 + + + eval "${DIALOG} --msgbox 'Sorry! Commmand ${CMDNAME} not found!'" \ + ${INFO_HEIGHT} ${INFO_WIDTH} + +} + + +##function +netdiag_DNS(){ + + DUMPFILE=$1 + + if [ -n "${DUMPFILE}" ]; then + ## Dump to file + printf "\n=====\n== DNS Configuration (/etc/resolv.conf)\n=====\n\n" >> ${DUMPFILE} + cat /etc/resolv.conf >> ${DUMPFILE} + echo "==================================" >> ${DUMPFILE} + return 0 + fi + + ## Dump to dialog + NAMESERVERS=$(grep '^nameserver' /etc/resolv.conf) + MSG_STR="Configured name servers in /etc/resolv.conf ==\n\n${NAMESERVERS}" + + eval "${DIALOG} --title 'DNS servers' --msgbox '${MSG_STR}' "\ + ${WINDOW_HEIGHT} ${WINDOW_WIDTH} + +} + +##function +netdiag_resolver(){ + + DUMPFILE=$1 + + if [ -n "${DUMPFILE}" ]; then + ## Dump to file + printf "\n=====\n== Resolver Configuration (/etc/nsswitch.conf)\n=====\n\n" >> ${DUMPFILE} + grep -v '^#' /etc/nsswitch.conf >> ${DUMPFILE} + echo "==================================" >> ${DUMPFILE} + return 0 + fi + + ## Dump to dialog + RESOLVER=$(grep -v '^#' /etc/nsswitch.conf) + + eval "${DIALOG} --title 'Resolver configuration (/etc/nsswitch.conf)' \ + --msgbox '${RESOLVER}' "\ + ${WINDOW_HEIGHT} ${WINDOW_WIDTH} + +} + + +##function +netdiag_routes(){ + + DUMPFILE=$1 + + HAS_NETSTAT=$(echo ${HAS_OPTS} | grep -c " netstat ") + if [ ${HAS_NETSTAT} -ne 1 ]; then + notfound "netstat" + return + fi + + if [ -n "${DUMPFILE}" ]; then + ## Dump to file + printf "\n=====\n== Routing table\n=====\n\n" >> ${DUMPFILE} + netstat -rn >> ${DUMPFILE} + echo "==================================" >> ${DUMPFILE} + return 0 + fi + ## Dump to dialog + ROUTES=$(netstat -rn > ${TMPFILE} ) + + eval "${DIALOG} --no-collapse --title 'Routing table (netstat -rn) [arrows to scroll]'" \ + "--tab-correct --tab-len 4 --textbox ${TMPFILE} "\ + ${LARGE_HEIGHT} ${LARGE_WIDTH} +} + +##function +netdiag_ARP(){ + + DUMPFILE=$1 + log "netdiag_ARP" "DUMPFILE: '${DUMPFILE}'" + if [ -n "${DUMPFILE}" ]; then + ## Dump to file + printf "\n=====\n== ARP table\n=====\n\n" >> "${DUMPFILE}" + cat /proc/net/arp >> "${DUMPFILE}" + echo "==================================" >> ${DUMPFILE} + return 0 + fi + + # Dump to dialog + ARP=$(cat /proc/net/arp >${TMPFILE}) + + eval "${DIALOG} --no-collapse --title 'ARP table (/proc/net/arp) [arrows to scroll]'" \ + "--tab-correct --tab-len 4 --textbox ${TMPFILE} "\ + ${LARGE_HEIGHT} ${LARGE_WIDTH} +} + +##function +netdiag_connections(){ + + DUMPFILE=$1 + + + HAS_NETSTAT=$(echo ${HAS_OPTS} | grep -c " netstat ") + if [ ${HAS_NETSTAT} -ne 1 ]; then + notfound "netstat" + return + fi + + if [ -n "${DUMPFILE}" ]; then + ## Dump to file + printf "\n=====\n== Active Network Connections\n=====\n\n" >> ${DUMPFILE} + netstat -tnp | sed -r -e 's/$/\n/g' >> ${DUMPFILE} + echo "==================================" >> ${DUMPFILE} + return 0 + fi + + ## Dump to dialog + SERV=$(netstat -tnp | sed -r -e 's/$/\n/g' > ${TMPFILE}) + + eval "${DIALOG} --no-collapse "\ + " --title 'Active network connections (netstat -tnp) [arrows to scroll]'" \ + "--tab-correct --tab-len 4 --textbox ${TMPFILE} "\ + ${LARGE_HEIGHT} ${LARGE_WIDTH} +} + + +##function +netdiag_services(){ + + DUMPFILE=$1 + + HAS_NETSTAT=$(echo ${HAS_OPTS} | grep -c " netstat ") + if [ ${HAS_NETSTAT} -ne 1 ]; then + notfound "netstat" + return + fi + + if [ -n "${DUMPFILE}" ]; then + ## Dump to file + printf "\n=====\n== Active network services\n=====\n\n" >> ${DUMPFILE} + netstat -ltnp | sed -r -e 's/$/\n/g' >> ${DUMPFILE} + echo "==================================" >> ${DUMPFILE} + return 0 + fi + + + SERV=$(netstat -ltnp | sed -r -e 's/$/\n/g' > ${TMPFILE}) + + eval "${DIALOG} --no-collapse "\ + " --title 'Active network services (netstat -ltnp) [arrows to scroll]'" \ + "--tab-correct --tab-len 4 --textbox ${TMPFILE} "\ + ${LARGE_HEIGHT} ${LARGE_WIDTH} +} + + +##function +netdiag_ping(){ + + HAS_PING=$(echo ${HAS_OPTS} | grep -E -c "\ ping\ ") + if [ ${HAS_PING} -ne 1 ]; then + notfound "ping" + return + fi + eval "${DIALOG} --insecure --inputbox 'Host or IP to ping:' \ + ${INFO_HEIGHT} ${INFO_WIDTH}" 2> ${TMPFILE} + + if [ $? -ne 0 ]; then + eval "${DIALOG} --msgbox 'Ping Aborted' \ + ${INFO_HEIGHT} ${INFO_WIDTH}" + return + else + PINGIP=$(cat ${TMPFILE}) + ping -c 5 ${PINGIP} 2>&1 |\ + eval "${DIALOG} --title 'Ping ${PINGIP}' \ + --programbox ${LARGE_HEIGHT} ${LARGE_WIDTH}" 2>${TMPFILE} + if [ $! -ne 0 ];then + log "netdiag_ping" "ping aborted" + fi + fi + +} + +##function +netdiag_traceroute(){ + + HAS_TRACERT=$(echo ${HAS_OPTS} | grep -c " traceroute ") + if [ ${HAS_TRACERT} -ne 1 ]; then + notfound "traceroute" + return + fi + eval "${DIALOG} --insecure --inputbox 'Host or IP to trace:' \ + ${INFO_HEIGHT} ${INFO_WIDTH}" 2> ${TMPFILE} + + if [ $? -ne 0 ]; then + eval "${DIALOG} --msgbox 'Traceroute Aborted' \ + ${INFO_HEIGHT} ${INFO_WIDTH}" + return + else + TRACEIP=$(cat ${TMPFILE}) + traceroute ${TRACEIP} 2>&1 | \ + eval "${DIALOG} --title 'Traceroute ${TRACEIP}' \ + --programbox ${LARGE_HEIGHT} ${LARGE_WIDTH}" 2>${TMPFILE} + if [ $! -ne 0 ];then + log "netdiag_traceroute" "traceroute aborted" + fi + fi +} + + +##function +netdiag_lookup(){ + + HAST_HOST=$(echo ${HAS_OPTS} | grep -c " host ") + if [ $? -ne 1 ]; then + notfound "host" + return + fi + + eval "${DIALOG} --insecure --inputbox 'Hostname or IP to lookup:' \ + ${INFO_HEIGHT} ${INFO_WIDTH}" 2> ${TMPFILE} + + if [ $? -ne 0 ]; then + eval "${DIALOG} --msgbox 'DNS lookup aborted' \ + ${INFO_HEIGHT} ${INFO_WIDTH}" + return + else + QUERYIP=$(cat ${TMPFILE}) + host ${QUERYIP} 2>&1 |\ + eval "${DIALOG} --title 'host ${QUERYIP}' \ + --programbox ${LARGE_HEIGHT} ${LARGE_WIDTH}" 2>${TMPFILE} + if [ $! -ne 0 ];then + log "netdiag_ping" "host lookup aborted" + fi + + fi +} + +##function +netdiag_devices(){ + + DUMPFILE=$1 + + if [ -n "${DUMPFILE}" ]; then + printf "\n=====\n== Network Devices\n=====\n\n" >> ${DUMPFILE} + ip addr >> ${DUMPFILE} + echo "==================================" >> ${DUMPFILE} + return 0 + fi +} + + + +## +## Main menu for network diagnostics +## + +##function +netdiag_menu(){ + + while true; do + eval "${DIALOG} --cancel-label 'Up' --menu 'Network diagnostics' \ + ${WINDOW_HEIGHT} ${WINDOW_WIDTH} 10 \ + 'ARP' 'Show ARP table' \ + 'Connections' 'List active network connections' \ + 'DNS' 'List DNS servers' \ + 'Lookup' 'DNS Lookup' \ + 'Ping' 'Ping a host' \ + 'Resolver' 'Show resolver configuration' \ + 'Routes' 'Show routing table' \ + 'Services' 'List active network daemons' \ + 'Traceroute' 'Show the route to a host' " \ + 2> ${TMPFILE} + if [ $? -eq 1 ];then + return; + fi + + ACTION=$(cat ${TMPFILE}) + case ${ACTION} in + "ARP") + netdiag_ARP + ;; + "Connections") + netdiag_connections + ;; + "DNS") + netdiag_DNS + ;; + "Ping") + netdiag_ping + ;; + "Lookup") + netdiag_lookup + ;; + "Resolver") + netdiag_resolver + ;; + "Routes") + netdiag_routes + ;; + "Services") + netdiag_services + ;; + "Traceroute") + netdiag_traceroute + ;; + esac + done + + +} + +##function +dump_file(){ + + CONF=$1 + + log "dump_file" "CONF: ${CONF}" + + DUMPFILE="/tmp/network_dump.txt" + + eval "${DIALOG} --fselect ${DUMPFILE} ${WINDOW_HEIGHT} ${WINDOW_WIDTH}" \ + 2>${TMPFILE} + + if [ $? -eq 0 ]; then + SEL_FILE=$(cat ${TMPFILE}) + while [ -d "${SEL_FILE}" ]; do + eval "${DIALOG} --fselect ${SEL_FILE} ${WINDOW_HEIGHT} ${WINDOW_WIDTH}" \ + 2>${TMPFILE} + if [ $? -eq 0 ]; then + SEL_FILE=$(cat ${TMPFILE}) + else + eval "${DIALOG} --msgbox 'Dump aborted' \ + ${INFO_HEIGHT} ${INFO_WIDTH}" + return + fi + done + + ## The dump starts here.... + DUMPFILE=${SEL_FILE} + truncate -s 0 ${DUMPFILE} + echo "===== setnet ${VERSION}" >> ${DUMPFILE} + echo "===== Date: $(date)" >> ${DUMPFILE} + echo "===== Network configuration dump: ${CONF} " >> ${DUMPFILE} + for c in ${CONF}; do + eval "netdiag_${c} \"${DUMPFILE}\"" + done + else + eval "${DIALOG} --msgbox 'Dump aborted' \ + ${INFO_HEIGHT} ${INFO_WIDTH}" + return + fi + eval "${DIALOG} --msgbox 'Status dumped to ${DUMPFILE}' \ + ${INFO_HEIGHT} ${INFO_WIDTH}" +} + + +##function +dump_pastebin(){ + + unimplemented "pastebin" +} + +##function +dump_menu(){ + + eval "${DIALOG} --checklist 'Select conf to dump' \ + ${WINDOW_HEIGHT} ${WINDOW_WIDTH} 10 \ + 'ARP' 'ARP table' on \ + 'devices' 'Device configuration' on \ + 'DNS' 'DNS configuration' on \ + 'resolver' 'System resolver configuration' on \ + 'routes' 'Routing table' on \ + 'connections' 'Active network connections' on \ + 'services' 'Active network services' on " 2> ${TMPFILE} + if [ $? -ne 0 ]; then + return + fi + + DUMP_CONF=$(cat ${TMPFILE}) + + eval "${DIALOG} --cancel-label 'Up' \ + --menu 'Dump configuration to:' \ + ${INFO_HEIGHT} ${INFO_WIDTH} 6 \ + 'File' 'Dump to file' \ + 'Pastebin' 'Dump to pastebin'" \ + 2> ${TMPFILE} + if [ $? -eq 1 ];then + return; + fi + + ACTION=$(cat ${TMPFILE}) + case ${ACTION} in + "File") + dump_file "${DUMP_CONF}" + ;; + "Pastebin") + dump_pastebin "${DUMP_CONF}" + ;; + esac +} + + +##function +show_toplevel(){ + + log "show_toplevel" "TMPFILE: ${TMPFILE}" + eval "${DIALOG} --cancel-label 'Quit' --menu 'Main Menu' \ + ${WINDOW_HEIGHT} ${WINDOW_WIDTH} 6 \ + 'Setup' 'Setup interfaces' \ + 'Info' 'Network diagnostics' \ + 'Dump' 'Dump current network status' \ + 'Log' 'View setnet log' \ + 'About' 'License & Copyleft'" 2> ${TMPFILE} + + return $? +} + +##function +show_help(){ + +##local +SCRIPTNAME=$1 + echo "Usage: ${SCRIPTNAME} [OPTION]" + echo "Options:" + printf "\t -c cfg_file\tLoad configuration from cfg_file.\n" + printf "\t -v\t\tPrint version number and exit.\n" + printf "\t -h\t\tShow this help.\n" + +} + +##function +show_version(){ + +##local +SCRIPTNAME=$1 + echo "${SCRIPTNAME} -- version ${VERSION}" + echo "Copyleft (C) Vincenzo \"KatolaZ\" Nicosia (katolaz@freaknet.org) -- 2016, 2017" + echo "This is free software. You can use and redistribute it under the " + echo "terms of the GNU General Public Licence version 3 or (at your option)" + echo "any later version." + echo + echo "YOU USE THIS SOFTWARE AT YOUR OWN RISK." + echo "There is ABSOLUTELY NO WARRANTY; not even for MERCHANTABILITY or" + echo "FITNESS FOR A PARTICULAR PURPOSE." +} + +##function +show_disclaimer(){ + + cat < ${TMPFILE} + + -+- setnet.sh ${VERSION} -+- + + Copyleft (C) KatolaZ (katolaz@freaknet.org) + 2016, 2017 + + -+- This is a beta release of setnet.sh -+- + + THIS IS FREE SOFTWARE + YOU CAN USE AND DISTRIBUTE IT UNDER THE + TERMS OF THE GNU GENERAL PUBLIC LICENSE + + USE THIS SOFTWARE AT YOUR OWN RISK + + There is ABSOLUTELY NO WARRANTY; not even for + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE + + See "About" for more information about + your right and distribution terms +EOF + + eval "${DIALOG} --cr-wrap --textbox ${TMPFILE} 23 60" + return +} + +##function +initialise(){ + + + TMPFILE=$( (tempfile) 2>/dev/null) || TMPFILE=/tmp/setnet_$$ + WPA_PIDFILE=$( (tempfile) 2>/dev/null) || WPA_PIDFILE=/tmp/setnet_wpapid_$$ + + trap cleanup 0 HUP INT TRAP TERM QUIT + + if [ -z ${TRUNCATE_LOG} ] || \ + [ ${TRUNCATE_LOG} = "yes" ] || \ + [ ${TRUNCATE_LOG} = "YES" ]; then + truncate -s 0 ${LOGFILE} + fi + + log "setnet" "Starting afresh on $(date)" + + + EUID=$(id -ru) + if [ "${EUID}" = "0" ] && + [ -n "${SUDO_UID}" ] && + [ "${EUID}" != "${SUDO_UID}" ]; then + USING_SUDO="1" + elif [ "${EUID}" = "0" ] && + [ -n "${SUP_UID}" ] && + [ "${EUID}" != "${SUP_UID}" ]; then + USING_SUDO="1" + else + USING_SUDO="0" + fi + + log "initialise" "EUID: ${EUID}" + log "initialise" "SUDO_UID: ${SUDO_UID}" + log "initialise" "SUP_UID: ${SUP_UID}" + log "initialise" "USING_SUDO: ${USING_SUDO}" +} + + +##function +log_show(){ + + eval "${DIALOG} --cr-wrap --title 'setnet log file (${LOGFILE})'\ + --textbox ${LOGFILE} \ + ${WINDOW_HEIGHT} ${WINDOW_WIDTH}" + +} + +##function +main(){ + + + show_disclaimer + + SETNETRC=$(realpath ${SETNETRC}) + log "main" "Using config file \"${SETNETRC}\"" + WPA_FILE=$(realpath ${WPA_FILE}) + log "main" "Using WPA config file \"${WPA_FILE}\"" + LOFGILE=$(realpath ${LOGFILE}) + log "main" "Using log file \"${LOGFILE}\"" + + while true; do + show_toplevel + + if [ $? -eq 1 ]; then + cleanup + exit 1 + fi + log "main" "${TMPFILE}" + ACTION=$(cat ${TMPFILE}) + log "main" "ACTION: ${ACTION}" + case ${ACTION} in + "Setup") + dev_config_menu + ;; + "Info") + netdiag_menu + ;; + "Dump") + dump_menu + ;; + "Log") + log_show + ;; + "About") + about_menu + ;; + esac + done + +} + + +## +## The script starts here +## + + +## +## Get command-line arguments +## + +SETNETRC="" + +while getopts ":c:hv" opt; do + + case $opt in + c) + #echo "Got option -c ${OPTARG}" + SETNETRC=$(realpath ${OPTARG}) + #echo "SETNETRC: ${SETNETRC}" + ;; + h) + show_help $(basename $0) + exit 1 + ;; + v) + show_version $(basename $0) + exit 1 + ;; + \?) + echo "Invalid option: -${OPTARG}" + exit 1 + ;; + :) + echo "Option -${OPTARG} requires an argument" + exit 1 + ;; + esac +done + + +## +## Load the configuration file +## + +load_setnetrc ${SETNETRC} + +## +## Init stuff +## + +initialise + + +## +## Check dependencies. If we are missing someting essential, then exit. +## + +check_deps + +## +## This is the main loop +## + +main + diff --git a/debian_package/setnet-0.2.1/debian/setnet/usr/share/doc/setnet/ChangeLog b/debian_package/setnet-0.2.1/debian/setnet/usr/share/doc/setnet/ChangeLog new file mode 100644 index 0000000..016aab7 --- /dev/null +++ b/debian_package/setnet-0.2.1/debian/setnet/usr/share/doc/setnet/ChangeLog @@ -0,0 +1,11 @@ +2017-01-07 KatolaZ + + * setnet.sh (configure_device): Improved wifi detection + * (netdiag_ping), (netdiag_traceroute),(netdiag_query): + changed dialog to programbox + * solved viasualitation bug in ip config + * added a manpage + * Added configuration variable "WIFI_DEVICES" + * The "Setup interface" menu has been reorganised + * added "Config IP Address" and "Manage Wifi Networking" + diff --git a/debian_package/setnet-0.2.1/debian/setnet/usr/share/doc/setnet/README.Debian b/debian_package/setnet-0.2.1/debian/setnet/usr/share/doc/setnet/README.Debian new file mode 100644 index 0000000..0cad044 --- /dev/null +++ b/debian_package/setnet-0.2.1/debian/setnet/usr/share/doc/setnet/README.Debian @@ -0,0 +1,132 @@ ++--------------+ +| setnet | ++--------------+ + +Copyleft (C) Vincenzo "KatolaZ" Nicosia + 2016, 2017 + +=== DESCRIPTION === + +setnet is a shell script with a dialog UI to configure ethernet and +wifi connections. It is meant to be POSIX-compliant, and has been +tested with bash, busybox, dash, ksh, mksh, posh, and yash. It is +still to be considered beta software, so you should use it AT YOUR OWN +RISK, but it is already fully functional. + +=== LICENSE === + +setnet is Free Software, and can be used and distributed under the +terms of the GNU General Public License, either version 3 of the +licence or, at your option, any later version. + +Please see the file LICENSE for more information + +=== DEPENDENCIES === + +In order to run setset, you MUST satisfy this (relatively small) set +of dependencies: + + - a posix-compliant shell (bash, busybox, dash, ksh, mksh, posh, and + yash have been tested) + + - dialog (version 1.2 tested, but it should work with previous + versions as well) + + - dhcp-client (for dhclient, tested with isc-dhcp-client) + + - iproute2 (for ip) + + - wireless-tools (for iwconfig, currently required for interface + identification) + +Most of those tools might already be installed in your system anyway. +In particular, setnet uses: + + - dialog: to provide a minimal Text-based User Interface, + - ip: to configure network interfaces and get information about them, + - dhclient: for DHCP-based IP configuration + - iwconfig: to check whether a network device is a wifi adapter + +In order to use the full set of functionalities provided by setnet, +you MIGHT also need the following packages: + + - wpa_supplicant (for wifi configuration) + + - net-tools (for netstat, to gather information about network status) + + - iputils-ping (for ping) + + - bind9-nost (for host, used to check DNS configuration) + + - traceroute (to trace the route between your host and any other host + in the Internet) + +Again, most of them should be already installed in your system anyway. + +=== USAGE === + +setnet is installed under /usr/sbin/setnet.sh. If invoked with "-h", +it provides a list of supported options: + +$ ./setnet.sh -h +Usage: setnet.sh [OPTION] +Options: + -c cfg_file Load configuration from cfg_file. + -v Print version number and exit. + -h Show this help. +$ + +If the argument "-c" is specified, setnet will use the provided +configuration file. Otherwise, it will look for its configuration file +in one of the following locations: + + - /etc/setnetrc + - ~/.setnetrc + +in the given order. The following configuration variables should be +defined in setnetrc: + + + - WPA_FILE + This is the file configuration file used by wpa_supplicant. + + - LOGNAME + This is the file used for logging. + + - TRUNCATE_LOG + if equal to "yes", the log file will be truncated when setnet + starts + + +=== root vs. mortal users === + +Networking is an amdinistration task, and as such should be performed +by the host administrator, i.e., the user with UID 0 (normally called +"root"). However, in many modern GNU/Linux systems it is customary to +allow normal users to perform some administration tasks. There are at +least two concrete possibilities to allow a particular user (in the +following we call such user "fool") to configure network interfaces +using setnet. + + +-- 1) First approach: using sudo + +If sudo is installed in your system, it is sufficient to add the +following line: + + fool ALL=NOPASSWD: /usr/sbin/setnet.sh + +to the file /etc/sudoers, and the user "fool" will be able to run +setnet.sh with effective UID 0 (i.e., as if it was root), by using the +command: + +[fool@host]$ sudo /usr/sbin/setnet.sh + +and thus will be able to perform all the needed admin tasks to +configure networking. + +-- 2) Second approach: using sup + +......TO BE DOCUMENTED...... + + diff --git a/debian_package/setnet-0.2.1/debian/setnet/usr/share/doc/setnet/changelog.Debian.gz b/debian_package/setnet-0.2.1/debian/setnet/usr/share/doc/setnet/changelog.Debian.gz new file mode 100644 index 0000000000000000000000000000000000000000..eac52e792570a70bf57c34457514305a2cce4cdc GIT binary patch literal 495 zcmV7`N1Ub{5gO0=ICq{E z-qu^s!~3EmRf~+N>&kb)jS3T_XZWZr=IQJV^B2qc>*ZpBlT^OJz(0xpx8$RvV_aDd ztPDCbq=Q>L?YF^=)o3fJnFsNU7!v06p<3BEeRz9Nm>X+m&lR88Q3R0=$uw%ZH4??UtRLGRCCdhif$=v+}dV8#+X|`6L$DV5~sPEg>bpguC!xiPV z-?p?;ou0tELK+i8t_?B-WrWn!lGRc*lRwB5D9I;CL_l&kK72oG z$o3ds*}@GUE8!f{@U`n|1gVj2DIIafKZ{=UO*@Po)AIAku_Wvo6`zkWg@O$|%gY`O zG4hpLd+aA|Tp6#A|0*!_{va<~S-v~YNs6`wmwmVMx5|?FlWo{?BRlc!^8DiZa(Y3T l3~{gMf4BAr$%xX$)7H*jEl=mm)0g|L{SDmqN6cyi003J{{N?}v literal 0 HcmV?d00001 diff --git a/debian_package/setnet-0.2.1/debian/setnet/usr/share/doc/setnet/changelog.gz b/debian_package/setnet-0.2.1/debian/setnet/usr/share/doc/setnet/changelog.gz new file mode 100644 index 0000000000000000000000000000000000000000..b6abb178cc96416022a0bc98f562b1306579ea6d GIT binary patch literal 304 zcmV-00nh#)iwFP!0000214WQQOT$1Ah0o2e7;aTaRp?cf>cyHdDxmhe%^Tl$$SOGkvGYuX9Zcp*`b6+vxNt3%aEbo$JGPwdv zZUDB1X=!w&q-Qz`>QzbE8uGSd)02R+suT!vR61pJbWVd$D3r%eX_?Lb|BkUFHr`P- z`-7jJ_&Zw%=cKGr%P=$W#z=4mLWpE+3-dL0GR=_LE3_UP<#5P^!b?yZR0m_xC`BQH z5}`%ip`^$jBD-uentNo0MMIG8^QZjyxc$gC+g%# + +Files: debian/* +Copyright: 2016 Vincenzo (KatolaZ) Nicosia +License: GPL-3+ + This package 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 package 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 + . + diff --git a/debian_package/setnet-0.2.1/debian/setnet/usr/share/man/man8/setnet.8.gz b/debian_package/setnet-0.2.1/debian/setnet/usr/share/man/man8/setnet.8.gz new file mode 100644 index 0000000000000000000000000000000000000000..b0713bff749a786ae78921628d3eacc763366a23 GIT binary patch literal 2824 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 literal 0 HcmV?d00001 diff --git a/debian_package/setnet-0.2.1/debian/source/format b/debian_package/setnet-0.2.1/debian/source/format new file mode 100644 index 0000000..163aaf8 --- /dev/null +++ b/debian_package/setnet-0.2.1/debian/source/format @@ -0,0 +1 @@ +3.0 (quilt) diff --git a/debian_package/setnet-0.2.1/debian/watch.ex b/debian_package/setnet-0.2.1/debian/watch.ex new file mode 100644 index 0000000..0f01132 --- /dev/null +++ b/debian_package/setnet-0.2.1/debian/watch.ex @@ -0,0 +1,39 @@ +# Example watch control file for uscan +# Rename this file to "watch" and then you can run the "uscan" command +# to check for upstream updates and more. +# See uscan(1) for format + +# Compulsory line, this is a version 4 file +version=4 + +# PGP signature mangle, so foo.tar.gz has foo.tar.gz.sig +#opts="pgpsigurlmangle=s%$%.sig%" + +# HTTP site (basic) +#http://example.com/downloads.html \ +# files/setnet-([\d\.]+)\.tar\.gz debian uupdate + +# Uncommment to examine a FTP server +#ftp://ftp.example.com/pub/setnet-(.*)\.tar\.gz debian uupdate + +# SourceForge hosted projects +# http://sf.net/setnet/ setnet-(.*)\.tar\.gz debian uupdate + +# GitHub hosted projects +#opts="filenamemangle=s%(?:.*?)?v?(\d[\d.]*)\.tar\.gz%-$1.tar.gz%" \ +# https://github.com//setnet/tags \ +# (?:.*?/)?v?(\d[\d.]*)\.tar\.gz debian uupdate + +# PyPI +# https://pypi.python.org/packages/source//setnet/ \ +# setnet-(.+)\.tar\.gz debian uupdate + +# Direct Git +# opts="mode=git" http://git.example.com/setnet.git \ +# refs/tags/v([\d\.]+) debian uupdate + + + + +# Uncomment to find new files on GooglePages +# http://example.googlepages.com/foo.html setnet-(.*)\.tar\.gz diff --git a/debian_package/setnet-0.2.1/setnet.8.gz b/debian_package/setnet-0.2.1/setnet.8.gz new file mode 100644 index 0000000000000000000000000000000000000000..7f8eb077229435bbae01334e7a69d6ac17c2bc1c GIT binary patch literal 2835 zcmV+u3+(hCiwFpnWpP*l19N3`Ze?^XH~^hlZEqvD5&q6!G0=xX4&+smqDc@Of-1J` zQ)5etSH9~N1rF4Tk_fMsTXI)Al#4`kzoNg%td#ah-~KS5@4x--M=TZ; zj~CPNf_|d-`B_9WM^8E{zlbQ_(scAZ7SVJ^P8FFdBDck-743AUcQVzkAh%Ue;}Wa$ z!fVC0gRyUvm~5>#rIm#?869-7rInVc*^tf(W!ExMUPb(AI-AFn_*~5_r-zgh8re$J z=e15%z20otdm;DZ`0iygUrc6G5zTYa$RQ2KeBDU62hQ24tQZ6nCBZgaPo|=D%C@%B zQabn*R|&W1e|Hnnq#zap6|Ci8WuD`Vw5H5fRBV;NA)QcROzON|terW=tZ9r@3yVnN z)JJ{$pj)+WAas_b<%&bC^Zrja16pm9RKsNdfzKRr`58<29Er2*ONNPq1&vxou7K)< zPYz+y{rkK5ZMYn^WGZ2^_=J%3G@1@S;zv*eA;Dk%8nVRC41&Tv@TIJbubdmvs1UhT z&U@En>5)vXvh#!e%+Q-U-h|uFN4Iljo#6nSZ}eZrzYX#Gd;a6bL*A8nZfv1ekxz{3 zqxZJ=zTjhH_GfOjyRh3!9gpU>bNpy*;DyCge8ccTER_{2wO6Uh87db}PLO0vNKT!h zk{#*cP$fwRLhw-lMCBm?C~Y$1V2leO8BiPT96x-Bx7Y!=4XCh?0&o?|e}u6Dk~o|k zdPZX#ZnrfDa%QI>5x&@k+sY+QH|Xb+TP@B z1G`6#_;@y7kJE4m&VilOSxcpa8_fn^fz2+Dqr9p+%M_yUz1X;qo zBlUDnw??Eod+P!Jvn*j{VK;5Dd8t&^XhLok9DU%&X%^r5!ej!9Pb0l9v*4Bs2h`X9 zpw&U}4@ydFIY%nhCsBslNCE55qdStT6>uZ$wFS8HKoMaX(k!8I&QssOazR#~-+d z`UM*R(N>PhuZmfjL-s!e@s^ILmk>fx{XUZihvsGB=@Q^yYl{@~I%H^2GB#Xpz!#CH zkV@zTEPR^RxixzYZn#oSd_b!NIAdb=Yl}AYMtruafo<(WrEzaAI_qnj{NpMwnk@MF ztLZp;nTwd=)-?!=p^$ZeRF@_3#Eer_txnt8^g!@lUATHxp@rrw@72QYr*RO{1vPMt z^#Pw|^w&Y|WpamJ$b!0i1keII_mNBhQU4Ebe>T-RuYm**MOXCkTDL;2J#wvxf(iwWD# zqD4n^);T^1okP%|L(#1HoGoytvW1sjooy~VhpWUqly<(;fI=c@3^!0!iK6~PnWo3v z-%AW2Yt7ycHcnyV4ZJRzm~jV1w+a2F@lGde;A^yX4Pe|6J;JVPag@Er;dPYjcF5NY zU&8AUo-{;_E^gS|B{Wa^thS_D&+1{jY@CSv!z%Y9{i=t$@!u(bQ{*DLF5(u+4LYzD zEo@W9ZFB!c(@C~=`H!J$Y>*LI6$6w}vn=4?z|XaFgD-YFPVrvbn07qf(#bvgG{HZv zu*X-Jqtp8_E%;ds1wm8=`>@r?md={R(8gAs4SKDuO5WH<7lVP|#*r`4_9Z8R&^?k2 zB`6R9cagq8)SaXN#@n)ZrJro_chfo;Q=>0+2dfJN&J#pC?^YznP7(9Kw%6Qc@}t$8 zZ4nxCbZTW`tPAxP2CK}e;CuXw{9^%3&D58oekkDd{V<>(=}+{NZ!!Ep zJ)VA;yv(N0#=GCYQy)s)QH;+@$InM zk3TC7RI6CLyiV^%i}7dZ65!&{b8-m>uzE-3dISxsLdUx z``YfBdwiTcOg^I{nB0x40tAXU=(Z`WIz7)GJn)343qY0S@(65p{taNIiU0#~CV5ODV$oi;9f!D7!~AYyASL&z zdk3z}?L$wem(e~ULPji6zTmT4vt9?^tym=@%TthNneOaZHD0Tx+_U5`g?f8#6VcZ^ zjvoWeMO&31$)`vi7QYexg_B+3ZZ3EKdl-FnFXO<68O6j{@SX28f8r z@PG%7M%QQgwPwa&957=KIN}!u1kHYEE99GEu_{sU71~;}_ux3YUsO?^=dZtyp63jP z|Ca-CjQ{nk8duGoNP@KFBJ4*Sm8SmLs@YAn_EY?N=nA+9FgWI_)9JD!D+BK*qsJ*q z<>W37&!FQmjh^C}xc10*#)b7#c=H=j=Mkupe>a;x%wC=+(??p&n$`D{crknVmyH1ojQN2<>fz-(+D@`Hvf#>cluL>D`-O z`Qxu^tK=JtF?REds2qCt`Z8I3Vo$`A`|-<&Ux(vnhV0aT-(>oZR<8K<1$VA`0SqRg zw6=x1dSZ9zmrMar>OG*nQNCsI%>>|&NhdvC8$M~}zJ>?!vh!dwAQf#Q zE=!^Rb>+$+wp=#=0$&N4Ot(dmyPtNYO~{lWrnG6l1p@79ZJo$=MCfa2Ht+2_~E{V;x=^Y4N1E05I*eg}Vteew7uY{VZC zecY<0d$ptJ+G3S4Mu* z0^l>0<+D7zR#&tWaQjlPKve$S!w1AH_u7>FcqN^GXmgBdxCwVSm@?(+!cfW*or6OI lN_<7dwE{xe9{L6}|4pSRqoXNpHMekF{{sZN?#vq+001mnqx%2= literal 0 HcmV?d00001 diff --git a/debian_package/setnet-0.2.1/setnet.sh b/debian_package/setnet-0.2.1/setnet.sh new file mode 100755 index 0000000..1400319 --- /dev/null +++ b/debian_package/setnet-0.2.1/setnet.sh @@ -0,0 +1,1916 @@ +#!/bin/sh + +# 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 . +# +# ---------------------------------------------------------------------- +# +# setnet.sh -- view and configure network interfaces +# +# ---------------------------------------------------------------------- +# +# Copyleft (C) Vincenzo "KatolaZ" Nicosia (katolaz@freaknet.org) -- +# (2016, 2017) +# +# + + +## +## Initialisation +## + +VERSION=0.2.1 + + +TOPSTR="setnet-${VERSION} [user: $(id -run)]" +DIALOG="dialog --backtitle \"${TOPSTR}\" " + + +############################### +## ## +## Internal config variables ## +## ## +############################### + +## +## Required dependencies. If any of those commands is missing, +## the script will exit +## + +HARD_DEPS="ip dhclient dialog iw sed grep cat awk which" + +## +## Suggested dependencies. The script will issue a warning if any of +## those commands is missing +## + +SOFT_DEPS="wpa_cli wpa_supplicant" + +## +## Optional dependencies. The script will check if those dependencies +## exist, and if they do, will set a variable HAS_OPTS which contains +## the names of the commands actually found +## + +OPT_DEPS="host ping traceroute netstat pastebinit" + +################################# + +##################################### +## ## +## HEIGHT/WIDTH of various dialogs ## +## ## +##################################### + +## +## Regular windows +## + +WINDOW_WIDTH=75 +WINDOW_HEIGHT=20 + +## +## Infoboxes +## +INFO_WIDTH=40 +INFO_HEIGHT=10 + + +## +## Forms +## +FORM_WIDTH=60 +FORM_HEIGHT=12 + +## +## Large windows +## + +LARGE_WIDTH=80 +LARGE_HEIGHT=20 + + +################################# + +################################ +## ## +## Supported network families ## +## ## +################################ + +NET_FAMILIES="inet inet6" + +################################# + +## +## Load the configuration file "setnetrc" +## + +##function +load_setnetrc(){ + + WPA_FILE="" + LOGFILE="" + ## If we were given a parameter, that is the rc file to load... + ## + if [ $# -ge 1 ]; then + . "$1" + return + fi + + ## + ## Otherwise, let's look in the standard locations, namely: + ## + + ## + ## 1) /etc/setnetrc + ## + + if [ -f /etc/setnetrc ]; then + SETNETRC=/etc/setnetrc + fi + + ## + ## 2) ~/.setnetrc + ## + + if [ -f ~/.setnetrc ]; then + SETNETRC=~/.setnetrc + fi + + if [ -n "${SETNETRC}" ] && + [ -f "${SETNETRC}" ]; then + . ${SETNETRC} + fi + + if [ -z ${WPA_FILE} ]; then + echo "Could not find WPA_FILE defined anywhere. Exiting" + exit 1 + fi + + if [ -z ${LOGFILE} ]; then + echo "Could not find LOGFILE defined anywhere. Exiting" + exit 1 + fi +} + + +## +## handler called upon exit/signal (NONE HUP INT TRAP TERM QUIT) +## + +##function +cleanup(){ + rm -f ${TMPFILE} + rm -f ${WPA_PIDFILE} +} + + +################### +# # +# LOGGING # +# # +################### + +## +## log() takes two arguments, namely the label and the message +## +## +##function +log(){ + + ##local + LABEL=$1 + ##local + MSG=$2 + + echo "${LABEL}:" "${MSG}" >> "${LOGFILE}" + +} + +## +## Check whether the shell which called the script is supported, or +## exit. Currently, we support the follwing shells: +## +## - bash +## - busybox +## - dash +## - ksh +## - mksh +## - posh +## - sh +## - yash +## + +##function +check_shell(){ + + ## + ## FIXME!!! THIS TEST DOES NOT WORK yet... + ## + CUR_SH=$(ps -p $$ -o comm=) + case ${CUR_SH} in + ash|bash|busybox|dash|ksh|mksh|posh|sh|yash) + log "check_shell" "The current shell (${CUR_SH}) is supported" + return + ;; + *) + log "check_shell" "The current shell (${CUR_SH}) is not supported" + echo "The current shell (${CUR_SH}) is not supported. Exiting..." + exit 1 + ;; + esac +} + + +## +## Check dependencies +## +## - check if the current shell is supported through check_shell +## +## - each command in HARD_DEPS MUST exist, or the script exits +## +## - each command in SOFT_DEPS SHOULD exist, or the script will log a +## warning +## +## - each command in OPT_DEPS MIGHT exist, and if it does its name is +## included in the variable "HAS_OPTS" +## + +##function +check_deps(){ + + ## FIXME FIRST.... check_shell + + for h in ${HARD_DEPS}; do + _W=$(which ${h}) + if [ -z "${_W}" ]; then + echo "Error: required command \"${h}\" not found. Exiting..." + exit 1 + fi + log "check_deps" "NOTICE: required command '${h}'...found" + done + + for s in ${SOFT_DEPS}; do + _S=$(which ${s}) + if [ -z "${_S}" ]; then + log "check_deps" "WARNING: suggested command '${s}' not found! Some functions might not work properly" + fi + done + + HAS_OPTS="" + for o in ${OPT_DEPS}; do + _O=$(which ${o}) + if [ -n "${_O}" ]; then + HAS_OPTS=" ${HAS_OPTS} ${o} " + log "check_deps" "NOTICE: optional command '${o}'...found" + else + log "check_deps" "NOTICE: optional command '${o}' not found!" + fi + done + + log "check_deps" "HAS_OPTS: \"${HAS_OPTS}\"" + +} + +## +## Generic function fo unimplemented features. It just pops up a +## message-box and returns +## + +##function +unimplemented(){ + + LABEL=$1 + + eval "${DIALOG} --msgbox 'Sorry! '$LABEL' not implemented, yet!' \ + ${INFO_HEIGHT} ${INFO_WIDTH}" 2>${TMPFILE} +} + + +##function +check_sudo(){ + + LABEL="$1" + + if [ "${USING_SUDO}" = "1" ]; then + eval "${DIALOG} --msgbox '${LABEL}' ${INFO_HEIGHT} ${INFO_WIDTH} " 2>${TMPFILE} + return 1 + else + return 0 + fi + +} + + +########################################## + +##function +edit_file(){ + + ##local + FILEIN=$1 + log "edit_file" "editing file ${FILEIN}" + eval "${DIALOG} --title 'Editing file: ${FILEIN}' \ + --editbox ${FILEIN} ${WINDOW_HEIGHT} ${WINDOW_WIDTH}" 2> ${TMPFILE} + + if [ $? -eq 0 ]; then + log "edit_file" "Copying ${TMPFILE} into ${FILEIN}" + if cp "${TMPFILE}" "${FILEIN}" + then + eval "${DIALOG} --msgbox 'File ${FILEIN} saved successfully' \ + ${INFO_HEIGHT} ${INFO_WIDTH}" + else + eval "${DIALOG} --msgbox 'Error saving file ${FILEIN}' \ + ${INFO_HEIGHT} ${INFO_WIDTH}" + fi + else + log "edit_file" "Editing of ${FILEIN} aborted..." + eval "${DIALOG} --msgbox 'File ${FILEIN} not saved' \ + ${INFO_HEIGHT} ${INFO_WIDTH}" + fi +} + + + + +## +## Read all the configured addresses for a given inet family +## +##function +get_addr_family(){ + +##local + DEVNAME=$1 + ##local + DEVFAMILY=$2 + + NUMADDR=$(ip -f "${DEVFAMILY}" addr show "${DEVNAME}" | grep -c "${DEVFAMILY}") + ADDR_STR="" + for i in $(seq ${NUMADDR}); do + ADDR=$(ip -f "${DEVFAMILY}" addr show "${DEVNAME}" | grep "${DEVFAMILY}" | \ + tail -n +$i | head -1 | sed -r -e "s:^\ +::g" | cut -d " " -f 2,4,6 |\ + sed -r -e "s:\ : -- :g") + ADDR_STR="${ADDR_STR}\n${DEVFAMILY}: ${ADDR}\n" + done +} + +## +## Show the current configuration of a given device +## + +##function +show_device_conf(){ + +##local +DEVNAME=$1 + if [ -z "${DEVNAME}" ]; then + return -1 + fi + + DEVMAC=$(ip link show "${DEVNAME}" | tail -n +2 | sed -r 's/^\ +//g' | cut -d " " -f 2) + DEV_STATUS=$(ip -o link | cut -d " " -f 2,9 | grep -E "^${DEVNAME}: " | cut -d " " -f 2) + + DEVCONF="MAC: ${DEVMAC}\nLINK STATUS: ${DEV_STATUS}\n" + + log "show_device_conf" "NET_FAMILIES: \"${NET_FAMILIES}\"" + + for f in ${NET_FAMILIES}; do + get_addr_family ${DEVNAME} ${f} + log "show_device_conf" "family: ${f} ADDR_STR: \"${ADDR_STR}\"" + + if [ -z "${ADDR_STR}" ]; then + DEVCONF="${DEVCONF}${f}: Unconfigured\n" + else + DEVCONF="${DEVCONF}${ADDR_STR}" + fi + log "show_device_conf" "DEVCONF: ${DEVCONF}" + done + + DEVCONF="${DEVCONF}\n== name servers ==\n$(grep '^nameserver' /etc/resolv.conf)" + + eval "${DIALOG} --title 'Current configuration of device: ${DEVNAME}' \ + --msgbox '\n\n${DEVCONF}' ${WINDOW_HEIGHT} ${WINDOW_WIDTH} " + return 0 + +} + + + +##function +config_ip_static(){ + + ##local + DEV_IP="192.168.1.2" + ##local + DEV_NET="192.168.1.0" + ##local + DEV_NETMASK="255.255.255.0" + ##local + DEV_GW="192.168.1.1" + ##local + DEV_DNS1="208.67.222.222" + ##local + DEV_DNS2="208.67.220.220" + + ##local + DEVNAME=$1 + + exec 3>&1 + eval "${DIALOG} --form 'Set network for device: ${DEVNAME}' \ + ${FORM_HEIGHT} ${FORM_WIDTH} 0 \ + 'IP' 1 1 '${DEV_IP}' 1 16 16 16 \ + 'Network' 2 1 '${DEV_NET}' 2 16 16 16 \ + 'Netmask' 3 1 '${DEV_NETMASK}' 3 16 16 16 \ + 'Gateway' 4 1 '${DEV_GW}' 4 16 16 16 \ + 'Primary DNS' 5 1 '${DEV_DNS1}' 5 16 16 16 \ + 'Secondary DNS' 6 1 '${DEV_DNS2}' 6 16 16 16 " \ + 2> ${TMPFILE} + + if [ $? -eq 1 ]; then + eval "${DIALOG} --infobox 'Configuration of ${DEVNAME} aborted' \ + ${INFO_HEIGHT} ${INFO_WIDTH}" + return + fi + + read -d "*" DEV_IP DEV_NET DEV_NETMASK DEV_GW DEV_DNS1 DEV_DNS2 < ${TMPFILE} + eval "${DIALOG} --msgbox 'Proposed configuration of ${DEVNAME}:\n \ +IP: ${DEV_IP}\nNetwork: ${DEV_NET}\nNetmask: ${DEV_NETMASK}\nGateway: \ +${DEV_GW}\nDNS1: ${DEV_DNS1}\nDNS2: ${DEV_DNS2}'\ + ${WINDOW_HEIGHT} ${WINDOW_WIDTH}" + + ## Configure IP + + ip link set "${DEVNAME}" down + ip link set "${DEVNAME}" up + ip address flush dev "${DEVNAME}" + ip address add "${DEV_IP}/${DEV_NETMASK}" dev "${DEVNAME}" + + ## Configure GW + #if [ -n "${DEV_GW}" ]; then + ip route flush dev "${DEVNAME}" + ip route add "${DEV_NET}/${DEV_NETMASK}" dev "${DEVNAME}" + ip route add default via "${DEV_GW}" + #fi + ## Configure DNS + #if [ -n "${DEV_DNS1}" ] || + # [ -n "${DEV_DNS1}" ]; then + mv /etc/resolv.conf /etc/resolv.conf.bak + if [ -n "${DEV_DNS1}" ]; then + echo "nameserver ${DEV_DNS1}" >> /etc/resolv.conf + fi + if [ -n "${DEV_DNS2}" ]; then + echo "nameserver ${DEV_DNS2}" >> /etc/resolv.conf + fi + show_device_conf "${DEVNAME}" + #fi +} + +##function +config_ip_dhcp(){ + +##local + DEVNAME=$1 + + ##eval "${DIALOG} --msgbox 'Running \"dhclient ${DEVNAME}\"' ${INFO_HEIGHT} ${INFO_WIDTH}" + dhclient -r ${DEVNAME} 2>/dev/null + dhclient -v ${DEVNAME} 2>&1 | + eval "${DIALOG} --title 'Running dhclient ${DEVNAME}' \ + --programbox ${WINDOW_HEIGHT} ${WINDOW_WIDTH}" 2>${TMPFILE} + if [ $! -ne 0 ];then + log "config_ip_dhcp" "dhclient aborted" + fi + show_device_conf ${DEVNAME} +} + + +##function +configure_ip_address(){ + +##local + DEVNAME=$1 + + eval "${DIALOG} --cancel-label 'Up' \ + --menu 'Configuring ${DEVNAME}' ${INFO_HEIGHT} ${INFO_WIDTH} 4 \ + 'DHCP' ''\ + 'Static' ''" 2>${TMPFILE} + if [ $? -eq 1 ]; then + return + fi + ACTION=$(cat ${TMPFILE}) + case ${ACTION} in + "Static") + config_ip_static ${DEVNAME} + ;; + "DHCP") + config_ip_dhcp ${DEVNAME} + ;; + esac +} + +##function +wifi_essid_from_mac(){ + + ##local + DEVNAME=$1 + ##local + W_MAC=$2 + + W_ESSID=$(wpa_cli -i "${DEVNAME}" scan_results | grep -E "^${W_MAC}" | \ + sed -r -e 's/\t/\|/g' | cut -d "|" -f 5) + + log "wifi_essid_from_mac" "Recovered ESSID: ${W_ESSID}" +} + +##function +wifi_flags_from_mac(){ +##local + DEVNAME=$1 +##local + W_MAC=$2 + + W_FLAGS=$(wpa_cli -i "${DEVNAME}" scan_results | grep -E "^${W_MAC}" | \ + sed -r -e 's/\t/\|/g' | cut -d "|" -f 4) + log "wifi_essid_from_mac" "Recovered W_FLAGS: ${W_FLAGS}" + +} + + +##function +wifi_network_list(){ + +##local + DEVNAME=$1 + wpa_cli -i ${DEVNAME} list_networks | tail -n +2 | sed -r -e 's/\t/\|/g' > ${TMPFILE} + + NETLIST="" + LAST_IFS=$IFS + IFS="|" + while read NETNUM NETESSID NETBSSID NETFLAGS; do + IS_DIS=$(echo ${NETFLAGS} | sed -r -e 's/\[//g;s/\]//g' | grep -c -i disabled ) + if [ ${IS_DIS} -eq 1 ]; then + STATUS="(DIS)" + else + STATUS="(ENAB)" + fi + IS_CUR=$(echo ${NETFLAGS} | sed -r -e 's/\[//g;s/\]//g' | grep -c -i current ) + if [ ${IS_CUR} -eq 1 ]; then + STATUS="${STATUS}(CUR)" + fi + + + NETLIST="${NETLIST} ${NETNUM} \"${NETESSID}-${STATUS}\"" + done < ${TMPFILE} + IFS=${LAST_IFS} + + log "wifi_network_list" "NETLIST: ${NETLIST}" +} + + +## +## Manage the authentication for a given wifi ESSID +## +##function +wifi_authenticate(){ + +##local + DEVNAME=$1 +##local + W_MAC=$2 + + + log "wifi_authenticate" "configuring ${DEVNAME} on ${W_MAC}" + ## This will set the variable W_ESSID appropriately + wifi_essid_from_mac ${DEVNAME} ${W_MAC} + + ## This will set the variable W_FLAGS appropriately + wifi_flags_from_mac ${DEVNAME} ${W_MAC} + + + log "wifi_authenticate" "configuring essid: ${W_ESSID} on device: ${DEVNAME}" + log "wifi_authenticate" "W_FLAGS: ${W_FLAGS}" + + + NET_EXISTS=$(wpa_cli -i ${DEVNAME} list_networks | tail -n +2 | sed -r -e 's/\t/\|/g' \ + | cut -d "|" -f 2 | grep -c "${W_ESSID}$" ) + if [ ${NET_EXISTS} != 0 ]; then + NET_NUM=$(wpa_cli -i ${DEVNAME} list_networks | tail -n +2 | sed -r -e 's/\t/\|/g' \ + | cut -d "|" -f 1,2 | grep "${W_ESSID}$" | cut -d "|" -f 1) + wpa_cli -i ${DEVNAME} remove_network ${NET_NUM} > ${TMPFILE} + STATUS=$(cat ${TMPFILE}) + if [ "${STATUS}" != "OK" ]; then + eval "${DIALOG} --msgbox 'Error while removing existing \ + network:\n$essid: {W_ESSID}'" ${INFO_HEIGHT} ${INFO_WIDTH} + return + fi + fi + + + HAS_WPA=$(echo "${W_FLAGS}" | grep -E -c "WPA.*-PSK" ) + + log "wifi_authenticate" "HAS_WPA: \"${HAS_WPA}\"" + + ### This section will configure WPA-PSK or WPA2-PSK + if [ "${HAS_WPA}" != "0" ]; then + PSK="" + PSK_LENGTH=${#PSK} + while [ ${PSK_LENGTH} -le 7 ]; do + eval "${DIALOG} --insecure --inputbox 'Please insert WPA PSK\n(8 characters)' \ + ${INFO_HEIGHT} ${INFO_WIDTH}" 2> ${TMPFILE} + if [ $? -eq 1 ]; then + eval "${DIALOG} --msgbox 'Network configuration aborted!!!' \ + ${INFO_HEIGHT} ${INFO_WIDTH}" + return 1 + fi + PSK=$(cat ${TMPFILE}) + PSK_LENGTH=${#PSK} + done + + + NET_NUM=$(wpa_cli -i ${DEVNAME} add_network | tail -1) + + wpa_cli -i ${DEVNAME} set_network ${NET_NUM} ssid "\"${W_ESSID}\"" + wpa_cli -i ${DEVNAME} set_network ${NET_NUM} psk \"${PSK}\" + ## remove the password from tmpfile + echo "" > ${TMPFILE} + eval "${DIALOG} --defaultno --yesno \ + 'Network \"${W_ESSID}\" added\nSave configuration file?' \ + ${INFO_HEIGHT} ${INFO_WIDTH} " 2> ${TMPFILE} + if [ $? -eq 0 ]; then + ## Save the config file + wifi_save_file ${DEVNAME} + fi + + eval "${DIALOG} --msgbox 'Network added successfully' ${INFO_HEIGHT} ${INFO_WIDTH}" + return 0 + fi + + HAS_ESS=$(echo "${W_FLAGS}" | grep -E -c "ESS" ) + + log "wifi_authenticate" "HAS_ESS: \"${HAS_ESS}\"" + + if [ "${HAS_ESS}" != "0" ]; then + NET_NUM=$(wpa_cli -i ${DEVNAME} add_network | tail -1) + + log "wifi_authenticate" "NET_NUM: ${NET_NUM}" + wpa_cli -i ${DEVNAME} set_network ${NET_NUM} ssid "\"${W_ESSID}\"" + wpa_cli -i ${DEVNAME} set_network ${NET_NUM} key_mgmt NONE + eval "${DIALOG} --defaultno --yesno \ + 'Network \"${W_ESSID}\" added\nSave configuration file?' \ + ${INFO_HEIGHT} ${INFO_WIDTH} " 2> ${TMPFILE} + if [ $? -eq 0 ]; then + ## Save the config file + wifi_save_file ${DEVNAME} + fi + + return 0 + else + eval " ${DIALOG} --msgbox 'Error occurred!!!!' ${INFO_HEIGHT} ${INFO_WIDTH}" + return 0 + fi + + ## No available authentication methods.... + + eval "${DIALOG} --msgbox 'No supported authentication method for ${W_ESSID}'" + return 1 +} + + + + +## +## Configure a new connection from a list of available wi-fi networks +## + +##function +wifi_add(){ + +##local +DEVNAME=$1 + + wpa_cli -i ${DEVNAME} scan + eval "${DIALOG} --timeout 4 --msgbox 'Scanning for networks...' \ + ${INFO_HEIGHT} ${INFO_WIDTH}" + wpa_cli -i ${DEVNAME} scan_results | grep -E "^[0-9a-f][0-9a-f]:" | \ + sed -r -e 's/\t/|/g' |\ + sort -t "|" -r -n -k 3 > ${TMPFILE} + + wifinets="" + LAST_IFS=$IFS + IFS="|" + while read W_MAC W_FREQ W_STRNGT W_FLAGS W_ESSID; do + + log "wifi_add" "W_ESSID: \"${W_ESSID}\"" + wifinets="${wifinets} ${W_MAC} \"${W_ESSID} -- ${W_FLAGS}\"" + done < ${TMPFILE} + IFS=${LAST_IFS} + + + log "wifi_add" "Wifi nets: \n${wifinets}\n===" + eval "dialog --menu 'Select a network' ${WINDOW_HEIGHT} ${WINDOW_WIDTH} 10 \ + ${wifinets} " 2> ${TMPFILE} + if [ $? -eq 1 ]; then + return + fi + + W_MAC=$(cat ${TMPFILE}) + + + wifi_authenticate ${DEVNAME} ${W_MAC} + if [ $? != "0" ]; then + eval "${DIALOG} --msgbox 'Error while configuring ${DEVNAME}' " + fi + return $? +} + + +##function +wifi_save_file(){ + +##local +DEVNAME=$1 + + wpa_cli -i ${DEVNAME} save_config | tail -1 > ${TMPFILE} + SAVE_STATUS=$(cat ${TMPFILE}) + if [ "${SAVE_STATUS}" = "OK" ]; then + eval "${DIALOG} --msgbox 'Current configuration dumped to file ${WPA_FILE}' \ + ${INFO_HEIGHT} ${INFO_WIDTH}" + else + eval "${DIALOG} --msgbox 'Error while saving configuration to file ${WPA_FILE}' \ + ${INFO_HEIGHT} ${INFO_WIDTH}" + fi +} + +##function +wifi_remove(){ + +##local + DEVNAME=$1 + + wifi_network_list ${DEVNAME} + + eval "${DIALOG} --menu 'Select network to remove' \ + ${WINDOW_HEIGHT} ${WINDOW_WIDTH} 10 ${NETLIST}" \ + 2> ${TMPFILE} + + if [ $? -eq 0 ]; then + ## a network has been selected + NETNUM=$(cat ${TMPFILE}) + WPA_STATUS=$(wpa_cli -i ${DEVNAME} remove_network ${NETNUM} | tail -1 ) + if [ "${WPA_STATUS}" = "OK" ]; then + eval "${DIALOG} --defaultno --yesno \ + 'Network ${NETNUM} removed\nSave configuration file?' \ + ${INFO_HEIGHT} ${INFO_WIDTH}" 2> ${TMPFILE} + if [ $? -eq 0 ]; then + ## Save the config file + wifi_save_file ${DEVNAME} + fi + + return + else + eval "${DIALOG} --msgbox 'Network ${NETNUM} NOT removed' \ + ${INFO_HEIGHT} ${INFO_WIDTH}" + return + fi + else + eval "${DIALOG} --msgbox 'No network removed!!!' \ + ${INFO_HEIGHT} ${INFO_WIDTH}" + return + fi + +} + + +##function +wifi_restart_wpa(){ + +##local + DEVNAME=$1 +##local + WPA_FILE=$2 + + WPA_PID=$(ps ax | grep wpa_supplicant | grep " -i ${DEVNAME}" | +sed -r -e 's/^\ +//g' | cut -d " " -f 1) + + log "wifi_restart_wpa" "WPA_PID: ${WPA_PID}" + kill -9 ${WPA_PID} + + wpa_supplicant -B -i ${DEVNAME} -c ${WPA_FILE} -P${WPA_PIDFILE} 2>&1 >/dev/null + WPA_PID=$(ps ax | grep wpa_supplicant | grep " -i ${DEVNAME}" | \ + sed -r -e 's/^\ +//g' | cut -d " " -f 1 ) + WPA_PID_SAVED=$(cat ${WPA_PIDFILE}) + log "wifi_restart_wpa" "WPA_PID: ${WPA_PID} WPA_PID_SAVED: ${WPA_PID_SAVED}" + if [ -n "${WPA_PID}" ] && [ "${WPA_PID}" != "${WPA_PID_SAVED}" ]; then + eval "${DIALOG} --msgbox 'Error restarting wpa_supplicant' \ + ${INFO_HEIGHT} ${INFO_WIDTH}" + else + eval "${DIALOG} --msgbox 'wpa_supplicant restarted successfully' \ + ${INFO_HEIGHT} ${INFO_WIDTH}" + fi + +} + + + +## +## wifi_enable: show the list of configured networks, and enable the +## one the used has clicked on +## + +##function +wifi_enable(){ + +##local + DEVNAME=$1 + + wifi_network_list ${DEVNAME} + + eval "${DIALOG} --menu 'Select configured network' \ + ${WINDOW_HEIGHT} ${WINDOW_WIDTH} 10 ${NETLIST}" \ + 2> ${TMPFILE} + + if [ $? -eq 0 ]; then + ## a network has been selected + NETNUM=$(cat ${TMPFILE}) + WPA_STATUS=$(wpa_cli -i ${DEVNAME} enable ${NETNUM} | tail -1 ) + if [ "${WPA_STATUS}" = "OK" ]; then + eval "${DIALOG} --msgbox 'Network ${NETNUM} enabled' \ + ${INFO_HEIGHT} ${INFO_WIDTH}" + #config_ethernet ${DEVNAME} + return + else + eval "${DIALOG} --msgbox 'Network ${NETNUM} NOT enabled' \ + ${INFO_HEIGHT} ${INFO_WIDTH}" + return + fi + else + eval "${DIALOG} --msgbox 'No network enabled!!!' \ + ${INFO_HEIGHT} ${INFO_WIDTH}" + return + fi +} + + +##function +wifi_disable(){ + +##local + DEVNAME=$1 + wifi_network_list ${DEVNAME} + eval "${DIALOG} --menu 'Select configured network' \ + ${WINDOW_HEIGHT} ${WINDOW_WIDTH} 10 ${NETLIST}" \ + 2> ${TMPFILE} + + if [ $? -eq 0 ]; then + ## a network has been selected + NETNUM=$(cat ${TMPFILE}) + WPA_STATUS=$(wpa_cli -i ${DEVNAME} disable ${NETNUM} | tail -1 ) + if [ "${WPA_STATUS}" = "OK" ]; then + eval "${DIALOG} --msgbox 'Network ${NETNUM} disabled' \ + ${INFO_HEIGHT} ${INFO_WIDTH}" + return + else + eval "${DIALOG} --msgbox 'Network ${NETNUM} NOT disabled' \ + ${INFO_HEIGHT} ${INFO_WIDTH}" + return + fi + else + eval "${DIALOG} --msgbox 'No network disabled!!!' \ + ${INFO_HEIGHT} ${INFO_WIDTH}" + return + fi +} + + + + + +##function +wifi_load_file(){ + +##local + DEVNAME=$1 + + MSG="You are running setnet through sudo or sup!!!\nLoad file is + disabled!" check_sudo "${MSG}" + + if [ $? -eq 1 ]; then + return + fi + + + eval "${DIALOG} --fselect ${WPA_FILE} ${WINDOW_HEIGHT} ${WINDOW_WIDTH}" \ + 2>${TMPFILE} + + if [ $? -eq 0 ]; then + SEL_FILE=$(cat ${TMPFILE}) + while [ -d "${SEL_FILE}" ]; do + eval "${DIALOG} --fselect ${SEL_FILE} ${WINDOW_HEIGHT} ${WINDOW_WIDTH}" \ + 2>${TMPFILE} + if [ $? -eq 0 ]; then + SEL_FILE=$(cat ${TMPFILE}) + else + eval "${DIALOG} --msgbox 'WPA_FILE was not modified' \ + ${INFO_HEIGHT} ${INFO_WIDTH}" + return + fi + done + + if [ -f "${SEL_FILE}" ]; then + WPA_FILE=${SEL_FILE} + eval "${DIALOG} --defaultno --yesno \ + 'WPA_FILE changed to ${WPA_FILE}\nRestart wpa_supplicant?' \ + ${INFO_HEIGHT} ${INFO_WIDTH}" + if [ $? -eq 0 ]; then + wifi_restart_wpa ${DEVNAME} ${WPA_FILE} + fi + else + eval "${DIALOG} --msgbox 'Invalid file name!\n WPA_FILE *not* changed' \ + ${WINDOW_HEIGHT} ${WINDOW_WIDTH}" + return + fi + else + eval "${DIALOG} --msgbox 'WPA_FILE was not modified' \ + ${INFO_HEIGHT} ${INFO_WIDTH}" + fi + +} + + + +##function +config_wifi(){ + +##local + DEVNAME=$1 + + while true; do + eval "${DIALOG} --cancel-label 'Up' \ + --menu 'Configuring ${DEVNAME}\n(Current file: ${WPA_FILE})' \ + ${WINDOW_HEIGHT} ${WINDOW_WIDTH} 12 \ + 'Restart' 'Restart wpa_supplicant' \ + 'Enable' 'Enable a configured network' \ + 'Disable' 'Disable a configured network' \ + 'Add' 'Configure a new network' \ + 'Remove' 'Delete an existing network' \ + 'Show' 'Show current configuration file' \ + 'Edit' 'Edit current configuration file' \ + 'Save' 'Save configuration to file'\ + 'Load' 'Load configuration from file'\ + 'New' 'Create new configuration file' " \ + 2>${TMPFILE} + + if [ $? = "1" ]; then + return + fi + ACTION=$(cat ${TMPFILE}) + case ${ACTION} in + "Restart") + ## Restart wpa_supplicant + wifi_restart_wpa ${DEVNAME} ${WPA_FILE} + ;; + "Enable") + wifi_enable ${DEVNAME} + ;; + "Disable") + wifi_disable ${DEVNAME} + ;; + "Add") + wifi_add ${DEVNAME} + ;; + "Remove") + wifi_remove ${DEVNAME} + ;; + "Show") + eval "${DIALOG} --title 'Current file: ${WPA_FILE}' \ + --textbox ${WPA_FILE} ${WINDOW_HEIGHT} ${WINDOW_WIDTH}" + ;; + "Edit") + edit_file ${WPA_FILE} + ;; + "Save") + wifi_save_file ${DEVNAME} + ;; + "Load") + wifi_load_file ${DEVNAME} + ;; + "New") + unimplemented "New" + ;; + esac + done + +} + + + +## +## (Re)-Configure +## + +##function +configure_wifi(){ + +##local + DEVNAME=$1 + + ## Automatically Check if the network device is a wifi -- this + ## should be robust... + ! iw ${DEVNAME} info 2>&1 >/dev/null + IS_WIFI=$? + log "configure_device" "Device ${DEVNAME} -- IS_WIFI: ${IS_WIFI} (automatic)" + if [ "${IS_WIFI}" = "0" ] && \ + [ -n "${WIFI_DEVICES}" ]; then + ## WIFI_DEVICES is set, hence we check whether the current + ## device is in the list + IS_WIFI=$(echo " ${WIFI_DEVICES} " | grep -E -c "(\ ${DEVNAME}\ )") + log "configure_device" "Device ${DEVNAME} -- IS_WIFI: ${IS_WIFI} (config file)" + fi + + + case ${IS_WIFI} in + 1) + config_wifi ${DEVNAME} + ;; + *) + ## Show a message here + eval "${DIALOG} --msgbox '${DEVNAME} is not a WiFi device... ' \ + ${INFO_HEIGHT} ${INFO_WIDTH}" + ;; + esac + +} + + +##function +set_device_up(){ + +##local +DEVNAME=$1 + + ip link set ${DEVNAME} up + +} + +##function +set_device_down(){ + +##local +DEVNAME=$1 + + ip link set ${DEVNAME} down + +} + +##function +show_device_menu(){ + +##local + DEVNAME=$1 + + while true; do + DEV_STATUS=$(ip -o link | cut -d " " -f 2,9 | grep -E "^${DEVNAME}: " | cut -d " " -f 2) + log "show_device_menu" "DEVNAME: ${DEVNAME} DEV_STATUS: ${DEV_STATUS}" + eval "${DIALOG} --cancel-label 'Up' --menu\ + 'Device: ${DEVNAME}\nStatus: ${DEV_STATUS}' \ + ${WINDOW_HEIGHT} ${WINDOW_WIDTH} 8 \ + 'View' 'View current configuration' \ + 'Conf' 'Configure IP Address' \ + 'WiFi' 'Manage WiFi networking' \ + 'Start' 'Bring interface up' \ + 'Stop' 'Put interface down' \ + 'Restart' 'Restart interface'" 2> ${TMPFILE} + + if [ $? -eq 1 ]; then + return + fi + + DEV_ACTION=$(cat ${TMPFILE}) + case ${DEV_ACTION} in + "View") + show_device_conf ${DEVNAME} + ;; + "Conf") + configure_ip_address ${DEVNAME} + ;; + "WiFi") + configure_wifi ${DEVNAME} + ;; + "Start") + set_device_up ${DEVNAME} + ;; + "Stop") + set_device_down ${DEVNAME} + ;; + "Restart") + set_device_down ${DEVNAME} + set_device_up ${DEVNAME} + ;; + *) + ;; + + esac + done +} + +## +## Show all the available network devices +## + +##function +show_devs() { + + DEVICES=$(ip link show | awk 'NR % 2 == 1' | cut -d ":" -f 2) + + DEVICE_TAGS="" + + for i in $DEVICES; do + if [ "$i" != "lo" ]; then + DEVICE_TAGS="${DEVICE_TAGS} $i $i" + fi + done + + eval "${DIALOG} --cancel-label 'Up' \ + --menu 'Select Interface to configure' ${WINDOW_HEIGHT} ${WINDOW_WIDTH} 4 \ + ${DEVICE_TAGS}" 2> ${TMPFILE} + return $? +} + + +##function +dev_config_menu(){ + + while true; do + show_devs + if [ $? -eq 1 ]; then + return + fi + DEVNAME=$(cat ${TMPFILE}) + show_device_menu ${DEVNAME} + done +} + +##function +show_info(){ + + cat < ${TMPFILE} + + -+- setnet.sh ${VERSION} -+- + +setnet.sh is a simple state-less tool to manage and configure network +interfaces. It is a shell wrapper around the functionalities of +standard command-line tools, including "ip", "dhclient", "wpa_cli", +etc., and can be used to configure network connections via +Ethernet/Wi-Fi interfaces. + +Both Static and DHCP-based IP configuration are supported. + +At the moment, only WPA-PSK and open (no key) Wi-Fi connections are +available. + +For more information, please visit the webpage of the project: + + http://kalos.mine.nu/setnet/ + +Please report bugs at: + + https://git.devuan.org/KatolaZ/setnet + +EOF + eval "${DIALOG} --cr-wrap --textbox ${TMPFILE} ${WINDOW_HEIGHT} ${WINDOW_WIDTH}" + return +} + +##function +show_copyright(){ + + cat < ${TMPFILE} + + -+- setnet.sh ${VERSION} -+- + +-------------------------------------------------------------------- + + Copyleft (C) Vincenzo "KatolaZ" Nicosia + 2016, 2017 + +-------------------------------------------------------------------- + + +EOF + eval "${DIALOG} --cr-wrap --textbox ${TMPFILE} ${WINDOW_HEIGHT} ${WINDOW_WIDTH}" + return +} + + +##function +show_license(){ + + cat < ${TMPFILE} + + -+- setnet.sh ${VERSION} -+- + +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 . + +-------------------------------------------------------------------- + + Copyleft (C) Vincenzo "KatolaZ" Nicosia + 2016, 2017 + +-------------------------------------------------------------------- + +EOF + eval "${DIALOG} --cr-wrap --textbox ${TMPFILE} ${WINDOW_HEIGHT} ${WINDOW_WIDTH}" + return +} + + + +##function +about_menu(){ + + while true; do + eval "${DIALOG} --cancel-label 'Up' --menu 'setnet ${VERSION} -- About' \ + ${WINDOW_HEIGHT} ${WINDOW_WIDTH} 6 \ + 'Info' 'General information' \ + 'Copyleft' 'Copyleft information' \ + 'License' 'How to distribute this program' " \ + 2> ${TMPFILE} + if [ $? -eq 1 ];then + return; + fi + + ACTION=$(cat ${TMPFILE}) + case ${ACTION} in + "Info") + show_info + ;; + "Copyleft") + show_copyright + ;; + "License") + show_license + ;; + esac + done +} + +##function +notfound(){ + + CMDNAME=$1 + + + eval "${DIALOG} --msgbox 'Sorry! Commmand ${CMDNAME} not found!'" \ + ${INFO_HEIGHT} ${INFO_WIDTH} + +} + + +##function +netdiag_DNS(){ + + DUMPFILE=$1 + + if [ -n "${DUMPFILE}" ]; then + ## Dump to file + printf "\n=====\n== DNS Configuration (/etc/resolv.conf)\n=====\n\n" >> ${DUMPFILE} + cat /etc/resolv.conf >> ${DUMPFILE} + echo "==================================" >> ${DUMPFILE} + return 0 + fi + + ## Dump to dialog + NAMESERVERS=$(grep '^nameserver' /etc/resolv.conf) + MSG_STR="Configured name servers in /etc/resolv.conf ==\n\n${NAMESERVERS}" + + eval "${DIALOG} --title 'DNS servers' --msgbox '${MSG_STR}' "\ + ${WINDOW_HEIGHT} ${WINDOW_WIDTH} + +} + +##function +netdiag_resolver(){ + + DUMPFILE=$1 + + if [ -n "${DUMPFILE}" ]; then + ## Dump to file + printf "\n=====\n== Resolver Configuration (/etc/nsswitch.conf)\n=====\n\n" >> ${DUMPFILE} + grep -v '^#' /etc/nsswitch.conf >> ${DUMPFILE} + echo "==================================" >> ${DUMPFILE} + return 0 + fi + + ## Dump to dialog + RESOLVER=$(grep -v '^#' /etc/nsswitch.conf) + + eval "${DIALOG} --title 'Resolver configuration (/etc/nsswitch.conf)' \ + --msgbox '${RESOLVER}' "\ + ${WINDOW_HEIGHT} ${WINDOW_WIDTH} + +} + + +##function +netdiag_routes(){ + + DUMPFILE=$1 + + HAS_NETSTAT=$(echo ${HAS_OPTS} | grep -c " netstat ") + if [ ${HAS_NETSTAT} -ne 1 ]; then + notfound "netstat" + return + fi + + if [ -n "${DUMPFILE}" ]; then + ## Dump to file + printf "\n=====\n== Routing table\n=====\n\n" >> ${DUMPFILE} + netstat -rn >> ${DUMPFILE} + echo "==================================" >> ${DUMPFILE} + return 0 + fi + ## Dump to dialog + ROUTES=$(netstat -rn > ${TMPFILE} ) + + eval "${DIALOG} --no-collapse --title 'Routing table (netstat -rn) [arrows to scroll]'" \ + "--tab-correct --tab-len 4 --textbox ${TMPFILE} "\ + ${LARGE_HEIGHT} ${LARGE_WIDTH} +} + +##function +netdiag_ARP(){ + + DUMPFILE=$1 + log "netdiag_ARP" "DUMPFILE: '${DUMPFILE}'" + if [ -n "${DUMPFILE}" ]; then + ## Dump to file + printf "\n=====\n== ARP table\n=====\n\n" >> "${DUMPFILE}" + cat /proc/net/arp >> "${DUMPFILE}" + echo "==================================" >> ${DUMPFILE} + return 0 + fi + + # Dump to dialog + ARP=$(cat /proc/net/arp >${TMPFILE}) + + eval "${DIALOG} --no-collapse --title 'ARP table (/proc/net/arp) [arrows to scroll]'" \ + "--tab-correct --tab-len 4 --textbox ${TMPFILE} "\ + ${LARGE_HEIGHT} ${LARGE_WIDTH} +} + +##function +netdiag_connections(){ + + DUMPFILE=$1 + + + HAS_NETSTAT=$(echo ${HAS_OPTS} | grep -c " netstat ") + if [ ${HAS_NETSTAT} -ne 1 ]; then + notfound "netstat" + return + fi + + if [ -n "${DUMPFILE}" ]; then + ## Dump to file + printf "\n=====\n== Active Network Connections\n=====\n\n" >> ${DUMPFILE} + netstat -tnp | sed -r -e 's/$/\n/g' >> ${DUMPFILE} + echo "==================================" >> ${DUMPFILE} + return 0 + fi + + ## Dump to dialog + SERV=$(netstat -tnp | sed -r -e 's/$/\n/g' > ${TMPFILE}) + + eval "${DIALOG} --no-collapse "\ + " --title 'Active network connections (netstat -tnp) [arrows to scroll]'" \ + "--tab-correct --tab-len 4 --textbox ${TMPFILE} "\ + ${LARGE_HEIGHT} ${LARGE_WIDTH} +} + + +##function +netdiag_services(){ + + DUMPFILE=$1 + + HAS_NETSTAT=$(echo ${HAS_OPTS} | grep -c " netstat ") + if [ ${HAS_NETSTAT} -ne 1 ]; then + notfound "netstat" + return + fi + + if [ -n "${DUMPFILE}" ]; then + ## Dump to file + printf "\n=====\n== Active network services\n=====\n\n" >> ${DUMPFILE} + netstat -ltnp | sed -r -e 's/$/\n/g' >> ${DUMPFILE} + echo "==================================" >> ${DUMPFILE} + return 0 + fi + + + SERV=$(netstat -ltnp | sed -r -e 's/$/\n/g' > ${TMPFILE}) + + eval "${DIALOG} --no-collapse "\ + " --title 'Active network services (netstat -ltnp) [arrows to scroll]'" \ + "--tab-correct --tab-len 4 --textbox ${TMPFILE} "\ + ${LARGE_HEIGHT} ${LARGE_WIDTH} +} + + +##function +netdiag_ping(){ + + HAS_PING=$(echo ${HAS_OPTS} | grep -E -c "\ ping\ ") + if [ ${HAS_PING} -ne 1 ]; then + notfound "ping" + return + fi + eval "${DIALOG} --insecure --inputbox 'Host or IP to ping:' \ + ${INFO_HEIGHT} ${INFO_WIDTH}" 2> ${TMPFILE} + + if [ $? -ne 0 ]; then + eval "${DIALOG} --msgbox 'Ping Aborted' \ + ${INFO_HEIGHT} ${INFO_WIDTH}" + return + else + PINGIP=$(cat ${TMPFILE}) + ping -c 5 ${PINGIP} 2>&1 |\ + eval "${DIALOG} --title 'Ping ${PINGIP}' \ + --programbox ${LARGE_HEIGHT} ${LARGE_WIDTH}" 2>${TMPFILE} + if [ $! -ne 0 ];then + log "netdiag_ping" "ping aborted" + fi + fi + +} + +##function +netdiag_traceroute(){ + + HAS_TRACERT=$(echo ${HAS_OPTS} | grep -c " traceroute ") + if [ ${HAS_TRACERT} -ne 1 ]; then + notfound "traceroute" + return + fi + eval "${DIALOG} --insecure --inputbox 'Host or IP to trace:' \ + ${INFO_HEIGHT} ${INFO_WIDTH}" 2> ${TMPFILE} + + if [ $? -ne 0 ]; then + eval "${DIALOG} --msgbox 'Traceroute Aborted' \ + ${INFO_HEIGHT} ${INFO_WIDTH}" + return + else + TRACEIP=$(cat ${TMPFILE}) + traceroute ${TRACEIP} 2>&1 | \ + eval "${DIALOG} --title 'Traceroute ${TRACEIP}' \ + --programbox ${LARGE_HEIGHT} ${LARGE_WIDTH}" 2>${TMPFILE} + if [ $! -ne 0 ];then + log "netdiag_traceroute" "traceroute aborted" + fi + fi +} + + +##function +netdiag_lookup(){ + + HAST_HOST=$(echo ${HAS_OPTS} | grep -c " host ") + if [ $? -ne 1 ]; then + notfound "host" + return + fi + + eval "${DIALOG} --insecure --inputbox 'Hostname or IP to lookup:' \ + ${INFO_HEIGHT} ${INFO_WIDTH}" 2> ${TMPFILE} + + if [ $? -ne 0 ]; then + eval "${DIALOG} --msgbox 'DNS lookup aborted' \ + ${INFO_HEIGHT} ${INFO_WIDTH}" + return + else + QUERYIP=$(cat ${TMPFILE}) + host ${QUERYIP} 2>&1 |\ + eval "${DIALOG} --title 'host ${QUERYIP}' \ + --programbox ${LARGE_HEIGHT} ${LARGE_WIDTH}" 2>${TMPFILE} + if [ $! -ne 0 ];then + log "netdiag_ping" "host lookup aborted" + fi + + fi +} + +##function +netdiag_devices(){ + + DUMPFILE=$1 + + if [ -n "${DUMPFILE}" ]; then + printf "\n=====\n== Network Devices\n=====\n\n" >> ${DUMPFILE} + ip addr >> ${DUMPFILE} + echo "==================================" >> ${DUMPFILE} + return 0 + fi +} + + + +## +## Main menu for network diagnostics +## + +##function +netdiag_menu(){ + + while true; do + eval "${DIALOG} --cancel-label 'Up' --menu 'Network diagnostics' \ + ${WINDOW_HEIGHT} ${WINDOW_WIDTH} 10 \ + 'ARP' 'Show ARP table' \ + 'Connections' 'List active network connections' \ + 'DNS' 'List DNS servers' \ + 'Lookup' 'DNS Lookup' \ + 'Ping' 'Ping a host' \ + 'Resolver' 'Show resolver configuration' \ + 'Routes' 'Show routing table' \ + 'Services' 'List active network daemons' \ + 'Traceroute' 'Show the route to a host' " \ + 2> ${TMPFILE} + if [ $? -eq 1 ];then + return; + fi + + ACTION=$(cat ${TMPFILE}) + case ${ACTION} in + "ARP") + netdiag_ARP + ;; + "Connections") + netdiag_connections + ;; + "DNS") + netdiag_DNS + ;; + "Ping") + netdiag_ping + ;; + "Lookup") + netdiag_lookup + ;; + "Resolver") + netdiag_resolver + ;; + "Routes") + netdiag_routes + ;; + "Services") + netdiag_services + ;; + "Traceroute") + netdiag_traceroute + ;; + esac + done + + +} + +##function +dump_file(){ + + CONF=$1 + + log "dump_file" "CONF: ${CONF}" + + DUMPFILE="/tmp/network_dump.txt" + + eval "${DIALOG} --fselect ${DUMPFILE} ${WINDOW_HEIGHT} ${WINDOW_WIDTH}" \ + 2>${TMPFILE} + + if [ $? -eq 0 ]; then + SEL_FILE=$(cat ${TMPFILE}) + while [ -d "${SEL_FILE}" ]; do + eval "${DIALOG} --fselect ${SEL_FILE} ${WINDOW_HEIGHT} ${WINDOW_WIDTH}" \ + 2>${TMPFILE} + if [ $? -eq 0 ]; then + SEL_FILE=$(cat ${TMPFILE}) + else + eval "${DIALOG} --msgbox 'Dump aborted' \ + ${INFO_HEIGHT} ${INFO_WIDTH}" + return + fi + done + + ## The dump starts here.... + DUMPFILE=${SEL_FILE} + truncate -s 0 ${DUMPFILE} + echo "===== setnet ${VERSION}" >> ${DUMPFILE} + echo "===== Date: $(date)" >> ${DUMPFILE} + echo "===== Network configuration dump: ${CONF} " >> ${DUMPFILE} + for c in ${CONF}; do + eval "netdiag_${c} \"${DUMPFILE}\"" + done + else + eval "${DIALOG} --msgbox 'Dump aborted' \ + ${INFO_HEIGHT} ${INFO_WIDTH}" + return + fi + eval "${DIALOG} --msgbox 'Status dumped to ${DUMPFILE}' \ + ${INFO_HEIGHT} ${INFO_WIDTH}" +} + + +##function +dump_pastebin(){ + + unimplemented "pastebin" +} + +##function +dump_menu(){ + + eval "${DIALOG} --checklist 'Select conf to dump' \ + ${WINDOW_HEIGHT} ${WINDOW_WIDTH} 10 \ + 'ARP' 'ARP table' on \ + 'devices' 'Device configuration' on \ + 'DNS' 'DNS configuration' on \ + 'resolver' 'System resolver configuration' on \ + 'routes' 'Routing table' on \ + 'connections' 'Active network connections' on \ + 'services' 'Active network services' on " 2> ${TMPFILE} + if [ $? -ne 0 ]; then + return + fi + + DUMP_CONF=$(cat ${TMPFILE}) + + eval "${DIALOG} --cancel-label 'Up' \ + --menu 'Dump configuration to:' \ + ${INFO_HEIGHT} ${INFO_WIDTH} 6 \ + 'File' 'Dump to file' \ + 'Pastebin' 'Dump to pastebin'" \ + 2> ${TMPFILE} + if [ $? -eq 1 ];then + return; + fi + + ACTION=$(cat ${TMPFILE}) + case ${ACTION} in + "File") + dump_file "${DUMP_CONF}" + ;; + "Pastebin") + dump_pastebin "${DUMP_CONF}" + ;; + esac +} + + +##function +show_toplevel(){ + + log "show_toplevel" "TMPFILE: ${TMPFILE}" + eval "${DIALOG} --cancel-label 'Quit' --menu 'Main Menu' \ + ${WINDOW_HEIGHT} ${WINDOW_WIDTH} 6 \ + 'Setup' 'Setup interfaces' \ + 'Info' 'Network diagnostics' \ + 'Dump' 'Dump current network status' \ + 'Log' 'View setnet log' \ + 'About' 'License & Copyleft'" 2> ${TMPFILE} + + return $? +} + +##function +show_help(){ + +##local +SCRIPTNAME=$1 + echo "Usage: ${SCRIPTNAME} [OPTION]" + echo "Options:" + printf "\t -c cfg_file\tLoad configuration from cfg_file.\n" + printf "\t -v\t\tPrint version number and exit.\n" + printf "\t -h\t\tShow this help.\n" + +} + +##function +show_version(){ + +##local +SCRIPTNAME=$1 + echo "${SCRIPTNAME} -- version ${VERSION}" + echo "Copyleft (C) Vincenzo \"KatolaZ\" Nicosia (katolaz@freaknet.org) -- 2016, 2017" + echo "This is free software. You can use and redistribute it under the " + echo "terms of the GNU General Public Licence version 3 or (at your option)" + echo "any later version." + echo + echo "YOU USE THIS SOFTWARE AT YOUR OWN RISK." + echo "There is ABSOLUTELY NO WARRANTY; not even for MERCHANTABILITY or" + echo "FITNESS FOR A PARTICULAR PURPOSE." +} + +##function +show_disclaimer(){ + + cat < ${TMPFILE} + + -+- setnet.sh ${VERSION} -+- + + Copyleft (C) KatolaZ (katolaz@freaknet.org) + 2016, 2017 + + -+- This is a beta release of setnet.sh -+- + + THIS IS FREE SOFTWARE + YOU CAN USE AND DISTRIBUTE IT UNDER THE + TERMS OF THE GNU GENERAL PUBLIC LICENSE + + USE THIS SOFTWARE AT YOUR OWN RISK + + There is ABSOLUTELY NO WARRANTY; not even for + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE + + See "About" for more information about + your right and distribution terms +EOF + + eval "${DIALOG} --cr-wrap --textbox ${TMPFILE} 23 60" + return +} + +##function +initialise(){ + + + TMPFILE=$( (tempfile) 2>/dev/null) || TMPFILE=/tmp/setnet_$$ + WPA_PIDFILE=$( (tempfile) 2>/dev/null) || WPA_PIDFILE=/tmp/setnet_wpapid_$$ + + trap cleanup 0 HUP INT TRAP TERM QUIT + + if [ -z ${TRUNCATE_LOG} ] || \ + [ ${TRUNCATE_LOG} = "yes" ] || \ + [ ${TRUNCATE_LOG} = "YES" ]; then + truncate -s 0 ${LOGFILE} + fi + + log "setnet" "Starting afresh on $(date)" + + + EUID=$(id -ru) + if [ "${EUID}" = "0" ] && + [ -n "${SUDO_UID}" ] && + [ "${EUID}" != "${SUDO_UID}" ]; then + USING_SUDO="1" + elif [ "${EUID}" = "0" ] && + [ -n "${SUP_UID}" ] && + [ "${EUID}" != "${SUP_UID}" ]; then + USING_SUDO="1" + else + USING_SUDO="0" + fi + + log "initialise" "EUID: ${EUID}" + log "initialise" "SUDO_UID: ${SUDO_UID}" + log "initialise" "SUP_UID: ${SUP_UID}" + log "initialise" "USING_SUDO: ${USING_SUDO}" +} + + +##function +log_show(){ + + eval "${DIALOG} --cr-wrap --title 'setnet log file (${LOGFILE})'\ + --textbox ${LOGFILE} \ + ${WINDOW_HEIGHT} ${WINDOW_WIDTH}" + +} + +##function +main(){ + + + show_disclaimer + + SETNETRC=$(realpath ${SETNETRC}) + log "main" "Using config file \"${SETNETRC}\"" + WPA_FILE=$(realpath ${WPA_FILE}) + log "main" "Using WPA config file \"${WPA_FILE}\"" + LOFGILE=$(realpath ${LOGFILE}) + log "main" "Using log file \"${LOGFILE}\"" + + while true; do + show_toplevel + + if [ $? -eq 1 ]; then + cleanup + exit 1 + fi + log "main" "${TMPFILE}" + ACTION=$(cat ${TMPFILE}) + log "main" "ACTION: ${ACTION}" + case ${ACTION} in + "Setup") + dev_config_menu + ;; + "Info") + netdiag_menu + ;; + "Dump") + dump_menu + ;; + "Log") + log_show + ;; + "About") + about_menu + ;; + esac + done + +} + + +## +## The script starts here +## + + +## +## Get command-line arguments +## + +SETNETRC="" + +while getopts ":c:hv" opt; do + + case $opt in + c) + #echo "Got option -c ${OPTARG}" + SETNETRC=$(realpath ${OPTARG}) + #echo "SETNETRC: ${SETNETRC}" + ;; + h) + show_help $(basename $0) + exit 1 + ;; + v) + show_version $(basename $0) + exit 1 + ;; + \?) + echo "Invalid option: -${OPTARG}" + exit 1 + ;; + :) + echo "Option -${OPTARG} requires an argument" + exit 1 + ;; + esac +done + + +## +## Load the configuration file +## + +load_setnetrc ${SETNETRC} + +## +## Init stuff +## + +initialise + + +## +## Check dependencies. If we are missing someting essential, then exit. +## + +check_deps + +## +## This is the main loop +## + +main + diff --git a/debian_package/setnet-0.2.1/setnetrc b/debian_package/setnet-0.2.1/setnetrc new file mode 100644 index 0000000..725868a --- /dev/null +++ b/debian_package/setnet-0.2.1/setnetrc @@ -0,0 +1,28 @@ +## +## +## setnetrc -- configuration file for setnet +## +## + +## +## WPA_FILE: The default configuration file for wpa_supplicant +## +WPA_FILE=/etc/wpa_supplicant/wpa_setnet.conf + + +## +## LOGFILE: Location of the logfile +## +LOGFILE=/var/log/setnet.log + +## +## TRUNCATE_LOG: Truncate the log file at startup +## +TRUNCATE_LOG="yes" + +## +## WIFI_DEVICES: List of Wi-Fi devices, to be used if automatic +## detection fails +## + +##WIFI_DEVICES="wlan1 wlan3" diff --git a/debian_package/setnet-0.2.1/wpa_setnet.conf b/debian_package/setnet-0.2.1/wpa_setnet.conf new file mode 100644 index 0000000..9ce4275 --- /dev/null +++ b/debian_package/setnet-0.2.1/wpa_setnet.conf @@ -0,0 +1,4 @@ +ctrl_interface=/var/run/wpa_supplicant +update_config=1 +GROUP=wheel + diff --git a/debian_package/setnet_0.2.1-1.debian.tar.xz b/debian_package/setnet_0.2.1-1.debian.tar.xz new file mode 100644 index 0000000000000000000000000000000000000000..44ed6505860c2f920ff7d336b5863115d39609ac GIT binary patch literal 9744 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 literal 0 HcmV?d00001 diff --git a/debian_package/setnet_0.2.1-1.dsc b/debian_package/setnet_0.2.1-1.dsc new file mode 100644 index 0000000..a8a9cfa --- /dev/null +++ b/debian_package/setnet_0.2.1-1.dsc @@ -0,0 +1,31 @@ +-----BEGIN PGP SIGNED MESSAGE----- +Hash: SHA1 + +Format: 3.0 (quilt) +Source: setnet +Binary: setnet +Architecture: all +Version: 0.2.1-1 +Maintainer: Vincenzo (KatolaZ) Nicosia +Homepage: http://kalos.mine.nu/setnet +Standards-Version: 3.9.8 +Build-Depends: debhelper (>= 9) +Package-List: + setnet deb unknown optional arch=all +Checksums-Sha1: + c42046e917c513da3c6fb58443b87041cec8fdb5 13512 setnet_0.2.1.orig.tar.xz + a8a604ae41f5691e8f27079a4a228fc42e97a770 9744 setnet_0.2.1-1.debian.tar.xz +Checksums-Sha256: + ad3aec3ba1ac0bed6bad6643c98b6525b8e214e13059867263b2d44d827e6a7f 13512 setnet_0.2.1.orig.tar.xz + 7314db77d9edf0c1cdb91c099a250406862908b5695c2e8bb5a7c3950c3d24a3 9744 setnet_0.2.1-1.debian.tar.xz +Files: + 849e9456b1ae54102c9c93c287d6d883 13512 setnet_0.2.1.orig.tar.xz + 871f301b52182e3f7607ea7ae2aff1c7 9744 setnet_0.2.1-1.debian.tar.xz + +-----BEGIN PGP SIGNATURE----- +Version: GnuPG v2 + +iEYEARECAAYFAlhxfy4ACgkQXyCzrgtfBi/n4ACfWWBF5Tv4W/oT/2Ui/H4RIb03 +jboAnj6PzAbYCOK+oS8+0zzKKGIoqaC/ +=9ABJ +-----END PGP SIGNATURE----- diff --git a/debian_package/setnet_0.2.1-1_all.deb b/debian_package/setnet_0.2.1-1_all.deb new file mode 100644 index 0000000000000000000000000000000000000000..3d0861d1bfc2a6e24fd8221e2b85691812a2d7d6 GIT binary patch literal 17164 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 literal 0 HcmV?d00001 diff --git a/debian_package/setnet_0.2.1-1_amd64.changes b/debian_package/setnet_0.2.1-1_amd64.changes new file mode 100644 index 0000000..d4471df --- /dev/null +++ b/debian_package/setnet_0.2.1-1_amd64.changes @@ -0,0 +1,42 @@ +-----BEGIN PGP SIGNED MESSAGE----- +Hash: SHA1 + +Format: 1.8 +Date: Sat, 07 Jan 2017 23:29:44 +0000 +Source: setnet +Binary: setnet +Architecture: source all +Version: 0.2.1-1 +Distribution: unstable +Urgency: medium +Maintainer: Vincenzo (KatolaZ) Nicosia +Changed-By: Vincenzo (KatolaZ) Nicosia +Description: + setnet - simple shell/dialog tool to configure networks +Changes: + setnet (0.2.1-1) unstable; urgency=medium + . + * Version 0.2.1 -- See ChangeLog for details +Checksums-Sha1: + b12525f8d7e6b51ca59d6655ee9cd5ed5c3fa318 1043 setnet_0.2.1-1.dsc + c42046e917c513da3c6fb58443b87041cec8fdb5 13512 setnet_0.2.1.orig.tar.xz + a8a604ae41f5691e8f27079a4a228fc42e97a770 9744 setnet_0.2.1-1.debian.tar.xz + bf8645cb95e02bf64f0f3358936a410f903adcb7 17164 setnet_0.2.1-1_all.deb +Checksums-Sha256: + ae035925aeb117fc21391fa072a2a9ae3ad641708f55a226346655d86c57ee3a 1043 setnet_0.2.1-1.dsc + ad3aec3ba1ac0bed6bad6643c98b6525b8e214e13059867263b2d44d827e6a7f 13512 setnet_0.2.1.orig.tar.xz + 7314db77d9edf0c1cdb91c099a250406862908b5695c2e8bb5a7c3950c3d24a3 9744 setnet_0.2.1-1.debian.tar.xz + 86993feb74ffdc3513b8bbf57350350cf257b8712dd342cbc74bd6cd2aba25e1 17164 setnet_0.2.1-1_all.deb +Files: + f35dcc6fed24f56874010229819edf0b 1043 unknown optional setnet_0.2.1-1.dsc + 849e9456b1ae54102c9c93c287d6d883 13512 unknown optional setnet_0.2.1.orig.tar.xz + 871f301b52182e3f7607ea7ae2aff1c7 9744 unknown optional setnet_0.2.1-1.debian.tar.xz + 1fa08b0edfbc742a23c14e5da2636591 17164 unknown optional setnet_0.2.1-1_all.deb + +-----BEGIN PGP SIGNATURE----- +Version: GnuPG v2 + +iEYEARECAAYFAlhxfzEACgkQXyCzrgtfBi+BZgCeKrvmAAbbx4qO8G44/ox9hwOb +7moAn22VzMNMM5V8pHfTdr2cn84NB+fz +=wmeA +-----END PGP SIGNATURE----- diff --git a/debian_package/setnet_0.2.1.orig.tar.xz b/debian_package/setnet_0.2.1.orig.tar.xz new file mode 100644 index 0000000000000000000000000000000000000000..50d197b0794872da078355e3e6acfa323a6ebef4 GIT binary patch literal 13512 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