This comes with a story as well, out of some need, not just technical curiosity :-) I recently gave Ubuntu a shot to see how it compares with Windows for Android development (I might post something about it later), and for Windows I used a local VisualSVN Server - a no brainer SVN server package, very easy to install and maintain. When in Ubuntu I can't use it, well, not as it is. I can obviously set up an SVN server on Ubuntu and point to the same repositories (I've actually managed to access them through running svnserve and svn:// URLs as a start), but having a separate SVN server on GoFlex Home would make me feel better knowing that base copy is on another machine in case my laptop HDD crashes, I would only loose the working copy.
See previous post where we installed ipkg (will use it to install the SVN package) and we setup a system account for HDD storage (will use the same again to store the SVN repositories).
We will prepare the SVN repositories location (/srv/svn linked to external storage), where you can create a new blank repository (I'll call it test):
OR, if you have a dump file from a previous repository, you can restore that instead:
Unfortunately, although this is how I saw it setup in the first place (no additional processes, running as a module in Appache HTTP server), I couldn't get this working. After linking the additional config and changing it to correctly point to the modules (change LoadModule from libexec to /opt/libexec/...), the process will die with Segmentation fault.
Trying to debug this doesn't show more than maybe an incompatibility between the APR library used to compile Apache HTTP server and the modules...
Fix it back by removing the link, otherwise the webserver will not start next time:
Now that we tested the command line we're going to add it to the cron to run every night at 11pm.
Preparation
See previous post where we installed ipkg (will use it to install the SVN package) and we setup a system account for HDD storage (will use the same again to store the SVN repositories).
SVN software
bash-3.2# ipkg install svn Installing svn (1.7.7-1) to root... Downloading http://ipkg.nslu2-linux.org/feeds/optware/cs08q1armel/cross/stable/svn_1.7.7-1_arm.ipk package apr-util suggests installing sqlite package apr-util suggests installing openldap-libs Installing neon (0.29.6-1) to root... [...] Successfully terminated. bash-3.2# svnadmin --version svnadmin, version 1.7.7 (r1393599) compiled Oct 10 2012, 00:19:36 [...]
SVN repositories
We will prepare the SVN repositories location (/srv/svn linked to external storage), where you can create a new blank repository (I'll call it test):
bash-3.2# mkdir -p /home/0loop0/srv/svn/ bash-3.2# ln -sv /home/0loop0/srv/svn/ /srv/ bash-3.2# cd /srv/svn bash-3.2# df -h . Filesystem Size Used Avail Use% Mounted on /dev/loop0 985M 50M 885M 6% /home/0loop0 bash-3.2# mkdir repos bash-3.2# cd repos bash-3.2# svnadmin create test bash-3.2# svnadmin verify test * Verified revision 0. bash-3.2# svn mkdir file:///srv/svn/repos/test/trunk -m "Initial commit" Committed revision 1. bash-3.2# svn mkdir file:///srv/svn/repos/test/branches -m "Initial commit" Committed revision 2. bash-3.2# svn mkdir file:///srv/svn/repos/test/tags -m "Initial commit" Committed revision 3. bash-3.2# svn list -v file:///srv/svn/repos/test/ 3 root May 18 21:35 ./ 2 root May 18 21:35 branches/ 3 root May 18 21:35 tags/ 1 root May 18 21:34 trunk/
OR, if you have a dump file from a previous repository, you can restore that instead:
bash-3.2# cd /srv/svn/repos bash-3.2# svnadmin create android-apps bash-3.2# svnadmin load android-apps < android-apps.svn-dump
SVN server (http://) - FAIL
Unfortunately, although this is how I saw it setup in the first place (no additional processes, running as a module in Appache HTTP server), I couldn't get this working. After linking the additional config and changing it to correctly point to the modules (change LoadModule from libexec to /opt/libexec/...), the process will die with Segmentation fault.
bash-3.2# ln -sv /opt/etc/apache2/conf.d/mod_dav_svn.conf /etc/httpd/conf.d/ create symbolic link `/etc/httpd/conf.d/mod_dav_svn.conf' to `/opt/etc/apache2/conf.d/mod_dav_svn.conf' bash-3.2# vi /etc/httpd/conf.d/mod_dav_svn.conf bash-3.2# service httpd restart Stopping httpd: [ OK ] Starting httpd: /bin/bash: line 1: 8741 Segmentation fault /usr/sbin/httpd [FAILED]
Trying to debug this doesn't show more than maybe an incompatibility between the APR library used to compile Apache HTTP server and the modules...
bash-3.2# apk install gdb [...] bash-3.2# gdb httpd GNU gdb 6.8 [...] (gdb) run Starting program: /usr/sbin/httpd (no debugging symbols found) (no debugging symbols found) [Thread debugging using libthread_db enabled] [New Thread 0x404d1000 (LWP 7770)] Program received signal SIGSEGV, Segmentation fault. [Switching to Thread 0x404d1000 (LWP 7770)] 0x40736034 in apr_pool_create_ex () from /opt/lib/libapr.so.0
Fix it back by removing the link, otherwise the webserver will not start next time:
bash-3.2# unlink /etc/httpd/conf.d/mod_dav_svn.conf bash-3.2# service httpd restart Stopping httpd: [FAILED] Starting httpd: [ OK ]
SVN server (svn://)
Although not ideal, as it requires a separate process (svnserver) and it will make it harder to setup as we will need to start it with a script to run the external partition is mounted, here we go...
Test the script, see how the SVN server works:
Finally reboot and try accessing the repository from another machine, using svn://goflex_home/test/ (on Windows) or svn://ip_address/test (on Linux - that's because of the character in the name, nslookup works with "goflex home", but not svn...)
bash-3.2# cd /etc/oe-initscripts/oe-bootfinish/start.d/ bash-3.2# cat > 1_svnserve << EOL /opt/bin/svnserve -d -r /srv/svn/repos EOL bash-3.2# cat 1_svnserve /opt/bin/svnserve -d -M 8 -r /srv/svn/repos bash-3.2# chmod a+x 1_svnserve
Test the script, see how the SVN server works:
bash-3.2# ./1_svnserve bash-3.2# svn list -v svn://localhost/test 3 root May 18 21:35 ./ 2 root May 18 21:35 branches/ 3 root May 18 21:35 tags/ 1 root May 18 21:34 trunk/Let's also create the stop script - remember in previous post we created the unmount script with a "9_" prefix so that we can create the svnserve script with a lower prefix to make it run before it, otherwise the partition will be in use and won't be able to unmount and flush, possibly leading to loss of data or corruption of the SVN repository...
bash-3.2# cd /etc/oe-initscripts/oe-bootfinish/stop.d/ bash-3.2# cat > 8_svnserve << EOL killall svnserve EOL bash-3.2# chmod a+x 8_svnserveTrying the stop script...
bash-3.2# ./8_svnserve bash-3.2# svn list -v svn://localhost/test svn: E000111: Unable to connect to a repository at URL 'svn://localhost/test' svn: E000111: Can't connect to host 'localhost': Connection refused
Finally reboot and try accessing the repository from another machine, using svn://goflex_home/test/ (on Windows) or svn://ip_address/test (on Linux - that's because of the character in the name, nslookup works with "goflex home", but not svn...)
SVN backup
As we've mounted the SVN repositories inside of the file partition, I know I would feel more comfortable to know there is a backup that I can easily access if that gets corrupted. So what we're going to do is to setup a script to run either every night or every two days and make a dump of the repository, and make that available in the \\goflex_home\GoFlex Home Backup directory.
bash-3.2# cd /srv/svn bash-3.2# cat > svn-backup << EOL #!/bin/bash if [ -z "\$1" ]; then echo -e "Usage:\n \$0 repository-name" exit 99 fi OUTPUT_DIR=/home/system/GoFlex\ Home\ Backup/svn OUTPUT_FILE=\$1.svn-dump-\$(date +"%Y%m%d-%H%M%S") KEEP_DAYS=31 /opt/bin/svnadmin -M 8 -q dump /srv/svn/repos/\$1 > "\$OUTPUT_DIR/\$OUTPUT_FILE" /usr/bin/zip -m -2 -j "\$OUTPUT_DIR/\$OUTPUT_FILE.zip" "\$OUTPUT_DIR/\$OUTPUT_FILE" echo -e "\nTrimming backups - older than \$KEEP_DAYS days..." find "\$OUTPUT_DIR" -name "\$1.*.zip" -mtime +\$KEEP_DAYS -exec ls {} \; -exec rm {} \; EOL bash-3.2# chmod a+x svn-backup bash-3.2# cd "/home/system/GoFlex Home Backup/" bash-3.2# mkdir svn bash-3.2# cd svn bash-3.2# /srv/svn/svn-backup test * Dumped revision 0. * Dumped revision 1. * Dumped revision 2. * Dumped revision 3. adding: test.svn-dump-20130518-234455 (deflated 71%) Trimming backups - older than 31 days... bash-3.2# ls -la * total 0 -rwxrwxrwx 1 apache users 320 May 18 22:07 test.svn-dump-20130518-220731.zip
Now that we tested the command line we're going to add it to the cron to run every night at 11pm.
bash-3.2# cat > /etc/cron.d/svn-backup << EOL 0 23 * * * root /srv/svn/svn-backup test EOL bash-3.2# cat /etc/cron.d/svn-backup 0 23 * * * root /srv/svn/svn-backup test
No comments :
Post a Comment