mirror of
https://github.com/gryf/wicd.git
synced 2025-12-19 12:28:08 +01:00
Initial commit of Ronuk Raval's wicd_cli branch into the main
1.6 codebase. This is still untested, so depending on any problems found, and assuming it eventually makes into the main branch, we might rebase it before the merge.
This commit is contained in:
50
cli/README
Normal file
50
cli/README
Normal file
@@ -0,0 +1,50 @@
|
||||
wicd-cli is a scriptable command-line only "client" for wicd written
|
||||
by Ronuk Raval.
|
||||
|
||||
Some usage examples for wicd-cli.py
|
||||
|
||||
Scan for new wireless networks and display them:
|
||||
python wicd-cli.py --wireless --scan --list-networks
|
||||
or (same thing, short version)
|
||||
python wicd-cli.py -y -S -l
|
||||
|
||||
Or, you can view the networks Wicd has in its cache:
|
||||
python wicd-cli.py --wireless --list-networks
|
||||
|
||||
If you want to do anything with these networks, you''ll need to note the
|
||||
network ID listed on the left side of the above command.
|
||||
|
||||
Get the channel number from network 0:
|
||||
python wicd-cli.py --wireless --network 0 --network-property channel
|
||||
|
||||
Or get all available information for a certain network, do:
|
||||
python wicd-cli.py --wireless --network 0 --network-details
|
||||
|
||||
Or do the same for the currently connected network, do:
|
||||
python wicd-cli.py --wireless --network-details
|
||||
|
||||
View the available encryption templates Wicd can use:
|
||||
python wicd-cli.py --wireless --list-encryption-types
|
||||
|
||||
Look under your chosen encryption scheme for a list of required properties
|
||||
(marked with "Req:"). These are additional properties that must be set before
|
||||
the encryption can be used.
|
||||
|
||||
For example, the listing for WPA encryption looks as follows:
|
||||
0 wpa WPA 1/2 (Passphrase)
|
||||
Req: key (Key)
|
||||
The list indicates that to use WPA encryption, the following properties must be
|
||||
set:
|
||||
'enctype' => 'wpa' (from the name field)
|
||||
'key' => YOUR_WPA_PASSKEY (from the required field)
|
||||
|
||||
Use the WPA encryption scheme on network 0 by issuing the following two
|
||||
commands:
|
||||
python wicd-cli.py --wireless --network 0 \
|
||||
--network-property enctype --set-to wpa
|
||||
python wicd-cli.py --wireless --network 0 \
|
||||
--network-property key --set-to YOUR_WPA_PASSKEY
|
||||
|
||||
Finally, we need to connect to the network:
|
||||
python wicd-cli.py --wireless --network 0 --connect
|
||||
|
||||
234
cli/wicd-cli.py
Normal file
234
cli/wicd-cli.py
Normal file
@@ -0,0 +1,234 @@
|
||||
#!/usr/bin/python
|
||||
|
||||
# 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 2 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, write to the Free Software
|
||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||
# MA 02110-1301, USA.
|
||||
|
||||
import optparse
|
||||
import dbus
|
||||
import dbus.service
|
||||
import sys
|
||||
from wicd import misc
|
||||
|
||||
misc.RenameProcess('wicd-cli')
|
||||
|
||||
if getattr(dbus, 'version', (0, 0, 0)) < (0, 80, 0):
|
||||
import dbus.glib
|
||||
else:
|
||||
from dbus.mainloop.glib import DBusGMainLoop
|
||||
DBusGMainLoop(set_as_default=True)
|
||||
|
||||
bus = dbus.SystemBus()
|
||||
try:
|
||||
daemon = dbus.Interface(bus.get_object('org.wicd.daemon', '/org/wicd/daemon'),
|
||||
'org.wicd.daemon')
|
||||
wireless = dbus.Interface(bus.get_object('org.wicd.daemon', '/org/wicd/daemon/wireless'),
|
||||
'org.wicd.daemon.wireless')
|
||||
wired = dbus.Interface(bus.get_object('org.wicd.daemon', '/org/wicd/daemon/wired'),
|
||||
'org.wicd.daemon.wired')
|
||||
config = dbus.Interface(bus.get_object('org.wicd.daemon', '/org/wicd/daemon/config'),
|
||||
'org.wicd.daemon.config')
|
||||
except dbus.DBusException:
|
||||
print 'Error: Could not connect to the daemon. Please make sure it is running.'
|
||||
sys.exit(3)
|
||||
|
||||
parser = optparse.OptionParser()
|
||||
|
||||
parser.add_option('--network', '-n', type='int', default=-1)
|
||||
parser.add_option('--network-property', '-p')
|
||||
parser.add_option('--set-to', '-s')
|
||||
parser.add_option('--name', '-m')
|
||||
|
||||
parser.add_option('--scan', '-S', default=False, action='store_true')
|
||||
parser.add_option('--save', '-w', default=False, action='store_true')
|
||||
parser.add_option('--list-networks', '-l', default=False, action='store_true')
|
||||
parser.add_option('--network-details', '-d', default=False, action='store_true')
|
||||
parser.add_option('--disconnect', '-x', default=False, action='store_true')
|
||||
parser.add_option('--connect', '-c', default=False, action='store_true')
|
||||
parser.add_option('--list-encryption-types', '-e', default=False, action='store_true')
|
||||
# short options for these two aren't great.
|
||||
parser.add_option('--wireless', '-y', default=False, action='store_true')
|
||||
parser.add_option('--wired', '-z', default=False, action='store_true')
|
||||
parser.add_option('--load-profile', '-o', default=False, action='store_true')
|
||||
|
||||
options, arguments = parser.parse_args()
|
||||
|
||||
op_performed = False
|
||||
|
||||
if not (options.wireless or options.wired):
|
||||
print "Please use --wireless or --wired to specify " + \
|
||||
"the type of connection to operate on."
|
||||
|
||||
# functions
|
||||
def is_valid_wireless_network_id(network_id):
|
||||
if not (network_id >= 0 \
|
||||
and network_id < wireless.GetNumberOfNetworks()):
|
||||
print 'Invalid wireless network identifier.'
|
||||
sys.exit(1)
|
||||
|
||||
def is_valid_wired_network_id(network_id):
|
||||
num = len(config.GetWiredProfileList())
|
||||
if not (network_id < num and \
|
||||
network_id >= 0):
|
||||
print 'Invalid wired network identifier.'
|
||||
sys.exit(4)
|
||||
|
||||
def is_valid_wired_network_profile(profile_name):
|
||||
if not profile_name in config.GetWiredProfileList():
|
||||
print 'Profile of that name does not exist.'
|
||||
sys.exit(5)
|
||||
|
||||
if options.scan and options.wireless:
|
||||
# synchronized scan
|
||||
wireless.Scan(True)
|
||||
op_performed = True
|
||||
|
||||
if options.load_profile and options.wired:
|
||||
is_valid_wired_network_profile(options.name)
|
||||
config.ReadWiredNetworkProfile(options.name)
|
||||
op_performed = True
|
||||
|
||||
if options.list_networks:
|
||||
if options.wireless:
|
||||
print '#\tBSSID\t\t\tChannel\tESSID'
|
||||
for network_id in range(0, wireless.GetNumberOfNetworks()):
|
||||
print '%s\t%s\t%s\t%s' % (network_id,
|
||||
wireless.GetWirelessProperty(network_id, 'bssid'),
|
||||
wireless.GetWirelessProperty(network_id, 'channel'),
|
||||
wireless.GetWirelessProperty(network_id, 'essid'))
|
||||
elif options.wired:
|
||||
print '#\tProfile name'
|
||||
id = 0
|
||||
for profile in config.GetWiredProfileList():
|
||||
print '%s\t%s' % (id, profile)
|
||||
id += 1
|
||||
op_performed = True
|
||||
|
||||
if options.network_details:
|
||||
if options.wireless:
|
||||
if options.network >= 0:
|
||||
is_valid_wireless_network_id(options.network)
|
||||
network_id = options.network
|
||||
else:
|
||||
network_id = wireless.GetCurrentNetworkID(0)
|
||||
is_valid_wireless_network_id(network_id)
|
||||
# we're connected to a network, print IP
|
||||
print "IP: %s" % wireless.GetWirelessIP(0)
|
||||
|
||||
print "Essid: %s" % wireless.GetWirelessProperty(network_id, "essid")
|
||||
print "Bssid: %s" % wireless.GetWirelessProperty(network_id, "bssid")
|
||||
if wireless.GetWirelessProperty(network_id, "encryption"):
|
||||
print "Encryption: On"
|
||||
print "Encryption Method: %s" % \
|
||||
wireless.GetWirelessProperty(network_id, "encryption_method")
|
||||
else:
|
||||
print "Encryption: Off"
|
||||
print "Quality: %s" % wireless.GetWirelessProperty(network_id, "quality")
|
||||
print "Mode: %s" % wireless.GetWirelessProperty(network_id, "mode")
|
||||
print "Channel: %s" % wireless.GetWirelessProperty(network_id, "channel")
|
||||
print "Bit Rates: %s" % wireless.GetWirelessProperty(network_id, "bitrates")
|
||||
op_performed = True
|
||||
|
||||
# network properties
|
||||
|
||||
if options.network_property:
|
||||
if options.wireless:
|
||||
is_valid_wireless_network_id(options.network)
|
||||
if not options.set_to:
|
||||
print wireless.GetWirelessProperty(options.network, options.network_property)
|
||||
else:
|
||||
wireless.SetWirelessProperty(options.network, \
|
||||
options.network_property, options.set_to)
|
||||
elif options.wired:
|
||||
if not options.set_to:
|
||||
print wired.GetWiredProperty(options.network_property)
|
||||
else:
|
||||
wired.SetWiredProperty(options.network_property, options.set_to)
|
||||
op_performed = True
|
||||
|
||||
if options.disconnect:
|
||||
daemon.Disconnect()
|
||||
if options.wireless:
|
||||
if wireless.GetCurrentNetworkID(0) > -1:
|
||||
print "Disconnecting from %s on %s" % (wireless.GetCurrentNetwork(0),
|
||||
wireless.DetectWirelessInterface())
|
||||
elif options.wired:
|
||||
if wired.CheckPluggedIn():
|
||||
print "Disconnecting from wired connection on %s" % wired.DetectWiredInterface()
|
||||
op_performed = True
|
||||
|
||||
if options.connect:
|
||||
if options.wireless and options.network > -1:
|
||||
is_valid_wireless_network_id(options.network)
|
||||
name = wireless.GetWirelessProperty(options.network, 'essid')
|
||||
encryption = wireless.GetWirelessProperty(options.network, 'enctype')
|
||||
print "Connecting to %s with %s on %s" % (name, encryption,
|
||||
wireless.DetectWirelessInterface())
|
||||
wireless.ConnectWireless(options.network)
|
||||
|
||||
check = lambda: wireless.CheckIfWirelessConnecting()
|
||||
message = lambda: wireless.CheckWirelessConnectingMessage()
|
||||
elif options.wired:
|
||||
print "Connecting to wired connection on %s" % wired.DetectWiredInterface()
|
||||
wired.ConnectWired()
|
||||
|
||||
check = lambda: wired.CheckIfWiredConnecting()
|
||||
message = lambda: wired.CheckWiredConnectingMessage()
|
||||
|
||||
# update user on what the daemon is doing
|
||||
last = None
|
||||
while check():
|
||||
next = message()
|
||||
if next != last:
|
||||
# avoid a race condition where status is updated to "done" after the
|
||||
# loop check
|
||||
if next == "done":
|
||||
break
|
||||
print "%s..." % next.replace("_", " ")
|
||||
last = next
|
||||
print "done!"
|
||||
op_performed = True
|
||||
|
||||
# pretty print optional and required properties
|
||||
def str_properties(prop):
|
||||
if len(prop) == 0:
|
||||
return "None"
|
||||
else:
|
||||
return ', '.join("%s (%s)" % (x[0], x[1].replace("_", " ")) for x in type['required'])
|
||||
|
||||
if options.wireless and options.list_encryption_types:
|
||||
et = misc.LoadEncryptionMethods()
|
||||
# print 'Installed encryption templates:'
|
||||
print '%s\t%-20s\t%s' % ('#', 'Name', 'Description')
|
||||
id = 0
|
||||
for type in et:
|
||||
print '%s\t%-20s\t%s' % (id, type['type'], type['name'])
|
||||
print ' Req: %s' % str_properties(type['required'])
|
||||
print '---'
|
||||
# don't print optionals (yet)
|
||||
#print ' Opt: %s' % str_properties(type['optional'])
|
||||
id += 1
|
||||
op_performed = True
|
||||
|
||||
if options.save and options.network > -1:
|
||||
if options.wireless:
|
||||
is_valid_wireless_network_id(options.network)
|
||||
config.SaveWirelessNetworkProfile(options.network)
|
||||
elif options.wired:
|
||||
config.SaveWiredNetworkProfile(options.name)
|
||||
op_performed = True
|
||||
|
||||
if not op_performed:
|
||||
print "No operations performed."
|
||||
|
||||
7
in/man=wicd-cli.8.in
Normal file
7
in/man=wicd-cli.8.in
Normal file
@@ -0,0 +1,7 @@
|
||||
.\" First revision was r???
|
||||
.TH WICD-CCLI "6" "November 2009"
|
||||
.SH NAME
|
||||
.B wicd-cli
|
||||
\- commandline- only wicd(8) controller
|
||||
.SH DESCRIPTION
|
||||
TODO :-)
|
||||
2
in/scripts=wicd-cli.in
Executable file
2
in/scripts=wicd-cli.in
Executable file
@@ -0,0 +1,2 @@
|
||||
#!/bin/bash
|
||||
exec python -O %LIB%wicd-cli.py $@
|
||||
6
setup.py
6
setup.py
@@ -98,6 +98,7 @@ class configure(Command):
|
||||
('no-install-pmutils', None, 'do not install the pm-utils hooks'),
|
||||
('no-install-docs', None, 'do not install the auxiliary documentation'),
|
||||
('no-install-ncurses', None, 'do not install the ncurses client'),
|
||||
('no-install-cli', None, 'do not install the command line executable'),
|
||||
('no-use-notifications', None, 'do not ever allow the use of libnotify notifications')
|
||||
]
|
||||
|
||||
@@ -134,6 +135,7 @@ class configure(Command):
|
||||
self.no_install_pmutils = False
|
||||
self.no_install_docs = False
|
||||
self.no_install_ncurses = False
|
||||
self.no_install_cli = False
|
||||
self.no_use_notifications = False
|
||||
|
||||
# Determine the default init file location on several different distros
|
||||
@@ -505,6 +507,10 @@ try:
|
||||
data.append((wpath.bin, ['scripts/wicd-curses']))
|
||||
if not wpath.no_install_man:
|
||||
data.append(( wpath.mandir + 'man8/', ['man/wicd-curses.8']))
|
||||
if not wpath.no_install_cli:
|
||||
data.append((wpath.bin, ['scripts/wicd-cli']))
|
||||
if not wpath.no_install_man:
|
||||
data.append(( wpath.mandir + 'man8/', ['man/wicd-cli.8']))
|
||||
piddir = os.path.dirname(wpath.pidfile)
|
||||
if not piddir.endswith('/'):
|
||||
piddir += '/'
|
||||
|
||||
Reference in New Issue
Block a user