Ir para o conteúdo
ou

Software livre Brasil

Tela cheia
 Feed RSS

Helio Loureiro

27 de Maio de 2009, 0:00 , por Software Livre Brasil - | Ninguém está seguindo este artigo ainda.

Shell das trincheiras no Tchelinux

26 de Novembro de 2021, 14:36, por Home - helio.loureiro.eng.br - 0sem comentários ainda

Eu estava aguardando o release oficial dessa palestra, o que aconteceu no dia 25.

Fiz uma palestra sobre programação em shell script abordando Bourne shell e resolvendo o mesmo problema que apresentei na rápida introdução ao Python na BSD Day 2021, em python, e na Latinoware 2021 - Go das trincheiras, em Go.  Dessa vez use o shell script e resolvi o mesmo problema.

 



O fim do picamera no raspberrypi

20 de Novembro de 2021, 19:01, por Home - helio.loureiro.eng.br - 0sem comentários ainda

Terminada minha maratona pessoal de participações em conferências e eventos em geral, eu decidi dedicar algum tempo pra atualizar meus sistemas.

Meu desktop passou de Ubuntu 20.04 pra 21.10.  Decidi simplesmente largar o LTS e abraçar os releases intermediários.  Tive alguns problemas com o snapd, que deu uns crashes de kernel, mas no fim tudo deu certo.  Uma boa experiência de ambiente desktop com KDE Plasma mais recente.

No servidor eu atualizei pro último Debian estável.  Eu sempre espero um pouco pra fazer isso, até sair a correção .1 do release, e foi o que fiz no final.  Mas um dos problemas que tive foram meus scripts em python.  Muitos deles foram feitos há mais de 10 anos e estavam rodando felizes com python 2.7.  O upgrade pra Debian bullseye acabou com essa alegria.   Apenas python3 restou e muita coisa parou de funcionar.  Posso dizer que até agora não encontrei tudo que quebrou após o upgrade, mas devagar estou corrigindo.

Então aproveitando o embalo eu decidi também fazer o upgrade do raspberrypi.  Mesmo sendo raspbian, é Debian.  E passei pro bullseye.  Assim como o servidor, o upgrade em si foi bem tranquilo.  Super suave.

Então percebi que meu as fotos pararam de funcionar.

tl;dr: basicamente o antigo suporte ao picamera deixou de existir.  Foi trocado pela libcamera, que não tem suporte em python ainda.

O que é possível fazer agora?  Aliás o que eu fiz pra contornar isso? Bom... não ficou bonito, mas funciona.  Chamei um dos programas que vem com o libcamera e salva fotos em jpeg usando subprocess.


class LibCameraInterface:
    def __init__(self, sleep_time=30): None

    def get_image(self, destination):
        debug("LibCameraInterface.get_image()")
        import subprocess
        width, height = IMGSIZE
        command = f"/usr/bin/libcamera-jpeg --width={width} --height={height} -o {destination}"
        subprocess.call(command.split())

Eu aproveitei e dei uma boa refatorada no código.   Ficou mais simples e pronto pra trocar.   Criei duas classes, LibCameraInterface e CameraInterface.  A ideia é voltar ao CameraInterface uma vez que tenha algum tipo de suporte em python.  Por enquanto nem pygame funciona mais.

O resultado é quase o mesmo.  Quase.  Pelo libcamera as imagens ficaram mais escura durante a noite.

O antes:

O depois:

Ambas bem escuras.  A segunda eu mudei um pouco a posição da câmera, mas mesmo pegando a iluminação dos prédios fica bem escura.   E não achei ainda um jeito de melhorar isso.

Talvez um upgrade pra próxima versão.

UPDATE:

Eu tinha esquecido de postar o link do programa no github.  Aqui está ele.

https://github.com/helioloureiro/snapshot-twitter/blob/master/weather-twitter.py



Resgatando a chave pública de um perfil no Jenkins

9 de Novembro de 2021, 17:21, por Home - helio.loureiro.eng.br - 0sem comentários ainda

Pode parecer meio estranho, mas foi isso mesmo que precisei fazer: pegar a chave pública de ssh de um perfil que estava no jenkins pra configurar o acesso num repositório Gitlab.

Mas o Jenkins, sabiamente, não guarda ou mostra essas credenciais pra você.  Então precisei recorrer a meios não muito convencionais pra fazer isso.

Primeiro fooi pegar a chave privada que ele tinha armazenado.  Pra isso encontrei uma receita de bolo, escrita em Groovy.

https://scriptcrunch.com/groovy-script-retrieve-jenkins-credentials/


import jenkins.*
import jenkins.model.* 
import hudson.*
import hudson.model.*
def jenkinsCredentials = com.cloudbees.plugins.credentials.CredentialsProvider.lookupCredentials(
        com.cloudbees.plugins.credentials.Credentials.class,
        Jenkins.instance,
        null,
        null
);
for (creds in jenkinsCredentials) {
    // descomente essa parte abaixo se precisar de mais detalhes
    //println(jenkinsCredentials.id)
    println(creds.username))
    if(creds.id == "2671e11a-4831-fa3f-0d58-7b331318c04d"){
    	println(creds.privateKey)
    }
}

E pra rodar junto ao Jenkins, na área de scripts.  Se não sabia ainda, é possível rodar script pela interface web atráves da url que tem do Jenkins mais o final "/script".

No laço "if" onde olho se o creds.id bate com um número gigante, esse é o identificador que você vê como ID nas credenciais.

Esse foi o resultado:


user1
user2
user3
-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEAyONzf1Ti1Dv8jI68/oyGJ2Gf6CNkN64ncZAVB5QnR+0NbyzN
G9U6uFqKUoSuuYblqANJNGR3PKCVhCJCB6Ge7azPK10eYEHFyYXGuIwi9Rb3MsjN
Cof57NzenIUcErm0Cuxk34xEXdR5UFm8GI0q3MEuBSwopQfAnfGa5L+QxGt/+YuY
ei/n/V0QsgYuZb9RVF2NbTrNLk09vBQ7SVwyDzKBaaGFkO0uh6fvCz/gq8L+f9cL
Z/twZNy1/Z13VSe2Agd/1ErLBqlTrxabPCFPMWm4YiAAwIUqhwaI6GU7IRLo/HWo
9eqfvYUWh6FyBKRf7bdSdWfWSSTNxgwPCfJavQIDAQABAoIBADjjaG6znDSb9C3d
shmns8ntNHppo1S9RcA8HCh0RRdyQu6r0j3CiYlxYmBx4IT7dYe5vn5OwRFzLEQp
62b71uTZniVajmKV3avu7VKPpMqhQUmpYZ9M2HLCLWxHqaaH3juFrB8+OpITvHML
pl+RgoTXU+/1DGGHq31O0R1cPmPQyRDhaxVpzsYwbCcIYGJ1hjz2g+098LwtIr5W
5i2Z6JUpE6GyXlVZAM1f9tsYWgGGEBqbH4frUjH9Ao1F7dKARDHsiwcjbreywBx1
aVk8AsTP31vqdOJgUJC9JcM/cf2GLUQxg7ZjdDTrTPWnNzWFhALoFe79UKw4lhE7
ezrqi0UCgYEA457BTvaKI+pcxuh5waV1SrfBYDC9czZpYht1R1i3lmYJKdQFHtVl
HAoy18zuYec9MaNPdqbzWysqkH6D6R8T/qdogQ9/5XpSnPVGbsg2IRKq4jNPrh1M
y8Kx2SOYpk6eLtPxYeRHaAKv/GYbQMs8Sh+GNkSiudhTEESj+KKhmO8CgYEA4e93
phLCmzP+SI2pgqFkZ2H2R5X8aCkbuV7pdcnTb4T/rH0Zah2vFEOmjWaUaGHJDOWk
6y+JPzWmxdweb+2FKTg1g6m8ig1DazcmkTG0CEWwwDLJ93LiQYl59uXt2UuQSkj6
Be+JcUzY2w1lhD0+vNfVF/RrH+xTaYfze1PiDxMCgYBtHNUdvSFLRjVjRF3Zbi9j
ueKA8dxfNl4eIXt+0BBxkEgkPPaXaUQmxNzKhfpgBDFZcifNgQp3UaH90if5wGQd
VrLJ61wr7Q9dHla9FEyeXgx8koxHstP1eUc4B9BNKLK7T+4ONxfjzCYAoBHAZaxo
++OicBRxcjmfOsg/j/ZXEQKBgQDZS84gfJSMXsIml5C7YWvGfpI2IUukBj1y2JTi
w1zGOf0IsTybMbdsXvA1uL3tcnbCH6+wvoRatcgTLfRcI+3ZSgU1/y6k+8KmwGEo
bcw/1H79KxvSEL0I2SbjThqmzaUVvQAya0IeJRHABC9pstm/GDoLkvjguBM1QRrs
ty2I3wKBgEBRpeSp/07x6LaIqHULNuV515BqtvWmWQuc8ngMOkcOO1mcQ745VbDj
YO0pIFHmK1iCtrXhyKPxOOitBjiQOZTeR6cZehm/7Mg+LWR6qdloqOOOij//WND6
PEeIskhUu6Dg07S91meHs3u/TRL0Gmr+zjCIn/0P40O38iyZTaVK
-----END RSA PRIVATE KEY-----
user4
user5
user6

De posse da chave privada, foi então questão de salvar em arquivo, que chamei de jenkins, e gerar a chave pública a partir dela.

Achei que o openssl iria fazer isso, mas todas as tentativas foram frustradas.  No fim descobri como resolver com o próprio ssh-keygen olhando no stackoverflow, sempre ele pra nos ajudar:

https://stackoverflow.com/questions/10271197/how-to-extract-public-key-using-openssl


> ssh-keygen -y -f jenkins
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABA
AABAQDI43N/VOLUO/yMjrz+jIYnYZ/oI2Q3ridxkBUHlCdH7Q1vLM0b1Tq4W
opShK65huWoA0k0ZHc8oJWEIkIHoZ7trM8rXR5gQcXJhca4jCL1FvcyyM0Kh
/ns3N6chRwSubQK7GTfjERd1HlQWbwYjSrcwS4FLCilB8Cd8Zrkv5DEa3/5i
5h6L+f9XRCyBi5lv1FUXY1tOs0uTT28FDtJXDIPMoFpoYWQ7S6Hp+8LP+Crw
v5/1wtn+3Bk3LX9nXdVJ7YCB3/USssGqVOvFps8IU8xabhiIADAhSqHBojoZ
TshEuj8daj16p+9hRaHoXIEpF/tt1J1Z9ZJJM3GDA8J8lq9

e foi assim que consegui conectar o Jenkins usando o user3 com chave ssh no Gitlab.  Peço desculpas em ter quebrado a chave em 60 colunas aqui, mas o fiz pra que ficasse bom pra ler também em smartphones.

AVISO: todos os dados aqui não são os verdadeiros.  Antes de alguém perder tempo usando isso pra tentar invadir alguma coisa minha, eu gerei tanto o ID com sha256sum da data atual e preenchi pra parecer o ID do Jenkins quanto a chave privada, que gerei também só pra mostrar aqui.  Nada disso está em uso em lugar algum.



O status code 103 de webservers

6 de Novembro de 2021, 21:02, por Home - helio.loureiro.eng.br - 0sem comentários ainda

E foi assim que tudo começou.  Com um singelo e modesto "deu merda".  Primeiramente uma rápida introdução pra explicar o que isso significa:  temos um bot pra adicionar assuntos nas pautas do canal Unix Load On.  O bot roda em Python no raspberrypi3 que tenho aqui em casa.  O mesmo que fica tirando fotos pela janela e mostra no twitter no perfil @helio_weather.

Então temos essa função "/addpauta" com um estilo de inglês a la Raimundos pra adicionar novos links.  O programa no bot rodava um código com módulo requests pra pegar a página e buscar o título do artigo.   Só isso.  Então não era algo esperado pra ter o resultado "deu merda".  Mas deu.

Olhando a mesma URL usando o ipython:

> ipython3
Python 3.9.7 (default, Sep 10 2021, 14:59:43) 
Type 'copyright', 'credits' or 'license' for more information
IPython 7.20.0 -- An enhanced Interactive Python. Type '?' for help.

In [1]: import requests

In [2]: url = "https://www.theregister.com/2021/11/02/fedora_35/"

In [3]: r = requests.get(url)

In [4]: r.status_code
Out[4]: 103

In [5]: r.text
Out[5]: ''

então é isso.  O webserver retorna 103, que é uma nova RFC, e espera que você continue pegando o conteúdo.  Só que o módulo requests não faz isso.

Existe um bug aberto no github sobre esse problema onde eles relatam que o comportamento não é bem do requests, mas da urllib3, que é parte do core do Python.  Traduzindo em miúdos: não tem solução e talvez façam uma correção no Python 3.10.

Atualizar todo o Python só pra corrigir um erro besta desses?  Entra em cena o curl, que já comentei em usando curl pra monitorar um site.  Não o curl propriamente dito, mas a pycurl.  Tanto curl quanto pycurl passam dando tchauzinho por esse problema de manipular a resposta 103.  E mandam aquele abraço pra urllib3.

Olhando via script:

> curl -s https://www.theregister.com/2021/11/02/fedora_35/ | head -10
<!doctype html>
<html lang="en">
<head>
    <meta content="text/html; charset=utf-8" http-equiv="Content-Type">
    <title>Fedora 35 released with GNOME 41 desktop • The Register</title>
    <meta name="robots" content="max-snippet:-1, max-image-preview:standard, max-video-preview:0">
    <meta name="viewport" content="initial-scale=1.0, width=device-width"/>
    <meta property="og:image" content="https://regmedia.co.uk/2021/11/02/fedora35.jpg"/>
    <meta property="og:type" content="article" />
    <meta property="og:url" content="https://www.theregister.com/2021/11/02/fedora_35/" />

fazendo o mesmo em Python:

import pycurl
from io import BytesIO

def curl(url):
   crl = pycurl.Curl()
   crl.setopt(crl.URL, url)
   b_obj = BytesIO()
   crl.setopt(crl.WRITEDATA, b_obj)
   crl.setopt(crl.FOLLOWLOCATION, True)
   crl.setopt(pycurl.USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; rv:78.0) Gecko/20100101 Firefox/78.0')
   crl.perform()
   crl.close()
   return b_obj.getvalue().decode('utf-8')

print(curl("https://www.theregister.com/2021/11/02/fedora_35/"))

então fica aqui a lição: onde a requests falhar, pycurl estará lá pra te salvar.



Latinoware 2021 - Go das trincheiras

31 de Outubro de 2021, 17:02, por Home - helio.loureiro.eng.br - 0sem comentários ainda

Eu até hoje não postei nada aqui, mas já faz algum tempo que trabalho com Go como primeira linguagem de programação.  É uma linguagem bacana e interessante.  A curva de aprendizado não é grande e rapidamente você já consegue criar programas nele.

Com essa ideia em mente eu refiz a palestrada da BSD Day, rápida introdução ao Python na BSD Day 2021, em Go.

 

Claro que é uma introdução bastante rápida e não cubro muitas coisas da linguagem.  Mas espero que sirva como primeiro passo pra quem estiver interessado em aprender.



Tags deste artigo: #debian #debianbr #debianse #softwarelivre #freesoftware #linux #python