GNU/Linux

You are currently browsing the archive for the GNU/Linux category.

Håller på att kika lite på perl som jag inte kodat så mycket i tidigare. Skrev då ett script som expanderar en ipv6-adress som ju kan ha en variabel mängd 0:or, t.ex. är både ::1 och 0000:0000:0000:0000:0000:0000:0000:0001 en helt ok ipv6-adress som båda expanderar till samma sak.

#!/usr/bin/env perl
use strict;
use warnings;
sub count_groups { # See hown many groups we have
        die "Too many arguments for subroutine" if @_ < 1;
        die "Too few arguments for subroutine" if @_ > 1;
        my $address = shift;
        # Make sure we have just enough double colons and count them if it is all right
        my $colon_no =  () = $address =~ /::/g;
        die "Invalid ipv6 address" if $colon_no > 1;
        my $no =  1;
        $no += () = $address =~ /:/g;
        return $no;
}
# If we have one occurence of :: replace with correct amount of zeros and colons
sub expand_void {
        die "Too many arguments for subroutine" if @_ < 1;
        die "Too few arguments for subroutine" if @_ > 1;
        my $address = shift;
        my $no_colons = 8 - count_groups($address);
        my $insert = "0000:0000";
        for (my $i = 0; $i < $no_colons - 1; $i++) {
                $insert = $insert . ":0000"
        }
        $address =~ s/::/:$insert:/g;
        return $address;
}
# Fix a single group and padd with zeros
sub fix_group {
        die "Too many arguments for subroutine" if @_ < 1;
        die "Too few arguments for subroutine" if @_ > 1;
        my $group = shift;
        my $len = length($group);
        die "Group has too many digits" if $len > 4;
        while ($len < 4) {
                $group = "0$group";
                $len++;
        }
        # Make sure it is a valid hexnumber
        die "Group is not a hex number" if $group !~ /^[0-9a-fA-F]+$/;
        return $group;
}
# Loop all groups and fix them with fix_group
sub fix_groups {
        die "Too many arguments for subroutine" if @_ < 1;
        die "Too few arguments for subroutine" if @_ > 1;
        my $a = shift;
        my @groups = split(/:/, $a);
        my $address = "";
        foreach my $group (@groups) {
                $group = fix_group($group);
                $address = "$address$group:";
        }
        $address =~ s/:+$//;
        return $address;
}
# Now put it together
# Loop through stdin
while (<>) {
        chomp; # Remove newline
        my $addr = $_; # Store address
        if (count_groups($addr) != 8) {
                $addr = expand_void($addr);
        }
        $addr = fix_groups($addr);
        # Double check that we have enough groups one last time
        die "Not a valid ipv6 address" if count_groups($addr) != 8;
        # Lower case is preffered for ipv6 adresses
        print lc "$addr\n";
}
exit 0;

Kan användas t.ex. så här för att expandera dina egna ipv6-adresser: ip a | awk '/inet6/ {print $2}' |sed 's_/.*__' | ./address.pl

eller för att t.ex. bygga reverse pointers: echo [adress] | ./address.pl |rev |sed 's/://g'| sed 's/\(.\)/\1./g' | sed 's/$/ip6.arpa. IN PTR/'

Oracle har gjort det svårt för linuxdistributioner att ha java i sina repositories sedan de köpte Sun. Icke desto mindre behövs i bland Oracles javaversion när openjdk inte räcker för någon specifik implementation. Jag kommer därför visa hur du kan göra för att installera Oracles java på ett sätt som underlättar framtida uppdateringar. Säkerhetsbrister i java är nämligen den attackvektor som används vid närmare 90% av alla lyckade intrång på en persondator vilket gör att det är viktigt att uppgradera varje gång Oracle släpper patchar, även när du inte installerar via en pakethanterare.

Jag kommer här gå igenom installation av 64 bitars java, om du ska köra 32 bitar på ett 64 bitars OS behöver du installera en version av glibc för i386 samt använda nspluginwrapper för att gör browserpluginet tillgängligt. Det är lite bökigare så jag kommer inte gå igenom det här, men det går att göra.

Alla kommandon nedan körs som root, tills jag säger till.

Börja med att ta bort andra installationer av java du kan ha (exempel för debianbaserade distar):

apt-get purge oracle-java*
apt-get purge openjdk*

gå till:
http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

Godkänn oracles licensavtal och ladda ned senaste sdk:n, här nedan antar jag att du sparar filen i /tmp. Den fil jag laddade hem hette jdk-8u11-linux-x64.tar.gz, din kommer förmodligen ha en annan versionsnumrering så uppdatera kommandona nedan så att du får rätt sökvägar.

Vi kommer nu att skapa en katalogstruktur under /opt som gör de lätt för oss att uppgradera java i framtiden, därefter kommer vi symlänka till binärerna under /usr/bin/ (om du mår bättre av det kan du förstås köra /usr/local/bin/ istället) och lägga en länk till browserpluginet på rätt ställe för firefox, Google har valt att inte stödja NPAPI för Chrome sedan version 35 vilket gör att det inte kommer funka för Chrome.

mkdir /opt/java/
cd /opt/java/
mv /tmp/jdk-8u11-linux-x64.tar.gz .
tar xfv jdk-8u11-linux-x64.tar.gz
ln -s jdk1.8.0_11 latest
ln -s latest default

Av någon anledning har Oracle ägaren med uid 10 (uucp på flera distar) på sina filer, men jag byter dem alltid till root:

chown -R -h root:root *

Nu kan vi börja skapa symlänkar. Jag brukar bara använda binärerna java, javac, javadoc och javaws så vi kör dem först:

ln -s /opt/java/default/bin/java /usr/bin/
ln -s /opt/java/default/bin/javac /usr/bin/
ln -s /opt/java/default/bin/javadoc /usr/bin/
ln -s /opt/java/default/bin/javaws /usr/bin/

Om du vill kan du även köra resten av binärerna:

ln -s /opt/java/default/bin/appletviewer /usr/bin/
ln -s /opt/java/default/bin/ControlPanel /usr/bin/
ln -s /opt/java/default/bin/extcheck /usr/bin/
ln -s /opt/java/default/bin/idlj /usr/bin/
ln -s /opt/java/default/bin/jar /usr/bin/
ln -s /opt/java/default/bin/jarsigner /usr/bin/
ln -s /opt/java/default/bin/javafxpackager /usr/bin/
ln -s /opt/java/default/bin/javah /usr/bin/
ln -s /opt/java/default/bin/javap /usr/bin/
ln -s /opt/java/default/bin/java-rmi.cgi /usr/bin/
ln -s /opt/java/default/bin/jcmd /usr/bin/
ln -s /opt/java/default/bin/jconsole /usr/bin/
ln -s /opt/java/default/bin/jcontrol /usr/bin/
ln -s /opt/java/default/bin/jdb /usr/bin/
ln -s /opt/java/default/bin/jdeps /usr/bin/
ln -s /opt/java/default/bin/jhat /usr/bin/
ln -s /opt/java/default/bin/jinfo /usr/bin/
ln -s /opt/java/default/bin/jjs /usr/bin/
ln -s /opt/java/default/bin/jmap /usr/bin/
ln -s /opt/java/default/bin/jmc /usr/bin/
ln -s /opt/java/default/bin/jmc.ini /usr/bin/
ln -s /opt/java/default/bin/jps /usr/bin/
ln -s /opt/java/default/bin/jrunscript /usr/bin/
ln -s /opt/java/default/bin/jsadebugd /usr/bin/
ln -s /opt/java/default/bin/jstack /usr/bin/
ln -s /opt/java/default/bin/jstat /usr/bin/
ln -s /opt/java/default/bin/jstatd /usr/bin/
ln -s /opt/java/default/bin/jvisualvm /usr/bin/
ln -s /opt/java/default/bin/keytool /usr/bin/
ln -s /opt/java/default/bin/native2ascii /usr/bin/
ln -s /opt/java/default/bin/orbd /usr/bin/
ln -s /opt/java/default/bin/pack200 /usr/bin/
ln -s /opt/java/default/bin/policytool /usr/bin/
ln -s /opt/java/default/bin/rmic /usr/bin/
ln -s /opt/java/default/bin/rmid /usr/bin/
ln -s /opt/java/default/bin/rmiregistry /usr/bin/
ln -s /opt/java/default/bin/schemagen /usr/bin/
ln -s /opt/java/default/bin/serialver /usr/bin/
ln -s /opt/java/default/bin/servertool /usr/bin/
ln -s /opt/java/default/bin/tnameserv /usr/bin/
ln -s /opt/java/default/bin/unpack200 /usr/bin/
ln -s /opt/java/default/bin/wsgen /usr/bin/
ln -s /opt/java/default/bin/wsimport /usr/bin/
ln -s /opt/java/default/bin/xjc /usr/bin/

För att få browserpluginet att funka kör vi nu:

ln -s /opt/java/default/jre/lib/amd64/libnpjp2.so /usr/lib/mozilla/plugins/

Om du behöver kan du nu också sätta JAVA_HOME i din .bash_rc, kör detta som din egen användare (inte root)

echo "JAVA_HOME=/opt/java/default
export JAVA_HOME" >> ~/.bash_rc

Nästa gång du behöver uppgradera java laddar du bara hem en ny version från oracle och packar upp den i /opt/java och pekar om symlänken /opt/java/latest från /opt/java/jdk1.8.0_11 till din nya katalog och du är klar.

I dag ville jag räkna antal unika besökare till en ny site jag satt upp. Så här gjorde jag:

#!/bin/bash
if [[ -z "$1" ]]; then
        date=$(date +%d/%b)
else
        date=$(date -d "$1" +%d/%b)
fi
zcat /var/log/apache2/access.log*.gz | cat - /var/log/apache2/access.log{,.1} | grep -i $date  | awk '{print $1}' | sort | uniq | wc -l
exit 0

Skriptet tar en frivillig parameter som är ett datum som date-kommandot kan parsa och räknar antal unika ipadresser i logiflen för det datumet. Utan parameter får du dagens besökare.

Edit: Fixade så att gzipade loggar kom med också.

Jag har tidigare visat hur man installerar GlusterFS på två servrar eller mer. Nu tänkte jag visa hur man kan använda en GlusterFSvolym tillsammans med Heartbeat för att sätta upp övervakningsverktyget Xymon.

Börja med att skapa en volym i GlusterFS, jag gjorde en på 100 GB, det borde räcka för att övervaka några tusen noder och spara all historik länge (flera år). Jag kallar min volym för xyvol och den server jag monterar volymen ifrån  glustersrv1 vilket kommer synas i kommandona nedan.

Nu behöver du två servrar med CentOS på, se till att ha ip-adresserna för de båda servrarna tillgängliga samt ytterligare en ip-adress som de ska dela på. Kör sedan kommandona nedan på båda servrarna.

Börja med att skapa en användare och lite kataloger som behövs samt montera glustervolymen under /opt/xymon:

groupadd xyserver
useradd -g xyserver -m -d /opt/xymon xyserver
mkdir /var/run/xyserver
chown xyserver:xyserver /var/run/xyserver
echo 'glustersrv1:/xyvol /opt/xymon glusterfs defaults,_netdev 0 0
' >> /etc/fstab
mount -a

Installera sedan apache och de beroenden vi behöver för att kunna bygga våra paket längre fram:

yum install gcc make httpd mod_ssl pango-devel libxml2-devel pcre-devel openssl-devel openldap-devel

 

Två paket vi behöver är rrdtool och fping så vi bygger dem så här:

wget http://fping.org/dist/fping-3.2.tar.gz
tar xfv fping-3.2.tar.gz
cd fping-3.2
./configure
make && make install
cd ..
chmod +xs /usr/local/sbin/fping
wget http://oss.oetiker.ch/rrdtool/pub/rrdtool-1.4.8.tar.gz
tar xfv rrdtool-1.4.8.tar.gz
cd rrdtool-1.4.8
./configure
make && make install
cd ..

Här näst kan vi installera Xymon, du behöver ladda hem filen på nått bra sätt efterson sourceforge inte tillåter direktlänkar så överlåter jag det med varm hand åt läsaren. Här finns filen iaf:  http://downloads.sourceforge.net/project/xymon/Xymon/4.3.17/xymon-4.3.17.tar.gz

Nu kan du packa upp och bygga servern, det behöver du dock bara göra på ena servern eftersom du ju ska lägga filerna på en delad volym. Du kommer behöva besvara frågor från configureskriptet, kom i håg att  xyserver iäranvändaren som ska köra server och att installationskatalogen ska vara  /opt/xymon. När du får fråga om serverns ip-nummer ska du ange den delade ip-adressen du förberett och som du kommer konfigurera med Heartbeat senare :

tar xfv xymon-4.3.17.tar.gz
cd xymon-4.3.17
./configure.server
make && make install

Nu kan du kopiera konfen för apache till rätt ställe, det här behöver du göra på båda servrarna:

cp /opt/xymon/server/etc/xymon-apache.conf /etc/httpd/conf.d/

 

Kör:

vi /etc/init.d/xyserver

och klistra in detta

#!/bin/bash
#
# chkconfig: - 80 20
# description: Xymon is a network monitoring tool that can monitor hosts \
#               and services and shows monitor status via a webpage.
#
# processname: xyserver
#
### BEGIN INIT INFO
# Provides: xyserver
# Default-Start:
# Default-Stop: 0 1 2 3 4 5 6
# Required-Start: $local_fs $network
# Required-Stop: $local_fs $network
# Short-Description: start and stop xymon
# Description: Xymon is a network monitoring tool that can monitor hosts
#              and services and shows monitor status via a webpage.
### END INIT INFO
USER=xyserver
SCRIPT=/opt/xymon/server/xymon.sh
function call_script {
	su - $USER -c "$SCRIPT $1"
}
case "$1" in
	"start")
		call_script $1
		;;
	"stop")
		call_script $1
		;;
	"restart")
		call_script $1
		;;
	"reload")
		call_script $1
		;;
	"status")
		call_script $1
		;;
	"rotate")
		call_script $1
		;;
	*)
        echo "Usage: $0 start|stop|restart|reload|status|rotate"
        ;;
esac

Kör sedan:

chmod +x /etc/init.d/xyserver

I filerna /opt/xymon/server/xymon.sh och /opt/xymon/server/etc/tasks.cfg måste du nu ändra så att sökvägen till alla pid-filer ändras till  /var/run/xyserver, det funkar inge bra att ha dem på den delade volymen.

Nu kan du sätta upp Heartbeat så att du får en delad ip-adress att köra Xymonservern på. Instruktioner för att sätt upp Heartbeat kan du hitta här: http://www.howtoforge.com/high_availability_heartbeat_centos. Följ instruktionerna och sätt upp den delade ip-adressen, glöm inte att lägga till både httpd och xyserver som resurser i ditt kluster.

Klart!

Nu kan du faila över din Xymoninstallation mellan noderna och alltid ha din övervakningsserver tillgänglig.

 

Jag har tidigare gått igenom hur man sätter upp ett replikerat filsystem med GlusterFS och även noterat hur man gör för att lägga till och ta bort servrar ur konfigurationen.

Hur gör man då när man har ett klustrat filsystem, men inte vill att kreti och pleti skall kunna ansluta till det? Jo, fär att hindra att andra servrar går med i klustert gör man så här på en av de ingående klusternoderna:

gluster volume set replvolume auth.allow 10.0.0.100,10.0.0.101,10.0.0.102

Om man även vill hindra klienter från att ansluta utan tillåtelse måste man använda en brandvägg så som iptables. Varje brick får sin egen port, så det är ganksa enkelt att fixa. Kolla först vilken port din brick använder:

[root@glustersrv1 ~]# gluster volume status replvolume
Status of volume: replvolume
Gluster process                                         Port    Online  Pid
------------------------------------------------------------------------------
Brick glustersrv1:/export/sdb1/brick                  49152   Y       3218
Brick glustersrv3:/export/sdb1/brick                  49152   Y       4387
NFS Server on localhost                                 2049    Y       23745
Self-heal Daemon on localhost                           N/A     Y       23752
NFS Server on glustersrv3                             2049    Y       4659
Self-heal Daemon on glustersrv3                       N/A     Y       4667

Här ovan är det alltså 49152 som används, så börja med att tillåta dina legitima klienter: (i det här fallet 10.0.0.200 och 10.0.0.201):

iptables -A INPUT -p tcp --dport 49152 -s 10.0.0.200  -j ACCEPT
iptables -A INPUT -p tcp --dport 49152 -s 10.0.0.201  -j ACCEPT

När det är klart kan du börja blocka:

iptables -A INPUT -p tcp --dport 49152 -s 10.0.0.0/24  -j REJECT

Du behöver göra det här på alla ingående servrar.

« Older entries

Switch to our mobile site

Page optimized by WP Minify WordPress Plugin