Tecla de alternância GUI para hotspot Wi-Fi (ligado / desligado)

1

Eu quero criar um widget de GUI como alternância on / off para executar um conjunto de comandos.

Por exemplo, para ativar e desativar o hotspot de Wi-Fi usando ap-hotspot start/stop .

Alguém me ajuda ...

    
por rajan 25.04.2014 / 15:22

1 resposta

5

Você pode praticar um método universal para criar um script de alternância / funcionalidade para configurações, conexões etc. Além disso, você provavelmente poderá reutilizar uma grande parte do código para diferentes situações. No entanto, é fácil dar uma solução fácil "tudo em um", aplicável em diferentes situações e sem qualquer conhecimento ou sentimento de codificação. Você depende da natureza dos dois estados para os quais o script deve alternar, seus comandos correspondentes e o método que você pode usar (ou não) para verificar qual é o estado atual.

Tendo dito isto, dado o seu exemplo de hotspot alternativo, abaixo estão três prontos para usar versões de uma configuração, de relativamente simples a um pouco mais complicada. Os dois primeiros são os mais "universais"; o terceiro é para uso somente em Unity.

A "anatomia" geral dos scripts de alternância é a seguinte:

> check what is the current_status
> if current_status = A:
      (switch icon to icon_b)
      run command to change state to B
      (check if toggle command was successful, if not > switch icon back)
> else:
      (switch launcher icon to icon_a)
      run command to change to change to A
      (check if toggle command was successful, if not > switch icon back)

Alternar configuração; os três exemplos

  1. Alternando com um único iniciador (arquivo da área de trabalho) em sua área de trabalho.
  2. Idem, mas alternando o ícone também, para mostrar o estado atual
  3. Comutando de um ícone no iniciador do Unity, com o ícone de alternância para mostrar o estado atual

Notas:

  • Como sua senha será solicitada, você precisará instalar o gksu, caso ainda não esteja no seu sistema. O Exemplo 3 não deve ser usado (como está) em 12.04 ou anterior.
  • Lembre-se de que um script que solicita permissão do administrador é um risco de segurança em potencial. Se você está tendo dúvidas sobre quem está fazendo o que no seu computador, armazene-o em um diretório seguro.

1. Alternando com um único iniciador (arquivo da área de trabalho) em sua área de trabalho

O mais simples: alternar através de uma partida (fixa) na sua área de trabalho

Instruções :

Ícone:

Faça o download de um dos ícones abaixo (clique com o botão direito do mouse > como seguro) e confira-o como toggle_icon.png em um local de sua preferência.

O script:

Copie o texto abaixo, cole-o em um arquivo vazio e salve-o como hotspot.py em um local de sua preferência.

#!/usr/bin/python3

import subprocess

# identifying string to look for when "pstree" is run
running_id = "ap-hotspot"

def check_ifrunning(): 
    # check if hotspot is up or down
    get_pstreeinfo = subprocess.Popen(["pstree"], stdout=subprocess.PIPE)
    output = (get_pstreeinfo.communicate()[0].decode("utf-8"))
    if running_id in output:
        return "running"
    else:
        return "not_running"

def toggle_connection():
    runcheck = check_ifrunning()  
    if runcheck == "not_running":
    # command to start hotspot (spaces replaced by ",")
        subprocess.Popen(["gksu", "ap-hotspot", "start"])
    else:
        # idem, stop hotspot
        subprocess.Popen(["gksu", "ap-hotspot", "stop"])

toggle_connection()

Crie um arquivo da área de trabalho:

Copie o texto abaixo, cole-o em um arquivo de texto vazio. Adicione o caminho correto ao script na linha Exec= , o caminho correto na linha Icon= e proteja-o na área de trabalho como hotspot_toggle.desktop . Torne-o executável e sua configuração deve funcionar.

[Desktop Entry]
Name=Hotspot toggle
Comment=Hotspot toggle
Categories=Accessories
Exec=python3 /path/to/script/hotspot.py
Icon=/path/to/icon/toggle_icon.png
Terminal=false
Type=Application
StartupNotify=true

2. Alternando com um único iniciador (arquivo da área de trabalho) em sua área de trabalho, com efeito de mudança de ícone

Esta é uma versão aprimorada do primeiro exemplo: o ícone mudará para toggle_officon.png / toggle_onicon.png em sua área de trabalho, dependendo de o ponto de acesso estar ativado / desativado.

Instruções :

Ícones:

Faça o download de ambos ícones do primeiro exemplo, proteja-os como

toggle_officon.png (the grey one)
toggle_onicon.png (the green one) 

em um local de sua escolha.

O script:

Copie o texto abaixo, cole-o em um arquivo vazio e salve-o como hotspot.py em um local de sua escolha. Adicione os caminhos corretos para as linhas que começam com path_todtfile = (caminho para o arquivo da área de trabalho, veja mais abaixo), icon_offpath = (caminho para toggle_officon.png) e icon_onpath = (caminho para toggle_onicon.png). Nota: O nome "real" do arquivo da área de trabalho é como você o nomeou quando você o salvou. O nome que você vê na sua interface é definido na linha Name= do arquivo da área de trabalho.

#!/usr/bin/python3

import subprocess
import time

wait = 10

# identifying difference on pstree command on / off
running_id = "ap-hotspot"

# pathto_desktop file
path_todtfile = "/path/to/desktop_file/toggle.desktop"
# paths to icons
icon_offpath = "/path/to/toggle_off_icon/toggle_officon.png"
icon_onpath = "/path/to/toggle_on_icon/toggle_onicon.png"

def set_icon(set_mode, state):
    if state == "running":
        iconset = [icon_onpath, icon_offpath]
    else:
        iconset = [icon_offpath, icon_onpath]
    if set_mode == "set_current":
        appropriate_iconpath = iconset[0]
    else:
        appropriate_iconpath = iconset[1]
    with open(path_todtfile, "r") as editicon:
        editicon = editicon.readlines()
    line_toedit = [editicon.index(line) for line in editicon if\
                   line.startswith("Icon=")][0]
    if not editicon[line_toedit] == "Icon="+appropriate_iconpath+"\n":
        editicon[line_toedit] = "Icon="+appropriate_iconpath+"\n"
        with open(path_todtfile, "wt") as edited_icon:
            for line in editicon:
                edited_icon.write(line)
    else:
        pass

def check_ifrunning():
    # check if hotspot is up or down
    get_pstreeinfo = subprocess.Popen(["pstree"], stdout=subprocess.PIPE)
    output = (get_pstreeinfo.communicate()[0].decode("utf-8"))
    if running_id in output:
        return "running"
    else:
        return "not_running"

def toggle_connection():
    runcheck = check_ifrunning()
    set_icon("set_alter", runcheck)
    if runcheck == "not_running":
        subprocess.call(["gksu", "ap-hotspot", "start"])
    else:
        subprocess.call(["gksu", "ap-hotspot", "stop"])
    time.sleep(wait)
    runcheck = check_ifrunning()
    set_icon("set_current", runcheck)

toggle_connection()

Arquivo da área de trabalho:

Crie o arquivo da área de trabalho como no exemplo 1. Adicione o caminho correto para o script na linha Exec= , o caminho para qualquer um dos dois ícones no Icon= (ele será corrigido no primeiro uso) e guarde-o na sua área de trabalho como toggle.desktop . Torne-o executável e sua configuração deve funcionar.

3. Alternando de um ícone no iniciador do Unity, com o ícone de alternância para mostrar o estado atual

inativo / em execução

(Este exemplo não deve ser usado como está em 12.04 ou anterior).

Ícones:

Faça o download de ambos ícones do primeiro exemplo, proteja-os como

toggle_officon.png (the grey one)
toggle_onicon.png (the green one) 

em um local de sua escolha.

O script:

Copie o texto abaixo. cole-o em um arquivo vazio, salve-o como hotspot.py em um local adequado para você.

#!/usr/bin/python3

import subprocess
import getpass
import time

# time to wait, to check if hotspot was established (set correct icon)
wait = 10
# identifying difference on pstree command
running_id = "ap-hotspot"
# location of the launcher restore script
backup_copy = "/home/"+getpass.getuser()+"/.restore_currentlauncher.sh"
# name of the desktop file if hotspot is down
mention_ifdown = 'application://hotspot_off.desktop'
# name of the desktop file if hotspot is running
mention_ifup = 'application://hotspot_on.desktop'

def check_ifrunning():
    # check if hotspot is up or down
    get_pstreeinfo = subprocess.Popen(["pstree"], stdout=subprocess.PIPE)
    output = (get_pstreeinfo.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", "ap-hotspot", "start"])
    else:
        subprocess.call(["gksu", "ap-hotspot", "stop"])
    time.sleep(wait)
    set_icon("set_current")

toggle_connection()

Dois arquivos da área de trabalho, que serão ativados no inicializador:

Abaixo dois arquivos da área de trabalho que você precisa. Abra um arquivo de texto vazio, cole o código abaixo (em arquivos separados), substitua os caminhos pelos caminhos reais até o (s) ícone (s) salvo acima e o caminho para o script e salve-os em ~/.local/share/applications , como hotspot_off.desktop e hotspot_on.desktop :

hotspot_off.desktop:

[Desktop Entry]
Name=Hotspot off
Exec=python3 /path/to/script/hotspot.py
Icon=/path/to/toggle_officon/toggle_officon.png
Terminal=false
Type=Application
NoDisplay=true

hotspot_on.desktop:

[Desktop Entry]
Name=Hotspot on
Exec=python3 /path/to/script/hotspot.py
Icon=/path/to/toggle_officon/toggle_onicon.png
Terminal=false
Type=Application
NoDisplay=true

Por fim, arraste um dos arquivos da área de trabalho para o lançador. Não se preocupe se você escolheu o caminho certo ou não, ele será endireitado na primeira vez.

    
por Jacob Vlijm 27.04.2014 / 21:42