Installazione su Raspberri py 3 con OS Raspbian Stretch Lite, di Asterisk 16 e Freepbx 15. Guida testata e funzionante, sia su Raspberry che su Pc con os Debian Stretch. La novità rispetto al passato è che freepbx 15 supporta php 7. I miei test li ho fatti senza hardware pstn. I passaggi successivi saranno eseguiti come utente root e su una nuova installazione di Raspbian Stretch, su Raspberry py 3.
root@raspytest:/home/pi# asterisk -rvv
Asterisk 16.1.1, Copyright (C) 1999 - 2018, Digium, Inc. and others.
Created by Mark Spencer <markster@digium.com>
Asterisk comes with ABSOLUTELY NO WARRANTY; type 'core show warranty' for details.
This is free software, with components licensed under the GNU General Public
License version 2 and other licenses; you are welcome to redistribute it under
certain conditions. Type 'core show license' for details.
=========================================================================
Connected to Asterisk 16.1.1 currently running on raspytest (pid = 660)
raspytest*CLI>
# cd /usr/src/
# tar xvfz freepbx-15.0-latest.tgz
# cd freepbx
# ./start_asterisk start
# ./install -n
# fwconsole chown
# fwconsole reload
# fwconsole restart
se tutto è andato bene il server Asterisk è raggiungibile all’indirizzo http://ip_raspberry. La prima cosa da fare è quella di scegliere nome utente, password e mail, per accedere al pannello di amministrazione. Andare poi nel menu Admin-Module Admin e scaricare ed aggiornare tutti i moduli.
L’obiettivo di questa guida è quello di realizzare un proprio server owncloud, e nello specifico io utilizzerò un raspberry pi 3 , ma in alternativa si potrà utilizzare un’altro modello di single board o Pc, con OS Debian based. Avevo gia fatto una guida precedentemente, ma in quell’occasione avevo utilizzato un certificato auto firmato, che chiaramente i browser vedono come non sicuro. In questo caso invece utilizzerò Let’s Encrypt che fornisce certificati SSL gratuiti tramite un processo completamente automatizzato, progettato per eliminare la creazione manuale di certificati, per la convalida, l’installazione e il rinnovo. I certificati rilasciati da Let’s Encrypt sono validi per 90 giorni dalla data di emissione e sono oggi considerati affidabili da tutti i principali browser.
Prerequisiti ed info
Negli esempi sotto utilizzerò come nome di dominio example.com ed i comandi verranno eseguiti da root
Il raspberry dovrà avere quindi come dominio l’equivalente di example.com. Questo può essere modificato in /etc/hostname e poi riavviare.
Il vostro ip pubblico dovrà puntare quindi al dominio, nel caso non si avesse un ip pubblico, utilizzare un servizio di DNS.
Assicurarsi prima di aprire le porte 80/443 verso il proprio server, altrimenti non si potranno ottenere i certificati. Successivamente rimarrà aperta solo la 443.
La guida è stata testata su una installazione pulita di Raspbian Stretch
a questo punto collegandosi al server dovremmo vedere che funziona: Step 3)Chiave e Letsencrypt Creare una chiave robusta Dh (Diffie-Hellman) a 2048 bit, ci vorrà circa 20 minuti.
Per ottenere i certificati utilizzeremo certbot, installato precedentemente, che si occuperà dell’acquisizione e del rinnovo degli stessi. Utilizzeremo il plug-in Webroot che funziona creando un file temporaneo nella ${webroot-path}/.well-known/acme-challenge a cui si collegherà Letsencrypt per risolvere il DNS:
IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at
/etc/letsencrypt/live/example.com/fullchain.pem.
Your cert will expire on 2019-02-28. To obtain a new or tweaked
version of this certificate in the future, simply run certbot
again. To non-interactively renew *all* of your certificates, run
"certbot renew"
- If you lose your account credentials, you can recover through
e-mails sent to xxxxxxx@gmail.com.
- Your account credentials have been saved in your Certbot
configuration directory at /etc/letsencrypt. You should make a
secure backup of this folder now. This configuration directory will
also contain certificates and private keys obtained by Certbot so
making regular backups of this folder is ideal.
- If you like Certbot, please consider supporting our work by:
Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
Donating to EFF: https://eff.org/donate-le
adesso andiamo a riconfigurare il file Virtual Host come sotto:
Rinnovo automatico dei certificati: Come dicevo all’inizio, i certificati di Let’s Encrypt hanno una durata di 90 giorni, dopodichè bisognerà rinnovarli. Per automatizzare il rinnovo utilizzare un cronjob:
SSLCipherSuite EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH
SSLProtocol All -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
SSLHonorCipherOrder On
#Header always set Strict-Transport-Security "max-age=63072000; includeSubDomai$#Header always set X-Frame-Options DENY#Header always set X-Content-Type-Options nosniff
# Requires Apache >= 2.4
SSLCompression off
SSLUseStapling on
SSLStaplingCache "shmcb:logs/stapling-cache(150000)"
# Requires Apache >= 2.4.11
SSLSessionTickets Off
SSLOpenSSLConfCmd DHParameters "/etc/ssl/certs/dhparam.pem"
# systemctl restart apache2
Owncloud è installato ed è raggiungibile all’indirizzo https://example.com. Se si volesse utilizzare come storage un disco esterno, la guida continua: Step 5) Creazione della cartella di storage e relativi permessi:
adesso abbiamo bisogno di conoscere UUID del disco usb ed user e group di www-data, che serviranno per configurare /etc/fstab per il montaggio automatico:
# id -u www-data; id -g www-data
# blkid
# nano /etc/fstab
ed aggiungere in una sola riga qualcosa del genere in /etc/fstab:
UUID=32E49E5027A4F8A7 /media/owncloud-usb auto nofail,uid=33,gid=33,umask=0027$,dmask=0027,noatime 0 0
# reboot
Se tutto è andato bene andare all’indirizzo https://ip_dominio_del_server ed apparirà la pagina iniziale, dove si dovrà inserire nome utente e password per l’accesso al server owncloud, nome del database, user e password dell’utente owncloud, ed infine il punto di mount. Username: owncloud Password: password Database: owncloud Server: localhost
D-Link 5020L e ZoneMinder. Guida su come configurare ZoneMinder con telecamere D.Link 5020L Nel wiki di ZoneMinder si trovano i riferimenti a tutte le telecamere supportate, comprese queste, ma in questa guida ci saranno immagini per tutti i passaggi. I parametri da inserire quando si aggiunge la telecamera sono i seguenti:
esiste uno script nel wiki che serve a far funzionare il tutto:
# =========================================================================r
#
# ZoneMinder D-Link DCS-5020L IP Control Protocol Module, $Date: $, $Revision: $
# Copyright (C) 2013 Art Scheel
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#
# ==========================================================================
#
# This module contains the implementation of the D-Link DCS-5020L IP camera control
# protocol.
#
package ZoneMinder::Control::DCS5020L;
use 5.006;
use strict;
use warnings;
require ZoneMinder::Base;
require ZoneMinder::Control;
our @ISA = qw(ZoneMinder::Control);
our $VERSION = $ZoneMinder::Base::VERSION;
# ==========================================================================
#
# D-Link DCS-5020L Control Protocol
#
# ==========================================================================
use ZoneMinder::Logger qw(:all);
use ZoneMinder::Config qw(:all);
use Time::HiRes qw( usleep );
sub new
{
my $class = shift;
my $id = shift;
my $self = ZoneMinder::Control->new( $id );
bless( $self, $class );
srand( time() );
return $self;
}
our $AUTOLOAD;
sub AUTOLOAD
{
my $self = shift;
my $class = ref($self) || croak( "$self not object" );
my $name = $AUTOLOAD;
$name =~ s/.*://;
if ( exists($self->{$name}) )
{
return( $self->{$name} );
}
Fatal( "Can't access $name member of object of class $class" );
}
sub open
{
my $self = shift;
$self->loadMonitor();
use LWP::UserAgent;
$self->{ua} = LWP::UserAgent->new;
$self->{ua}->agent( "ZoneMinder Control Agent/" . ZoneMinder::Base::ZM_VERSION );
$self->{state} = 'open';
}
sub close
{
my $self = shift;
$self->{state} = 'closed';
}
sub printMsg
{
my $self = shift;
my $msg = shift;
my $msg_len = length($msg);
Debug( $msg."[".$msg_len."]" );
}
sub sendCmd
{
my $self = shift;
my $cmd = shift;
my $result = undef;
printMsg( $cmd, "Tx" );
my $req = HTTP::Request->new( POST=>"http://".$self->{Monitor}->{ControlAddress}."/PANTILTCONTROL.CGI" );
$req->content($cmd);
my $res = $self->{ua}->request($req);
if ( $res->is_success )
{
$result = !undef;
}
else
{
Error( "Error check failed: '".$res->status_line()."'" );
}
return( $result );
}
sub sendCmd2
{
my $self = shift;
my $cmd = shift;
my $result = undef;
printMsg( $cmd, "Tx" );
my $req = HTTP::Request->new( GET=>"http://".$self->{Monitor}->{ControlAddress}."/$cmd".$self->{Monitor}->{ControlDevice} );
my $res = $self->{ua}->request($req);
if ($res->is_success )
{
$result = !undef;
}
else
{
Error( "Error check failed:'".$res->status_line()."'" );
}
return( $result );
}
sub move
{
my $self = shift;
my $dir = shift;
my $panSteps = shift;
my $tiltSteps = shift;
my $cmd = "PanSingleMoveDegree=$panSteps&TiltSingleMoveDegree=$tiltSteps&PanTiltSingleMove=$dir";
$self->sendCmd( $cmd );
}
sub moveRelUpLeft
{
my $self = shift;
Debug( "Move Up Left" );
$self->move( 0, 1, 1 );
}
sub moveRelUp
{
my $self = shift;
Debug( "Move Up" );
$self->move( 1, 1, 1 );
}
sub moveRelUpRight
{
my $self = shift;
Debug( "Move Up" );
$self->move( 2, 1, 1 );
}
sub moveRelLeft
{
my $self = shift;
Debug( "Move Left" );
$self->move( 3, 1, 1 );
}
sub moveRelRight
{
my $self = shift;
Debug( "Move Right" );
$self->move( 5, 1, 1 );
}
sub moveRelDownLeft
{
my $self = shift;
Debug( "Move Down" );
$self->move( 6, 1, 1 );
}
sub moveRelDown
{
my $self = shift;
Debug( "Move Down" );
$self->move( 7, 1, 1 );
}
sub moveRelDownRight
{
my $self = shift;
Debug( "Move Down" );
$self->move( 8, 1, 1 );
}
# moves the camera to center on the point that the user clicked on in the video image.
# This isn't extremely accurate but good enough for most purposes
sub moveMap
{
# if the camera moves too much or too little, try increasing or decreasing this value
my $f = 11;
my $self = shift;
my $params = shift;
my $xcoord = $self->getParam( $params, 'xcoord' );
my $ycoord = $self->getParam( $params, 'ycoord' );
my $hor = $xcoord * 100 / $self->{Monitor}->{Width};
my $ver = $ycoord * 100 / $self->{Monitor}->{Height};
my $direction;
my $horSteps;
my $verSteps;
if ($hor < 50 && $ver < 50) {
# up left
$horSteps = (50 - $hor) / $f;
$verSteps = (50 - $ver) / $f;
$direction = 0;
} elsif ($hor >= 50 && $ver < 50) {
# up right
$horSteps = ($hor - 50) / $f;
$verSteps = (50 - $ver) / $f;
$direction = 2;
} elsif ($hor < 50 && $ver >= 50) {
# down left
$horSteps = (50 - $hor) / $f;
$verSteps = ($ver - 50) / $f;
$direction = 6;
} elsif ($hor >= 50 && $ver >= 50) {
# down right
$horSteps = ($hor - 50) / $f;
$verSteps = ($ver - 50) / $f;
$direction = 8;
}
my $v = int($verSteps + .5);
my $h = int($horSteps + .5);
Debug( "Move Map to $xcoord,$ycoord, hor=$h, ver=$v with direction $direction" );
$self->move( $direction, $h, $v );
}
# this clear function works, but should probably be disabled because
# it isn't possible to set presets yet.
sub presetClear
{
my $self = shift;
my $params = shift;
my $preset = $self->getParam( $params, 'preset' );
Debug( "Clear Preset $preset" );
my $cmd = "ClearPosition=$preset";
$self->sendCmd( $cmd );
}
# not working yet
sub presetSet
{
my $self = shift;
my $params = shift;
my $preset = $self->getParam( $params, 'preset' );
Debug( "Set Preset $preset" );
# TODO need to first get current position $horPos and $verPos
#my $cmd = "PanTiltHorizontal=$horPos&PanTiltVertical=$verPos&SetName=$preset&SetPosition=$preset";
#$self->sendCmd( $cmd );
}
sub presetGoto
{
my $self = shift;
my $params = shift;
my $preset = $self->getParam( $params, 'preset' );
Debug( "Goto Preset $preset" );
my $cmd = "PanTiltPresetPositionMove=$preset";
$self->sendCmd( $cmd );
}
sub presetHome
{
my $self = shift;
Debug( "Home Preset" );
my $cmd = "PanTiltSingleMove=4";
$self->sendCmd( $cmd );
}
# IR Controls
#
# wake = IR on
# sleep = IR off
# reset = IR auto
sub wake
{
my $self = shift;
Debug( "Wake - IR on" );
my $cmd = "setDaynightMode?ReplySuccessPage=night.htm&ReplyErrorPage=errrnight.htm&DayNightMode=3&ConfigDayNightMode=Save";
$self->sendCmd2( $cmd );
}
sub sleep
{
my $self = shift;
Debug( "Sleep - IR off" );
my $cmd = "setDaynightMode?ReplySuccessPage=night.htm&ReplyErrorPage=errrnight.htm&DayNightMode=2&ConfigDayNightMode=Save";
$self->sendCmd2( $cmd );
}
sub reset
{
my $self = shift;
Debug( "Reset - IR auto" );
my $cmd = "setDaynightMode?ReplySuccessPage=night.htm&ReplyErrorPage=errrnight.htm&DayNightMode=0&ConfigDayNightMode=Save";
$self->sendCmd2( $cmd );
}
1;
__END__
# Below is stub documentation for your module. You'd better edit it!
=head1 NAME
ZoneMinder::Database - Perl extension for DCS-5020L
=head1 SYNOPSIS
use ZoneMinder::Database;
DLINK DCS-5020L
=head1 DESCRIPTION
ZoneMinder driver for the D-Link consumer camera DCS-5020L.
=head2 EXPORT
None by default.
=head1 SEE ALSO
See if there are better instructions for the DCS-5020L at
http://www.zoneminder.com/wiki/index.php/Dlink
=head1 AUTHOR
Art Scheel <lt>ascheel (at) gmail<gt>
=head1 COPYRIGHT AND LICENSE
LGPLv3
=cut
e va copiato nel PATH: /usr/share/perl5/ZoneMinder/Control. Dopodichè andare nel menu Control-Edit-Add New Control:
ed inserire i parametri seguenti:
Main: Type: Remote, Protocol: DCS5020L, Name: DCS5020L, Can Wake, Can Sleep, Can Reset Move: Can Move, Can Move Diagonally, Can Move Mapped, Can Move Relative Pan: Can Pan, Min Pan Step 1, Max Pan Step 30 Tilt: Can Tilt, Min Tilt Step 1, Max Pan Step 30 Presets: Has Presets, Number: 24, Has Home Preset
Nel Tab Control inserire:
Controllable, Control Type: DCS5020L, Control address: user:pass@ipaddress
Guida su come aggiornare Owncloud dalla versione 10.0.9 alla 10.0.10. Il miglior modo per effettuare l’aggiornamento è quello manuale. Il metodo che userò io è un pò “sporco”, ma secondo me risulta semplice veloce ed efficace. Aggiornare Owncloud alla versione 10.0.10 su Debian
Enable Maintenance Mode
cd /var/www/owncloud/ sudo -u www-data php occ maintenance:mode --on
Stop dei servizi essenziali
sudo service apache2 stop sudo service cron stop
Download nuova versione
cd /opt/ sudo wget https://download.owncloud.org/community/owncloud-10.0.10.tar.bz2
Nel mio caso tenendo i miei DATI al di fuori della cartella Owncloud, procedo direttamente all’aggiornamento, sostituendo la cartella:
sudo tar xjvf owncloud-10.0.10.tar.bz2 -C /var/www/
Nel caso i DATI si trovassero all’interno della cartella Owncloud, allora bisognerà copiare il vecchio file di configurazione:
cd /opt/ sudo tar xjvf owncloud-10.0.10.tar.bz2 sudo cp /var/www/owncloud/config/config.php owncloud/config/config.php sudo cp -R owncloud/ /var/www/
Con l’arrivo del nuovo Raspberry pi 3 B+ nella mia collezione, ho deciso di dedicarlo alla video sorveglianza installando Zoneminder. Per avere delle ottime performance, è necessrio avere una sd card performante, io ho optato per una SanDisk Extreme PRO 64GB, MicroSDXC Classe 10. Si può anche utilizzare un ssd esterno come capiente storage. Tutti i comandi sotto saranno eseguiti come root:
# mysql_secure_installation
# service mariadb restart
# systemctl status mariadb.service
Creazione del database:
# mysql -uroot -p < /usr/share/zoneminder/db/zm_create.sql
# mysql -uroot -p -e "grant all on zm.* to 'zmuser'@localhost identified by 'zmpass';"
# mysqladmin -uroot -p reload
Ho deciso di aggiornare il mio centralino, passando da Raspbian Jessie a Raspbian Stretch, e quindi a Freepbx 14, e di passare da chan_sip a chan_pjsip, sia per quanto riguarda i Trunk che per l'estensioni. Per quanto riguarda la creazione del trunk pjsip con Messagenet, ho notato che è meno intuitivo rispetto al chan_sip di una mia vecchia guida, Ad ogni modo condividerò di seguito gli screenshots di una configurazione di un trunk Messagenet funzionante:
Guida su come installare owncloud 10 su Raspberry Pi 3 con già installato Raspbian Stretch. Io ho sempre usato uno dei miei Raspberry come server cloud, accessibile soprattutto da remoto. In questa guida non mi soffermerò sui problemi di sicurezza ed i modi per limitare i danni derivanti da una macchina esposta su internet, ma bensì mi limiterò ai soli step per avere un server cloud pronto all'uso. Io preferisco archiviare i dati direttamente su una chiavetta usb da 128G, piuttosto che direttamente sul raspberry. Quindi, dopo avere installato Raspbian Stretch ed aver collegato alla porta usb la pen drive, servendosi di una prolunga usb che servirà a dissipare il calore, siamo pronti ad iniziare.
inserire password di root, e poi i 5 comandi sotto, e settare la password per l'utente owncloud:
1) create database owncloud;
2) create user owncloud@localhost identified by 'password';
3) grant all privileges on owncloud.* to owncloud@localhost identified by 'password';
4) flush privileges;
5) exit;
Web Server Apache2 con SSL
sotto ci saranno alcune voci da riempire, ma quella più importante è COMMON NAME, che io ho fatto puntare al mio hostname DynDNS per l'accesso da remoto:
che dovrà essere come sotto, aggiungendo ip del server cloud, modificando le voci DocumentRoot, SSLCertificateFile, SSLCertificateKeyFile , e commentando le altre voci che fanno riferimento a SSL.
a questo punto abbiamo bisogno di conoscere UUID della chiavetta usb ed user e group di www-data, che serviranno per configurare /etc/fstab per il montaggio automatico:
# id -u www-data; id -g www-data
# blkid
# nano /etc/fstab
ed aggiungere in una sola riga qualcosa del genere in /etc/fstab:
UUID=32E49E5027A4F8A7 /media/owncloud-usb auto nofail,uid=33,gid=33,umask=0027$,dmask=0027,noatime 0 0
come ultimo ritocco, aumentare la capacità di upload, andando a modificare il file .user.ini
# nano /var/www/html/owncloud/.user.ini
portando: php_value upload_max_filesize, e php_value post_max_size a 5000M
# reboot
Se tutto è andato bene andare all'indirizzo https://ip_del_raspberry ed apparirà la pagina iniziale, dove si dovrà scegliere nome utente e password per l'accesso al server owncloud, ed inserire il nome del database, user e password dell'utente owncloud:
Fluxion al momento è uno dei migliori tools per il cracking wifi, con password WPA/WPA2 senza ricorrere ed attacchi bruteforce o dizionario. Per installare Fluxion su DebianStretch, bisogna risolvere alcune dipendenze, sopratutto quella di pyrit, non più presente nei repository Debian.
Guida su come settare un ip statico su Raspberry pi con OS Raspbian Stretch. I due files da modificare sono: /etc/dhcpcd.conf e /etc/network/interfaces.
sudo nano /etc/network/interfaces
ed incollare:
auto lo
iface lo inet loopback
iface eth0 inet manual
sudo nano /etc/dhcpcd.conf
e modificare le voci sotto:
# Example static IP configuration:
interface eth0
static ip_address=192.168.1.84/24
static routers=192.168.1.1
static domain_name_servers=192.168.1.1 8.8.8.8
Configurazione HT 503 con Asterisk 14 e FreePBX 14
Dopo avere installatoAsterisk 14 e Freepbx 14 su Raspbian Stretch Lite, ho dovuto configurare il modulo Ata Grandstream HT 503, con qualche differenza rispetto alla guida principale che avevo fatto un po' di tempo fa, e che comunque attualmente funziona con Asterisk 13 e Freepbx 13, ma "stranamente" non funzionante con la versione 14. In Freepbx sia il Trunk che le estensioni sono in chan_sip, ed ho camabiato la porta di default in 5060 in SIP Settings/Chan SIP Settings. Di seguito condividerò alcuni screenshots per una configurazione funzionante su HT 503:
IP HT 503=192.168.1.80
IP SERVER= 192.168.1.84
Configurazione HT 503 con Asterisk 14 e FreePBX 14
enjoy 😉
Gestisci Consenso Cookie
Per fornire le migliori esperienze, utilizziamo tecnologie come i cookie per memorizzare e/o accedere alle informazioni del dispositivo. Il consenso a queste tecnologie ci permetterà di elaborare dati come il comportamento di navigazione o ID unici su questo sito. Non acconsentire o ritirare il consenso può influire negativamente su alcune caratteristiche e funzioni.
Funzionale
Sempre attivo
L'archiviazione tecnica o l'accesso sono strettamente necessari al fine legittimo di consentire l'uso di un servizio specifico esplicitamente richiesto dall'abbonato o dall'utente, o al solo scopo di effettuare la trasmissione di una comunicazione su una rete di comunicazione elettronica.
Preferenze
L'archiviazione tecnica o l'accesso sono necessari per lo scopo legittimo di memorizzare le preferenze che non sono richieste dall'abbonato o dall'utente.
Statistiche
L'archiviazione tecnica o l'accesso che viene utilizzato esclusivamente per scopi statistici.L'archiviazione tecnica o l'accesso che viene utilizzato esclusivamente per scopi statistici anonimi. Senza un mandato di comparizione, una conformità volontaria da parte del vostro Fornitore di Servizi Internet, o ulteriori registrazioni da parte di terzi, le informazioni memorizzate o recuperate per questo scopo da sole non possono di solito essere utilizzate per l'identificazione.
Marketing
L'archiviazione tecnica o l'accesso sono necessari per creare profili di utenti per inviare pubblicità, o per tracciare l'utente su un sito web o su diversi siti web per scopi di marketing simili.