Gravar arquivos em share do samba autenticado


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é 😄

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!

 

 

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: