RRZE – Projekte & Prozesse (P&P)

Das Blog der RRZE Stabsstelle "Projekte & Prozesse"

Content

VV – was ist das?

English Version

Die Veranstaltungsverwaltung (VV) ist ein Modul der Online-Serviceplattform mein campus. Die Plattform dient Studenten und Prüfern der FAU zur Verwaltung von Prüfungen (An- und Abmeldung, Noteneingabe, Noteneinsicht, Transcript of Records) und bildet Bologna-konform die Studiengänge der Universität ab.
Bald nach der Einführung von mein campus wurde deutlich, dass analog zur Prüfungsverwaltung ein ähnliches Modul zur Verwaltung von Veranstaltungen nötig ist. Da ein solches nicht im Lieferumfang der Software existierte, wurde nach ausführlicher Analyse der Anforderungen und der bestehenden Anmeldungs-Insellösungen eine Eigenentwicklung in Angriff genommen.
Ziel war es, Dozenten einen Überblick über die Teilnehmer der Lehrveranstaltungen zu geben. Mit der VV werden Lehrangebote administriert sowie An- und Abmeldungen durchgeführt. Zudem ist eine einfache Kommunikation zwischen Lehrenden und Teilnehmern der Veranstaltung möglich.
Die Entscheidung, UnivIS als etabliertes zentrales Datensystem beizubehalten und Veranstaltungen von dort zu importieren wurde getroffen, um Dozenten die Mühe und fehlerträchtige Arbeit der mehrfachen Eingabe von Veranstaltungsdaten zu ersparen.
Die rege Nutzung des Moduls zeigt, dass in der Tat großer Bedarf an der durch die VV bereitgestellten Funktionalität bestand – ca. 10% aller Veranstaltungen nutzen die neuen Möglichkeiten.

VV – What is it?

The event management (VV) is a module of the online service platform mein campus. The platform is used by students and examiner of the FAU to manage exams (sign on and sign off, entry of grades, transript of records) and displays, conform to Bologna, the study courses of the university.

Soon after its intruduction of mein campus it became clear that analogue to the exam management a similar model for the management of events is needed.
Because software of this kind wasn’t included in the package, a self developed solution was tackled, after extensive analysis of the requirements and the existing isolated sign on application.

The aim was to give the professors an overview of the participants of their lectures. With VV the scope of lectures offered are administrated and sign on and sign off actions are made. Furthermore, an easy communication between lecturers and participants of the lecture is possible.

The decision to keep UnivIS as an established central data system and to import events from there was made to spare the professors further work and a source of errors whilst multiple entry of lecture data.

The active use of this module shows that there is indeed a big demand of the through VV supplied functionality after all – ca. 10% of all events use the new possibilities.

Abkündigung CIT2

English Version
Mit der Ankündigung des Ausscheidens von Herrn Buzek ist es ruhig um CIT2 geworden. Seine Entscheidung wurde unter anderem zum Anlass genommen, das Thema Campus Management kritisch zu überdenken. Inzwischen ist klar, dass die Universitätsleitung zeitnah eine strategische Neuausrichtung beschließen wird.
Der Entscheidung der UL möchte ich nicht vorgreifen, so viel ist aber bereits jetzt klar: CIT2 ist mit der bisherigen Ausrichtung nicht mehr mit der zukünftigen Campus Management Strategie vereinbar.

Daher wurde am 23.02.2011 beschlossen, das das organisatorische Projekt CIT2 aufzulösen und das bestehende Personal sowie die Projekte in die Stabsstelle “Projekte & Prozesse” am RRZE zu integrieren.
Der Betrieb der “mein campus” Plattform liegt bei der Gruppe “Campus IT (CIT)”, geleitet von Frau Andrea Grimm.
Die Stabsstelle wird von Herrn Dr. Peter Reiß als meinem Stellvertreter und mir geleitet.
Die Stabsstelle fungiert zukünftig als Software-Entwicklungsabteilung und wird die Gruppe CIT nach Kräften unterstützen.

Für die im Rahmen von CIT2 geplanten Module sind die Gespräche über Fortführung oder alternative Realisierung bereits angelaufen.
Für die gute und fruchtbare Zusammenarbeit bedanke ich mich bei Ihnen allen!
Ich bin mir sicher, dass wir im Zuge der einzelnen Entwicklungsprojekte wieder das Vergnügen haben werden, zusammen arbeiten zu können, worauf ich mich sehr freue.

Meine letzte Bitte geht in die Richtung der Studierenden: Ich würde mich freuen, wenn wir den Dialog aufrecht erhalten könnten. Über Vorschläge wie dies zu gestalten ist, bin ich sehr dankbar.

Announcement CIT2

 

With the announcement of Mr. Buzek leaving it has become quiet around CIT2. His decision became an occasion among others to critically rethink the topic of campus management. Meanwhile it is clear that the university administration soon will decide a stragetic redirection.
I don’t want to anticipate the decision of the university administration, but this is already clear: CIT2 is with the previous focusing not compatible with the upcoming Campus Management Strategy.

Therefore, on 23.02.2011 it has been decided that the organisational project CIT2 will be dissolved and the pesonnel aswell as the projects will be integrated to the staff unit “Projects & Processes” at the RRZE.
The maintenance of the “mein campus” platform is within the group  Gruppe “Campus IT (CIT)”, managed by Ms. Andrea Grimm. The staff unit is now managed by Mr. Dr. Peter Reiß as my substitute and me.

The staff unit will further function as a software development department and will support the group CIT by all means.

Discussions about continuances or alternative realisations for the in the frame of CIT2 planned modules are already in process.
Thank you all for a good and productive teamwork!

I am sure that due to the individual development projects we will have the pleasure to work together again, to which I am looking forward to.

My last request is tend towards the students: it would be a pleasure to keep up the dialogue. I’m very thankful about suggestions how to create this.

 

IP mit Hostnamen ergänzen

English Version

Beschreibung

Es ist schwierig IP-Adressen richtig zuordnen zu können. Erst durch eine Auflösung mit den Hostnamen werden sie verständlich. Aus diesem Grund sollen diese mit den entsprechenden Hostnamen ergänzt werden. Die am RRZE verwendeten Firewallregeln basieren auf IP-Adressen. Um diese leichter zu verstehen und somit bearbeiten zu können müssen sie in Hostnamen aufgelöst werden.
Händisch wäre diese Ergänzung sehr aufwendig. Daher sollte hierfür ein Skript geschrieben werden. Ich habe mich entschieden Perl zu verwenden, da diese Skriptsprache die gewünschte Funktionalität und Flexibilität bietet.

Benutzung

[bash] $ ./ipHostname.pl -i INPUTFILE -o OUTPUTFILE[/bash]

Beispiel

[bash]

$ ./ipHostname.pl -i ipinput.txt -o ipoutput.txt

dali.rrze.uni-erlangen.de/131.188.84.???
web.de/213.165.64.???
mordor.rrze.uni-erlangen.de/131.188.12.???

Hosts saved to file: ipoutput.txt

[/bash]

Das letzte Oktett der IPs wurden aus Sicherheitsgründen zensiert.

Quellcode

[perl]
#!/usr/bin/perl
#
# Inputs IP address from log file and outputs
# host name to screen and file.
#
# Typical usage: ./ipHostname.pl -i inputfile -o outputfile [-s]
#

use Getopt::Long;
use strict;
use warnings;

my $outputfile = 0;
my $inputfile = 0;
my $silent = 0;
my $counter = 0;

#Sind die Optionen, welche Ausgewählt werden könen/müssen
GetOptions (
“o=s” => \$outputfile,
“output=s” => \$outputfile,
“i=s” => \$inputfile,
“input=s” => \$inputfile,
“s|silent” => \&silent,
“h|help|?” => \&syntax);

#Wenn Inputfile oder Outputfile nicht angegeben sind soll die Syntax ausgegeben werden, da beide Parameter Pflichtfelder sind
if ((!$inputfile ) || (!$outputfile )) {
&syntax;
}

#Die Variable $silent wird hier so gesetzt, dass es keine Ausgabe auf der Konsole gibt
sub silent {
$silent = 1;
}

#Hier werden In- und Outputfile geöffnet
open(IP, $inputfile) || warn “Can’t open input $inputfile: $!\n”;
open(HOST, “>$outputfile”) || warn “Can’t open output $outputfile: $!\n”;

print “\n” if !$silent;

#Datei wird zum gesplittet um sie richtig verarbeiten zu können
while() {
my @foo = split(/ /,$_);
my @ip = grep(/\d+\.\d+\.\d+\.\d+/,@foo);
my $ip = $ip[0];
#IPs werden gesplittet und mit gethostbyaddr gecheckt. Anschliessend folgt nur die Ausgabe.
if ($ip) {
my @numbers = split(/\./, $ip);
my $ip_number = pack(“C4”, @numbers);
my ($name) = (gethostbyaddr($ip_number, 2))[0];
if ($name) {
print “$name/$ip\n” if !$silent;
print HOST “$name/@foo”;
} else {
print “This IP has no name: $ip\n” if !$silent;
print HOST “(no host name)/@foo”;
}
}else {
print HOST “@foo”;
}
}
if ($outputfile && !$silent) {
print “\nHosts saved to file: $outputfile\n\n”;
}
close IP;
close HOST;

#Hilfe
sub syntax {

if ($counter == 0) {
print “\nipHostname.pl \n
Usage: ./ipHostname.pl -i inputfile -o outputfile [options]
-i Path to Inputfile
-o Path to Outputfile
-h –help Print this Help
-s Silence
-silent Silence
\n”;
++$counter;
}
}
exit;
[/perl]

IP Supplement with Hostname

Description

It is difficult to assign IP-adresses correctly. Only by breaking up through the hostname they become understandable. Because of this reason the hostname should be added to these. The firewall rules, used at the RRZE, are based on IP-adresses. To make this process easier to understand and therefore easier to work with the hostnames need to be broken up.
These supplements are very time consuming if you do this per hand. Therefore a skript is needed. I decided to use Perl, because this script language offers the needed functionality and flexability.

Usage

[bash] $ ./ipHostname.pl -i INPUTFILE -o OUTPUTFILE[/bash]

Example

[bash]

$ ./ipHostname.pl -i ipinput.txt -o ipoutput.txt

dali.rrze.uni-erlangen.de/131.188.84.???
web.de/213.165.64.???
mordor.rrze.uni-erlangen.de/131.188.12.???

Hosts saved to file: ipoutput.txt

[/bash]

The last octet of the IPs has been cencored because of safety issues.

Source Code

[perl]
#!/usr/bin/perl
#
# Inputs IP address from log file and outputs
# host name to screen and file.
#
# Typical usage: ./ipHostname.pl -i inputfile -o outputfile [-s]
#

use Getopt::Long;
use strict;
use warnings;

my $outputfile = 0;
my $inputfile = 0;
my $silent = 0;
my $counter = 0;

#Sind die Optionen, welche Ausgewählt werden könen/müssen
GetOptions (
“o=s” => \$outputfile,
“output=s” => \$outputfile,
“i=s” => \$inputfile,
“input=s” => \$inputfile,
“s|silent” => \&silent,
“h|help|?” => \&syntax);

#Wenn Inputfile oder Outputfile nicht angegeben sind soll die Syntax ausgegeben werden, da beide Parameter Pflichtfelder sind
if ((!$inputfile ) || (!$outputfile )) {
&syntax;
}

#Die Variable $silent wird hier so gesetzt, dass es keine Ausgabe auf der Konsole gibt
sub silent {
$silent = 1;
}

#Hier werden In- und Outputfile geöffnet
open(IP, $inputfile) || warn “Can’t open input $inputfile: $!\n”;
open(HOST, “>$outputfile”) || warn “Can’t open output $outputfile: $!\n”;

print “\n” if !$silent;

#Datei wird zum gesplittet um sie richtig verarbeiten zu können
while() {
my @foo = split(/ /,$_);
my @ip = grep(/\d+\.\d+\.\d+\.\d+/,@foo);
my $ip = $ip[0];
#IPs werden gesplittet und mit gethostbyaddr gecheckt. Anschliessend folgt nur die Ausgabe.
if ($ip) {
my @numbers = split(/\./, $ip);
my $ip_number = pack(“C4”, @numbers);
my ($name) = (gethostbyaddr($ip_number, 2))[0];
if ($name) {
print “$name/$ip\n” if !$silent;
print HOST “$name/@foo”;
} else {
print “This IP has no name: $ip\n” if !$silent;
print HOST “(no host name)/@foo”;
}
}else {
print HOST “@foo”;
}
}
if ($outputfile && !$silent) {
print “\nHosts saved to file: $outputfile\n\n”;
}
close IP;
close HOST;

#Hilfe
sub syntax {

if ($counter == 0) {
print “\nipHostname.pl \n
Usage: ./ipHostname.pl -i inputfile -o outputfile [options]
-i Path to Inputfile
-o Path to Outputfile
-h –help Print this Help
-s Silence
-silent Silence
\n”;
++$counter;
}
}
exit;
[/perl]

Promovierendenverwaltung wird selbständig

English Version

Mit Version 5.1 von mein campus wird die Promovierendenverwaltung der Graduiertenschule der Friedrich-Alexander-Universität auf einen eigenen Internet-Auftritt ausgegliedert. Sie ist seit Mittwoch, 17.11. unter der URL https://www.docdaten.uni-erlangen.de zu erreichen.

Unter dieser Adresse können Promotionen registriert werden, registrierte und freigeschaltete Promovenden haben Einsicht in ihre Daten (Benutzername und Passwort bleiben hier unverändert). Zugleich mit der Ausgliederung hat sich auch der Funktionsumfang erweitert:

Neue Features bei der Registrierung von Promotionen:

  • Datenübernahme aus mein campus für (ehemalige) Studierende der FAU ist möglich!Nach Eingabe von Benutzername und Passwort werden persönliche Daten sowie sowie Informationen über Studiengang und -abschluss aus mein campus ausgelesen und in das Registrierungsformular übertragen.
  • Die Registrierung kann zwischengespeichert werden, woraufhin ein Link per E-Mail zugesandt wird, unter dem sie innerhalb zwei Wochen fortgesetzt werden kann. Nach zwei Wochen werden nicht vollständige Registrierungen gelöscht, um Datenmüll zu vermeiden.

Neue Features bei Dateneinsicht:

  • Eine PDF-Ansicht der Daten kann erzeugt und heruntergeladen werden.

Zudem gibt es einige neue Funktionen für die Administratoren des Systems

Wir wünschen viel Spaß mit Docdaten!

PhD Administration becomes independent

With version 5.1 of mein campus the PhD administration of the grad school of the Friedrich-Alexander-Universität will be removed to its own internet appearance. You can reach it since Wednesday, 17.11. under the URL  https://www.docdaten.uni-erlangen.de  .

Under this adress PhD-students can be registered, already registered and activated PhD-students can view their data (username and password remain unchanged here). At the same time with the new appearance the functional range has expanded:

New features at the registration of PhD-students:

  • Data transfer from mein campus for (former) students of the FAU is possible! After inserting username and password, personal data as well as information on the study course and degree can be read from mein campus and be transfered into the register form.
  • The registration process can be saved within, whereupon a link is sent vie e-mail under which the process can be continued within two weeks. After two weeks uncomplete registrations will be deleted to avoid data trash.

New features for data overview:

  • A PDF overview of data can be generated and downloaded.

Further there are some new functions for the admins of the systems.

We hope you have a lot of fun with Docdaten!

Queries über mehrere Datenbanken in PostgreSQL

English Version

Einleitung

Manchmal muss man Daten aus mehreren Datenbanken miteinander vergleichen, importieren oder aktualisieren. Wenn nicht gerade umständlich ein Programm mit mehreren Datenquellen geschrieben werden soll, bleiben einem nur die Tools der Datenbank selbst. Im Fall von PostgreSQL sind das das Kommandozeilen-Interface psql oder die GUI pgAdmin. Beide sind jedoch nicht in der Lage Abfragen über mehrere Datenbanken abzusetzen. Das liegt schlicht daran, dass beim Verbinden zu einer Datenbank dessen spezifischen Systemkataloge geladen werden und Postgres anscheinend nicht in der Lage ist mehrere dieser Art gleichzeitig zu verwalten. Es gibt allerdings einen Ausweg: dblink. Dabei handelt es sich um eine SQL-Bilbiothek, die mit Postgres ausgeliefert wird und per Datenbank installiert werden kann. Mit Hilfe dieser Bibliothek ist es möglich, Daten aus einer anderen Datenbank abzufragen und andere SQL-Statements zu dieser abzusetzen.

Installation

Die Installation von dblink ist einfach: die Bibliothek liegt im contrib-Ordner der PostgreSQL Installation und wird so in eine Datenbank installiert:

psql -U postgres -d -f `pg_config --sharedir`/contrib/dblink.sql

Das Installieren unter dem Benutzer postgres ist empfehlenswert, da hierbei alle Berechtigungen für etwaige zusätzliche Installationen vorhanden sind. Durch `pg_config --sharedir` findet die Shell das Share-Verzeichnis, in dem der contrib-Ordner liegt. Man sollte sich nur immer im Hinterkopf behalten, dass die Bibliotheken des contrib-Ordners per Datenbank installiert werden (und damit auch Teil eines vollständigen dump sind).

Verwendung

Für Abfragen aus anderen Datenbank muss die dblink-Funktion verwendet werden. Diese wird einfach in der FROM-Clause verwendet:

Select * From dblink('dbname=fauorgdb', 'select id, fauorgpath from orgunit') as t1(id bigint, fauorgpath text);
-- Beispiel auf anderer Postgres Instanz:
Select * From dblink('hostaddr=dbsrv42 dbname=fauorgdb user=fauorg password=drowssap', 'select id, fauorgpath from orgunit') as t1(id bigint, fauorgpath text);

Der erste Parameter der dblink-Funktion definiert die Datenbankverbindung (in diesem Fall lediglich den Datenbanknamen), der zweite Parameter enthält die Anfrage. Der Alias-Teil der FROM-Clause t1(id bigint, fauorgpath text) muss leider verwendet werden, weil Postgres das Schema der abgefragten Daten nicht kennt und sonst schimpft. Eine as-Deklaration ist zwar SQL-Standard, jedoch ist die Definition der Feldtypen eine Postgres-Erweiterung. Da die Verwendung von Abfragen auf einer anderen Datenbank jedoch nicht zur alltäglichen Arbeit gehört, empfiehlt sich die Definition von Views:

create or replace view provisionierte_daten as
select * from dblink('dbname=fauorgdb', 'select id from orgunit') as t1(id bigint);

Die View wird einmal definiert und fertig. Damit lassen sich dann Abfragen der folgenden Art definieren:

select * from provisionierte_daten
except
select "FAUORGId" from "IMP_FAUORG";

Das ist sehr nützlich, um zu prüfen, ob zwei Datenbanken den gleichen Datenbestand haben.

Ultraschnieker Anwendungsfall: selektives Replizieren ODER ‘PostgrESB’ (FT)

Die Kombination aus sehr mächtigem Regelsystem und der Fähigkeit auf entfernten Datenbanken DML-Statements abzusetzen, ermöglicht (selektives) Replizieren von Daten. Hierbei geht es darum eine gesamte Datenbank (oder Teile davon) auf eine andere Datenbank zu replizieren. Alles was man dafür tun muss, ist

  1. das gesamte oder partielle Schema der primären Datenbank auf einer sekundären Datenbank zu installieren
  2. für alle Tabllen und DML-Operationen (INSERT, UPDATE, DELETE) eine Regel wie folgt zu erstellen:
    CREATE OR REPLACE RULE replic_insert AS
      ON INSERT TO  DO 
        SELECT dblink_exec(
          'dbname=test', 
          'insert into  (id, name) values (' || quote_literal(new.id) || ',' || quote_literal(new.name) || ');
        );
    

Das Beispiel funktioniert für eine Tabelle mit den Feldern id und name. Leider muss das Statement recht kompliziert aufgebaut werden, da die sekundäre Tabelle mit den Pseudonamen NEW und OLD nichts anfangen kann. Wird die Regel darüberhinaus mit einer WHERE-Bedingung definiert, lässt sich die Replikation selektiv einschränken. Des Weiteren muss das Schema nicht notwendigerweise gleich sein, da auch heterogene Datenbanken mit Daten versorgt werden können – vorausgesetzt man kennt das Schema und kann die Regel dementsprechend definieren. Anders ausgedrückt ist also nicht nur die Replikation einer Datenbank möglich, sondern vielmehr die Provisionierung eines Teils des Datenbestands in eine andere PostgreSQL Instanz (um den Kreis zum Titel dieses Abschnitts abzuschließen).

Probleme

Probleme bei der Verwendung traten bei mir lediglich mit Passwörtern auf. Die ‘Fremddatenbank’ benötigt ja ebenfalls Authentifizierung. In meinen Tests wurden lediglich Datenbanken auf derselben lokalen Postgres-Instanz abgefragt und ich habe den lokalen Zugriff in der pg_hba.conf auf trust gesetzt:

# TYPE  DATABASE    USER        CIDR-ADDRESS          METHOD
host    all         all         127.0.0.1/32          trust

Eine andere Möglichkeit besteht in der Verwendung der Passwortdatei.

Links

Querying multiple databases in PostgreSQL

Introduction

It is sometimes necessary to compare, import or update data from several databases. Unless you want to write a cumbersome program with several data sources, you are stuck with the database tools themselves. In PostgreSQL’s case, that is the command line interface psql or the GUI pgAdmin. Both of them are unable to process queries for several databases at once. The reason for this is simply that, upon connection to a database, its specific system catalogues are loaded, and Postgres seems unable to manage several of these at once. There is however, a way around this: dblink. This is an SQL library shipped with Postgres that can be installed via database. With this library, it is possible to query data from other databases and make SQL statements for these.

Installation

Installing dblink is easy: The library can be found in the PostgreSQL installation’s contrib folder. You can install it like this:

psql -U postgres -d -f `pg_config --sharedir`/contrib/dblink.sql

It is advisable to install as user postgres, as that gives you all the permissions necessary for possible additional installations. With `pg_config --sharedir`, the Shell finds the share directory that contains the contrib folder. Just keep in mind that the libraries within the contrib folder are installed via database (and are thus part of a complete dump).

Usage

For queries from other databases, you have to use the dblink function. You can use it with a simple FROM clause:

Select * From dblink('dbname=fauorgdb', 'select id, fauorgpath from orgunit') as t1(id bigint, fauorgpath text);
-- Example from another Postgres Instance:
Select * From dblink('hostaddr=dbsrv42 dbname=fauorgdb user=fauorg password=drowssap', 'select id, fauorgpath from orgunit') as t1(id bigint, fauorgpath text);

The dblink functions’s first parameter defines the database connection (in this case, the database name). The second parameter contains the query. The FROM clause’s alias part t1(id bigint, fauorgpath text) must be used because Postgres doesn’t know the queried data’s schema and starts whining otherwise. Although an as declaration would be SQL standard, definition of field types is part of the Postgres expansion. Since the use of queries in another database is probably not part of your everyday work, it is advisable to define Views:

create or replace view provisionierte_daten as
select * from dblink('dbname=fauorgdb', 'select id from orgunit') as t1(id bigint);

You only have to define the View once, and you are done. With this you can then use queries of the following kind:

select * from provisionierte_daten
except
select "FAUORGId" from "IMP_FAUORG";

This is very useful for checking if two databases have the same dataset.

Application deluxe: selective replicaion OR ‘PostgrESB’ (FT)

The combination of a very powerful set of rules and the possibility to put statements into remote databases, allows the selective replication of data. This means replicating a complete database (or parts thereof) into another database. All you have to do for this is

  1. installing the primary database’s complete or partial schema on the secondary database.
  2. create a rule for all tables and DML operations (INSERT, UPDATE, DELETE) as follows:
    CREATE OR REPLACE RULE replic_insert AS
      ON INSERT TO  DO 
        SELECT dblink_exec(
          'dbname=test', 
          'insert into  (id, name) values (' || quote_literal(new.id) || ',' || quote_literal(new.name) || ');
        );
    

The example works with a table containing the fields id and name. The statement needs to be rather complicated, as the secondary table cannot interprete the pseudo names NEW and OLD. If the rule is futher defined with a WHERE clause, the replication can be made very selective. In addition, the schemata don’t need to be identical, as you can also provide heterogenical databases with data – if you know the schema and can define your rule accordingly. In other words, this allows not only replication of a database, but also provisioning part of your dataset into another PostgreSQL instance.

Problems

The only problems I found were with passwords. The ‘foreign database’ needs authentication as well. In my tests, I only queried local databases within the same Postgres instance, and set the local access in pg_hba.conf to trust:

# TYPE  DATABASE    USER        CIDR-ADDRESS          METHOD
host    all         all         127.0.0.1/32          trust

Another possibility is the use of a password file.

Links

Rekonstruktion von Dateisystemrechten in Linux

English Version

Ein Linux tut immer was man ihm sagt. Und wenn es erstmal fertig ist, gibt’s kein zurück. Das ist in den meisten Fällen keine schlechte Sache, denn man ist sich ja eigentlich immer sicher, dass man dies und das wirklich tun möchte 😉 Hin und wieder kann es jedoch vorkommen, dass einem Fehler unterlaufen und ein ‘Rückgängig’ ist nirgends zu finden. Um so einen Fall geht es nun hier. Ich wollte lediglich einem Verzeichnis und dessen Unterverzeichnissen Rechte auf alles (Lesen, Schreiben und Ausführen) geben.

chmod -R a+rwx DIR

Im ersten Versuch wurde ich noch nett gewarnt, dass das nicht ginge, weil mir das Verzeichnis nicht gehört. Kein Problem, da gibts ja noch den Superuser Account. Angemeldet, Befehl nochmals ausgeführt und zu spät bemerkt, dass sich das Terminal nach der Anmeldung als root im Wurzelverzeichnis / befand. Richtig dumm gelaufen. Jetzt können alle Benutzer Dinge lesen, schreiben und ausführen, auf die sie keinen Zugriff haben sollen. Rückgängig machen kann man das auch nicht. Also was tun? Eine Linux-Konsole ist ja bekanntlich das Schweizer Taschenmesser unter den Terminals, daher gibts bestimmt eine Möglichkeit. Dem ist auch so in Form von getfacl und setfacl. Alles was man noch tun muss, ist einen Rechner zu finden, der einigermaßen die gleiche Distribution und eine möglichst große Menge an gleich installierter Software besitzt. Danach meldet man sich am gesunden System an und sichert die Rechte auf die zu reparierenden Verzeichnisse:

getfacl -R DIR > /tmp/DIR.acl

Die DIR.acl enthält dann die ‘normalen’ Zugriffsrechte des Verzeichnisses ‘DIR’. Diese Datei muss dann aufs zu repariendene System übertragen werden. Dann dort anmelden und per

setfacl --restore=/tmp/DIR.acl

die Rechte in DIR rekonstruieren. Fehlende Dateien und Verzeichnisse werden natürlich ignoriert. Fertig. Alles wieder gut.

Reconstructing Data access rights in Linux

Linux always does as it’s told. And when it’s done, it’s done. Normally, that’s not a bad thing, after all, you know what you’re doing, don’t you? Every now and then, however, it might happen that you make a mistake, and there’s no ?Undo? Button in sight. That is what this article is about. Originally, all I wanted to do is grant access rights (read, write, execute) to one directory and all its subdirectories.

chmod -R a+rwx DIR

When I first tried this, I was warned that I couldn’t do it because the directory wasn’t mine. No problem, there’s still the Superuser Account. Logged in, executed the command and then realized too late that the the terminal was in the root directory after logging on as root. Tough luck. Now every user can read, write and execute whatever he wants. And there’s no way to undo it either. So what now? A linux console is, as is well known, the swiss army knife of terminals, so surely there’s a way to do it. And of course there is: getfacl and setfacl. All that is left to do is find a computer with roughly the same distribution and as much of the same software as possible. Log onto the ?healthy? system, save the rights for the directories in question:

getfacl -R DIR > /tmp/DIR.acl

DIR.acl now contains the ?normal? access rights for the directory ?DIR?. This file can be transferred to the system that needs repairing. Now log in there and use

setfacl --restore=/tmp/DIR.acl

to reconstruct the rights in DIR. Missing files and directories will be ignored, of course. And all is well again.

Das P&P-Blog ist da!

Fast anderthalb Jahre nach der Gründung der Stabsstelle P&P im Februar 2007 ist es an der Zeit regelmäßig und öffentlich über deren Arbeite zu berichten.

An dieser Stelle wird laufend über die alltägliche Arbeit oder Kuriose Randerscheinungen berichtet werden.

Viel Spass beim Lesen und Kommentieren!
Und als besonderes Schmankerl werden wir bemüht sein, die Artikel Deutsch und Englisch zu verfassen, so translation follows …

The P&P-Blog opens

Nearly one and a half year after founding staff unit P&P in February 2007 the time has come to report regularly and publicly about what we are doing.

Here we will report continuously about our day-to-day work and oddities in our work life.

Happy reading and Commenting!
And as special incentive for the European community we will try to publish all articles in German and English. So keep on reading!