Como testar localmente uma Google Cloud Function com trigger de tópico PubSub

Estou trabalhando em um projeto de monitoramento de dados com Google Cloud Functions e, para agilizar e evitar custos desnecessários, queria testar a ativação de uma GCF com um gatilho de evento (tópico no PubSub)

O primeiro passo é iniciar o emulador de PubSub, nesse caso ele vai rodar na porta 8043, para o projeto odesenvolvedor

Criando um emulador do PubSub

gcloud beta emulators pubsub start \
    --project=odesenvolvedor \
    --host-port='localhost:8043'Code language: JavaScript (javascript)

É esperado que você veja no terminal o log do emulador, com alguns detalhes da exeução e indicando que ele está rodando e em qual porta:

[pubsub] INFO: Server started, listening on 8043Code language: CSS (css)

Você vai precisar criar um tópico, em outro terminal execute:

curl -s -X PUT 'http://localhost:8043/v1/projects/odesenvolvedor/topics/mytopic'Code language: JavaScript (javascript)

Agora vamos especificar o endpoint de assinatura do push

curl -s -X PUT 'http://localhost:8043/v1/projects/odesenvolvedor/subscriptions/mysub' \
    -H 'Content-Type: application/json' \
    --data '{"topic":"projects/odesenvolvedor/topics/mytopic","pushConfig":{"pushEndpoint":"http://localhost:8080/projects/odesenvolvedor/topics/mytopic"}}'Code language: JavaScript (javascript)

Enviando uma mensagem para o PubSub

Com o emulador rodando você pode disparar novas mensagens fazendo um post para o emulador (no nosso exmeplo, localhost:8043) indicando o projeto, tópico e ação.

Para publicar uma mensagem no terminal, você pode usar o comando abaixo, lembrando que o data da mensagem deve estar codificado em base64.

curl -s -X POST 'http://localhost:8043/v1/projects/odesenvolvedor/topics/mytopic:publish' \
    -H 'Content-Type: application/json' \
    --data '{"messages":[{"data":"eyJmb28iOiJiYXIifQ=="}]}'Code language: JavaScript (javascript)

Você também pode usar uma ferramenta como Postman para fazer os envios, configurando método como POST, a url como http://localhost:8043/v1/projects/odesenvolvedor/topics/mytopic:publish e o tipo de conteúdo como application/json, enviando a mensagem no corpo do post.

Rodando uma Cloud Function local que escute o evento

Antes de criar a função, você precisa definir as variáveis de ambiente para que sua função utilize o PubSub do emulador e não tente se conectar ao PubSub da Google Cloud, para isso execute o comando abaixo, trocando o id do projeto:

gcloud beta emulators pubsub env-init
export PUBSUB_EMULATOR_HOST=[::1]:8432
export PUBSUB_PROJECT_ID=odesenvolvedorCode language: JavaScript (javascript)

Com o emulador rodando e sabendo como enviar uma mensagem para um tópico, falta apenas criarmos uma função que ouça o tópico.

Crie a função na sua linguagem favorita, no exemplo abaixo uma função em Python:

import json
import base64

def minha_gcf(event, _context = None):
    payload = base64.b64decode(event['data']).decode('utf-8')
    payload = json.loads(payload)
    print(payload)
    return "OK"Code language: JavaScript (javascript)

Agora é só rodar esta função localmente, avisando que ela deve ouvir os eventos do PubSub:

functions_framework --debug --port 8080 --target=minha_gcf --signature-type=event

O importante aí é o –signature-type=event, mesmo sendo uma função local rodando na porta 8080 ela irá escutar os eventos do PubSub

Ao enviar novas mensagens para seu emulador do PubSub, sua função será executada.

ISPConfig 3.2 e jailkit – problemas para login com ssh

Depois de atualizar o ISPConfig para a versão 3.2 tive problemas com alguns acessos ssh para usuários com jailkit ativo.

Aqui, alguns usuários logo após tentar fazer o login com chave, eram desconectados do ssh.

Como a maioria dos processos de deploy que utilizo neste servidor utilizam rsync, isso travou o deploy das aplicações com este problema.

Baseado neste link e em algumas outras leituras, acompanhei o /var/log/auth.log enquanto autenticava com os usuários e parecia ser um erro de permissão, o resultado era muito parecido com o da thread linkada:

Oct 15 18:46:43 server1 jk_chrootsh[16809]: ERROR: failed to execute shell /bin/bash for user username (5007), check the permissions and libraries of /var/www/clients/client1/web78//bin/bashCode language: JavaScript (javascript)

Logo após isso, o logout do usuário. A barra dupla não é um problema (foi a primeira coisa que achei que poderia ser).

No fim, depois de muitas horas e testes, eu não consegui identificar a causa do problema. As configurações do jailkit estava idênticas as ispconfig.

Tentei fazer o resync dos usuários shell, não retornava erro mas não alterava em nada.

Solução encontrada

O que resolveu aqui, foi bem parecido com o sugerido no final da thread no fórum:

  • Removi todos os usuários shell da conta em questão
  • Na configuração de site, marque na aba options a opção Delete unused jailkit chroot
  • Aguarde a sincronização do ISPConfig ou execute manualmente o update via .sh no server
  • Recrie o usuário shell – isso irá recriar a estrutura de arquivos para o chroot e recriar o usuário

Estes passos resolveram e o acesso voltou a funcionar com o jailkit, mas não consegui identificar a causa (não ocorreu com todos os usuários com jailkit).

Mantendo o WordPress seguro – permissões corretas de arquivos e diretórios

Seguindo as recomendações de segurança do WordPress, as permissões de arquivos devem ser: 755 para diretórios e 644 para arquivos.

Isso pode ser configurado com o comando abaixo (unix):

find . -type d -exec chmod 755 {} \;
find . -type f -exec chmod 644 {} \;Code language: CSS (css)

Para os uploads funcionarem (via wp-admin) é necessário que o usuário do seu servidor (no meu caso, o Apache usa o www-data) tenha acesso a pasta de uploads.

chown www-data:www-data wp-content/uploads

O acesso ao www-data também é necessário no restante dos arquivos se você quiser habilitar o update via painel, instalação de temas e plugins.

Parêntesis e chaves coloridas: um plugin que vai mudar sua vida

A rima não intencional no título é para falar do Bracket Pair Colorizer – ou de qualquer outro plugin que auxilie a identificar o que está fechando o que no seu código (parêntesis, chaves, colchetes).

Esta semana eu terminei de fazer um curso de NodeJS e estou colocando em prática duas das metas para 2019: trabalhando em um produto próprio e produzindo algo que vai para produção com NodeJS no back-end.

No javascript – mesmo evitando uma cadeia de callback hell – você ainda pode acabar se deparando com algo com uma estrutura parecida com isso:

({({({})})})

Descobri o plugin no tweet abaixo e ele faz exatamente o que parece:

Se você utiliza o VSCode, instalar é fácil:

ext install CoenraadS.bracket-pair-colorizer

Confira a página do Bracket Pair Colorizer. Se você utiliza outro editor recomendo procurar algo parecido – comecei a usar hoje e é muito prático.

Resolvido: Spotify só abre em fullscreen no Ubuntu

Parece ser um problema comum o Spotify “travar” no modo fullscreen no Ubuntu, sem dar acesso a taskbar.

Felizmente arrumar este problema do fullscreen é simples. Você deve:

  1. Encontrar o arquivo de configuração / preferências do Spotify
  2. Remover as referências as configurações de janela

Como encontrar meu arquivo de configuração do Spotify

Primeiro feche o Spotify. Depois vamos encontrar seu arquivo de configuração. Alguns fóruns que encontrei falam que o arquivo fica em ~/.config/spotify/prefs

No Ubuntu 18 o Spotify usa o snap, então para encontrar todos os arquivos de configuração fiz o seguinte:

find ~/snap/spotify/ -name prefs

Isto irá listar todos os arquivos “prefs” dentro do diretório. Para facilitar, você pode usar o seu editor e já abrir todos no editor:

find ~/snap/spotify/ -name prefs -execdir vscode {} \;

Agora é só procurar pelas ocorrências de app.window e remover estas linhas dos arquivos de configuração. Feito isso, salve os arquivos e pronto, seu spotify não abrirá mais no modo fullscreen.

Você também pode optar por apagar os arquivos de configuração – mas isto vai forçar um novo login quando você reiniciar o Spotify (e possivelmente perder qualquer outra configuração local que esteja salva nos arquivos de preferências).