I have been using TimeSheetNG for years to record the working time for myself, so that I can keep track on where my time is going, and who I can charge for which hours 🙂

I am using version 1.5.2 of TimeSheetNG, with some small modifications to make it easier for me to enter the minutes of an hour.

My instance is running on a Hostsharing server, which was just upgraded to Debian Jessie. This meant that I got a php warning, that mysql_connect is deprecated, and I should be using mysqli instead:

Deprecated: mysql_pconnect(): The mysql extension is deprecated and will be removed in the future: use mysqli or PDO instead in .../mysql.db.inc on line 10

So here is the patch that I applied to my TimeSheetNG 1.5.2, it should work for 1.5.3 as well:

https://gist.github.com/tpokorra/3b3f5ba2cdeaa7cb31e8888e65c017dd

 

 

Tags: , ,
Posted in Hosting, Software Development | Comments Closed

Hostsharing und Let’s encrypt   December 4th, 2015

Noch geht es nicht, bei Hostsharing automatisiert Let’s Encrypt Zertifikate anzulegen. Aber es kommt bald…

Jedoch kann ich heute schon mit Hilfe des 200 Zeilen Python Skriptes ACME-tiny in der Hostsharing Umgebung ein SSL Zertifikat erzeugen und mit LetsEncrypt erzeugen lassen.

Achtung: Bitte nur durchfĂĽhren, wenn Du das ACME-tiny Skript verstehst! Es greift auf deinen privaten SchlĂĽssel zu.

Hier die Schritte innerhalb eines Hostsharing Paketes:

Einmalig auszufĂĽhren:

mkdir ~/letsencrypt
cd ~/letsencrypt
openssl genrsa 4096 > account.key
# read and understand https://github.com/diafygi/acme-tiny
wget https://raw.githubusercontent.com/diafygi/acme-tiny/master/acme_tiny.py

Zum Erzeugen und Signieren der Zertifikate fĂĽr eine Domain meinedomain.de, und gegebenenfalls von weiteren Subdomains, z.b. www:

Zuerst muss eine Konfigurationsdatei erstellt werden, mit dem Namen ~/letsencrypt/ssl.cnf. Sie kann so aussehen:

[req]
req_extensions = v3_req
distinguished_name = req_distinguished_name
prompt = no
 
[req_distinguished_name]
CN = www.meinedomain.de
 
[ v3_req ]
 
# Extensions to add to a certificate request
 
keyUsage = keyEncipherment, dataEncipherment
subjectAltName = @alt_names
 
[alt_names]
DNS.1 = meinedomain.de
DNS.2 = www.meinedomain.de

Dann sind folgende Befehle auszufĂĽhren:

domain=meinedomain.de
 
cd ~/letsencrypt
openssl genrsa 4096 > $domain.key
openssl req -new -sha256 -key $domain.key -config ssl.cnf > $domain.csr
domaindir=~/doms/$domain
challengedir=$domaindir/htdocs/.well-known/acme-challenge/
mkdir -p $challengedir
for subdomain in www
do
  cd $domaindir/subs/$subdomain && ln -s ../../htdocs/.well-known && cd -
  if [ -f $domaindir/subs/$subdomain/.htaccess ]
  then
    sed -i "s/^Redirect/#letsencrypt Redirect/g" $domaindir/subs/$subdomain/.htaccess
  fi
done
if [ -f $domaindir/htdocs/.htaccess ]
then
  sed -i "s/^Redirect/#letsencrypt Redirect/g" $domaindir/htdocs/.htaccess
fi
python acme_tiny.py --account-key ./account.key --csr ./$domain.csr --acme-dir $challengedir > ./$domain.crt
for subdomain in www
do
  rm -f $domaindir/subs/$subdomain/.well-known
  if [ -f $domaindir/subs/$subdomain/.htaccess ]
  then
    sed -i "s/^#letsencrypt Redirect/Redirect/g" $domaindir/subs/$subdomain/.htaccess
  fi
done
if [ -f $domaindir/htdocs/.htaccess ]
then
  sed -i "s/^#letsencrypt Redirect/Redirect/g" $domaindir/htdocs/.htaccess
fi
rm -Rf $challengedir
wget -O - https://letsencrypt.org/certs/lets-encrypt-x3-cross-signed.pem > ~/doms/$domain/etc/$domain.chain
cp $domain.key ~/doms/$domain/etc/$domain.key
cp $domain.crt ~/doms/$domain/etc/$domain.crt
ls -1 ~/doms/$domain/etc/*

Danach eine E-Mail an das Service Team von Hostsharing schicken, und um eine Einrichtung des Zertifikates bitten, mit Angabe wo die Zertifikats-Dateien gespeichert sind, und fĂĽr welche Domain das Zertifikat bestimmt ist.

Und eine Erinnerung im Kalender setzen, dass das Zertifikat in 3 Monaten erneuert werden muss! 🙂

Tags: , ,
Posted in Hosting | Comments Closed

Bisher konnte man bei Hostsharing pro Paket nur ein SSL Zertifikat verwenden. Das ging zumindest an meiner Realität vorbei, da ich innerhalb meines Paketes verschiedenste Domains hoste.

Seit diesem Wochenende gibt es jetzt die Möglichkeit, über SNI mehrere SSL Zertifikate innerhalb eines Paketes, und sogar innerhalb einer Domain, zu verwenden: Siehe auch Hostsharing führt Server Name Indication (SNI) ein

Als nächster Schritt wird die automatische Verlängerung von SSL Zertifikaten mit letsencrypt geplant…

Ich möchte hier kurz beschreiben, wie ich für verschiedene Subdomains unterschiedliche SSL Zertifikate einrichten kann.

Wie aus einer E-Mail auf der Technikliste von Hostsharing zu lesen ist, müssen Subdomains in der Adminoberfläche von Hostsharing (oder auf der Kommandozeile mit hsscript) als eigenständige Domain angelegt werden (doms/meinesub.meinedomain.de/), und können nicht nur als Unterverzeichnis der Hauptdomain (doms/meinedomain.de/subs/meinesub) existieren.

Erst dachte ich, ich müsste unbedingt mit www.meinesub.meinedomain.de arbeiten, bis ich auf die Tatsache stieß, dass ich im Verzeichnis doms/meinesub.meinedomain.de/htdocs-ssl die Datei .htaccess löschen kann, und stattdessen meine Anwendung dort in htdocs-ssl installieren kann. Dann ist die Anwendung unter https://meinesub.meinedomain.de erreichbar!

Solange Lets Encrypt noch nicht bei Hostsharing läuft, kann man sich bei StartSSL auch für Subdomains kostenlose Zertifikate holen. Entsprechend der Anleitung im Hostsharing Wiki die Datei https.pem bauen, und dann in doms/meinesub.meinedomain.de/etc schieben, ebenfalls die Datei sub.class1.server.ca.pem, und dann eine freundliche E-Mail an den Hostsharing Service mit der Bitte zur Einrichtung des Zertifikats schicken 🙂

Tags: , , ,
Posted in Hosting | Comments Closed

I am a member of Hostsharing eG, which is a German company owned by its members with the aim to take the idea of Open Source to Webhosting. You don’t need to worry about backups or availability, because the webmasters do it all for you. But you still have SSH access and many other powerful tools to manage your applications that are running on the server.

Recently I had to fight off an intruder who had used a security leak in one of my php applications. He had added 700 MB somewhere, the quota command showed it, but all calls of du did not show the files. Finally I realised I have to run find / -group pac00 which shows all files that belong to my own user or my subusers, who all belong to the group e.g. pac00.

Another issue that I often have is that some files are created with PHP and they belong to user httpd. That means they don’t show up at all on the quota command, which is not fair for the other users, because everyone has to pay for the used webspace.
The first step is to actually find those files. I have written the script pac-du-httpd, which goes through all the users’ directories and prints the filenames that are owned by httpd to a file, and also prints the overall sum size of those files. You can find the file here: pac-du-httpd.sh

The next step is to change the ownership of those files. On the support mailing list (yes, Hostsharing eG has as much open communication as any other Open Source project) there is a very useful explanation of how to delete such files:
Support Anleitung
The basic idea is: first run the script as normal PHP with user httpd, and change the file permissions so that everybody can change them, and then to run the script again, to delete the file.
In my situation though I don’t want to delete the file, but would like to change the permission. I finally got this solution to work:

# first run as php file with httpd, to give permissions (chmod 0666) then run with cgi to recopy the file

$dh = opendir('./');

while( ($file = (readdir($dh))) !== FALSE )
{
if ($_SERVER["ORIG_SCRIPT_NAME"] == '/cgi-bin/phpstub')
{
copy ($file, $file.".tmp");
unlink ($file);
copy ($file.".tmp", $file);
unlink ($file.".tmp");
}
else
{
chmod($file, 0666);
}
}
?>

I first run the script to change the file permissions, and then I run it again via CGI so that it runs for the user that the files should belong to. I make a copy of the file, delete the original, and rename the copy back. This works perfectly. And for the future, I will let the PHP always run via CGI (see also Hostsharing documentation on PHP via CGI)

Another useful tool is pac-du-quota, which is referenced from the Hostsharing Documentation on Webspace.
I have extended it to also list the size of the MySQL databases, which is in my case also quite a bit of data…
Insert this in the function collectSpace just before “#Wenn User exisiteren aufsammeln”:

# Mysql Datenbanken
for DB in /var/lib/mysql/${PAC}_*; do
let COUNTER=COUNTER+1
TEMP=`du -s "$DB"`
SPACE[$COUNTER]=`echo $TEMP | sed -e 's/\([^ ]*\).*/\1/g'`
NAME[$COUNTER]="Mysql_`basename $DB`"
done
Tags: , , ,
Posted in Software Development | Comments Closed