Archive for 'freebsd'

How to monitor hard drive temperature with MRTG and FreeBSD

I really love to monitor my servers, so why shouldn’t I also monitor the temperatures of my hard drives? In my mind a cooler hard drive lives longer than a hot one. However, the google paper on failure trends of hard drives says that the hard drive temperatures doesn’t have an impact on a hard drives life length. But I want things to run cool in my server so here is how I monitor the hard drives with mrtg and FreeBSD.

To be able to get the hard drives temperatures we have to install SmartMonTools.

The smartmontools package contains two utility programs (smartctl and smartd) to control and monitor storage systems using the Self-Monitoring, Analysis and Reporting Technology System (SMART) built into most modern ATA and SCSI harddisks. In many cases, these utilities will provide advanced warning of disk degradation and failure.

Install SmartMonTools
# cd /usr/ports/sysutils/smartmontools
# make install clean

Check the temperature of the drives that you want to monitor
# smartctl -a /dev/ad4 | grep Temperature_Celsius
194 Temperature_Celsius 0×0022 113 103 000 Old_age Always – 34
# smartctl -a /dev/ad6 | grep Temperature_Celsius
194 Temperature_Celsius 0×0022 148 091 000 Old_age Always – 30

Create a script called disktemp.sh that outputs the temperatures in a Mrtg friendly way.

#!/bin/sh
/usr/local/sbin/smartctl -a /dev/ad6 | grep Temperature | awk '{print $10}' | tail -n 1
/usr/local/sbin/smartctl -a /dev/ad4 | grep Temperature | awk '{print $10}' | tail -n 1
echo "A long time"
echo ""

Then create a mrtg cfg file called disktemp.cfg:

### Global Config Options
WorkDir: /home/www/mrtg
Options[_]: growright, bits
EnableIPv6: no
Language: swedish

# Sysload
Target[disktemp]: `/usr/local/etc/mrtg/disktemp.sh`
MaxBytes[disktemp]: 100
Options[disktemp]: integer,gauge,nopercent
YLegend[disktemp]: Temp (C)
ShortLegend[disktemp]: (C)
Legend1[disktemp]: /dev/ad4
Legend2[disktemp]: /dev/ad6
LegendI[disktemp]: /dev/ad4
LegendO[disktemp]: /dev/ad6
Title[disktemp]: Hard drive Temperature
PageTop[disktemp]: 

Hard drive temperature

Run mrtg (a couple of times)
/usr/local/bin/mrtg /usr/local/etc/mrtg/disktemp.cfg

Check If everything seems to be working. If OK then add this to crontab…

The result should be looking like this (in your language):

How to monitor cpu temperature with MRTG on FreeBSD

Have you ever wanted to monitor the cpu temperature on your server with MRTG and FreeBSD? Of course you wanted that if you have a server running in a closet or some other special place. By following my steps you can have a nice graph like below. It is really relaxing to have all vital stats from your server available online.

This small tutorial works if you have the same processor as I have (Athlon 64). The only thing besides MRTG that you need is the k8temp program which is described as ”k8temp is a utility to read the temperature sensors provided by AMD K8 and K10 processors, including most Athlon 64′s and Opterons.” If you don’t have a Athlon 64 cpu there are other programs that should be ok to get the temperature as well.

You should have MRTG installed and be somewhat familiar the concept to get this working…

Check your cpu (if you dont have a clue)
> dmesg | grep Processor
CPU: AMD Athlon(tm) 64 X2 Dual Core Processor 5000+ (2599.72-MHz K8-class CPU)

Install k8temp
> cd /usr/ports/sysutils/k8temp/
> make install clean

Then setup mrtg to use k8temp. This is my mrtg-config file: cputemp.cfg

### Global Config Options
WorkDir: /home/www/mrtg
Options[_]: growright, bits
EnableIPv6: no
Language: swedish

# Sysload
Target[cputemp]: `/usr/local/etc/mrtg/cputemp.sh`
MaxBytes[cputemp]: 100
Options[cputemp]: integer,gauge,nopercent
YLegend[cputemp]: Temp (C)
ShortLegend[cputemp]: (C)
Legend1[cputemp]: CPU 0:1
Legend2[cputemp]: CPU 0:2
LegendI[cputemp]: CPU 0:1
LegendO[cputemp]: CPU 0:2
Title[cputemp]: CPU Temperature
PageTop[cputemp]: 

CPU temperature

By running the ”k8temp” program you get a list of available sensors. Find the temperatures that you are interested in and edit the script below. This is the script ”cputemp.sh” that the mrtg-config-file uses to get the cpu-temperature:

#!/bin/sh
/usr/local/sbin/k8temp -n 0:0:1
/usr/local/sbin/k8temp -n 0:1:1
echo ""
echo ""

Run mrtg (a couple of times)
/usr/local/bin/mrtg /usr/local/etc/mrtg/cputemp.cfg

Check If everything seems to be working. If OK then add this to crontab…

Sending email in FreeBSD with Gmail

When I moved my mail functionality (gmail) from my FreeBSD-server to Google Apps I was left with no way to send email from my server (sendmail disabled and gmail removed) from shell. I have no longer the need to recieve email from my server, thanks to Google! However, I needed to send emails from my server to report server status and report software/hardware errors.

This is how I solved the problem on my FreeBSD 7.0 server.

1. Freebsd has a guide for setting up send only with ssmtp. First you should install ssmtp.

cd /usr/ports/mail/ssmtp/ && make install clean

2. Then you need to configure ssmtp for Gmail. Create this file in /usr/local/etc/ssmtp/ssmtp.conf. Replace email and password with your Gmail-account settings.

root=youremail@gmail.com
mailhub=smtp.gmail.com:587
AuthUser=youremail@gmail.com
AuthPass=yourpassword
UseSTARTTLS=YES

3. Test ssmtp. First you have to create a textfile with the message that you are going to send. Copy the text between the lines below.

Save the text to ”testmessage.txt”.
————————–
To: youremail@gmail.com
From: youremail@gmail.com
Subject: Testmessage

This is a test
--------------------------

Then run this command to send the testmessage.

ssmtp -v youremail@gmail.com < testmessage.txt

You should see the following output:

[<-] 220 mx.google.com ESMTP 14sm2982172ewy.10
[->] EHLO mysql
[<-] 250 PIPELINING
[->] STARTTLS
[<-] 220 2.0.0 Ready to start TLS
[->] EHLO servername
[<-] 250 PIPELINING
[->] AUTH LOGIN
[<-] 334 VXNlcm5hbWU6
[->] bWFyY3VzLm55YkBnbWFpbC5jb20=
[<-] 334 UGFzc3dvcmQ6
[<-] 235 2.7.0 Accepted
[->] MAIL FROM:
[<-] 250 2.1.0 OK 14sm2982172ewy.10
[->] RCPT TO:
[<-] 250 2.1.5 OK 14sm2982172ewy.10
[->] DATA
[<-] 354 Go ahead 14sm2982172ewy.10
[->] Received: by Servername (sSMTP sendmail emulation); Tue, 09 Mar 2010 12:53:14 +0100
[->] From: "Username"
[->] Date: Tue, 09 Mar 2010 12:53:14 +0100
[->] To: youremail@gmail.com
[->] Subject: Testmessage
[->]
[->] This is a test
[->] .
[<-] 250 2.0.0 OK 1268135596 14sm2982172ewy.10
[->] QUIT
[<-] 221 2.0.0 closing connection 14sm2982172ewy.10

If everything seems ok you should now have a fresh email in your Gmail account. Check it out! If not, then you should probably check your ssmtp.conf file and verify that you can connect to smtp.google.com

4. Last, replace sendmail with ssmtp. This makes ssmtp the default mailer for your system.

mv /usr/sbin/sendmail /usr/sbin/sendmail.org
ln -s /usr/local/sbin/ssmtp /usr/sbin/sendmail

5. Check that mail is working.

mail -v -s "TestSubject" youremail@gmail.com
Testing and
.

Output:
[<-] 220 mx.google.com ESMTP 16sm3004137ewy.7
[->] EHLO mysql
[<-] 250 PIPELINING
[->] STARTTLS
[<-] 220 2.0.0 Ready to start TLS
[->] EHLO servername
[<-] 250 PIPELINING
[->] AUTH LOGIN
[<-] 334 VXNlcm5hbWU6
[->] bWFyY3VzLm55YkBnbWFpbC5jb20=
[<-] 334 UGFzc3dvcmQ6
[<-] 235 2.7.0 Accepted
[->] MAIL FROM:
[<-] 250 2.1.0 OK 16sm3004137ewy.7
[->] RCPT TO:
[<-] 250 2.1.5 OK 16sm3004137ewy.7
[->] DATA
[<-] 354 Go ahead 16sm3004137ewy.7
[->] Received: by mysql (sSMTP sendmail emulation); Tue, 09 Mar 2010 13:11:41 +0100
[->] From: "Username"
[->] Date: Tue, 09 Mar 2010 13:11:41 +0100
[->] To: youremail@gmail.com
[->] Subject: TestSubject
[->]
[->] testing
[->] .
[<-] 250 2.0.0 OK 1268136703 16sm3004137ewy.7
[->] QUIT
[<-] 221 2.0.0 closing connection 16sm3004137ewy.7

6. Check the log file.

cat /var/log/maillog

Output:
SMTP[755]: Creating SSL connection to host
sSMTP[755]: SSL connection using RC4-MD5
sSMTP[755]: Sent mail for username@servername(221 2.0.0 closing connection 14sm3068161ewy.2) uid=0 username=username outbytes=696
sSMTP[1234]: Creating SSL connection to host
sSMTP[1234]: SSL connection using RC4-MD5
sSMTP[1234]: Sent mail for username@servername (221 2.0.0 closing connection 16sm3004137ewy.7) uid=0 username=username outbytes=349

Summary
This worked for me straight out of the box. I didn't need to make any changes to make it work. I hope it works for you as well!

Hemsida till Ludvig Nordström sällskapet

Jag har nyligen hjälp en kompis med att bygga en hemsida åt Ludvig Nordström sällskapet. Så kika på den!

ludvig1

Eftersom jag är ett stort fan av att använda WordPress (php) som CMS till enklare webbsidor åt föreningar/mindre företag så blev det givetvis den tekniska lösningen. Som vanligt blev det lite hackande i form av att mixtra med teman samt plugins/tillägg men det var ganska enkla fixar som behövde göras. Samtidigt var det kul att se alla bra nyheter i WordPress 2.8. Det är riktigt imponerande att följa WP’s utveckling.

GEOM_MIRROR: Component ad2 (device gm0) broken, skipping

Another day for me with server trouble. On my server I use the Freebsd gmirror (software raid) with mirrored disks. It has worked perfectly for the last couple of years, however today I found out that my gmirror raid1 was degraded. The ”gmirror list” command told me that one of my disks was missing in the raid. The error message in /var/log/messages was the somewhat strange ”GEOM_MIRROR: Component ad2 (device gm0) broken, skipping”. Is my disk (ad2) bad or what? Why is gm0 broken? The disk is actually running and seems to be okey.

I found a solution for the problem. If you remove the ”missing disk” from the raid and then insert it again, then the raid is rebuilt. For me the raid seems to be working again.

My solution:
gmirror deactivate -v gm0 ad2
gmirror forget -v gm0
gmirror insert -v gm0 ad2

mod_rewrite: could not init rewrite log lock in child

I found this strange error in my freebsd Apache error log: ”mod_rewrite: could not init rewrite log lock in child”. The same error was logged every second and was filling up my disk with junk. This should not happen because I have a fresh installation of Apache from the Freebsd ports tree and no strange configuration.

After some google-time I found the ”RewriteLog directive” at the mod_rewrite page. It says: ”To disable logging either remove or comment out the RewriteLog directive or use RewriteLogLevel 0! ”

I set ”RewriteLogLevel 0″ in my apache conf-file and restarted apache. The problem was now gone! I do not know which file or directory that mod_rewrite tries to write to however i am pleased to know that the problem was solved.

Så köper du ett flipperspel

Jag får ofta frågan från icke insatta i flippervärlden om var man kan köpa flipperspel, hur mycket dom kostar, hur många olika finns det och hur man lagar dom.

Firepower II

Var hittar jag då flipperspel?
a) Svenska flippersällskapets forum (Klicka på Torget)
b) Flipperspel på blocket
c) Flipperspel till salu hos flipperoperatörer (Klicka på spel-till-salu) Ring en operatör!
d) Flipperkontakter i Sundsvall med omnejd samt över hela Sverige

Hur mycket kostar ett flipperspel?
Allt mellan 2000 kr till 50 000 kr. Priset är en kombination av hur populärt och roligt ett spel är, dess skick samt hur stort utbud/efterfrågan det finns av en speciell titel. Om du är osäker så ställ en fråga på Svenska flippersällskapets forum för att få en uppskattning av priset. Oftast får du här en rättvis prisbild av de duktiga forummedlemmarna.

Vilka spel finns det?
Internet Pinball Database så finns de allra flest spel listade. Det finns i dagsläget 5000 st unika titlar så det finns ett stort antal spel att välja mellan. Om du vill testa spelet på din PC innan du köper det för att få en uppfattning om regler och dylikt så kan du ladda hem Visual Pinmame som är en flipperemulator. Till Pinmame så kan du sedan ladda hem de flesta nya spelen (80-talet och framåt). Du laddar du hem spelets ROM:ar och lägger i en mapp i Pinmame-installationen.

Hur lagar man flipperspel?
Om man har intresset för att meka med mekaniska, elektroniska eller elektromagentiska prylar så är flipperspel precis på lagom nivå för att man ska kunna laga det mesta på egen hand. För lagningar blir man förr eller senare tvingad att utföra eftersom det är många rörliga delar i ett flipperspel som till slut går sönder. Oftast så kan även nybörjare laga de vanligaste och enkla felen. Är det något svårare fel så kollar jag runt på dessa källor.
a) Läser manualen och kollar upp vad det är för fel.
b) Läser pinball repair guides på nätet för ytterligare info.
c) Frågar om råd på Svenska flippersällskapets forum
d) Googlar eller söker i rec.games.pinball.

Den bästa källan för information om flipperspel i Sverige är Svenska flippersällskapets hemsida. Där finns många artiklar om flipper (bla kom-ihåg-lista-vid-spelköp) samt även ett mycket aktivt forum.

Flytt av mailhanteringen från Qmail till Google Apps

Eftersom jag driftat mina egna webbservrar (FreeBSD) i ett flertal år så har det visat sig vilka moment som är mer krångliga och tidskrävande än andra. I huvudsak så kör jag webb (php, apache och mysql) och mail (Qmail) på mina maskiner för dels mina domäner samt för kompisars domäner. Det mest krångliga & tidskrävande har under denna tid varit att hantera mailen. För det första så är det inte helt lätt att konfigurera Qmail trots att det finns en relativt enkel tutorial på QmailRocks. Om man ska ha alla finesser som imap, pop, spamfilter, virusskydd och vpopmail så får man en diger lista med program som ska konfas och skötas. Detta har inte fungerat helt okey för ganska mycket spam kom fortfarande fram och min internetoperatör är inte helt förjust i att jag ibland skickar ut tusentals mail.

För att slippa mailhanteringen så beslöt jag mig för att testa Google Apps Standard Edition som är en gratis tjänst från Google där du kan koppla ett domännamn till ett flertal av deras tjänster. Den tjänst jag ville använda mig av var Gmail på så sätt att all min mail för alla mina domäner körs via deras mailtjänst.

Jag hade följande krav på tjänsten:
1) Webbmail för enkel hantering
2) Imap och pop för ytterligare valfrihet
3) smtp funktionalitet så att mina webbsidor (främst) kan skicka mail
4) Gmails spamfilter

På Googles sidor så kunde jag läsa mig till att dom hade stöd för punkterna 1, 2 och 4. Den återstående punkten, som jag var tvungen att testa, var smtp-funktionaliteten. Detta var den viktigaste punkten eftersom min största sajt HockeySnack kan behöva skicka iväg flera tusen mail vid vissa tillfällen. Sajten kräver ett väl fungerande mailsystem!

Tydligen så får varje användare max skicka 500 mail per dag då man använder gratisversionen. Skickar man fler mail så blir man avstängd i 24 timmar. Men detta kommer man runt genom att skapa upp fler användare. Så om du har 10 användare så kan du teoretiskt skicka 10 * 500 = 5000 mail/dag. För att klara denna begränsning så var jag tvungen att skapa logik i koden på min webbsajt som sköter mailhanteringen så att inte gränsvärdet överskrids på daglig basis. Den lösning som jag skapade har hittills fungerat förträffligt. Då php-mailprogrammet känner att det närmar sig begränsningen så väntar den med att skicka mail tills dess att det är grönt ljus.

Att flytta mail fysiskt från qmail till google apps utfördes genom att mappa upp båda servrarna via imap i Microsoft Outlook (Thunderbird borde gå lika bra) för att sedan bara flytta över mappar och brev med drag and drop. Hur man flyttar över en hel bunt med konton vet jag inte hur man gör utan då får man nog kontakta Google och köra betalvarianten av Google Apps.

Slutsats
Nu har jag kört mailen via Google Apps i några veckor och jag har verkligen inget att klaga på. Jag har haft noll nertid på tjänsten och inte fått ett enda spammail under hela tiden. Jag har gjort ett större utskick från min webbsajt till 5000 användare utan problem. Mina kompisar har flyttat all sin mail till samma tjänst med samma fina resultat så nu kan jag äntligen stänga ner min privata mailserver. Min rekommendation till folk med egna problematiska webbservrar är att det inte är några problem att köra Google Apps. Den enda invändningen man kan ha är att Google nu vet innehållet i mina mail, men för min del är inte det något problem. Att det hela är gratis gör ju inte heller saken sämre.

OBS För att kunna använda Google Apps så är det lättast om du äger din domän samt att du kan ändra DNS-inställningarna för denna. Du måste kunna ändra din MX-record till att peka mot en av googles servrar.

Monitoring Qmail in Freebsd

I needed a way to monitor qmail on my Freebsd server. In particular I wanted to shut down qmail if ”too many mails” were sent in a specified timeframe. I previously had a problem when one of my websites began to act as a spam proxy due to a ”bug” in php mail function that enables mail injection. I could not google a solution and had to write my own script.

The approach is fairly simple. The qmail-send log folder ( /var/log/qmail/qmail-send/) contains information about all recently sent emails. My script checks one of these log-files too see if it contains the current date. If it does, then Qmail has sent ”too many” emails and qmail should be shut down. Depending on which log file that is checked and how many records you have in each log file you could determine how many emails that are ”too many” for your qmail server. It is simply a matter of tuning the script by changing ”head -n NUMBER”.

Which action to take when qmail runs wild is up to you. On my server I notify myself by sending a sms to my phone and a simple mail. The script is as follows:

#!/usr/local/bin/bash
PATH=$PATH:/usr/local/bin

DATE=”`date +%Y-%m-%d`”
LOGFILE=”`ls -lt /var/log/qmail/qmail-send/@* | awk {‘print $9′} | head -n 1`”
MAILDATE=”`cat  $LOGFILE | tai64nlocal | head -c 10`”
QMAILUP=”`svstat /var/qmail/supervise/qmail-send/ | awk {‘print $2′}`”

if [ $QMAILUP == "down" ]
then
  echo No need for checking – Qmail is not running
  exit
fi

echo This date: $DATE
echo Log date: $MAILDATE
if [ $DATE == $MAILDATE ]
then
  echo Equal dates – Mailing qmail-administrator
  /var/qmail/bin/qmail-inject -h < /scripts/smsqmail
  echo ”Qmail is stopped” | mailx -s ”Qmail alert” marcus@blahblah.com
  echo Shutting down qmail in 20 seconds
  sleep 20
  qmailctl stop
else
  echo Different dates – Everything seems to be okey
fi

Förhindra php mail injection

PHP’s mail-funktion (mail) ska man använda med viss försiktighet eftersom spambot’ar relativt enkelt kan utnyttja en inbyggd svaghet/feature/”kalla-det-vad-du-vill”. Det farliga är att många som utvecklar i php inte vet vad som kan hända med svaga osäkrade webbside-formulär som använder denna funktionalitet. Om en spambot hittar och utnyttjar ”svagheten” på dina webbsidor så kan du på ett ögonblick bli en storspammare och får då stå för konsekvenserna då du förr eller senare blir uppsökt av din internetleverantör eller webbhotell.

Vanligtvis har man ”kontakta oss” eller andra sidor där användare får skriva in sitt namn, e-postadress, ämne samt meddelande. Då man sedan skriver koden som ska maila till den som ska ha informationen så kontrollerar man vanligtvis  att e-postadressen är riktig samt att några av fälten inte är tomma. Eventuellt filtrerar man även meddelandet och tar bort html, konstiga tecken eller liknande. Då man processat variablerna så skickar man in dessa i mail-funktionen som skickar ut mail till den/de som ska få det.

Mail-funktionen anropas enligt följande:

bool mail ( string $to, string $subject, string $message [, string $additional_headers [, string $additional_parameters]] )

Exempel på användning:

$to = ”kontakt@person.se”
$subject = $[Ämne från webbformuläret];
$message = $[Meddelande från webbformuläret];
$additional_headers = ”From:”.$[sändaradress från webbformuläret];
mail($to,$subject,$message,$additional_headers);

Eftersom man hårdkodar mottagaradressen så kan man tro att det enbart är den personen som kommer att få mailet. Men så är INTE fallet utan mejlet kan skickas till ett mycket stort antal personer utan din vetskap (om du nu inte läst detta innan) med så kallad mail injection. Detta nämner inte php-manualen utan kodaren måste själv veta hur mail skickas och hur mail är formaterade. Med tanke på att nivån på php-programmerare varierar kraftigt så är det viktigt att man har koll på något sånt här.

Hur fungerar då detta?
Spambot’arna injicerar ytterligare mottagare i parametern för additional_header som kommer från formulärets sändaradress-input ruta. Genom att lägga till fler mottagare genom CC samt BCC i oskyddade formulär så agerar ditt webbformulär som en spam-proxy.

Exempel på mail injection av sändaradress:

sender@anonymous.www%0ACc:recipient@someothersite.xxx %0ABcc:somebloke@grrrr.xxx,someotherbloke@oooops.xxx

Lösning
Använd rigorösa kontroller även på simpla formulär. Kontrollera att det inte går att injicera mail headers. Använd exempelvis en mail-class som har skydd mot denna typ av problem eller något reguljärt uttryck.

Länkar
mailinjection.com – Mailinjection – Mer om problemet
SecurePhp – Email injection - Beskrivning av problemet och lösningar
Hardened PHP – Suhosin patch - Patch som bl.a används av freebsd ports