diff --git a/sources/dataengine/netctl.cpp b/sources/dataengine/netctl.cpp index 421b344..6255fac 100644 --- a/sources/dataengine/netctl.cpp +++ b/sources/dataengine/netctl.cpp @@ -12,7 +12,7 @@ * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * - * along with Foobar. If not, see . * + * along with netctl-plasmoid. If not, see http://www.gnu.org/licenses/ * ***************************************************************************/ #include "netctl.h" diff --git a/sources/dataengine/netctl.h b/sources/dataengine/netctl.h index b176514..c5956a8 100644 --- a/sources/dataengine/netctl.h +++ b/sources/dataengine/netctl.h @@ -12,7 +12,7 @@ * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * - * along with Foobar. If not, see . * + * along with netctl-plasmoid. If not, see http://www.gnu.org/licenses/ * ***************************************************************************/ #ifndef NETCTL_DE_H diff --git a/sources/gui/netctl.profile.5 b/sources/gui/netctl.profile.5 new file mode 100644 index 0000000..0b9a262 --- /dev/null +++ b/sources/gui/netctl.profile.5 @@ -0,0 +1,617 @@ +'\" t +.\" Title: netctl.profile +.\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] +.\" Generator: DocBook XSL Stylesheets v1.78.1 +.\" Date: 11/05/2013 +.\" Manual: \ \& +.\" Source: \ \& 1.4 +.\" Language: English +.\" +.TH "NETCTL\&.PROFILE" "5" "11/05/2013" "\ \& 1\&.4" "\ \&" +.\" ----------------------------------------------------------------- +.\" * Define some portability stuff +.\" ----------------------------------------------------------------- +.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +.\" http://bugs.debian.org/507673 +.\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html +.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +.ie \n(.g .ds Aq \(aq +.el .ds Aq ' +.\" ----------------------------------------------------------------- +.\" * set default formatting +.\" ----------------------------------------------------------------- +.\" disable hyphenation +.nh +.\" disable justification (adjust text to left margin only) +.ad l +.\" ----------------------------------------------------------------- +.\" * MAIN CONTENT STARTS HERE * +.\" ----------------------------------------------------------------- +.SH "NAME" +netctl.profile \- Profile options +.SH "SYNOPSIS" +.sp +netctl\&.profile +.SH "DESCRIPTION" +.sp +Profiles for netctl live under \fI/etc/netctl/\fR and are plain text files\&. The files consist of variable definitions following the bash shell syntax and are not expected to execute any code\&. It is good to omit as much quoting as possible\&. For a few WPA\-related variables, special quoting rules (see below) apply\&. +.sp +The name of the profile is the name of the file\&. Profile names must not contain newlines and should not end in \fI\&.action\fR, \fI\&.conf\fR, or \fI\&.service\fR\&. Whenever a profile is read, all executable scripts in \fI/etc/netctl/hooks/\fR and any executable script in \fI/etc/netctl/interfaces/\fR with the name of the interface for the profile are sourced\&. Declarations in an interface script override declarations in a profile, which override declarations in hooks\&. For each connection type, there are example profile files in \fI/etc/netctl/examples/\fR\&. +.SH "AVAILABLE CONNECTION TYPES" +.PP +ethernet +.RS 4 +For wired connections\&. +.RE +.PP +wireless +.RS 4 +For wireless connections\&. This connection type requires +\fBwpa_supplicant\fR +to be available\&. +.RE +.PP +bond +.RS 4 +Network bonding\&. This connection type requires +\fBifenslave\fR +to be available\&. +.RE +.PP +bridge +.RS 4 +Network bridging\&. This connection type requires +\fBbrctl\fR +to be available\&. +.RE +.PP +dummy +.RS 4 +For dummy interfaces\&. +.RE +.PP +pppoe +.RS 4 +For PPPoE connections\&. +.RE +.PP +mobile_ppp +.RS 4 +For mobile broadband PPP connections that use a USB modem\&. +.RE +.PP +tunnel +.RS 4 +For tunnel interfaces\&. +.RE +.PP +tuntap +.RS 4 +For TUN/TAP interfaces\&. +.RE +.PP +vlan +.RS 4 +For VLANs on ethernet\-like connections\&. +.RE +.SH "GENERAL OPTIONS" +.PP +\fIDescription=\fR +.RS 4 +A description of the profile\&. +.RE +.PP +\fIConnection=\fR [mandatory for all profiles] +.RS 4 +The connection type used by the profile\&. +.RE +.PP +\fIInterface=\fR [mandatory for all profiles] +.RS 4 +The name of the associated network interface\&. The interface name should not be quoted\&. +.RE +.PP +\fIBindsToInterfaces=()\fR +.RS 4 +An array of physical network interfaces that this profile needs before it can be started\&. For \(oqenabled\(cq profiles, +\fBsystemd\fR +will wait for the presence of the specified interfaces before starting a profile\&. If this variable is not specified, it defaults to the value of +\fIInterface\fR\&. +.RE +.PP +\fIAfter=()\fR +.RS 4 +An array of profile names that should be started before this profile is started\&. This is only an ordering dependency and is not intended to be a list of profiles that this profile requires\&. The meaning is the same as +\fIAfter\fR +in +\fBsystemd\&.unit\fR(5)\&. +.RE +.PP +\fIExecUpPost=\fR +.RS 4 +A command that is executed after a connection is established\&. If the specified command returns anything other than 0 (success), +\fBnetctl\fR +will abort and stop the profile\&. If the command should be allowed to fail, add \(oq|| true\(cq to the end of it\&. +.RE +.PP +\fIExecDownPre=\fR +.RS 4 +A command that is executed before a connection is brought down\&. Similar precautions should be taken as with +\fIExecUpPost\fR\&. +.RE +.PP +\fIForceConnect=\fR +.RS 4 +Set to \(oqyes\(cq to force connecting even if the interface is up\&. Do not use this unless you know what you are doing\&. +.RE +.SH "IP OPTIONS" +.sp +These options apply to all connections that set up an IP\-enabled network\&. In particular, these connection types are ethernet, wireless, bond, bridge, tunnel, tuntap, and vlan\&. +.PP +\fIIP=\fR [mandatory for IPv4] +.RS 4 +One of \(oqstatic\(cq, \(oqdhcp\(cq, or \(oqno\(cq, depending on the desired way of obtaining an address\&. +.RE +.PP +\fIIP6=\fR [mandatory for IPv6] +.RS 4 +One of \(oqstatic\(cq, \(oqstateless\(cq, \(oqdhcp\-noaddr\(cq, \(oqdhcp\(cq, \(oqno\(cq or left out (empty) altogether\&. The difference between not specifying and setting to \(oqno\(cq is in the handling of +\fIrouter advertisement\fR +packages, which is blocked by \(oqno\(cq\&. +.RE +.PP +\fIAddress=()\fR [requires \fIIP=static\fR] +.RS 4 +An array of IP addresses suffixed with \(oq/\(cq\&. Leaving out brackets for arrays consisting of a single element is accepted in the Bash syntax\&. +.RE +.PP +\fIGateway=\fR [requires \fIIP=static\fR] +.RS 4 +An IP routing gateway address\&. +.RE +.PP +\fIRoutes=\fR +.RS 4 +An array of custom routes of the form + +\(oq\fB
\fR +via +\fB\fR\(cq\&. +.RE +.PP +\fIAddress6=()\fR [requires \fIIP6=static\fR or \fIIP6=stateless\fR] +.RS 4 +An array of IPv6 addresses\&. Prefix length may be specified via \(oq1234:bcd::11/64\(cq syntax\&. It is possible to specify modifiers, in particular, \(oq1234:bcd::11/64 nodad\(cq disables Duplicate Address Detection for the address\&. +.RE +.PP +\fIGateway6=\fR [requires \fIIP6=static\fR or \fIIP6=stateless\fR] +.RS 4 +An IPv6 routing gateway address\&. +.RE +.PP +\fIRoutes6=\fR +.RS 4 +An array of custom routes of the form + +\(oq\fB
\fR +via +\fB\fR\(cq\&. +.RE +.PP +\fIDHCPClient=\fR [requires a DHCP setting] +.RS 4 +The name of the preferred DHCP client\&. Supported options are \(oqdhcpcd\(cq and \(oqdhclient\(cq\&. Defaults to \(oqdhcpcd\(cq\&. +.RE +.PP +\fIDHCPReleaseOnStop=\fR +.RS 4 +Set to \(oqyes\(cq to release the DHCP lease when the profile is stopped\&. +.RE +.PP +\fIDhcpcdOptions=\fR, \fIDhclientOptions=\fR, \fIDhclientOptions6=\fR +.RS 4 +Additional options to be passed to the DHCP client\&. Do not use this unless you know what you are doing\&. +.RE +.PP +\fIIPCustom=()\fR +.RS 4 +An array of argument lines to pass to +ip\&. This can be used to achieve complicated configurations within the framework of +\fBnetctl\fR\&. +.RE +.PP +\fIHostname=\fR +.RS 4 +A system hostname\&. +.RE +.PP +\fIDNS=()\fR +.RS 4 +An array of DNS nameservers\&. Simply specify the IP addresses of each of the DNS nameservers\&. +.RE +.PP +\fIDNSDomain=\fR +.RS 4 +A \(oqdomain\(cq line for +\fI/etc/resolv\&.conf\fR, passed to +\fBresolvconf\fR(5)\&. +.RE +.PP +\fIDNSSearch=\fR +.RS 4 +A \(oqsearch\(cq line for +\fI/etc/resolv\&.conf\fR, passed to +\fBresolvconf\fR(5)\&. +.RE +.PP +\fIDNSOptions=()\fR +.RS 4 +An array of \(oqoptions\(cq lines for +\fI/etc/resolv\&.conf\fR, passed to +\fBresolvconf\fR(5)\&. +.RE +.PP +\fITimeoutDHCP=\fR +.RS 4 +Maximum time, in seconds, to wait for DHCP to be successful\&. Defaults to \(oq30\(cq\&. +.RE +.PP +\fITimeoutDAD=\fR +.RS 4 +Maximum time, in seconds, to wait for IPv6\(cqs Duplicate Address Detection to succeed\&. Defaults to \(oq3\(cq\&. +.RE +.SH "OPTIONS FOR \(oqETHERNET\(cq CONNECTIONS" +.sp +Next to the \fBip options\fR, the following are understood for connections of the \(oqethernet\(cq type: +.PP +\fISkipNoCarrier=\fR +.RS 4 +Whether or not the absence of a carrier (plugged\-in cable) is acceptable\&. Defaults to \(oqno\(cq\&. +.RE +.PP +\fIAuth8021X=\fR +.RS 4 +Set to \(oqyes\(cq to use 802\&.1x authentication\&. +.RE +.PP +\fIWPAConfigFile=\fR +.RS 4 +Path to a +\fBwpa_supplicant\fR +configuration file\&. Defaults to +\fI/etc/wpa_supplicant\&.conf\fR\&. +.RE +.PP +\fIWPADriver=\fR +.RS 4 +The +\fBwpa_supplicant\fR +driver to use for 802\&.1x authentication\&. Defaults to \(oqwired\(cq\&. +.RE +.PP +\fITimeoutCarrier=\fR +.RS 4 +Maximum time, in seconds, to wait for a carrier\&. Defaults to \(oq5\(cq\&. +.RE +.PP +\fITimeoutWPA=\fR +.RS 4 +Maximum time, in seconds, to wait for 802\&.1x authentication to succeed\&. Defaults to \(oq15\(cq\&. +.RE +.SH "OPTIONS FOR \(oqWIRELESS\(cq CONNECTIONS" +.sp +Next to the \fBip options\fR, the following are understood for connections of the \(oqwireless\(cq type: +.PP +\fISecurity=\fR +.RS 4 +One of \(oqnone\(cq, \(oqwep\(cq, \(oqwpa\(cq, \(oqwpa\-configsection\(cq, or \(oqwpa\-config\(cq\&. Defaults to \(oqnone\(cq\&. +.RE +.PP +\fIESSID=\fR [mandatory] +.RS 4 +The name of the network to connect to\&. Special quoting rules (see below) apply\&. +.RE +.PP +\fIAP=\fR +.RS 4 +The BSSID (MAC address) of the access point to connect to\&. +.RE +.PP +\fIKey=\fR +.RS 4 +The secret key to a WEP, or WPA encrypted network\&. Special quoting rules (see below) apply\&. +.RE +.PP +\fIHidden=\fR +.RS 4 +Whether or not the specified network is a hidden network\&. Defaults to \(oqno\(cq\&. +.RE +.PP +\fIAdHoc=\fR +.RS 4 +Whether or not to use ad\-hoc mode\&. Defaults to \(oqno\(cq\&. +.RE +.PP +\fIScanFrequencies=\fR +.RS 4 +A space\-separated list of frequencies in MHz to scan when searching for the network\&. Defaults to all available frequencies\&. +.RE +.PP +\fIPriority=\fR +.RS 4 +Priority group for the network\&. In case of automatic profile selection, the matched network with the highest priority will be selected\&. Defaults to \(oq0\(cq\&. +.RE +.PP +\fIWPAConfigSection=()\fR [mandatory for \fISecurity=wpa\-configsection\fR] +.RS 4 +Array of lines that form a network block for +\fBwpa_supplicant\fR\&. All of the above options will be ignored\&. +.RE +.PP +\fIWPAConfigFile=\fR +.RS 4 +Path to a +\fBwpa_supplicant\fR +configuration file\&. Used only for +\fISecurity=wpa\-config\fR\&. All options except +\fIWPADriver\fR, +\fITimeoutWPA\fR, and +\fIRFKill\fR +will be ignored\&. The profile is excluded from automatic profile selection\&. Defaults to +\fI/etc/wpa_supplicant\&.conf\fR\&. +.RE +.PP +\fICountry=\fR +.RS 4 +The country for which frequency regulations will be enforced\&. +.RE +.PP +\fIWPAGroup=\fR +.RS 4 +Group that has the authority to configure +\fBwpa_supplicant\fR +via its control interface\&. Defaults to \(oqwheel\(cq\&. +.RE +.PP +\fIWPADriver=\fR +.RS 4 +The +\fBwpa_supplicant\fR +driver to use\&. Defaults to \(oqnl80211,wext\(cq\&. +.RE +.PP +\fITimeoutWPA=\fR +.RS 4 +Maximum time, in seconds, to wait for steps in the association and authentication to succeed\&. Defaults to \(oq15\(cq\&. +.RE +.PP +\fIRFKill=\fR +.RS 4 +The name of an +\fBrfkill\fR +device\&. When specified, the device is used to block/unblock the interface when appropriate\&. Names can be found in +\fI/sys/class/rfkill/rfkillX/name\fR\&. It is also possible to set this variable to \(oqauto\(cq\&. In that case an +\fBrfkill\fR +device that is associated with the network interface is used\&. +.RE +.PP +\fIExcludeAuto=\fR +.RS 4 +Whether or not to exclude this profile from automatic profile selection\&. Defaults to \(oqno\(cq\&. +.RE +.SH "OPTIONS FOR \(oqBOND\(cq CONNECTIONS" +.sp +The interfaces of \fIBindsToInterfaces\fR are bound together in the interface named by \fIInterface\fR\&. All \fBip options\fR are understood for connections of the \(oqbond\(cq type\&. +.SH "OPTIONS FOR \(oqBRIDGE\(cq CONNECTIONS" +.sp +The interfaces of \fIBindsToInterfaces\fR take part in the bridge named by \fIInterface\fR\&. Next to the \fBip options\fR, the following is understood for connections of the \(oqbridge\(cq type: +.PP +\fISkipForwardingDelay=\fR +.RS 4 +Skip (R)STP and immediately activate all bridge members\&. This can be useful when DHCP is used on the bridge\&. +.RE +.SH "OPTIONS FOR \(oqDUMMY\(cq CONNECTIONS" +.sp +The name of the dummy interface is sepcified in \fIInterface\fR\&. Only the \fBip options\fR are understood for connections of the \(oqdummy\(cq type\&. +.SH "OPTIONS FOR \(oqPPPOE\(cq CONNECTIONS" +.sp +The interface to dial peer\-to\-peer over ethernet is specified in \fIInterface\fR\&. The following options are understood for connections of the \(oqpppoe\(cq type: +.PP +\fIUser=\fR and \fIPassword=\fR +.RS 4 +The username and password to connect with\&. +.RE +.PP +\fIConnectionMode=\fR +.RS 4 +This option specifies how a connection should be established, and may take either \(oqpersist\(cq or \(oqdemand\(cq as its argument\&. +.RE +.PP +\fIIdleTimeout=\fR +.RS 4 +This option specifies the idle time (in seconds) after which \(oqpppd\(cq should disconnect\&. This option is only valid if +\fIConnectionMode\fR +is set to \(oqdemand\(cq\&. +.RE +.PP +\fIMaxFail=\fR +.RS 4 +The number of consecutive failed connection attempts to tolerate\&. A value of 0 means no limit\&. Defaults to \(oq5\(cq\&. +.RE +.PP +\fIDefaultRoute=\fR +.RS 4 +Use the default route provided by the peer (defaults to \(oqtrue\(cq) +.RE +.PP +\fIUsePeerDNS=\fR +.RS 4 +Use the DNS provided by the peer (defaults to \(oqtrue\(cq)\&. +.RE +.PP +\fIPPPUnit=\fR +.RS 4 +Set the ppp unit number in the interface name (ppp0, ppp1, etc\&.)\&. +.RE +.PP +\fILCPEchoInterval=\fR and \fILCPEchoFailure=\fR +.RS 4 +These options override default LCP parameters from \(oq/etc/ppp/options\(cq\&. +.RE +.PP +\fIOptionsFile=\fR +.RS 4 +A file to read additional pppd options from\&. +.RE +.sp +The following advanced options are also understood: +.PP +\fIPPPoEService=\fR +.RS 4 +This option specifies the PPPoE service name\&. +.RE +.PP +\fIPPPoEAC=\fR +.RS 4 +This option specifies the PPPoE access concentrator name\&. +.RE +.PP +\fIPPPoESession=\fR +.RS 4 +This option specifies an existing session to attach to, and is of the form \(oqsessid:macaddr\(cq\&. +.RE +.PP +\fIPPPoEMAC=\fR +.RS 4 +Only connect to specified MAC address +.RE +.PP +\fIPPPoEIP6=\fR +.RS 4 +Enable IPv6 support +.RE +.SH "OPTIONS FOR \(oqMOBILE_PPP\(cq CONNECTIONS" +.sp +The name of the USB serial device is specified in \fIInterface\fR\&. The following options are understood for connections of the \(oqmobile_ppp\(cq type: +.PP +\fIMaxFail=\fR +.RS 4 +The number of consecutive failed connection attempts to tolerate\&. A value of 0 means no limit\&. Defaults to \(oq5\(cq\&. +.RE +.PP +\fIDefaultRoute=\fR +.RS 4 +Use the default route provided by the peer (defaults to \(oqtrue\(cq) +.RE +.PP +\fIUsePeerDNS=\fR +.RS 4 +Use the DNS provided by the peer (defaults to \(oqtrue\(cq) +.RE +.PP +\fIUser=\fR and \fIPassword=\fR +.RS 4 +The username and password to connect with\&. These are unset by default, as they are often not required\&. +.RE +.PP +\fIAccessPointName=\fR +.RS 4 +The access point (apn) to connect on\&. This is specific to your ISP\&. +.RE +.PP +\fIPin=\fR +.RS 4 +If your modem requires a PIN to unlock, use this option\&. +.RE +.PP +\fIMode=\fR +.RS 4 +This option is used to specify the connection mode\&. Can be one of \(oq3Gpref\(cq, \(oq3Gonly\(cq, \(oqGPRSpref\(cq, \(oqGPRSonly\(cq, \(oqNone\(cq\&. This generates AT commands specific to certain Huawei modems; all other devices should use \(oqNone\(cq\&. +.RE +.PP +\fIOptionsFile=\fR +.RS 4 +A file to read additional pppd options from\&. +.RE +.SH "OPTIONS FOR \(oqTUNNEL\(cq CONNECTIONS" +.sp +The name of the tunnel interface is specified in \fIInterface\fR\&. Next to the \fBip options\fR, the following are understood for connections of the \(oqtunnel\(cq type: +.PP +\fIMode=\fR +.RS 4 +The tunnel type (e\&.g\&. \(oqsit\(cq)\&. See +\fBip\fR(8) for available modes\&. +.RE +.PP +\fILocal=\fR +.RS 4 +The address of the local end of the tunnel\&. +.RE +.PP +\fIRemote=\fR +.RS 4 +The address of the remote end of the tunnel\&. +.RE +.SH "OPTIONS FOR \(oqTUNTAP\(cq CONNECTIONS" +.sp +The name of the tuntap interface is specified in \fIInterface\fR\&. Next to the \fBip options\fR, the following are understood for connections of the \(oqtuntap\(cq type: +.PP +\fIMode=\fR +.RS 4 +Either \(oqtun\(cq, or \(oqtap\(cq\&. +.RE +.PP +\fIUser=\fR +.RS 4 +The owning user of the tun/tap interface\&. +.RE +.PP +\fIGroup=\fR +.RS 4 +The owning group of the tun/tap interface\&. +.RE +.SH "OPTIONS FOR \(oqVLAN\(cq CONNECTIONS" +.sp +The name of the vlan interface is specified in \fIInterface\fR\&. The underlying physical interface is specified in \fIBindsToInterfaces\fR\&. Hence, for vlan profiles, \fIBindsToInterfaces\fR contains the name of a single network interface\&. +.sp +All options for connections of the \(oqethernet\(cq type are understood for connections of the \(oqvlan\(cq type\&. Additionally, connections of the \(oqvlan\(cq type can set a vlan identifier using \fIVLANID=\fR\&. See \fBip\fR(8) for details\&. +.SH "SPECIAL QUOTING RULES" +.sp +Configuration files for \fBwpa_supplicant\fR use non\-standard quoting\&. Therefore, non\-standard quoting rules exist for some variables for connections of the \(oqwireless\(cq type\&. In particular, these variables are \fIESSID\fR, and \fIKey\fR\&. +.sp +A variable is considered \fBquoted\fR by \fBwpa_supplicant\fR if it is enclosed in double quotes (")\&. A variable is considered \fBnon\-quoted\fR by \fBwpa_supplicant\fR if it does not start with a double quote\&. Hexadecimal values are specified \fBnon\-quoted\fR in configuration files of \fBwpa_supplicant\fR\&. In \fBnetctl\fR, variables are written to \fBwpa_supplicant\fR configuration files \fBquoted\fR by default\&. When special quoting rules apply, it is possible to specify an unquoted (hexadecimal) value using a special syntax\&. +.sp +The special quoting rules of \fBnetctl\fR are as follows\&. A string that starts with a literal double quote is considered \fBnon\-quoted\fR\&. Any other string is considered \fBquoted\fR\&. It is possible to specify quoted strings that start with a double quote by quoting manually\&. An extreme example is the specification of a \fBquoted\fR double quote: \fIX=\*(Aq""""\*(Aq\fR\&. On the other end of the spectrum there is the \fBnon\-quoted\fR backslash: \fIX=\e"\e\e\fR\&. +.sp +Further examples of \fBquoted\fR strings (all equivalent): +.sp +.if n \{\ +.RS 4 +.\} +.nf +X=string +X="string" +X=\*(Aq""string"\*(Aq +.fi +.if n \{\ +.RE +.\} +.sp +Further examples of \fBnon\-quoted\fR strings (all equivalent): +.sp +.if n \{\ +.RS 4 +.\} +.nf +X=\e"string +X="\e"string" +X=\*(Aq"string\*(Aq +.fi +.if n \{\ +.RE +.\} +.sp +A mnemonic is to think of the prefix \(oq\e"\(cq as saying \(oqnon\(cq\-\(oqquote\(cq\&. +.SH "SEE ALSO" +.sp +\fBnetctl\fR(1), \fBresolvconf\&.conf\fR(5) diff --git a/sources/gui/src/main.cpp b/sources/gui/src/main.cpp new file mode 100644 index 0000000..a5d46b6 --- /dev/null +++ b/sources/gui/src/main.cpp @@ -0,0 +1,30 @@ +/*************************************************************************** + * This file is part of netctl-plasmoid * + * * + * netctl-plasmoid 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. * + * * + * netctl-plasmoid 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 netctl-plasmoid. If not, see http://www.gnu.org/licenses/ * + ***************************************************************************/ + + +#include + +#include "mainwindow.h" + + +int main(int argc, char *argv[]) +{ + QApplication a(argc, argv); + MainWindow w; + w.show(); + return a.exec(); +} diff --git a/sources/gui/src/mainwindow.cpp b/sources/gui/src/mainwindow.cpp new file mode 100644 index 0000000..6172367 --- /dev/null +++ b/sources/gui/src/mainwindow.cpp @@ -0,0 +1,180 @@ +/*************************************************************************** + * This file is part of netctl-plasmoid * + * * + * netctl-plasmoid 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. * + * * + * netctl-plasmoid 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 netctl-plasmoid. If not, see http://www.gnu.org/licenses/ * + ***************************************************************************/ + +#include "mainwindow.h" +#include "ui_mainwindow.h" + +#include "netctlinteract.h" +#include + + +MainWindow::MainWindow(QWidget *parent) + : QMainWindow(parent), + ui(new Ui::MainWindow) +{ + ui->setupUi(this); + ui->tableWidget_main->setSortingEnabled(true); + ui->statusBar->showMessage(QApplication::translate("MainWindow", "Ready")); + + // SettingsWindow *settingsWindow; + // settingsWindow = new SettingsWindow(this); + // delete settingsWindow; + // temporary block + netctlPath = QString("/usr/bin/netctl"); + profileDir = QString("/etc/netctl"); + sudoPath = QString("/usr/bin/kdesu -c"); + + netctlCommand = new Netctl(this, netctlPath, profileDir, sudoPath); + + createActions(); + updateMainTab(); +} + +MainWindow::~MainWindow() +{ + delete netctlCommand; + delete ui; +} + + +// window signals +void MainWindow::createActions() +{ + connect(ui->tabWidget, SIGNAL(currentChanged(int)), this, SLOT(updateTabs(int))); + connect(ui->actionQuit, SIGNAL(triggered(bool)), this, SLOT(close())); + + // main page events + connect(ui->pushButton_mainRefresh, SIGNAL(clicked(bool)), this, SLOT(updateMainTab())); + connect(ui->pushButton_mainEnable, SIGNAL(clicked(bool)), this, SLOT(mainTabEnableProfile())); + connect(ui->pushButton_mainRestart, SIGNAL(clicked(bool)), this, SLOT(mainTabRestartProfile())); + connect(ui->pushButton_mainStart, SIGNAL(clicked(bool)), this, SLOT(mainTabStartProfile())); + connect(ui->tableWidget_main, SIGNAL(currentItemChanged(QTableWidgetItem *, QTableWidgetItem *)), this, SLOT(mainTabRefreshButtons(QTableWidgetItem *, QTableWidgetItem *))); +} + + +// window slots +void MainWindow::updateTabs(const int tab) +{ + if (tab == 0) + updateMainTab(); +} + + +void MainWindow::updateMainTab() +{ + QStringList profiles = netctlCommand->getProfileList(); + QStringList descriptions = netctlCommand->getProfileDescriptions(profiles); + QStringList statuses = netctlCommand->getProfileStatuses(profiles); + + + ui->tableWidget_main->setRowCount(profiles.count()); + ui->tableWidget_main->sortByColumn(0, Qt::AscendingOrder); + + for (int i=0; itableWidget_main->setItem(i, 0, new QTableWidgetItem(profiles[i])); + ui->tableWidget_main->setItem(i, 1, new QTableWidgetItem(descriptions[i])); + ui->tableWidget_main->setItem(i, 2, new QTableWidgetItem(statuses[i])); + } + + ui->tableWidget_main->resizeColumnsToContents(); + ui->tableWidget_main->resizeRowsToContents(); + ui->tableWidget_main->horizontalHeader()->setStretchLastSection(true); + ui->tableWidget_main->setCurrentCell(0, 0); + update(); +} + + +// main tab slots +void MainWindow::mainTabEnableProfile() +{ + ui->tableWidget_main->setDisabled(true); + QString profile = ui->tableWidget_main->item(ui->tableWidget_main->currentItem()->row(), 0)->text(); + netctlCommand->enableProfile(profile); + if (ui->tableWidget_main->item(ui->tableWidget_main->currentItem()->row(), 2)->text().indexOf(QString("enabled")) > -1) { + if (netctlCommand->isProfileEnabled(profile)) + ui->statusBar->showMessage(QApplication::translate("MainWindow", "Error")); + else + ui->statusBar->showMessage(QApplication::translate("MainWindow", "Done")); + } + else { + if (netctlCommand->isProfileEnabled(profile)) + ui->statusBar->showMessage(QApplication::translate("MainWindow", "Done")); + else + ui->statusBar->showMessage(QApplication::translate("MainWindow", "Error")); + } + ui->tableWidget_main->setEnabled(true); + updateMainTab(); +} + + +void MainWindow::mainTabRestartProfile() +{ + ui->tableWidget_main->setDisabled(true); + QString profile = ui->tableWidget_main->item(ui->tableWidget_main->currentItem()->row(), 0)->text(); + netctlCommand->restartProfile(profile); + if (netctlCommand->isProfileActive(profile)) + ui->statusBar->showMessage(QApplication::translate("MainWindow", "Done")); + else + ui->statusBar->showMessage(QApplication::translate("MainWindow", "Error")); + ui->tableWidget_main->setEnabled(true); + updateMainTab(); +} + + +void MainWindow::mainTabStartProfile() +{ + ui->tableWidget_main->setDisabled(true); + QString profile = ui->tableWidget_main->item(ui->tableWidget_main->currentItem()->row(), 0)->text(); + netctlCommand->startProfile(profile); + if (ui->tableWidget_main->item(ui->tableWidget_main->currentItem()->row(), 2)->text().indexOf(QString("inactive")) == -1) { + if (netctlCommand->isProfileActive(profile)) + ui->statusBar->showMessage(QApplication::translate("MainWindow", "Error")); + else + ui->statusBar->showMessage(QApplication::translate("MainWindow", "Done")); + } + else { + if (netctlCommand->isProfileActive(profile)) + ui->statusBar->showMessage(QApplication::translate("MainWindow", "Done")); + else + ui->statusBar->showMessage(QApplication::translate("MainWindow", "Error")); + } + ui->tableWidget_main->setEnabled(true); + updateMainTab(); +} + + +void MainWindow::mainTabRefreshButtons(QTableWidgetItem *current, QTableWidgetItem *previous) +{ + Q_UNUSED(previous); + + QString profile = ui->tableWidget_main->item(current->row(), 0)->text(); + bool isActive = netctlCommand->isProfileActive(profile); + bool isEnable = netctlCommand->isProfileEnabled(profile); + + if (isActive) { + ui->pushButton_mainRestart->setEnabled(true); + ui->pushButton_mainStart->setText(QApplication::translate("MainWindow", "Stop")); + } + else { + ui->pushButton_mainRestart->setDisabled(true); + ui->pushButton_mainStart->setText(QApplication::translate("MainWindow", "Start")); + } + if (isEnable) + ui->pushButton_mainEnable->setText(QApplication::translate("MainWindow", "Disable")); + else + ui->pushButton_mainEnable->setText(QApplication::translate("MainWindow", "Enable")); +} diff --git a/sources/gui/src/mainwindow.h b/sources/gui/src/mainwindow.h new file mode 100644 index 0000000..66eebc4 --- /dev/null +++ b/sources/gui/src/mainwindow.h @@ -0,0 +1,60 @@ +/*************************************************************************** + * This file is part of netctl-plasmoid * + * * + * netctl-plasmoid 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. * + * * + * netctl-plasmoid 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 netctl-plasmoid. If not, see http://www.gnu.org/licenses/ * + ***************************************************************************/ + +#ifndef MAINWINDOW_H +#define MAINWINDOW_H + +#include +#include +#include +#include + + +class Netctl; + +namespace Ui { +class MainWindow; +} + +class MainWindow : public QMainWindow +{ + Q_OBJECT + +public: + explicit MainWindow(QWidget *parent = 0); + ~MainWindow(); + +private slots: + void updateTabs(const int tab); + void updateMainTab(); + // main tab slots + void mainTabEnableProfile(); + void mainTabRestartProfile(); + void mainTabStartProfile(); + void mainTabRefreshButtons(QTableWidgetItem *current, QTableWidgetItem *previous); + +private: + Netctl *netctlCommand; + Ui::MainWindow *ui; + void createActions(); + // configuration + QString netctlPath; + QString profileDir; + QString sudoPath; +}; + +#endif /* MAINWINDOW_H */ diff --git a/sources/gui/src/mainwindow.ui b/sources/gui/src/mainwindow.ui new file mode 100644 index 0000000..367fa88 --- /dev/null +++ b/sources/gui/src/mainwindow.ui @@ -0,0 +1,170 @@ + + + MainWindow + + + + 0 + 0 + 466 + 542 + + + + MainWindow + + + + + + + + Connect to profile + + + + + + QAbstractItemView::NoEditTriggers + + + QAbstractItemView::SingleSelection + + + QAbstractItemView::SelectRows + + + true + + + false + + + + Name + + + + + Description + + + + + Status + + + + + + + + + + Refresh + + + true + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Enable + + + true + + + + + + + Restart + + + true + + + + + + + Start + + + true + + + + + + + + + + Create a new profile + + + + + Connect to Wi-Fi + + + + + + + + + + 0 + 0 + 466 + 20 + + + + + Menu + + + + + + + + + + Settings + + + Ctrl+S + + + + + Quit + + + Ctrl+Q + + + + + + diff --git a/sources/gui/src/netctlinteract.cpp b/sources/gui/src/netctlinteract.cpp new file mode 100644 index 0000000..0538f82 --- /dev/null +++ b/sources/gui/src/netctlinteract.cpp @@ -0,0 +1,180 @@ +/*************************************************************************** + * This file is part of netctl-plasmoid * + * * + * netctl-plasmoid 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. * + * * + * netctl-plasmoid 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 netctl-plasmoid. If not, see http://www.gnu.org/licenses/ * + ***************************************************************************/ + +#include "netctlinteract.h" + +#include +#include + +#include "mainwindow.h" +#include "cstdio" + + +Netctl::Netctl(MainWindow *wid, QString netctlPath, QString profileDir, QString sudoPath) + : parent(wid), + netctlCommand(netctlPath), + profileDirectory(new QDir(profileDir)), + sudoCommand(sudoPath) +{ + +} + + +Netctl::~Netctl() +{ + delete profileDirectory; +} + + +// general information +QStringList Netctl::getProfileDescriptions(QStringList profileList) +{ + QStringList descriptions; + + for (int i=0; iabsolutePath() + QDir::separator() + profileList[i]); + QString fileStr; + if (profile.open(QIODevice::ReadOnly)) + while (true) { + fileStr = QString(profile.readLine()); + if (profile.atEnd()) + break; + else if (fileStr[0] != '#') + if (fileStr.split(QString("="), QString::SkipEmptyParts).count() == 2) + if (fileStr.split(QString("="), QString::SkipEmptyParts)[0] == QString("Description")) + descriptions.append(fileStr.split(QString("="), QString::SkipEmptyParts)[1].split(QString("\n"), QString::SkipEmptyParts)[0]); + } + else + descriptions.append(QString("")); + } + + for (int i=0; ientryList(QDir::Files); +} + + +QStringList Netctl::getProfileStatuses(QStringList profileList) +{ + QStringList statuses; + + for (int i=0; i -1) + status = true; + + return status; +} + + +bool Netctl::isProfileEnabled(QString profile) +{ + bool status = false; + QProcess command; + QString cmdOutput = QString(""); + + command.start(netctlCommand + QString(" status ") + profile); + command.waitForFinished(-1); + cmdOutput = command.readAllStandardOutput(); + if (!cmdOutput.isEmpty()) { + QStringList profileStatus = cmdOutput.split(QString("\n"), QString::SkipEmptyParts); + for (int i=0; i -1) + status = true; + } + + return status; +} + + +// functions +bool Netctl::enableProfile(QString profile) +{ + QProcess command; + if (isProfileEnabled(profile)) + command.start(sudoCommand + QString(" ") + netctlCommand + QString(" disable ") + profile); + else + command.start(sudoCommand + QString(" ") + netctlCommand + QString(" enable ") + profile); + command.waitForFinished(-1); + if (command.exitCode() == 0) + return true; + else + return false; +} + + +bool Netctl::restartProfile(QString profile) +{ + QProcess command; + if (isProfileActive(profile)) + command.start(sudoCommand + QString(" ") + netctlCommand + QString(" restart ") + profile); + command.waitForFinished(-1); + if (command.exitCode() == 0) + return true; + else + return false; +} + + +bool Netctl::startProfile(QString profile) +{ + QProcess command; + if (isProfileActive(profile)) + command.start(sudoCommand + QString(" ") + netctlCommand + QString(" stop ") + profile); + else + command.start(sudoCommand + QString(" ") + netctlCommand + QString(" start ") + profile); + command.waitForFinished(-1); + if (command.exitCode() == 0) + return true; + else + return false; +} diff --git a/sources/gui/src/netctlinteract.h b/sources/gui/src/netctlinteract.h new file mode 100644 index 0000000..1059e43 --- /dev/null +++ b/sources/gui/src/netctlinteract.h @@ -0,0 +1,52 @@ +/*************************************************************************** + * This file is part of netctl-plasmoid * + * * + * netctl-plasmoid 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. * + * * + * netctl-plasmoid 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 netctl-plasmoid. If not, see http://www.gnu.org/licenses/ * + ***************************************************************************/ + +#ifndef NETCTLINTERACT_H +#define NETCTLINTERACT_H + +#include +#include + + +class MainWindow; + +class Netctl : public QWidget +{ + Q_OBJECT + +public: + Netctl(MainWindow *wid, QString netctlPath, QString profileDir, QString sudoPath); + ~Netctl(); + // general information + QStringList getProfileDescriptions(QStringList profileList); + QStringList getProfileList(); + QStringList getProfileStatuses(QStringList profileList); + bool isProfileActive(QString profile); + bool isProfileEnabled(QString profile); + // functions + bool enableProfile(QString profile); + bool restartProfile(QString profile); + bool startProfile(QString profile); + +private: + MainWindow *parent; + QString netctlCommand; + QDir *profileDirectory; + QString sudoCommand; +}; + +#endif /* NETCTLINTERACT_H */ diff --git a/sources/plasmoid/netctl.cpp b/sources/plasmoid/netctl.cpp index 57cb958..9562c53 100644 --- a/sources/plasmoid/netctl.cpp +++ b/sources/plasmoid/netctl.cpp @@ -12,7 +12,7 @@ * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * - * along with Foobar. If not, see . * + * along with netctl-plasmoid. If not, see http://www.gnu.org/licenses/ * ***************************************************************************/ #include "netctl.h" diff --git a/sources/plasmoid/netctl.h b/sources/plasmoid/netctl.h index 81b884c..47079da 100644 --- a/sources/plasmoid/netctl.h +++ b/sources/plasmoid/netctl.h @@ -12,7 +12,7 @@ * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * - * along with Foobar. If not, see . * + * along with netctl-plasmoid. If not, see http://www.gnu.org/licenses/ * ***************************************************************************/ #ifndef NETCTL_PLASMOID_H