pax_global_header 0000666 0000000 0000000 00000000064 13522351207 0014512 g ustar 00root root 0000000 0000000 52 comment=03592b81ee14399520ee69ec9564b9d4be93014b slapos-03592b81ee14399520ee69ec9564b9d4be93014b-software-backupserver/ 0000775 0000000 0000000 00000000000 13522351207 0024135 5 ustar 00root root 0000000 0000000 slapos-03592b81ee14399520ee69ec9564b9d4be93014b-software-backupserver/software/ 0000775 0000000 0000000 00000000000 13522351207 0025767 5 ustar 00root root 0000000 0000000 slapos-03592b81ee14399520ee69ec9564b9d4be93014b-software-backupserver/software/backupserver/ 0000775 0000000 0000000 00000000000 13522351207 0030463 5 ustar 00root root 0000000 0000000 instance-pullrdiffbackup.cfg.in 0000664 0000000 0000000 00000020621 13522351207 0036452 0 ustar 00root root 0000000 0000000 slapos-03592b81ee14399520ee69ec9564b9d4be93014b-software-backupserver/software/backupserver {% set part_list = [] -%} {% set crontab_line_list = [] -%} ############################### # # Instanciate dcron # ############################### [variables] status_dirbasename = status statistic_dirbasename = statistic [directory] recipe = slapos.cookbook:mkdirectory etc = $${buildout:directory}/etc bin = $${buildout:directory}/bin srv = $${buildout:directory}/srv var = $${buildout:directory}/var run = $${:var}/run log = $${:var}/log varnginx = $${:var}/nginx # scripts = $${:etc}/run services = $${:etc}/service cron-entries = $${:etc}/cron.d cron-lines = $${:etc}/cron.lines crontabs = $${:etc}/crontabs cronstamps = $${:etc}/cronstamps backup = $${:srv}/backup status = $${:srv}/$${variables:status_dirbasename} statistic = $${:srv}/$${variables:statistic_dirbasename} backupscript = $${:etc}/backup www = $${:srv}/www home = $${:etc}/home promises = $${:etc}/promise ssl = $${:etc}/ssl ssh = $${:home}/.ssh plugin = $${:etc}/plugin ################################# # Cron service ################################# [dcron-service] recipe = slapos.recipe.template url = ${template-dcron-service:output} output = $${directory:services}/crond mode = 0700 logfile = $${directory:log}/crond.log ################################# # Slave backup scripts and crontab ################################# # Go throught slave list to set their configuration {% for slave_instance in slave_instance_list -%} {% set orig_slave_reference = slave_instance.get('slave_reference') -%} {% set slave_reference = orig_slave_reference.replace(' ', '_') -%} {% set frequency = slave_instance.get('frequency', '') -%} {% set hostname = slave_instance.get('hostname', '') -%} {% set connection = slave_instance.get('connection', '') -%} {% set connection_port = slave_instance.get('connection_port', '22') -%} {% set include = slave_instance.get('include', '') -%} {% set include_string = "' --include='".join(include.split(' ')) -%} {% set exclude = slave_instance.get('exclude', '') -%} {% set exclude_string = '' -%} {% set sudo = slave_instance.get('sudo', 'False') -%} {% set remote_schema = slave_instance.get('remote_rdiff_path', 'rdiff-backup') + ' --server --restrict-read-only / -- "$@"' -%} {% if (exclude != '') -%} {% set exclude_string = "' --exclude='".join(exclude.split(' ')) -%} {% set exclude_string = "--exclude='" + exclude_string + "'" -%} {% endif -%} {% if (sudo == 'True') -%} {% set remote_schema = 'sudo backupagent_rdiff-backup' -%} {% endif -%} {% if (frequency != '') and (hostname != '') and (connection != '') and (include != '') -%} [{{ slave_reference }}-backup-directory] recipe = slapos.cookbook:mkdirectory directory = $${directory:backup}/$${:_buildout_section_name_} [{{ slave_reference }}-backup-private_key] recipe = plone.recipe.command stop-on-error = true command = ${coreutils-output:rm} -f $${:key} $${:public_key} && ${openssh-output:keygen} -t $${:type} -b 2048 -f $${:key} -q -N "" key = $${directory:ssh}/$${:_buildout_section_name_} public_key = $${:key}.pub location = $${:public_key} type = rsa # Insert as a beginning part, to ensure that all public keys are generated before trying to publish. This will reduce the number of slapgrid-cp run. {% do part_list.insert(0, "%s-backup-private_key" % slave_reference) -%} [{{ slave_reference }}-backup-read-public_key] recipe = slapos.cookbook:readline storage-path = {{ '$${' ~ slave_reference }}-backup-private_key:public_key} # Publish slave {{ slave_reference }} information [{{ slave_reference }}-backup-publish] recipe = slapos.cookbook:publish -slave-reference = {{ orig_slave_reference }} authorized_key = {{ '$${' ~ slave_reference }}-backup-read-public_key:readline} rss = https://[$${nginx-configuration:ip}]:$${nginx-configuration:port}/{{ '$${' ~ slave_reference }}-backup-script:status_name}.rss {% do part_list.append("%s-backup-publish" % slave_reference) -%} [{{ slave_reference }}-promise-check-backup] recipe = slapos.cookbook:promise.plugin eggs = slapos.toolbox output = $${directory:plugin}/{{ slave_reference }}_check_backup.py content = from slapos.promise.plugin.backupserver_check_backup import RunPromise config-status_dirbasename = $${variables:status_dirbasename} config-status_name = {{ '$${' ~ slave_reference }}-backup-script:status_name} config-status_fullpath = {{ '$${' ~ slave_reference }}-backup-script:status_log} config-script_fullpath = {{ '$${' ~ slave_reference }}-backup-script:output} config-cron_frequency = {{ frequency }} config-monitor_url = $${monitor-publish:monitor-base-url} config-statistic_dirbasename = $${variables:statistic_dirbasename} config-statistic_name = {{ '$${' ~ slave_reference }}-backup-script:statistic_name} mode = 600 {% do part_list.append("%s-promise-check-backup" % slave_reference) -%} [{{ slave_reference }}-backup-script] recipe = slapos.recipe.template url = ${template-backup-script:output} output = $${directory:backupscript}/$${:_buildout_section_name_} mode = 0700 datadirectory = {{ '$${' ~ slave_reference }}-backup-directory:directory} sshkey = {{ '$${' ~ slave_reference }}-backup-private_key:key} connection = {{ connection }} connection_port = {{ connection_port }} hostname = {{ hostname }} include = {{ include_string }} exclude_string = {{ exclude_string }} remote_schema = {{ remote_schema }} status_name = {{ slave_reference }}_status.txt statistic_name = {{ slave_reference }}_statistic.txt status_log = $${directory:status}/$${:status_name} statistic_log = $${directory:statistic}/$${:statistic_name} [{{ slave_reference }}-backup-crontab-line] recipe = slapos.recipe.template url = ${template-crontab-line:output} output = $${directory:cron-lines}/$${:_buildout_section_name_} mode = 0600 script = {{ '$${' ~ slave_reference }}-backup-script:output} frequency = {{ frequency }} {% do crontab_line_list.append("$${%s-backup-crontab-line:output}" % slave_reference) -%} {% endif -%} {% endfor -%} ################################# # Generate crontab file ################################# [update-rss-script] recipe = slapos.recipe.template url = ${template-update-rss-script:output} output = $${directory:etc}/$${:_buildout_section_name_} mode = 0700 global_rss = $${slap-connection:computer-id}-$${slap-connection:partition-id}.rss [update-rss-crontab-line] recipe = slapos.recipe.template url = ${template-crontab-line:output} output = $${directory:cron-lines}/$${:_buildout_section_name_} mode = 0600 script = $${update-rss-script:output} frequency = */5 * * * * {% do crontab_line_list.append("$${update-rss-crontab-line:output}") -%} [publish-global-rss] recipe = slapos.cookbook:publish <= monitor-publish rss = https://[$${nginx-configuration:ip}]:$${nginx-configuration:port}/$${update-rss-script:global_rss} {% set crontab_line_list_string = " ".join(crontab_line_list) -%} [activate-crontab-file] # XXX File is never removed recipe = plone.recipe.command stop-on-error = true command = ${coreutils-output:cat} ${template-crontab:output} {{ crontab_line_list_string }} | ${dcron-output:crontab} -c $${directory:crontabs} - ################################# # Nginx service ################################# [nginx-service] recipe = slapos.recipe.template url = ${template-nginx-service:output} output = $${directory:services}/nginx mode = 0700 virtual-depends = $${nginx-configuration:ip} [nginx-listen-promise] recipe = slapos.cookbook:check_port_listening hostname = $${nginx-configuration:ip} port = $${nginx-configuration:port} path = $${directory:promises}/nginx_listen [nginx-configuration] recipe = slapos.recipe.template url = ${template-nginx-configuration:output} output = $${directory:etc}/nginx.cfg mode = 0600 access_log = $${directory:log}/nginx-access.log error_log = $${directory:log}/nginx-error.log ip = $${slap-network-information:global-ipv6} port = 9443 ssl_key = $${directory:ssl}/nginx.key ssl_csr = $${directory:ssl}/nginx.csr ssl_crt = $${directory:ssl}/nginx.crt ################################# # Monitoring ################################# [monitor-instance-parameter] monitor-httpd-port = 9687 [monitor-conf-parameters] private-path-list += $${directory:statistic} $${directory:status} # Add parts generated by template [buildout] extends = ${monitor-template:rendered} parts = dcron-service nginx-service nginx-listen-promise activate-crontab-file publish-global-rss monitor-base {% for part in part_list -%} {{ ' %s' % part }} {% endfor -%} eggs-directory = ${buildout:eggs-directory} develop-eggs-directory = ${buildout:develop-eggs-directory} offline = true instance.cfg.in 0000664 0000000 0000000 00000002676 13522351207 0033311 0 ustar 00root root 0000000 0000000 slapos-03592b81ee14399520ee69ec9564b9d4be93014b-software-backupserver/software/backupserver [buildout] parts = switch-softwaretype eggs-directory = ${buildout:eggs-directory} develop-eggs-directory = ${buildout:develop-eggs-directory} offline = true [dynamic-template-pullrdiffbackup] recipe = slapos.recipe.template:jinja2 template = ${template-pullrdiffbackup:output} rendered = $${buildout:parts-directory}/$${:_buildout_section_name_}/$${:filename} filename = instance-pullrdiffbackup.cfg extensions = jinja2.ext.do context = key slave_instance_list instance-parameter:slave-instance-list [switch-softwaretype] recipe = slapos.cookbook:softwaretype default = $${:pullrdiffbackup} # pullrdiffbackup = ${template-pullrdiffbackup:output} pullrdiffbackup = $${dynamic-template-pullrdiffbackup:rendered} [slap-connection] # part to migrate to new - separated words computer-id = $${slap_connection:computer_id} partition-id = $${slap_connection:partition_id} server-url = $${slap_connection:server_url} software-release-url = $${slap_connection:software_release_url} key-file = $${slap_connection:key_file} cert-file = $${slap_connection:cert_file} # [slap-parameter] # slave-instance-list = [] [instance-parameter] # Fetches parameters defined in SlapOS Master for this instance. # Always the same. recipe = slapos.cookbook:slapconfiguration.serialised computer = $${slap_connection:computer_id} partition = $${slap_connection:partition_id} url = $${slap_connection:server_url} key = $${slap_connection:key_file} cert = $${slap_connection:cert_file} software.cfg 0000664 0000000 0000000 00000007042 13522351207 0032722 0 ustar 00root root 0000000 0000000 slapos-03592b81ee14399520ee69ec9564b9d4be93014b-software-backupserver/software/backupserver [buildout] extends = ../../component/dash/buildout.cfg ../../component/dcron/buildout.cfg ../../component/logrotate/buildout.cfg ../../component/openssl/buildout.cfg ../../component/nginx/buildout.cfg ../../component/rdiff-backup/buildout.cfg ../../component/rsync/buildout.cfg ../../component/openssh/buildout.cfg ../../component/grep/buildout.cfg ../../component/findutils/buildout.cfg ../../component/util-linux/buildout.cfg ../../stack/slapos.cfg ../../stack/monitor/buildout.cfg parts = extra-eggs monitor-extra-eggs rdiff-backup dcron logrotate nginx openssl rsync template template-pullrdiffbackup template-backup-script template-crontab-line slapos-cookbook [monitor-extra-eggs] recipe = zc.recipe.egg eggs = ${monitor-eggs:eggs} [extra-eggs] recipe = zc.recipe.egg interpreter = pythonforrssgen eggs = PyRSS2Gen python_dateutil ########################################################## # Service startup scripts and configuration files ########################################################## [template-nginx-service] recipe = slapos.recipe.template url = ${:_profile_base_location_}/template-nginx-service.sh.in md5sum = 5c94d952305552dcbeaeaeb27dd28f3b output = ${buildout:directory}/template-nginx-service.sh.in mode = 0644 [template-nginx-configuration] recipe = slapos.recipe.template url = ${:_profile_base_location_}/template-nginx.cfg.in md5sum = c54d36f55ba71c897505ed61213e104a output = ${buildout:directory}/template-nginx.cfg.in mode = 0644 [template-dcron-service] recipe = slapos.recipe.template url = ${:_profile_base_location_}/template-dcron-service.sh.in md5sum = 1372441dac23e4fa7d2dc773a74725ea output = ${buildout:directory}/template-dcron-service.sh.in mode = 0644 [template-backup-script] recipe = slapos.recipe.template url = ${:_profile_base_location_}/template-backup-script.sh.in md5sum = 4c75f8462eaef2d8fcf24627e5f3575a output = ${buildout:directory}/template-backup-script.sh.in mode = 0644 [template-crontab-line] recipe = slapos.recipe.template url = ${:_profile_base_location_}/template-crontab-line.in md5sum = 5cbd64f04da0601ba4286516a6161f5e output = ${buildout:directory}/template-crontab-line.in mode = 0644 [template-crontab] recipe = slapos.recipe.template url = ${:_profile_base_location_}/template-crontab.in md5sum = 072be0fd04896880c931d44d8eabde37 output = ${buildout:directory}/template-crontab.in mode = 0644 [status2rss] recipe = slapos.recipe.template url = ${:_profile_base_location_}/status2rss.py md5sum = 432d22bb0f67df5203bbc5d1134a952b output = ${buildout:directory}/status2rss.py mode = 0644 [template-update-rss-script] recipe = slapos.recipe.template url = ${:_profile_base_location_}/template-update-rss.sh.in md5sum = 80b3746568bc8e308a1f337bdaa2441c output = ${buildout:directory}/template-update-rss.sh.in mode = 0644 ########################################################## # Buildout instance.cfg templates ########################################################## [template-pullrdiffbackup] recipe = slapos.recipe.template url = ${:_profile_base_location_}/instance-pullrdiffbackup.cfg.in md5sum = 537ab12f3885660e59d280ee40e379ac output = ${buildout:directory}/template-pullrdiffbackup.cfg mode = 0644 [template] recipe = slapos.recipe.template url = ${:_profile_base_location_}/instance.cfg.in md5sum = 42021b325159dff29e4bd4e33b8ff2f3 output = ${buildout:directory}/template.cfg mode = 0644 [versions] rdiff-backup = 1.0.5+SlapOSPatched001 gunicorn = 19.1.1 plone.recipe.command = 1.1 slapos.recipe.template = 2.4.2 PyRSS2Gen = 1.1 gitdb2 = 2.0.5 smmap2 = 2.0.5 status2rss.py 0000664 0000000 0000000 00000002014 13522351207 0033110 0 ustar 00root root 0000000 0000000 slapos-03592b81ee14399520ee69ec9564b9d4be93014b-software-backupserver/software/backupserver import datetime import uuid import PyRSS2Gen import sys from dateutil.parser import parse import base64 # Based on http://thehelpfulhacker.net/2011/03/27/a-rss-feed-for-your-crontabs/ # ### Defaults TITLE = sys.argv[1] LINK = sys.argv[2] DESCRIPTION = TITLE items = [] while 1: try: line = sys.stdin.readline() except KeyboardInterrupt: break if not line: break time, statistic, desc = line.split(', ', 2) rss_item = PyRSS2Gen.RSSItem( title = desc, description = "
%s
" % "