Arquivo para setembro, 2013

Python – Montando um share no windows (SAMBA)

Posted in Django, Programação, Python, Tecnologia, Windows with tags , , , on 13 de setembro de 2013 by fchevitarese

Opa!

Como prometi (desta vez fui rápido), vou criar um post rapidão de como mapear uma unidade de rede autenticada com SAMBA no Windows, para que você possa gravar e ler arquivos =D

Primeiro eu criei a função abaixo:


#@TODO --> Pegar usuário, senha e host das confs do database =D
def mappDisk(drive, ip, sharedFolder, user, password):
 # print "Entrei aqui =D "
 import pywintypes
 import win32com.client

# Disconnect previous mapped drives
 networkPath = win32com.client.Dispatch('Wscript.Network')
 network_drives = networkPath.EnumNetworkDrives()
 for mapped_drive in [network_drives.Item(i)
 for i in range(0, network_drives.Count() -1 , 2)
 if network_drives.Item(i)]:
 networkPath.RemoveNetworkDrive(mapped_drive, True, True)

# Mount the drives
('z:', '\\\\192.168.1.100\\Some_Share', 'someuser', 'somepass')]
 drive_mapping = [
#(drive, '\\\\'+ip+'\\'+sharedFolder, user, password),
 ]
 print drive_mapping
 for drive_letter, network_path, user_name, user_pass in drive_mapping:
 try:
 networkPath.MapNetworkDrive(drive_letter, network_path, True, user_name, user_pass)
 return True
 except Exception, err:
 print err
 return False

Aí é só chamar a função passando os parâmetros, testar se você pode gravar o arquivo e ser feliz !!!


try:
 file= open(caminho.mapDrive + '\\' + caminho.pastaPedido + '\\' + fileName, 'a')
 except IOError:
 canWrite = mappDisk(caminho.mapDrive, caminho.ipServidor, caminho.sharedFolder, caminho.usuario, caminho.senha)

if canWrite:

 file= open(caminho.mapDrive + '\\' + caminho.pastaPedido + '\\' + fileName, 'a')

...

Como estou  usando o Django, criei um models para guardar os parâmetros. Assim fica mais fácil visualizar, editar e tals ^^

Segue no dpaste porque o último post ficou todo zicado –> http://dpaste.com/hold/1379145/

Obs.:  Usa a biblioteca pywin32 ….

Abraços!

Gravar arquivos em share do samba autenticado

Posted in Django, Programação, Python, Tecnologia, Windows with tags , , , on 13 de setembro de 2013 by fchevitarese

Opa!!

Bom, alguns meses ou anos que eu não posto nada!

Eu sempre posto experiências que tive para resolver determinadas coisas e tals, por isso não estava postando quase nada, pois a maioria das coisas que eu andava fazendo era digamos, trivial =D

Eis que esta semana, me deparo com uma situação no mínimo inusitada!
Estou migrando um sistema em ASP para Django, e como não dou conta de migrar tudo de uma vez, estou fazendo de forma gradual, o que me obriga a rodar o Django com uma velha versão do apache + chiliasp e wsgi =D

Servidor windows e tals… Enfim, minha aplicação precisa realizar uma troca de arquivos, no caso, em uma pasta de um samba server que roda uma outra aplicação que não é minha que tem a função de ler este arquivo, coletar as informações e me devolver um arquivo de resposta.
Eu leio este arquivo de resposta, pego as informações e devolvo para a página… Simples né! Até eu que sou mais bobo acreditei que seria!

O problema já começou na hora de gravar os arquivos. Como eu (inocentemente) mapeei a unidade/pasta do share, já autenticando e tals, pensei que seria simplesmente gravar no z:\pasta\ =D

Ledo engano! Nem chegava a encontrar o caminho =D

Parti então para o ataque e encontrei uma biblioteca chamada pysmb que resolveria meu problema!

Então vai seguir aí como foi que eu fiz! ^^
Obs.: Não vou ensinar aqui nada relacionado ao Django ou a instalação do pacote ^^

Primeiro os imports …


from smb.SMBConnection import SMBConnection
from nmb.NetBIOS import NetBIOS
from smb.smb_constants import *

Feito os imports, criei uma funçãozinha para fazer o trabalho =D


def getBIOSName(remote_smb_ip, timeout=30):
srv_name=""
try:
bios = NetBIOS()
srv_name = bios.queryIPForName(remote_smb_ip, timeout=timeout)
except:
print >> sys.stderr, "Looking up timeout, check remote_smb_ip again!!"
finally:
bios.close()
 # print srv_name
return srv_name

def connectShare():
server_name = getBIOSName('192.168.0.151')[0]
client_name = ('webdevelopervm')
s = SMBConnection('meu_usuario', 'minhasenha', client_name, server_name, use_ntlm_v2 = True)
s.connect(server_name, 139)
if s.auth_result:
# print s.listShares()
# print s.listPath('Publico','pedidos', SMB_FILE_ATTRIBUTE_ARCHIVE)

f = open(r"c:\meutestenovo.txt", 'a')
f.write("Funciona fedaputa!!!")
f.close()
f = open(r"c:\meutestenovo.txt", 'r')

s.storeFile('Publico', r'pedidos\\meutestenovo.txt', f)
f.close()

É necessário pegar o nome do servidor onde está o share, por isto a função getBiosName() =D
A variável client_name deve conter exatamente o nome do seu computador =D
Tive que criar o arquivo, depois ler o arquivo para enviar ao servidor.

Ainda não testei, mas deve existir uma maneira de criar o arquivo em memória e então envia-lo.

Tem outra forma de fazer mapeando o local, mas vou fazer outro post para dar mais moral no blog né XD

Segue o link no dpaste se caso não ficar legal os fontes aqui no blog –> SMBShare

Você também pode efetuar a conexão de outra maneira, usando smb://

Acredito que funcione até no windows mas eu não cheguei a testar 😉

http://miketeo.net/wp/index.php/2012/05/04/smb-url-support-in-pysmb.html

Link de onde encontrei a primeira luz (quase toda na verdade =D )

 

Abraços!