• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

zero-cool

[Python] Wake on Lan

5 mensagens neste tópico

import struct
import socket
from Tkinter import *
import re
import string
import sys

class lGui:
   pass
lGui.tMac = {}
class GuiFrame:
   def __init__(self,root):
       self.root = root

       Label(self.root,text="PC Wake On Lan",bg='#D7EBFF',relief=RAISED,font=('system',12,'bold'),width=70,anchor=W).place(x=0,y=0)

       frame = Frame(self.root,width=10,height=180)
       frame.place(x=410,y=55)

       scroll = Scrollbar(frame,troughcolor="black",width=80)

       lGui.Texto = Text(self.root,width=45,height=10)
       lGui.Texto.config(yscrollcommand=scroll.set)
       lGui.Texto.place(x=200,y=55)

       scroll.pack(side=LEFT,fill=Y)
       Canvas(frame,height=130,width=1).pack(side=LEFT,fill=Y)
       scroll.config(command=lGui.Texto.yview)

       Label(self.root,text="Caixa de Mensagens",bg='#D7EBF0',width=45).place(x=200,y=32)

       self.Mac()
       self.InserirMac()
   def Mac(self):

       Label(self.root,text="Endereços Mac",bg='#D7EBF0',width=21).place(x=6,y=32)

       lGui.WakeB = Button(self.root,text="Wake Up!")
       lGui.WakeB.config(command=WakeOnLan)
       lGui.WakeB.place(x=100,y=180)

       Button(self.root,text="Carregar Mac's",command=AbrirFicheiro).place(x=10,y=180)

       frame = Frame(self.root,width=10,height=180)
       frame.place(x=71,y=55)

       scroll = Scrollbar(frame,troughcolor="black",width=80)
       #scroll.place(x=100,y=55)

       lGui.MacList = Listbox(self.root,height=8)

       lGui.MacList.config(selectmode=MULTIPLE)
       lGui.MacList.configure(yscrollcommand=scroll.set)
       lGui.MacList.place(x=11,y=55)
       #lGui.MacList.pack(side=LEFT)

       scroll.pack(side=LEFT,fill=Y)

       Canvas(frame,height=110,width=1).pack(side=LEFT,fill=Y)

       scroll.config(command=lGui.MacList.yview)

       AbrirFicheiro()

   def InserirMac(self):

       Label(self.root,text="Inserir novo Computador",bg='#D7EBF0',width=75).place(x=6,y=220)

       Label(self.root,text="Nome").place(x=6,y=245)

       lGui.sNewNome = Entry(self.root)
       lGui.sNewNome.place(x=45,y=245)

       Label(self.root,text="Mac").place(x=200,y=245)

       lGui.sNewMac = Entry(self.root)
       lGui.sNewMac.place(x=230,y=245)

       Button(self.root,text="Adiciona Mac",command=AdicionaMac).place(x=370,y=242)
h = open('mac.txt','a')
h.close()

def AbrirFicheiro():
   if lGui.MacList.get(0):
       lGui.MacList.delete(0,END)
   f = open('mac.txt','r')
   if f:
       k = 0
       for line in f.readlines():
           line = string.replace(line,'\n','')
           r = re.match("^([^#]+)#(.+)",line)
           if r:
               lGui.MacList.insert(k,str(r.group(1)))
               lGui.tMac[k] = str(r.group(2))
               k += 1
   else:
       pt('Ficheiro mac.txt não encontrado!')

def AdicionaMac():
   if lGui.sNewMac.get() == None:
       pt('Tem que preencher o campo do Mac')
       return
   elif ValidaMac(lGui.sNewMac.get()) == None:
       #pt('Endereço Mac '+str(lGui.sNewMac.get())+' inválido')
       return
   if lGui.sNewNome.get() == None:
       pt('Tem que preencher o campo do Nome do computador')
       return

   f = open('mac.txt','a')
   if f:
       f.write('\r\n'+str(lGui.sNewNome.get())+'#'+str(lGui.sNewMac.get()))
       f.close()
       pt('Computador '+str(lGui.sNewNome.get())+'('+str(lGui.sNewMac.get())+') gravado')
   else:
       pt('Ficheiro mac.txt não encontrado!')

def WakeOnLan():
   macs = lGui.MacList.curselection()
   for n in macs:
       if lGui.tMac[int(n)]:
           ethernet_address=lGui.tMac[int(n)]
           d,ch = ValidaMac(ethernet_address)
           if d == 1:

               pt('Criando pacotes para '+str(ethernet_address))

               addr_byte = ethernet_address.split(ch)
               hw_addr = struct.pack('BBBBBB', int(addr_byte[0], 16),
               int(addr_byte[1], 16),
               int(addr_byte[2], 16),
               int(addr_byte[3], 16),
               int(addr_byte[4], 16),
               int(addr_byte[5], 16))

               msg = '\xff' * 6 + hw_addr * 16

               s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
               s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
               s.sendto(msg, ('<broadcast>', 9))
               s.close()
               pt('Dados enviados para '+str(ethernet_address)+' com sucesso!')
       else:
           pt('Não existe endereço Mac!')

def ValidaMac(mac):
   if re.match("^([a-fA-F0-9]{2,2})[a-fA-F0-9]{2,2})[a-fA-F0-9]{2,2})[a-fA-F0-9]{2,2})[a-fA-F0-9]{2,2})[a-fA-F0-9]{2,2})",mac):
       return 1,':'
   elif re.match("^([a-fA-F0-9]{2,2})-([a-fA-F0-9]{2,2})-([a-fA-F0-9]{2,2})-([a-fA-F0-9]{2,2})-([a-fA-F0-9]{2,2})-([a-fA-F0-9]{2,2})",mac):
       return 1,'-'
   else:
       pt('Endereço Mac '+str(mac)+' inválido')
       return

def pt(s):
   lGui.Texto.insert(END,str(s)+'\n')
   lGui.Texto.see(END)


mae = Tk()
mae.title("Wake On Lan")
mae.config(width=500,height=310)
GuiFrame(mae)
mae.mainloop()

Só precisam de ter a opção Wake On LAN ligada na BIOS, e o programa funcionará bem.

Abraços,

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O GUI está um bocado deficiente :P, devias tentar corrigir isso. Bom trabalho anyway. :thumbsup:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O GUI está um bocado deficiente :P, devias tentar corrigir isso. Bom trabalho anyway. :thumbsup:

realmente o GUI estraga o teu trabalho... com um GUI decente seria um bom programa :) ... sabes, por vezes, o GUI é muito importante, e este é um caso ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Engraçado.. aqui não aparece tão mal.

Vou tentar dar um jeitinho nisto durante o tempo de férias. Fiz isto mais a título de experimentar pela primeira vez ambientes gráficos.

Abraços,

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora