Я хочу создать «переключатель», чтобы включить мой Unity Launcher для запуска или остановки моей настройки OpenVPN.
В основном я ищу значок, который мог бы либо
sudo /etc/init.d/openvpn start
или
sudo /etc/init.d/openvpn stop
(либо путем выбора одного варианта или другого, либо путем переключения, когда я щелкаю по нему).
Я нахожусь в процессе перехода на Linux после десятилетнего использования Mac, пожалуйста, будьте проще, потому что мой мозг мог сгнить. Я знаю, что это возможно, потому что я видел это на машине бывшего коллеги.
Вывод из маршрута, когда я не подключен через VPN:
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default 192.168.111.1 0.0.0.0 UG 0 0 0 wlan0
192.168.111.0 * 255.255.255.0 U 9 0 0 wlan0
Вывод, когда я подключен через VPN
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default 10.8.0.101 128.0.0.0 UG 0 0 0 tun0
default 192.168.111.1 0.0.0.0 UG 0 0 0 wlan0
10.8.0.1 10.8.0.101 255.255.255.255 UGH 0 0 0 tun0
10.8.0.101 * 255.255.255.255 UH 0 0 0 tun0
<OpenVPNserver>.net 192.168.111.1 255.255.255.255 UGH 0 0 0 wlan0
128.0.0.0 10.8.0.101 128.0.0.0 UG 0 0 0 tun0
192.168.111.0 * 255.255.255.0 U 9 0 0 wlan0
Вот сценарий переключателя, описание, как настроить, два файла на рабочем столе и их соответствующие значки. Хотя ответ немного обширен, это просто для установки.
Как это работает
При нажатии на значок в средстве запуска сценарий ищет, если соединение VPN закончилось или вниз. В любом случае это переключается на другую опцию, и значок в средстве запуска будет заменен соответственно. После 10 секунд сценарий проверяет, было ли соединение на самом деле установлено. В противном случае это возвращает значок к корректному. Можно измениться, это "приводит к таймауту" набора в headsection сценария (wait = 10
). (не касайтесь других определений, если Вы не знаете то, что Вы делаете),
Несколько комментариев:
<OpenVPNserver>
, так как это было simpelest и самой очевидной строкой для поиска. Если установка использовалась бы для других типов соединений, это не будет достаточно./.restore_currentlauncher.sh
. Хотя в годах я использовал его, мне никогда не был нужен он, хорошо иметь.Как использовать:
Значки:
Щелкните правой кнопкой по значкам ниже и сохраните их как toggle_officon.png
(белый) и toggle_onicon.png
(зеленый).
Сценарий: Скопируйте (весь) текст ниже, вставьте его в пустой файл и безопасный он как toggle_vpn.py
#!/usr/bin/python3
import subprocess
import getpass
import time
# time to wait, to check if connection was established (set correct icon)
wait = 10
# identifying difference on route command
running_id = "<OpenVPNserver>"
# location of the launcher restore script
backup_copy = "/home/"+getpass.getuser()+"/.restore_currentlauncher.sh"
# name of the desktop file if connection is down
mention_ifdown = 'application://VPN_off.desktop'
# name of the desktop file if connection is down
mention_ifup = 'application://VPN_on.desktop'
def check_ifrunning():
# check if connection is up or down
get_routeinfo = subprocess.Popen(["route"], stdout=subprocess.PIPE)
output = (get_routeinfo.communicate()[0].decode("utf-8"))
if running_id in output:
return "running"
else:
return "not_running"
def read_currentlauncher():
# read the current launcher contents
get_launcheritems = subprocess.Popen([
"gsettings",
"get",
"com.canonical.Unity.Launcher",
"favorites"
], stdout=subprocess.PIPE)
return eval((get_launcheritems.communicate()[0].decode("utf-8")))
def set_current_launcher(current_launcher):
# before editing the launcher, create restore script
backup_data = read_currentlauncher()
with open(backup_copy, "wt") as create_backup:
create_backup.write(
"#!/bin/sh\n\n"\
"gsettings set com.canonical.Unity.Launcher favorites "+\
'"'+str(backup_data)+'"'
)
# preparing subprocess command string
current_launcher = str(current_launcher).replace(", ", ",")
subprocess.Popen([
"gsettings",
"set",
"com.canonical.Unity.Launcher",
"favorites",
current_launcher,
])
def set_icon(change_mode):
# defines the appropriate icon in the launcher
state = check_ifrunning()
if state == "running":
if change_mode == "set_current":
iconset = [mention_ifup, mention_ifdown]
else:
iconset = [mention_ifdown, mention_ifup]
elif state == "not_running":
if change_mode == "set_current":
iconset = [mention_ifdown, mention_ifup]
else:
iconset = [mention_ifup, mention_ifdown]
# set the defined icon
current_launcher = read_currentlauncher()
if iconset[0] in current_launcher:
pass
else:
index = current_launcher.index(iconset[1])
current_launcher.pop(index)
set_current_launcher(current_launcher)
time.sleep(1)
current_launcher.insert(index, iconset[0])
set_current_launcher(current_launcher)
def toggle_connection():
set_icon("set_alter")
runcheck = check_ifrunning()
if runcheck == "not_running":
subprocess.call(["gksu", "/etc/init.d/openvpn", "start"])
else:
subprocess.call(["gksu", "/etc/init.d/openvpn", "stop"])
time.sleep(wait)
set_icon("set_current")
toggle_connection()
Файлы на рабочем столе
VPN_off desktopfile: скопируйте текст ниже, введите соответствующие пути и к значку и к сценарию, сохраните его как VPN_off.desktop в ~/.local/share/applications
[Desktop Entry]
Name=VPN_off
Exec=python3 /path_to_script/toggle_vpn.py
Icon=/path_to_icon/toggle_officon.png
Terminal=false
Type=Application
NoDisplay=true
VPN_on desktopfile: скопируйте текст ниже, введите соответствующие пути и к значку и к сценарию, сохраните его как VPN_on.desktop в ~/.local/share/applications
[Desktop Entry]
Name=VPN_on
Exec=python3 /path_to_script/toggle_vpn.py
Icon=/path_to_icon/toggle_onicon.png
Terminal=false
Type=Application
NoDisplay=true
Если Вы сделали действия выше, перетащите любой из этих файлов на рабочем столе на средстве запуска (Вам, возможно, придется выйти и зайти), и это должно работать! При перетаскивании "неправильного" файла на рабочем столе на средстве запуска он будет исправлен на первом использовании.
В случае, если Вы нуждаетесь в более определенной информации о деталях, оставляете комментарий.