git-hook zum Push-Backup

Ich liebe git-hooks. Damit kann man von kleinen Tätigkeiten bis zum großen Rollout alles machen. Hier mal etwas kleines:

Wenn ich auf meiner Entwicklungs-Box einen commit mache, möchte ich das es sofort auf eine Backup-Box gepusht wird. Einfach nur den aktuellen Branch auf dem ich mich befinde auf einen Server unter dem gleichen Branchnamen. Dafür legt man unter .git/hooks/ das File post-commit an. Der Inhalt sieht in diesem Fall so aus:

   git push backupbox $(git rev-parse --abbrev-ref HEAD)

Dann ein chmod +x .git/hooks/post-commit nicht vergessen und anfangen zu commiten. Läuft...

Als git den ganzen Raspi Speicher frass

Ich experimentiere gerade rum um einen Raspberry Pi zu einer kleinen Jenkins-Testbox umzubauen. Ich weiß ich weiß... der Raspi ist nicht gerade eine Powermaschine. Trotzdem ist es ein Projekt in das ich gerade viel Zeit stecke. Plan ist es auf dem Raspi alle meine git-Repos zu haben und bei commits dann die Tests auszuführen. Gerade versuche ich per Jenkins ein MySQL Backup über git einzuspielen. Der Dump ist ganze unglaubliche 10 MB groß. Dies scheint zu reichen um git an seine Grenzen auf dem Raspi zu zeigen. Das ganze spiegelte sich in dieser Fehlermeldung wieder:

remote: Counting objects: 666, done.
remote: warning: suboptimal pack - out of memory
remote: fatal: Out of memory, malloc failed

Ich konnte es beseitigen in dem ich in dem Remote-Repo folgendes machte:

git config pack.windowMemory 10m
git config pack.packSizeLimit 20m

SSH nur mit git und rsync

Es ist mal wieder soweit: Sein ganzes Backup-Gedöns überdenken und versuchen es ein wenig anzupassen. Es gibt da einen kleinen vServer denn ich seit neustem administrieren soll. Keine Backups... war ja klar. Also was nimmt man da nun? Ich benutze seit Jahren ein zusammengefrickeltes Shell-Script mit dem Namen "DoTheBackup". Seit ein paar Monaten habe ich versucht es mit Python in was Besseres zu gießen. Rausgekommen ist dies hier. Bis jetzt setze ich da voll auf rsync und git. Und wenn man den Remote-Host auf den man die Backups schieben möchte ein wenig einschränken möchte, und zwar auf genau diese beiden Kommandos, war das für mich nicht so einfach. Es gibt da viele Möglichkeiten. Vor allem kann man seine /home/backupuser/.ssh/authorized_keys auf ein Kommando begrenzen. Man nutzt dafür commando="rsync foo bar" vor dem Publickey. Wie gesagt: Ein Kommando. Nun kann man sich ein Wrapper-Script bauen. Habe ich versucht und bin an git gescheitert. Viel und lange gegoogelt und kaum etwas gefunden. Bis auf diese Dokumentation von git selber. git-shell hatte ich erstmal aussenvor gelassen weil ich bis jetzt dachte es beschränkt sich ganz auf git. Falsch!

Den Shell des Backupusers auf git-shell setzen.

In [ ]:
%%bash
sudo chsh -s $(which git-shell) backupuser

Man legt das Verzeichnis git-shell-commands in das Homeverzeichnis des Backup-Users.

In [ ]:
%%bash 
mkdir /home/backupuser/git-shell-commands

Nun kann man Symlinks in dieses Verzeichnis legen mit den Kommandos die der Backup-User über SSH ausführen darf.

In [ ]:
%%bash
cd /home/backupuser/git-shell-commands
ln -s $(which rsync) rsync

Und zack feddich...

GIT History für ein File

Ich setze auf allen Servern die ich administriere etckeeper ein. Super leicht eingerichtet und schon hat sind alle veränderungen in /etc schön in einem git-Repo gepflegt. Nun hatte ich gerade den Fall das ich mir nur die Veränderungen an einem bestimmten File anschauen wollte. Da ich mir sowas gerne notiere und vielleicht dadurch auch jemanden weiterhelfen kann poste ich es hier.

Hier als Beispiel mal mit meiner pelicanconf.py:

In [1]:
!git log -p ../../pelicanconf.py
commit bfbe310a026bbfa9307aa89f1d2209ea64969b5a
Author: Marvin Steadfast <marvin@xsteadfastx.org>
Date:   Tue Nov 18 16:10:56 2014 +0100

    made the blog ipython ready

diff --git a/pelicanconf.py b/pelicanconf.py
index 2b20560..ec9fc31 100644
--- a/pelicanconf.py
+++ b/pelicanconf.py
@@ -61,8 +61,10 @@ ARTICLE_SAVE_AS = 'posts/{date:%Y}/{date:%m}/{slug}/index.html'
 
 # plugins
 PLUGIN_PATHS = ['pelican-plugins']
-PLUGINS = ['liquid_tags.youtube']
+PLUGINS = ['liquid_tags.youtube', 'liquid_tags.notebook']
 
 #CODE_DIR = 'code'
-#NOTEBOOK_DIR = 'notebooks'
-#EXTRA_HEADER = open('_nb_header.html').read().decode('utf-8')
+NOTEBOOK_DIR = 'notebooks'
+EXTRA_HEADER = open('_nb_header.html').read()
+
+LOAD_CONTENT_CACHE = False

commit 777d91280badc22d566cf2a3f59bb39e92d9aea0
Author: Marvin Steadfast <marvin@xsteadfastx.org>
Date:   Wed Nov 5 16:49:15 2014 +0100

    plugins and a new article

diff --git a/pelicanconf.py b/pelicanconf.py
index f3c2735..2b20560 100644
--- a/pelicanconf.py
+++ b/pelicanconf.py
@@ -60,9 +60,8 @@ ARTICLE_URL = 'posts/{date:%Y}/{date:%m}/{slug}/'
 ARTICLE_SAVE_AS = 'posts/{date:%Y}/{date:%m}/{slug}/index.html'
 
 # plugins
-#PLUGIN_PATH = '../pelican-plugins'
-#PLUGINS = ['liquid_tags.notebook', 'liquid_tags.include_code',
-#           'liquid_tags.img', 'liquid_tags.video']
+PLUGIN_PATHS = ['pelican-plugins']
+PLUGINS = ['liquid_tags.youtube']
 
 #CODE_DIR = 'code'
 #NOTEBOOK_DIR = 'notebooks'

commit 6433a8450e3ec43bbe202383251ab21e47537404
Author: Marvin Steadfast <marvin@xsteadfastx.org>
Date:   Wed Sep 24 16:42:16 2014 +0200

    make everything a little modern and easier

diff --git a/pelicanconf.py b/pelicanconf.py
index 7a6e502..f3c2735 100644
--- a/pelicanconf.py
+++ b/pelicanconf.py
@@ -3,7 +3,7 @@ from __future__ import unicode_literals
 
 AUTHOR = 'Marvin Steadfast'
 SITENAME = 'is trying to code'
-SITEURL = 'http://code.xsteadfastx.org'
+SITEURL = ''
 AVATAR = '/theme/images/avatar.png'
 TIMEZONE = "Europe/Berlin"
 DESCRIPTION = "Der Versuch zu programmieren und Computer Zeugs nieder zu bloggen."
@@ -21,8 +21,8 @@ LOCALE = "C"
 DEFAULT_PAGINATION = 4
 DEFAULT_DATE = (2012, 3, 2, 14, 1, 1)
 
-FEED_ALL_RSS = 'feeds/all.rss.xml'
-CATEGORY_FEED_RSS = 'feeds/%s.rss.xml'
+FEED_ALL_ATOM = 'feeds/all.atom.xml'
+CATEGORY_FEED_ATOM = 'feeds/%s.atom.xml'
 
 # global metadata to all the contents
 #DEFAULT_METADATA = (('yeah', 'it is'),)

commit 846634d046fed8fe6a9240bf4472d44a98e52c1d
Author: Marvin Steadfast <xsteadfastx@gmail.com>
Date:   Thu Apr 3 10:53:29 2014 +0200

    new theme

diff --git a/pelicanconf.py b/pelicanconf.py
index 0b4dd9b..7a6e502 100644
--- a/pelicanconf.py
+++ b/pelicanconf.py
@@ -2,14 +2,17 @@
 from __future__ import unicode_literals
 
 AUTHOR = 'Marvin Steadfast'
-SITENAME = 'xsteadfastx is trying to code'
+SITENAME = 'is trying to code'
 SITEURL = 'http://code.xsteadfastx.org'
+AVATAR = '/theme/images/avatar.png'
 TIMEZONE = "Europe/Berlin"
+DESCRIPTION = "Der Versuch zu programmieren und Computer Zeugs nieder zu bloggen."
 
 # can be useful in development, but set to False when you're ready to publish
 RELATIVE_URLS = True
 
 GITHUB_URL = 'http://github.com/xsteadfastx/'
+TWITTER_NAME = 'xsteadfastx'
 #DISQUS_SITENAME = "xsteadfastxistryingtocode"
 ISSO_URL = 'http://comments.xsteadfastx.org'
 PDF_GENERATOR = False
@@ -35,6 +38,8 @@ STATIC_PATHS = [
     'images',
     #'extra/robots.txt',
     'extra/CNAME',
+    #'code',
+    #'notebooks'
     ]
 
 # custom page generated with a jinja2 template
@@ -47,9 +52,18 @@ PYGMENTS_RST_OPTIONS = {'linenos': 'table'}
 # have to be in caps
 #foobar = "barbaz"
 
-THEME = 'themes/xsteadfastx'
+THEME = 'themes/xsteadfastx-greg'
 OUTPUT_PATH = 'output'
 PATH = 'content'
 
 ARTICLE_URL = 'posts/{date:%Y}/{date:%m}/{slug}/'
 ARTICLE_SAVE_AS = 'posts/{date:%Y}/{date:%m}/{slug}/index.html'
+
+# plugins
+#PLUGIN_PATH = '../pelican-plugins'
+#PLUGINS = ['liquid_tags.notebook', 'liquid_tags.include_code',
+#           'liquid_tags.img', 'liquid_tags.video']
+
+#CODE_DIR = 'code'
+#NOTEBOOK_DIR = 'notebooks'
+#EXTRA_HEADER = open('_nb_header.html').read().decode('utf-8')

commit 29755fe4fa0613ef32fe91a4916b25dad6b58a3a
Author: Marvin Steadfast <xsteadfastx@gmail.com>
Date:   Mon Feb 3 13:47:15 2014 +0100

    changed from disqus to isso

diff --git a/pelicanconf.py b/pelicanconf.py
index 84d737a..0b4dd9b 100644
--- a/pelicanconf.py
+++ b/pelicanconf.py
@@ -2,7 +2,7 @@
 from __future__ import unicode_literals
 
 AUTHOR = 'Marvin Steadfast'
-SITENAME = "xsteadfastx is trying to code"
+SITENAME = 'xsteadfastx is trying to code'
 SITEURL = 'http://code.xsteadfastx.org'
 TIMEZONE = "Europe/Berlin"
 
@@ -10,7 +10,8 @@ TIMEZONE = "Europe/Berlin"
 RELATIVE_URLS = True
 
 GITHUB_URL = 'http://github.com/xsteadfastx/'
-DISQUS_SITENAME = "xsteadfastxistryingtocode"
+#DISQUS_SITENAME = "xsteadfastxistryingtocode"
+ISSO_URL = 'http://comments.xsteadfastx.org'
 PDF_GENERATOR = False
 REVERSE_CATEGORY_ORDER = True
 LOCALE = "C"

commit b3980480f357917b2703dc777dd79f6707045549
Author: Marvin Steadfast <xsteadfastx@gmail.com>
Date:   Thu Jan 30 13:55:37 2014 +0100

    new article and added a first image to the blog

diff --git a/pelicanconf.py b/pelicanconf.py
index d16d47c..84d737a 100644
--- a/pelicanconf.py
+++ b/pelicanconf.py
@@ -31,7 +31,7 @@ EXTRA_PATH_METADATA = {
 
 # static paths will be copied without parsing their contents
 STATIC_PATHS = [
-    'pictures',
+    'images',
     #'extra/robots.txt',
     'extra/CNAME',
     ]

commit 8eed02f7318dbdac6d386f78e0680ec0a2b8286e
Author: Marvin Steadfast <xsteadfastx@gmail.com>
Date:   Tue Jan 28 22:47:57 2014 +0100

    changed siteurl

diff --git a/pelicanconf.py b/pelicanconf.py
index 8e06443..d16d47c 100644
--- a/pelicanconf.py
+++ b/pelicanconf.py
@@ -3,7 +3,7 @@ from __future__ import unicode_literals
 
 AUTHOR = 'Marvin Steadfast'
 SITENAME = "xsteadfastx is trying to code"
-SITEURL = 'http://xsteadfastx.github.io/blog'
+SITEURL = 'http://code.xsteadfastx.org'
 TIMEZONE = "Europe/Berlin"
 
 # can be useful in development, but set to False when you're ready to publish

commit 36648232791ff7e046332ba28cfc650b0624cd2e
Author: Marvin Steadfast <xsteadfastx@gmail.com>
Date:   Tue Jan 28 22:43:40 2014 +0100

    added CNAME file and article about dropbear

diff --git a/pelicanconf.py b/pelicanconf.py
index f6a5478..8e06443 100644
--- a/pelicanconf.py
+++ b/pelicanconf.py
@@ -25,13 +25,15 @@ CATEGORY_FEED_RSS = 'feeds/%s.rss.xml'
 
 # path-specific metadata
 EXTRA_PATH_METADATA = {
-    'extra/robots.txt': {'path': 'robots.txt'},
+    #'extra/robots.txt': {'path': 'robots.txt'},
+    'extra/CNAME': {'path': 'CNAME'},
     }
 
 # static paths will be copied without parsing their contents
 STATIC_PATHS = [
     'pictures',
-    'extra/robots.txt',
+    #'extra/robots.txt',
+    'extra/CNAME',
     ]
 
 # custom page generated with a jinja2 template

commit 9e145eb7fb0c0a21df31e833e6178ce8e520f213
Author: Marvin Steadfast <xsteadfastx@gmail.com>
Date:   Tue Jan 28 15:52:33 2014 +0100

    added disqus

diff --git a/pelicanconf.py b/pelicanconf.py
index 1a4d164..f6a5478 100644
--- a/pelicanconf.py
+++ b/pelicanconf.py
@@ -10,7 +10,7 @@ TIMEZONE = "Europe/Berlin"
 RELATIVE_URLS = True
 
 GITHUB_URL = 'http://github.com/xsteadfastx/'
-#DISQUS_SITENAME = "blog-notmyidea"
+DISQUS_SITENAME = "xsteadfastxistryingtocode"
 PDF_GENERATOR = False
 REVERSE_CATEGORY_ORDER = True
 LOCALE = "C"

commit 4ce4aa135867f0508a1bb9f64f7e4fe5fb79ed57
Author: Marvin Steadfast <xsteadfastx@gmail.com>
Date:   Tue Jan 28 15:05:04 2014 +0100

    added first working version

diff --git a/pelicanconf.py b/pelicanconf.py
new file mode 100644
index 0000000..1a4d164
--- /dev/null
+++ b/pelicanconf.py
@@ -0,0 +1,52 @@
+# -*- coding: utf-8 -*-
+from __future__ import unicode_literals
+
+AUTHOR = 'Marvin Steadfast'
+SITENAME = "xsteadfastx is trying to code"
+SITEURL = 'http://xsteadfastx.github.io/blog'
+TIMEZONE = "Europe/Berlin"
+
+# can be useful in development, but set to False when you're ready to publish
+RELATIVE_URLS = True
+
+GITHUB_URL = 'http://github.com/xsteadfastx/'
+#DISQUS_SITENAME = "blog-notmyidea"
+PDF_GENERATOR = False
+REVERSE_CATEGORY_ORDER = True
+LOCALE = "C"
+DEFAULT_PAGINATION = 4
+DEFAULT_DATE = (2012, 3, 2, 14, 1, 1)
+
+FEED_ALL_RSS = 'feeds/all.rss.xml'
+CATEGORY_FEED_RSS = 'feeds/%s.rss.xml'
+
+# global metadata to all the contents
+#DEFAULT_METADATA = (('yeah', 'it is'),)
+
+# path-specific metadata
+EXTRA_PATH_METADATA = {
+    'extra/robots.txt': {'path': 'robots.txt'},
+    }
+
+# static paths will be copied without parsing their contents
+STATIC_PATHS = [
+    'pictures',
+    'extra/robots.txt',
+    ]
+
+# custom page generated with a jinja2 template
+#TEMPLATE_PAGES = {'pages/jinja2_template.html': 'jinja2_template.html'}
+
+# code blocks with line numbers
+PYGMENTS_RST_OPTIONS = {'linenos': 'table'}
+
+# foobar will not be used, because it's not in caps. All configuration keys
+# have to be in caps
+#foobar = "barbaz"
+
+THEME = 'themes/xsteadfastx'
+OUTPUT_PATH = 'output'
+PATH = 'content'
+
+ARTICLE_URL = 'posts/{date:%Y}/{date:%m}/{slug}/'
+ARTICLE_SAVE_AS = 'posts/{date:%Y}/{date:%m}/{slug}/index.html'