From 630e1b870fc38f4f11f5d6ff5bb61f3bb735c577 Mon Sep 17 00:00:00 2001 From: KatolaZ Date: Sat, 31 Dec 2016 00:07:11 +0000 Subject: [PATCH] debian-package --- .../setnet-0.1/debian/README.Debian | 21 + .../setnet-0.1/debian/README.source | 10 + debian_package/setnet-0.1/debian/changelog | 5 + debian_package/setnet-0.1/debian/compat | 1 + debian_package/setnet-0.1/debian/control | 17 + debian_package/setnet-0.1/debian/copyright | 21 + .../setnet-0.1/debian/debhelper-build-stamp | 1 + debian_package/setnet-0.1/debian/files | 1 + debian_package/setnet-0.1/debian/init.d.ex | 26 + debian_package/setnet-0.1/debian/install | 3 + debian_package/setnet-0.1/debian/manpage.1.ex | 56 + .../setnet-0.1/debian/manpage.sgml.ex | 154 +++ .../setnet-0.1/debian/manpage.xml.ex | 291 +++++ debian_package/setnet-0.1/debian/menu.ex | 2 + debian_package/setnet-0.1/debian/postinst.ex | 39 + debian_package/setnet-0.1/debian/postrm.ex | 37 + debian_package/setnet-0.1/debian/preinst.ex | 35 + debian_package/setnet-0.1/debian/prerm.ex | 38 + debian_package/setnet-0.1/debian/rules | 25 + .../setnet-0.1/debian/setnet-docs.docs | 2 + .../setnet-0.1/debian/setnet.cron.d.ex | 4 + .../setnet-0.1/debian/setnet.debhelper.log | 19 + .../setnet-0.1/debian/setnet.default.ex | 10 + .../setnet-0.1/debian/setnet.doc-base.EX | 20 + .../setnet-0.1/debian/setnet.substvars | 2 + .../setnet-0.1/debian/setnet/DEBIAN/conffiles | 2 + .../setnet-0.1/debian/setnet/DEBIAN/control | 13 + .../setnet-0.1/debian/setnet/DEBIAN/md5sums | 4 + .../setnet-0.1/debian/setnet/etc/setnetrc | 19 + .../setnet/etc/wpa_supplicant/wpa_setnet.conf | 3 + .../debian/setnet/usr/sbin/setnet.sh | 1120 +++++++++++++++++ .../setnet/usr/share/doc/setnet/README.Debian | 21 + .../usr/share/doc/setnet/changelog.Debian.gz | Bin 0 -> 188 bytes .../setnet/usr/share/doc/setnet/copyright | 21 + .../setnet-0.1/debian/source/format | 1 + debian_package/setnet-0.1/debian/watch.ex | 39 + debian_package/setnet-0.1/setnet.sh | 1120 +++++++++++++++++ debian_package/setnet-0.1/setnetrc | 19 + debian_package/setnet-0.1/wpa_setnet.conf | 3 + debian_package/setnet_0.1-1.debian.tar.xz | Bin 0 -> 8192 bytes debian_package/setnet_0.1-1.dsc | 20 + debian_package/setnet_0.1-1_all.deb | Bin 0 -> 8332 bytes debian_package/setnet_0.1-1_amd64.changes | 31 + debian_package/setnet_0.1.orig.tar.xz | Bin 0 -> 14092 bytes 44 files changed, 3276 insertions(+) create mode 100644 debian_package/setnet-0.1/debian/README.Debian create mode 100644 debian_package/setnet-0.1/debian/README.source create mode 100644 debian_package/setnet-0.1/debian/changelog create mode 100644 debian_package/setnet-0.1/debian/compat create mode 100644 debian_package/setnet-0.1/debian/control create mode 100644 debian_package/setnet-0.1/debian/copyright create mode 100644 debian_package/setnet-0.1/debian/debhelper-build-stamp create mode 100644 debian_package/setnet-0.1/debian/files create mode 100644 debian_package/setnet-0.1/debian/init.d.ex create mode 100644 debian_package/setnet-0.1/debian/install create mode 100644 debian_package/setnet-0.1/debian/manpage.1.ex create mode 100644 debian_package/setnet-0.1/debian/manpage.sgml.ex create mode 100644 debian_package/setnet-0.1/debian/manpage.xml.ex create mode 100644 debian_package/setnet-0.1/debian/menu.ex create mode 100644 debian_package/setnet-0.1/debian/postinst.ex create mode 100644 debian_package/setnet-0.1/debian/postrm.ex create mode 100644 debian_package/setnet-0.1/debian/preinst.ex create mode 100644 debian_package/setnet-0.1/debian/prerm.ex create mode 100755 debian_package/setnet-0.1/debian/rules create mode 100644 debian_package/setnet-0.1/debian/setnet-docs.docs create mode 100644 debian_package/setnet-0.1/debian/setnet.cron.d.ex create mode 100644 debian_package/setnet-0.1/debian/setnet.debhelper.log create mode 100644 debian_package/setnet-0.1/debian/setnet.default.ex create mode 100644 debian_package/setnet-0.1/debian/setnet.doc-base.EX create mode 100644 debian_package/setnet-0.1/debian/setnet.substvars create mode 100644 debian_package/setnet-0.1/debian/setnet/DEBIAN/conffiles create mode 100644 debian_package/setnet-0.1/debian/setnet/DEBIAN/control create mode 100644 debian_package/setnet-0.1/debian/setnet/DEBIAN/md5sums create mode 100644 debian_package/setnet-0.1/debian/setnet/etc/setnetrc create mode 100644 debian_package/setnet-0.1/debian/setnet/etc/wpa_supplicant/wpa_setnet.conf create mode 100755 debian_package/setnet-0.1/debian/setnet/usr/sbin/setnet.sh create mode 100644 debian_package/setnet-0.1/debian/setnet/usr/share/doc/setnet/README.Debian create mode 100644 debian_package/setnet-0.1/debian/setnet/usr/share/doc/setnet/changelog.Debian.gz create mode 100644 debian_package/setnet-0.1/debian/setnet/usr/share/doc/setnet/copyright create mode 100644 debian_package/setnet-0.1/debian/source/format create mode 100644 debian_package/setnet-0.1/debian/watch.ex create mode 100755 debian_package/setnet-0.1/setnet.sh create mode 100644 debian_package/setnet-0.1/setnetrc create mode 100644 debian_package/setnet-0.1/wpa_setnet.conf create mode 100644 debian_package/setnet_0.1-1.debian.tar.xz create mode 100644 debian_package/setnet_0.1-1.dsc create mode 100644 debian_package/setnet_0.1-1_all.deb create mode 100644 debian_package/setnet_0.1-1_amd64.changes create mode 100644 debian_package/setnet_0.1.orig.tar.xz diff --git a/debian_package/setnet-0.1/debian/README.Debian b/debian_package/setnet-0.1/debian/README.Debian new file mode 100644 index 0000000..7c41578 --- /dev/null +++ b/debian_package/setnet-0.1/debian/README.Debian @@ -0,0 +1,21 @@ +setnet for Debian +---------------- + +setnet is a simple bash+dialog tool to congfigure ethernet and wifi networks. +It is still at alpha stage, so you should use it AT YOUR OWN RISK. + + +=== USAGE === + +setnet is installed under /usr/sbin/setnet.sh and by default it uses the file +/etc/setnetrc for configuration. There are currently only two defined variables +in setnetrc, namely + + - WPA_FILE + This is the file configuration file used by wpa_supplicant + - LOGNAME + This is the file where logs will be put + + + + -- Vincenzo (KatolaZ) Nicosia Fri, 30 Dec 2016 16:06:26 +0000 diff --git a/debian_package/setnet-0.1/debian/README.source b/debian_package/setnet-0.1/debian/README.source new file mode 100644 index 0000000..46b1c87 --- /dev/null +++ b/debian_package/setnet-0.1/debian/README.source @@ -0,0 +1,10 @@ +setnet for Debian +---------------- + + + + + + -- Vincenzo (KatolaZ) Nicosia Fri, 30 Dec 2016 16:06:26 +0000 + diff --git a/debian_package/setnet-0.1/debian/changelog b/debian_package/setnet-0.1/debian/changelog new file mode 100644 index 0000000..1c9d39b --- /dev/null +++ b/debian_package/setnet-0.1/debian/changelog @@ -0,0 +1,5 @@ +setnet (0.1-1) unstable; urgency=medium + + * Initial release (Closes: #nnnn) + + -- Vincenzo (KatolaZ) Nicosia Fri, 30 Dec 2016 16:06:26 +0000 diff --git a/debian_package/setnet-0.1/debian/compat b/debian_package/setnet-0.1/debian/compat new file mode 100644 index 0000000..ec63514 --- /dev/null +++ b/debian_package/setnet-0.1/debian/compat @@ -0,0 +1 @@ +9 diff --git a/debian_package/setnet-0.1/debian/control b/debian_package/setnet-0.1/debian/control new file mode 100644 index 0000000..256ad38 --- /dev/null +++ b/debian_package/setnet-0.1/debian/control @@ -0,0 +1,17 @@ +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, dialog, iproute2, dhclient +Suggests: wpasupplicant +Description: simple bash+dialog tool to configure networks + setnet is a relatively simple bash+dialog tool to configure ethernet + and wifi connections. diff --git a/debian_package/setnet-0.1/debian/copyright b/debian_package/setnet-0.1/debian/copyright new file mode 100644 index 0000000..f425891 --- /dev/null +++ b/debian_package/setnet-0.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.1/debian/debhelper-build-stamp b/debian_package/setnet-0.1/debian/debhelper-build-stamp new file mode 100644 index 0000000..c166bc0 --- /dev/null +++ b/debian_package/setnet-0.1/debian/debhelper-build-stamp @@ -0,0 +1 @@ +setnet diff --git a/debian_package/setnet-0.1/debian/files b/debian_package/setnet-0.1/debian/files new file mode 100644 index 0000000..149e7b2 --- /dev/null +++ b/debian_package/setnet-0.1/debian/files @@ -0,0 +1 @@ +setnet_0.1-1_all.deb unknown optional diff --git a/debian_package/setnet-0.1/debian/init.d.ex b/debian_package/setnet-0.1/debian/init.d.ex new file mode 100644 index 0000000..08360e2 --- /dev/null +++ b/debian_package/setnet-0.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.1/debian/install b/debian_package/setnet-0.1/debian/install new file mode 100644 index 0000000..7385031 --- /dev/null +++ b/debian_package/setnet-0.1/debian/install @@ -0,0 +1,3 @@ +setnet.sh /usr/sbin +setnetrc /etc/ +wpa_setnet.conf /etc/wpa_supplicant/ diff --git a/debian_package/setnet-0.1/debian/manpage.1.ex b/debian_package/setnet-0.1/debian/manpage.1.ex new file mode 100644 index 0000000..8c3ca6b --- /dev/null +++ b/debian_package/setnet-0.1/debian/manpage.1.ex @@ -0,0 +1,56 @@ +.\" Hey, EMACS: -*- nroff -*- +.\" (C) Copyright 2016 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 "December 30 2016" +.\" 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.1/debian/manpage.sgml.ex b/debian_package/setnet-0.1/debian/manpage.sgml.ex new file mode 100644 index 0000000..c87d8aa --- /dev/null +++ b/debian_package/setnet-0.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"> + + December 30 2016"> + + 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.1/debian/manpage.xml.ex b/debian_package/setnet-0.1/debian/manpage.xml.ex new file mode 100644 index 0000000..ae9864a --- /dev/null +++ b/debian_package/setnet-0.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.1/debian/menu.ex b/debian_package/setnet-0.1/debian/menu.ex new file mode 100644 index 0000000..3f6b8bb --- /dev/null +++ b/debian_package/setnet-0.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.1/debian/postinst.ex b/debian_package/setnet-0.1/debian/postinst.ex new file mode 100644 index 0000000..63f6b54 --- /dev/null +++ b/debian_package/setnet-0.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.1/debian/postrm.ex b/debian_package/setnet-0.1/debian/postrm.ex new file mode 100644 index 0000000..14fe7e0 --- /dev/null +++ b/debian_package/setnet-0.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.1/debian/preinst.ex b/debian_package/setnet-0.1/debian/preinst.ex new file mode 100644 index 0000000..09a88b6 --- /dev/null +++ b/debian_package/setnet-0.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.1/debian/prerm.ex b/debian_package/setnet-0.1/debian/prerm.ex new file mode 100644 index 0000000..725e2b8 --- /dev/null +++ b/debian_package/setnet-0.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.1/debian/rules b/debian_package/setnet-0.1/debian/rules new file mode 100755 index 0000000..2f54c47 --- /dev/null +++ b/debian_package/setnet-0.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.1/debian/setnet-docs.docs b/debian_package/setnet-0.1/debian/setnet-docs.docs new file mode 100644 index 0000000..efea0a6 --- /dev/null +++ b/debian_package/setnet-0.1/debian/setnet-docs.docs @@ -0,0 +1,2 @@ +README.Debian +README.source diff --git a/debian_package/setnet-0.1/debian/setnet.cron.d.ex b/debian_package/setnet-0.1/debian/setnet.cron.d.ex new file mode 100644 index 0000000..fd54f7d --- /dev/null +++ b/debian_package/setnet-0.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.1/debian/setnet.debhelper.log b/debian_package/setnet-0.1/debian/setnet.debhelper.log new file mode 100644 index 0000000..73fb7fd --- /dev/null +++ b/debian_package/setnet-0.1/debian/setnet.debhelper.log @@ -0,0 +1,19 @@ +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_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.1/debian/setnet.default.ex b/debian_package/setnet-0.1/debian/setnet.default.ex new file mode 100644 index 0000000..ade741e --- /dev/null +++ b/debian_package/setnet-0.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.1/debian/setnet.doc-base.EX b/debian_package/setnet-0.1/debian/setnet.doc-base.EX new file mode 100644 index 0000000..42bd26a --- /dev/null +++ b/debian_package/setnet-0.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.1/debian/setnet.substvars b/debian_package/setnet-0.1/debian/setnet.substvars new file mode 100644 index 0000000..978fc8b --- /dev/null +++ b/debian_package/setnet-0.1/debian/setnet.substvars @@ -0,0 +1,2 @@ +misc:Depends= +misc:Pre-Depends= diff --git a/debian_package/setnet-0.1/debian/setnet/DEBIAN/conffiles b/debian_package/setnet-0.1/debian/setnet/DEBIAN/conffiles new file mode 100644 index 0000000..3479547 --- /dev/null +++ b/debian_package/setnet-0.1/debian/setnet/DEBIAN/conffiles @@ -0,0 +1,2 @@ +/etc/setnetrc +/etc/wpa_supplicant/wpa_setnet.conf diff --git a/debian_package/setnet-0.1/debian/setnet/DEBIAN/control b/debian_package/setnet-0.1/debian/setnet/DEBIAN/control new file mode 100644 index 0000000..6dee539 --- /dev/null +++ b/debian_package/setnet-0.1/debian/setnet/DEBIAN/control @@ -0,0 +1,13 @@ +Package: setnet +Version: 0.1-1 +Architecture: all +Maintainer: Vincenzo (KatolaZ) Nicosia +Installed-Size: 64 +Depends: bash, dialog, iproute2, dhclient +Suggests: wpasupplicant +Section: unknown +Priority: optional +Homepage: http://kalos.mine.nu/setnet +Description: simple bash+dialog tool to configure networks + setnet is a relatively simple bash+dialog tool to configure ethernet + and wifi connections. diff --git a/debian_package/setnet-0.1/debian/setnet/DEBIAN/md5sums b/debian_package/setnet-0.1/debian/setnet/DEBIAN/md5sums new file mode 100644 index 0000000..d5492f6 --- /dev/null +++ b/debian_package/setnet-0.1/debian/setnet/DEBIAN/md5sums @@ -0,0 +1,4 @@ +8ca53becf53712ce6d851a60622b5df5 usr/sbin/setnet.sh +14d36df6a96346c9126ffe5cb4c2bbd6 usr/share/doc/setnet/README.Debian +d47fe95e38c07c7ab04d65e36ba03614 usr/share/doc/setnet/changelog.Debian.gz +e5218c2f383b136780a03ba5e3f610b2 usr/share/doc/setnet/copyright diff --git a/debian_package/setnet-0.1/debian/setnet/etc/setnetrc b/debian_package/setnet-0.1/debian/setnet/etc/setnetrc new file mode 100644 index 0000000..d460eed --- /dev/null +++ b/debian_package/setnet-0.1/debian/setnet/etc/setnetrc @@ -0,0 +1,19 @@ +## +## +## setnetrc -- configuration file for setnet +## +## + +## +## The default configuration file for wpa_supplicant +## +WPA_FILE=/etc/wpa_supplicant/wpa_setnet.conf + + +## +## Logfile +## +LOGFILE=/var/log/setnet.log + + + diff --git a/debian_package/setnet-0.1/debian/setnet/etc/wpa_supplicant/wpa_setnet.conf b/debian_package/setnet-0.1/debian/setnet/etc/wpa_supplicant/wpa_setnet.conf new file mode 100644 index 0000000..07d4b6d --- /dev/null +++ b/debian_package/setnet-0.1/debian/setnet/etc/wpa_supplicant/wpa_setnet.conf @@ -0,0 +1,3 @@ +ctrl_interface=/var/run/wpa_supplicant +update_config=1 + diff --git a/debian_package/setnet-0.1/debian/setnet/usr/sbin/setnet.sh b/debian_package/setnet-0.1/debian/setnet/usr/sbin/setnet.sh new file mode 100755 index 0000000..e5cba98 --- /dev/null +++ b/debian_package/setnet-0.1/debian/setnet/usr/sbin/setnet.sh @@ -0,0 +1,1120 @@ +#!/bin/bash + +# 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 +# +# ---------------------------------------------------------------------- +# +# (c) KatolaZ (katolaz@freaknet.org) -- 2016/12/26 +# +# + + +## +## Initialisation +## + +VERSION=0.1 + +DIALOGRC=~/.dialogrc + + +TOPSTR="setnet-0.1 [user: `id -run`]" + +DIALOG="dialog --backtitle \"${TOPSTR}\" " + + + +TMPFILE=`(tempfile) 2>/dev/null` || tempfile=/tmp/setnet_$$ +WPA_PIDFILE=`(tempfile) 2>/dev/null` || tempfile=/tmp/setnet_wpapid_$$ + +WINDOW_WIDTH=75 +WINDOW_HEIGHT=20 + +INFO_WIDTH=40 +INFO_HEIGHT=10 + +FORM_WIDTH=60 +FORM_HEIGHT=12 + +NET_FAMILIES="inet inet6" + +## +## Load setnetrc +## + +function load_setnetrc(){ + + WPA_FILE="" + LOGFILE="" + ## If we were given a parameter, 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 + . /etc/setnetrc + fi + + ## + ## 2) ~/.setnetrc + ## + + if [ -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 +} + + +function cleanup(){ + rm -f ${TMPFILE} + rm -f ${WPA_PIDFILE} +} + + +################### +# # +# LOGGING # +# # +################### + +## +## log() takes two arguments, namely the label and the message +## +## if the label is "_self", print the name of the function which +## called log() +## +function log(){ + + local LABEL=$1 + local MSG=$2 + + if [ ${LABEL} == "_self" ]; then + LABEL=${FUNCNAME[1]} + fi + echo -e "${LABEL}:" "${MSG}" >> "${LOGFILE}" + +} + +########################################## + +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} --clear --msgbox 'File ${FILEIN} saved successfully' \ + ${INFO_HEIGHT} ${INFO_WIDTH}" + else + eval "${DIALOG} --clear --msgbox 'Error saving file ${FILEIN}' \ + ${INFO_HEIGHT} ${INFO_WIDTH}" + fi + else + log "edit_file" "Editing of ${FILEIN} aborted..."xs + eval "${DIALOG} --clear --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 ${DEVFAMILY} | wc -l` + 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 [ ${DEVNAME} == "" ]; then + return -1 + fi + + DEVMAC=`ip link show ${DEVNAME} | tail -n +2 | sed -r 's/^\ +//g' | cut -d " " -f 2` + DEVCONF="MAC: ${DEVMAC}\n" + + log "_self" "NET_FAMILIES: \"${NET_FAMILIES}\"" + + for f in ${NET_FAMILIES}; do + get_addr_family ${DEVNAME} ${f} + log "_self" "family: ${f} ADDR_STR: \"${ADDR_STR}\"" + + if [ -z "${ADDR_STR}" ]; then + DEVCONF="${DEVCONF}${f}: Unconfigured\n" + else + DEVCONF="${DEVCONF}${ADDR_STR}" + fi + log "_self" "DEVCONF: ${DEVCONF}" + done + + DEVCONF="${DEVCONF}\n== name servers ==\n`cat /etc/resolv.conf | grep '^nameserver'`" + + eval "${DIALOG} --clear --title 'Current configuration of device: ${DEVNAME}' \ + --msgbox '\n\n${DEVCONF}' ${WINDOW_HEIGHT} ${WINDOW_WIDTH} " + return 0 + +} + + + +function config_ethernet_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} --clear --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 ${DEV_IP}\n${DEV_NET}\n${DEV_NETMASK}\n${DEV_GW}\n${DEV_DNS1}\n${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 + ip route flush dev ${DEVNAME} + ip route add ${DEV_NET}/${DEV_NETMASK} dev ${DEVNAME} + ip route add default via ${DEV_GW} + + ## Configure DNS + 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} +} + +function config_ethernet_dhcp(){ + + local DEVNAME=$1 + + eval "${DIALOG} --infobox 'Running \"dhclient ${DEVNAME}\"' ${INFO_HEIGHT} ${INFO_WIDTH}" + dhclient -r ${DEVNAME} + dhclient ${DEVNAME} + show_device_conf ${DEVNAME} +} + + +function config_ethernet(){ + + local DEVNAME=$1 + + while [ 1 -eq 1 ]; do + eval "${DIALOG} --clear --cancel-label 'Up' \ + --menu 'Configuring ${DEVNAME}' ${INFO_HEIGHT} ${INFO_WIDTH} 4 \ + 'DHCP' ''\ + 'Static' '' 2>${TMPFILE}" + if [ $? -eq 1 ]; then + return + fi + ACTION=`<${TMPFILE}` + case ${ACTION} in + "Static") + config_ethernet_static ${DEVNAME} + ;; + "DHCP") + config_ethernet_dhcp ${DEVNAME} + ;; + esac + done + +} + +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 "${FUNCNAME[0]}" "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 -i disabled | wc -l` + if [ ${IS_DIS} -eq 1 ]; then + STATUS="(DIS)" + else + STATUS="(ENAB)" + fi + IS_CUR=`echo ${NETFLAGS} | sed -r -e 's/\[//g;s/\]//g' | grep -i current | wc -l` + if [ ${IS_CUR} -eq 1 ]; then + STATUS="${STATUS}(CUR)" + fi + + + NETLIST="${NETLIST} ${NETNUM} \"${NETESSID}-${STATUS}\"" + done < ${TMPFILE} + IFS=${LAST_IFS} + + log "_self" "NETLIST: ${NETLIST}" +} + + +## +## Manage the authentication for a given wifi ESSID +## +function wifi_authenticate(){ + + local DEVNAME=$1 + local W_MAC=$2 + + + log "${FUNCNAME[0]}" "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 "${FUNCNAME[0]}" "configuring essid: ${W_ESSID} on device: ${DEVNAME}" + log "${FUNCNAME[0]}" "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 "${W_ESSID}$" | wc -l` + if [ ${NET_EXISTS} -ne 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=`<${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 "WPA.*-PSK" | wc -l` + + log "${FUNCNAME[0]}" "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} --clear --msgbox 'Network configuration aborted!!!' \ + ${INFO_HEIGHT} ${INFO_WIDTH}" + return 1 + fi + PSK=`<${TMPFILE}` + PSK_LENGTH=${#PSK} + done + + + NET_NUM=`wpa_cli -i ${DEVNAME} add_network | tail -1` + + log "${FUNCNAME[0]}" `wpa_cli -i ${DEVNAME} set_network ${NET_NUM} ssid "\"${W_ESSID}\""` + log "${FUNCNAME[0]}" `wpa_cli -i ${DEVNAME} set_network ${NET_NUM} psk \"${PSK}\"` + ## remove the password from tmpfile + echo "" > ${TMPFILE} + eval "${DIALOG} --clear --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 "ESS" | wc -l` + + log "_self" "HAS_ESS: \"${HAS_ESS}\"" + + if [ ${HAS_ESS} != "0" ]; then + NET_NUM=`wpa_cli -i ${DEVNAME} add_network | tail -1` + + log "_self" "NET_NUM: ${NET_NUM}" + log "_self" `wpa_cli -i ${DEVNAME} set_network ${NET_NUM} ssid "\"${W_ESSID}\""` + log "_self" `wpa_cli -i ${DEVNAME} set_network ${NET_NUM} key_mgmt NONE` + eval "${DIALOG} --clear --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 "_self" "W_ESSID: \"${W_ESSID}\"" + wifinets+=(${W_MAC} "${W_ESSID} -- ${W_FLAGS}") + done < ${TMPFILE} + IFS=${LAST_IFS} + + + log "$_self" "Wifi nets: \n${wifinets}\n===" + 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 [ $? -ne 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=`<${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=`<${TMPFILE}` + WPA_STATUS=`wpa_cli -i ${DEVNAME} remove_network ${NETNUM} | tail -1 ` + if [ ${WPA_STATUS} == "OK" ]; then + eval "${DIALOG} --clear --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} --clear --msgbox 'Network ${NETNUM} NOT removed' \ + ${INFO_HEIGHT} ${INFO_WIDTH}" + return + fi + else + eval "${DIALOG} --clear --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 "${FUNCNAME[0]}" "WPA_PID: ${WPA_PID}" + kill -n 9 ${WPA_PID} + + if [ $? -ne 0 ]; then + eval "${DIALOG} --clear --msgbox 'Error killing wpa_supplicant' \ + ${INFO_HEIGHT} ${INFO_WIDTH}" + fi + + wpa_supplicant -B -i ${DEVNAME} -c ${WPA_FILE} -P${WPA_PIDFILE} + WPA_PID=`ps ax | grep wpa_supplicant | grep " -i ${DEVNAME}" | cut -d " " -f 1 ` + WPA_PID_SAVED=`<${WPA_PIDFILE}` + if [ [ -n ${WPA_PID} ] || [ ${WPA_PID} != ${WPA_PID_SAVED} ] ]; then + eval "${DIALOG} --clear --msgbox 'Error restarting wpa_supplicant' \ + ${INFO_HEIGHT} ${INFO_WIDTH}" + else + eval "${DIALOG} --clear --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=`<${TMPFILE}` + WPA_STATUS=`wpa_cli -i ${DEVNAME} enable ${NETNUM} | tail -1 ` + if [ ${WPA_STATUS} == "OK" ]; then + eval "${DIALOG} --clear --msgbox 'Network ${NETNUM} enabled' \ + ${INFO_HEIGHT} ${INFO_WIDTH}" + config_ethernet ${DEVNAME} + return + else + eval "${DIALOG} --clear --msgbox 'Network ${NETNUM} NOT enabled' \ + ${INFO_HEIGHT} ${INFO_WIDTH}" + return + fi + else + eval "${DIALOG} --clear --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=`<${TMPFILE}` + WPA_STATUS=`wpa_cli -i ${DEVNAME} disable ${NETNUM} | tail -1 ` + if [ ${WPA_STATUS} == "OK" ]; then + eval "${DIALOG} --clear --msgbox 'Network ${NETNUM} disabled' \ + ${INFO_HEIGHT} ${INFO_WIDTH}" + return + else + eval "${DIALOG} --clear --msgbox 'Network ${NETNUM} NOT disabled' \ + ${INFO_HEIGHT} ${INFO_WIDTH}" + return + fi + else + eval "${DIALOG} --clear --msgbox 'No network disabled!!!' \ + ${INFO_HEIGHT} ${INFO_WIDTH}" + return + fi +} + + + +function wifi_load_file(){ + + local DEVNAME=$1 + + eval "${DIALOG} --fselect ${WPA_FILE} ${WINDOW_HEIGHT} ${WINDOW_WIDTH} \ + 2>${TMPFILE}|" + + if [ $? -eq 0 ]; then + SEL_FILE=`<${TMPFILE}` + while [ -d ${SEL_FILE} ]; do + eval "${DIALOG} --fselect ${SEL_FILE} ${WINDOW_HEIGHT} ${WINDOW_WIDTH} \ + 2>${TMPFILE}" + if [ $? -eq 0 ]; then + SEL_FILE=`<${TMPFILE}` + else + eval "${DIALOG} --clear --infobox 'WPA_FILE was not modified' \ + ${INFO_HEIGHT} ${INFO_WIDTH}" + return + fi + done + + if [ -f ${SEL_FILE} ]; then + WPA_FILE=${SEL_FILE} + eval "${DIALOG} --clear --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} --clear --infobox 'Invalid file name!\n WPA_FILE *not* changed' \ + ${WINDOW_HEIGHT} ${WINDOW_WIDTH}" + return + fi + else + eval "${DIALOG} --clear --infobox 'WPA_FILE was not modified' \ + ${INFO_HEIGHT} ${INFO_WIDTH}" + fi + +} + + + +function config_wifi(){ + + local DEVNAME=$1 + + while [ 1 -eq 1 ]; do + eval "${DIALOG} --clear --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 [ $? -eq 1 ]; then + return + fi + ACTION=`<${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") + eval "${DIALOG} --msgbox 'Sorry!Not yet implemented!' \ + ${INFO_HEIGHT} ${INFO_WIDTH} 2>${TMPFILE}" + ;; + esac + done + +} + + + +## +## (Re)-Configure a network device +## + +function configure_device(){ + + local DEVNAME=$1 + + case ${DEVNAME} in + eth*) + config_ethernet ${DEVNAME} + ;; + wlan*) + config_wifi ${DEVNAME} + ;; + *) + eval "${DIALOG} --clear --title 'ERROR' --msgbox \ + '${DEVNAME}: Unsupported device type' \ + ${WINDOW_HEIGHT} ${WINDOW_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 [ 1 -eq 1 ]; do + eval "${DIALOG} --clear --cancel-label 'Up' --menu 'Device: ${DEVNAME}' \ + ${WINDOW_HEIGHT} ${WINDOW_WIDTH} 8 \ + 'View' 'View current configuration' \ + 'Conf' 'Configure device' \ + 'Start' 'Bring interface up' \ + 'Stop' 'Put interface down' \ + 'Restart' 'Restart interface' 2> ${TMPFILE}" + + if [ $? -eq 1 ]; then + return + fi + + DEV_ACTION=`<${TMPFILE}` + case ${DEV_ACTION} in + "View") + show_device_conf ${DEVNAME} + ;; + "Conf") + configure_device ${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() { + + DEVFILE=/proc/net/dev + DEVICES=`ip link show | awk 'NR % 2 == 1' | cut -d ":" -f 2` + + DEVICE_TAGS="" + + for i in `echo $DEVICES`; do + if [ $i != "lo" ]; then + DEVICE_TAGS="${DEVICE_TAGS} $i $i" + fi + done + + eval "${DIALOG} --clear --cancel-label 'Up' \ + --menu 'Select Interface to configure' ${WINDOW_HEIGHT} ${WINDOW_WIDTH} 4 \ + ${DEVICE_TAGS} 2> ${TMPFILE}" + return $? +} + + +function dev_config_menu(){ + + while [ 1 -eq 1 ]; do + show_devs + if [ $? -eq 1 ]; then + return + fi + DEVNAME=`<${TMPFILE}` + show_device_menu ${DEVNAME} + done +} + +function show_info(){ + + cat < ${TMPFILE} + +== setnet.sh 0.1 == + +setnet.sh is a simple state-less tool to manage and configure network +interfaces. It is a shell wrapper around the functionalities of "ip", +"dhclient", "wpa_cli", and can be used to configure network +connections via Ethernet/Wi-Fi interfaces. + +Both Static and DHCP-based IP configuration is supported. + +At the moment, only WPA-PSK and open (no key) Wi-Fi connections are +available. + +EOF + eval "${DIALOG} --clear --cr-wrap --textbox ${TMPFILE} ${WINDOW_HEIGHT} ${WINDOW_WIDTH}" + return +} + +function show_copyright(){ + + cat < ${TMPFILE} + +== setnet.sh 0.1 == + +(c) KatolaZ (katolaz@freaknet.org) -- 2016 + +EOF + eval "${DIALOG} --clear --cr-wrap --textbox ${TMPFILE} ${WINDOW_HEIGHT} ${WINDOW_WIDTH}" + return +} + + +function show_license(){ + + cat < ${TMPFILE} + +== setnet.sh 0.1 == + +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 . + +---------------------------------------------------------------------- + + (c) KatolaZ -- 2016 + +---------------------------------------------------------------------- + +EOF + eval "${DIALOG} --clear --cr-wrap --textbox ${TMPFILE} ${WINDOW_HEIGHT} ${WINDOW_WIDTH}" + return +} + + + +function about_menu(){ + + while [ 1 -eq 1 ]; do + eval "${DIALOG} --cancel-label 'Up' --menu 'setnet ${VERSION} -- About' \ + ${WINDOW_HEIGHT} ${WINDOW_WIDTH} 6 \ + 'Info' 'General information' \ + 'Copyright' 'Copyright information' \ + 'License' 'How to distribute this program' \ + 2> ${TMPFILE}" + if [ $? -eq 1 ];then + return; + fi + + ACTION=`<${TMPFILE}` + case ${ACTION} in + "Info") + show_info + ;; + "Copyright") + show_copyright + ;; + "License") + show_license + ;; + esac + done +} + + +function show_toplevel(){ + + eval "${DIALOG} --clear --cancel-label 'Quit' --menu 'Main Menu' \ + ${WINDOW_HEIGHT} ${WINDOW_WIDTH} 6 \ + 'Setup' 'Setup interfaces' \ + 'About' 'Info & Copyright' 2> ${TMPFILE}" + return $? +} + +function show_help(){ + + local SCRIPTNAME=$1 + echo "Usage: ${SCRIPTNAME} [OPTION]" + echo "Options:" + echo -e "\t -c cfg_file\tLoad configuration from cfg_file." + echo -e "\t -v\t\tPrint version number and exit. " + echo -e "\t -h\t\tShow this help." + +} + +function show_version(){ + + local SCRIPTNAME=$1 + echo "${SCRIPTNAME} -- version ${VERSION}" + echo "Copyright (C) Vincenzo \"KatolaZ\" Nicosia (katolaz@freaknet.org) -- 2016" + 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 0.1 == + + (c) KatolaZ (katolaz@freaknet.org) -- 2016 + + -+- This is the alpha 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 + copyright and license +EOF + + eval "${DIALOG} --clear --cr-wrap --textbox ${TMPFILE} 23 60" + return +} + + +function main(){ + + truncate -s 0 ${LOGFILE} + trap cleanup 0 $SIG_NONE $SIG_HUP $SIG_INT $SIG_TRAP $SIG_TERM + + show_disclaimer + + log "setnet" "Starting afresh on `date`" + 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 [ 1 -eq 1 ]; do + show_toplevel + if [ $? -eq 1 ]; then + cleanup + exit 1 + fi + ACTION=`<${TMPFILE}` + case ${ACTION} in + "Setup") + dev_config_menu + ;; + "About") + about_menu + ;; + esac + done + +} + + +## +## Get the options +## + +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_setnetrc ${SETNETRC} + +main + + diff --git a/debian_package/setnet-0.1/debian/setnet/usr/share/doc/setnet/README.Debian b/debian_package/setnet-0.1/debian/setnet/usr/share/doc/setnet/README.Debian new file mode 100644 index 0000000..7c41578 --- /dev/null +++ b/debian_package/setnet-0.1/debian/setnet/usr/share/doc/setnet/README.Debian @@ -0,0 +1,21 @@ +setnet for Debian +---------------- + +setnet is a simple bash+dialog tool to congfigure ethernet and wifi networks. +It is still at alpha stage, so you should use it AT YOUR OWN RISK. + + +=== USAGE === + +setnet is installed under /usr/sbin/setnet.sh and by default it uses the file +/etc/setnetrc for configuration. There are currently only two defined variables +in setnetrc, namely + + - WPA_FILE + This is the file configuration file used by wpa_supplicant + - LOGNAME + This is the file where logs will be put + + + + -- Vincenzo (KatolaZ) Nicosia Fri, 30 Dec 2016 16:06:26 +0000 diff --git a/debian_package/setnet-0.1/debian/setnet/usr/share/doc/setnet/changelog.Debian.gz b/debian_package/setnet-0.1/debian/setnet/usr/share/doc/setnet/changelog.Debian.gz new file mode 100644 index 0000000000000000000000000000000000000000..a71856be43bb0ccf27471e3d47af09bce532d6b5 GIT binary patch literal 188 zcmV;t07L&DiwFP!00002109ad3W7iwMfX0%g*I9#qk#)E35r01Xb~;ijrM7S;|$Et zLZ3eCY%ZL|uZ>v$t+4{v%>?Q|IFE&Lb+z#6p@PH+iBlDH*=C#fyj z0xPu;0p)KYEZm3C_#VoS4H@VTllBJn<6bRSag3)>EvZ=}ymF@{e?_>7R$IYQ4u3Nr qJ41X}>Jn}G3b+`t#g5@jEi#toNb`c_MV4d37J@I_jppUc0001`6Hn*> literal 0 HcmV?d00001 diff --git a/debian_package/setnet-0.1/debian/setnet/usr/share/doc/setnet/copyright b/debian_package/setnet-0.1/debian/setnet/usr/share/doc/setnet/copyright new file mode 100644 index 0000000..f425891 --- /dev/null +++ b/debian_package/setnet-0.1/debian/setnet/usr/share/doc/setnet/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.1/debian/source/format b/debian_package/setnet-0.1/debian/source/format new file mode 100644 index 0000000..163aaf8 --- /dev/null +++ b/debian_package/setnet-0.1/debian/source/format @@ -0,0 +1 @@ +3.0 (quilt) diff --git a/debian_package/setnet-0.1/debian/watch.ex b/debian_package/setnet-0.1/debian/watch.ex new file mode 100644 index 0000000..0f01132 --- /dev/null +++ b/debian_package/setnet-0.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.1/setnet.sh b/debian_package/setnet-0.1/setnet.sh new file mode 100755 index 0000000..e5cba98 --- /dev/null +++ b/debian_package/setnet-0.1/setnet.sh @@ -0,0 +1,1120 @@ +#!/bin/bash + +# 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 +# +# ---------------------------------------------------------------------- +# +# (c) KatolaZ (katolaz@freaknet.org) -- 2016/12/26 +# +# + + +## +## Initialisation +## + +VERSION=0.1 + +DIALOGRC=~/.dialogrc + + +TOPSTR="setnet-0.1 [user: `id -run`]" + +DIALOG="dialog --backtitle \"${TOPSTR}\" " + + + +TMPFILE=`(tempfile) 2>/dev/null` || tempfile=/tmp/setnet_$$ +WPA_PIDFILE=`(tempfile) 2>/dev/null` || tempfile=/tmp/setnet_wpapid_$$ + +WINDOW_WIDTH=75 +WINDOW_HEIGHT=20 + +INFO_WIDTH=40 +INFO_HEIGHT=10 + +FORM_WIDTH=60 +FORM_HEIGHT=12 + +NET_FAMILIES="inet inet6" + +## +## Load setnetrc +## + +function load_setnetrc(){ + + WPA_FILE="" + LOGFILE="" + ## If we were given a parameter, 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 + . /etc/setnetrc + fi + + ## + ## 2) ~/.setnetrc + ## + + if [ -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 +} + + +function cleanup(){ + rm -f ${TMPFILE} + rm -f ${WPA_PIDFILE} +} + + +################### +# # +# LOGGING # +# # +################### + +## +## log() takes two arguments, namely the label and the message +## +## if the label is "_self", print the name of the function which +## called log() +## +function log(){ + + local LABEL=$1 + local MSG=$2 + + if [ ${LABEL} == "_self" ]; then + LABEL=${FUNCNAME[1]} + fi + echo -e "${LABEL}:" "${MSG}" >> "${LOGFILE}" + +} + +########################################## + +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} --clear --msgbox 'File ${FILEIN} saved successfully' \ + ${INFO_HEIGHT} ${INFO_WIDTH}" + else + eval "${DIALOG} --clear --msgbox 'Error saving file ${FILEIN}' \ + ${INFO_HEIGHT} ${INFO_WIDTH}" + fi + else + log "edit_file" "Editing of ${FILEIN} aborted..."xs + eval "${DIALOG} --clear --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 ${DEVFAMILY} | wc -l` + 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 [ ${DEVNAME} == "" ]; then + return -1 + fi + + DEVMAC=`ip link show ${DEVNAME} | tail -n +2 | sed -r 's/^\ +//g' | cut -d " " -f 2` + DEVCONF="MAC: ${DEVMAC}\n" + + log "_self" "NET_FAMILIES: \"${NET_FAMILIES}\"" + + for f in ${NET_FAMILIES}; do + get_addr_family ${DEVNAME} ${f} + log "_self" "family: ${f} ADDR_STR: \"${ADDR_STR}\"" + + if [ -z "${ADDR_STR}" ]; then + DEVCONF="${DEVCONF}${f}: Unconfigured\n" + else + DEVCONF="${DEVCONF}${ADDR_STR}" + fi + log "_self" "DEVCONF: ${DEVCONF}" + done + + DEVCONF="${DEVCONF}\n== name servers ==\n`cat /etc/resolv.conf | grep '^nameserver'`" + + eval "${DIALOG} --clear --title 'Current configuration of device: ${DEVNAME}' \ + --msgbox '\n\n${DEVCONF}' ${WINDOW_HEIGHT} ${WINDOW_WIDTH} " + return 0 + +} + + + +function config_ethernet_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} --clear --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 ${DEV_IP}\n${DEV_NET}\n${DEV_NETMASK}\n${DEV_GW}\n${DEV_DNS1}\n${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 + ip route flush dev ${DEVNAME} + ip route add ${DEV_NET}/${DEV_NETMASK} dev ${DEVNAME} + ip route add default via ${DEV_GW} + + ## Configure DNS + 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} +} + +function config_ethernet_dhcp(){ + + local DEVNAME=$1 + + eval "${DIALOG} --infobox 'Running \"dhclient ${DEVNAME}\"' ${INFO_HEIGHT} ${INFO_WIDTH}" + dhclient -r ${DEVNAME} + dhclient ${DEVNAME} + show_device_conf ${DEVNAME} +} + + +function config_ethernet(){ + + local DEVNAME=$1 + + while [ 1 -eq 1 ]; do + eval "${DIALOG} --clear --cancel-label 'Up' \ + --menu 'Configuring ${DEVNAME}' ${INFO_HEIGHT} ${INFO_WIDTH} 4 \ + 'DHCP' ''\ + 'Static' '' 2>${TMPFILE}" + if [ $? -eq 1 ]; then + return + fi + ACTION=`<${TMPFILE}` + case ${ACTION} in + "Static") + config_ethernet_static ${DEVNAME} + ;; + "DHCP") + config_ethernet_dhcp ${DEVNAME} + ;; + esac + done + +} + +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 "${FUNCNAME[0]}" "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 -i disabled | wc -l` + if [ ${IS_DIS} -eq 1 ]; then + STATUS="(DIS)" + else + STATUS="(ENAB)" + fi + IS_CUR=`echo ${NETFLAGS} | sed -r -e 's/\[//g;s/\]//g' | grep -i current | wc -l` + if [ ${IS_CUR} -eq 1 ]; then + STATUS="${STATUS}(CUR)" + fi + + + NETLIST="${NETLIST} ${NETNUM} \"${NETESSID}-${STATUS}\"" + done < ${TMPFILE} + IFS=${LAST_IFS} + + log "_self" "NETLIST: ${NETLIST}" +} + + +## +## Manage the authentication for a given wifi ESSID +## +function wifi_authenticate(){ + + local DEVNAME=$1 + local W_MAC=$2 + + + log "${FUNCNAME[0]}" "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 "${FUNCNAME[0]}" "configuring essid: ${W_ESSID} on device: ${DEVNAME}" + log "${FUNCNAME[0]}" "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 "${W_ESSID}$" | wc -l` + if [ ${NET_EXISTS} -ne 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=`<${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 "WPA.*-PSK" | wc -l` + + log "${FUNCNAME[0]}" "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} --clear --msgbox 'Network configuration aborted!!!' \ + ${INFO_HEIGHT} ${INFO_WIDTH}" + return 1 + fi + PSK=`<${TMPFILE}` + PSK_LENGTH=${#PSK} + done + + + NET_NUM=`wpa_cli -i ${DEVNAME} add_network | tail -1` + + log "${FUNCNAME[0]}" `wpa_cli -i ${DEVNAME} set_network ${NET_NUM} ssid "\"${W_ESSID}\""` + log "${FUNCNAME[0]}" `wpa_cli -i ${DEVNAME} set_network ${NET_NUM} psk \"${PSK}\"` + ## remove the password from tmpfile + echo "" > ${TMPFILE} + eval "${DIALOG} --clear --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 "ESS" | wc -l` + + log "_self" "HAS_ESS: \"${HAS_ESS}\"" + + if [ ${HAS_ESS} != "0" ]; then + NET_NUM=`wpa_cli -i ${DEVNAME} add_network | tail -1` + + log "_self" "NET_NUM: ${NET_NUM}" + log "_self" `wpa_cli -i ${DEVNAME} set_network ${NET_NUM} ssid "\"${W_ESSID}\""` + log "_self" `wpa_cli -i ${DEVNAME} set_network ${NET_NUM} key_mgmt NONE` + eval "${DIALOG} --clear --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 "_self" "W_ESSID: \"${W_ESSID}\"" + wifinets+=(${W_MAC} "${W_ESSID} -- ${W_FLAGS}") + done < ${TMPFILE} + IFS=${LAST_IFS} + + + log "$_self" "Wifi nets: \n${wifinets}\n===" + 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 [ $? -ne 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=`<${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=`<${TMPFILE}` + WPA_STATUS=`wpa_cli -i ${DEVNAME} remove_network ${NETNUM} | tail -1 ` + if [ ${WPA_STATUS} == "OK" ]; then + eval "${DIALOG} --clear --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} --clear --msgbox 'Network ${NETNUM} NOT removed' \ + ${INFO_HEIGHT} ${INFO_WIDTH}" + return + fi + else + eval "${DIALOG} --clear --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 "${FUNCNAME[0]}" "WPA_PID: ${WPA_PID}" + kill -n 9 ${WPA_PID} + + if [ $? -ne 0 ]; then + eval "${DIALOG} --clear --msgbox 'Error killing wpa_supplicant' \ + ${INFO_HEIGHT} ${INFO_WIDTH}" + fi + + wpa_supplicant -B -i ${DEVNAME} -c ${WPA_FILE} -P${WPA_PIDFILE} + WPA_PID=`ps ax | grep wpa_supplicant | grep " -i ${DEVNAME}" | cut -d " " -f 1 ` + WPA_PID_SAVED=`<${WPA_PIDFILE}` + if [ [ -n ${WPA_PID} ] || [ ${WPA_PID} != ${WPA_PID_SAVED} ] ]; then + eval "${DIALOG} --clear --msgbox 'Error restarting wpa_supplicant' \ + ${INFO_HEIGHT} ${INFO_WIDTH}" + else + eval "${DIALOG} --clear --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=`<${TMPFILE}` + WPA_STATUS=`wpa_cli -i ${DEVNAME} enable ${NETNUM} | tail -1 ` + if [ ${WPA_STATUS} == "OK" ]; then + eval "${DIALOG} --clear --msgbox 'Network ${NETNUM} enabled' \ + ${INFO_HEIGHT} ${INFO_WIDTH}" + config_ethernet ${DEVNAME} + return + else + eval "${DIALOG} --clear --msgbox 'Network ${NETNUM} NOT enabled' \ + ${INFO_HEIGHT} ${INFO_WIDTH}" + return + fi + else + eval "${DIALOG} --clear --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=`<${TMPFILE}` + WPA_STATUS=`wpa_cli -i ${DEVNAME} disable ${NETNUM} | tail -1 ` + if [ ${WPA_STATUS} == "OK" ]; then + eval "${DIALOG} --clear --msgbox 'Network ${NETNUM} disabled' \ + ${INFO_HEIGHT} ${INFO_WIDTH}" + return + else + eval "${DIALOG} --clear --msgbox 'Network ${NETNUM} NOT disabled' \ + ${INFO_HEIGHT} ${INFO_WIDTH}" + return + fi + else + eval "${DIALOG} --clear --msgbox 'No network disabled!!!' \ + ${INFO_HEIGHT} ${INFO_WIDTH}" + return + fi +} + + + +function wifi_load_file(){ + + local DEVNAME=$1 + + eval "${DIALOG} --fselect ${WPA_FILE} ${WINDOW_HEIGHT} ${WINDOW_WIDTH} \ + 2>${TMPFILE}|" + + if [ $? -eq 0 ]; then + SEL_FILE=`<${TMPFILE}` + while [ -d ${SEL_FILE} ]; do + eval "${DIALOG} --fselect ${SEL_FILE} ${WINDOW_HEIGHT} ${WINDOW_WIDTH} \ + 2>${TMPFILE}" + if [ $? -eq 0 ]; then + SEL_FILE=`<${TMPFILE}` + else + eval "${DIALOG} --clear --infobox 'WPA_FILE was not modified' \ + ${INFO_HEIGHT} ${INFO_WIDTH}" + return + fi + done + + if [ -f ${SEL_FILE} ]; then + WPA_FILE=${SEL_FILE} + eval "${DIALOG} --clear --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} --clear --infobox 'Invalid file name!\n WPA_FILE *not* changed' \ + ${WINDOW_HEIGHT} ${WINDOW_WIDTH}" + return + fi + else + eval "${DIALOG} --clear --infobox 'WPA_FILE was not modified' \ + ${INFO_HEIGHT} ${INFO_WIDTH}" + fi + +} + + + +function config_wifi(){ + + local DEVNAME=$1 + + while [ 1 -eq 1 ]; do + eval "${DIALOG} --clear --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 [ $? -eq 1 ]; then + return + fi + ACTION=`<${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") + eval "${DIALOG} --msgbox 'Sorry!Not yet implemented!' \ + ${INFO_HEIGHT} ${INFO_WIDTH} 2>${TMPFILE}" + ;; + esac + done + +} + + + +## +## (Re)-Configure a network device +## + +function configure_device(){ + + local DEVNAME=$1 + + case ${DEVNAME} in + eth*) + config_ethernet ${DEVNAME} + ;; + wlan*) + config_wifi ${DEVNAME} + ;; + *) + eval "${DIALOG} --clear --title 'ERROR' --msgbox \ + '${DEVNAME}: Unsupported device type' \ + ${WINDOW_HEIGHT} ${WINDOW_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 [ 1 -eq 1 ]; do + eval "${DIALOG} --clear --cancel-label 'Up' --menu 'Device: ${DEVNAME}' \ + ${WINDOW_HEIGHT} ${WINDOW_WIDTH} 8 \ + 'View' 'View current configuration' \ + 'Conf' 'Configure device' \ + 'Start' 'Bring interface up' \ + 'Stop' 'Put interface down' \ + 'Restart' 'Restart interface' 2> ${TMPFILE}" + + if [ $? -eq 1 ]; then + return + fi + + DEV_ACTION=`<${TMPFILE}` + case ${DEV_ACTION} in + "View") + show_device_conf ${DEVNAME} + ;; + "Conf") + configure_device ${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() { + + DEVFILE=/proc/net/dev + DEVICES=`ip link show | awk 'NR % 2 == 1' | cut -d ":" -f 2` + + DEVICE_TAGS="" + + for i in `echo $DEVICES`; do + if [ $i != "lo" ]; then + DEVICE_TAGS="${DEVICE_TAGS} $i $i" + fi + done + + eval "${DIALOG} --clear --cancel-label 'Up' \ + --menu 'Select Interface to configure' ${WINDOW_HEIGHT} ${WINDOW_WIDTH} 4 \ + ${DEVICE_TAGS} 2> ${TMPFILE}" + return $? +} + + +function dev_config_menu(){ + + while [ 1 -eq 1 ]; do + show_devs + if [ $? -eq 1 ]; then + return + fi + DEVNAME=`<${TMPFILE}` + show_device_menu ${DEVNAME} + done +} + +function show_info(){ + + cat < ${TMPFILE} + +== setnet.sh 0.1 == + +setnet.sh is a simple state-less tool to manage and configure network +interfaces. It is a shell wrapper around the functionalities of "ip", +"dhclient", "wpa_cli", and can be used to configure network +connections via Ethernet/Wi-Fi interfaces. + +Both Static and DHCP-based IP configuration is supported. + +At the moment, only WPA-PSK and open (no key) Wi-Fi connections are +available. + +EOF + eval "${DIALOG} --clear --cr-wrap --textbox ${TMPFILE} ${WINDOW_HEIGHT} ${WINDOW_WIDTH}" + return +} + +function show_copyright(){ + + cat < ${TMPFILE} + +== setnet.sh 0.1 == + +(c) KatolaZ (katolaz@freaknet.org) -- 2016 + +EOF + eval "${DIALOG} --clear --cr-wrap --textbox ${TMPFILE} ${WINDOW_HEIGHT} ${WINDOW_WIDTH}" + return +} + + +function show_license(){ + + cat < ${TMPFILE} + +== setnet.sh 0.1 == + +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 . + +---------------------------------------------------------------------- + + (c) KatolaZ -- 2016 + +---------------------------------------------------------------------- + +EOF + eval "${DIALOG} --clear --cr-wrap --textbox ${TMPFILE} ${WINDOW_HEIGHT} ${WINDOW_WIDTH}" + return +} + + + +function about_menu(){ + + while [ 1 -eq 1 ]; do + eval "${DIALOG} --cancel-label 'Up' --menu 'setnet ${VERSION} -- About' \ + ${WINDOW_HEIGHT} ${WINDOW_WIDTH} 6 \ + 'Info' 'General information' \ + 'Copyright' 'Copyright information' \ + 'License' 'How to distribute this program' \ + 2> ${TMPFILE}" + if [ $? -eq 1 ];then + return; + fi + + ACTION=`<${TMPFILE}` + case ${ACTION} in + "Info") + show_info + ;; + "Copyright") + show_copyright + ;; + "License") + show_license + ;; + esac + done +} + + +function show_toplevel(){ + + eval "${DIALOG} --clear --cancel-label 'Quit' --menu 'Main Menu' \ + ${WINDOW_HEIGHT} ${WINDOW_WIDTH} 6 \ + 'Setup' 'Setup interfaces' \ + 'About' 'Info & Copyright' 2> ${TMPFILE}" + return $? +} + +function show_help(){ + + local SCRIPTNAME=$1 + echo "Usage: ${SCRIPTNAME} [OPTION]" + echo "Options:" + echo -e "\t -c cfg_file\tLoad configuration from cfg_file." + echo -e "\t -v\t\tPrint version number and exit. " + echo -e "\t -h\t\tShow this help." + +} + +function show_version(){ + + local SCRIPTNAME=$1 + echo "${SCRIPTNAME} -- version ${VERSION}" + echo "Copyright (C) Vincenzo \"KatolaZ\" Nicosia (katolaz@freaknet.org) -- 2016" + 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 0.1 == + + (c) KatolaZ (katolaz@freaknet.org) -- 2016 + + -+- This is the alpha 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 + copyright and license +EOF + + eval "${DIALOG} --clear --cr-wrap --textbox ${TMPFILE} 23 60" + return +} + + +function main(){ + + truncate -s 0 ${LOGFILE} + trap cleanup 0 $SIG_NONE $SIG_HUP $SIG_INT $SIG_TRAP $SIG_TERM + + show_disclaimer + + log "setnet" "Starting afresh on `date`" + 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 [ 1 -eq 1 ]; do + show_toplevel + if [ $? -eq 1 ]; then + cleanup + exit 1 + fi + ACTION=`<${TMPFILE}` + case ${ACTION} in + "Setup") + dev_config_menu + ;; + "About") + about_menu + ;; + esac + done + +} + + +## +## Get the options +## + +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_setnetrc ${SETNETRC} + +main + + diff --git a/debian_package/setnet-0.1/setnetrc b/debian_package/setnet-0.1/setnetrc new file mode 100644 index 0000000..d460eed --- /dev/null +++ b/debian_package/setnet-0.1/setnetrc @@ -0,0 +1,19 @@ +## +## +## setnetrc -- configuration file for setnet +## +## + +## +## The default configuration file for wpa_supplicant +## +WPA_FILE=/etc/wpa_supplicant/wpa_setnet.conf + + +## +## Logfile +## +LOGFILE=/var/log/setnet.log + + + diff --git a/debian_package/setnet-0.1/wpa_setnet.conf b/debian_package/setnet-0.1/wpa_setnet.conf new file mode 100644 index 0000000..07d4b6d --- /dev/null +++ b/debian_package/setnet-0.1/wpa_setnet.conf @@ -0,0 +1,3 @@ +ctrl_interface=/var/run/wpa_supplicant +update_config=1 + diff --git a/debian_package/setnet_0.1-1.debian.tar.xz b/debian_package/setnet_0.1-1.debian.tar.xz new file mode 100644 index 0000000000000000000000000000000000000000..0c022a8e54ce99414f5bcc9aa15cf3759e868f82 GIT binary patch literal 8192 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 +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: + a55b27f9d2ebec9680916348ca9770ea7b4d0589 14092 setnet_0.1.orig.tar.xz + 29f1f9c78aa25093fdc6ee9d5d4ae563d0eae109 8192 setnet_0.1-1.debian.tar.xz +Checksums-Sha256: + f80b75ec868e193b7a5ae636a7a4c8758fb6f09a7f4ebd76e6b0409f8b9521ab 14092 setnet_0.1.orig.tar.xz + 273e71160476bce4752643b6a7a243cd18984bbac5f5283db6703381131d7d5c 8192 setnet_0.1-1.debian.tar.xz +Files: + b6f0c6985260c5663d456e3f52ee409b 14092 setnet_0.1.orig.tar.xz + 6c2384edeaa47f02e2d6ebedf52a7023 8192 setnet_0.1-1.debian.tar.xz diff --git a/debian_package/setnet_0.1-1_all.deb b/debian_package/setnet_0.1-1_all.deb new file mode 100644 index 0000000000000000000000000000000000000000..c7d237b6384c325cdf24528454ead35a682b4d6c GIT binary patch literal 8332 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 literal 0 HcmV?d00001 diff --git a/debian_package/setnet_0.1-1_amd64.changes b/debian_package/setnet_0.1-1_amd64.changes new file mode 100644 index 0000000..f3d3098 --- /dev/null +++ b/debian_package/setnet_0.1-1_amd64.changes @@ -0,0 +1,31 @@ +Format: 1.8 +Date: Fri, 30 Dec 2016 16:06:26 +0000 +Source: setnet +Binary: setnet +Architecture: source all +Version: 0.1-1 +Distribution: unstable +Urgency: medium +Maintainer: Vincenzo (KatolaZ) Nicosia +Changed-By: Vincenzo (KatolaZ) Nicosia +Description: + setnet - simple bash+dialog tool to configure networks +Changes: + setnet (0.1-1) unstable; urgency=medium + . + * Initial release (Closes: #nnnn) +Checksums-Sha1: + 0287d995e21fb9fbcd5d8bccc4c824b53f61edb0 800 setnet_0.1-1.dsc + a55b27f9d2ebec9680916348ca9770ea7b4d0589 14092 setnet_0.1.orig.tar.xz + 29f1f9c78aa25093fdc6ee9d5d4ae563d0eae109 8192 setnet_0.1-1.debian.tar.xz + b19640f028b439eef2de7ff6b4022c935d0f754d 8332 setnet_0.1-1_all.deb +Checksums-Sha256: + 7c044be42f6f7d383daec54bbe679f59c8b711cdeeb25f126b96248c114cd492 800 setnet_0.1-1.dsc + f80b75ec868e193b7a5ae636a7a4c8758fb6f09a7f4ebd76e6b0409f8b9521ab 14092 setnet_0.1.orig.tar.xz + 273e71160476bce4752643b6a7a243cd18984bbac5f5283db6703381131d7d5c 8192 setnet_0.1-1.debian.tar.xz + 24fadb3c5ed21d3c4dbf11cece2e70fcd9a3cde63dfd44c9154ff2c252939dfe 8332 setnet_0.1-1_all.deb +Files: + 9edeedf904abf7eebc00618d16a164d8 800 unknown optional setnet_0.1-1.dsc + b6f0c6985260c5663d456e3f52ee409b 14092 unknown optional setnet_0.1.orig.tar.xz + 6c2384edeaa47f02e2d6ebedf52a7023 8192 unknown optional setnet_0.1-1.debian.tar.xz + 816bb2dbcbc25011065051f31316ef9f 8332 unknown optional setnet_0.1-1_all.deb diff --git a/debian_package/setnet_0.1.orig.tar.xz b/debian_package/setnet_0.1.orig.tar.xz new file mode 100644 index 0000000000000000000000000000000000000000..316aec0c1640b2f9f1b5f7c74973d3c3add1dc94 GIT binary patch literal 14092 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