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!