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

zero-cool

[Python] Wake on Lan

Recommended Posts

zero-cool

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,

Share this post


Link to post
Share on other sites
Triton

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


<3 life

Share this post


Link to post
Share on other sites
joaoqalves

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 ;)


Não peças ajuda por PM! A tua dúvida vai ter menos atenção do que se for postada na secção correcta do fórum!Queres estar na moda? Utiliza a pesquisa e evita criar um tópico desnecessário.

Share this post


Link to post
Share on other sites
zero-cool

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,

Share this post


Link to post
Share on other sites
djthyrax

Isso é porque estás em Windows e ele em Linux zero-cool.


Não peças ajuda por PM! A tua dúvida vai ter menos atenção do que se for postada na secção correcta do fórum!

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.