Controle de cache com PHP

Para nunca fazer cache de uma página

$ts = gmdate("D, d M Y H:i:s") . " GMT";
header("Expires: $ts");
header("Last-Modified: $ts");
header("Pragma: no-cache");
header("Cache-Control: no-cache, must-revalidate");

Para fazer cache de 1 hora (3600 segundos)

$seconds_to_cache = 3600;
$ts = gmdate("D, d M Y H:i:s", time() + $seconds_to_cache) . " GMT";
header("Expires: $ts");
header("Pragma: cache");
header("Cache-Control: max-age=$seconds_to_cache");

 

Usuário de SFTP com chroot/jail

Hoje um usuário me pediu acesso ao “ftp” para algumas manutenções que não seriam possível pelo admin do wordpress, e, como bem sabemos, disponibilizar acesso aos arquivos para clientes pode se tornar um inferno caso não seja pensado primeiramente na segurança.

FTP? Nem pensar! Não vou deixar os dados trafegarem nos meus servidores em texto-plano, e usar FTPS iria gerar mais uma preocupação com certificados, datas de expiração etc.

Que tal SFTP? Protocolo criptografado por padrão, sem muita dor de cabeça, integrado direto no sistema operacional, etc ,etc.
Ok, mas e a segurança? Um usuário padrão conectado via SFP fica logado direto na raiz do SO, gerando mais uma preocupação com segurança. Não quero o usuário fuçando nos arquivos do servidor, afinal.

Uma rápida pesquisa e achei algumas alternativas como rssh e rush, mas fiquei horas e horas tentando configurar e testando sem nenhum sucesso, o máximo que consegui foram erros e mais erros.

bom, voltamos então ao oráculo, e eis que surge uma alternativa alterando o subsistema sftp direto no sshd_config que funcionou que é um relógio!

Pra começar, algumas informações importantes:

  • Utilizei como base o ubuntu server 16.04 LTS
  • Nesse ambiente, o arquivo de configuração fica em /etc/ssh/sshd_config, mas isso pode variar se você estiver utilizando outra distro.
  • Normalmente restartar o ssh não derruba sua sessão aberta, mas é bom ficar preparado caso algo errado aconteça
  • No artigo vamos considerar a seguinte situação:
    • Usuário: braz
    • Homedir: /home/braz
    • Todos os comandos são executados como root

E agora, sem mais delongas, mãos de cobra! Digo… Mãos à obra!

Primeiramente, é obrigatório que o diretório /home/braz esteja com usuário e senha root, pra garantir acesso dos usuário do cliente, vamos usar chmod 755.

chown root:root /home/braz
chmod 755 /home/braz

O shell do usuário não precisa (e nem deve) ser /bin/bash, assim deixarei como /bin/false

usermod -s /bin/false braz

A chave aqui será criar um grupo chamado sftponly, todo o usuário nesse grupo sofrerá chroot

groupadd sftponly

Adicionamos o usuário braz ao grupo

gpasswd -a braz sftponly

Agora vamos editar o arquivo sshd_config.
Primeiramente, vamos comentar a seguinte linha (só colocar um # no começo)

Subsystem sftp /usr/lib/openssh/sftp-server

A configuração-chave deve ser sempre depois da declaração do Pam.
Por via das dúvidas, coloque a config no final do arquivo que não tem erro =)

Subsystem sftp internal-sftp
Match group sftponly
     ChrootDirectory /home/%u
     X11Forwarding no
     AllowTcpForwarding no
     ForceCommand internal-sftp

Se tudo esta certo, só restartar o ssh e partir pro abraço!

service ssh restart

Removendo aplicações padrões no windows 10

O windows 10 vem carregado de bloatware, que não são usados pela maioria dos usuários.

Infelizmente não é possível removê-los através interface gráfica, então temos que recorrer ao powershell pra isso.

Nota: É necessário acessar o powershell como administrador, então é só abrir o menu “iniciar” digitar “powershell”, clicar com o botão direito e selecionar “Executar como administrador”

 

Remover 3D Builder:

Get-AppxPackage *3dbuilder* | Remove-AppxPackage

Remover Alarms and Clock:

Get-AppxPackage *windowsalarms* | Remove-AppxPackage

Remover Calculadora:

Get-AppxPackage *windowscalculator* | Remove-AppxPackage

Remover Calendario and Mail:

Get-AppxPackage *windowscommunicationsapps* | Remove-AppxPackage

Remover Camera:

Get-AppxPackage *windowscamera* | Remove-AppxPackage

Remover Contact Support:

Não pode ser removido

Remover Cortana:

Não pode ser removido

Remover Get Office:

Get-AppxPackage *officehub* | Remove-AppxPackage

Remover Get Skype:

Get-AppxPackage *skypeapp* | Remove-AppxPackage

Remover Get Started:

Get-AppxPackage *getstarted* | Remove-AppxPackage

Remover Groove Music:

Get-AppxPackage *zunemusic* | Remove-AppxPackage

Remover Maps:

Get-AppxPackage *windowsmaps* | Remove-AppxPackage

Remover Microsoft Edge:

Não pode ser removido

Remover Microsoft Solitaire Collection:

Get-AppxPackage *solitairecollection* | Remove-AppxPackage

Remover Money:

Get-AppxPackage *bingfinance* | Remove-AppxPackage

Remover Movies & TV:

Get-AppxPackage *zunevideo* | Remove-AppxPackage

Remover News:

Get-AppxPackage *bingnews* | Remove-AppxPackage

Remover OneNote:

Get-AppxPackage *onenote* | Remove-AppxPackage

Remover People:

Get-AppxPackage *people* | Remove-AppxPackage

Remover Phone Companion:

Get-AppxPackage *windowsphone* | Remove-AppxPackage

Remover Photos:

Get-AppxPackage *photos* | Remove-AppxPackage

Remover Store:

Get-AppxPackage *windowsstore* | Remove-AppxPackage

Remover Sports:

Get-AppxPackage *bingsports* | Remove-AppxPackage

Remover Voice Recorder:

Get-AppxPackage *soundrecorder* | Remove-AppxPackage

Remover Weather:

Get-AppxPackage *bingweather* | Remove-AppxPackage

Remover Windows Feedback:

Não pode ser removido

Remover Xbox:

Get-AppxPackage *xboxapp* | Remove-AppxPackage

Rollback:

Pra reinstalar todos os apps:

Get-AppxPackage -AllUsers| Foreach {Add-AppxPackage -DisableDevelopmentMode -Register “$($_.InstallLocation)\AppXManifest.xml”}

Variáveis padrão no shell

O shell possui diversas variáveis padrões que podem ser usadas pra facilitar o desenvolvimento.

$SHELL –Retorna  oshell Atual

$HISTSIZE – Retorna o numero de comandos que podem ser alocados no arquivo “history”

$HISTFILE – Obter o local do arquivo History

$USER –Retorna o username

$EUID – Retorna o UserID.

$GROUPS – Retorna informações sobre o GID.

$PWD – Retorna o diretório atual

$HOSTNAME – Retorna o hostname completo da maquina.

$HOME – Retorna o diretório home do usuário atual

$HOSTTYPE ou $MACHTYPE – Para obter a arquitetura da maquina (ex: 32bit ou 64 bit).

$OSTYPE – Detecta o Sistema Operacional (Ex: GNU/Linux, sun, etc.).

$TERM – Retorna o nome de sue terminal (ex: xterm-256color).

$TMOUT – Setar essa variável com um valor numérico para definir auto-desconexão por inatividade no shell

$PATH – Obtém o path do sistema

$PIPESTATUS – Retorna o status de uma saida de pipe

$BASH_VERSION – Obtém a versão do Bash

$PPID – Obtém o ID do processo pai

$PS1, $PS2, $PS3, $PS4 – Variaveis passadas por parâmetrop em um script shell

Dentro de um script:
$RANDOM – Obtém um número aleatório

$LINENO – Obtem o numero da linha que o script esta executando. Útil para debug

$REPLY – REPLY mantém o último valor lido.

$SECONDS – Para obter a quantos segundos o script está rodando

Parâmetros posicionais: $1, $2, $3, $4, $5, $6, $7, $8, $9

$0 –Obtém o nome do script

$* –Todos os parâmetros posicionais

[email protected] Todos os parâmetros posicionais, separados por espaço

$# –Número de parâmetros

$$ –PID atual

$! –ID de uma tarefa em background

$? –Status de saída ou de erro

$_ – Obtém o argumento do comando anterior

Renomear chave de deploy no gitlab

Enquanto não sai o merge request, a atualização do nome da deploy key tem que ser direto no banco.

Numa instalação padrão, conectamos no banco pgsql via linha de comando:

su gitlab-psql
/opt/gitlab/embedded/bin/psql --port 5432 -h /var/opt/gitlab/postgresql -d gitlabhq_production

 Depois localizamos o ID da chave (nesse caso eu exibi todas) e fazemos um update pelo id

SELECT id, title FROM keys WHERE type='DeployKey';
UPDATE keys SET title='[email protected]' WHERE id=181;

 Simples, não? =)

Otimizar repositorios git

Esses dois comandinhos são usados pelo gitlab na otimização de repositórios:

git repack
git gc

De acordo com o manual:

git-repack(1)
Pack unpacked objects in a repository.

git-gc(1)
Cleanup unnecessary files and optimize the local repository.

 Em um repositorio grande fez bastante diferença

2,3G repo-arquivos # antes
1,4G repo-arquivos # depois

Matando processos zombies no linux

La estava eu, quase agendando uma manutenção em alguns servidores pra eliminar processos zumbis, daqueles que manda um kill -9 e fica preso como <defunct>

Consegui resolver isso com dois comandos, o que me garantiu que vou conseguir dormir as minhas 5 ou 6 horas de sono de todas as noites sem interrupções =P

kill -9 $(ps -A -ostat,ppid | grep -e '[zZ]'| awk '{ print $2 }') #mata todos os processos defuntos
ps aux |grep nomedoscript |awk '{print $2}' |xargs kill -9 #mata os processos que restaram

 

backup de sites com wget

Recentemente precisei efetuar backup de um site para leitura offline, tinha feito um script mirabolante com wget e sed, convertendo links etc, mas pesquisando melhor descobri que o proprio wget tem opções pra muita coisa.

O comando que usei foi

wget \
     --recursive \
     --no-clobber \
     --page-requisites \
     --html-extension \
     --convert-links \
     --restrict-file-names=windows \
     --domains website.org \
     --no-parent \
     http://website.org/diretorio/

As opções usadas são:

  • –recursive: backup do site inteiro, de forma recursiva.
  • –domains website.org: não vai seguir nenhum link de fora do domínio especificado.
  • –no-parent: não vai seguir nenhum link que remeta a diretórios anteriores.
  • –page-requisites: obter todos os elementos que compõem a página (imagens, css, etc).
  • –html-extension: usar extensão html.
  • –convert-links: converter links para uso offline.
  • –restrict-file-names=windows: Modificar nomes de arquivos para funcionar em windows
  • –no-clobber: não sobescrever arquvos (para caso o download ser interrompido e ter que recomeçar).

erro dropbox segmentation fault kde5

Desde que comecei na área de TI, lá pelos meus 15 anos de idade sempre gostei de testar novos sistemas operacionais, passei por n versões de windows, linux, osx, já tive hackintosh por um bom tempo inclusive.

Bem, atualmente estou usando o maui linux que é uma distribuição baseada no ubuntu (sempre a última lts) porém, na minha opinião, mais polida do que o kubuntu.

Após efetuar backup de todos os dados, instalar, restaurar as informações, o dropbox parou de funcionar, ficava dando segmentation fault e randomicamente funcionava.

Notei que era algo relativo ao kde, pois ao testar em outro ambiente gráfico (lxde) funcionou perfeitamente, já estava quase desistindo e voltando ao ubuntu, porém resolvi, em uma ultima tentativa, efetuar um trace do executável e ver se achava alguma coisa.

[email protected]:dropbox-lnx.x86_64-3.10.8$ strace ./dropbox 2> debug.txt

Então essas linhas me chamaram atenção

open("/usr/lib/dri/tls/swrast_dri.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("/usr/lib/dri/swrast_dri.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
--- SIGSEGV {si_signo=SIGSEGV, si_code=SEGV_MAPERR, si_addr=0} ---
rt_sigaction(SIGSEGV, {0x7f09e1dea010, [SEGV], SA_RESTORER|SA_RESTART, 0x7f09e1a88d60}, NULL, 8) = 0
write(4, "Fatal Python error: ", 20)    = 20
write(4, "Segmentation fault", 18)      = 18
write(4, "\n\n", 2)                     = 2
write(4, "Traceback (most recent call firs"..., 36) = 36
write(4, "  File ", 7)                  = 7
write(4, "\"", 1)                       = 1
write(4, "d", 1)                        = 1

O dropbox estava tentando usar a Raster library, que não possuo uma vez que uso o driver proprietário da nvidia.

Mais um teste e BINGO

[email protected]:dropbox-lnx.x86_64-3.10.8$ LIBGL_DEBUG=verbose ./dropbox
libGL: OpenDriver: trying /usr/lib/dri/tls/swrast_dri.so
libGL: OpenDriver: trying /usr/lib/dri/swrast_dri.so
libGL error: dlopen /usr/lib/dri/swrast_dri.so failed (/usr/lib/dri/swrast_dri.so: cannot open shared object file: No such file or directory)
libGL error: unable to load driver: swrast_dri.so
libGL error: reverting to indirect rendering

Solução:

Remover (nó meu caso eu só movi, para fins de backup), a biblioteca de opengl do dropbox.

[email protected]:dropbox-lnx.x86_64-3.10.8$ mv libGL.so.1 libGL.so.1.bkp

Done, Dropbox funcionando de novo!