ISOsync_pt-BR.py - Um Baixador Automático de ISOs de Sabayon, escrito em Python
Publicado por Alberto Federman Neto. (última atualização em 31/05/2017)
[ Hits: 1.619 ]
Homepage: https://ciencialivre.blog/
Nova versão de Junho de 2017, corrigindo pequenos Bugs de Tradução e Código.
Esta é uma adaptação (para servidores brasileiros) e tradução (para pt-BR) de um "Baixador" de ISOs, para baixar os Sabayon Linux atuais (Daily 17.05 e Monthly 17.03) de Junho de 2017.
O arquivo é uma tradução, atualização (o original era para Sabayon 16) e modificação do arquivo original.escrito em Python (ISO Sync) por Wolfden, EUA. Ele é um dos desenvolvedores do Sabayon.
Link do original:
https://github.com/wolfden/Coding/blob/master/python%20files/iso_rsync#L1
Os servidores RSYNC (originais da Bélgica) foram substituídos pelos espelhos do RSYNC brasileiro, e os comandos de baixar foram modificados para funcionarem com os parâmetros brasileiros.
Para ir atualizando este script, certifique-se de editar as linhas para adequar sempre para as mais recentes ISOs Monthly, veja aqui, quais...
http://sabayon.c3sl.ufpr.br/stable/
Se não editar, não funcionará, somente para as Daily Builds.
Testado em 13 de Junho de 2017, em Sabayon Linux 17.05. Baixa quaisquer "Daily Builds" e as estáveis, Montly, 17.03.
Para rodar o script, execute:
python ISOsync_pt-BR.py
#!/usr/bin/python # ISORSYNC,Portugues do Brasil, um Baixador Automatico de ISOs novas # do Sabayon Linux. # Programado Em Python, por Wolfden, Desenvolvedor Sabayon. # 2017. # github.com/wolfden/Coding/blob/master/python%20files/iso_rsync#L1 # Traduzido e Modificado para os Espelhos Brasileiros,em # Editor Geany: # Alberto Federman Neto, <albfneto@fcfrp.usp.br>, 2017. # Versao 4, Build 3. # Servidor RSYNC trocado para Espelho Brasileiro e comandos adaptados para funcionar # com os espelhos do Brasil. # converted Joost's bash script to python by wolfden # script for rsyncing iso files # Edit the mirrors to your liking # Edit the isos directory to your liking # Agora para as Novas versoes estaveis, 17.03. # original version for 16.11 stable releases import subprocess import sys # Change daily mirror url to your favorite mirror # Espelho Brasileiro mirror = "rsync://sabayon.c3sl.ufpr.br" mpath = "/sabayon/iso/daily/" # Change monthly mirror url to your favorite mirror # Espelho Brasileiro smirror = "rsync://sabayon.c3sl.ufpr.br" smpath = "/sabayon/iso/monthly/" smstab = "/sabayon/stable/" # Directory of stored ISOs -- Edit to fit your setup # Diretorio para sua ISO. Modifique, se quiser: isos = "/home/albfneto/Desktop/PACOTES/sabaisos" # Dev ISOs dvkde = "/Sabayon_Linux_DAILY_amd64_KDE-dev.iso" dvgnome = "/Sabayon_Linux_DAILY_amd64_GNOME-dev.iso" dvmate = "/Sabayon_Linux_DAILY_amd64_MATE-dev.iso" dvxfce = "/Sabayon_Linux_DAILY_amd64_Xfce-dev.iso" dvminimal = "/Sabayon_Linux_DAILY_amd64_Minimal-dev.iso" dvspinbase = "/Sabayon_Linux_DAILY_amd64_SpinBase-dev.iso" dvserver = "/Sabayon_Linux_DAILY_amd64_Server-dev.iso" # Dev ISOs sources dvksource = mirror + mpath + dvkde dvgsource = mirror + mpath + dvgnome dvmasource = mirror + mpath + dvmate dvxsource = mirror + mpath + dvxfce dvmsource = mirror + mpath + dvminimal dvssource = mirror + mpath + dvspinbase dvsvsource = mirror + mpath + dvserver # Dev md5 dvkdemd5 = "/Sabayon_Linux_DAILY_amd64_KDE-dev.iso.md5" dvgnomemd5 = "/Sabayon_Linux_DAILY_amd64_GNOME-dev.iso.md5" dvmatemd5 = "/Sabayon_Linux_DAILY_amd64_MATE-dev.iso.md5" dvxfcemd5 = "/Sabayon_Linux_DAILY_amd64_Xfce-dev.iso.md5" dvminimalmd5 = "/Sabayon_Linux_DAILY_amd64_Minimal-dev.iso.md5" dvspinbasemd5 = "/Sabayon_Linux_DAILY_amd64_SpinBase-dev.iso.md5" dvsvsourcemd5 = "/Sabayon_Linux_DAILY_amd64_Server-dev.iso.md5" # Dev md5 sources dvksourcemd5 = mirror + mpath + dvkdemd5 dvgsourcemd5 = mirror + mpath + dvgnomemd5 dvmasourcemd5 = mirror + mpath + dvmatemd5 dvxsourcemd5 = mirror + mpath + dvxfcemd5 dvmsourcemd5 = mirror + mpath + dvminimalmd5 dvssourcemd5 = mirror + mpath + dvspinbasemd5 dvsvsourcemd5 = mirror + mpath + dvsvsourcemd5 # Dev pkglist dvkdepkglist = "/Sabayon_Linux_DAILY_amd64_KDE-dev.iso.pkglist" dvgnomepkglist = "/Sabayon_Linux_DAILY_amd64_GNOME-dev.iso.pkglist" dvmatepkglist = "/Sabayon_Linux_DAILY_amd64_MATE-dev.iso.pkglist" dvxfcepkglist = "/Sabayon_Linux_DAILY_amd64_Xfce-dev.iso.pkglist" dvminimalpkglist = "/Sabayon_Linux_DAILY_amd64_Minimal-dev.iso.pkglist" dvspinbasepkglist = "/Sabayon_Linux_DAILY_amd64_SpinBase-dev.iso.pkglist" dvsvsourcepkglist = "/Sabayon_Linux_DAILY_amd64_Server-dev.iso.pkglist" # Dev pkglist sources dvksourcepkglist = mirror + mpath + dvkdepkglist dvgsourcepkglist = mirror + mpath + dvgnomepkglist dvmasourcepkglist = mirror + mpath + dvmatepkglist dvxsourcepkglist = mirror + mpath + dvxfcepkglist dvmsourcepkglist = mirror + mpath + dvminimalpkglist dvssourcepkglist = mirror + mpath + dvspinbasepkglist dvsvsourcepkglist = mirror + mpath + dvsvsourcepkglist # Daily ISOs dkde = "/Sabayon_Linux_DAILY_amd64_KDE.iso" dgnome = "/Sabayon_Linux_DAILY_amd64_GNOME.iso" dmate = "/Sabayon_Linux_DAILY_amd64_MATE.iso" dxfce = "/Sabayon_Linux_DAILY_amd64_Xfce.iso" dminimal = "/Sabayon_Linux_DAILY_amd64_Minimal.iso" dspinbase = "/Sabayon_Linux_DAILY_amd64_SpinBase.iso" dforensics = "/Sabayon_Linux_DAILY_amd64_ForensicsXfce.iso" dserver = "/Sabayon_Linux_DAILY_amd64_Server.iso" # Daily sources dksource = mirror + mpath + dkde dgsource = mirror + mpath + dgnome dmasource = mirror + mpath + dmate dxsource = mirror + mpath + dxfce dmsource = mirror + mpath + dminimal dssource = mirror + mpath + dspinbase dfsource = mirror + mpath + dforensics dsvsource = mirror + mpath + dserver # Daily md5s dkdemd5 = "/Sabayon_Linux_DAILY_amd64_KDE.iso.md5" dgnomemd5 = "/Sabayon_Linux_DAILY_amd64_GNOME.iso.md5" dmatemd5 = "/Sabayon_Linux_DAILY_amd64_MATE.iso.md5" dxfcemd5 = "/Sabayon_Linux_DAILY_amd64_Xfce.iso.md5" dminimalmd5 = "/Sabayon_Linux_DAILY_amd64_Minimal.iso.md5" dspinbasemd5 = "/Sabayon_Linux_DAILY_amd64_SpinBase.iso.md5" dforensicsmd5 = "/Sabayon_Linux_DAILY_amd64_ForensicsXfce.iso.md5" dservermd5 = "/Sabayon_Linux_DAILY_amd64_Server.iso.md5" # Daily md5 sources dkmd5source = mirror + mpath + dkdemd5 dgmd5source = mirror + mpath + dgnomemd5 dmamd5source = mirror + mpath + dmatemd5 dxmd5source = mirror + mpath + dxfcemd5 dmmd5source = mirror + mpath + dxfcemd5 dsmd5source = mirror + mpath + dspinbasemd5 dfmd5source = mirror + mpath + dforensicsmd5 dsvmd5source = mirror + mpath + dservermd5 # Daily ISO pkglist dkdepkglist = "/Sabayon_Linux_DAILY_amd64_KDE.iso.pkglist" dgnomepkglist = "/Sabayon_Linux_DAILY_amd64_GNOME.iso.pkglist" dmatepkglist = "/Sabayon_Linux_DAILY_amd64_MATE.iso.pkglist" dxfcepkglist = "/Sabayon_Linux_DAILY_amd64_Xfce.iso.pkglist" dminimalpkglist = "/Sabayon_Linux_DAILY_amd64_Minimal.iso.pkglist" dspinbasepkglist = "/Sabayon_Linux_DAILY_amd64_SpinBase.iso.pkglist" dforensicspkglist = "/Sabayon_Linux_DAILY_amd64_ForensicsXfce.iso.pkglist" dserverpkglist = "/Sabayon_Linux_DAILY_amd64_Server.iso.pkglist" # Daily ISO pkglist sources dkpkglistsource = mirror + mpath + dkdepkglist dgpkglistsource = mirror + mpath + dgnomepkglist dmapkglistsource = mirror + mpath + dmatepkglist dxpkglistsource = mirror + mpath + dxfcepkglist dmpkglistsource = mirror + mpath + dminimalpkglist dspkglistsource = mirror + mpath + dspinbasepkglist dfpkglistsource = mirror + mpath + dforensicspkglist dsvpkglistsource = mirror + mpath + dserverpkglist # Stable ISOs - edit version number to current one, otherwise it will fail # ISOs de KDE Estaveis, as Monthly. Edite para a mais nova versao, ou nao vai funcionar: skde = "/Sabayon_Linux_17.03_amd64_KDE.iso" sgnome = "/Sabayon_Linux_17.03_amd64_GNOME.iso" smate = "/Sabayon_Linux_17.03_amd64_MATE.iso" sxfce = "/Sabayon_Linux_17.03_amd64_Xfce.iso" sminimal = "/Sabayon_Linux_17.03_amd64_Minimal.iso" sspinbase = "/Sabayon_Linux_17.03_amd64_SpinBase.iso" sserver = "/Sabayon_Linux_17.03_amd64_Server.iso" # Stable sources sksource = smirror + smstab + skde sgsource = smirror + smstab + sgnome smasource = smirror + smstab + smate sxsource = smirror + smstab + sxfce smsource = smirror + smstab + sminimal sssource = smirror + smstab + sspinbase ssvsource = smirror + smstab + sserver # Stable md5 - edit version number to current one, otherwise it will fail # ISOs de KDE Estaveis, Monthly. Edite para a mais nova versao, ou nao vai funcionar: skdemd5 = "/Sabayon_Linux_17.03_amd64_KDE.iso.md5" sgnomemd5 = "/Sabayon_Linux_17.03_amd64_GNOME.iso.md5" smatemd5 = "/Sabayon_Linux_17.03_amd64_MATE.iso.md5" sxfcemd5 = "/Sabayon_Linux_17.03_amd64_Xfce.iso.md5" sminimalmd5 = "/Sabayon_Linux_17.03_amd64_Minimal.iso.md5" sspinbasemd5 = "/Sabayon_Linux_17.03_amd64_SpinBase.iso.md5" sservermd5 = "/Sabayon_Linux_17.03_amd64_Server.iso.md5" # Stable md5 sources sksourcemd5 = smirror + smstab + skdemd5 sgsourcemd5 = smirror + smstab + sgnomemd5 smasourcemd5 = smirror + smstab + smatemd5 sxsourcemd5 = smirror + smstab + sxfcemd5 smsourcemd5 = smirror + smstab + sminimalmd5 sssourcemd5 = smirror + smstab + sspinbasemd5 ssvsourcemd5 = smirror + smstab + sservermd5 # Stable pkglist - edit version number to current one, otherwise it will fail # # ISOs de KDE Estaveis, Monthly. Edite para a mais nova versao, ou nao funcionara: skdepkglist = "/Sabayon_Linux_17.03_amd64_KDE.iso.pkglist" sgnomepkglist = "/Sabayon_Linux_17.03_amd64_GNOME.iso.pkglist" smatepkglist = "/Sabayon_Linux_17.03_amd64_MATE.iso.pkglist" sxfcepkglist = "/Sabayon_Linux_17.03_amd64_Xfce.iso.pkglist" sminimalpkglist = "/Sabayon_Linux_17.03_amd64_Minimal.iso.pkglist" sspinbasepkglist = "/Sabayon_Linux_17.03_amd64_SpinBase.iso.pkglist" sserverbasepkglist = "/Sabayon_Linux_17.03_amd64_Server.iso.pkglist" # Stable pkglist sources sksourcepkglist = smirror + smstab + skdepkglist sgsourcepkglist = smirror + smstab + sgnomepkglist smasourcepkglist = smirror + smstab + smatepkglist sxsourcepkglist = smirror + smstab + sxfcepkglist smsourcepkglist = smirror + smstab + sminimalpkglist sssourcepkglist = smirror + smstab + sspinbasepkglist ssvsourcepkglist = smirror + smstab + sspinbasepkglist print "\nBenvindo ao Sincronizador: Sabayon Linux(tm) Syncmaster!" print "\nEscolha Qual Sabayon Voce Quer Baixar!" # Menu with choice, user will enter a number for desire choice # Menu de Escolha da ISO. ans = True while ans: print (""" Sabayon Linux, ISOs Daily, Novas e Tipo Dev: 0.Sabayon_Linux_DAILY_amd64_KDE-dev 1.Sabayon_Linux_DAILY_amd64_GNOME-dev 2.Sabayon_Linux_DAILY_amd64_MATE-dev 3.Sabayon_Linux_DAILY_amd64_Xfce-dev 4.Sabayon_Linux_DAILY_amd64_Minimal-dev 5.Sabayon_Linux_DAILY_amd64_SpinBase-dev 6.Sabayon_Linux_DAILY_amd64_Server-dev Sabayon Linux ISOs Daily Gerais, as mais Novas: 7.Sabayon_Linux_DAILY_amd64_KDE 8.Sabayon_Linux_DAILY_amd64_GNOME 9.Sabayon_Linux_DAILY_amd64_MATE 10.Sabayon_Linux_DAILY_amd64_Xfce 11.Sabayon_Linux_DAILY_amd64_Minimal 12.Sabayon_Linux_DAILY_amd64_SpinBase 13.Sabayon_Linux_DAILY_amd64_Server Sabayon Linux, ISOs Montly, Estaveis: 14.Sabayon_Linux_amd64_KDE 15.Sabayon_Linux_amd64_GNOME 16.Sabayon_Linux_amd64_MATE 17.Sabayon_Linux_amd64_Xfce 18.Sabayon_Linux_amd64_Minima 19.Sabayon_Linux_amd64_SpinBase 20.Sabayon_Linux_amd64_Server Sabayon Forense de Wolfden: 21.Sabayon_Linux_amd64_ForensicsXfce 22.Exit """) # All the rsync stuffs via menu selection # Rsync vai baixar, de acordo com sua selecao ans = raw_input("Entre com o Numero Correspondente ao Sabayon Que Quer Baixar.") if ans == "0": print "Iniciando RSYNC e Baixando..." subprocess.call(['rsync', '-av', '--progress', dvksource, isos]) subprocess.call(['rsync', '-av', '--progress', dvksourcemd5, isos]) subprocess.call(['rsync', '-av', '--progress', dvksourcepkglist, isos]) print "Sincronismo Completo e ISO Baixada." elif ans == "1": print "Iniciando RSYNC e Baixando..." subprocess.call(['rsync', '-av', '--progress', dvgsource, isos]) subprocess.call(['rsync', '-av', '--progress', dvgsourcemd5, isos]) subprocess.call(['rsync', '-av', '--progress', dvgsourcepkglist, isos]) print "Sincronismo Completo e ISO Baixada." elif ans == "2": print "Iniciando RSYNC e Baixando..." subprocess.call(['rsync', '-av', '--progress', dvmasource, isos]) subprocess.call(['rsync', '-av', '--progress', dvmasourcemd5, isos]) subprocess.call(['rsync', '-av', '--progress', dvmasourcepkglist, isos]) print "Sincronismo Completo e ISO Baixada." elif ans == "3": print "Iniciando RSYNC e Baixando..." subprocess.call(['rsync', '-av', '--progress', dvxsource, isos]) subprocess.call(['rsync', '-av', '--progress', dvxsourcemd5, isos]) subprocess.call(['rsync', '-av', '--progress', dvxsourcepkglist, isos]) print "Sincronismo Completo e ISO Baixada." elif ans == "4": print "Iniciando RSYNC e Baixando..." subprocess.call(['rsync', '-av', '--progress', dvmsource, isos]) subprocess.call(['rsync', '-av', '--progress', dvmsourcemd5, isos]) subprocess.call(['rsync', '-av', '--progress', dvmsourcepkglist, isos]) print "Sincronismo Completo e ISO Baixada." elif ans == "5": print "Iniciando RSYNC e Baixando..." subprocess.call(['rsync', '-av', '--progress', dvssource, isos]) subprocess.call(['rsync', '-av', '--progress', dvssourcemd5, isos]) subprocess.call(['rsync', '-av', '--progress', dvssourcepkglist, isos]) print "Sincronismo Completo e ISO Baixada." elif ans == "6": print "Iniciando RSYNC e Baixando..." subprocess.call(['rsync', '-av', '--progress', dvsvsource, isos]) subprocess.call(['rsync', '-av', '--progress', dvsvsourcemd5, isos]) subprocess.call(['rsync', '-av', '--progress', dvsvsourcepkglist, isos]) print "Sincronismo Completo e ISO Baixada." elif ans == "7": print "Iniciando RSYNC e Baixando..." subprocess.call(['rsync', '-av', '--progress', dksource, isos]) subprocess.call(['rsync', '-av', '--progress', dkmd5source, isos]) subprocess.call(['rsync', '-av', '--progress', dkpkglistsource, isos]) print "Sincronismo Completo e ISO Baixada." elif ans == "8": print "Iniciando RSYNC e Baixando..." subprocess.call(['rsync', '-av', '--progress', dgsource, isos]) subprocess.call(['rsync', '-av', '--progress', dgmd5source, isos]) subprocess.call(['rsync', '-av', '--progress', dgpkglistsource, isos]) print "Sincronismo Completo e ISO Baixada." elif ans == "9": print "Iniciando RSYNC e Baixando..." subprocess.call(['rsync', '-av', '--progress', dmasource, isos]) subprocess.call(['rsync', '-av', '--progress', dmamd5source, isos]) subprocess.call(['rsync', '-av', '--progress', dmapkglistsource, isos]) print "Sincronismo Completo e ISO Baixada." elif ans == "10": print "Iniciando RSYNC e Baixando..." subprocess.call(['rsync', '-av', '--progress', dxsource, isos]) subprocess.call(['rsync', '-av', '--progress', dxmd5source, isos]) subprocess.call(['rsync', '-av', '--progress', dxpkglistsource, isos]) print "Sincronismo Completo e ISO Baixada." elif ans == "11": print "Iniciando RSYNC e Baixando..." subprocess.call(['rsync', '-av', '--progress', dmsource, isos]) subprocess.call(['rsync', '-av', '--progress', dmmd5source, isos]) subprocess.call(['rsync', '-av', '--progress', dmpkglistsource, isos]) print "Sincronismo Completo e ISO Baixada." elif ans == "12": print "Iniciando RSYNC e Baixando..." subprocess.call(['rsync', '-av', '--progress', dssource, isos]) subprocess.call(['rsync', '-av', '--progress', dsmd5source, isos]) subprocess.call(['rsync', '-av', '--progress', dspkglistsource, isos]) elif ans == "13": print "Iniciando RSYNC e Baixando..." subprocess.call(['rsync', '-av', '--progress', dsvsource, isos]) subprocess.call(['rsync', '-av', '--progress', dsvmd5source, isos]) subprocess.call(['rsync', '-av', '--progress', dsvpkglistsource, isos]) print "Sincronismo Completo e ISO Baixada." elif ans == "14": print "Iniciando RSYNC e Baixando..." subprocess.call(['rsync', '-av', '--progress', sksource, isos]) subprocess.call(['rsync', '-av', '--progress', sksourcemd5, isos]) subprocess.call(['rsync', '-av', '--progress', sksourcepkglist, isos]) print "Sincronismo Completo e ISO Baixada." elif ans == "15": print "Iniciando RSYNC e Baixando..." subprocess.call(['rsync', '-av', '--progress', sgsource, isos]) subprocess.call(['rsync', '-av', '--progress', sgsourcemd5, isos]) subprocess.call(['rsync', '-av', '--progress', sgsourcepkglist, isos]) print "Sincronismo Completo e ISO Baixada." elif ans == "16": print "Iniciando RSYNC e Baixando..." subprocess.call(['rsync', '-av', '--progress', smasource, isos]) subprocess.call(['rsync', '-av', '--progress', smasourcemd5, isos]) subprocess.call(['rsync', '-av', '--progress', smasourcepkglist, isos]) print "Sincronismo Completo e ISO Baixada." elif ans == "17": print "Iniciando RSYNC e Baixando..." subprocess.call(['rsync', '-av', '--progress', sxsource, isos]) subprocess.call(['rsync', '-av', '--progress', sxsourcemd5, isos]) subprocess.call(['rsync', '-av', '--progress', sxsourcepkglist, isos]) print "Sincronismo Completo e ISO Baixada." elif ans == "18": print "Iniciando RSYNC e Baixando..." subprocess.call(['rsync', '-av', '--progress', smsource, isos]) subprocess.call(['rsync', '-av', '--progress', smsourcemd5, isos]) subprocess.call(['rsync', '-av', '--progress', smsourcepkglist, isos]) print "Sincronismo Completo e ISO Baixada." elif ans == "19": print "Iniciando RSYNC e Baixando..." subprocess.call(['rsync', '-av', '--progress', sssource, isos]) subprocess.call(['rsync', '-av', '--progress', sssourcemd5, isos]) subprocess.call(['rsync', '-av', '--progress', sssourcepkglist, isos]) print "Sincronismo Completo e ISO Baixada." elif ans == "20": print "Iniciando RSYNC e Baixando..." subprocess.call(['rsync', '-av', '--progress', ssvsource, isos]) subprocess.call(['rsync', '-av', '--progress', ssvsourcemd5, isos]) subprocess.call(['rsync', '-av', '--progress', ssvsourcepkglist, isos]) print "Sincronismo Completo e ISO Baixada." elif ans == "21": print "Iniciando RSYNC e Baixando..." subprocess.call(['rsync', '-av', '--progress', dfsource, isos]) subprocess.call(['rsync', '-av', '--progress', dfmd5source, isos]) subprocess.call(['rsync', '-av', '--progress', dfpkglistsource, isos]) print "Sincronismo Completo e ISO Baixada." elif ans == "22": print "Obrigado por usar o Sincronizador, Sabayon Linux(tm) Syncmaster" sys.exit() elif ans != "": print "Erro ou Arquivo nao Achado"
Mudar wallpaper por um aleatorio
Calculadora para números complexos
Compartilhando a tela do Computador no Celular via Deskreen
Como Configurar um Túnel SSH Reverso para Acessar Sua Máquina Local a Partir de uma Máquina Remota
Configuração para desligamento automatizado de Computadores em um Ambiente Comercial
Como renomear arquivos de letras maiúsculas para minúsculas
Imprimindo no formato livreto no Linux
Vim - incrementando números em substituição
Efeito "livro" em arquivos PDF
Como resolver o erro no CUPS: Unable to get list of printer drivers
Melhorando a precisão de valores flutuantes em python[AJUDA] (9)
GLPI - Configuração de destinatário com conta Microsoft Exchange (0)
Vou voltar moderar conteúdos de Dicas e Artigos (3)
OpenVPN no MACBOOK conecta mas não pinga pastas de rede compartilhada ... (1)
[Python] Automação de scan de vulnerabilidades
[Python] Script para analise de superficie de ataque
[Shell Script] Novo script para redimensionar, rotacionar, converter e espelhar arquivos de imagem
[Shell Script] Iniciador de DOOM (DSDA-DOOM, Doom Retro ou Woof!)
[Shell Script] Script para adicionar bordas às imagens de uma pasta