nie wiem co zmieniałem, a dużo tego było
This commit is contained in:
@ -1,4 +1,4 @@
|
||||
#!/bin/sh
|
||||
|
||||
rofi -no-lazy-grab -show drun -theme themes/app-launcher.rasi
|
||||
rofi -no-lazy-grab -show drun
|
||||
|
||||
|
69
.config/rofi/scripts/mpdmenu.sh
Executable file
69
.config/rofi/scripts/mpdmenu.sh
Executable file
@ -0,0 +1,69 @@
|
||||
#!/bin/bash
|
||||
|
||||
rofi_command="rofi -theme /usr/share/rofi-menus-git/themes/mpdmenu.rasi"
|
||||
|
||||
### Options ###
|
||||
# Gets the current status of mpd (for us to parse it later on)
|
||||
status="$(mpc status)"
|
||||
# Defines the Play / Pause option content
|
||||
if [[ $status == *"[playing]"* ]]; then
|
||||
play_pause=""
|
||||
else
|
||||
play_pause=""
|
||||
fi
|
||||
active=""
|
||||
urgent=""
|
||||
# Display if repeat mode is on / off
|
||||
tog_repeat="凌"
|
||||
if [[ $status == *"repeat: on"* ]]; then
|
||||
active="-a 4"
|
||||
elif [[ $status == *"repeat: off"* ]]; then
|
||||
urgent="-u 4"
|
||||
else
|
||||
tog_repeat=" Parsing error"
|
||||
fi
|
||||
# Display if random mode is on / off
|
||||
tog_random=""
|
||||
if [[ $status == *"random: on"* ]]; then
|
||||
[ -n "$active" ] && active+=",5" || active="-a 5"
|
||||
elif [[ $status == *"random: off"* ]]; then
|
||||
[ -n "$urgent" ] && urgent+=",5" || urgent="-u 5"
|
||||
else
|
||||
tog_random=" Parsing error"
|
||||
fi
|
||||
stop=""
|
||||
next=""
|
||||
previous=""
|
||||
# Variable passed to rofi
|
||||
options="$previous\n$play_pause\n$stop\n$next\n$tog_repeat\n$tog_random"
|
||||
|
||||
# Get the current playing song
|
||||
current=$(mpc current)
|
||||
# If mpd isn't running it will return an empty string, we don't want to display that
|
||||
if [[ -z "$current" ]]; then
|
||||
current="-"
|
||||
fi
|
||||
|
||||
# Spawn the mpd menu with the "Play / Pause" entry selected by default
|
||||
chosen="$(echo -e "$options" | $rofi_command -p "$current" -dmenu $active $urgent -selected-row 1)"
|
||||
case $chosen in
|
||||
$previous)
|
||||
mpc -q prev
|
||||
;;
|
||||
$play_pause)
|
||||
mpc -q toggle
|
||||
;;
|
||||
$stop)
|
||||
mpc -q stop
|
||||
;;
|
||||
$next)
|
||||
mpc -q next
|
||||
;;
|
||||
$tog_repeat)
|
||||
mpc -q repeat
|
||||
;;
|
||||
$tog_random)
|
||||
mpc -q random
|
||||
;;
|
||||
esac
|
||||
|
693
.config/rofi/scripts/networkmenu.py
Executable file
693
.config/rofi/scripts/networkmenu.py
Executable file
@ -0,0 +1,693 @@
|
||||
#!/usr/bin/env python
|
||||
# encoding:utf8
|
||||
"""NetworkManager command line dmenu script.
|
||||
|
||||
To add new connections or enable/disable networking requires policykit
|
||||
permissions setup per:
|
||||
https://wiki.archlinux.org/index.php/NetworkManager#Set_up_PolicyKit_permissions
|
||||
|
||||
OR running the script as root
|
||||
|
||||
Add dmenu formatting options and default terminal if desired to
|
||||
/usr/share/rofi-menus-git/networkmanager/config.ini
|
||||
|
||||
"""
|
||||
import itertools
|
||||
import locale
|
||||
import os
|
||||
from os.path import expanduser
|
||||
import shlex
|
||||
import sys
|
||||
import uuid
|
||||
from subprocess import Popen, PIPE
|
||||
|
||||
import gi
|
||||
gi.require_version('NM', '1.0')
|
||||
from gi.repository import GLib, NM # pylint: disable=wrong-import-position
|
||||
|
||||
try:
|
||||
import configparser as configparser
|
||||
except ImportError:
|
||||
import ConfigParser as configparser
|
||||
|
||||
ENV = os.environ.copy()
|
||||
ENV['LC_ALL'] = 'C'
|
||||
ENC = locale.getpreferredencoding()
|
||||
|
||||
CLIENT = NM.Client.new(None)
|
||||
LOOP = GLib.MainLoop()
|
||||
CONNS = CLIENT.get_connections()
|
||||
|
||||
if sys.version_info.major < 3:
|
||||
str = unicode
|
||||
|
||||
def dmenu_cmd(num_lines, prompt="Networks", active_lines=None): # pylint: disable=too-many-branches
|
||||
"""Parse config.ini if it exists and add options to the dmenu command
|
||||
|
||||
Args: args - num_lines: number of lines to display
|
||||
prompt: prompt to show
|
||||
Returns: command invocation (as a list of strings) for
|
||||
dmenu -l <num_lines> -p <prompt> -i ...
|
||||
|
||||
"""
|
||||
dmenu_command = "dmenu"
|
||||
conf = configparser.ConfigParser()
|
||||
conf.read(expanduser("/usr/share/rofi-menus-git/networkmanager/config.ini"))
|
||||
if not conf.sections():
|
||||
res = [dmenu_command, "-i", "-l", str(num_lines), "-p", str(prompt)]
|
||||
res.extend(sys.argv[1:])
|
||||
return res
|
||||
if conf.has_section('dmenu'):
|
||||
args = conf.items('dmenu')
|
||||
args_dict = dict(args)
|
||||
dmenu_args = []
|
||||
if "dmenu_command" in args_dict:
|
||||
command = shlex.split(args_dict["dmenu_command"])
|
||||
dmenu_command = command[0]
|
||||
dmenu_args = command[1:]
|
||||
del args_dict["dmenu_command"]
|
||||
if "p" in args_dict and prompt == "Networks":
|
||||
prompt = args_dict["p"]
|
||||
del args_dict["p"]
|
||||
elif "p" in args_dict:
|
||||
del args_dict["p"]
|
||||
if "rofi" in dmenu_command:
|
||||
lines = "-i -dmenu -lines"
|
||||
# rofi doesn't support 0 length line, it requires at least -lines=1
|
||||
# see https://github.com/DaveDavenport/rofi/issues/252
|
||||
num_lines = num_lines or 1
|
||||
else:
|
||||
lines = "-i -l"
|
||||
if "l" in args_dict:
|
||||
# rofi doesn't support 0 length line, it requires at least -lines=1
|
||||
# see https://github.com/DaveDavenport/rofi/issues/252
|
||||
if "rofi" in dmenu_command:
|
||||
args_dict['l'] = min(num_lines, int(args_dict['l'])) or 1
|
||||
lines = "{} {}".format(lines, args_dict['l'])
|
||||
del args_dict['l']
|
||||
else:
|
||||
lines = "{} {}".format(lines, num_lines)
|
||||
if "pinentry" in args_dict:
|
||||
del args_dict["pinentry"]
|
||||
if conf.has_option('dmenu', 'rofi_highlight'):
|
||||
rofi_highlight = conf.getboolean('dmenu', 'rofi_highlight')
|
||||
del args_dict["rofi_highlight"]
|
||||
else:
|
||||
rofi_highlight = False
|
||||
if rofi_highlight is True and "rofi" in dmenu_command:
|
||||
if active_lines:
|
||||
dmenu_args.extend(["-a", ",".join([str(num)
|
||||
for num in active_lines])])
|
||||
if prompt == "Passphrase":
|
||||
if conf.has_section('dmenu_passphrase'):
|
||||
args = conf.items('dmenu_passphrase')
|
||||
args_dict.update(args)
|
||||
rofi_obscure = True
|
||||
if conf.has_option('dmenu_passphrase', 'rofi_obscure'):
|
||||
rofi_obscure = conf.getboolean('dmenu_passphrase', 'rofi_obscure')
|
||||
del args_dict["rofi_obscure"]
|
||||
if rofi_obscure is True and "rofi" in dmenu_command:
|
||||
dmenu_args.extend(["-password"])
|
||||
extras = (["-" + str(k), str(v)] for (k, v) in args_dict.items())
|
||||
res = [dmenu_command, "-p", str(prompt)]
|
||||
res.extend(dmenu_args)
|
||||
res += list(itertools.chain.from_iterable(extras))
|
||||
res[1:1] = lines.split()
|
||||
res = list(filter(None, res)) # Remove empty list elements
|
||||
res.extend(sys.argv[1:])
|
||||
return res
|
||||
|
||||
|
||||
def choose_adapter(client):
|
||||
"""If there is more than one wifi adapter installed, ask which one to use
|
||||
|
||||
"""
|
||||
devices = client.get_devices()
|
||||
devices = [i for i in devices if i.get_device_type() == NM.DeviceType.WIFI]
|
||||
if not devices:
|
||||
return None
|
||||
elif devices:
|
||||
return devices[0]
|
||||
device_names = "\n".join([d.get_iface() for d in devices]).encode(ENC)
|
||||
sel = Popen(dmenu_cmd(len(devices), "CHOOSE ADAPTER:"),
|
||||
stdin=PIPE,
|
||||
stdout=PIPE,
|
||||
env=ENV).communicate(input=device_names)[0].decode(ENC)
|
||||
if not sel.strip():
|
||||
sys.exit()
|
||||
devices = [i for i in devices if i.get_iface() == sel.strip()]
|
||||
assert len(devices) == 1
|
||||
return devices[0]
|
||||
|
||||
|
||||
def is_modemmanager_installed():
|
||||
"""Check if ModemManager is installed"""
|
||||
devnull = open(os.devnull)
|
||||
try:
|
||||
Popen(["ModemManager"], stdout=devnull, stderr=devnull).communicate()
|
||||
except OSError:
|
||||
return False
|
||||
return True
|
||||
|
||||
|
||||
def create_other_actions(client):
|
||||
"""Return list of other actions that can be taken
|
||||
|
||||
"""
|
||||
networking_enabled = client.networking_get_enabled()
|
||||
networking_action = "Disable" if networking_enabled else "Enable"
|
||||
wifi_enabled = client.wireless_get_enabled()
|
||||
wifi_action = "Disable" if wifi_enabled else "Enable"
|
||||
actions = [Action("{} Wifi".format(wifi_action), toggle_wifi,
|
||||
not wifi_enabled),
|
||||
Action("{} Networking".format(networking_action),
|
||||
toggle_networking, not networking_enabled),
|
||||
Action("Launch Connection Manager", launch_connection_editor),
|
||||
Action("Delete a Connection", delete_connection)]
|
||||
if wifi_enabled:
|
||||
actions.append(Action("Rescan Wifi Networks", rescan_wifi))
|
||||
return actions
|
||||
|
||||
def rescan_wifi():
|
||||
"""
|
||||
Rescan Wifi Access Points
|
||||
"""
|
||||
for dev in CLIENT.get_devices():
|
||||
if gi.repository.NM.DeviceWifi == type(dev):
|
||||
try:
|
||||
dev.request_scan()
|
||||
except gi.repository.GLib.Error as err:
|
||||
# Too frequent rescan error
|
||||
if not err.code == 6: # pylint: disable=no-member
|
||||
raise err
|
||||
|
||||
def ssid_to_utf8(nm_ap):
|
||||
""" Convert binary ssid to utf-8 """
|
||||
ssid = nm_ap.get_ssid()
|
||||
if not ssid:
|
||||
return ""
|
||||
ret = NM.utils_ssid_to_utf8(ssid.get_data())
|
||||
if sys.version_info.major < 3:
|
||||
return ret.decode(ENC)
|
||||
return ret
|
||||
|
||||
|
||||
def ap_security(nm_ap):
|
||||
"""Parse the security flags to return a string with 'WPA2', etc. """
|
||||
flags = nm_ap.get_flags()
|
||||
wpa_flags = nm_ap.get_wpa_flags()
|
||||
rsn_flags = nm_ap.get_rsn_flags()
|
||||
sec_str = ""
|
||||
if ((flags & getattr(NM, '80211ApFlags').PRIVACY) and
|
||||
(wpa_flags == 0) and (rsn_flags == 0)):
|
||||
sec_str += " WEP"
|
||||
if wpa_flags != 0:
|
||||
sec_str += " WPA1"
|
||||
if rsn_flags != 0:
|
||||
sec_str += " WPA2"
|
||||
if ((wpa_flags & getattr(NM, '80211ApSecurityFlags').KEY_MGMT_802_1X) or
|
||||
(rsn_flags & getattr(NM, '80211ApSecurityFlags').KEY_MGMT_802_1X)):
|
||||
sec_str += " 802.1X"
|
||||
|
||||
# If there is no security use "--"
|
||||
if sec_str == "":
|
||||
sec_str = "--"
|
||||
return sec_str.lstrip()
|
||||
|
||||
|
||||
class Action(object): # pylint: disable=too-few-public-methods
|
||||
"""Helper class to execute functions from a string variable"""
|
||||
def __init__(self,
|
||||
name,
|
||||
func,
|
||||
args=None,
|
||||
active=False,
|
||||
):
|
||||
self.name = name
|
||||
self.func = func
|
||||
self.is_active = active
|
||||
if args is None:
|
||||
self.args = None
|
||||
elif isinstance(args, list):
|
||||
self.args = args
|
||||
else:
|
||||
self.args = [args]
|
||||
|
||||
def __str__(self):
|
||||
if sys.version_info.major < 3 and \
|
||||
isinstance(self.name, unicode) is False:
|
||||
return self.name.decode(ENC)
|
||||
return self.name
|
||||
|
||||
def __call__(self):
|
||||
if self.args is None:
|
||||
self.func()
|
||||
else:
|
||||
self.func(*self.args)
|
||||
|
||||
|
||||
def process_ap(nm_ap, is_active, adapter):
|
||||
"""Activate/Deactivate a connection and get password if required"""
|
||||
if is_active:
|
||||
CLIENT.deactivate_connection_async(nm_ap)
|
||||
else:
|
||||
conns_cur = [i for i in CONNS if
|
||||
i.get_setting_wireless() is not None and
|
||||
i.get_setting_wireless().get_mac_address() ==
|
||||
adapter.get_permanent_hw_address()]
|
||||
con = nm_ap.filter_connections(conns_cur)
|
||||
if len(con) > 1:
|
||||
raise ValueError("There are multiple connections possible")
|
||||
|
||||
if len(con) == 1:
|
||||
CLIENT.activate_connection_async(con[0])
|
||||
else:
|
||||
if ap_security(nm_ap) != "--":
|
||||
password = get_passphrase()
|
||||
else:
|
||||
password = ""
|
||||
set_new_connection(nm_ap, password, adapter)
|
||||
|
||||
|
||||
def process_vpngsm(con, activate):
|
||||
"""Activate/deactive VPN or GSM connections"""
|
||||
if activate:
|
||||
CLIENT.activate_connection_async(con)
|
||||
else:
|
||||
CLIENT.deactivate_connection_async(con)
|
||||
|
||||
|
||||
def create_ap_actions(aps, active_ap, active_connection, adapter): # pylint: disable=too-many-locals
|
||||
"""For each AP in a list, create the string and its attached function
|
||||
(activate/deactivate)
|
||||
|
||||
"""
|
||||
active_ap_bssid = active_ap.get_bssid() if active_ap is not None else ""
|
||||
|
||||
names = [ssid_to_utf8(ap) for ap in aps]
|
||||
max_len_name = max([len(name) for name in names]) if names else 0
|
||||
secs = [ap_security(ap) for ap in aps]
|
||||
max_len_sec = max([len(sec) for sec in secs]) if secs else 0
|
||||
|
||||
ap_actions = []
|
||||
|
||||
for nm_ap, name, sec in zip(aps, names, secs):
|
||||
bars = NM.utils_wifi_strength_bars(nm_ap.get_strength())
|
||||
is_active = nm_ap.get_bssid() == active_ap_bssid
|
||||
action_name = u"{:<{}s} {:<{}s} {}".format(name, max_len_name, sec,
|
||||
max_len_sec, bars)
|
||||
if is_active:
|
||||
ap_actions.append(Action(action_name, process_ap,
|
||||
[active_connection, True, adapter],
|
||||
active=True))
|
||||
else:
|
||||
ap_actions.append(Action(action_name, process_ap,
|
||||
[nm_ap, False, adapter]))
|
||||
return ap_actions
|
||||
|
||||
|
||||
def create_vpn_actions(vpns, active):
|
||||
"""Create the list of strings to display with associated function
|
||||
(activate/deactivate) for VPN connections.
|
||||
|
||||
"""
|
||||
active_vpns = [i for i in active if i.get_vpn()]
|
||||
return _create_vpngsm_actions(vpns, active_vpns, "VPN")
|
||||
|
||||
|
||||
def create_eth_actions(eths, active):
|
||||
"""Create the list of strings to display with associated function
|
||||
(activate/deactivate) for Ethernet connections.
|
||||
|
||||
"""
|
||||
active_eths = [i for i in active if 'ethernet' in i.get_connection_type()]
|
||||
return _create_vpngsm_actions(eths, active_eths, "Eth")
|
||||
|
||||
|
||||
def create_gsm_actions(gsms, active):
|
||||
"""Create the list of strings to display with associated function
|
||||
(activate/deactivate) GSM connections."""
|
||||
active_gsms = [i for i in active if
|
||||
i.get_connection() is not None and
|
||||
i.get_connection().is_type(NM.SETTING_GSM_SETTING_NAME)]
|
||||
return _create_vpngsm_actions(gsms, active_gsms, "GSM")
|
||||
|
||||
|
||||
def create_blue_actions(blues, active):
|
||||
"""Create the list of strings to display with associated function
|
||||
(activate/deactivate) Bluetooth connections."""
|
||||
active_blues = [i for i in active if
|
||||
i.get_connection() is not None and
|
||||
i.get_connection().is_type(NM.SETTING_BLUETOOTH_SETTING_NAME)]
|
||||
return _create_vpngsm_actions(blues, active_blues, "Bluetooth")
|
||||
|
||||
|
||||
def _create_vpngsm_actions(cons, active_cons, label):
|
||||
active_con_ids = [a.get_id() for a in active_cons]
|
||||
actions = []
|
||||
for con in cons:
|
||||
is_active = con.get_id() in active_con_ids
|
||||
action_name = u"{}:{}".format(con.get_id(), label)
|
||||
if is_active:
|
||||
active_connection = [a for a in active_cons
|
||||
if a.get_id() == con.get_id()]
|
||||
if len(active_connection) != 1:
|
||||
raise ValueError(u"Multiple active connections match"
|
||||
" the connection: {}".format(con.get_id()))
|
||||
active_connection = active_connection[0]
|
||||
|
||||
actions.append(Action(action_name, process_vpngsm,
|
||||
[active_connection, False], active=True))
|
||||
else:
|
||||
actions.append(Action(action_name, process_vpngsm,
|
||||
[con, True]))
|
||||
return actions
|
||||
|
||||
|
||||
def create_wwan_actions(client):
|
||||
"""Create WWWAN actions
|
||||
|
||||
"""
|
||||
wwan_enabled = client.wwan_get_enabled()
|
||||
wwan_action = "Disable" if wwan_enabled else "Enable"
|
||||
return [Action("{} WWAN".format(wwan_action), toggle_wwan, not wwan_enabled)]
|
||||
|
||||
|
||||
def get_selection(eths, aps, vpns, gsms, blues, wwan, others):
|
||||
"""Combine the arg lists and send to dmenu for selection.
|
||||
Also executes the associated action.
|
||||
|
||||
Args: args - eths: list of Actions
|
||||
aps: list of Actions
|
||||
vpns: list of Actions
|
||||
gsms: list of Actions
|
||||
blues: list of Actions
|
||||
wwan: list of Actions
|
||||
others: list of Actions
|
||||
|
||||
"""
|
||||
conf = configparser.ConfigParser()
|
||||
conf.read(expanduser("/usr/share/rofi-menus-git/networkmanager/config.ini"))
|
||||
rofi_highlight = False
|
||||
if conf.has_option('dmenu', 'rofi_highlight'):
|
||||
rofi_highlight = conf.getboolean('dmenu', 'rofi_highlight')
|
||||
inp = []
|
||||
empty_action = [Action('', None)]
|
||||
all_actions = []
|
||||
all_actions += eths + empty_action if eths else []
|
||||
all_actions += aps + empty_action if aps else []
|
||||
all_actions += vpns + empty_action if vpns else []
|
||||
all_actions += gsms + empty_action if (gsms and wwan) else []
|
||||
all_actions += blues + empty_action if blues else []
|
||||
all_actions += wwan + empty_action if wwan else []
|
||||
all_actions += others
|
||||
|
||||
if rofi_highlight is True:
|
||||
inp = [str(action) for action in all_actions]
|
||||
else:
|
||||
inp = [('** ' if action.is_active else ' ') + str(action)
|
||||
for action in all_actions]
|
||||
active_lines = [index for index, action in enumerate(all_actions)
|
||||
if action.is_active]
|
||||
|
||||
inp_bytes = "\n".join([i for i in inp]).encode(ENC)
|
||||
command = dmenu_cmd(len(inp), active_lines=active_lines)
|
||||
sel = Popen(command, stdin=PIPE, stdout=PIPE,
|
||||
env=ENV).communicate(input=inp_bytes)[0].decode(ENC)
|
||||
|
||||
if not sel.rstrip():
|
||||
sys.exit()
|
||||
|
||||
if rofi_highlight is False:
|
||||
action = [i for i in eths + aps + vpns + gsms + blues + wwan + others
|
||||
if ((str(i).strip() == str(sel.strip())
|
||||
and not i.is_active) or
|
||||
('** ' + str(i) == str(sel.rstrip('\n'))
|
||||
and i.is_active))]
|
||||
else:
|
||||
action = [i for i in eths + aps + vpns + gsms + blues + wwan + others
|
||||
if str(i).strip() == sel.strip()]
|
||||
assert len(action) == 1, \
|
||||
u"Selection was ambiguous: '{}'".format(str(sel.strip()))
|
||||
return action[0]
|
||||
|
||||
|
||||
def toggle_networking(enable):
|
||||
"""Enable/disable networking
|
||||
|
||||
Args: enable - boolean
|
||||
|
||||
"""
|
||||
CLIENT.networking_set_enabled(enable)
|
||||
|
||||
|
||||
def toggle_wifi(enable):
|
||||
"""Enable/disable Wifi
|
||||
|
||||
Args: enable - boolean
|
||||
|
||||
"""
|
||||
CLIENT.wireless_set_enabled(enable)
|
||||
|
||||
|
||||
def toggle_wwan(enable):
|
||||
"""Enable/disable WWAN
|
||||
|
||||
Args: enable - boolean
|
||||
|
||||
"""
|
||||
CLIENT.wwan_set_enabled(enable)
|
||||
|
||||
|
||||
def launch_connection_editor():
|
||||
"""Launch nmtui or the gui nm-connection-editor
|
||||
|
||||
"""
|
||||
conf = configparser.ConfigParser()
|
||||
conf.read(expanduser("/usr/share/rofi-menus-git/networkmanager/config.ini"))
|
||||
if conf.has_option("editor", "terminal"):
|
||||
terminal = conf.get("editor", "terminal")
|
||||
else:
|
||||
terminal = "xterm"
|
||||
if conf.has_option("editor", "gui_if_available"):
|
||||
gui_if_available = conf.get("editor", "gui_if_available")
|
||||
else:
|
||||
gui_if_available = "True"
|
||||
if gui_if_available == "True":
|
||||
try:
|
||||
Popen(["nm-connection-editor"]).communicate()
|
||||
except OSError:
|
||||
Popen([terminal, "-e", "nmtui"]).communicate()
|
||||
else:
|
||||
Popen([terminal, "-e", "nmtui"]).communicate()
|
||||
|
||||
|
||||
def get_passphrase():
|
||||
"""Get a password
|
||||
|
||||
Returns: string
|
||||
|
||||
"""
|
||||
|
||||
conf = configparser.ConfigParser()
|
||||
conf.read(expanduser("/usr/share/rofi-menus-git/networkmanager/config.ini"))
|
||||
pinentry = None
|
||||
if conf.has_option("dmenu", "pinentry"):
|
||||
pinentry = conf.get("dmenu", "pinentry")
|
||||
if pinentry:
|
||||
pin = ""
|
||||
out = Popen(pinentry,
|
||||
stdout=PIPE,
|
||||
stdin=PIPE).communicate( \
|
||||
input=b'setdesc Get network password\ngetpin\n')[0]
|
||||
if out:
|
||||
res = out.decode(ENC).split("\n")[2]
|
||||
if res.startswith("D "):
|
||||
pin = res.split("D ")[1]
|
||||
return pin
|
||||
else:
|
||||
return Popen(dmenu_cmd(0, "Passphrase"),
|
||||
stdin=PIPE, stdout=PIPE).communicate()[0].decode(ENC)
|
||||
|
||||
|
||||
def delete_connection():
|
||||
"""Display list of NM connections and delete the selected one
|
||||
|
||||
"""
|
||||
conn_acts = [Action(i.get_id(), i.delete) for i in CONNS]
|
||||
conn_names = "\n".join([str(i) for i in conn_acts]).encode(ENC)
|
||||
sel = Popen(dmenu_cmd(len(conn_acts), "CHOOSE CONNECTION TO DELETE:"),
|
||||
stdin=PIPE,
|
||||
stdout=PIPE,
|
||||
env=ENV).communicate(input=conn_names)[0].decode(ENC)
|
||||
if not sel.strip():
|
||||
sys.exit()
|
||||
action = [i for i in conn_acts if str(i) == sel.rstrip("\n")]
|
||||
assert len(action) == 1, u"Selection was ambiguous: {}".format(str(sel))
|
||||
action[0]()
|
||||
|
||||
|
||||
def set_new_connection(nm_ap, nm_pw, adapter):
|
||||
"""Setup a new NetworkManager connection
|
||||
|
||||
Args: ap - NM.AccessPoint
|
||||
pw - string
|
||||
|
||||
"""
|
||||
nm_pw = str(nm_pw).strip()
|
||||
profile = create_wifi_profile(nm_ap, nm_pw, adapter)
|
||||
CLIENT.add_and_activate_connection_async(profile, adapter, nm_ap.get_path(),
|
||||
None, verify_conn, profile)
|
||||
LOOP.run()
|
||||
|
||||
|
||||
def create_wifi_profile(nm_ap, password, adapter):
|
||||
# pylint: disable=C0301
|
||||
# From https://cgit.freedesktop.org/NetworkManager/NetworkManager/tree/examples/python/gi/add_connection.py
|
||||
# and https://cgit.freedesktop.org/NetworkManager/NetworkManager/tree/examples/python/dbus/add-wifi-psk-connection.py
|
||||
# pylint: enable=C0301
|
||||
"""Create the NM profile given the AP and passphrase"""
|
||||
ap_sec = ap_security(nm_ap)
|
||||
profile = NM.SimpleConnection.new()
|
||||
|
||||
s_con = NM.SettingConnection.new()
|
||||
s_con.set_property(NM.SETTING_CONNECTION_ID, ssid_to_utf8(nm_ap))
|
||||
s_con.set_property(NM.SETTING_CONNECTION_UUID, str(uuid.uuid4()))
|
||||
s_con.set_property(NM.SETTING_CONNECTION_TYPE, "802-11-wireless")
|
||||
profile.add_setting(s_con)
|
||||
|
||||
s_wifi = NM.SettingWireless.new()
|
||||
s_wifi.set_property(NM.SETTING_WIRELESS_SSID, nm_ap.get_ssid())
|
||||
s_wifi.set_property(NM.SETTING_WIRELESS_MODE, 'infrastructure')
|
||||
s_wifi.set_property(NM.SETTING_WIRELESS_MAC_ADDRESS, adapter.get_permanent_hw_address())
|
||||
profile.add_setting(s_wifi)
|
||||
|
||||
s_ip4 = NM.SettingIP4Config.new()
|
||||
s_ip4.set_property(NM.SETTING_IP_CONFIG_METHOD, "auto")
|
||||
profile.add_setting(s_ip4)
|
||||
|
||||
s_ip6 = NM.SettingIP6Config.new()
|
||||
s_ip6.set_property(NM.SETTING_IP_CONFIG_METHOD, "auto")
|
||||
profile.add_setting(s_ip6)
|
||||
|
||||
if ap_sec != "--":
|
||||
s_wifi_sec = NM.SettingWirelessSecurity.new()
|
||||
if "WPA" in ap_sec:
|
||||
s_wifi_sec.set_property(NM.SETTING_WIRELESS_SECURITY_KEY_MGMT,
|
||||
"wpa-psk")
|
||||
s_wifi_sec.set_property(NM.SETTING_WIRELESS_SECURITY_AUTH_ALG,
|
||||
"open")
|
||||
s_wifi_sec.set_property(NM.SETTING_WIRELESS_SECURITY_PSK, password)
|
||||
elif "WEP" in ap_sec:
|
||||
s_wifi_sec.set_property(NM.SETTING_WIRELESS_SECURITY_KEY_MGMT,
|
||||
"None")
|
||||
s_wifi_sec.set_property(NM.SETTING_WIRELESS_SECURITY_WEP_KEY_TYPE,
|
||||
NM.WepKeyType.PASSPHRASE)
|
||||
s_wifi_sec.set_wep_key(0, password)
|
||||
profile.add_setting(s_wifi_sec)
|
||||
|
||||
return profile
|
||||
|
||||
|
||||
def verify_conn(client, result, data):
|
||||
"""Callback function for add_and_activate_connection_async
|
||||
|
||||
Check if connection completes successfully. Delete the connection if there
|
||||
is an error.
|
||||
|
||||
"""
|
||||
try:
|
||||
act_conn = client.add_and_activate_connection_finish(result)
|
||||
conn = act_conn.get_connection()
|
||||
conn.verify()
|
||||
conn.verify_secrets()
|
||||
data.verify()
|
||||
data.verify_secrets()
|
||||
except GLib.Error: # pylint: disable=catching-non-exception
|
||||
try:
|
||||
conn.delete()
|
||||
except UnboundLocalError:
|
||||
pass
|
||||
finally:
|
||||
LOOP.quit()
|
||||
|
||||
|
||||
def create_ap_list(adapter, active_connections):
|
||||
"""Generate list of access points. Remove duplicate APs , keeping strongest
|
||||
ones and the active AP
|
||||
|
||||
Args: adapter
|
||||
active_connections - list of all active connections
|
||||
Returns: aps - list of access points
|
||||
active_ap - active AP
|
||||
active_ap_con - active Connection
|
||||
adapter
|
||||
|
||||
"""
|
||||
aps = []
|
||||
ap_names = []
|
||||
active_ap = adapter.get_active_access_point()
|
||||
aps_all = sorted(adapter.get_access_points(),
|
||||
key=lambda a: a.get_strength(), reverse=True)
|
||||
conns_cur = [i for i in CONNS if
|
||||
i.get_setting_wireless() is not None and
|
||||
i.get_setting_wireless().get_mac_address() ==
|
||||
adapter.get_permanent_hw_address()]
|
||||
try:
|
||||
ap_conns = active_ap.filter_connections(conns_cur)
|
||||
active_ap_name = ssid_to_utf8(active_ap)
|
||||
active_ap_con = [active_conn for active_conn in active_connections
|
||||
if active_conn.get_connection() in ap_conns]
|
||||
except AttributeError:
|
||||
active_ap_name = None
|
||||
active_ap_con = []
|
||||
if len(active_ap_con) > 1:
|
||||
raise ValueError("Multiple connection profiles match"
|
||||
" the wireless AP")
|
||||
active_ap_con = active_ap_con[0] if active_ap_con else None
|
||||
for nm_ap in aps_all:
|
||||
ap_name = ssid_to_utf8(nm_ap)
|
||||
if nm_ap != active_ap and ap_name == active_ap_name:
|
||||
# Skip adding AP if it's not active but same name as active AP
|
||||
continue
|
||||
if ap_name not in ap_names:
|
||||
ap_names.append(ap_name)
|
||||
aps.append(nm_ap)
|
||||
return aps, active_ap, active_ap_con, adapter
|
||||
|
||||
|
||||
def run():
|
||||
"""Main script entrypoint"""
|
||||
active = CLIENT.get_active_connections()
|
||||
adapter = choose_adapter(CLIENT)
|
||||
if adapter:
|
||||
ap_actions = create_ap_actions(*create_ap_list(adapter, active))
|
||||
else:
|
||||
ap_actions = []
|
||||
|
||||
vpns = [i for i in CONNS if i.is_type(NM.SETTING_VPN_SETTING_NAME)]
|
||||
eths = [i for i in CONNS if i.is_type(NM.SETTING_WIRED_SETTING_NAME)]
|
||||
blues = [i for i in CONNS if i.is_type(NM.SETTING_BLUETOOTH_SETTING_NAME)]
|
||||
|
||||
vpn_actions = create_vpn_actions(vpns, active)
|
||||
eth_actions = create_eth_actions(eths, active)
|
||||
blue_actions = create_blue_actions(blues, active)
|
||||
other_actions = create_other_actions(CLIENT)
|
||||
wwan_installed = is_modemmanager_installed()
|
||||
if wwan_installed:
|
||||
gsms = [i for i in CONNS if i.is_type(NM.SETTING_GSM_SETTING_NAME)]
|
||||
gsm_actions = create_gsm_actions(gsms, active)
|
||||
wwan_actions = create_wwan_actions(CLIENT)
|
||||
else:
|
||||
gsm_actions = []
|
||||
wwan_actions = []
|
||||
|
||||
sel = get_selection(eth_actions, ap_actions, vpn_actions, gsm_actions,
|
||||
blue_actions, wwan_actions, other_actions)
|
||||
sel()
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
run()
|
||||
|
||||
# vim: set et ts=4 sw=4 :
|
64
.config/rofi/scripts/nmvpnmenu.sh
Executable file
64
.config/rofi/scripts/nmvpnmenu.sh
Executable file
@ -0,0 +1,64 @@
|
||||
#!/bin/bash
|
||||
|
||||
disconnect() {
|
||||
nmcli con down id "$active" && notify-send "Network Manager" "Disconnected from <b>$active</b>" || notify-send "Network Manager" "Error disconnecting from <b>$active</b>!"
|
||||
}
|
||||
connect() {
|
||||
nmcli con up id "$chosen" && notify-send "Network Manager" "Now connected to <b>$chosen</b>" || notify-send "Network Manager" "Error connecting to <b>$chosen</b>!"
|
||||
}
|
||||
|
||||
# Get the active vpn connection if there's one
|
||||
active="$(nmcli -g name,type con show --active | grep vpn | sed -e 's#:vpn$##')"
|
||||
|
||||
# Get the list of vpns
|
||||
mapfile -t list < <(nmcli -g name,type con | grep vpn | sed -e 's#:vpn$##')
|
||||
# A vpn is active
|
||||
if [ -n "$active" ]; then
|
||||
status=" Connected"
|
||||
status_style="#prompt { background-color: @on; }"
|
||||
special="-a 0 -selected-row 1"
|
||||
# Variable passed to rofi
|
||||
options="$active"
|
||||
for i in "${!list[@]}"; do
|
||||
[ "${list[i]}" == "$active" ] && unset "list[i]" || options+="\n${list[i]}"
|
||||
done
|
||||
# No vpn is active
|
||||
else
|
||||
status=" Disconnected"
|
||||
status_style="#prompt { background-color: @off; }"
|
||||
special=""
|
||||
# Variable passed to rofi
|
||||
options=""
|
||||
for i in "${!list[@]}"; do
|
||||
options+="${list[i]}\n"
|
||||
done
|
||||
options=${options::-2}
|
||||
fi
|
||||
|
||||
chosen=$(echo -e "$options" | rofi -theme ~/.config/rofi/themes/nmvpnmenu.rasi -theme-str "$status_style" -p "$status" -dmenu -i $special)
|
||||
if [ "$chosen" == "$active" ]; then
|
||||
# Disconnect the active vpn
|
||||
disconnect
|
||||
else
|
||||
take_action=false
|
||||
# Check if the chosen option is in the list, to avoid taking action
|
||||
# on the user pressing Escape for example
|
||||
for i in "${!list[@]}"; do
|
||||
[ "${list[i]}" == "$chosen" ] && { take_action=true; break; }
|
||||
done
|
||||
if $take_action; then
|
||||
# A vpn is active
|
||||
if [ -n "$active" ]; then
|
||||
# Disconnect the active vpn
|
||||
disconnect
|
||||
wait
|
||||
sleep 1
|
||||
# Connect to the chosen one
|
||||
connect
|
||||
# No vpn is active
|
||||
else
|
||||
# Connect to the chosen one
|
||||
connect
|
||||
fi
|
||||
fi
|
||||
fi
|
58
.config/rofi/scripts/promptmenu.sh
Executable file
58
.config/rofi/scripts/promptmenu.sh
Executable file
@ -0,0 +1,58 @@
|
||||
#!/bin/bash
|
||||
|
||||
rofi_command="rofi -theme /usr/share/rofi-menus-git/themes/promptmenu.rasi"
|
||||
|
||||
### Options ###
|
||||
yes_text="Confirm"
|
||||
no_text="Cancel"
|
||||
query="Are you sure?"
|
||||
# Parse the args
|
||||
if [[ $# -eq 0 ]]; then
|
||||
echo -e "Usage: \e[100m \e[32mpromptmenu\e[39;100m -y <command> \e[0m"
|
||||
echo -e "All the options:\n" \
|
||||
"\e[34mOPTIONNAL \e[39;100m [ -o | --yes-text ] <text> \e[0m\n" \
|
||||
"\e[34mOPTIONNAL \e[39;100m [ -c | --no-text ] <text> \e[0m\n" \
|
||||
"\e[35mREQUIRED \e[39;100m [ -y | --yes-command ] <command> \e[0m\n" \
|
||||
"\e[34mOPTIONNAL \e[39;100m [ -n | --no-command ] <command> \e[0m\n" \
|
||||
"\e[34mOPTIONNAL \e[39;100m [ -q | --query ] txt \e[0m"
|
||||
exit 1
|
||||
else
|
||||
while [ $# -ne 0 ]; do
|
||||
case "$1" in
|
||||
-o | --yes-text) # Optionnal
|
||||
[ -n "$2" ] && yes_text="$2" || yes_text=""
|
||||
shift
|
||||
;;
|
||||
-c | --no-text) # Optionnal
|
||||
[ -n "$2" ] && no_text="$2" || no_text=""
|
||||
shift
|
||||
;;
|
||||
-y | --yes-command) # Required
|
||||
[ -n "$2" ] && yes_command="$2"
|
||||
shift
|
||||
;;
|
||||
-n | --no-command) # Optionnal
|
||||
[ -n "$2" ] && no_command="$2"
|
||||
shift
|
||||
;;
|
||||
-q | --query) # Optionnal
|
||||
[ -n "$2" ] && query="$2"
|
||||
shift
|
||||
;;
|
||||
esac
|
||||
shift
|
||||
done
|
||||
fi
|
||||
# Variable passed to rofi
|
||||
options="$yes_text\n$no_text"
|
||||
|
||||
chosen="$(echo -e "$options" | $rofi_command -p "$query" -dmenu -a 0 -u 1 -selected-row 1)"
|
||||
case $chosen in
|
||||
$yes_text)
|
||||
eval "$yes_command"
|
||||
;;
|
||||
$no_text)
|
||||
eval "$no_command"
|
||||
;;
|
||||
esac
|
||||
|
24
.config/rofi/scripts/scrotmenu.sh
Executable file
24
.config/rofi/scripts/scrotmenu.sh
Executable file
@ -0,0 +1,24 @@
|
||||
#!/bin/bash
|
||||
|
||||
rofi_command="rofi"
|
||||
|
||||
### Options ###
|
||||
screen=""
|
||||
area=""
|
||||
window=""
|
||||
# Variable passed to rofi
|
||||
options="$screen\n$area\n$window"
|
||||
|
||||
chosen="$(echo -e "$options" | $rofi_command -dmenu -selected-row 1)"
|
||||
case $chosen in
|
||||
$screen)
|
||||
sleep 1; scrot
|
||||
;;
|
||||
$area)
|
||||
scrot -s
|
||||
;;
|
||||
$window)
|
||||
sleep 1; scrot -u
|
||||
;;
|
||||
esac
|
||||
|
@ -1,6 +1,6 @@
|
||||
#!/usr/bin/bash
|
||||
|
||||
sink=$(ponymix -t sink list|awk '/^sink/ {s=$1" "$2;getline;gsub(/^ +/,"",$0);print s" "$0}'|rofi -theme /usr/share/rofi-menus-git/themes/nmvpnmenu.rasi -dmenu -p 'pulseaudio sink:' -location 6 -width 100|grep -Po '[0-9]+(?=:)') &&
|
||||
sink=$(ponymix -t sink list|awk '/^sink/ {s=$1" "$2;getline;gsub(/^ +/,"",$0);print s" "$0}'|rofi -theme ~/.config/rofi/themes/nmvpnmenu.rasi -dmenu -p 'pulseaudio sink:' -location 6 -width 100|grep -Po '[0-9]+(?=:)') &&
|
||||
|
||||
ponymix set-default -d $sink &&
|
||||
for input in $(ponymix list -t sink-input|grep -Po '[0-9]+(?=:)');do
|
||||
|
Reference in New Issue
Block a user