Daha iyi, daha hızlı, daha güçlü.
Bir çok kişi Squid ve SquidGuard’ı kullanarak Facebook’a karşı açtığım savaşla ilgili yazımı okumuştur. Önce bir şeyi netleştirelim, Facebook’a karşı hiç bir garezim yok. Tamam, çok bayılmıyorum kendisine ama asıl sevmediğim şey iş saatlerinde Facebook’ta dolaşan çalışanlar. İşte bu sistem kullanıcılara takip edildiklerine dair bir mesaj vermek için ideal çözüm.
Şimdi savaşı bir adım daha öteye götüreceğiz. Bu, firmanızdaki Squid vekil sunucunuz için daha iyi, daha hızlı ve daha güçlü bir çözümdür. Daha önce kullandığımız ImageMagick kütüphanesi iyi bir kütüphaneydi, ama eğer sorunlu kullanıcılarınız varsa ciddi anlamda yavaş kalıyor. Yine resimler üzerinde oynama yapacağız, ama çok daha hızlı bir yöntemle. Okumaya devam edin.
Önce PHP5 için GD kütüphanesini kuralım;
sudo apt-get install php5-gd
Evet, bu sistemin çalışması için hali hazırda çalışan bir web sunucusuna ihtiyacınız var. Şimdi Facebook’a karşı Squid ve squidGuard’ı ayarlayalım. Önce aşağıdaki satırları squid.conf dosyanıza ekleyin;
redirect_program /usr/bin/squidGuard -c /etc/squid/squidGuard.conf redirect_children 5
Şimdi de squidGuard.conf dosyanızın yaklaşık olarak şöyle gözükmesini sağlayın;
#
# CONFIG FILE FOR SQUIDGUARD
#
dbhome /home/squidguard/
logdir /var/log/squid/
dest facebook {
expressionlist facebook
redirect http://192.168.1.1/joker.php?url=%u
log /var/log/squid/joker.log
}
src herkes {
ip 192.168.1.0/255.255.255.0
}
acl {
herkes within workhours {
pass !facebook all
} else {
pass all
}
default {
pass none
}
}
Şimdi de URL’deki resimleri yakalayan regex dosyasını yaratalım. Ben bu dosyayı özellikle /home/squidguard içerisine yerleştirdim, çünkü /home klasörünü düzenli olarak yedekliyorum. Böylece taşınma vs sırasında kaybolma durumu olmuyor.
.*facebook\.com.*(\.jpg|\.gif|\.png) .*fbcdn\.net.*(\.jpg|\.gif|\.png)
Şimdi de fotoğrafları bozan kodumuzu web klasörümüze koyalım. Teorik olarak adı joker.php olmalı, ama eğer farklı bir isim koymak isterseniz squidGuard.conf dosyanızda da gerekli değişiklikleri yaptırdığınızdan emin olun.
<?php
/*
joker.php
Burası geçici dosyalarımı tuttuğum klasör.
/tmp klasörünü de kullanabilirsiniz.
*/
$path = "/var/www/joker";
if (!is_dir($path)) {
mkdir($path,0755);
}
// Squid'den gelen URL'i parçalayalım.
$u = explode(" ",trim($_GET["url"]));
if (count($u) > 0) {
$url = $u[0];
} else {
$url = $u;
}
// Geçici dosyanın adı.
$temp = md5(time().microtime().$url);
$ff = fopen($url, "r");
$contents = stream_get_contents($ff);
fclose($ff);
$fz = fopen($path."/".$temp,"w");
fwrite($fz, $contents);
fclose($fz);
$file = $path."/".$temp;
// Bu çizginin altına dokunmaya gerek yok. //
// --------------------------------------- //
// Evet, yukarıdaki çizgiden bahsediyorum. //
switch (substr($url,-4)) {
case ".jpg":
$source = imagecreatefromjpeg($file);
$header = "image/jpeg";
break;
case ".png":
$source = imagecreatefrompng($file);
$header = "image/png";
break;
case ".gif":
$source = imagecreatefromgif($file);
$header = "image/gif";
break;
}
list($width, $height) = getimagesize($file);
$bwimage= imagecreate($width, $height);
for ($c = 0; $c < 256; $c++) {
$palette[$c] = imagecolorallocate($bwimage,$c,$c,$c);
}
function yiq($r, $g, $b) {
$gray = ($r + $g + $b) / 3;
if ($gray > 0x7F) {
return 0xFF;
} else {
return 0x00;
}
return (($r*0.299)+($g*0.587)+($b*0.114));
}
/*
Orijinal rengi pixel pixel okuyalım.
*/
for ($y = 0; $y < $height; $y++) {
for ($x = 0; $x < $width; $x++) {
$rgb = imagecolorat($source, $x, $y);
$r = ($rgb >> 16) & 0xFF;
$g = ($rgb >> 8) & 0xFF;
$b = $rgb & 0xFF;
/*
Burası yiq kullanarak resmin rgb değerlerini bozduğumuz yer,
bozup siyah beyaza çeviriyoruz.
*/
$gs = yiq($r, $g, $b);
imagesetpixel($bwimage, $x, $y, $palette[$gs]);
}
}
/*
Bir tane jpg dosyası döndürelim, ama png veya gif de
kullanabilirsiniz.
*/
header("Content-type: ".$header);
imagejpeg($bwimage);
?>
Squid’i baştan başlatalım;
sudo /etc/init.d/squid restart
Şimdi herşeyin normal bir şekilde çalışıyor olması gerekli, şimdi görelim bakalım sizi gidi Facebook hastaları!
/*
joker.phpThis is where we keep our tmp files.
You can set it to /tmp also.
*/
$path = “/home/www/html/joker”;
// Parse the URL line delivered from Squid.
$u = explode(” “,trim($_GET["url"]));
if (count($u) > 0) {
$url = $u[0];
} else {
$url = $u;
}
// Temporary file name.
$temp = md5(time().microtime().$url);
$ff = fopen($url, “r”);
$contents = stream_get_contents($ff);
fclose($ff);
$fz = fopen($path.”/”.$temp,”w”);
fwrite($fz, $contents);
fclose($fz);
$file = $path.”/”.$temp;
// U shall not touch below this line.
// ——————————- //
// Yeah, that line above this.
switch (substr($url,-4)) {
case “.jpg”:
$source = imagecreatefromjpeg($file);
$header = “image/jpeg”;
break;
case “.png”:
$source = imagecreatefrompng($file);
$header = “image/png”;
break;
case “.gif”:
$source = imagecreatefromgif($file);
$header = “image/gif”;
break;
}
list($width, $height) = getimagesize($file);
$bwimage= imagecreate($width, $height);
for ($c = 0; $c < 256; $c++) {
$palette[$c] = imagecolorallocate($bwimage,$c,$c,$c);
}
function yiq($r, $g, $b) {
$gray = ($r + $g + $b) / 3;
if ($gray > 0x7F) {
return 0xFF;
} else {
return 0×00;
}
return (($r*0.299)+($g*0.587)+($b*0.114));
}
/*
Reads the original colors pixel by pixel
*/
for ($y = 0; $y < $height; $y++) {
for ($x = 0; $x < $width; $x++) {
$rgb = imagecolorat($source, $x, $y);
$r = ($rgb >> 16) & 0xFF;
$g = ($rgb >> 8) & 0xFF;
$b = $rgb & 0xFF;
/*
This is where we actually use yiq to modify our rbg values,
and then convert them to our grayscale palette
*/
$gs = yiq($r, $g, $b);
imagesetpixel($bwimage, $x, $y, $palette[$gs]);
}
}
/*
Outputs a jpg image, but you can change this to png or gif if that
is what you are working with
*/
header(“Content-type: “.$header);
imagejpeg($bwimage);
?>