EOF & whitespace

This commit is contained in:
k3nny 2024-11-29 00:54:09 +01:00
parent e7e98d0b47
commit 7fcc5afc64
60 changed files with 4173 additions and 4192 deletions

7
.pre-commit-config.yaml Normal file
View File

@ -0,0 +1,7 @@
repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v5.0.0
hooks:
- id: trailing-whitespace
- id: end-of-file-fixer
- id: check-yaml

View File

@ -5,7 +5,7 @@ WORKDIR /opt/tisbackup
COPY entrypoint.sh /entrypoint.sh COPY entrypoint.sh /entrypoint.sh
COPY . /opt/tisbackup COPY . /opt/tisbackup
RUN apt-get update \ RUN apt-get update \
&& apt-get install --no-install-recommends -y rsync ssh cron \ && apt-get install --no-install-recommends -y rsync ssh cron \
&& rm -rf /var/lib/apt/lists/* \ && rm -rf /var/lib/apt/lists/* \
&& /usr/local/bin/python3.12 -m pip install --no-cache-dir -r requirements.txt \ && /usr/local/bin/python3.12 -m pip install --no-cache-dir -r requirements.txt \
@ -18,4 +18,3 @@ EXPOSE 8080
ENTRYPOINT ["/entrypoint.sh"] ENTRYPOINT ["/entrypoint.sh"]
CMD ["/usr/local/bin/python3.12","/opt/tisbackup/tisbackup_gui.py"] CMD ["/usr/local/bin/python3.12","/opt/tisbackup/tisbackup_gui.py"]

View File

@ -39,4 +39,3 @@ services:
reservations: reservations:
cpus: 0.25 cpus: 0.25
memory: 128M memory: 128M

View File

@ -1,42 +1,42 @@
## tisbackup for python3 ## tisbackup for python3
### Install ### Install
Once the deb package is created, one can use it to install tisbackup on a debian machine. The command is: Once the deb package is created, one can use it to install tisbackup on a debian machine. The command is:
``` ```
apt install ./tis-tisbackup-1-2-0.170-deb11.deb apt install ./tis-tisbackup-1-2-0.170-deb11.deb
``` ```
Note that the version numbers might be different depending on the system you used to build the package. Note that the version numbers might be different depending on the system you used to build the package.
Then create a directory where to backup the files from your machines. The default is ```/backup```. Then create a directory where to backup the files from your machines. The default is ```/backup```.
This can be changed in the configuration file ```/etc/tis/tisback-config.ini```. Usually this This can be changed in the configuration file ```/etc/tis/tisback-config.ini```. Usually this
directory is mounted from a shared ressource on a NAS with great capacity. directory is mounted from a shared ressource on a NAS with great capacity.
Configure your backup jobs: Configure your backup jobs:
``` ```
cd /etc/tis cd /etc/tis
cp tisbackup-config.ini.sample tisbackup-config.ini cp tisbackup-config.ini.sample tisbackup-config.ini
vi tisbackup-config.ini vi tisbackup-config.ini
``` ```
After this, one have to generate the public and private certificates, as root: After this, one have to generate the public and private certificates, as root:
``` ```
cd cd
ssh-keygen -t rsa -b 2048 ssh-keygen -t rsa -b 2048
``` ```
(press enter for each step) (press enter for each step)
Then propagate the public certificate on the machines targetted for backup: Then propagate the public certificate on the machines targetted for backup:
``` ```
ssh-copy-id -i /root/.ssh/id_rsa.pub root@machine1 ssh-copy-id -i /root/.ssh/id_rsa.pub root@machine1
ssh-copy-id -i /root/.ssh/id_rsa.pub root@machine2 ssh-copy-id -i /root/.ssh/id_rsa.pub root@machine2
``` ```
etc. etc.
Eventually modify ```/etc/cron.d/tisbackup``` for your needs. Eventually modify ```/etc/cron.d/tisbackup``` for your needs.
Finalize the installation with: Finalize the installation with:
``` ```
tisbackup -d backup tisbackup -d backup
systemctl start tisbackup_gui systemctl start tisbackup_gui
@ -52,5 +52,3 @@ The documentation for tisbackup is here: [tisbackup doc](https://tisbackup.readt
dpkg --force-all --purge tis-tisbackup dpkg --force-all --purge tis-tisbackup
apt autoremove apt autoremove
``` ```

View File

@ -3,8 +3,7 @@ Version: 1-__VERSION__
Section: base Section: base
Priority: optional Priority: optional
Architecture: all Architecture: all
Depends: unzip, ssh, rsync, python3-paramiko, python3-pyvmomi, python3-pexpect, python3-flask,python3-simplejson, python3-pip Depends: unzip, ssh, rsync, python3-paramiko, python3-pyvmomi, python3-pexpect, python3-flask,python3-simplejson, python3-pip
Maintainer: Tranquil-IT <technique@tranquil.it> Maintainer: Tranquil-IT <technique@tranquil.it>
Description: TISBackup backup management Description: TISBackup backup management
Homepage: https://www.tranquil.it Homepage: https://www.tranquil.it

View File

@ -1,8 +1,8 @@
#!/usr/bin/env bash #!/usr/bin/env bash
VERSION_DEB=$(cat /etc/debian_version | cut -d "." -f 1) VERSION_DEB=$(cat /etc/debian_version | cut -d "." -f 1)
VERSION_SHORT=$(cat ../tisbackup.py | grep "__version__" | cut -d "=" -f 2 | sed 's/"//g') VERSION_SHORT=$(cat ../tisbackup.py | grep "__version__" | cut -d "=" -f 2 | sed 's/"//g')
GIT_COUNT=`git rev-list HEAD --count` GIT_COUNT=`git rev-list HEAD --count`
VERSION="${VERSION_SHORT}.${GIT_COUNT}-deb${VERSION_DEB}" VERSION="${VERSION_SHORT}.${GIT_COUNT}-deb${VERSION_DEB}"
rm -f *.deb rm -f *.deb
@ -32,5 +32,3 @@ rsync -aP ../samples/tisbackup-config.ini.sample ./builddir/etc/tis/tisbackup-c
chmod 755 ./builddir/opt/tisbackup/tisbackup.py chmod 755 ./builddir/opt/tisbackup/tisbackup.py
dpkg-deb --build builddir tis-tisbackup-1-${VERSION}.deb dpkg-deb --build builddir tis-tisbackup-1-${VERSION}.deb

View File

@ -765,4 +765,4 @@ div.math:hover a.headerlink {
#top-link { #top-link {
display: none; display: none;
} }
} }

View File

@ -1 +1 @@
.fa:before{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}@font-face{font-family:FontAwesome;font-style:normal;font-weight:400;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#FontAwesome) format("svg")}.fa:before{font-family:FontAwesome;font-style:normal;font-weight:400;line-height:1}.fa:before,a .fa{text-decoration:inherit}.fa:before,a .fa,li .fa{display:inline-block}li .fa-large:before{width:1.875em}ul.fas{list-style-type:none;margin-left:2em;text-indent:-.8em}ul.fas li .fa{width:.8em}ul.fas li .fa-large:before{vertical-align:baseline}.fa-book:before,.icon-book:before{content:"\f02d"}.fa-caret-down:before,.icon-caret-down:before{content:"\f0d7"}.fa-caret-up:before,.icon-caret-up:before{content:"\f0d8"}.fa-caret-left:before,.icon-caret-left:before{content:"\f0d9"}.fa-caret-right:before,.icon-caret-right:before{content:"\f0da"}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60}.rst-versions .rst-current-version:after{clear:both;content:"";display:block}.rst-versions .rst-current-version .fa{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}} .fa:before{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}@font-face{font-family:FontAwesome;font-style:normal;font-weight:400;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#FontAwesome) format("svg")}.fa:before{font-family:FontAwesome;font-style:normal;font-weight:400;line-height:1}.fa:before,a .fa{text-decoration:inherit}.fa:before,a .fa,li .fa{display:inline-block}li .fa-large:before{width:1.875em}ul.fas{list-style-type:none;margin-left:2em;text-indent:-.8em}ul.fas li .fa{width:.8em}ul.fas li .fa-large:before{vertical-align:baseline}.fa-book:before,.icon-book:before{content:"\f02d"}.fa-caret-down:before,.icon-caret-down:before{content:"\f0d7"}.fa-caret-up:before,.icon-caret-up:before{content:"\f0d8"}.fa-caret-left:before,.icon-caret-left:before{content:"\f0d9"}.fa-caret-right:before,.icon-caret-right:before{content:"\f0da"}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60}.rst-versions .rst-current-version:after{clear:both;content:"";display:block}.rst-versions .rst-current-version .fa{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}

File diff suppressed because it is too large Load Diff

Before

Width:  |  Height:  |  Size: 434 KiB

After

Width:  |  Height:  |  Size: 433 KiB

File diff suppressed because one or more lines are too long

View File

@ -9,4 +9,4 @@ var DOCUMENTATION_OPTIONS = {
HAS_SOURCE: true, HAS_SOURCE: true,
SOURCELINK_SUFFIX: '.txt', SOURCELINK_SUFFIX: '.txt',
NAVIGATION_WITH_KEYS: false NAVIGATION_WITH_KEYS: false
}; };

File diff suppressed because it is too large Load Diff

Before

Width:  |  Height:  |  Size: 434 KiB

After

Width:  |  Height:  |  Size: 433 KiB

View File

@ -1 +1 @@
!function(e){var t={};function r(n){if(t[n])return t[n].exports;var o=t[n]={i:n,l:!1,exports:{}};return e[n].call(o.exports,o,o.exports,r),o.l=!0,o.exports}r.m=e,r.c=t,r.d=function(e,t,n){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)r.d(n,o,function(t){return e[t]}.bind(null,o));return n},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="",r(r.s=4)}({4:function(e,t,r){}}); !function(e){var t={};function r(n){if(t[n])return t[n].exports;var o=t[n]={i:n,l:!1,exports:{}};return e[n].call(o.exports,o,o.exports,r),o.l=!0,o.exports}r.m=e,r.c=t,r.d=function(e,t,n){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)r.d(n,o,function(t){return e[t]}.bind(null,o));return n},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="",r(r.s=4)}({4:function(e,t,r){}});

View File

@ -1,4 +1,4 @@
/** /**
* @preserve HTML5 Shiv 3.7.3-pre | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed * @preserve HTML5 Shiv 3.7.3-pre | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed
*/ */
!function(a,b){function c(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x<style>"+b+"</style>",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=y.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=y.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),y.elements=c+" "+a,j(b)}function f(a){var b=x[a[v]];return b||(b={},w++,a[v]=w,x[w]=b),b}function g(a,c,d){if(c||(c=b),q)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():u.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||t.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),q)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return y.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(y,b.frag)}function j(a){a||(a=b);var d=f(a);return!y.shivCSS||p||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),q||i(a,d),a}function k(a){for(var b,c=a.getElementsByTagName("*"),e=c.length,f=RegExp("^(?:"+d().join("|")+")$","i"),g=[];e--;)b=c[e],f.test(b.nodeName)&&g.push(b.applyElement(l(b)));return g}function l(a){for(var b,c=a.attributes,d=c.length,e=a.ownerDocument.createElement(A+":"+a.nodeName);d--;)b=c[d],b.specified&&e.setAttribute(b.nodeName,b.nodeValue);return e.style.cssText=a.style.cssText,e}function m(a){for(var b,c=a.split("{"),e=c.length,f=RegExp("(^|[\\s,>+~])("+d().join("|")+")(?=[[\\s,>+~#.:]|$)","gi"),g="$1"+A+"\\:$2";e--;)b=c[e]=c[e].split("}"),b[b.length-1]=b[b.length-1].replace(f,g),c[e]=b.join("}");return c.join("{")}function n(a){for(var b=a.length;b--;)a[b].removeNode()}function o(a){function b(){clearTimeout(g._removeSheetTimer),d&&d.removeNode(!0),d=null}var d,e,g=f(a),h=a.namespaces,i=a.parentWindow;return!B||a.printShived?a:("undefined"==typeof h[A]&&h.add(A),i.attachEvent("onbeforeprint",function(){b();for(var f,g,h,i=a.styleSheets,j=[],l=i.length,n=Array(l);l--;)n[l]=i[l];for(;h=n.pop();)if(!h.disabled&&z.test(h.media)){try{f=h.imports,g=f.length}catch(o){g=0}for(l=0;g>l;l++)n.push(f[l]);try{j.push(h.cssText)}catch(o){}}j=m(j.reverse().join("")),e=k(a),d=c(a,j)}),i.attachEvent("onafterprint",function(){n(e),clearTimeout(g._removeSheetTimer),g._removeSheetTimer=setTimeout(b,500)}),a.printShived=!0,a)}var p,q,r="3.7.3",s=a.html5||{},t=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,u=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,v="_html5shiv",w=0,x={};!function(){try{var a=b.createElement("a");a.innerHTML="<xyz></xyz>",p="hidden"in a,q=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){p=!0,q=!0}}();var y={elements:s.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:r,shivCSS:s.shivCSS!==!1,supportsUnknownElements:q,shivMethods:s.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=y,j(b);var z=/^$|\b(?:all|print)\b/,A="html5shiv",B=!q&&function(){var c=b.documentElement;return!("undefined"==typeof b.namespaces||"undefined"==typeof b.parentWindow||"undefined"==typeof c.applyElement||"undefined"==typeof c.removeNode||"undefined"==typeof a.attachEvent)}();y.type+=" print",y.shivPrint=o,o(b),"object"==typeof module&&module.exports&&(module.exports=y)}("undefined"!=typeof window?window:this,document); !function(a,b){function c(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x<style>"+b+"</style>",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=y.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=y.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),y.elements=c+" "+a,j(b)}function f(a){var b=x[a[v]];return b||(b={},w++,a[v]=w,x[w]=b),b}function g(a,c,d){if(c||(c=b),q)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():u.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||t.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),q)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return y.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(y,b.frag)}function j(a){a||(a=b);var d=f(a);return!y.shivCSS||p||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),q||i(a,d),a}function k(a){for(var b,c=a.getElementsByTagName("*"),e=c.length,f=RegExp("^(?:"+d().join("|")+")$","i"),g=[];e--;)b=c[e],f.test(b.nodeName)&&g.push(b.applyElement(l(b)));return g}function l(a){for(var b,c=a.attributes,d=c.length,e=a.ownerDocument.createElement(A+":"+a.nodeName);d--;)b=c[d],b.specified&&e.setAttribute(b.nodeName,b.nodeValue);return e.style.cssText=a.style.cssText,e}function m(a){for(var b,c=a.split("{"),e=c.length,f=RegExp("(^|[\\s,>+~])("+d().join("|")+")(?=[[\\s,>+~#.:]|$)","gi"),g="$1"+A+"\\:$2";e--;)b=c[e]=c[e].split("}"),b[b.length-1]=b[b.length-1].replace(f,g),c[e]=b.join("}");return c.join("{")}function n(a){for(var b=a.length;b--;)a[b].removeNode()}function o(a){function b(){clearTimeout(g._removeSheetTimer),d&&d.removeNode(!0),d=null}var d,e,g=f(a),h=a.namespaces,i=a.parentWindow;return!B||a.printShived?a:("undefined"==typeof h[A]&&h.add(A),i.attachEvent("onbeforeprint",function(){b();for(var f,g,h,i=a.styleSheets,j=[],l=i.length,n=Array(l);l--;)n[l]=i[l];for(;h=n.pop();)if(!h.disabled&&z.test(h.media)){try{f=h.imports,g=f.length}catch(o){g=0}for(l=0;g>l;l++)n.push(f[l]);try{j.push(h.cssText)}catch(o){}}j=m(j.reverse().join("")),e=k(a),d=c(a,j)}),i.attachEvent("onafterprint",function(){n(e),clearTimeout(g._removeSheetTimer),g._removeSheetTimer=setTimeout(b,500)}),a.printShived=!0,a)}var p,q,r="3.7.3",s=a.html5||{},t=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,u=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,v="_html5shiv",w=0,x={};!function(){try{var a=b.createElement("a");a.innerHTML="<xyz></xyz>",p="hidden"in a,q=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){p=!0,q=!0}}();var y={elements:s.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:r,shivCSS:s.shivCSS!==!1,supportsUnknownElements:q,shivMethods:s.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=y,j(b);var z=/^$|\b(?:all|print)\b/,A="html5shiv",B=!q&&function(){var c=b.documentElement;return!("undefined"==typeof b.namespaces||"undefined"==typeof b.parentWindow||"undefined"==typeof c.applyElement||"undefined"==typeof c.removeNode||"undefined"==typeof a.attachEvent)}();y.type+=" print",y.shivPrint=o,o(b),"object"==typeof module&&module.exports&&(module.exports=y)}("undefined"!=typeof window?window:this,document);

View File

@ -1,4 +1,4 @@
/** /**
* @preserve HTML5 Shiv 3.7.3 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed * @preserve HTML5 Shiv 3.7.3 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed
*/ */
!function(a,b){function c(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x<style>"+b+"</style>",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=t.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=t.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),t.elements=c+" "+a,j(b)}function f(a){var b=s[a[q]];return b||(b={},r++,a[q]=r,s[r]=b),b}function g(a,c,d){if(c||(c=b),l)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():p.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||o.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),l)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return t.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(t,b.frag)}function j(a){a||(a=b);var d=f(a);return!t.shivCSS||k||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),l||i(a,d),a}var k,l,m="3.7.3-pre",n=a.html5||{},o=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,p=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,q="_html5shiv",r=0,s={};!function(){try{var a=b.createElement("a");a.innerHTML="<xyz></xyz>",k="hidden"in a,l=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){k=!0,l=!0}}();var t={elements:n.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:m,shivCSS:n.shivCSS!==!1,supportsUnknownElements:l,shivMethods:n.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=t,j(b),"object"==typeof module&&module.exports&&(module.exports=t)}("undefined"!=typeof window?window:this,document); !function(a,b){function c(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x<style>"+b+"</style>",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=t.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=t.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),t.elements=c+" "+a,j(b)}function f(a){var b=s[a[q]];return b||(b={},r++,a[q]=r,s[r]=b),b}function g(a,c,d){if(c||(c=b),l)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():p.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||o.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),l)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return t.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(t,b.frag)}function j(a){a||(a=b);var d=f(a);return!t.shivCSS||k||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),l||i(a,d),a}var k,l,m="3.7.3-pre",n=a.html5||{},o=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,p=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,q="_html5shiv",r=0,s={};!function(){try{var a=b.createElement("a");a.innerHTML="<xyz></xyz>",k="hidden"in a,l=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){k=!0,l=!0}}();var t={elements:n.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:m,shivCSS:n.shivCSS!==!1,supportsUnknownElements:l,shivMethods:n.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=t,j(b),"object"==typeof module&&module.exports&&(module.exports=t)}("undefined"!=typeof window?window:this,document);

View File

@ -1 +1 @@
!function(n){var e={};function t(i){if(e[i])return e[i].exports;var o=e[i]={i:i,l:!1,exports:{}};return n[i].call(o.exports,o,o.exports,t),o.l=!0,o.exports}t.m=n,t.c=e,t.d=function(n,e,i){t.o(n,e)||Object.defineProperty(n,e,{enumerable:!0,get:i})},t.r=function(n){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(n,"__esModule",{value:!0})},t.t=function(n,e){if(1&e&&(n=t(n)),8&e)return n;if(4&e&&"object"==typeof n&&n&&n.__esModule)return n;var i=Object.create(null);if(t.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:n}),2&e&&"string"!=typeof n)for(var o in n)t.d(i,o,function(e){return n[e]}.bind(null,o));return i},t.n=function(n){var e=n&&n.__esModule?function(){return n.default}:function(){return n};return t.d(e,"a",e),e},t.o=function(n,e){return Object.prototype.hasOwnProperty.call(n,e)},t.p="",t(t.s=0)}([function(n,e,t){t(1),n.exports=t(3)},function(n,e,t){(function(){var e="undefined"!=typeof window?window.jQuery:t(2);n.exports.ThemeNav={navBar:null,win:null,winScroll:!1,winResize:!1,linkScroll:!1,winPosition:0,winHeight:null,docHeight:null,isRunning:!1,enable:function(n){var t=this;void 0===n&&(n=!0),t.isRunning||(t.isRunning=!0,e((function(e){t.init(e),t.reset(),t.win.on("hashchange",t.reset),n&&t.win.on("scroll",(function(){t.linkScroll||t.winScroll||(t.winScroll=!0,requestAnimationFrame((function(){t.onScroll()})))})),t.win.on("resize",(function(){t.winResize||(t.winResize=!0,requestAnimationFrame((function(){t.onResize()})))})),t.onResize()})))},enableSticky:function(){this.enable(!0)},init:function(n){n(document);var e=this;this.navBar=n("div.wy-side-scroll:first"),this.win=n(window),n(document).on("click","[data-toggle='wy-nav-top']",(function(){n("[data-toggle='wy-nav-shift']").toggleClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift")})).on("click",".wy-menu-vertical .current ul li a",(function(){var t=n(this);n("[data-toggle='wy-nav-shift']").removeClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift"),e.toggleCurrent(t),e.hashChange()})).on("click","[data-toggle='rst-current-version']",(function(){n("[data-toggle='rst-versions']").toggleClass("shift-up")})),n("table.docutils:not(.field-list,.footnote,.citation)").wrap("<div class='wy-table-responsive'></div>"),n("table.docutils.footnote").wrap("<div class='wy-table-responsive footnote'></div>"),n("table.docutils.citation").wrap("<div class='wy-table-responsive citation'></div>"),n(".wy-menu-vertical ul").not(".simple").siblings("a").each((function(){var t=n(this);expand=n('<span class="toctree-expand"></span>'),expand.on("click",(function(n){return e.toggleCurrent(t),n.stopPropagation(),!1})),t.prepend(expand)}))},reset:function(){var n=encodeURI(window.location.hash)||"#";try{var e=$(".wy-menu-vertical"),t=e.find('[href="'+n+'"]');if(0===t.length){var i=$('.document [id="'+n.substring(1)+'"]').closest("div.section");0===(t=e.find('[href="#'+i.attr("id")+'"]')).length&&(t=e.find('[href="#"]'))}t.length>0&&($(".wy-menu-vertical .current").removeClass("current"),t.addClass("current"),t.closest("li.toctree-l1").addClass("current"),t.closest("li.toctree-l1").parent().addClass("current"),t.closest("li.toctree-l1").addClass("current"),t.closest("li.toctree-l2").addClass("current"),t.closest("li.toctree-l3").addClass("current"),t.closest("li.toctree-l4").addClass("current"),t.closest("li.toctree-l5").addClass("current"),t[0].scrollIntoView())}catch(n){console.log("Error expanding nav for anchor",n)}},onScroll:function(){this.winScroll=!1;var n=this.win.scrollTop(),e=n+this.winHeight,t=this.navBar.scrollTop()+(n-this.winPosition);n<0||e>this.docHeight||(this.navBar.scrollTop(t),this.winPosition=n)},onResize:function(){this.winResize=!1,this.winHeight=this.win.height(),this.docHeight=$(document).height()},hashChange:function(){this.linkScroll=!0,this.win.one("hashchange",(function(){this.linkScroll=!1}))},toggleCurrent:function(n){var e=n.closest("li");e.siblings("li.current").removeClass("current"),e.siblings().find("li.current").removeClass("current"),e.find("> ul li.current").removeClass("current"),e.toggleClass("current")}},"undefined"!=typeof window&&(window.SphinxRtdTheme={Navigation:n.exports.ThemeNav,StickyNav:n.exports.ThemeNav}),function(){for(var n=0,e=["ms","moz","webkit","o"],t=0;t<e.length&&!window.requestAnimationFrame;++t)window.requestAnimationFrame=window[e[t]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[e[t]+"CancelAnimationFrame"]||window[e[t]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(e,t){var i=(new Date).getTime(),o=Math.max(0,16-(i-n)),r=window.setTimeout((function(){e(i+o)}),o);return n=i+o,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(n){clearTimeout(n)})}()}).call(window)},function(n,e){n.exports=jQuery},function(n,e,t){}]); !function(n){var e={};function t(i){if(e[i])return e[i].exports;var o=e[i]={i:i,l:!1,exports:{}};return n[i].call(o.exports,o,o.exports,t),o.l=!0,o.exports}t.m=n,t.c=e,t.d=function(n,e,i){t.o(n,e)||Object.defineProperty(n,e,{enumerable:!0,get:i})},t.r=function(n){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(n,"__esModule",{value:!0})},t.t=function(n,e){if(1&e&&(n=t(n)),8&e)return n;if(4&e&&"object"==typeof n&&n&&n.__esModule)return n;var i=Object.create(null);if(t.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:n}),2&e&&"string"!=typeof n)for(var o in n)t.d(i,o,function(e){return n[e]}.bind(null,o));return i},t.n=function(n){var e=n&&n.__esModule?function(){return n.default}:function(){return n};return t.d(e,"a",e),e},t.o=function(n,e){return Object.prototype.hasOwnProperty.call(n,e)},t.p="",t(t.s=0)}([function(n,e,t){t(1),n.exports=t(3)},function(n,e,t){(function(){var e="undefined"!=typeof window?window.jQuery:t(2);n.exports.ThemeNav={navBar:null,win:null,winScroll:!1,winResize:!1,linkScroll:!1,winPosition:0,winHeight:null,docHeight:null,isRunning:!1,enable:function(n){var t=this;void 0===n&&(n=!0),t.isRunning||(t.isRunning=!0,e((function(e){t.init(e),t.reset(),t.win.on("hashchange",t.reset),n&&t.win.on("scroll",(function(){t.linkScroll||t.winScroll||(t.winScroll=!0,requestAnimationFrame((function(){t.onScroll()})))})),t.win.on("resize",(function(){t.winResize||(t.winResize=!0,requestAnimationFrame((function(){t.onResize()})))})),t.onResize()})))},enableSticky:function(){this.enable(!0)},init:function(n){n(document);var e=this;this.navBar=n("div.wy-side-scroll:first"),this.win=n(window),n(document).on("click","[data-toggle='wy-nav-top']",(function(){n("[data-toggle='wy-nav-shift']").toggleClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift")})).on("click",".wy-menu-vertical .current ul li a",(function(){var t=n(this);n("[data-toggle='wy-nav-shift']").removeClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift"),e.toggleCurrent(t),e.hashChange()})).on("click","[data-toggle='rst-current-version']",(function(){n("[data-toggle='rst-versions']").toggleClass("shift-up")})),n("table.docutils:not(.field-list,.footnote,.citation)").wrap("<div class='wy-table-responsive'></div>"),n("table.docutils.footnote").wrap("<div class='wy-table-responsive footnote'></div>"),n("table.docutils.citation").wrap("<div class='wy-table-responsive citation'></div>"),n(".wy-menu-vertical ul").not(".simple").siblings("a").each((function(){var t=n(this);expand=n('<span class="toctree-expand"></span>'),expand.on("click",(function(n){return e.toggleCurrent(t),n.stopPropagation(),!1})),t.prepend(expand)}))},reset:function(){var n=encodeURI(window.location.hash)||"#";try{var e=$(".wy-menu-vertical"),t=e.find('[href="'+n+'"]');if(0===t.length){var i=$('.document [id="'+n.substring(1)+'"]').closest("div.section");0===(t=e.find('[href="#'+i.attr("id")+'"]')).length&&(t=e.find('[href="#"]'))}t.length>0&&($(".wy-menu-vertical .current").removeClass("current"),t.addClass("current"),t.closest("li.toctree-l1").addClass("current"),t.closest("li.toctree-l1").parent().addClass("current"),t.closest("li.toctree-l1").addClass("current"),t.closest("li.toctree-l2").addClass("current"),t.closest("li.toctree-l3").addClass("current"),t.closest("li.toctree-l4").addClass("current"),t.closest("li.toctree-l5").addClass("current"),t[0].scrollIntoView())}catch(n){console.log("Error expanding nav for anchor",n)}},onScroll:function(){this.winScroll=!1;var n=this.win.scrollTop(),e=n+this.winHeight,t=this.navBar.scrollTop()+(n-this.winPosition);n<0||e>this.docHeight||(this.navBar.scrollTop(t),this.winPosition=n)},onResize:function(){this.winResize=!1,this.winHeight=this.win.height(),this.docHeight=$(document).height()},hashChange:function(){this.linkScroll=!0,this.win.one("hashchange",(function(){this.linkScroll=!1}))},toggleCurrent:function(n){var e=n.closest("li");e.siblings("li.current").removeClass("current"),e.siblings().find("li.current").removeClass("current"),e.find("> ul li.current").removeClass("current"),e.toggleClass("current")}},"undefined"!=typeof window&&(window.SphinxRtdTheme={Navigation:n.exports.ThemeNav,StickyNav:n.exports.ThemeNav}),function(){for(var n=0,e=["ms","moz","webkit","o"],t=0;t<e.length&&!window.requestAnimationFrame;++t)window.requestAnimationFrame=window[e[t]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[e[t]+"CancelAnimationFrame"]||window[e[t]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(e,t){var i=(new Date).getTime(),o=Math.max(0,16-(i-n)),r=window.setTimeout((function(){e(i+o)}),o);return n=i+o,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(n){clearTimeout(n)})}()}).call(window)},function(n,e){n.exports=jQuery},function(n,e,t){}]);

View File

@ -13,7 +13,7 @@
var stopwords = ["a","and","are","as","at","be","but","by","for","if","in","into","is","it","near","no","not","of","on","or","such","that","the","their","then","there","these","they","this","to","was","will","with"]; var stopwords = ["a","and","are","as","at","be","but","by","for","if","in","into","is","it","near","no","not","of","on","or","such","that","the","their","then","there","these","they","this","to","was","will","with"];
/* Non-minified version JS is _stemmer.js if file is provided */ /* Non-minified version JS is _stemmer.js if file is provided */
/** /**
* Porter Stemmer * Porter Stemmer
*/ */
@ -293,5 +293,3 @@ function splitQuery(query) {
} }
return result; return result;
} }

View File

@ -71,4 +71,4 @@ span.linenos.special { color: #000000; background-color: #ffffc0; padding-left:
.highlight .vg { color: #bb60d5 } /* Name.Variable.Global */ .highlight .vg { color: #bb60d5 } /* Name.Variable.Global */
.highlight .vi { color: #bb60d5 } /* Name.Variable.Instance */ .highlight .vi { color: #bb60d5 } /* Name.Variable.Instance */
.highlight .vm { color: #bb60d5 } /* Name.Variable.Magic */ .highlight .vm { color: #bb60d5 } /* Name.Variable.Magic */
.highlight .il { color: #208050 } /* Literal.Number.Integer.Long */ .highlight .il { color: #208050 } /* Literal.Number.Integer.Long */

View File

@ -9,75 +9,75 @@
<meta content="Documentation, TISBackup, configuration, backup jobs" name="keywords" /> <meta content="Documentation, TISBackup, configuration, backup jobs" name="keywords" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Configuring the backup jobs &mdash; TISBackup 1.8.2 documentation</title>
<title>Configuring the backup jobs &mdash; TISBackup 1.8.2 documentation</title>
<link rel="stylesheet" href="_static/css/theme.css" type="text/css" /> <link rel="stylesheet" href="_static/css/theme.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" /> <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<link rel="stylesheet" href="_static/css/custom.css" type="text/css" /> <link rel="stylesheet" href="_static/css/custom.css" type="text/css" />
<link rel="stylesheet" href="_static/css/ribbon.css" type="text/css" /> <link rel="stylesheet" href="_static/css/ribbon.css" type="text/css" />
<link rel="stylesheet" href="_static/theme_overrides.css" type="text/css" /> <link rel="stylesheet" href="_static/theme_overrides.css" type="text/css" />
<link rel="shortcut icon" href="_static/favicon.ico"/> <link rel="shortcut icon" href="_static/favicon.ico"/>
<!--[if lt IE 9]> <!--[if lt IE 9]>
<script src="_static/js/html5shiv.min.js"></script> <script src="_static/js/html5shiv.min.js"></script>
<![endif]--> <![endif]-->
<script type="text/javascript" id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script> <script type="text/javascript" id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
<script src="_static/jquery.js"></script> <script src="_static/jquery.js"></script>
<script src="_static/underscore.js"></script> <script src="_static/underscore.js"></script>
<script src="_static/doctools.js"></script> <script src="_static/doctools.js"></script>
<script src="_static/language_data.js"></script> <script src="_static/language_data.js"></script>
<script type="text/javascript" src="_static/js/theme.js"></script> <script type="text/javascript" src="_static/js/theme.js"></script>
<link rel="index" title="Index" href="genindex.html" /> <link rel="index" title="Index" href="genindex.html" />
<link rel="search" title="Search" href="search.html" /> <link rel="search" title="Search" href="search.html" />
<link rel="next" title="Using TISBackup" href="using_tisbackup.html" /> <link rel="next" title="Using TISBackup" href="using_tisbackup.html" />
<link rel="prev" title="Installing and configuring TISBackup on Debian" href="installing_tisbackup.html" /> <link rel="prev" title="Installing and configuring TISBackup on Debian" href="installing_tisbackup.html" />
</head> </head>
<body class="wy-body-for-nav"> <body class="wy-body-for-nav">
<div class="wy-grid-for-nav"> <div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side"> <nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll"> <div class="wy-side-scroll">
<div class="wy-side-nav-search" > <div class="wy-side-nav-search" >
<a href="index.html" class="icon icon-home"> TISBackup <a href="index.html" class="icon icon-home"> TISBackup
</a> </a>
<div class="version"> <div class="version">
1.8 1.8
</div> </div>
<div role="search"> <div role="search">
<form id="rtd-search-form" class="wy-form" action="search.html" method="get"> <form id="rtd-search-form" class="wy-form" action="search.html" method="get">
<input type="text" name="q" placeholder="Search docs" /> <input type="text" name="q" placeholder="Search docs" />
@ -86,17 +86,17 @@
</form> </form>
</div> </div>
</div> </div>
<div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation"> <div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
<p><span class="caption-text">Presenting TISBackup</span></p> <p><span class="caption-text">Presenting TISBackup</span></p>
<ul class="current"> <ul class="current">
<li class="toctree-l1"><a class="reference internal" href="presenting_tisbackup.html">Technical background for TISBackup</a></li> <li class="toctree-l1"><a class="reference internal" href="presenting_tisbackup.html">Technical background for TISBackup</a></li>
@ -125,29 +125,29 @@
<li class="toctree-l1"><a class="reference internal" href="screenshots.html">Screenshots of TISBackup</a></li> <li class="toctree-l1"><a class="reference internal" href="screenshots.html">Screenshots of TISBackup</a></li>
</ul> </ul>
</div> </div>
</div> </div>
</nav> </nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"> <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
<nav class="wy-nav-top" aria-label="top navigation"> <nav class="wy-nav-top" aria-label="top navigation">
<i data-toggle="wy-nav-top" class="fa fa-bars"></i> <i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="index.html">TISBackup</a> <a href="index.html">TISBackup</a>
</nav> </nav>
<div class="wy-nav-content"> <div class="wy-nav-content">
<div class="rst-content"> <div class="rst-content">
@ -168,28 +168,28 @@
<div role="navigation" aria-label="breadcrumbs navigation"> <div role="navigation" aria-label="breadcrumbs navigation">
<ul class="wy-breadcrumbs"> <ul class="wy-breadcrumbs">
<li><a href="index.html" class="icon icon-home"></a> &raquo;</li> <li><a href="index.html" class="icon icon-home"></a> &raquo;</li>
<li>Configuring the backup jobs</li> <li>Configuring the backup jobs</li>
<li class="wy-breadcrumbs-aside"> <li class="wy-breadcrumbs-aside">
<a href="_sources/configuring_tisbackup.rst.txt" rel="nofollow"> View page source</a> <a href="_sources/configuring_tisbackup.rst.txt" rel="nofollow"> View page source</a>
</li> </li>
</ul> </ul>
<hr/> <hr/>
</div> </div>
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article"> <div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody"> <div itemprop="articleBody">
<section id="configuring-the-backup-jobs"> <section id="configuring-the-backup-jobs">
<h1>Configuring the backup jobs<a class="headerlink" href="#configuring-the-backup-jobs" title="Permalink to this headline"></a></h1> <h1>Configuring the backup jobs<a class="headerlink" href="#configuring-the-backup-jobs" title="Permalink to this headline"></a></h1>
<p id="configuring-backup-jobs">The configuration of the backups is done in an <em class="mimetype">.ini</em> file, <p id="configuring-backup-jobs">The configuration of the backups is done in an <em class="mimetype">.ini</em> file,
@ -440,7 +440,7 @@ with read-write access only for it.</p>
</div> </div>
</div> </div>
<footer> <footer>
<div class="rst-footer-buttons" role="navigation" aria-label="footer navigation"> <div class="rst-footer-buttons" role="navigation" aria-label="footer navigation">
@ -456,14 +456,14 @@ with read-write access only for it.</p>
</p> </p>
</div> </div>
Built with <a href="https://www.sphinx-doc.org/">Sphinx</a> using a Built with <a href="https://www.sphinx-doc.org/">Sphinx</a> using a
<a href="https://github.com/readthedocs/sphinx_rtd_theme">theme</a> <a href="https://github.com/readthedocs/sphinx_rtd_theme">theme</a>
provided by <a href="https://readthedocs.org">Read the Docs</a>. provided by <a href="https://readthedocs.org">Read the Docs</a>.
</footer> </footer>
</div> </div>
@ -472,7 +472,7 @@ with read-write access only for it.</p>
</section> </section>
</div> </div>
<script type="text/javascript"> <script type="text/javascript">
jQuery(function () { jQuery(function () {
@ -480,11 +480,11 @@ with read-write access only for it.</p>
}); });
</script> </script>
<!-- Global site tag (gtag.js) - Google Analytics --> <!-- Global site tag (gtag.js) - Google Analytics -->
<script async src="https://www.googletagmanager.com/gtag/js?id=UA-89790248-2"></script> <script async src="https://www.googletagmanager.com/gtag/js?id=UA-89790248-2"></script>
@ -499,4 +499,4 @@ gtag('config', 'UA-89790248-2');
</body> </body>
</html> </html>

View File

@ -5,75 +5,75 @@
<html class="writer-html5" lang="en" > <html class="writer-html5" lang="en" >
<head> <head>
<meta charset="utf-8" /> <meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Index &mdash; TISBackup 1.8.2 documentation</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Index &mdash; TISBackup 1.8.2 documentation</title>
<link rel="stylesheet" href="_static/css/theme.css" type="text/css" /> <link rel="stylesheet" href="_static/css/theme.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" /> <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<link rel="stylesheet" href="_static/css/custom.css" type="text/css" /> <link rel="stylesheet" href="_static/css/custom.css" type="text/css" />
<link rel="stylesheet" href="_static/css/ribbon.css" type="text/css" /> <link rel="stylesheet" href="_static/css/ribbon.css" type="text/css" />
<link rel="stylesheet" href="_static/theme_overrides.css" type="text/css" /> <link rel="stylesheet" href="_static/theme_overrides.css" type="text/css" />
<link rel="shortcut icon" href="_static/favicon.ico"/> <link rel="shortcut icon" href="_static/favicon.ico"/>
<!--[if lt IE 9]> <!--[if lt IE 9]>
<script src="_static/js/html5shiv.min.js"></script> <script src="_static/js/html5shiv.min.js"></script>
<![endif]--> <![endif]-->
<script type="text/javascript" id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script> <script type="text/javascript" id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
<script src="_static/jquery.js"></script> <script src="_static/jquery.js"></script>
<script src="_static/underscore.js"></script> <script src="_static/underscore.js"></script>
<script src="_static/doctools.js"></script> <script src="_static/doctools.js"></script>
<script src="_static/language_data.js"></script> <script src="_static/language_data.js"></script>
<script type="text/javascript" src="_static/js/theme.js"></script> <script type="text/javascript" src="_static/js/theme.js"></script>
<link rel="index" title="Index" href="#" /> <link rel="index" title="Index" href="#" />
<link rel="search" title="Search" href="search.html" /> <link rel="search" title="Search" href="search.html" />
</head> </head>
<body class="wy-body-for-nav"> <body class="wy-body-for-nav">
<div class="wy-grid-for-nav"> <div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side"> <nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll"> <div class="wy-side-scroll">
<div class="wy-side-nav-search" > <div class="wy-side-nav-search" >
<a href="index.html" class="icon icon-home"> TISBackup <a href="index.html" class="icon icon-home"> TISBackup
</a> </a>
<div class="version"> <div class="version">
1.8 1.8
</div> </div>
<div role="search"> <div role="search">
<form id="rtd-search-form" class="wy-form" action="search.html" method="get"> <form id="rtd-search-form" class="wy-form" action="search.html" method="get">
<input type="text" name="q" placeholder="Search docs" /> <input type="text" name="q" placeholder="Search docs" />
@ -82,17 +82,17 @@
</form> </form>
</div> </div>
</div> </div>
<div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation"> <div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
<p><span class="caption-text">Presenting TISBackup</span></p> <p><span class="caption-text">Presenting TISBackup</span></p>
<ul> <ul>
<li class="toctree-l1"><a class="reference internal" href="presenting_tisbackup.html">Technical background for TISBackup</a></li> <li class="toctree-l1"><a class="reference internal" href="presenting_tisbackup.html">Technical background for TISBackup</a></li>
@ -106,29 +106,29 @@
<li class="toctree-l1"><a class="reference internal" href="screenshots.html">Screenshots of TISBackup</a></li> <li class="toctree-l1"><a class="reference internal" href="screenshots.html">Screenshots of TISBackup</a></li>
</ul> </ul>
</div> </div>
</div> </div>
</nav> </nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"> <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
<nav class="wy-nav-top" aria-label="top navigation"> <nav class="wy-nav-top" aria-label="top navigation">
<i data-toggle="wy-nav-top" class="fa fa-bars"></i> <i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="index.html">TISBackup</a> <a href="index.html">TISBackup</a>
</nav> </nav>
<div class="wy-nav-content"> <div class="wy-nav-content">
<div class="rst-content"> <div class="rst-content">
@ -149,36 +149,36 @@
<div role="navigation" aria-label="breadcrumbs navigation"> <div role="navigation" aria-label="breadcrumbs navigation">
<ul class="wy-breadcrumbs"> <ul class="wy-breadcrumbs">
<li><a href="index.html" class="icon icon-home"></a> &raquo;</li> <li><a href="index.html" class="icon icon-home"></a> &raquo;</li>
<li>Index</li> <li>Index</li>
<li class="wy-breadcrumbs-aside"> <li class="wy-breadcrumbs-aside">
</li> </li>
</ul> </ul>
<hr/> <hr/>
</div> </div>
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article"> <div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody"> <div itemprop="articleBody">
<h1 id="index">Index</h1> <h1 id="index">Index</h1>
<div class="genindex-jumpbox"> <div class="genindex-jumpbox">
</div> </div>
</div> </div>
</div> </div>
<footer> <footer>
@ -190,14 +190,14 @@
</p> </p>
</div> </div>
Built with <a href="https://www.sphinx-doc.org/">Sphinx</a> using a Built with <a href="https://www.sphinx-doc.org/">Sphinx</a> using a
<a href="https://github.com/readthedocs/sphinx_rtd_theme">theme</a> <a href="https://github.com/readthedocs/sphinx_rtd_theme">theme</a>
provided by <a href="https://readthedocs.org">Read the Docs</a>. provided by <a href="https://readthedocs.org">Read the Docs</a>.
</footer> </footer>
</div> </div>
@ -206,7 +206,7 @@
</section> </section>
</div> </div>
<script type="text/javascript"> <script type="text/javascript">
jQuery(function () { jQuery(function () {
@ -214,11 +214,11 @@
}); });
</script> </script>
<!-- Global site tag (gtag.js) - Google Analytics --> <!-- Global site tag (gtag.js) - Google Analytics -->
<script async src="https://www.googletagmanager.com/gtag/js?id=UA-89790248-2"></script> <script async src="https://www.googletagmanager.com/gtag/js?id=UA-89790248-2"></script>
@ -233,4 +233,4 @@ gtag('config', 'UA-89790248-2');
</body> </body>
</html> </html>

View File

@ -9,74 +9,74 @@
<meta content="Documentation, TISBackup, introduction, welcome page, Welcome" name="keywords" /> <meta content="Documentation, TISBackup, introduction, welcome page, Welcome" name="keywords" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Presenting TISBackup &mdash; TISBackup 1.8.2 documentation</title>
<title>Presenting TISBackup &mdash; TISBackup 1.8.2 documentation</title>
<link rel="stylesheet" href="_static/css/theme.css" type="text/css" /> <link rel="stylesheet" href="_static/css/theme.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" /> <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<link rel="stylesheet" href="_static/css/custom.css" type="text/css" /> <link rel="stylesheet" href="_static/css/custom.css" type="text/css" />
<link rel="stylesheet" href="_static/css/ribbon.css" type="text/css" /> <link rel="stylesheet" href="_static/css/ribbon.css" type="text/css" />
<link rel="stylesheet" href="_static/theme_overrides.css" type="text/css" /> <link rel="stylesheet" href="_static/theme_overrides.css" type="text/css" />
<link rel="shortcut icon" href="_static/favicon.ico"/> <link rel="shortcut icon" href="_static/favicon.ico"/>
<!--[if lt IE 9]> <!--[if lt IE 9]>
<script src="_static/js/html5shiv.min.js"></script> <script src="_static/js/html5shiv.min.js"></script>
<![endif]--> <![endif]-->
<script type="text/javascript" id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script> <script type="text/javascript" id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
<script src="_static/jquery.js"></script> <script src="_static/jquery.js"></script>
<script src="_static/underscore.js"></script> <script src="_static/underscore.js"></script>
<script src="_static/doctools.js"></script> <script src="_static/doctools.js"></script>
<script src="_static/language_data.js"></script> <script src="_static/language_data.js"></script>
<script type="text/javascript" src="_static/js/theme.js"></script> <script type="text/javascript" src="_static/js/theme.js"></script>
<link rel="index" title="Index" href="genindex.html" /> <link rel="index" title="Index" href="genindex.html" />
<link rel="search" title="Search" href="search.html" /> <link rel="search" title="Search" href="search.html" />
<link rel="next" title="Technical background for TISBackup" href="presenting_tisbackup.html" /> <link rel="next" title="Technical background for TISBackup" href="presenting_tisbackup.html" />
</head> </head>
<body class="wy-body-for-nav"> <body class="wy-body-for-nav">
<div class="wy-grid-for-nav"> <div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side"> <nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll"> <div class="wy-side-scroll">
<div class="wy-side-nav-search" > <div class="wy-side-nav-search" >
<a href="#" class="icon icon-home"> TISBackup <a href="#" class="icon icon-home"> TISBackup
</a> </a>
<div class="version"> <div class="version">
1.8 1.8
</div> </div>
<div role="search"> <div role="search">
<form id="rtd-search-form" class="wy-form" action="search.html" method="get"> <form id="rtd-search-form" class="wy-form" action="search.html" method="get">
<input type="text" name="q" placeholder="Search docs" /> <input type="text" name="q" placeholder="Search docs" />
@ -85,17 +85,17 @@
</form> </form>
</div> </div>
</div> </div>
<div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation"> <div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
<p><span class="caption-text">Presenting TISBackup</span></p> <p><span class="caption-text">Presenting TISBackup</span></p>
<ul> <ul>
<li class="toctree-l1"><a class="reference internal" href="presenting_tisbackup.html">Technical background for TISBackup</a></li> <li class="toctree-l1"><a class="reference internal" href="presenting_tisbackup.html">Technical background for TISBackup</a></li>
@ -109,29 +109,29 @@
<li class="toctree-l1"><a class="reference internal" href="screenshots.html">Screenshots of TISBackup</a></li> <li class="toctree-l1"><a class="reference internal" href="screenshots.html">Screenshots of TISBackup</a></li>
</ul> </ul>
</div> </div>
</div> </div>
</nav> </nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"> <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
<nav class="wy-nav-top" aria-label="top navigation"> <nav class="wy-nav-top" aria-label="top navigation">
<i data-toggle="wy-nav-top" class="fa fa-bars"></i> <i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="#">TISBackup</a> <a href="#">TISBackup</a>
</nav> </nav>
<div class="wy-nav-content"> <div class="wy-nav-content">
<div class="rst-content"> <div class="rst-content">
@ -152,28 +152,28 @@
<div role="navigation" aria-label="breadcrumbs navigation"> <div role="navigation" aria-label="breadcrumbs navigation">
<ul class="wy-breadcrumbs"> <ul class="wy-breadcrumbs">
<li><a href="#" class="icon icon-home"></a> &raquo;</li> <li><a href="#" class="icon icon-home"></a> &raquo;</li>
<li>Presenting TISBackup</li> <li>Presenting TISBackup</li>
<li class="wy-breadcrumbs-aside"> <li class="wy-breadcrumbs-aside">
<a href="_sources/index.rst.txt" rel="nofollow"> View page source</a> <a href="_sources/index.rst.txt" rel="nofollow"> View page source</a>
</li> </li>
</ul> </ul>
<hr/> <hr/>
</div> </div>
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article"> <div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody"> <div itemprop="articleBody">
<figure class="align-center"> <figure class="align-center">
<a class="reference internal image-reference" href="_images/tisbackup_logo.png"><img alt="TISBackup Logo" src="_images/tisbackup_logo.png" style="width: 700.0px; height: 206.0px;" /></a> <a class="reference internal image-reference" href="_images/tisbackup_logo.png"><img alt="TISBackup Logo" src="_images/tisbackup_logo.png" style="width: 700.0px; height: 206.0px;" /></a>
</figure> </figure>
@ -275,7 +275,7 @@ if there is a problem during the backup.</p></li>
</div> </div>
</div> </div>
<footer> <footer>
<div class="rst-footer-buttons" role="navigation" aria-label="footer navigation"> <div class="rst-footer-buttons" role="navigation" aria-label="footer navigation">
@ -290,14 +290,14 @@ if there is a problem during the backup.</p></li>
</p> </p>
</div> </div>
Built with <a href="https://www.sphinx-doc.org/">Sphinx</a> using a Built with <a href="https://www.sphinx-doc.org/">Sphinx</a> using a
<a href="https://github.com/readthedocs/sphinx_rtd_theme">theme</a> <a href="https://github.com/readthedocs/sphinx_rtd_theme">theme</a>
provided by <a href="https://readthedocs.org">Read the Docs</a>. provided by <a href="https://readthedocs.org">Read the Docs</a>.
</footer> </footer>
</div> </div>
@ -306,7 +306,7 @@ if there is a problem during the backup.</p></li>
</section> </section>
</div> </div>
<script type="text/javascript"> <script type="text/javascript">
jQuery(function () { jQuery(function () {
@ -314,11 +314,11 @@ if there is a problem during the backup.</p></li>
}); });
</script> </script>
<!-- Global site tag (gtag.js) - Google Analytics --> <!-- Global site tag (gtag.js) - Google Analytics -->
<script async src="https://www.googletagmanager.com/gtag/js?id=UA-89790248-2"></script> <script async src="https://www.googletagmanager.com/gtag/js?id=UA-89790248-2"></script>
@ -333,4 +333,4 @@ gtag('config', 'UA-89790248-2');
</body> </body>
</html> </html>

View File

@ -9,75 +9,75 @@
<meta content="Documentation, TISBackup, installation, configuration" name="keywords" /> <meta content="Documentation, TISBackup, installation, configuration" name="keywords" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Installing and configuring TISBackup on Debian &mdash; TISBackup 1.8.2 documentation</title>
<title>Installing and configuring TISBackup on Debian &mdash; TISBackup 1.8.2 documentation</title>
<link rel="stylesheet" href="_static/css/theme.css" type="text/css" /> <link rel="stylesheet" href="_static/css/theme.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" /> <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<link rel="stylesheet" href="_static/css/custom.css" type="text/css" /> <link rel="stylesheet" href="_static/css/custom.css" type="text/css" />
<link rel="stylesheet" href="_static/css/ribbon.css" type="text/css" /> <link rel="stylesheet" href="_static/css/ribbon.css" type="text/css" />
<link rel="stylesheet" href="_static/theme_overrides.css" type="text/css" /> <link rel="stylesheet" href="_static/theme_overrides.css" type="text/css" />
<link rel="shortcut icon" href="_static/favicon.ico"/> <link rel="shortcut icon" href="_static/favicon.ico"/>
<!--[if lt IE 9]> <!--[if lt IE 9]>
<script src="_static/js/html5shiv.min.js"></script> <script src="_static/js/html5shiv.min.js"></script>
<![endif]--> <![endif]-->
<script type="text/javascript" id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script> <script type="text/javascript" id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
<script src="_static/jquery.js"></script> <script src="_static/jquery.js"></script>
<script src="_static/underscore.js"></script> <script src="_static/underscore.js"></script>
<script src="_static/doctools.js"></script> <script src="_static/doctools.js"></script>
<script src="_static/language_data.js"></script> <script src="_static/language_data.js"></script>
<script type="text/javascript" src="_static/js/theme.js"></script> <script type="text/javascript" src="_static/js/theme.js"></script>
<link rel="index" title="Index" href="genindex.html" /> <link rel="index" title="Index" href="genindex.html" />
<link rel="search" title="Search" href="search.html" /> <link rel="search" title="Search" href="search.html" />
<link rel="next" title="Configuring the backup jobs" href="configuring_tisbackup.html" /> <link rel="next" title="Configuring the backup jobs" href="configuring_tisbackup.html" />
<link rel="prev" title="Technical background for TISBackup" href="presenting_tisbackup.html" /> <link rel="prev" title="Technical background for TISBackup" href="presenting_tisbackup.html" />
</head> </head>
<body class="wy-body-for-nav"> <body class="wy-body-for-nav">
<div class="wy-grid-for-nav"> <div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side"> <nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll"> <div class="wy-side-scroll">
<div class="wy-side-nav-search" > <div class="wy-side-nav-search" >
<a href="index.html" class="icon icon-home"> TISBackup <a href="index.html" class="icon icon-home"> TISBackup
</a> </a>
<div class="version"> <div class="version">
1.8 1.8
</div> </div>
<div role="search"> <div role="search">
<form id="rtd-search-form" class="wy-form" action="search.html" method="get"> <form id="rtd-search-form" class="wy-form" action="search.html" method="get">
<input type="text" name="q" placeholder="Search docs" /> <input type="text" name="q" placeholder="Search docs" />
@ -86,17 +86,17 @@
</form> </form>
</div> </div>
</div> </div>
<div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation"> <div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
<p><span class="caption-text">Presenting TISBackup</span></p> <p><span class="caption-text">Presenting TISBackup</span></p>
<ul class="current"> <ul class="current">
<li class="toctree-l1"><a class="reference internal" href="presenting_tisbackup.html">Technical background for TISBackup</a></li> <li class="toctree-l1"><a class="reference internal" href="presenting_tisbackup.html">Technical background for TISBackup</a></li>
@ -123,29 +123,29 @@
<li class="toctree-l1"><a class="reference internal" href="screenshots.html">Screenshots of TISBackup</a></li> <li class="toctree-l1"><a class="reference internal" href="screenshots.html">Screenshots of TISBackup</a></li>
</ul> </ul>
</div> </div>
</div> </div>
</nav> </nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"> <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
<nav class="wy-nav-top" aria-label="top navigation"> <nav class="wy-nav-top" aria-label="top navigation">
<i data-toggle="wy-nav-top" class="fa fa-bars"></i> <i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="index.html">TISBackup</a> <a href="index.html">TISBackup</a>
</nav> </nav>
<div class="wy-nav-content"> <div class="wy-nav-content">
<div class="rst-content"> <div class="rst-content">
@ -166,28 +166,28 @@
<div role="navigation" aria-label="breadcrumbs navigation"> <div role="navigation" aria-label="breadcrumbs navigation">
<ul class="wy-breadcrumbs"> <ul class="wy-breadcrumbs">
<li><a href="index.html" class="icon icon-home"></a> &raquo;</li> <li><a href="index.html" class="icon icon-home"></a> &raquo;</li>
<li>Installing and configuring TISBackup on Debian</li> <li>Installing and configuring TISBackup on Debian</li>
<li class="wy-breadcrumbs-aside"> <li class="wy-breadcrumbs-aside">
<a href="_sources/installing_tisbackup.rst.txt" rel="nofollow"> View page source</a> <a href="_sources/installing_tisbackup.rst.txt" rel="nofollow"> View page source</a>
</li> </li>
</ul> </ul>
<hr/> <hr/>
</div> </div>
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article"> <div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody"> <div itemprop="articleBody">
<section id="installing-and-configuring-tisbackup-on-debian"> <section id="installing-and-configuring-tisbackup-on-debian">
<h1>Installing and configuring TISBackup on Debian<a class="headerlink" href="#installing-and-configuring-tisbackup-on-debian" title="Permalink to this headline"></a></h1> <h1>Installing and configuring TISBackup on Debian<a class="headerlink" href="#installing-and-configuring-tisbackup-on-debian" title="Permalink to this headline"></a></h1>
<section id="setting-up-the-gnu-linux-debian-server"> <section id="setting-up-the-gnu-linux-debian-server">
@ -423,7 +423,7 @@ of your TISBackup server on port 8080.</p>
</div> </div>
</div> </div>
<footer> <footer>
<div class="rst-footer-buttons" role="navigation" aria-label="footer navigation"> <div class="rst-footer-buttons" role="navigation" aria-label="footer navigation">
@ -439,14 +439,14 @@ of your TISBackup server on port 8080.</p>
</p> </p>
</div> </div>
Built with <a href="https://www.sphinx-doc.org/">Sphinx</a> using a Built with <a href="https://www.sphinx-doc.org/">Sphinx</a> using a
<a href="https://github.com/readthedocs/sphinx_rtd_theme">theme</a> <a href="https://github.com/readthedocs/sphinx_rtd_theme">theme</a>
provided by <a href="https://readthedocs.org">Read the Docs</a>. provided by <a href="https://readthedocs.org">Read the Docs</a>.
</footer> </footer>
</div> </div>
@ -455,7 +455,7 @@ of your TISBackup server on port 8080.</p>
</section> </section>
</div> </div>
<script type="text/javascript"> <script type="text/javascript">
jQuery(function () { jQuery(function () {
@ -463,11 +463,11 @@ of your TISBackup server on port 8080.</p>
}); });
</script> </script>
<!-- Global site tag (gtag.js) - Google Analytics --> <!-- Global site tag (gtag.js) - Google Analytics -->
<script async src="https://www.googletagmanager.com/gtag/js?id=UA-89790248-2"></script> <script async src="https://www.googletagmanager.com/gtag/js?id=UA-89790248-2"></script>
@ -482,4 +482,4 @@ gtag('config', 'UA-89790248-2');
</body> </body>
</html> </html>

View File

@ -9,75 +9,75 @@
<meta content="Documentation, TISBackup, technical background" name="keywords" /> <meta content="Documentation, TISBackup, technical background" name="keywords" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Technical background for TISBackup &mdash; TISBackup 1.8.2 documentation</title>
<title>Technical background for TISBackup &mdash; TISBackup 1.8.2 documentation</title>
<link rel="stylesheet" href="_static/css/theme.css" type="text/css" /> <link rel="stylesheet" href="_static/css/theme.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" /> <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<link rel="stylesheet" href="_static/css/custom.css" type="text/css" /> <link rel="stylesheet" href="_static/css/custom.css" type="text/css" />
<link rel="stylesheet" href="_static/css/ribbon.css" type="text/css" /> <link rel="stylesheet" href="_static/css/ribbon.css" type="text/css" />
<link rel="stylesheet" href="_static/theme_overrides.css" type="text/css" /> <link rel="stylesheet" href="_static/theme_overrides.css" type="text/css" />
<link rel="shortcut icon" href="_static/favicon.ico"/> <link rel="shortcut icon" href="_static/favicon.ico"/>
<!--[if lt IE 9]> <!--[if lt IE 9]>
<script src="_static/js/html5shiv.min.js"></script> <script src="_static/js/html5shiv.min.js"></script>
<![endif]--> <![endif]-->
<script type="text/javascript" id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script> <script type="text/javascript" id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
<script src="_static/jquery.js"></script> <script src="_static/jquery.js"></script>
<script src="_static/underscore.js"></script> <script src="_static/underscore.js"></script>
<script src="_static/doctools.js"></script> <script src="_static/doctools.js"></script>
<script src="_static/language_data.js"></script> <script src="_static/language_data.js"></script>
<script type="text/javascript" src="_static/js/theme.js"></script> <script type="text/javascript" src="_static/js/theme.js"></script>
<link rel="index" title="Index" href="genindex.html" /> <link rel="index" title="Index" href="genindex.html" />
<link rel="search" title="Search" href="search.html" /> <link rel="search" title="Search" href="search.html" />
<link rel="next" title="Installing and configuring TISBackup on Debian" href="installing_tisbackup.html" /> <link rel="next" title="Installing and configuring TISBackup on Debian" href="installing_tisbackup.html" />
<link rel="prev" title="Presenting TISBackup" href="index.html" /> <link rel="prev" title="Presenting TISBackup" href="index.html" />
</head> </head>
<body class="wy-body-for-nav"> <body class="wy-body-for-nav">
<div class="wy-grid-for-nav"> <div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side"> <nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll"> <div class="wy-side-scroll">
<div class="wy-side-nav-search" > <div class="wy-side-nav-search" >
<a href="index.html" class="icon icon-home"> TISBackup <a href="index.html" class="icon icon-home"> TISBackup
</a> </a>
<div class="version"> <div class="version">
1.8 1.8
</div> </div>
<div role="search"> <div role="search">
<form id="rtd-search-form" class="wy-form" action="search.html" method="get"> <form id="rtd-search-form" class="wy-form" action="search.html" method="get">
<input type="text" name="q" placeholder="Search docs" /> <input type="text" name="q" placeholder="Search docs" />
@ -86,17 +86,17 @@
</form> </form>
</div> </div>
</div> </div>
<div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation"> <div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
<p><span class="caption-text">Presenting TISBackup</span></p> <p><span class="caption-text">Presenting TISBackup</span></p>
<ul class="current"> <ul class="current">
<li class="toctree-l1 current"><a class="current reference internal" href="#">Technical background for TISBackup</a><ul> <li class="toctree-l1 current"><a class="current reference internal" href="#">Technical background for TISBackup</a><ul>
@ -116,29 +116,29 @@
<li class="toctree-l1"><a class="reference internal" href="screenshots.html">Screenshots of TISBackup</a></li> <li class="toctree-l1"><a class="reference internal" href="screenshots.html">Screenshots of TISBackup</a></li>
</ul> </ul>
</div> </div>
</div> </div>
</nav> </nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"> <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
<nav class="wy-nav-top" aria-label="top navigation"> <nav class="wy-nav-top" aria-label="top navigation">
<i data-toggle="wy-nav-top" class="fa fa-bars"></i> <i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="index.html">TISBackup</a> <a href="index.html">TISBackup</a>
</nav> </nav>
<div class="wy-nav-content"> <div class="wy-nav-content">
<div class="rst-content"> <div class="rst-content">
@ -159,28 +159,28 @@
<div role="navigation" aria-label="breadcrumbs navigation"> <div role="navigation" aria-label="breadcrumbs navigation">
<ul class="wy-breadcrumbs"> <ul class="wy-breadcrumbs">
<li><a href="index.html" class="icon icon-home"></a> &raquo;</li> <li><a href="index.html" class="icon icon-home"></a> &raquo;</li>
<li>Technical background for TISBackup</li> <li>Technical background for TISBackup</li>
<li class="wy-breadcrumbs-aside"> <li class="wy-breadcrumbs-aside">
<a href="_sources/presenting_tisbackup.rst.txt" rel="nofollow"> View page source</a> <a href="_sources/presenting_tisbackup.rst.txt" rel="nofollow"> View page source</a>
</li> </li>
</ul> </ul>
<hr/> <hr/>
</div> </div>
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article"> <div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody"> <div itemprop="articleBody">
<section id="technical-background-for-tisbackup"> <section id="technical-background-for-tisbackup">
<h1>Technical background for TISBackup<a class="headerlink" href="#technical-background-for-tisbackup" title="Permalink to this headline"></a></h1> <h1>Technical background for TISBackup<a class="headerlink" href="#technical-background-for-tisbackup" title="Permalink to this headline"></a></h1>
<p>The deduplication of this solution is based on the hardlinks <p>The deduplication of this solution is based on the hardlinks
@ -274,7 +274,7 @@ and <a class="reference internal" href="installing_tisbackup.html#base-debian-se
</div> </div>
</div> </div>
<footer> <footer>
<div class="rst-footer-buttons" role="navigation" aria-label="footer navigation"> <div class="rst-footer-buttons" role="navigation" aria-label="footer navigation">
@ -290,14 +290,14 @@ and <a class="reference internal" href="installing_tisbackup.html#base-debian-se
</p> </p>
</div> </div>
Built with <a href="https://www.sphinx-doc.org/">Sphinx</a> using a Built with <a href="https://www.sphinx-doc.org/">Sphinx</a> using a
<a href="https://github.com/readthedocs/sphinx_rtd_theme">theme</a> <a href="https://github.com/readthedocs/sphinx_rtd_theme">theme</a>
provided by <a href="https://readthedocs.org">Read the Docs</a>. provided by <a href="https://readthedocs.org">Read the Docs</a>.
</footer> </footer>
</div> </div>
@ -306,7 +306,7 @@ and <a class="reference internal" href="installing_tisbackup.html#base-debian-se
</section> </section>
</div> </div>
<script type="text/javascript"> <script type="text/javascript">
jQuery(function () { jQuery(function () {
@ -314,11 +314,11 @@ and <a class="reference internal" href="installing_tisbackup.html#base-debian-se
}); });
</script> </script>
<!-- Global site tag (gtag.js) - Google Analytics --> <!-- Global site tag (gtag.js) - Google Analytics -->
<script async src="https://www.googletagmanager.com/gtag/js?id=UA-89790248-2"></script> <script async src="https://www.googletagmanager.com/gtag/js?id=UA-89790248-2"></script>
@ -333,4 +333,4 @@ gtag('config', 'UA-89790248-2');
</body> </body>
</html> </html>

View File

@ -9,74 +9,74 @@
<meta content="Documentation, TISBackup, screenshots" name="keywords" /> <meta content="Documentation, TISBackup, screenshots" name="keywords" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Screenshots of TISBackup &mdash; TISBackup 1.8.2 documentation</title>
<title>Screenshots of TISBackup &mdash; TISBackup 1.8.2 documentation</title>
<link rel="stylesheet" href="_static/css/theme.css" type="text/css" /> <link rel="stylesheet" href="_static/css/theme.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" /> <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<link rel="stylesheet" href="_static/css/custom.css" type="text/css" /> <link rel="stylesheet" href="_static/css/custom.css" type="text/css" />
<link rel="stylesheet" href="_static/css/ribbon.css" type="text/css" /> <link rel="stylesheet" href="_static/css/ribbon.css" type="text/css" />
<link rel="stylesheet" href="_static/theme_overrides.css" type="text/css" /> <link rel="stylesheet" href="_static/theme_overrides.css" type="text/css" />
<link rel="shortcut icon" href="_static/favicon.ico"/> <link rel="shortcut icon" href="_static/favicon.ico"/>
<!--[if lt IE 9]> <!--[if lt IE 9]>
<script src="_static/js/html5shiv.min.js"></script> <script src="_static/js/html5shiv.min.js"></script>
<![endif]--> <![endif]-->
<script type="text/javascript" id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script> <script type="text/javascript" id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
<script src="_static/jquery.js"></script> <script src="_static/jquery.js"></script>
<script src="_static/underscore.js"></script> <script src="_static/underscore.js"></script>
<script src="_static/doctools.js"></script> <script src="_static/doctools.js"></script>
<script src="_static/language_data.js"></script> <script src="_static/language_data.js"></script>
<script type="text/javascript" src="_static/js/theme.js"></script> <script type="text/javascript" src="_static/js/theme.js"></script>
<link rel="index" title="Index" href="genindex.html" /> <link rel="index" title="Index" href="genindex.html" />
<link rel="search" title="Search" href="search.html" /> <link rel="search" title="Search" href="search.html" />
<link rel="prev" title="Contacting Tranquil IT" href="tranquil-it-contacts.html" /> <link rel="prev" title="Contacting Tranquil IT" href="tranquil-it-contacts.html" />
</head> </head>
<body class="wy-body-for-nav"> <body class="wy-body-for-nav">
<div class="wy-grid-for-nav"> <div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side"> <nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll"> <div class="wy-side-scroll">
<div class="wy-side-nav-search" > <div class="wy-side-nav-search" >
<a href="index.html" class="icon icon-home"> TISBackup <a href="index.html" class="icon icon-home"> TISBackup
</a> </a>
<div class="version"> <div class="version">
1.8 1.8
</div> </div>
<div role="search"> <div role="search">
<form id="rtd-search-form" class="wy-form" action="search.html" method="get"> <form id="rtd-search-form" class="wy-form" action="search.html" method="get">
<input type="text" name="q" placeholder="Search docs" /> <input type="text" name="q" placeholder="Search docs" />
@ -85,17 +85,17 @@
</form> </form>
</div> </div>
</div> </div>
<div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation"> <div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
<p><span class="caption-text">Presenting TISBackup</span></p> <p><span class="caption-text">Presenting TISBackup</span></p>
<ul> <ul>
<li class="toctree-l1"><a class="reference internal" href="presenting_tisbackup.html">Technical background for TISBackup</a></li> <li class="toctree-l1"><a class="reference internal" href="presenting_tisbackup.html">Technical background for TISBackup</a></li>
@ -109,29 +109,29 @@
<li class="toctree-l1 current"><a class="current reference internal" href="#">Screenshots of TISBackup</a></li> <li class="toctree-l1 current"><a class="current reference internal" href="#">Screenshots of TISBackup</a></li>
</ul> </ul>
</div> </div>
</div> </div>
</nav> </nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"> <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
<nav class="wy-nav-top" aria-label="top navigation"> <nav class="wy-nav-top" aria-label="top navigation">
<i data-toggle="wy-nav-top" class="fa fa-bars"></i> <i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="index.html">TISBackup</a> <a href="index.html">TISBackup</a>
</nav> </nav>
<div class="wy-nav-content"> <div class="wy-nav-content">
<div class="rst-content"> <div class="rst-content">
@ -152,28 +152,28 @@
<div role="navigation" aria-label="breadcrumbs navigation"> <div role="navigation" aria-label="breadcrumbs navigation">
<ul class="wy-breadcrumbs"> <ul class="wy-breadcrumbs">
<li><a href="index.html" class="icon icon-home"></a> &raquo;</li> <li><a href="index.html" class="icon icon-home"></a> &raquo;</li>
<li>Screenshots of TISBackup</li> <li>Screenshots of TISBackup</li>
<li class="wy-breadcrumbs-aside"> <li class="wy-breadcrumbs-aside">
<a href="_sources/screenshots.rst.txt" rel="nofollow"> View page source</a> <a href="_sources/screenshots.rst.txt" rel="nofollow"> View page source</a>
</li> </li>
</ul> </ul>
<hr/> <hr/>
</div> </div>
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article"> <div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody"> <div itemprop="articleBody">
<section id="screenshots-of-tisbackup"> <section id="screenshots-of-tisbackup">
<h1>Screenshots of TISBackup<a class="headerlink" href="#screenshots-of-tisbackup" title="Permalink to this headline"></a></h1> <h1>Screenshots of TISBackup<a class="headerlink" href="#screenshots-of-tisbackup" title="Permalink to this headline"></a></h1>
<figure class="align-center" id="id1"> <figure class="align-center" id="id1">
@ -222,7 +222,7 @@
</div> </div>
</div> </div>
<footer> <footer>
<div class="rst-footer-buttons" role="navigation" aria-label="footer navigation"> <div class="rst-footer-buttons" role="navigation" aria-label="footer navigation">
@ -237,14 +237,14 @@
</p> </p>
</div> </div>
Built with <a href="https://www.sphinx-doc.org/">Sphinx</a> using a Built with <a href="https://www.sphinx-doc.org/">Sphinx</a> using a
<a href="https://github.com/readthedocs/sphinx_rtd_theme">theme</a> <a href="https://github.com/readthedocs/sphinx_rtd_theme">theme</a>
provided by <a href="https://readthedocs.org">Read the Docs</a>. provided by <a href="https://readthedocs.org">Read the Docs</a>.
</footer> </footer>
</div> </div>
@ -253,7 +253,7 @@
</section> </section>
</div> </div>
<script type="text/javascript"> <script type="text/javascript">
jQuery(function () { jQuery(function () {
@ -261,11 +261,11 @@
}); });
</script> </script>
<!-- Global site tag (gtag.js) - Google Analytics --> <!-- Global site tag (gtag.js) - Google Analytics -->
<script async src="https://www.googletagmanager.com/gtag/js?id=UA-89790248-2"></script> <script async src="https://www.googletagmanager.com/gtag/js?id=UA-89790248-2"></script>
@ -280,4 +280,4 @@ gtag('config', 'UA-89790248-2');
</body> </body>
</html> </html>

View File

@ -4,78 +4,78 @@
<html class="writer-html5" lang="en" > <html class="writer-html5" lang="en" >
<head> <head>
<meta charset="utf-8" /> <meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Search &mdash; TISBackup 1.8.2 documentation</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Search &mdash; TISBackup 1.8.2 documentation</title>
<link rel="stylesheet" href="_static/css/theme.css" type="text/css" /> <link rel="stylesheet" href="_static/css/theme.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" /> <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<link rel="stylesheet" href="_static/css/custom.css" type="text/css" /> <link rel="stylesheet" href="_static/css/custom.css" type="text/css" />
<link rel="stylesheet" href="_static/css/ribbon.css" type="text/css" /> <link rel="stylesheet" href="_static/css/ribbon.css" type="text/css" />
<link rel="stylesheet" href="_static/theme_overrides.css" type="text/css" /> <link rel="stylesheet" href="_static/theme_overrides.css" type="text/css" />
<link rel="shortcut icon" href="_static/favicon.ico"/> <link rel="shortcut icon" href="_static/favicon.ico"/>
<!--[if lt IE 9]> <!--[if lt IE 9]>
<script src="_static/js/html5shiv.min.js"></script> <script src="_static/js/html5shiv.min.js"></script>
<![endif]--> <![endif]-->
<script type="text/javascript" id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script> <script type="text/javascript" id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
<script src="_static/jquery.js"></script> <script src="_static/jquery.js"></script>
<script src="_static/underscore.js"></script> <script src="_static/underscore.js"></script>
<script src="_static/doctools.js"></script> <script src="_static/doctools.js"></script>
<script src="_static/language_data.js"></script> <script src="_static/language_data.js"></script>
<script type="text/javascript" src="_static/js/theme.js"></script> <script type="text/javascript" src="_static/js/theme.js"></script>
<script type="text/javascript" src="_static/searchtools.js"></script> <script type="text/javascript" src="_static/searchtools.js"></script>
<script type="text/javascript" src="_static/language_data.js"></script> <script type="text/javascript" src="_static/language_data.js"></script>
<link rel="index" title="Index" href="genindex.html" /> <link rel="index" title="Index" href="genindex.html" />
<link rel="search" title="Search" href="#" /> <link rel="search" title="Search" href="#" />
</head> </head>
<body class="wy-body-for-nav"> <body class="wy-body-for-nav">
<div class="wy-grid-for-nav"> <div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side"> <nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll"> <div class="wy-side-scroll">
<div class="wy-side-nav-search" > <div class="wy-side-nav-search" >
<a href="index.html" class="icon icon-home"> TISBackup <a href="index.html" class="icon icon-home"> TISBackup
</a> </a>
<div class="version"> <div class="version">
1.8 1.8
</div> </div>
<div role="search"> <div role="search">
<form id="rtd-search-form" class="wy-form" action="#" method="get"> <form id="rtd-search-form" class="wy-form" action="#" method="get">
<input type="text" name="q" placeholder="Search docs" /> <input type="text" name="q" placeholder="Search docs" />
@ -84,17 +84,17 @@
</form> </form>
</div> </div>
</div> </div>
<div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation"> <div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
<p><span class="caption-text">Presenting TISBackup</span></p> <p><span class="caption-text">Presenting TISBackup</span></p>
<ul> <ul>
<li class="toctree-l1"><a class="reference internal" href="presenting_tisbackup.html">Technical background for TISBackup</a></li> <li class="toctree-l1"><a class="reference internal" href="presenting_tisbackup.html">Technical background for TISBackup</a></li>
@ -108,29 +108,29 @@
<li class="toctree-l1"><a class="reference internal" href="screenshots.html">Screenshots of TISBackup</a></li> <li class="toctree-l1"><a class="reference internal" href="screenshots.html">Screenshots of TISBackup</a></li>
</ul> </ul>
</div> </div>
</div> </div>
</nav> </nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"> <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
<nav class="wy-nav-top" aria-label="top navigation"> <nav class="wy-nav-top" aria-label="top navigation">
<i data-toggle="wy-nav-top" class="fa fa-bars"></i> <i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="index.html">TISBackup</a> <a href="index.html">TISBackup</a>
</nav> </nav>
<div class="wy-nav-content"> <div class="wy-nav-content">
<div class="rst-content"> <div class="rst-content">
@ -151,24 +151,24 @@
<div role="navigation" aria-label="breadcrumbs navigation"> <div role="navigation" aria-label="breadcrumbs navigation">
<ul class="wy-breadcrumbs"> <ul class="wy-breadcrumbs">
<li><a href="index.html" class="icon icon-home"></a> &raquo;</li> <li><a href="index.html" class="icon icon-home"></a> &raquo;</li>
<li>Search</li> <li>Search</li>
<li class="wy-breadcrumbs-aside"> <li class="wy-breadcrumbs-aside">
</li> </li>
</ul> </ul>
<hr/> <hr/>
</div> </div>
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article"> <div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody"> <div itemprop="articleBody">
<noscript> <noscript>
<div id="fallback" class="admonition warning"> <div id="fallback" class="admonition warning">
<p class="last"> <p class="last">
@ -177,13 +177,13 @@
</div> </div>
</noscript> </noscript>
<div id="search-results"> <div id="search-results">
</div> </div>
</div> </div>
</div> </div>
<footer> <footer>
@ -195,14 +195,14 @@
</p> </p>
</div> </div>
Built with <a href="https://www.sphinx-doc.org/">Sphinx</a> using a Built with <a href="https://www.sphinx-doc.org/">Sphinx</a> using a
<a href="https://github.com/readthedocs/sphinx_rtd_theme">theme</a> <a href="https://github.com/readthedocs/sphinx_rtd_theme">theme</a>
provided by <a href="https://readthedocs.org">Read the Docs</a>. provided by <a href="https://readthedocs.org">Read the Docs</a>.
</footer> </footer>
</div> </div>
@ -211,7 +211,7 @@
</section> </section>
</div> </div>
<script type="text/javascript"> <script type="text/javascript">
jQuery(function () { jQuery(function () {
@ -219,17 +219,17 @@
}); });
</script> </script>
<script type="text/javascript"> <script type="text/javascript">
jQuery(function() { Search.loadIndex("searchindex.js"); }); jQuery(function() { Search.loadIndex("searchindex.js"); });
</script> </script>
<script type="text/javascript" id="searchindexloader"></script> <script type="text/javascript" id="searchindexloader"></script>
<!-- Global site tag (gtag.js) - Google Analytics --> <!-- Global site tag (gtag.js) - Google Analytics -->
<script async src="https://www.googletagmanager.com/gtag/js?id=UA-89790248-2"></script> <script async src="https://www.googletagmanager.com/gtag/js?id=UA-89790248-2"></script>
@ -245,4 +245,4 @@ gtag('config', 'UA-89790248-2');
</body> </body>
</html> </html>

File diff suppressed because one or more lines are too long

View File

@ -9,75 +9,75 @@
<meta content="TISBackup, documentation, website, editor, Twitter, official website" name="keywords" /> <meta content="TISBackup, documentation, website, editor, Twitter, official website" name="keywords" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Contacting Tranquil IT &mdash; TISBackup 1.8.2 documentation</title>
<title>Contacting Tranquil IT &mdash; TISBackup 1.8.2 documentation</title>
<link rel="stylesheet" href="_static/css/theme.css" type="text/css" /> <link rel="stylesheet" href="_static/css/theme.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" /> <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<link rel="stylesheet" href="_static/css/custom.css" type="text/css" /> <link rel="stylesheet" href="_static/css/custom.css" type="text/css" />
<link rel="stylesheet" href="_static/css/ribbon.css" type="text/css" /> <link rel="stylesheet" href="_static/css/ribbon.css" type="text/css" />
<link rel="stylesheet" href="_static/theme_overrides.css" type="text/css" /> <link rel="stylesheet" href="_static/theme_overrides.css" type="text/css" />
<link rel="shortcut icon" href="_static/favicon.ico"/> <link rel="shortcut icon" href="_static/favicon.ico"/>
<!--[if lt IE 9]> <!--[if lt IE 9]>
<script src="_static/js/html5shiv.min.js"></script> <script src="_static/js/html5shiv.min.js"></script>
<![endif]--> <![endif]-->
<script type="text/javascript" id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script> <script type="text/javascript" id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
<script src="_static/jquery.js"></script> <script src="_static/jquery.js"></script>
<script src="_static/underscore.js"></script> <script src="_static/underscore.js"></script>
<script src="_static/doctools.js"></script> <script src="_static/doctools.js"></script>
<script src="_static/language_data.js"></script> <script src="_static/language_data.js"></script>
<script type="text/javascript" src="_static/js/theme.js"></script> <script type="text/javascript" src="_static/js/theme.js"></script>
<link rel="index" title="Index" href="genindex.html" /> <link rel="index" title="Index" href="genindex.html" />
<link rel="search" title="Search" href="search.html" /> <link rel="search" title="Search" href="search.html" />
<link rel="next" title="Screenshots of TISBackup" href="screenshots.html" /> <link rel="next" title="Screenshots of TISBackup" href="screenshots.html" />
<link rel="prev" title="Using TISBackup" href="using_tisbackup.html" /> <link rel="prev" title="Using TISBackup" href="using_tisbackup.html" />
</head> </head>
<body class="wy-body-for-nav"> <body class="wy-body-for-nav">
<div class="wy-grid-for-nav"> <div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side"> <nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll"> <div class="wy-side-scroll">
<div class="wy-side-nav-search" > <div class="wy-side-nav-search" >
<a href="index.html" class="icon icon-home"> TISBackup <a href="index.html" class="icon icon-home"> TISBackup
</a> </a>
<div class="version"> <div class="version">
1.8 1.8
</div> </div>
<div role="search"> <div role="search">
<form id="rtd-search-form" class="wy-form" action="search.html" method="get"> <form id="rtd-search-form" class="wy-form" action="search.html" method="get">
<input type="text" name="q" placeholder="Search docs" /> <input type="text" name="q" placeholder="Search docs" />
@ -86,17 +86,17 @@
</form> </form>
</div> </div>
</div> </div>
<div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation"> <div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
<p><span class="caption-text">Presenting TISBackup</span></p> <p><span class="caption-text">Presenting TISBackup</span></p>
<ul> <ul>
<li class="toctree-l1"><a class="reference internal" href="presenting_tisbackup.html">Technical background for TISBackup</a></li> <li class="toctree-l1"><a class="reference internal" href="presenting_tisbackup.html">Technical background for TISBackup</a></li>
@ -110,29 +110,29 @@
<li class="toctree-l1"><a class="reference internal" href="screenshots.html">Screenshots of TISBackup</a></li> <li class="toctree-l1"><a class="reference internal" href="screenshots.html">Screenshots of TISBackup</a></li>
</ul> </ul>
</div> </div>
</div> </div>
</nav> </nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"> <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
<nav class="wy-nav-top" aria-label="top navigation"> <nav class="wy-nav-top" aria-label="top navigation">
<i data-toggle="wy-nav-top" class="fa fa-bars"></i> <i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="index.html">TISBackup</a> <a href="index.html">TISBackup</a>
</nav> </nav>
<div class="wy-nav-content"> <div class="wy-nav-content">
<div class="rst-content"> <div class="rst-content">
@ -153,28 +153,28 @@
<div role="navigation" aria-label="breadcrumbs navigation"> <div role="navigation" aria-label="breadcrumbs navigation">
<ul class="wy-breadcrumbs"> <ul class="wy-breadcrumbs">
<li><a href="index.html" class="icon icon-home"></a> &raquo;</li> <li><a href="index.html" class="icon icon-home"></a> &raquo;</li>
<li>Contacting Tranquil IT</li> <li>Contacting Tranquil IT</li>
<li class="wy-breadcrumbs-aside"> <li class="wy-breadcrumbs-aside">
<a href="_sources/tranquil-it-contacts.rst.txt" rel="nofollow"> View page source</a> <a href="_sources/tranquil-it-contacts.rst.txt" rel="nofollow"> View page source</a>
</li> </li>
</ul> </ul>
<hr/> <hr/>
</div> </div>
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article"> <div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody"> <div itemprop="articleBody">
<section id="contacting-tranquil-it"> <section id="contacting-tranquil-it">
<span id="contact-tranquil-it"></span><h1>Contacting Tranquil IT<a class="headerlink" href="#contacting-tranquil-it" title="Permalink to this headline"></a></h1> <span id="contact-tranquil-it"></span><h1>Contacting Tranquil IT<a class="headerlink" href="#contacting-tranquil-it" title="Permalink to this headline"></a></h1>
<ul class="simple"> <ul class="simple">
@ -185,7 +185,7 @@
</div> </div>
</div> </div>
<footer> <footer>
<div class="rst-footer-buttons" role="navigation" aria-label="footer navigation"> <div class="rst-footer-buttons" role="navigation" aria-label="footer navigation">
@ -201,14 +201,14 @@
</p> </p>
</div> </div>
Built with <a href="https://www.sphinx-doc.org/">Sphinx</a> using a Built with <a href="https://www.sphinx-doc.org/">Sphinx</a> using a
<a href="https://github.com/readthedocs/sphinx_rtd_theme">theme</a> <a href="https://github.com/readthedocs/sphinx_rtd_theme">theme</a>
provided by <a href="https://readthedocs.org">Read the Docs</a>. provided by <a href="https://readthedocs.org">Read the Docs</a>.
</footer> </footer>
</div> </div>
@ -217,7 +217,7 @@
</section> </section>
</div> </div>
<script type="text/javascript"> <script type="text/javascript">
jQuery(function () { jQuery(function () {
@ -225,11 +225,11 @@
}); });
</script> </script>
<!-- Global site tag (gtag.js) - Google Analytics --> <!-- Global site tag (gtag.js) - Google Analytics -->
<script async src="https://www.googletagmanager.com/gtag/js?id=UA-89790248-2"></script> <script async src="https://www.googletagmanager.com/gtag/js?id=UA-89790248-2"></script>
@ -244,4 +244,4 @@ gtag('config', 'UA-89790248-2');
</body> </body>
</html> </html>

View File

@ -9,75 +9,75 @@
<meta content="Documentation, TISBackup, usage, options, exporting" name="keywords" /> <meta content="Documentation, TISBackup, usage, options, exporting" name="keywords" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Using TISBackup &mdash; TISBackup 1.8.2 documentation</title>
<title>Using TISBackup &mdash; TISBackup 1.8.2 documentation</title>
<link rel="stylesheet" href="_static/css/theme.css" type="text/css" /> <link rel="stylesheet" href="_static/css/theme.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" /> <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<link rel="stylesheet" href="_static/css/custom.css" type="text/css" /> <link rel="stylesheet" href="_static/css/custom.css" type="text/css" />
<link rel="stylesheet" href="_static/css/ribbon.css" type="text/css" /> <link rel="stylesheet" href="_static/css/ribbon.css" type="text/css" />
<link rel="stylesheet" href="_static/theme_overrides.css" type="text/css" /> <link rel="stylesheet" href="_static/theme_overrides.css" type="text/css" />
<link rel="shortcut icon" href="_static/favicon.ico"/> <link rel="shortcut icon" href="_static/favicon.ico"/>
<!--[if lt IE 9]> <!--[if lt IE 9]>
<script src="_static/js/html5shiv.min.js"></script> <script src="_static/js/html5shiv.min.js"></script>
<![endif]--> <![endif]-->
<script type="text/javascript" id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script> <script type="text/javascript" id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
<script src="_static/jquery.js"></script> <script src="_static/jquery.js"></script>
<script src="_static/underscore.js"></script> <script src="_static/underscore.js"></script>
<script src="_static/doctools.js"></script> <script src="_static/doctools.js"></script>
<script src="_static/language_data.js"></script> <script src="_static/language_data.js"></script>
<script type="text/javascript" src="_static/js/theme.js"></script> <script type="text/javascript" src="_static/js/theme.js"></script>
<link rel="index" title="Index" href="genindex.html" /> <link rel="index" title="Index" href="genindex.html" />
<link rel="search" title="Search" href="search.html" /> <link rel="search" title="Search" href="search.html" />
<link rel="next" title="Contacting Tranquil IT" href="tranquil-it-contacts.html" /> <link rel="next" title="Contacting Tranquil IT" href="tranquil-it-contacts.html" />
<link rel="prev" title="Configuring the backup jobs" href="configuring_tisbackup.html" /> <link rel="prev" title="Configuring the backup jobs" href="configuring_tisbackup.html" />
</head> </head>
<body class="wy-body-for-nav"> <body class="wy-body-for-nav">
<div class="wy-grid-for-nav"> <div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side"> <nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll"> <div class="wy-side-scroll">
<div class="wy-side-nav-search" > <div class="wy-side-nav-search" >
<a href="index.html" class="icon icon-home"> TISBackup <a href="index.html" class="icon icon-home"> TISBackup
</a> </a>
<div class="version"> <div class="version">
1.8 1.8
</div> </div>
<div role="search"> <div role="search">
<form id="rtd-search-form" class="wy-form" action="search.html" method="get"> <form id="rtd-search-form" class="wy-form" action="search.html" method="get">
<input type="text" name="q" placeholder="Search docs" /> <input type="text" name="q" placeholder="Search docs" />
@ -86,17 +86,17 @@
</form> </form>
</div> </div>
</div> </div>
<div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation"> <div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
<p><span class="caption-text">Presenting TISBackup</span></p> <p><span class="caption-text">Presenting TISBackup</span></p>
<ul class="current"> <ul class="current">
<li class="toctree-l1"><a class="reference internal" href="presenting_tisbackup.html">Technical background for TISBackup</a></li> <li class="toctree-l1"><a class="reference internal" href="presenting_tisbackup.html">Technical background for TISBackup</a></li>
@ -113,29 +113,29 @@
<li class="toctree-l1"><a class="reference internal" href="screenshots.html">Screenshots of TISBackup</a></li> <li class="toctree-l1"><a class="reference internal" href="screenshots.html">Screenshots of TISBackup</a></li>
</ul> </ul>
</div> </div>
</div> </div>
</nav> </nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"> <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
<nav class="wy-nav-top" aria-label="top navigation"> <nav class="wy-nav-top" aria-label="top navigation">
<i data-toggle="wy-nav-top" class="fa fa-bars"></i> <i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="index.html">TISBackup</a> <a href="index.html">TISBackup</a>
</nav> </nav>
<div class="wy-nav-content"> <div class="wy-nav-content">
<div class="rst-content"> <div class="rst-content">
@ -156,28 +156,28 @@
<div role="navigation" aria-label="breadcrumbs navigation"> <div role="navigation" aria-label="breadcrumbs navigation">
<ul class="wy-breadcrumbs"> <ul class="wy-breadcrumbs">
<li><a href="index.html" class="icon icon-home"></a> &raquo;</li> <li><a href="index.html" class="icon icon-home"></a> &raquo;</li>
<li>Using TISBackup</li> <li>Using TISBackup</li>
<li class="wy-breadcrumbs-aside"> <li class="wy-breadcrumbs-aside">
<a href="_sources/using_tisbackup.rst.txt" rel="nofollow"> View page source</a> <a href="_sources/using_tisbackup.rst.txt" rel="nofollow"> View page source</a>
</li> </li>
</ul> </ul>
<hr/> <hr/>
</div> </div>
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article"> <div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody"> <div itemprop="articleBody">
<section id="using-tisbackup"> <section id="using-tisbackup">
<h1>Using TISBackup<a class="headerlink" href="#using-tisbackup" title="Permalink to this headline"></a></h1> <h1>Using TISBackup<a class="headerlink" href="#using-tisbackup" title="Permalink to this headline"></a></h1>
<p id="id1">As seen in the <a class="reference internal" href="installing_tisbackup.html#install-tisbackup-debian"><span class="std std-ref">section on installing TISbackup</span></a>, <p id="id1">As seen in the <a class="reference internal" href="installing_tisbackup.html#install-tisbackup-debian"><span class="std std-ref">section on installing TISbackup</span></a>,
@ -291,7 +291,7 @@ e2label /dev/xvdc1 tisbackup
</div> </div>
</div> </div>
<footer> <footer>
<div class="rst-footer-buttons" role="navigation" aria-label="footer navigation"> <div class="rst-footer-buttons" role="navigation" aria-label="footer navigation">
@ -307,14 +307,14 @@ e2label /dev/xvdc1 tisbackup
</p> </p>
</div> </div>
Built with <a href="https://www.sphinx-doc.org/">Sphinx</a> using a Built with <a href="https://www.sphinx-doc.org/">Sphinx</a> using a
<a href="https://github.com/readthedocs/sphinx_rtd_theme">theme</a> <a href="https://github.com/readthedocs/sphinx_rtd_theme">theme</a>
provided by <a href="https://readthedocs.org">Read the Docs</a>. provided by <a href="https://readthedocs.org">Read the Docs</a>.
</footer> </footer>
</div> </div>
@ -323,7 +323,7 @@ e2label /dev/xvdc1 tisbackup
</section> </section>
</div> </div>
<script type="text/javascript"> <script type="text/javascript">
jQuery(function () { jQuery(function () {
@ -331,11 +331,11 @@ e2label /dev/xvdc1 tisbackup
}); });
</script> </script>
<!-- Global site tag (gtag.js) - Google Analytics --> <!-- Global site tag (gtag.js) - Google Analytics -->
<script async src="https://www.googletagmanager.com/gtag/js?id=UA-89790248-2"></script> <script async src="https://www.googletagmanager.com/gtag/js?id=UA-89790248-2"></script>
@ -350,4 +350,4 @@ gtag('config', 'UA-89790248-2');
</body> </body>
</html> </html>

View File

@ -5,4 +5,3 @@ env >> /etc/environment
# execute CMD # execute CMD
echo "$@" echo "$@"
exec "$@" exec "$@"

View File

@ -15,4 +15,3 @@
# along with TISBackup. If not, see <http://www.gnu.org/licenses/>. # along with TISBackup. If not, see <http://www.gnu.org/licenses/>.
# #
# ----------------------------------------------------------------------- # -----------------------------------------------------------------------

View File

@ -25,10 +25,10 @@ from .common import *
class backup_null(backup_generic): class backup_null(backup_generic):
"""Null backup to register servers which don't need any backups """Null backup to register servers which don't need any backups
but we still want to know they are taken in account""" but we still want to know they are taken in account"""
type = 'null' type = 'null'
required_params = ['type','server_name','backup_name'] required_params = ['type','server_name','backup_name']
optional_params = [] optional_params = []
@ -44,9 +44,8 @@ class backup_null(backup_generic):
return {} return {}
def checknagios(self,maxage_hours=30): def checknagios(self,maxage_hours=30):
return (nagiosStateOk,"No backups needs to be performed") return (nagiosStateOk,"No backups needs to be performed")
register_driver(backup_null) register_driver(backup_null)
if __name__=='__main__': if __name__=='__main__':
pass pass

View File

@ -38,7 +38,7 @@ from libtisbackup.common import *
class backup_oracle(backup_generic): class backup_oracle(backup_generic):
"""Backup a oracle database as zipped file through ssh""" """Backup a oracle database as zipped file through ssh"""
type = 'oracle+ssh' type = 'oracle+ssh'
required_params = backup_generic.required_params + ['db_name','private_key', 'userid'] required_params = backup_generic.required_params + ['db_name','private_key', 'userid']
optional_params = ['username', 'remote_backup_dir', 'ignore_error_oracle_code'] optional_params = ['username', 'remote_backup_dir', 'ignore_error_oracle_code']
db_name='' db_name=''
@ -47,7 +47,7 @@ class backup_oracle(backup_generic):
ignore_error_oracle_code = [ ] ignore_error_oracle_code = [ ]
def do_backup(self,stats): def do_backup(self,stats):
self.logger.debug('[%s] Connecting to %s with user %s and key %s',self.backup_name,self.server_name,self.username,self.private_key) self.logger.debug('[%s] Connecting to %s with user %s and key %s',self.backup_name,self.server_name,self.username,self.private_key)
try: try:
mykey = paramiko.RSAKey.from_private_key_file(self.private_key) mykey = paramiko.RSAKey.from_private_key_file(self.private_key)
@ -57,8 +57,8 @@ class backup_oracle(backup_generic):
self.ssh = paramiko.SSHClient() self.ssh = paramiko.SSHClient()
self.ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) self.ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
self.ssh.connect(self.server_name,username=self.username,pkey = mykey,port=self.ssh_port) self.ssh.connect(self.server_name,username=self.username,pkey = mykey,port=self.ssh_port)
t = datetime.datetime.now() t = datetime.datetime.now()
self.backup_start_date = t.strftime('%Y%m%d-%Hh%Mm%S') self.backup_start_date = t.strftime('%Y%m%d-%Hh%Mm%S')
dumpfile= self.remote_backup_dir + '/' + self.db_name + '_' + self.backup_start_date+'.dmp' dumpfile= self.remote_backup_dir + '/' + self.db_name + '_' + self.backup_start_date+'.dmp'
@ -71,10 +71,10 @@ class backup_oracle(backup_generic):
else: else:
print(('mkdir "%s"' % self.dest_dir)) print(('mkdir "%s"' % self.dest_dir))
else: else:
raise Exception('backup destination directory already exists : %s' % self.dest_dir) raise Exception('backup destination directory already exists : %s' % self.dest_dir)
# dump db # dump db
stats['status']='Dumping' stats['status']='Dumping'
cmd = "exp '%s' file='%s' grants=y log='%s'"% (self.userid,dumpfile, dumplog) cmd = "exp '%s' file='%s' grants=y log='%s'"% (self.userid,dumpfile, dumplog)
self.logger.debug('[%s] Dump DB : %s',self.backup_name,cmd) self.logger.debug('[%s] Dump DB : %s',self.backup_name,cmd)
if not self.dry_run: if not self.dry_run:
(error_code,output) = ssh_exec(cmd,ssh=self.ssh) (error_code,output) = ssh_exec(cmd,ssh=self.ssh)
@ -97,7 +97,7 @@ class backup_oracle(backup_generic):
# zip the file # zip the file
stats['status']='Zipping' stats['status']='Zipping'
cmd = 'gzip %s' % dumpfile cmd = 'gzip %s' % dumpfile
self.logger.debug('[%s] Compress backup : %s',self.backup_name,cmd) self.logger.debug('[%s] Compress backup : %s',self.backup_name,cmd)
if not self.dry_run: if not self.dry_run:
(error_code,output) = ssh_exec(cmd,ssh=self.ssh) (error_code,output) = ssh_exec(cmd,ssh=self.ssh)
@ -120,7 +120,7 @@ class backup_oracle(backup_generic):
stats['total_files_count']=1 stats['total_files_count']=1
stats['written_files_count']=1 stats['written_files_count']=1
stats['total_bytes']=os.stat(localpath).st_size stats['total_bytes']=os.stat(localpath).st_size
stats['written_bytes']=os.stat(localpath).st_size stats['written_bytes']=os.stat(localpath).st_size
stats['log']='gzip dump of DB %s:%s (%d bytes) to %s' % (self.server_name,self.db_name, stats['written_bytes'], localpath) stats['log']='gzip dump of DB %s:%s (%d bytes) to %s' % (self.server_name,self.db_name, stats['written_bytes'], localpath)
stats['backup_location'] = self.dest_dir stats['backup_location'] = self.dest_dir
stats['status']='RMTemp' stats['status']='RMTemp'
@ -134,7 +134,7 @@ class backup_oracle(backup_generic):
filelist = os.listdir(self.backup_dir) filelist = os.listdir(self.backup_dir)
filelist.sort() filelist.sort()
p = re.compile('^\d{8,8}-\d{2,2}h\d{2,2}m\d{2,2}$') p = re.compile('^\d{8,8}-\d{2,2}h\d{2,2}m\d{2,2}$')
for item in filelist: for item in filelist:
if p.match(item): if p.match(item):
dir_name = os.path.join(self.backup_dir,item) dir_name = os.path.join(self.backup_dir,item)

View File

@ -30,7 +30,7 @@ from libtisbackup.common import *
class backup_rsync(backup_generic): class backup_rsync(backup_generic):
"""Backup a directory on remote server with rsync and rsync protocol (requires running remote rsync daemon)""" """Backup a directory on remote server with rsync and rsync protocol (requires running remote rsync daemon)"""
type = 'rsync' type = 'rsync'
required_params = backup_generic.required_params + ['remote_user','remote_dir','rsync_module','password_file'] required_params = backup_generic.required_params + ['remote_user','remote_dir','rsync_module','password_file']
optional_params = backup_generic.optional_params + ['compressionlevel','compression','bwlimit','exclude_list','protect_args','overload_args'] optional_params = backup_generic.optional_params + ['compressionlevel','compression','bwlimit','exclude_list','protect_args','overload_args']
@ -46,7 +46,7 @@ class backup_rsync(backup_generic):
overload_args = None overload_args = None
compressionlevel = 0 compressionlevel = 0
def read_config(self,iniconf): def read_config(self,iniconf):
assert(isinstance(iniconf,ConfigParser)) assert(isinstance(iniconf,ConfigParser))
@ -54,7 +54,7 @@ class backup_rsync(backup_generic):
if not self.bwlimit and iniconf.has_option('global','bw_limit'): if not self.bwlimit and iniconf.has_option('global','bw_limit'):
self.bwlimit = iniconf.getint('global','bw_limit') self.bwlimit = iniconf.getint('global','bw_limit')
if not self.compressionlevel and iniconf.has_option('global','compression_level'): if not self.compressionlevel and iniconf.has_option('global','compression_level'):
self.compressionlevel = iniconf.getint('global','compression_level') self.compressionlevel = iniconf.getint('global','compression_level')
def do_backup(self,stats): def do_backup(self,stats):
if not self.set_lock(): if not self.set_lock():
@ -216,7 +216,7 @@ class backup_rsync(backup_generic):
raise raise
finally: finally:
self.remove_lock() self.remove_lock()
def get_latest_backup(self,current): def get_latest_backup(self,current):
@ -225,8 +225,8 @@ class backup_rsync(backup_generic):
filelist.sort() filelist.sort()
filelist.reverse() filelist.reverse()
full = '' full = ''
r_full = re.compile('^\d{8,8}-\d{2,2}h\d{2,2}m\d{2,2}$') r_full = re.compile('^\d{8,8}-\d{2,2}h\d{2,2}m\d{2,2}$')
r_partial = re.compile('^\d{8,8}-\d{2,2}h\d{2,2}m\d{2,2}.rsync$') r_partial = re.compile('^\d{8,8}-\d{2,2}h\d{2,2}m\d{2,2}.rsync$')
# we take all latest partials younger than the latest full and the latest full # we take all latest partials younger than the latest full and the latest full
for item in filelist: for item in filelist:
if r_partial.match(item) and item<current: if r_partial.match(item) and item<current:
@ -245,7 +245,7 @@ class backup_rsync(backup_generic):
filelist = os.listdir(self.backup_dir) filelist = os.listdir(self.backup_dir)
filelist.sort() filelist.sort()
p = re.compile('^\d{8,8}-\d{2,2}h\d{2,2}m\d{2,2}$') p = re.compile('^\d{8,8}-\d{2,2}h\d{2,2}m\d{2,2}$')
for item in filelist: for item in filelist:
if p.match(item): if p.match(item):
dir_name = os.path.join(self.backup_dir,item) dir_name = os.path.join(self.backup_dir,item)
@ -288,7 +288,7 @@ class backup_rsync(backup_generic):
return False return False
else: else:
self.logger.info("[" + self.backup_name + "] incorrrect lock file : no pid line") self.logger.info("[" + self.backup_name + "] incorrrect lock file : no pid line")
return False return False
def set_lock(self): def set_lock(self):
@ -317,7 +317,7 @@ class backup_rsync(backup_generic):
class backup_rsync_ssh(backup_rsync): class backup_rsync_ssh(backup_rsync):
"""Backup a directory on remote server with rsync and ssh protocol (requires rsync software on remote host)""" """Backup a directory on remote server with rsync and ssh protocol (requires rsync software on remote host)"""
type = 'rsync+ssh' type = 'rsync+ssh'
required_params = backup_generic.required_params + ['remote_user','remote_dir','private_key'] required_params = backup_generic.required_params + ['remote_user','remote_dir','private_key']
optional_params = backup_generic.optional_params + ['compression','bwlimit','ssh_port','exclude_list','protect_args','overload_args', 'cipher_spec'] optional_params = backup_generic.optional_params + ['compression','bwlimit','ssh_port','exclude_list','protect_args','overload_args', 'cipher_spec']
cipher_spec = '' cipher_spec = ''
@ -341,4 +341,3 @@ if __name__=='__main__':
b.read_config(cp) b.read_config(cp)
b.process_backup() b.process_backup()
print((b.checknagios())) print((b.checknagios()))

View File

@ -30,7 +30,7 @@ from .common import *
class backup_rsync_btrfs(backup_generic): class backup_rsync_btrfs(backup_generic):
"""Backup a directory on remote server with rsync and btrfs protocol (requires running remote rsync daemon)""" """Backup a directory on remote server with rsync and btrfs protocol (requires running remote rsync daemon)"""
type = 'rsync+btrfs' type = 'rsync+btrfs'
required_params = backup_generic.required_params + ['remote_user','remote_dir','rsync_module','password_file'] required_params = backup_generic.required_params + ['remote_user','remote_dir','rsync_module','password_file']
optional_params = backup_generic.optional_params + ['compressionlevel','compression','bwlimit','exclude_list','protect_args','overload_args'] optional_params = backup_generic.optional_params + ['compressionlevel','compression','bwlimit','exclude_list','protect_args','overload_args']
@ -46,7 +46,7 @@ class backup_rsync_btrfs(backup_generic):
overload_args = None overload_args = None
compressionlevel = 0 compressionlevel = 0
def read_config(self,iniconf): def read_config(self,iniconf):
assert(isinstance(iniconf,ConfigParser)) assert(isinstance(iniconf,ConfigParser))
@ -54,7 +54,7 @@ class backup_rsync_btrfs(backup_generic):
if not self.bwlimit and iniconf.has_option('global','bw_limit'): if not self.bwlimit and iniconf.has_option('global','bw_limit'):
self.bwlimit = iniconf.getint('global','bw_limit') self.bwlimit = iniconf.getint('global','bw_limit')
if not self.compressionlevel and iniconf.has_option('global','compression_level'): if not self.compressionlevel and iniconf.has_option('global','compression_level'):
self.compressionlevel = iniconf.getint('global','compression_level') self.compressionlevel = iniconf.getint('global','compression_level')
def do_backup(self,stats): def do_backup(self,stats):
if not self.set_lock(): if not self.set_lock():
@ -73,7 +73,7 @@ class backup_rsync_btrfs(backup_generic):
returncode = process.returncode returncode = process.returncode
if (returncode != 0): if (returncode != 0):
self.logger.error("[" + self.backup_name + "] shell program exited with error code: %s"%log) self.logger.error("[" + self.backup_name + "] shell program exited with error code: %s"%log)
raise Exception("[" + self.backup_name + "] shell program exited with error code " + str(returncode), cmd) raise Exception("[" + self.backup_name + "] shell program exited with error code " + str(returncode), cmd)
else: else:
self.logger.info("[" + self.backup_name + "] create btrs volume: %s"%dest_dir) self.logger.info("[" + self.backup_name + "] create btrs volume: %s"%dest_dir)
else: else:
@ -234,7 +234,7 @@ class backup_rsync_btrfs(backup_generic):
raise raise
finally: finally:
self.remove_lock() self.remove_lock()
def get_latest_backup(self,current): def get_latest_backup(self,current):
@ -243,8 +243,8 @@ class backup_rsync_btrfs(backup_generic):
filelist.sort() filelist.sort()
filelist.reverse() filelist.reverse()
full = '' full = ''
r_full = re.compile('^\d{8,8}-\d{2,2}h\d{2,2}m\d{2,2}$') r_full = re.compile('^\d{8,8}-\d{2,2}h\d{2,2}m\d{2,2}$')
r_partial = re.compile('^\d{8,8}-\d{2,2}h\d{2,2}m\d{2,2}.rsync$') r_partial = re.compile('^\d{8,8}-\d{2,2}h\d{2,2}m\d{2,2}.rsync$')
# we take all latest partials younger than the latest full and the latest full # we take all latest partials younger than the latest full and the latest full
for item in filelist: for item in filelist:
if r_partial.match(item) and item<current: if r_partial.match(item) and item<current:
@ -262,7 +262,7 @@ class backup_rsync_btrfs(backup_generic):
filelist = os.listdir(self.backup_dir) filelist = os.listdir(self.backup_dir)
filelist.sort() filelist.sort()
p = re.compile('^\d{8,8}-\d{2,2}h\d{2,2}m\d{2,2}$') p = re.compile('^\d{8,8}-\d{2,2}h\d{2,2}m\d{2,2}$')
for item in filelist: for item in filelist:
if p.match(item): if p.match(item):
dir_name = os.path.join(self.backup_dir,item) dir_name = os.path.join(self.backup_dir,item)
@ -305,7 +305,7 @@ class backup_rsync_btrfs(backup_generic):
return False return False
else: else:
self.logger.info("[" + self.backup_name + "] incorrrect lock file : no pid line") self.logger.info("[" + self.backup_name + "] incorrrect lock file : no pid line")
return False return False
def set_lock(self): def set_lock(self):
@ -334,7 +334,7 @@ class backup_rsync_btrfs(backup_generic):
class backup_rsync__btrfs_ssh(backup_rsync_btrfs): class backup_rsync__btrfs_ssh(backup_rsync_btrfs):
"""Backup a directory on remote server with rsync,ssh and btrfs protocol (requires rsync software on remote host)""" """Backup a directory on remote server with rsync,ssh and btrfs protocol (requires rsync software on remote host)"""
type = 'rsync+btrfs+ssh' type = 'rsync+btrfs+ssh'
required_params = backup_generic.required_params + ['remote_user','remote_dir','private_key'] required_params = backup_generic.required_params + ['remote_user','remote_dir','private_key']
optional_params = backup_generic.optional_params + ['compression','bwlimit','ssh_port','exclude_list','protect_args','overload_args','cipher_spec'] optional_params = backup_generic.optional_params + ['compression','bwlimit','ssh_port','exclude_list','protect_args','overload_args','cipher_spec']
cipher_spec = '' cipher_spec = ''
@ -358,4 +358,3 @@ if __name__=='__main__':
b.read_config(cp) b.read_config(cp)
b.process_backup() b.process_backup()
print((b.checknagios())) print((b.checknagios()))

View File

@ -165,4 +165,4 @@ class backup_samba4(backup_generic):
self.logger.info('Skipping %s, already registered',dir_name) self.logger.info('Skipping %s, already registered',dir_name)
register_driver(backup_samba4) register_driver(backup_samba4)

View File

@ -152,7 +152,7 @@ class backup_switch(backup_generic):
else: else:
child.sendline(self.switch_user) child.sendline(self.switch_user)
child.expect(".*#") child.expect(".*#")
child.sendline( "terminal datadump") child.sendline( "terminal datadump")
child.expect("#") child.expect("#")
child.sendline( "show startup-config") child.sendline( "show startup-config")
@ -262,4 +262,3 @@ if __name__=='__main__':
cp.read('/opt/tisbackup/configtest.ini') cp.read('/opt/tisbackup/configtest.ini')
b = backup_xva() b = backup_xva()
b.read_config(cp) b.read_config(cp)

View File

@ -59,15 +59,15 @@ class backup_vmdk(backup_generic):
cookie_text = " " + cookie_value + "; $" + cookie_path cookie_text = " " + cookie_value + "; $" + cookie_path
# Make a cookie # Make a cookie
cookie = dict() cookie = dict()
cookie[cookie_name] = cookie_text cookie[cookie_name] = cookie_text
return cookie return cookie
def download_file(self,url, local_filename, cookie, headers): def download_file(self,url, local_filename, cookie, headers):
r = requests.get(url, stream=True, headers=headers,cookies=cookie,verify=False) r = requests.get(url, stream=True, headers=headers,cookies=cookie,verify=False)
with open(local_filename, 'wb') as f: with open(local_filename, 'wb') as f:
for chunk in r.iter_content(chunk_size=1024*1024*64): for chunk in r.iter_content(chunk_size=1024*1024*64):
if chunk: if chunk:
f.write(chunk) f.write(chunk)
f.flush() f.flush()
return local_filename return local_filename
@ -78,7 +78,7 @@ class backup_vmdk(backup_generic):
try: try:
infos = HttpNfcLease.info infos = HttpNfcLease.info
device_urls = infos.deviceUrl device_urls = infos.deviceUrl
vmdks = [] vmdks = []
for device_url in device_urls: for device_url in device_urls:
deviceId = device_url.key deviceId = device_url.key
deviceUrlStr = device_url.url deviceUrlStr = device_url.url
@ -89,7 +89,7 @@ class backup_vmdk(backup_generic):
cookie = self.make_compatible_cookie(si._stub.cookie) cookie = self.make_compatible_cookie(si._stub.cookie)
headers = {'Content-Type': 'application/octet-stream'} headers = {'Content-Type': 'application/octet-stream'}
self.logger.debug("[%s] exporting disk: %s" %(self.server_name,diskFileName)) self.logger.debug("[%s] exporting disk: %s" %(self.server_name,diskFileName))
self.download_file(diskUrlStr, diskFileName, cookie, headers) self.download_file(diskUrlStr, diskFileName, cookie, headers)
vmdks.append({"filename":diskFileName,"id":deviceId}) vmdks.append({"filename":diskFileName,"id":deviceId})
finally: finally:
@ -99,8 +99,8 @@ class backup_vmdk(backup_generic):
def create_ovf(self,vm,vmdks): def create_ovf(self,vm,vmdks):
ovfDescParams = vim.OvfManager.CreateDescriptorParams() ovfDescParams = vim.OvfManager.CreateDescriptorParams()
ovf = si.content.ovfManager.CreateDescriptor(vm, ovfDescParams) ovf = si.content.ovfManager.CreateDescriptor(vm, ovfDescParams)
root = ET.fromstring(ovf.ovfDescriptor) root = ET.fromstring(ovf.ovfDescriptor)
new_id = list(root[0][1].attrib.values())[0][1:3] new_id = list(root[0][1].attrib.values())[0][1:3]
ovfFiles = [] ovfFiles = []
for vmdk in vmdks: for vmdk in vmdks:
@ -109,14 +109,14 @@ class backup_vmdk(backup_generic):
ovfFiles.append(vim.OvfManager.OvfFile(size=os.path.getsize(vmdk['filename']), path=vmdk['filename'], deviceId=id)) ovfFiles.append(vim.OvfManager.OvfFile(size=os.path.getsize(vmdk['filename']), path=vmdk['filename'], deviceId=id))
ovfDescParams = vim.OvfManager.CreateDescriptorParams() ovfDescParams = vim.OvfManager.CreateDescriptorParams()
ovfDescParams.ovfFiles = ovfFiles; ovfDescParams.ovfFiles = ovfFiles;
ovf = si.content.ovfManager.CreateDescriptor(vm, ovfDescParams) ovf = si.content.ovfManager.CreateDescriptor(vm, ovfDescParams)
ovf_filename = vm.name+".ovf" ovf_filename = vm.name+".ovf"
self.logger.debug("[%s] creating ovf file: %s" %(self.server_name,ovf_filename)) self.logger.debug("[%s] creating ovf file: %s" %(self.server_name,ovf_filename))
with open(ovf_filename, "w") as f: with open(ovf_filename, "w") as f:
f.write(ovf.ovfDescriptor) f.write(ovf.ovfDescriptor)
return ovf_filename return ovf_filename
def create_ova(self,vm, vmdks, ovf_filename): def create_ova(self,vm, vmdks, ovf_filename):
@ -131,9 +131,9 @@ class backup_vmdk(backup_generic):
def clone_vm(self,vm): def clone_vm(self,vm):
task = self.wait_task(vm.CreateSnapshot_Task(name="backup",description="Automatic backup "+datetime.now().strftime("%Y-%m-%d %H:%M:%s"),memory=False,quiesce=True)) task = self.wait_task(vm.CreateSnapshot_Task(name="backup",description="Automatic backup "+datetime.now().strftime("%Y-%m-%d %H:%M:%s"),memory=False,quiesce=True))
snapshot=task.info.result snapshot=task.info.result
prefix_vmclone = self.prefix_clone prefix_vmclone = self.prefix_clone
clone_name = prefix_vmclone + vm.name clone_name = prefix_vmclone + vm.name
datastore = '[%s]' % vm.datastore[0].name datastore = '[%s]' % vm.datastore[0].name
@ -146,16 +146,16 @@ class backup_vmdk(backup_generic):
config = vim.vm.ConfigSpec(name=clone_name, memoryMB=vm.summary.config.memorySizeMB, numCPUs=vm.summary.config.numCpu, files=vmx_file) config = vim.vm.ConfigSpec(name=clone_name, memoryMB=vm.summary.config.memorySizeMB, numCPUs=vm.summary.config.numCpu, files=vmx_file)
hosts = datacenter.hostFolder.childEntity hosts = datacenter.hostFolder.childEntity
resource_pool = hosts[0].resourcePool resource_pool = hosts[0].resourcePool
self.wait_task(vmFolder.CreateVM_Task(config=config,pool=resource_pool)) self.wait_task(vmFolder.CreateVM_Task(config=config,pool=resource_pool))
new_vm = [x for x in vmFolder.childEntity if x.name == clone_name][0] new_vm = [x for x in vmFolder.childEntity if x.name == clone_name][0]
controller = vim.vm.device.VirtualDeviceSpec() controller = vim.vm.device.VirtualDeviceSpec()
controller.operation = vim.vm.device.VirtualDeviceSpec.Operation.add controller.operation = vim.vm.device.VirtualDeviceSpec.Operation.add
controller.device = vim.vm.device.VirtualLsiLogicController(busNumber=0,sharedBus='noSharing') controller.device = vim.vm.device.VirtualLsiLogicController(busNumber=0,sharedBus='noSharing')
controller.device.key = 0 controller.device.key = 0
i=0 i=0
vm_devices = [] vm_devices = []
@ -189,7 +189,7 @@ class backup_vmdk(backup_generic):
vm_devices.append(controller) vm_devices.append(controller)
config.deviceChange=vm_devices config.deviceChange=vm_devices
self.wait_task(new_vm.ReconfigVM_Task(config)) self.wait_task(new_vm.ReconfigVM_Task(config))
@ -198,7 +198,7 @@ class backup_vmdk(backup_generic):
def wait_task(self,task): def wait_task(self,task):
while task.info.state in ["queued", "running"]: while task.info.state in ["queued", "running"]:
time.sleep(2) time.sleep(2)
self.logger.debug("[%s] %s",self.server_name,task.info.descriptionId) self.logger.debug("[%s] %s",self.server_name,task.info.descriptionId)
return task return task
@ -213,7 +213,7 @@ class backup_vmdk(backup_generic):
else: else:
print('mkdir "%s"' % dest_dir) print('mkdir "%s"' % dest_dir)
else: else:
raise Exception('backup destination directory already exists : %s' % dest_dir) raise Exception('backup destination directory already exists : %s' % dest_dir)
os.chdir(dest_dir) os.chdir(dest_dir)
user_esx, password_esx, null = open(self.password_file).read().split('\n') user_esx, password_esx, null = open(self.password_file).read().split('\n')
@ -237,27 +237,27 @@ class backup_vmdk(backup_generic):
if vm.name == self.server_name: if vm.name == self.server_name:
vm_is_off = vm.summary.runtime.powerState == "poweredOff" vm_is_off = vm.summary.runtime.powerState == "poweredOff"
if str2bool(self.halt_vm): if str2bool(self.halt_vm):
vm.ShutdownGuest() vm.ShutdownGuest()
vm_is_off = True vm_is_off = True
if vm_is_off: if vm_is_off:
vmdks = self.export_vmdks(vm) vmdks = self.export_vmdks(vm)
ovf_filename = self.create_ovf(vm, vmdks) ovf_filename = self.create_ovf(vm, vmdks)
else: else:
new_vm = self.clone_vm(vm) new_vm = self.clone_vm(vm)
vmdks = self.export_vmdks(new_vm) vmdks = self.export_vmdks(new_vm)
ovf_filename = self.create_ovf(vm, vmdks) ovf_filename = self.create_ovf(vm, vmdks)
self.wait_task(new_vm.Destroy_Task()) self.wait_task(new_vm.Destroy_Task())
if str2bool(self.create_ovafile): if str2bool(self.create_ovafile):
ova_filename = self.create_ova(vm, vmdks, ovf_filename) ova_filename = self.create_ova(vm, vmdks, ovf_filename)
if str2bool(self.halt_vm): if str2bool(self.halt_vm):
vm.PowerOnVM() vm.PowerOnVM()
if os.path.exists(dest_dir): if os.path.exists(dest_dir):
for file in os.listdir(dest_dir): for file in os.listdir(dest_dir):
stats['written_bytes'] += os.stat(file)[ST_SIZE] stats['written_bytes'] += os.stat(file)[ST_SIZE]
stats['total_files_count'] += 1 stats['total_files_count'] += 1
stats['written_files_count'] += 1 stats['written_files_count'] += 1
@ -266,10 +266,10 @@ class backup_vmdk(backup_generic):
stats['written_bytes'] = 0 stats['written_bytes'] = 0
stats['backup_location'] = dest_dir stats['backup_location'] = dest_dir
stats['log']='XVA backup from %s OK, %d bytes written' % (self.server_name,stats['written_bytes']) stats['log']='XVA backup from %s OK, %d bytes written' % (self.server_name,stats['written_bytes'])
stats['status']='OK' stats['status']='OK'
except BaseException as e: except BaseException as e:
stats['status']='ERROR' stats['status']='ERROR'
@ -279,4 +279,3 @@ class backup_vmdk(backup_generic):
register_driver(backup_vmdk) register_driver(backup_vmdk)

View File

@ -27,7 +27,7 @@ from .common import *
class backup_xcp_metadata(backup_generic): class backup_xcp_metadata(backup_generic):
"""Backup metatdata of a xcp pool using xe pool-dump-database""" """Backup metatdata of a xcp pool using xe pool-dump-database"""
type = 'xcp-dump-metadata' type = 'xcp-dump-metadata'
required_params = ['type','server_name','private_key','backup_name'] required_params = ['type','server_name','private_key','backup_name']
def do_backup(self,stats): def do_backup(self,stats):
@ -60,7 +60,7 @@ class backup_xcp_metadata(backup_generic):
stats['total_files_count']=1 stats['total_files_count']=1
stats['written_files_count']=1 stats['written_files_count']=1
stats['total_bytes']=os.stat(localpath).st_size stats['total_bytes']=os.stat(localpath).st_size
stats['written_bytes']=os.stat(localpath).st_size stats['written_bytes']=os.stat(localpath).st_size
stats['log']='gzip dump of DB %s:%s (%d bytes) to %s' % (self.server_name,'xcp metadata dump', stats['written_bytes'], localpath) stats['log']='gzip dump of DB %s:%s (%d bytes) to %s' % (self.server_name,'xcp metadata dump', stats['written_bytes'], localpath)
stats['backup_location'] = localpath stats['backup_location'] = localpath
stats['status']='OK' stats['status']='OK'
@ -74,7 +74,7 @@ class backup_xcp_metadata(backup_generic):
filelist = os.listdir(self.backup_dir) filelist = os.listdir(self.backup_dir)
filelist.sort() filelist.sort()
p = re.compile('^%s-(?P<date>\d{8,8}-\d{2,2}h\d{2,2}m\d{2,2}).dump.gz$' % self.server_name) p = re.compile('^%s-(?P<date>\d{8,8}-\d{2,2}h\d{2,2}m\d{2,2}).dump.gz$' % self.server_name)
for item in filelist: for item in filelist:
sr = p.match(item) sr = p.match(item)
if sr: if sr:
@ -84,7 +84,7 @@ class backup_xcp_metadata(backup_generic):
self.logger.info('Registering %s from %s',file_name,fileisodate(file_name)) self.logger.info('Registering %s from %s',file_name,fileisodate(file_name))
size_bytes = int(os.popen('du -sb "%s"' % file_name).read().split('\t')[0]) size_bytes = int(os.popen('du -sb "%s"' % file_name).read().split('\t')[0])
self.logger.debug(' Size in bytes : %i',size_bytes) self.logger.debug(' Size in bytes : %i',size_bytes)
if not self.dry_run: if not self.dry_run:
self.dbstat.add(self.backup_name,self.server_name,'',\ self.dbstat.add(self.backup_name,self.server_name,'',\
backup_start=start,backup_end=fileisodate(file_name),status='OK',total_bytes=size_bytes,backup_location=file_name) backup_start=start,backup_end=fileisodate(file_name),status='OK',total_bytes=size_bytes,backup_location=file_name)
else: else:

View File

@ -36,7 +36,7 @@ from stat import *
from . import XenAPI from . import XenAPI
from .common import * from .common import *
if hasattr(ssl, '_create_unverified_context'): if hasattr(ssl, '_create_unverified_context'):
ssl._create_default_https_context = ssl._create_unverified_context ssl._create_default_https_context = ssl._create_unverified_context
@ -46,23 +46,23 @@ class copy_vm_xcp(backup_generic):
required_params = backup_generic.required_params + ['server_name','storage_name','password_file','vm_name','network_name'] required_params = backup_generic.required_params + ['server_name','storage_name','password_file','vm_name','network_name']
optional_params = backup_generic.optional_params + ['start_vm','max_copies', 'delete_snapshot', 'halt_vm'] optional_params = backup_generic.optional_params + ['start_vm','max_copies', 'delete_snapshot', 'halt_vm']
start_vm = "no" start_vm = "no"
max_copies = 1 max_copies = 1
halt_vm = "no" halt_vm = "no"
delete_snapshot = "yes" delete_snapshot = "yes"
def read_config(self,iniconf): def read_config(self,iniconf):
assert(isinstance(iniconf,ConfigParser)) assert(isinstance(iniconf,ConfigParser))
backup_generic.read_config(self,iniconf) backup_generic.read_config(self,iniconf)
if self.start_vm in 'no' and iniconf.has_option('global','start_vm'): if self.start_vm in 'no' and iniconf.has_option('global','start_vm'):
self.start_vm = iniconf.get('global','start_vm') self.start_vm = iniconf.get('global','start_vm')
if self.max_copies == 1 and iniconf.has_option('global','max_copies'): if self.max_copies == 1 and iniconf.has_option('global','max_copies'):
self.max_copies = iniconf.getint('global','max_copies') self.max_copies = iniconf.getint('global','max_copies')
if self.delete_snapshot == "yes" and iniconf.has_option('global','delete_snapshot'): if self.delete_snapshot == "yes" and iniconf.has_option('global','delete_snapshot'):
self.delete_snapshot = iniconf.get('global','delete_snapshot') self.delete_snapshot = iniconf.get('global','delete_snapshot')
def copy_vm_to_sr(self, vm_name, storage_name, dry_run, delete_snapshot="yes"): def copy_vm_to_sr(self, vm_name, storage_name, dry_run, delete_snapshot="yes"):
user_xen, password_xen, null = open(self.password_file).read().split('\n') user_xen, password_xen, null = open(self.password_file).read().split('\n')
session = XenAPI.Session('https://'+self.server_name) session = XenAPI.Session('https://'+self.server_name)
@ -70,25 +70,25 @@ class copy_vm_xcp(backup_generic):
session.login_with_password(user_xen,password_xen) session.login_with_password(user_xen,password_xen)
except XenAPI.Failure as error: except XenAPI.Failure as error:
msg,ip = error.details msg,ip = error.details
if msg == 'HOST_IS_SLAVE': if msg == 'HOST_IS_SLAVE':
server_name = ip server_name = ip
session = XenAPI.Session('https://'+server_name) session = XenAPI.Session('https://'+server_name)
session.login_with_password(user_xen,password_xen) session.login_with_password(user_xen,password_xen)
self.logger.debug("[%s] VM (%s) to backup in storage: %s",self.backup_name,vm_name,storage_name) self.logger.debug("[%s] VM (%s) to backup in storage: %s",self.backup_name,vm_name,storage_name)
now = datetime.datetime.now() now = datetime.datetime.now()
#get storage opaqueRef #get storage opaqueRef
try: try:
storage = session.xenapi.SR.get_by_name_label(storage_name)[0] storage = session.xenapi.SR.get_by_name_label(storage_name)[0]
except IndexError as error: except IndexError as error:
result = (1,"error get SR opaqueref %s"%(error)) result = (1,"error get SR opaqueref %s"%(error))
return result return result
#get vm to copy opaqueRef #get vm to copy opaqueRef
try: try:
vm = session.xenapi.VM.get_by_name_label(vm_name)[0] vm = session.xenapi.VM.get_by_name_label(vm_name)[0]
except IndexError as error: except IndexError as error:
@ -101,96 +101,96 @@ class copy_vm_xcp(backup_generic):
except IndexError as error: except IndexError as error:
result = (1, "error get VM network opaqueref %s" % (error)) result = (1, "error get VM network opaqueref %s" % (error))
return result return result
if str2bool(self.halt_vm): if str2bool(self.halt_vm):
status_vm = session.xenapi.VM.get_power_state(vm) status_vm = session.xenapi.VM.get_power_state(vm)
self.logger.debug("[%s] Status of VM: %s",self.backup_name,status_vm) self.logger.debug("[%s] Status of VM: %s",self.backup_name,status_vm)
if status_vm == "Running": if status_vm == "Running":
self.logger.debug("[%s] Shutdown in progress",self.backup_name) self.logger.debug("[%s] Shutdown in progress",self.backup_name)
if dry_run: if dry_run:
print("session.xenapi.VM.clean_shutdown(vm)") print("session.xenapi.VM.clean_shutdown(vm)")
else: else:
session.xenapi.VM.clean_shutdown(vm) session.xenapi.VM.clean_shutdown(vm)
snapshot = vm snapshot = vm
else: else:
#do the snapshot #do the snapshot
self.logger.debug("[%s] Snapshot in progress",self.backup_name) self.logger.debug("[%s] Snapshot in progress",self.backup_name)
try: try:
snapshot = session.xenapi.VM.snapshot(vm,"tisbackup-%s"%(vm_name)) snapshot = session.xenapi.VM.snapshot(vm,"tisbackup-%s"%(vm_name))
except XenAPI.Failure as error: except XenAPI.Failure as error:
result = (1,"error when snapshot %s"%(error)) result = (1,"error when snapshot %s"%(error))
return result return result
#get snapshot opaqueRef #get snapshot opaqueRef
snapshot = session.xenapi.VM.get_by_name_label("tisbackup-%s"%(vm_name))[0] snapshot = session.xenapi.VM.get_by_name_label("tisbackup-%s"%(vm_name))[0]
session.xenapi.VM.set_name_description(snapshot,"snapshot created by tisbackup on : %s"%(now.strftime("%Y-%m-%d %H:%M"))) session.xenapi.VM.set_name_description(snapshot,"snapshot created by tisbackup on : %s"%(now.strftime("%Y-%m-%d %H:%M")))
vm_backup_name = "zzz-%s-"%(vm_name) vm_backup_name = "zzz-%s-"%(vm_name)
#Check if old backup exit #Check if old backup exit
list_backups = [] list_backups = []
for vm_ref in session.xenapi.VM.get_all(): for vm_ref in session.xenapi.VM.get_all():
name_lablel = session.xenapi.VM.get_name_label(vm_ref) name_lablel = session.xenapi.VM.get_name_label(vm_ref)
if vm_backup_name in name_lablel: if vm_backup_name in name_lablel:
list_backups.append(name_lablel) list_backups.append(name_lablel)
list_backups.sort() list_backups.sort()
if len(list_backups) >= 1: if len(list_backups) >= 1:
# Shutting last backup if started # Shutting last backup if started
last_backup_vm = session.xenapi.VM.get_by_name_label(list_backups[-1])[0] last_backup_vm = session.xenapi.VM.get_by_name_label(list_backups[-1])[0]
if not "Halted" in session.xenapi.VM.get_power_state(last_backup_vm): if not "Halted" in session.xenapi.VM.get_power_state(last_backup_vm):
self.logger.debug("[%s] Shutting down last backup vm : %s", self.backup_name, list_backups[-1] ) self.logger.debug("[%s] Shutting down last backup vm : %s", self.backup_name, list_backups[-1] )
session.xenapi.VM.hard_shutdown(last_backup_vm) session.xenapi.VM.hard_shutdown(last_backup_vm)
# Delete oldest backup if exist # Delete oldest backup if exist
if len(list_backups) >= int(self.max_copies): if len(list_backups) >= int(self.max_copies):
for i in range(len(list_backups)-int(self.max_copies)+1): for i in range(len(list_backups)-int(self.max_copies)+1):
oldest_backup_vm = session.xenapi.VM.get_by_name_label(list_backups[i])[0] oldest_backup_vm = session.xenapi.VM.get_by_name_label(list_backups[i])[0]
if not "Halted" in session.xenapi.VM.get_power_state(oldest_backup_vm): if not "Halted" in session.xenapi.VM.get_power_state(oldest_backup_vm):
self.logger.debug("[%s] Shutting down old vm : %s", self.backup_name, list_backups[i] ) self.logger.debug("[%s] Shutting down old vm : %s", self.backup_name, list_backups[i] )
session.xenapi.VM.hard_shutdown(oldest_backup_vm) session.xenapi.VM.hard_shutdown(oldest_backup_vm)
try: try:
self.logger.debug("[%s] Deleting old vm : %s", self.backup_name, list_backups[i]) self.logger.debug("[%s] Deleting old vm : %s", self.backup_name, list_backups[i])
for vbd in session.xenapi.VM.get_VBDs(oldest_backup_vm): for vbd in session.xenapi.VM.get_VBDs(oldest_backup_vm):
if session.xenapi.VBD.get_type(vbd) == 'CD'and session.xenapi.VBD.get_record(vbd)['empty'] == False: if session.xenapi.VBD.get_type(vbd) == 'CD'and session.xenapi.VBD.get_record(vbd)['empty'] == False:
session.xenapi.VBD.eject(vbd) session.xenapi.VBD.eject(vbd)
else: else:
vdi = session.xenapi.VBD.get_VDI(vbd) vdi = session.xenapi.VBD.get_VDI(vbd)
if not 'NULL' in vdi: if not 'NULL' in vdi:
session.xenapi.VDI.destroy(vdi) session.xenapi.VDI.destroy(vdi)
session.xenapi.VM.destroy(oldest_backup_vm) session.xenapi.VM.destroy(oldest_backup_vm)
except XenAPI.Failure as error: except XenAPI.Failure as error:
result = (1,"error when destroy old backup vm %s"%(error)) result = (1,"error when destroy old backup vm %s"%(error))
return result return result
self.logger.debug("[%s] Copy %s in progress on %s",self.backup_name,vm_name,storage_name) self.logger.debug("[%s] Copy %s in progress on %s",self.backup_name,vm_name,storage_name)
try: try:
backup_vm = session.xenapi.VM.copy(snapshot,vm_backup_name+now.strftime("%Y-%m-%d %H:%M"),storage) backup_vm = session.xenapi.VM.copy(snapshot,vm_backup_name+now.strftime("%Y-%m-%d %H:%M"),storage)
except XenAPI.Failure as error: except XenAPI.Failure as error:
result = (1,"error when copy %s"%(error)) result = (1,"error when copy %s"%(error))
return result return result
# define VM as a template # define VM as a template
session.xenapi.VM.set_is_a_template(backup_vm,False) session.xenapi.VM.set_is_a_template(backup_vm,False)
#change the network of the new VM #change the network of the new VM
try: try:
vifDestroy = session.xenapi.VM.get_VIFs(backup_vm) vifDestroy = session.xenapi.VM.get_VIFs(backup_vm)
except IndexError as error: except IndexError as error:
result = (1,"error get VIF opaqueref %s"%(error)) result = (1,"error get VIF opaqueref %s"%(error))
return result return result
for i in vifDestroy: for i in vifDestroy:
vifRecord = session.xenapi.VIF.get_record(i) vifRecord = session.xenapi.VIF.get_record(i)
session.xenapi.VIF.destroy(i) session.xenapi.VIF.destroy(i)
@ -218,13 +218,13 @@ class copy_vm_xcp(backup_generic):
except Exception as error: except Exception as error:
result = (1,error) result = (1,error)
return result return result
if self.start_vm in ['true', '1', 't', 'y', 'yes', 'oui']: if self.start_vm in ['true', '1', 't', 'y', 'yes', 'oui']:
session.xenapi.VM.start(backup_vm,False,True) session.xenapi.VM.start(backup_vm,False,True)
session.xenapi.VM.set_name_description(backup_vm,"snapshot created by tisbackup on : %s"%(now.strftime("%Y-%m-%d %H:%M"))) session.xenapi.VM.set_name_description(backup_vm,"snapshot created by tisbackup on : %s"%(now.strftime("%Y-%m-%d %H:%M")))
size_backup = 0 size_backup = 0
for vbd in session.xenapi.VM.get_VBDs(backup_vm): for vbd in session.xenapi.VM.get_VBDs(backup_vm):
if session.xenapi.VBD.get_type(vbd) == 'CD' and session.xenapi.VBD.get_record(vbd)['empty'] == False: if session.xenapi.VBD.get_type(vbd) == 'CD' and session.xenapi.VBD.get_record(vbd)['empty'] == False:
@ -233,11 +233,11 @@ class copy_vm_xcp(backup_generic):
vdi = session.xenapi.VBD.get_VDI(vbd) vdi = session.xenapi.VBD.get_VDI(vbd)
if not 'NULL' in vdi: if not 'NULL' in vdi:
size_backup = size_backup + int(session.xenapi.VDI.get_record(vdi)['physical_utilisation']) size_backup = size_backup + int(session.xenapi.VDI.get_record(vdi)['physical_utilisation'])
result = (0,size_backup) result = (0,size_backup)
if self.delete_snapshot == 'no': if self.delete_snapshot == 'no':
return result return result
#Disable automatic boot #Disable automatic boot
if 'auto_poweron' in session.xenapi.VM.get_other_config(backup_vm): if 'auto_poweron' in session.xenapi.VM.get_other_config(backup_vm):
session.xenapi.VM.remove_from_other_config(backup_vm, "auto_poweron") session.xenapi.VM.remove_from_other_config(backup_vm, "auto_poweron")
@ -260,25 +260,25 @@ class copy_vm_xcp(backup_generic):
if status_vm == "Running": if status_vm == "Running":
self.logger.debug("[%s] Starting in progress",self.backup_name) self.logger.debug("[%s] Starting in progress",self.backup_name)
if dry_run: if dry_run:
print("session.xenapi.VM.start(vm,False,True)") print("session.xenapi.VM.start(vm,False,True)")
else: else:
session.xenapi.VM.start(vm,False,True) session.xenapi.VM.start(vm,False,True)
return result return result
def do_backup(self,stats): def do_backup(self,stats):
try: try:
timestamp = int(time.time()) timestamp = int(time.time())
cmd = self.copy_vm_to_sr(self.vm_name, self.storage_name, self.dry_run, delete_snapshot=self.delete_snapshot) cmd = self.copy_vm_to_sr(self.vm_name, self.storage_name, self.dry_run, delete_snapshot=self.delete_snapshot)
if cmd[0] == 0: if cmd[0] == 0:
timeExec = int(time.time()) - timestamp timeExec = int(time.time()) - timestamp
stats['log']='copy of %s to an other storage OK' % (self.backup_name) stats['log']='copy of %s to an other storage OK' % (self.backup_name)
stats['status']='OK' stats['status']='OK'
stats['total_files_count'] = 1 stats['total_files_count'] = 1
stats['total_bytes'] = cmd[1] stats['total_bytes'] = cmd[1]
stats['backup_location'] = self.storage_name stats['backup_location'] = self.storage_name
else: else:
stats['status']='ERROR' stats['status']='ERROR'

View File

@ -7,4 +7,4 @@ line-length = 140
indent-width = 4 indent-width = 4
[tool.ruff.lint] [tool.ruff.lint]
ignore = ["F401","F403","F405","E402"] ignore = ["F401","F403","F405","E402"]

View File

@ -7,9 +7,8 @@ mkdir -p BUILD RPMS
VERSION=`git rev-list HEAD --count` VERSION=`git rev-list HEAD --count`
echo $VERSION > __VERSION__ echo $VERSION > __VERSION__
rpmbuild -bb --buildroot $PWD/builddir -v --clean tis-tisbackup.spec rpmbuild -bb --buildroot $PWD/builddir -v --clean tis-tisbackup.spec
cp RPMS/*/*.rpm . cp RPMS/*/*.rpm .

View File

@ -15,7 +15,7 @@ Source0: ../
Prefix: / Prefix: /
%if "%{rhel}" == "8" %if "%{rhel}" == "8"
Requires: unzip rsync python3-paramiko python3-pyvmomi nfs-utils python3-flask python3-simplejson autofs python3-pexpect Requires: unzip rsync python3-paramiko python3-pyvmomi nfs-utils python3-flask python3-simplejson autofs python3-pexpect
%endif %endif
%if "%{rhel}" == "7" %if "%{rhel}" == "7"
Requires: unzip rsync python36-paramiko python3-pyvmomi nfs-utils python3-flask python3-simplejson autofs pexpect Requires: unzip rsync python36-paramiko python3-pyvmomi nfs-utils python3-flask python3-simplejson autofs pexpect

View File

@ -14,5 +14,3 @@ else
sleep 3 sleep 3
fi fi
echo $(date +%Y-%m-%d\ %H:%M:%S) : Fin Export TISBackup sur Disque USB : $target >> /var/log/tisbackup.log echo $(date +%Y-%m-%d\ %H:%M:%S) : Fin Export TISBackup sur Disque USB : $target >> /var/log/tisbackup.log

View File

@ -20,7 +20,7 @@ maximum_backup_age=30
;type=rsync+ssh ;type=rsync+ssh
;server_name=srvzimbra ;server_name=srvzimbra
;remote_dir=/ ;remote_dir=/
;exclude_list="/proc/**","/sys/**","/dev/**" ;exclude_list="/proc/**","/sys/**","/dev/**"
;private_key=/root/.ssh/id_rsa ;private_key=/root/.ssh/id_rsa
;ssh_port = 22 ;ssh_port = 22
@ -95,4 +95,3 @@ maximum_backup_age=30
;type=xcp-dump-metadata ;type=xcp-dump-metadata
;server_name=srvxen1 ;server_name=srvxen1
;private_key=/root/.ssh/id_rsa ;private_key=/root/.ssh/id_rsa

View File

@ -18,4 +18,3 @@ password_file=/home/homes/ssamson/tisbackup-pra/xen_passwd
network_name=net-test network_name=net-test
#start_vm=no #start_vm=no
#max_copies=3 #max_copies=3

View File

@ -4,4 +4,3 @@
# m h dom mon dow user command # m h dom mon dow user command
30 22 * * * root /opt/tisbackup/tisbackup.py -c /etc/tis/tisbackup-config.ini backup >> /var/log/tisbackup.log 2>&1 30 22 * * * root /opt/tisbackup/tisbackup.py -c /etc/tis/tisbackup-config.ini backup >> /var/log/tisbackup.log 2>&1
30 12 * * * root /opt/tisbackup/tisbackup.py -c /etc/tis/tisbackup-config.ini cleanup >> /var/log/tisbackup.log 2>&1 30 12 * * * root /opt/tisbackup/tisbackup.py -c /etc/tis/tisbackup-config.ini cleanup >> /var/log/tisbackup.log 2>&1

View File

@ -1,5 +1,5 @@
[general] [general]
config_tisbackup= /etc/tis/tisbackup-config.ini config_tisbackup= /etc/tis/tisbackup-config.ini
sections= sections=
ADMIN_EMAIL=technique@tranquil-it-systems.fr ADMIN_EMAIL=technique@tranquil-it-systems.fr
base_config_dir= /etc/tis/ base_config_dir= /etc/tis/

View File

@ -95,4 +95,3 @@ case "$1" in
esac esac
exit 0 exit 0

View File

@ -1,9 +1,9 @@
[Unit] [Unit]
Description=tisbackup Description=tisbackup
[Service] [Service]
Type=simple Type=simple
ExecStart=/usr/bin/python3 /opt/tisbackup/tisbackup_gui.py ExecStart=/usr/bin/python3 /opt/tisbackup/tisbackup_gui.py
[Install] [Install]
WantedBy=multi-user.target WantedBy=multi-user.target

View File

@ -95,4 +95,3 @@ case "$1" in
esac esac
exit 0 exit 0

View File

@ -1,9 +1,9 @@
[Unit] [Unit]
Description=tisbackup Description=tisbackup
[Service] [Service]
Type=simple Type=simple
ExecStart=huey_consumer.py -n tisbackup_gui.huey ExecStart=huey_consumer.py -n tisbackup_gui.huey
WorkingDirectory=/opt/tisbackup WorkingDirectory=/opt/tisbackup
[Install] [Install]
WantedBy=multi-user.target WantedBy=multi-user.target

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

2
static/js/jquery.js vendored

File diff suppressed because one or more lines are too long

View File

@ -2,4 +2,4 @@ $(document).ready(function () {
$('[data-toggle="offcanvas"]').click(function () { $('[data-toggle="offcanvas"]').click(function () {
$('.row-offcanvas').toggleClass('active') $('.row-offcanvas').toggleClass('active')
}); });
}); });

File diff suppressed because one or more lines are too long

View File

@ -61,7 +61,7 @@
</div> </div>
</div> </div>
</div> </div>
{% endif %} {% endif %}
{% if backup_list['rsync_list']|count != 0 %} {% if backup_list['rsync_list']|count != 0 %}

View File

@ -9,9 +9,9 @@
{% for message in messages %} {% for message in messages %}
<div class="alert alert-success fade in"> <div class="alert alert-success fade in">
<a href="#" class="close" data-dismiss="alert">&times;</a> <a href="#" class="close" data-dismiss="alert">&times;</a>
<strong>Success!</strong> {{ message }} <strong>Success!</strong> {{ message }}
</div> </div>
{% endfor %} {% endfor %}
{% endif %} {% endif %}
{% endwith %} {% endwith %}
@ -19,7 +19,7 @@
<p> <p>
<div class="alert alert-danger fade in"><strong>Error</strong>: {{ error }}</div> <div class="alert alert-danger fade in"><strong>Error</strong>: {{ error }}</div>
<div class="alert alert-warning"><strong>Notice</strong>: {{ info }}</div> <div class="alert alert-warning"><strong>Notice</strong>: {{ info }}</div>
<h4>Also, you can contact your <a href="mailto:{{ email }}?Subject=TISBACKUP%20Export"> System Administrator</a> for more details </h4> <h4>Also, you can contact your <a href="mailto:{{ email }}?Subject=TISBACKUP%20Export"> System Administrator</a> for more details </h4>
</p> </p>
{% elif not start %} {% elif not start %}
@ -31,28 +31,28 @@
$("#backup").submit(); $("#backup").submit();
}; };
}); });
}); });
$('#selectall').click(function(event) { //on click $('#selectall').click(function(event) { //on click
if(this.checked) { // check select status if(this.checked) { // check select status
$('.checkbox1').each(function() { //loop through each checkbox $('.checkbox1').each(function() { //loop through each checkbox
this.checked = true; //select all checkboxes with class "checkbox1" this.checked = true; //select all checkboxes with class "checkbox1"
}); });
}else{ }else{
$('.checkbox1').each(function() { //loop through each checkbox $('.checkbox1').each(function() { //loop through each checkbox
this.checked = false; //deselect all checkboxes with class "checkbox1" this.checked = false; //deselect all checkboxes with class "checkbox1"
}); });
} }
}); });
}); });
</script> </script>
<form id="backup" action='/export_backup'> <form id="backup" action='/export_backup'>
<p> Select backups to save : <br/> <p> Select backups to save : <br/>
<div class="row"> <div class="row">
<div class="checkbox"><label><input type="checkbox" class="checkbox1" id="selectall" checked>Select all</label></div> <div class="checkbox"><label><input type="checkbox" class="checkbox1" id="selectall" checked>Select all</label></div>
{% for entry in sections|sort %} {% for entry in sections|sort %}
<div class="col-xs-6 col-md-4"> <div class="col-xs-6 col-md-4">
<div class="form-group"> <div class="form-group">
<div class="checkbox"><label><input type="checkbox" name="sections" class="checkbox1" value="{{entry}}" checked>{{entry}}</label></div> <div class="checkbox"><label><input type="checkbox" name="sections" class="checkbox1" value="{{entry}}" checked>{{entry}}</label></div>
</div> </div>
</div> </div>
{% endfor %} {% endfor %}
@ -65,7 +65,7 @@
</div> </div>
</form> </form>
{% else %} {% else %}
<h2 class="title">Backups is running: </h2> <h2 class="title">Backups is running: </h2>
<table id="table" class='table'> <table id="table" class='table'>
@ -79,7 +79,7 @@
</table> </table>
<script> <script>
//Refresh periode in seconds //Refresh periode in seconds
var refresh = 5; var refresh = 5;
@ -97,7 +97,7 @@ function status(){
done = false; done = false;
}else{ }else{
$('tbody').append('<td>'+val.status+'</td>'); $('tbody').append('<td>'+val.status+'</td>');
done = data.finish; done = data.finish;
} }
$('#table-design').append('</tr>'); $('#table-design').append('</tr>');

View File

@ -24,7 +24,7 @@
"aTargets": [ 0 ], "aTargets": [ 0 ],
"mData": "backup_start", "mData": "backup_start",
"mRender": function ( data, type, full ) { "mRender": function ( data, type, full ) {
var d = new Date(data); var d = new Date(data);
return d.getFullYear()+"/"+(d.getMonth()+1)+"/"+d.getDate()+" "+d.toLocaleTimeString(); return d.getFullYear()+"/"+(d.getMonth()+1)+"/"+d.getDate()+" "+d.toLocaleTimeString();
} }
}, },
@ -32,7 +32,7 @@
"aTargets": [ 1 ], "aTargets": [ 1 ],
"mData": "backup_start", "mData": "backup_start",
"mRender": function ( data, type, full ) { "mRender": function ( data, type, full ) {
var d = new Date(data); var d = new Date(data);
return d.getFullYear()+"/"+(d.getMonth()+1)+"/"+d.getDate()+" "+d.toLocaleTimeString(); return d.getFullYear()+"/"+(d.getMonth()+1)+"/"+d.getDate()+" "+d.toLocaleTimeString();
} }
}, },
@ -79,7 +79,7 @@
$('#inputDatabaseName').keyup(function () { delay(function(){ oTable.fnLengthChange($('#inputDatabaseName').val() ); }, 300 )}); $('#inputDatabaseName').keyup(function () { delay(function(){ oTable.fnLengthChange($('#inputDatabaseName').val() ); }, 300 )});
$(".dataTables_length").remove() $(".dataTables_length").remove()
var nb_row = GetURLParameter('row'); var nb_row = GetURLParameter('row');
if (nb_row ){ if (nb_row ){
oTable.fnLengthChange( nb_row) ; oTable.fnLengthChange( nb_row) ;
$('#inputDatabaseName').val(nb_row); $('#inputDatabaseName').val(nb_row);
} }
@ -96,7 +96,7 @@
{ {
/* Get the DataTables object again - this is not a recreation, just a get of the object */ /* Get the DataTables object again - this is not a recreation, just a get of the object */
var oTable = $('#table-design').dataTable(); var oTable = $('#table-design').dataTable();
var bVis = oTable.fnSettings().aoColumns[iCol].bVisible; var bVis = oTable.fnSettings().aoColumns[iCol].bVisible;
oTable.fnSetColumnVis( iCol, bVis ? false : true ); oTable.fnSetColumnVis( iCol, bVis ? false : true );
} }
@ -111,10 +111,10 @@
{ {
var sPageURL = window.location.search.substring(1); var sPageURL = window.location.search.substring(1);
var sURLVariables = sPageURL.split('&'); var sURLVariables = sPageURL.split('&');
for (var i = 0; i < sURLVariables.length; i++) for (var i = 0; i < sURLVariables.length; i++)
{ {
var sParameterName = sURLVariables[i].split('='); var sParameterName = sURLVariables[i].split('=');
if (sParameterName[0] == sParam) if (sParameterName[0] == sParam)
{ {
return sParameterName[1]; return sParameterName[1];
} }
@ -135,7 +135,7 @@
{ {
oSettings._iDisplayLength = iDisplay; oSettings._iDisplayLength = iDisplay;
oSettings.oApi._fnCalculateEnd( oSettings ); oSettings.oApi._fnCalculateEnd( oSettings );
/* If we have space to show extra rows (backing up from the end point - then do so */ /* If we have space to show extra rows (backing up from the end point - then do so */
if ( oSettings._iDisplayEnd == oSettings.aiDisplay.length ) if ( oSettings._iDisplayEnd == oSettings.aiDisplay.length )
{ {
@ -145,14 +145,14 @@
oSettings._iDisplayStart = 0; oSettings._iDisplayStart = 0;
} }
} }
if ( oSettings._iDisplayLength == -1 ) if ( oSettings._iDisplayLength == -1 )
{ {
oSettings._iDisplayStart = 0; oSettings._iDisplayStart = 0;
} }
oSettings.oApi._fnDraw( oSettings ); oSettings.oApi._fnDraw( oSettings );
if ( oSettings.aanFeatures.l ) if ( oSettings.aanFeatures.l )
{ {
$('select', oSettings.aanFeatures.l).val( iDisplay ); $('select', oSettings.aanFeatures.l).val( iDisplay );
@ -179,7 +179,7 @@
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
</tbody> </tbody>
<tfoot> <tfoot>
<tr> <tr>
@ -204,7 +204,7 @@
<div class="checkbox"><label><input type="checkbox" onclick="fnShowHide( 4 );" checked> Backup duration</label></div> <div class="checkbox"><label><input type="checkbox" onclick="fnShowHide( 4 );" checked> Backup duration</label></div>
</div> </div>
</div> </div>
<div class="col-xs-6 col-md-4"> <div class="col-xs-6 col-md-4">
<div class="form-group"> <div class="form-group">
<div class="checkbox"><label><input type="checkbox" onclick="fnShowHide( 6 );"checked> Written bytes</label></div> <div class="checkbox"><label><input type="checkbox" onclick="fnShowHide( 6 );"checked> Written bytes</label></div>
@ -213,9 +213,9 @@
<div class="checkbox"><label><input type="checkbox" onclick="fnShowHide( 9 );"/> Total bytes</label></div> <div class="checkbox"><label><input type="checkbox" onclick="fnShowHide( 9 );"/> Total bytes</label></div>
</div> </div>
</div> </div>
<div class="col-xs-6 col-md-4"> <div class="col-xs-6 col-md-4">
<div class="form-group"> <div class="form-group">
<div class="checkbox"><label><input type="checkbox" onclick="fnShowHide( 10 );"> Backup location</label></div> <div class="checkbox"><label><input type="checkbox" onclick="fnShowHide( 10 );"> Backup location</label></div>
<div class="checkbox"><label><input type="checkbox" onclick="fnShowHide( 11);">Description </label></div> <div class="checkbox"><label><input type="checkbox" onclick="fnShowHide( 11);">Description </label></div>
<div class="checkbox"><label><input type="checkbox" onclick="fnShowHide( 12);"> Log</label></div> <div class="checkbox"><label><input type="checkbox" onclick="fnShowHide( 12);"> Log</label></div>
@ -225,7 +225,7 @@
</div> </div>
</form> </form>
</p> </p>
{% endblock %} {% endblock %}

View File

@ -55,7 +55,7 @@
{% endblock %} {% endblock %}
</div><!--/row--> </div><!--/row-->
<hr> <hr>
<footer> <footer>
@ -80,7 +80,7 @@
if ( data.configs.length > 1){ if ( data.configs.length > 1){
$('#choix_conf').removeClass('hidden'); $('#choix_conf').removeClass('hidden');
$("#choix_conf").show(); $("#choix_conf").show();
$.each(data.configs, function(key,val){ $.each(data.configs, function(key,val){
if (key == data.config_number) if (key == data.config_number)
$('#choix_conf').append('<option vaulue="'+key+'" selected>'+val+'</option>'); $('#choix_conf').append('<option vaulue="'+key+'" selected>'+val+'</option>');
@ -89,7 +89,7 @@
}); });
} }
}); });
$( "#choix_conf" ).change(function() { $( "#choix_conf" ).change(function() {
$.get( "/config_number/"+this.selectedIndex, function( data ) {location.reload();}); $.get( "/config_number/"+this.selectedIndex, function( data ) {location.reload();});
}); });
@ -98,4 +98,3 @@
</script> </script>
</body></html> </body></html>