Time to setup a Samba server for network recording of security camera feeds. I went along with SWAT, a web based graphical interface to samba configuration. Like all Debian based software, the installation process is pretty straight forward,
apt-get update
apt-get install swat
And auto-magically it installs everything that you need, it evens adds the needed configuration line to /etc/inetd.conf 🙂
[global]
netbios name = INTRANET
server string = %h server
map to guest = Bad Password
syslog = 0
log file = /var/log/samba/log.%m
max log size = 1000
dns proxy = No
guest account = nobody
usershare allow guests = Yes
panic action = /usr/share/samba/panic-action %d
idmap config * : backend = tdb
[public1]
comment = Samba Public 1
browsable = yes
public = yes
writable = yes
read only = No
guest ok = Yes
path = /media/usb0/samba/cam1/
[public2]
comment = Samba Public 2
browsable = yes
public = yes
writable = yes
read only = No
guest ok = Yes
Then just point your browser to the PI ip at port 901. Curious enough, i found the SWAT tool too complex for the simple configuration that i wanted: i trust all users in the network, so my need was just two shares that anyone could read/write. So, i ditch SWAT and went on to good ol’style configuration file editing. The final /etc/samba/smb.conf that is working for me:
Fired up samba
# service samba restart
And the cams had no problem finding the samba shares and recording into them.
Next step was to get an easy way to navigate and download recordings. Of course you can also use the samba shares to navigate and read, but specially to outside access it would implied to configure a VPN access to the network (you don’t want your security camera feeds exposed in the Internets with read/write permissions to the world, right?). I went for HTTP with some kind of a file explorer software that allows users/permissions, file/directory browsing, and file download. For the server part i opted for lighttpd, a small footprint server, and for the voodoo PHP (all pretty familiar technology to me). Again the installation is for dummies:
apt-get install lighttpd
apt-get install php5-cgi
Then just a tiny adjustment at /etc/lighttpd/lighttpd.conf:
index-file.names = ( "index.php", "index.html", "index.lighttpd.html" )
static-file.exclude-extensions = ( ".php", ".pl", ".fcgi" )
fastcgi.server = ( ".php" => ((
"bin-path" => "/usr/bin/php-cgi",
"socket" => "/tmp/php.socket"
)))
and restart it. For the software i went for the super nice, cool and powerful AjaXplorer. Just download it and untar to /var/www directory. Then point your browser to PI and log in with admin/admin (changed the password) and then it was just a matter of setting up a user account and a repository pointing to /media/usb0/samba/ (the parent directory of both samba shares).
Now, only one thing left, clean up and report. What to use? Of course PHP again. But this one in command line, so i installed the CLI version.
apt-get install php5-cli
And i did i script that cleans up old recordings and send me a daily report email using basic functions and the great PHPMailer class.
require('phpmailer/class.phpmailer.php');
function deleteDir($dir, $days) {
$now = time();
$diff = 60*60*24*$days;
$treshold = $now - $diff;
$d = dir($dir);
while (false !== ($entry = $d->read())) {
if ($entry != '.' && $entry != '..') {
$year = substr($entry, 0, 4);
$month = substr($entry, 4, 2);
$day = substr($entry, 6, 2);
if (mktime(0, 0, 0, $month, $day, $year) < $treshold)
exec("/bin/rm -rf ".$dir.$entry);
}
}
$d->close();
}
function getDirUsage($dir) {
exec("/usr/bin/du -sh ".$dir, $output, $return);
if ($return > 0)
return 0;
$output = $output[0];
$output = explode("\t", $output);
return $output[0];
}
/*
* DELETE OLD FILES, +30d
*/
deleteDir('/media/usb0/samba/cam1/video/', 30);
deleteDir('/media/usb0/samba/cam2/video/', 30);
/*
* GET USED/FREE SPACE
*/
exec ('df -h', $output);
foreach ($output as $line) {
if (strpos($line, '/media/usb0')) {
$disk_line = $line;
break;
}
}
$disk_line = explode(" ", $disk_line);
$disk_line = array_values(array_filter($disk_line));
$disk_used_space = $disk_line[2];
$disk_used_perc = $disk_line[4];
$disk_free_space = $disk_line[3];
/*
* GET YESTERDAY RECORDINGS USAGE
*/
$yesterday = date("Ymd", time() - 60 * 60 * 24);
$cam1_space = getDirUsage('/media/usb0/samba/cam1/video/'.$yesterday.'/');
$cam2_space = getDirUsage('/media/usb0/samba/cam2/video/'.$yesterday.'/');
/*
* GET YESTERDAY RECORDINGS USAGE
*/
$yesterday = date("Ymd", time() - 60 * 60 * 24);
$cam1_space = getDirUsage('/media/usb0/samba/cam1/video/'.$yesterday.'/');
$cam2_space = getDirUsage('/media/usb0/samba/cam2/video/'.$yesterday.'/');
/*
* SEND REPORT EMAIL
*/
$mail = new PHPMailer();
$mail->IsSMTP(); // telling the class to use SMTP
$mail->SMTPAuth = true; // enable SMTP authentication
$mail->Port = 25; // set the SMTP port
$mail->Host = "mail.domain.com"; // SMTP server
$mail->Username = "username"; // SMTP account username
$mail->Password = "password"; // SMTP account password
$mail->From = "email@domain.com";
$mail->FromName = "Descriptive email";
$mail->AddAddress("my_email@domain.com");
$mail->CharSet = "UTF-8";
$mail->Subject = "Cam Report";
$mail->Body = "YESTERDAY RECORDINGS\n".
"Cam 1: $cam1_space\n".
"Cam 2: $cam2_space\n".
"\n\n".
"HDD SPACE STATUS\n".
"Free: $disk_free_space\n".
"Used: $disk_used_space ($disk_used_perc)\n";
$mail->WordWrap = 50;
if(!$mail->Send())
error_log($mail->ErrorInfo);
Then just run it daily with cron
30 3 * * * /usr/bin/php /path/to/script/cams.php > /dev/null
For now that’s all, but i guess there will be more updates on the Raspberry PI as i have still some ideas floating in my head.