Mount /usr/ports във Freebsd Jail
Имам 3 Jail-a искам да си инсталирам и в 3те нещо от /usr/ports :
mount_nullfs /usr/ports/ /usr/jails/ns/usr/ports
mount_nullfs /usr/ports/ /usr/jails/mail/usr/ports
mount_nullfs /usr/ports/ /usr/jails/www/usr/ports
shell recursive rename
Ако искаме да сменим ‘foo’ с ‘bar’ в имената на ВСИЧКИ (recursive) файлове в даден директория :
Само принтира промените :
find . -type f -print0 | xargs -0 rename -n ’s/foo/bar/g’
Прави промените :
find . -type f -print0 | xargs -0 rename ’s/foo/bar/g’
shell find & replace recursive
Много мразя като ми се налага да променям едно и също нещо в много различни файлове !
Затова е следният ред :
find * -type f -exec sed -i ’s/ТОВА ТЪРСИМ/ПРОМЕНЯМЕ С ТОВА/’ {} \;
Казах ли колко обичам sed ?
PHP-конвертиране на число в дума
Много полезен PHP клас за конвертиране на число в дума – по нета има и други скриптове но този членува правилно думите на български .
class TextualNumber
{
var $units = array();
var $teens = array();
var $hundredth = array();
var $tens = array();
var $suffix = array();
function TextualNumber()
{
$this->units = array('нула', 'едно', 'две', 'три', 'четери', 'пет', 'шест', 'седем', 'осем',
'девет');
$this->teens = array('десет', 'единадесет', 'дванадесет', 'тринадесет',
'четеринадесет', 'петнадесет', 'шестнадесет', 'седемнадесет',
'осемнадесет', 'деветнадесет');
$this->hundredth =
array(1=>'сто','двеста','триста','четеристотин','петстотин','шестстотин','седемстотин',
'осемстотин','деветстотин');
$this->tens = array(2 => 'двадесет', 'тридесет', 'четеридесет', 'петдесет',
'шестдесет', 'седемдесет', 'осемдесет', 'деветдесет');
$this->suffix = array('хиляди', 'милиона', 'милиарда', 'trillion', 'quadrillion');
}
/*
* @param string $int The number to convert. Optional.
* @return text Resulting text
*/
function ToString($int)
{
// Check for purely numeric chars
if (!preg_match('#^[\d.]+$#', $int)) {
echo('Невалидни символи! Моля въведете числова стойност.');
return;
}
// Handle decimals
if (strpos($int, '.') !== false) {
$decimal = substr($int, strpos($int, '.') + 1);
$int = substr($int, 0, strpos($int, '.'));
}
// Lose insignificant zeros
$int = ltrim($int, '0');
// Check for valid number
if ($int == '') {
$int = '0';
}
// Lose the negative, don't use abs() so as to allow large numbers
if ($negative = ($int < 0)) {
$int = substr($int, 1);
}
// Number too big?
if (strlen($int) > 18) {
//throw new Exception('Out of range');
echo('Числото е повече от 18 символа!');
return;
}
// Keep original number
$orig = $int;
/**
* Main number deciphering bit thing
*/
switch (strlen($int)) {
// Single digit number
case '1':
$text = $this->units[$int];
break;
// Two digit number
case '2':
if ($int{0} == '1') {
$text = $this->teens[$int{1}];
} else if ($int{1} == '0') {
$text = $this->tens[$int{0}];
if($this->flag == 3) $text = 'и '.$text;
echo $this->flag."";
$this->flag = 0;
} else {
$text = $this->tens[$int{0}] . ' и ' . $this->units[$int{1}];
}
break;
// Three digit number
case '3':
if ($int % 100 == 0) {
$text = $this->hundredth[$int{0}];
} else {
$int_tmp = substr($int, 1);
if($int_tmp{0} == '0' || $int_tmp{0} == '1') $add = 'и';
$this->flag = 3;
$text = $this->hundredth[$int{0}] . " $add " . $this->GetText(substr($int, 1));
}
break;
// Anything else
default:
$pieces = array();
$suffixIndex = 0;
// Handle the last three digits
$num = substr($int, -3);
if ($num > 0) {
$pieces[] = $this->GetText($num);
}
$int = substr($int, 0, -3);
// Now handle the thousands/millions etc
while (strlen($int) > 3) {
$num = substr($int, -3);
if ($num > 0) {
$pieces[] = $this->GetText($num) . ' ' . $this->suffix[$suffixIndex];
}
$int = substr($int, 0, -3);
$suffixIndex++;
}
if (substr($int, -3) == 1)
{
$t = $this->suffix[$suffixIndex];
if($suffixIndex == 0 && $int == 1) $ending = 'а';
else $preff = 'един ';
$pieces[] = $preff . substr($t,0,-2) . $ending;
}
else
{
$pieces[] = $this->GetText($int) . ' ' . $this->suffix[$suffixIndex];
}
/**
* Figure out whether we need to add "and" in there somewhere
*/
$pieces = array_reverse($pieces);
if (count($pieces) > 1 AND strpos($pieces[count($pieces) - 1], ' и ') === false) {
$pieces[] = $pieces[count($pieces) - 1];
$pieces[count($pieces) - 2] = 'и';
}
// Create the text
$text = implode(' ', $pieces);
// Negative number?
if ($negative) {
$text = 'минус ' . $text;
}
break;
}
/**
* Handle any decimal part
*/
if (!empty($decimal)) {
$pieces = array();
$decimal = preg_replace('#[^0-9]#', '', $decimal);
/*
for ($i=0, $len=strlen($decimal); $i<$len; ++$i) {
$pieces[] = $this->teens[$decimal{$i}];
}
*/
if(strlen($decimal) == '1')
{
$text .= ' лева и ' . $this->tens[$decimal{0}];
$text .= ' стотинки. ';
}
else
{
$text .= ' лева и ' . $this->GetText($decimal);
$text .= ' стотинки. ';
}
}
return $text;
}
/**
* Returns text for given number. Parameter should ideally
* be a string (to handle large numbers) though integers are
* OK.
*
* @param string $int Number to convert
* @return string Resulting textual representation
*/
function GetText($int)
{
return $this->ToString($int);
}
/**
* Returns text and number for a randomly generated number.
*
* @return array Array of number and textual representation
*/
function Get()
{
$int = mt_rand(1, 99999);
return array($int, $this->ToString($int));
}
/**
* Returns currency version of a given number.
*
* @param string $int Number to convert
* @param string $major Word to use for left hand side of decimal point
* @param string $minor Word to use for right hand side of decimal point
* @return string Resulting string
*/
function GetCurrency($int, $major = 'pound', $minor = 'pence')
{
if (strpos($int, '.') !== false) {
$left = substr($int, 0, strpos($int, '.'));
$right = substr($int, strpos($int, '.') + 1);
// Plural $major ?
if ((int)abs($left) != 1) {
$major .= 's';
}
$text = $this->GetText($left) . " $major and " . $this->GetText($right) . " $minor";
} else {
$text = $this->GetText($int) . " $major";
}
return $text;
}
}
Как да го ползваме ?
require_once("number2textBG.class.php");
$number = '12345678';
$t2n = new TextualNumber;
$txt = $t2n->GetText($number);
echo $txt;
?>
Източник – http://webstik.com/blog/page/kak-da-preobrazuvame-chislova-stoynost-v-dumi-chrez-php.html
virtualbox-ose и freebsd7.2 guest OS
Ако ви се наложи да инсталирате Freebsd7.x под VirtalBox-OSE този ред със сигурност ще ви спести доста нерви :
# vboxmanage modifyvm VM_NAME -nictype1 Am79C970A
Явно FreeBSD имат някакъв проблем с емулацията на networking-а във VirtualBOX , но както и да е – този ред решава проблема
Повече инфо има тук :
click
Скрипт за проверка дали даден процес е жив
Леко скриптче за проверка дали даден процес е жив (в случая snmpd) :
#!/bin/bash
hostname=b2.sysadmins-bg.net
email=billy@microsoft.com
snmpd_test=`pgrep snmpd`
# SNMPD TEST
if [ $snmpd_test != 1 ]
then
echo `echo host $hostname report: SNMPD DAEMON NOT RUNNING !!!|mail -s CHECK-IT-NOW $email`
fi
в crontab на 5 минути:
*/5 * * * * check-snmpd.sh > /dev/null 2>&1
толкоз .
Как се добавят VLANs (802.1q) на FreeBSD
Доста елементарно се оказа но поради факта , че не ми се беше налагало – не го знаех
))
Искаме влан 100 да си го разтагнем на BSD машинката и да му вдигнем IP адрес – какво правим ?
Ето това :
Зареждаме модула в ядрото :
# kldload if_vlan
Създаваме VLAN-а :
# ifconfig vlan100 create
Вдигаме му IP адрес :
# ifconfig vlan100 10.17.0.71 netmask 255.255.255.252 vlan 100 vlandev nve0
И всичко спи
FreeBSD jails
Intro :
FreeBSD е операционна система с отворен код , поне според мен най-подходяща за изграждане на сървъри , но също и с много добре развити мрежови приложения – перфектна за PPPoE концентратори или друг вид рутери да речем , като цяло доста стабилна операционна система с много възможности за настройки и много инструменти в помощ на системния администратор.Не на последно място ще кажа че проекта FreeBSD има изключително добра подръжка и много ама найстина много документация .
Какво е jail ?
Основната идея на jail-а е да повиши сигурността на системата като отдели един или повече процеси от другите и ги постави в chroot(2) среда. Чрез chroot(8) можем да променим root директорията на поредица процеси като ги отделим в сигурна среда от другите. Да речем , че недобронамерен потребител направи успешен exploit върху уязвим процес пуснат в jail и успешно компроментира системата , това няма да повлияе на цялата система както сами се досещате, а атакуващия ще има достъп само до процесите пуснати в jail-a. Разбира се има начини да се избяга от chroot средата, но за по-прости задачи (като service jails) e доста мощен инструмент.
Като цяло командата jail(8) служи за контрол над създадените jails.
Разбира се всички тези неща са доста добре обяснени във онлайн документацията на http://www.freebsd.org/doc/en/books/handbook/ , но основната ми идея е да ви покажа накратко как да си направите няколко service jails.
Изграждане на jails :
Тук ще ви покажа един елементарен пример за шаблон , лично аз използвам най-вече service jails – накратко това означава, че не е нужно да се прави пълен installworld на всеки jail. В този пример искаме крайният резултат да бъде HTTP, DNS и SMTP сървайси в отделни jails.Ще ни трябва една машина която ще наричаме хост и на която ще пуснем тези сървайси.На машината за примера имаме чисто нова инсталация на FreeBSD 6.3 със инсталиран пакет source , можете да вземете нужния сорс чрез :
#sysinstall -> configure -> distributions -> src
И така , да започваме
Кратко обяснение :
- Всеки jail ще бъде монтиран в /home/services.
- /home/services/ro е темплейта и read-only partition за всеки jail
- Празна директория за всеки jail ще бъде създадена тук : /home/services
- Всеки jail ще има директория /rw , която ще бъде линкната към read-write частта от jaila
- Всеки jail ще има собствена read-write която се базира на /home/services/skel.
- Всеки jailspace (read-write частта от всеки jail) трябва да бъде създадена /home/jails.
Сздаване на read-only темплейта :
* може да се наложи да инсталирате sysutils/cpdup на хост системата.
# mkdir /home/services /home/services/ro
# cd /usr/src
# make installworld DESTDIR=/home/services/ro
# cd /home/services/ro
# mkdir usr/ports
# portsnap -p /home/services/ro/usr/ports fetch extract
# cpdup /usr/src /home/services/ro/usr/src
# mkdir /home/services/skel /home/services/skel/home /home/services/skel/usr-X11R6 /home/services/skel/distfiles
# mv etc /home/services/skel
# mv usr/local /home/services/skel/usr-local
# mv tmp /home/services/skel
# mv var /home/services/skel
# mv root /home/services/skel
# mergemaster -t /home/services/skel/var/tmp/temproot -D /home/services/skel -i
# cd /home/services/skel
# rm -R bin boot lib libexec mnt proc rescue sbin sys usr dev
# cd /home/services/ro
# mkdir rw
# ln -s rw/etc etc
# ln -s rw/home home
# ln -s rw/root root
# ln -s ../rw/usr-local usr/local
# ln -s ../rw/usr-X11R6 usr/X11R6
# ln -s ../../rw/distfiles usr/ports/distfiles
# ln -s rw/tmp tmp
# ln -s rw/var var
# echo "WRKDIRPREFIX?= /rw/portbuild" > /home/services/skel/etc/make.conf
ако всички тези операции минат успешно е време да добавите в /etc/fstab следните неща :
/home/services/ro /home/services/ns nullfs ro 0 0
/home/services/ro /home/services/mail nullfs ro 0 0
/home/services/ro /home/services/www nullfs ro 0 0
/home/jails/ns /home/services/ns/rw nullfs rw 0 0
/home/jails/mail /home/services/mail/rw nullfs rw 0 0
/home/jails/www /home/services/www/rw nullfs rw 0 0
след това добавяме в /etc/rc.conf следните редове :
jail_enable="YES"
jail_set_hostname_allow="NO"
jail_list="ns mail www"
jail_ns_hostname="ns.example.org"
jail_ns_ip="192.168.3.17"
jail_ns_rootdir="/usr/home/services/ns"
jail_ns_devfs_enable="YES"
jail_mail_hostname="mail.example.org"
jail_mail_ip="192.168.3.18"
jail_mail_rootdir="/usr/home/services/mail"
jail_mail_devfs_enable="YES"
jail_www_hostname="www.example.org"
jail_www_ip="192.168.3.19"
jail_www_rootdir="/usr/home/services/www"
jail_www_devfs_enable="YES"
* За вески jail трябва да сме предвидили ip адрес – това е задължително (без значение частен или публичен)
* Сигурно ви прави впечатление че тука заместваме /home/services/ със /usr/home/services , това е така защото във FreeBSD директорията /home е линк към /usr/home
Да продължим нататък като създадем тези папки :
# mkdir /home/services/ns /home/services/mail /home/services/www
# mkdir /home/jails
# cpdup /home/services/skel /home/jails/ns
# cpdup /home/services/skel /home/jails/mail
# cpdup /home/services/skel /home/jails/www
И накрая :
# mount -a
# /etc/rc.d/jail start
Ако всичко е наред би трябвало да имате три стартирани jail-a (можете да проверите това с jls(8)):
# jls
JID IP Address Hostname Path
3 192.168.3.17 ns.example.org /home/services/ns
2 192.168.3.18 mail.example.org /home/services/mail
1 192.168.3.19 www.example.org /home/services/www
Всичко изглежда наред , сега можете да се логнете да речем в jail с ID 3 (ns) с командата :
# jexec 3 csh
Това е всичко
Apache Benchmark Testing
Тези дни ми се наложи да променям нещо по скриптовете на един от проектите по който работя , в случая исках да знам как ще се държи сървърът ми след промяна по накой от скриптовете . Решението е в инструмента ab (Apache Benchmark) който идва със Apache Web Server . Използва се много лесно и дава полезна информация (макар и не особено много) затова как се държи сървърът при определен брой заявки за определен период към определена страница от сайта ви. Имайте предвид че ab не емулира реално поведение на юзер на вашата страница , но може да ви помогне да разберете как сървърът ви поема заявките. Важно е да знаем , че не е препоръчително ab и сървърът който тестваме да са на един и същи хост , защото и двата процеса ще заемат ресурси (не много малко – зависи от машината) , и това със сигурност ще се отрази на резултатите. Има и доста други показатели от който зависят резултатите от теста, тъй че те не винаги ще бъдат абсолютно еднакви , затова най-добре би било да се сравняват тестовете след минимални промени по конфигурацията на уеб сървъра или скрипта по който сте работили и тествали . ab е доста лесна за ползване – в моя случая пуснах 1000 рекуеста (-n 1000) , по 10 наведнъж (-c 10):
$ab -n 1000 -c 10 http://b2.sysadmins-bg.net/test.html
Ето и резултата :
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking b2.sysadmins-bg.net (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
Completed 800 requests
Completed 900 requests
Completed 1000 requests
Finished 1000 requests
Server Software: Apache
Server Hostname: b2.sysadmins-bg.net
Server Port: 80
Document Path: /test.html
Document Length: 20711 bytes
Concurrency Level: 10
Time taken for tests: 1178.201 seconds
Complete requests: 1000
Failed requests: 414
(Connect: 0, Receive: 0, Length: 414, Exceptions: 0)
Write errors: 0
Total transferred: 20892586 bytes
HTML transferred: 20710586 bytes
Requests per second: 0.85 [#/sec] (mean)
Time per request: 11782.007 [ms] (mean)
Time per request: 1178.201 [ms] (mean, across all concurrent requests)
Transfer rate: 17.32 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.7 0 7
Processing: 2638 11766 2444.4 11625 37576
Waiting: 1000 8787 1969.5 8759 28169
Total: 2639 11766 2444.3 11625 37576
Percentage of the requests served within a certain time (ms)
50% 11625
66% 12268
75% 12657
80% 12975
90% 13992
95% 14918
98% 16899
99% 18568