Version Description
- Initial release
=
Download this release
Release Info
Developer | migrate |
Plugin | Backup Migration |
Version | 1.0.4 |
Comparing to | |
See all releases |
Version 1.0.4
- admin/css/bmi-plugin.min.css +1 -0
- admin/images/002-monitor-white.svg +15 -0
- admin/images/Amazon.svg +47 -0
- admin/images/alert_error-min.png +0 -0
- admin/images/alert_info-min.png +0 -0
- admin/images/alert_success-min.png +0 -0
- admin/images/alert_warning-min.png +0 -0
- admin/images/arrow-min.png +0 -0
- admin/images/backblaze.svg +44 -0
- admin/images/backup-min.svg +1 -0
- admin/images/big_bg_clock_green-min.png +0 -0
- admin/images/big_bg_clock_white-min.png +0 -0
- admin/images/clock.svg +3 -0
- admin/images/clock2.svg +5 -0
- admin/images/clocks-min.png +0 -0
- admin/images/close-min.png +0 -0
- admin/images/copy-icon.png +0 -0
- admin/images/crown-bg.png +0 -0
- admin/images/download-min.png +0 -0
- admin/images/dream-objects.svg +47 -0
- admin/images/ftp.svg +37 -0
- admin/images/google-cloud.svg +49 -0
- admin/images/google-drive.svg +51 -0
- admin/images/happy-smile.png +0 -0
- admin/images/info-min.png +0 -0
- admin/images/kitty-cat.svg +1 -0
- admin/images/link-min.png +0 -0
- admin/images/lock-experimental.png +0 -0
- admin/images/lock-min.svg +1 -0
- admin/images/log-min.svg +1 -0
- admin/images/logo-min.png +0 -0
- admin/images/logo.png +0 -0
- admin/images/microsoft-azure.svg +43 -0
- admin/images/minimize-min.png +0 -0
- admin/images/next-icon-min.png +0 -0
- admin/images/nut-big.png +0 -0
- admin/images/nut-mid.png +0 -0
- admin/images/nut-small.png +0 -0
- admin/images/onedrive.svg +39 -0
- admin/images/openstack-swift.svg +28 -0
- admin/images/premium.png +0 -0
- admin/images/premium.svg +10 -0
- admin/images/rackspace.svg +44 -0
- admin/images/red-close-min.svg +1 -0
- admin/images/red-cross.svg +204 -0
- admin/images/restore-icon-min.png +0 -0
- admin/images/restore-min.svg +1 -0
- admin/images/search-min.png +0 -0
- admin/images/sftp-scp.svg +29 -0
- admin/images/stars.gif +0 -0
- admin/images/success.png +0 -0
- admin/images/support-1.svg +1 -0
- admin/images/support-2.svg +1 -0
- admin/images/support-3.svg +1 -0
- admin/images/thumb.png +0 -0
- admin/images/timemachine.svg +1 -0
- admin/images/trash.png +0 -0
- admin/images/unlocked-min.svg +1 -0
- admin/images/upload-min.png +0 -0
- admin/images/upload.svg +47 -0
- admin/images/warning-grey.png +0 -0
- admin/images/warning-red.png +0 -0
- admin/images/x-face.png +0 -0
- admin/js/backup-migration.min.js +1 -0
- backup-backup.php +48 -0
- includes/ajax.php +1434 -0
- includes/check/checker.php +110 -0
- includes/check/system_info.php +497 -0
- includes/config.php +158 -0
- includes/constants.php +76 -0
- includes/cron/handler.php +117 -0
- includes/dashboard/chapter/AA-Template.php +9 -0
- includes/dashboard/chapter/other_config.php +298 -0
- includes/dashboard/chapter/save-button.php +18 -0
- includes/dashboard/chapter/store_config.php +155 -0
- includes/dashboard/chapter/troubleshooting.php +195 -0
- includes/dashboard/chapter/what_backed_up.php +389 -0
- includes/dashboard/chapter/where_config.php +234 -0
- includes/dashboard/modals/AA-Modal-Template.php +25 -0
- includes/dashboard/modals/backup-error-modal.php +67 -0
- includes/dashboard/modals/backup-progress-modal.php +76 -0
- includes/dashboard/modals/backup-success-modal.php +74 -0
- includes/dashboard/modals/bfs-modal.php +76 -0
- includes/dashboard/modals/delete-confirm-modal.php +49 -0
- includes/dashboard/modals/pre-restore-modal.php +68 -0
- includes/dashboard/modals/prenotice-modal.php +69 -0
- includes/dashboard/modals/reset-confirm-modal.php +40 -0
- includes/dashboard/modals/restore-error-modal.php +67 -0
- includes/dashboard/modals/restore-progress-modal.php +51 -0
- includes/dashboard/modals/restore-success-modal.php +74 -0
- includes/dashboard/modals/upload-exist-file-modal.php +41 -0
- includes/dashboard/modals/upload-invalid-manifest-modal.php +39 -0
- includes/dashboard/modals/upload-success-modal.php +39 -0
- includes/dashboard/modals/upload-wrong-file-modal.php +39 -0
- includes/dashboard/modules/backup-ongoing.php +19 -0
- includes/dashboard/modules/backup_controller.php +213 -0
- includes/dashboard/modules/backups-table-header.php +42 -0
- includes/dashboard/modules/backups-under-table.php +93 -0
- includes/dashboard/modules/email-errors.php +35 -0
- includes/dashboard/modules/super-quick-migration.php +33 -0
- includes/dashboard/modules/upload-backup.php +13 -0
- includes/dashboard/settings.php +207 -0
- includes/dashboard/templates/AA-Template.php +9 -0
- includes/dashboard/templates/backup-row-template.php +42 -0
- includes/dashboard/templates/dropdown-template.php +14 -0
- includes/dashboard/templates/exclusion-rule-template.php +34 -0
- includes/dashboard/templates/option-template.php +11 -0
- includes/dashboard/templates/premium-overlay.php +26 -0
- includes/dashboard/translations.php +114 -0
- includes/database/manager.php +185 -0
- includes/extracter/extract.php +287 -0
- includes/htaccess/.htaccess +17 -0
- includes/htaccess/.litespeed +7 -0
- includes/htaccess/default.json +39 -0
- includes/initializer.php +637 -0
- includes/logger.php +43 -0
- includes/progress/migration.php +54 -0
- includes/progress/zip.php +110 -0
- includes/scanner/backups.php +90 -0
- includes/scanner/files.php +461 -0
- includes/uploader/chunks.php +133 -0
- includes/zipper/src/zip.php +500 -0
- includes/zipper/zipping.php +209 -0
- readme.txt +35 -0
- uninstall.php +65 -0
admin/css/bmi-plugin.min.css
ADDED
@@ -0,0 +1 @@
|
|
|
1 |
+
@import url("https://fonts.googleapis.com/css2?family=Montserrat:wght@300;400;500;600;700&display=swap");#bmi{-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;font-family:'Montserrat', Helvetica, Arial, sans-serif;max-width:1495px;max-width:min(1495px, 95%);margin:0 auto;padding-top:55px;padding-bottom:30vh;min-width:1495px;min-width:calc(min(1495px, 95%))}#bmi .light{font-weight:300}#bmi .regular{font-weight:400}#bmi .medium{font-weight:500}#bmi .semibold{font-weight:600}#bmi .bold{font-weight:700}#bmi .f12{font-size:12px}#bmi .f14{font-size:14px}#bmi .f15{font-size:15px}#bmi .f16{font-size:16px}#bmi .f17{font-size:17px}#bmi .f18{font-size:18px}#bmi .f19{font-size:19px}#bmi .f20{font-size:20px}#bmi .f22{font-size:22px}#bmi .f24{font-size:24px}#bmi .f25{font-size:25px}#bmi .f26{font-size:26px}#bmi .f28{font-size:28px}#bmi .f30{font-size:30px}#bmi .f35{font-size:35px}#bmi .black{color:black}#bmi a{color:#555}#bmi .cf::after{content:'';display:block;clear:both}#bmi .left{float:left}#bmi .right{float:right}#bmi .pointer{cursor:pointer}#bmi .not-allowed{cursor:not-allowed !important}#bmi .hoverable{opacity:1;transition:.3s all;cursor:pointer}#bmi .hoverable:hover{opacity:0.8}#bmi .hoverable:active{transition:0 all !important;opacity:.6}#bmi .transition{transition:.3s all}#bmi .relative{position:relative}#bmi .vcenter{position:absolute;text-align:center;top:50%;transform:translate(0, -50%)}#bmi .flexcenter{justify-content:center;align-items:center}#bmi .shadow{box-shadow:2px 2px 5px rgba(0,0,0,0.35)}#bmi .inline{display:inline-block !important}#bmi .fullwidth{width:100%}#bmi .lh13{line-height:1.3}#bmi .lh14{line-height:1.4}#bmi .lh28{line-height:28px}#bmi .lh30{line-height:30px}#bmi .lh40{line-height:40px}#bmi .lh45{line-height:45px}#bmi .lh50{line-height:50px}#bmi .lh60{line-height:60px}#bmi .lh65{line-height:65px}#bmi .section-bmi{margin-bottom:25px}#bmi hr.section-bmi{margin-top:30px;margin-bottom:25px;border-top:2px solid #ddd}#bmi .secondary{color:#257671}#bmi .rbb{border-bottom-left-radius:10px;border-bottom-right-radius:10px}#bmi .rbt{border-top-left-radius:10px;border-top-right-radius:10px}#bmi .center{text-align:center}#bmi .center.block{margin:0 auto}#bmi .align-right{text-align:right}#bmi .align-left{text-align:left}#bmi button{border-radius:10px;background:#257671;line-height:46px;border:0;transition:.3s all;color:white;cursor:pointer}#bmi button:hover{background:#206662}#bmi button:active{transition:0 all;background:#1b5753;opacity:.4}#bmi button.centred{margin:0 auto;margin-bottom:20px;margin-top:25px}#bmi button.with-icon .for-img{display:inline-block;position:relative}#bmi button.with-icon img{position:absolute;left:0;top:8px;height:28px;width:28px}#bmi button.with-icon span{padding-left:35px}#bmi .mm{padding-left:45px;padding-right:45px}#bmi .ppr{padding-right:25px}#bmi .tml{margin-top:20px}#bmi .mo{padding:45px}#bmi .mt{padding-top:45px}#bmi .mb{padding-bottom:45px}#bmi .mtl{padding-top:25px}#bmi .mbl{padding-bottom:25px}#bmi .mtll{padding-top:15px}#bmi .mtlll{padding-top:7px}#bmi .mbll{padding-bottom:15px}#bmi .mblll{padding-bottom:7px}#bmi .nm{margin:0 !important}#bmi .mms{padding-left:20px;padding-right:20px}#bmi .mmm{padding-left:35px;padding-right:35px}#bmi .mm60{padding-left:60px;padding-right:60px}#bmi .mm30{padding-left:30px;padding-right:30px}#bmi .mm92{padding-left:76px !important;padding-right:76px !important}#bmi .text-grey{color:#373737}#bmi .text-muted{opacity:0.47}#bmi .red-text{color:red}#bmi .flex-here{display:flex;flex-direction:row}#bmi .flex-here div{flex:1}#bmi .nlink{text-decoration:none;color:#257671}#bmi .nplr{padding-left:0 !important;padding-right:0 !important}#bmi .flex{display:flex;flex-wrap:wrap}#bmi .rr{padding-left:32px}#bmi .np{padding:0}#bmi .npb{padding-bottom:0 !important}#bmi .npt{padding-top:0 !important}#bmi .pbl{padding-bottom:10px !important}#bmi .bg-second{background:#f8f8f8}#bmi .width50,#bmi .half{width:50% !important}#bmi .chhl{width:calc(50% - 80px) !important;margin:0 40px}#bmi .under{text-decoration:underline}#bmi .tilo{font-size:18px}#bmi .red-error-bg{background:#f9efef}#bmi .nodec{text-decoration:none !important}#bmi .mt30{margin-top:30px}#bmi .suc-buttns .a1,#bmi .suc-buttns .a2{width:calc(50% - 40px);margin:10px}#bmi .suc-buttns .a1 a,#bmi .suc-buttns .a2 a{padding:10px 30px}#bmi .suc-buttns .a1{margin-left:30px}#bmi .suc-buttns .a2{margin-right:30px}#bmi .nowrap{flex-wrap:nowrap !important}#bmi .fbcont{font-size:14px;text-align:left;padding-left:15px}#bmi .fbcont .fbhead{display:block;font-size:19px;margin-bottom:5px}#bmi .nmt{margin-top:0 !important}#bmi .fcentr{display:flex;justify-content:center}#bmi .autowidth{width:auto !important}#bmi .flex1{flex:1}#bmi .flex2{flex:2}#bmi .left-align{text-align:left}#bmi .right-align{text-align:right}#bmi .info-cursor{cursor:help}#bmi .wait-cursor{cursor:wait}#bmi .mrr{margin-right:20px !important}#bmi .orr{margin-right:10px}#bmi .oll{margin-left:10px}#bmi .ooo-to-pad .orr{padding-right:10px !important}#bmi .ooo-to-pad .oll{padding-left:10px !important}#bmi .mw850{max-width:850px}#bmi .bol{margin-left:100px}#bmi li.hasArrowRight{position:relative;padding-left:40px}#bmi li.hasArrowRight::before{content:'';position:absolute;border:solid #257671;border-width:0 3px 3px 0;display:inline-block;padding:3px;transform:rotate(-45deg);-webkit-transform:rotate(-45deg);left:20px;top:10px}#bmi .cron-a{line-height:77px;padding:0px 35px}#bmi .cron-b{border-top:2px solid #e2eceb;border-bottom:2px solid #e2eceb;background-color:#e6eeee;padding:0px 35px;overflow-x:auto;max-width:100%;max-height:78px;overflow-y:hidden}#bmi .cron-b table{height:72px}#bmi .cron-c{padding:0px 35px}#bmi .cron-c table{height:70px}#bmi .mr50{margin-right:50px}#bmi .mr20{margin-right:20px}#bmi .mw250{min-width:250px}#bmi .center-table{width:100%}#bmi .center-table td{text-align:center;padding-left:10px;padding-right:10px}#bmi .untab{box-shadow:none !important;outline:0 !important}#bmi .modal.before-open{transition:0s all !important;opacity:0;display:block}#bmi .modal.before-open .modal-wrapper{left:-60px;transition:0s all !important;top:-30px;opacity:0}#bmi .modal.open{transition:0.4s all !important;opacity:1;display:block}#bmi .modal.open .modal-wrapper{top:60px;left:0px;transition:0.4s all !important;opacity:1}#bmi .modal.before-close{transition:0s all !important;opacity:1;display:block}#bmi .modal.before-close .modal-wrapper{transition:0s all !important;top:60px;left:0px;opacity:1}#bmi .modal.closed{transition:0.4s all !important;left:0px;opacity:0}#bmi .modal.closed .modal-wrapper{transition:0.4s all !important;top:120px;left:60px;opacity:0}#bmi .modal{top:0;left:0;display:none;position:fixed;width:100%;height:100vh;background:rgba(37,118,113,0.4);overflow:auto;z-index:999999}#bmi .modal .modal-close{position:absolute;top:25px;right:25px;font-size:35px !important;color:#555 !important;font-weight:500 !important;z-index:9999999 !important;text-decoration:none !important;line-height:1.1;transition:.3s all;opacity:1}#bmi .modal .modal-close.light{color:white !important}#bmi .modal .modal-close:hover{opacity:.7}#bmi .modal .modal-wrapper{top:60px;max-width:60vw;box-shadow:0px 10px 64px rgba(0,0,0,0.24);margin:0 auto;position:relative;background:#FBFBFF;border-radius:10px;padding:40px 40px;margin-bottom:35px;min-height:200px}#bmi .modal .modal-wrapper.no-hpad{padding-left:0;padding-right:0}#bmi .modal .modal-wrapper.no-vpad{padding-top:0;padding-bottom:0}#bmi .modal-closer{cursor:pointer}#bmi .modal-closer:hover{text-decoration:underline}#bmi .live-log{transition:.3s all;overflow:hidden;max-height:306px}#bmi .live-log.expanded-logs{max-height:0px}#bmi .red-warning{position:relative;display:inline-block;padding-left:60px;padding-right:60px}#bmi .red-warning::after,#bmi .red-warning::before{content:'';position:absolute;top:12px;height:41px;width:46px}#bmi .red-warning::after{left:0;background:url("../images/warning-red.png")}#bmi .red-warning::before{right:0;background:url("../images/warning-red.png")}#bmi .premium-wrapper{cursor:not-allowed}#bmi .premium-wrapper .premium{pointer-events:none}#bmi .premium-wrapper .premium-img{line-height:30px;padding-right:30px;position:relative}#bmi .premium-wrapper .premium-img::after{content:'';position:absolute;top:0;bottom:0;right:0;background:url("../images/premium.svg");margin-top:3px;height:24px;width:24px;background-repeat:no-repeat;background-size:cover}#bmi .premium-wrapper .premium-img.premium-nt::after{margin-top:0px !important;right:20px;top:1px}#bmi .premium-wrapper .premium-img.premium-ntt::after{margin-top:0px !important;top:-1px}#bmi .bmi-notification-box{position:fixed;top:15px;right:15px;min-width:100px;max-width:40vw;z-index:1000000}#bmi .bmi-notification.is-info,#bmi .bmi-title.is-info{background-color:#0c96b7}#bmi .bmi-notification.is-danger,#bmi .bmi-title.is-danger{background-color:#e4706f}#bmi .bmi-notification.is-success,#bmi .bmi-title.is-success{background-color:#6db799}#bmi .bmi-alert-icon{height:100%;width:25px}#bmi .bmi-alert-icon .bmi-icon-bg{width:25px;height:25px}#bmi .bmi-alert-msg-title{padding-left:40px !important}#bmi .bmi-notification .bmi-icon-bg{background-position:center;background-repeat:no-repeat;position:absolute;height:calc(100% - 36px)}#bmi .bmi-notification.is-success .bmi-icon-bg{background-image:url("../images/alert_success-min.png")}#bmi .bmi-notification.is-warning .bmi-icon-bg{background-image:url("../images/alert_warning-min.png")}#bmi .bmi-notification.is-info .bmi-icon-bg{background-image:url("../images/alert_info-min.png")}#bmi .bmi-notification.is-danger .bmi-icon-bg{background-image:url("../images/alert_error-min.png")}#bmi .bmi-notification.is-warning,#bmi .bmi-title.is-warning{background-color:#ecb135}#bmi .bmi-title{margin-bottom:3px;font-weight:500;font-size:15px !important}#bmi .bmi-notification{border-radius:3px;padding:18px 36px 18px 20px !important;position:relative;margin-bottom:15px;padding-left:3px;font-family:'Montserrat', sans-serif !important;font-size:15px !important;font-weight:300;color:white}#bmi .bmi-times-button{top:2px;right:1px;position:absolute;background:none !important;border:none;font-size:24px;cursor:pointer;font-weight:500;color:white;opacity:0.6;transition:opacity 0.2s;padding:2px 9px !important}#bmi .bmi-times-button:hover{cursor:pointer;opacity:1}#bmi .bmi-noti-hide{display:none}#bmi .translations{display:none;visibility:hidden;height:0;width:0}#bmi .heading{padding-bottom:35px}#bmi .backup-creator .cron-backups-wrap{width:calc(100% - 225px);height:225px}#bmi .backup-creator .cron-backups{background-color:white;width:calc(100% - 15px);margin-left:15px;height:100%;border-radius:10px}#bmi .backup-creator .cron-backups .vcenter{width:100%}#bmi .backup-creator .cron-backups .turned-off{width:100%;height:100%;background:url("../images/big_bg_clock_white-min.png") no-repeat;background-size:cover;color:#257671}#bmi .backup-creator .cron-backups .turned-off:hover{background:url("../images/big_bg_clock_green-min.png") no-repeat;background-size:cover;color:white}#bmi .backup-creator .cron-backups .turned-off,#bmi .backup-creator .cron-backups .turned-on{width:100%;border-radius:10px;position:absolute;top:0;left:0;right:0;bottom:0;opacity:1;transition:.3s all}#bmi .backup-creator .cron-backups.disabled .cron-bc{opacity:.5;cursor:not-allowed}#bmi .backup-creator .cron-backups.disabled .cron-bc .cron-b{pointer-events:none}#bmi .backup-creator .cron-backups.disabled .cron-bc .cron-c{pointer-events:none}#bmi .trouble-section .shadow{border-radius:7px;background:#fff;color:black;cursor:pointer;transition:.3s all;min-height:185px;padding:0 20px}#bmi .trouble-section .shadow svg{color:#257671}#bmi .trouble-section .shadow:hover,#bmi .trouble-section .shadow.active{color:white;box-shadow:2px 2px 7px rgba(0,0,0,0.4);background:#257671}#bmi .trouble-section .shadow:hover svg,#bmi .trouble-section .shadow.active svg{color:white}#bmi .close-chapters:hover{text-decoration:underline !important}#bmi .hide-show-tr{display:none}@-moz-keyframes spin{100%{-moz-transform:rotate(360deg)}}@-webkit-keyframes spin{100%{-webkit-transform:rotate(360deg)}}@keyframes spin{100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@-moz-keyframes spinreverse{100%{-moz-transform:rotate(-360deg)}}@-webkit-keyframes spinreverse{100%{-webkit-transform:rotate(-360deg)}}@keyframes spinreverse{100%{-webkit-transform:rotate(-360deg);transform:rotate(-360deg)}}#bmi .spinning{-webkit-animation:spin 3s linear infinite;-moz-animation:spin 3s linear infinite;animation:spin 3s linear infinite}#bmi .spinning-reverse{-webkit-animation:spinreverse 3s linear infinite;-moz-animation:spinreverse 3s linear infinite;animation:spinreverse 3s linear infinite}#bmi #bmi-ongoing-backup{position:fixed;top:32px;right:50px;border-bottom-left-radius:10px;border-bottom-right-radius:10px;height:78px;width:310px;background:#257671;color:white}#bmi #bmi-ongoing-backup .centered{position:absolute;left:85px;top:18px;line-height:22px}#bmi #bmi-ongoing-backup .nuts .nut{position:absolute}#bmi #bmi-ongoing-backup .nuts .nut-1{top:10px;left:30px}#bmi #bmi-ongoing-backup .nuts .nut-2{top:37px;left:15px}#bmi #bmi-ongoing-backup .nuts .nut-3{top:47px;left:37px}#bmi .ml50{margin-left:50px}#bmi .error-noticer{padding:25px 35px;border:1px solid red;border-radius:10px;background:#fbeded;color:red;position:relative;margin-bottom:25px}#bmi .error-noticer .error-header{font-weight:600;font-size:18px}#bmi .error-noticer .error-body{display:none;font-size:16px;padding-left:20px;padding-right:20px;padding-top:20px;line-height:25px}#bmi .error-noticer .error-body b{padding-top:10px;display:block}#bmi .lrn-mr-btn{line-height:70px}#bmi .learn_more_about_cron{background:white;padding:35px 55px 25px;border-radius:10px;font-size:17px;line-height:25px;min-width:calc(100% - 110px);margin-bottom:25px}#bmi .bmi-backup-btn{height:185px;width:185px;outline:none;display:flex;cursor:pointer;font-size:20px;background-color:#257671;position:relative;transition:all 0.7s ease;-webkit-transition:all 0.7s ease;-moz-transition:all 0.7s ease;-o-transition:all 0.7s ease;-ms-transition:all 0.7s ease;border-radius:10px;padding:20px}#bmi .bmi-backup-btn .vcenter{width:calc(100% - 40px)}#bmi .bmi-backup-btn .vcenter .text{margin-top:6px;line-height:1.2}#bmi .bmi-backup-btn.one{border-color:#fff;overflow:hidden;color:#fff}#bmi .bmi-backup-btn.one .insider{opacity:0.6;background-color:rgba(255,255,255,0.14);width:340px;height:162px;position:absolute;right:1px;bottom:86px;transform:rotateZ(-45deg);-webkit-transform:rotateZ(-45deg);-moz-transform:rotateZ(-45deg);-o-transform:rotateZ(-45deg);-ms-transform:rotateZ(-45deg);transition:all 0.3s ease;-webkit-transition:all 0.3s ease;-moz-transition:all 0.3s ease;-o-transition:all 0.3s ease;-ms-transition:all 0.3s ease}#bmi .bmi-backup-btn.one .insider-2{opacity:0.6;background:linear-gradient(180deg, rgba(255,255,255,0.73) 0%, rgba(255,255,255,0.14) 55%);width:390px;height:318px;position:absolute;right:-308px;bottom:-267px;transform:rotateZ(-45deg);-webkit-transform:rotateZ(-45deg);-moz-transform:rotateZ(-45deg);-o-transform:rotateZ(-45deg);-ms-transform:rotateZ(-45deg);transition:all 0.3s ease;-webkit-transition:all 0.3s ease;-moz-transition:all 0.3s ease;-o-transition:all 0.3s ease;-ms-transition:all 0.3s ease}#bmi .bmi-backup-btn.one:hover .insider{transition:all 0.5s ease;-webkit-transition:all 0.5s ease;-moz-transition:all 0.5s ease;-o-transition:all 0.5s ease;-ms-transition:all 0.5s ease;right:108px;bottom:200px}#bmi .bmi-backup-btn.one:hover .insider-2{transition:all 0.6s ease;-webkit-transition:all 0.6s ease;-moz-transition:all 0.6s ease;-o-transition:all 0.6s ease;-ms-transition:all 0.6s ease;transition-delay:0.5s;right:19px;bottom:75px}#bmi .tab-wrapper{min-width:100%}#bmi .tabs{border:0 !important;background-color:white;margin-bottom:25px;border-top-left-radius:10px;border-top-right-radius:10px}#bmi .tabs .tab.active{cursor:not-allowed}#bmi .tabs .tab:first-child{border-top-left-radius:10px}#bmi .tabs .tab:last-child{border-top-right-radius:10px}#bmi .tabs .tab{padding-top:18px;width:calc(50% - 1px);border-left:1px solid rgba(176,69,46,0.12);text-align:center;padding-bottom:18px;color:#8e8e8e}#bmi .tabs .tab.active{position:relative;color:#257671}#bmi .tabs .tab.active:not(.active):hover::before{border-bottom:7px solid white !important}#bmi .tabs .tab.active::before{content:'';height:0px;width:0px;transition:.3s all;background:transparent;border-top:5px solid transparent;border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid #257671;position:absolute;bottom:0;left:0;right:0;margin:0 auto;transform:translateX(-50%)}#bmi .tabs .tab.active::after{content:'';position:absolute;bottom:0;left:0;right:0;width:100%;height:6px;border-bottom:2px solid #257671}#bmi .tabs .tab:first-child.active::after{border-bottom-left-radius:14px}#bmi .tabs .tab:last-child.active::after{border-bottom-right-radius:14px}#bmi .tabs .tab:first-child{width:50%;border-left:0 !important}#bmi .tabs .tab:not(.active):hover{color:white;background:#257671}#bmi .collapser.active .header:not(.ignorehov){background:#257671;color:white}#bmi .collapser.active .header{border-bottom-left-radius:0px;border-bottom-right-radius:0px}#bmi .collapser.active .header:not(.ignorehov)::after{filter:brightness(0) invert(1) grayscale(1) !important;opacity:0.95 !important}#bmi .collapser.active .header::after{transform:rotate(180deg)}#bmi .collapser{border-radius:10px}#bmi .collapser .header{padding:21px 45px;background:white;border-radius:10px;position:relative}#bmi .collapser .header:not(.ignorehov):hover{background:#257671;color:white}#bmi .collapser .header::after{content:'';position:absolute;background:url("../images/arrow-min.png");background-size:cover;background-repeat:no-repeat;margin-top:4px;right:45px;width:19px;height:11px;transition:.3s all}#bmi .collapser .header:not(.ignorehov):hover::after{filter:brightness(0) invert(1) grayscale(1) !important;opacity:0.95 !important}#bmi .collapser .content{display:none;background:white;min-width:100%;border-bottom-left-radius:10px;border-bottom-right-radius:10px}#bmi #manage-restore-wrapper .restore-wrapper{background-color:white;padding-top:40px;padding-bottom:40px;min-width:100%;margin-top:10px}#bmi #manage-restore-wrapper .m{margin-left:30px;margin-right:30px}#bmi #manage-restore-wrapper .header{background:#beeddf;background:linear-gradient(60deg, #beeddf 10%, #dffaf2 100%);height:18px}#bmi #manage-restore-wrapper .header::before{content:'';position:absolute;background:#beeddf;background:linear-gradient(60deg, #dffaf2 10%, #beeddf 100%);left:0;top:0;border-radius:10px;width:100%;height:100%;opacity:0 !important;transition:.3s all}#bmi #manage-restore-wrapper .bold{position:absolute}#bmi #manage-restore-wrapper .collapser.active .header::before{border-bottom-left-radius:0px;border-bottom-right-radius:0px;opacity:1 !important}#bmi #manage-restore-wrapper .header:hover::before{opacity:1 !important}#bmi #manage-restore-wrapper .content{min-width:calc(100% - 90px);position:relative;padding:10px 45px}#bmi #manage-restore-wrapper .content .bg-quick-migration{top:0;left:0;right:0;bottom:0;position:absolute;width:100%;height:100%;object-fit:cover;object-position:center;pointer-events:none;border-bottom-left-radius:10px;border-bottom-right-radius:10px}#bmi #manage-restore-wrapper .content .content-above{position:relative}#bmi #manage-restore-wrapper .content .quick-migration{border-radius:10px}#bmi #manage-restore-wrapper .content .text-heading{padding:15px 0}#bmi #manage-restore-wrapper .content input{box-sizing:border-box;line-height:30px;border:1px solid #c6c9cf;width:100%;padding:11px;font-size:18px;border-radius:10px}#bmi #manage-restore-wrapper .content button{width:358px}#bmi #manage-restore-wrapper .heading-sq .bold{position:relative;padding-right:35px}#bmi #manage-restore-wrapper .heading-sq .bold::after{content:'';background:url("../images/next-icon-min.png");background-size:cover;height:24px;width:24px;position:absolute;top:0;right:0}#bmi #manage-restore-wrapper .valign-restore .a1{padding-top:6px;padding-right:6px}#bmi #manage-restore-wrapper .valign-restore .a2{padding-top:4px;padding-right:6px}#bmi #manage-restore-wrapper .table-wrapper{max-width:100%;overflow-y:auto}#bmi #manage-restore-wrapper .table-wrapper table{width:100%;min-width:400px;border-collapse:collapse;margin-bottom:10px}#bmi #manage-restore-wrapper .table-wrapper table .restore-btn{color:white;font-size:13px;font-weight:600;background:#0ec094;border-radius:5px;width:95px;height:25px;border:1px solid #0ec094;display:flex;justify-content:space-evenly;align-items:center}#bmi #manage-restore-wrapper .table-wrapper table th{font-size:19px;text-align:left;color:#111}#bmi #manage-restore-wrapper .table-wrapper table th.inactive{color:#c3c3c3}#bmi #manage-restore-wrapper .table-wrapper table tr{border-bottom:2px solid #e1dada}#bmi #manage-restore-wrapper .table-wrapper table tr th,#bmi #manage-restore-wrapper .table-wrapper table tr td{padding-top:15px;padding-bottom:14px}#bmi #manage-restore-wrapper .table-wrapper table tr td{font-size:18px;color:#333}#bmi .log-wrapper pre{max-height:200px;overflow:auto;line-height:1.2;font-size:13px;white-space:nowrap;text-align:left;background:#fbfbfb;border:1px solid #cececc;border-radius:10px;padding:30px}#bmi .log-wrapper pre .red{color:red}#bmi .log-wrapper pre .blue{color:blue}#bmi .log-wrapper pre .green{color:green}#bmi .log-wrapper pre .orange{color:#f59e00}#bmi .progress-bar-wrapper{line-height:1;margin-top:70px;margin-bottom:30px}#bmi .progress-bar-wrapper .progress-bar{position:relative;height:10px;width:100%;border-radius:10px;background:#f1f1f1}#bmi .progress-bar-wrapper .progress-active-bar{position:absolute;background:#257671;border-radius:10px;height:14px;width:40%;top:-2px;left:0;transition:0.1s all cubic-bezier(0, 0, 0.6, 1);box-shadow:0px 0px 10px rgba(0,0,0,0.4)}#bmi .progress-bar-wrapper .progress-active-bar::before{content:'';position:absolute;border-radius:10px;height:14px;width:20%;top:0;right:0;z-index:0}#bmi .progress-bar-wrapper .progress-percentage{position:absolute;background:#257671;width:32px;height:32px;border-radius:50%;transform:translate(calc(-50% - 3px), 0);bottom:26px;text-align:center;color:white;line-height:34px;font-size:11px;font-weight:800;transition:0.1s all cubic-bezier(0, 0, 0.6, 1)}#bmi .progress-bar-wrapper .progress-percentage::after{content:'';left:50%;position:absolute;background:#257671;width:6px;height:6px;border-radius:50%;transform:translate(-50%, 0);bottom:-10px}#bmi .deleteAllSelected{height:45px;width:265px;border-radius:10px;font-size:15px !important;font-weight:bold;padding-top:0 !important;padding-bottom:0 !important}#bmi .lds-spinner{color:#257671;display:inline-block;position:relative;width:20px;height:14px}#bmi .lds-spinner div{transform-origin:10px 10px;animation:lds-spinner 1.2s linear infinite}#bmi .lds-spinner div:after{content:" ";display:block;position:absolute;top:2px;left:9px;width:2px;height:4px;border-radius:20%;background:#257671}#bmi .lds-spinner div:nth-child(1){transform:rotate(0deg);animation-delay:-1.1s}#bmi .lds-spinner div:nth-child(2){transform:rotate(30deg);animation-delay:-1s}#bmi .lds-spinner div:nth-child(3){transform:rotate(60deg);animation-delay:-0.9s}#bmi .lds-spinner div:nth-child(4){transform:rotate(90deg);animation-delay:-0.8s}#bmi .lds-spinner div:nth-child(5){transform:rotate(120deg);animation-delay:-0.7s}#bmi .lds-spinner div:nth-child(6){transform:rotate(150deg);animation-delay:-0.6s}#bmi .lds-spinner div:nth-child(7){transform:rotate(180deg);animation-delay:-0.5s}#bmi .lds-spinner div:nth-child(8){transform:rotate(210deg);animation-delay:-0.4s}#bmi .lds-spinner div:nth-child(9){transform:rotate(240deg);animation-delay:-0.3s}#bmi .lds-spinner div:nth-child(10){transform:rotate(270deg);animation-delay:-0.2s}#bmi .lds-spinner div:nth-child(11){transform:rotate(300deg);animation-delay:-0.1s}#bmi .lds-spinner div:nth-child(12){transform:rotate(330deg);animation-delay:0s}@keyframes lds-spinner{0%{opacity:1}100%{opacity:0}}#bmi .prenotices{margin-top:45px;margin-bottom:45px}#bmi .prenotices .prenotice:first-child{border-top:1px solid #eeebeb}#bmi .prenotices .prenotice{position:relative;background:#fcfcfc;border-bottom:1px solid #eeebeb}#bmi .prenotices .prenotice .text{padding-top:25px;padding-bottom:25px;padding-left:155px;padding-right:60px;font-size:18px;line-height:1.2}#bmi .prenotices .prenotice.top{border-top-right-radius:10px;border-top-left-radius:10px}#bmi .prenotices .prenotice.top .text{padding-right:120px;padding-left:215px;font-size:20px;line-height:25px}#bmi .prenotices .prenotice::before{content:'';position:absolute;background:url("../images/warning-grey.png");width:46px;height:41px;top:50%;transform:translate(0, -50%);left:60px}#bmi .prenotices .prenotice.top::before{left:120px}#bmi .prenotices .prenotice.red{background:#feedee !important}#bmi .prenotices .prenotice.red::before{background:url("../images/warning-red.png")}#bmi .btn{display:block;background:#257671;box-shadow:0 10px 9px rgba(0,0,0,0.24);color:white;padding-top:18px;padding-bottom:18px;border-radius:10px;font-size:18px;line-height:1.2;transition:0.3s all;cursor:pointer;text-decoration:none}#bmi .btn .text{display:inline-block}#bmi .btn.btn-pad{padding-left:50px;padding-right:50px}#bmi .btn.btn-img-low-pad .text{padding-left:40px !important}#bmi .btn:hover{background:#206662;box-shadow:0 10px 15px rgba(0,0,0,0.34)}#bmi .btn:active{transition:0 all;background:#1b5753;box-shadow:0 10px 5px rgba(0,0,0,0.14)}#bmi .btn.red{background:#da2b2b}#bmi .btn.red:hover{background:#cd2424}#bmi .btn.red:active{background:#bb2121}#bmi .btn.lime{background:#4dbb84}#bmi .btn.lime:hover{background:#43b07a}#bmi .btn.lime:active{background:#3ea270}#bmi .btn.gray,#bmi .btn.grey{background:#b6b6b6}#bmi .btn.gray:hover,#bmi .btn.grey:hover{background:#acacac}#bmi .btn.gray:active,#bmi .btn.grey:active{background:#a2a2a2}#bmi .btn.btn-with-img .text{padding-left:60px;position:relative}#bmi .btn.btn-with-img img{position:absolute;top:50%;left:0;transform:translate(0, -50%)}#bmi input[type="checkbox"]{border-radius:4px;width:22px !important;height:22px !important;position:relative;transition:0.3s all}#bmi input[type="checkbox"],#bmi input[type="checkbox"]:active,#bmi input[type="checkbox"]:focus{outline:0 !important;box-shadow:none !important;border-color:#257671 !important}#bmi input[type="checkbox"]::before{content:'' !important;border-color:#257671 !important;border-radius:3px;transition:0.3s all;margin:0 !important;height:20px !important;width:20px !important;float:left;display:inline-block;vertical-align:middle;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}#bmi input[type="checkbox"]:checked{background:#257671 !important}#bmi input[type="checkbox"]:checked::after{content:'';width:10px;height:5px;border-left:3px solid white;border-bottom:3px solid white;top:4px;left:4px;transform:rotate(-48deg);position:absolute}#bmi .success-copy-input input{width:calc(100% - 170px - 15px);margin-right:15px;line-height:44px;border-radius:10px;border:1px solid #d1d4d9;background:#fff}#bmi .success-copy-input a{line-height:10px;padding-left:40px !important;padding-right:40px !important;box-shadow:none !important;text-decoration:none}#bmi .grey-btn{background:#aaa;width:85%;line-height:13px}#bmi .save-btn{text-align:center;font-weight:700;width:450px;margin:0 auto;font-size:27px}#bmi .max300{max-width:300px;margin:0 auto}#bmi .max280{max-width:280px;margin:0 auto}#bmi label:hover input[type="checkbox"]{background:#dfdfdf}#bmi .btn.othersec{margin-top:6px;padding-top:13px;padding-bottom:13px}#bmi .file-checkboxes-wrapper{padding-left:32px}#bmi .file-checkboxes-wrapper .file-checkboxes label{display:block;width:50%;margin-bottom:10px}#bmi .file-checkboxes-wrapper div{margin-top:5px;margin-bottom:5px}#bmi .note{width:500px;margin:50px auto;font-size:1.1em;color:#333;text-align:justify}#bmi #drop-area{border:2px dashed #ccc;border-radius:20px;width:100%;height:340px;margin-top:10px;background:#f9f9f9}#bmi #drop-area:hover{background:linear-gradient(90deg, #d1efe6, #e5f6f1)}#bmi #drop-area.highlight{border-color:#257671}#bmi .my-form{margin-bottom:10px;margin-top:35px}#bmi #gallery{margin-top:10px}#bmi .img_upload{width:100px;height:75px;background-image:url("../images/upload.svg")}#bmi #gallery img{width:150px;margin-bottom:10px;margin-right:10px;vertical-align:middle}#bmi .button{display:inline-block;padding:10px;background:#ccc;cursor:pointer;border-radius:5px;border:1px solid #ccc}#bmi .button:hover{background:#ddd}#bmi #upid_input{position:absolute;left:2508px;top:3273px;opacity:0;z-index:9999;width:1px;height:1px;display:none}#bmi .ortext{font-size:18px;line-height:54px}#bmi .upload_button{font-size:18px;font-weight:800;padding:0;height:50px;line-height:50px;padding:0 20px}#bmi .upload-progress{border:2px dashed #ccc;padding-bottom:45px;border-radius:20px;margin-top:10px;margin-bottom:10px;overflow:hidden;position:relative}#bmi .upload-progress .upload-progress-bar{width:90%;margin:0 auto;background:#f1f1f1;height:10px;margin-top:65px;position:relative;border-radius:10px;margin-bottom:10px}#bmi .upload-progress .upload-progress-bar span{display:block;position:absolute;top:-2px;left:0;width:50%;background:#257671;height:14px;z-index:10;border-radius:10px;transition:0.1s all cubic-bezier(0, 0, 0.6, 1)}#bmi .upload-progress .upload-progress-bar .upload-percentage{position:absolute;bottom:calc(100% + 14px);right:-13px;color:white;background:#257671;border-radius:50%;width:30px;height:30px;font-size:12px;text-align:center;line-height:30px}#bmi .upload-progress .upload-progress-bar .upload-percentage::after{position:absolute;content:'';top:calc(100% + 4px);left:0;right:0;margin:0 auto;width:6px;height:6px;background:#257671;border-radius:50%}#bmi .upload-title{font-size:23px;font-weight:800}#bmi .bmi-txtar{padding:15px;border-radius:10px;font-size:18px;resize:none}#bmi .inline-radio{padding-right:20px}#bmi .exclude-row input{border-radius:5px;width:130px;height:44px;border:1px solid #d1d4d9;font-size:18px;margin:0 10px;text-align:center}#bmi .mbfieldlimit{font-size:20px;text-align:center;justify-content:center;margin:8px 5px;box-sizing:border-box;border:1px solid #d1d4d9;border-radius:5px;width:85px;height:45px;justify-content:center;align-items:center}#bmi .overlay-premium{display:none}#bmi .clocks_container{display:none}#bmi .overlayed:hover{position:relative}#bmi .overlayed:hover .overlay-premium{display:flex;position:absolute;top:0;left:0;width:100%;height:100%;background-image:url("../images/big_bg_clock_white-min.png");background-repeat:no-repeat;background-size:cover;align-items:center;justify-content:center;z-index:100000;border-top:1px solid #cdcdcd;border-bottom:1px solid #cdcdcd}#bmi .overlayed:hover .clocks_container{display:flex;position:absolute;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,0.05);align-items:center;flex-direction:column;justify-content:center;height:100%;position:relative;font-size:18px}#bmi .tab2-item{position:relative;display:flex;justify-content:space-between;align-items:center;width:100%;background:#f6f6f6;border-radius:10px;height:70px;padding:0 30px;margin-top:15px;box-sizing:border-box}#bmi .tab2-item .container-40{margin:0 40px}#bmi .tab2-item .pb30{padding-bottom:30px}#bmi .tab2-item .bg_grey{background:#f8f8f8}#bmi .tab2-item .not-ready{position:absolute;left:0;width:100%;height:100%;background-color:#e5e5e5;opacity:0.7;border-radius:10px}#bmi .tab2-item .bg_clock_day2{display:none;background-image:url("../images/big_bg_clock_green-min.png");width:100%;height:100%;position:absolute;left:0;background-size:cover;background-repeat:no-repeat;z-index:3;color:white;border-radius:10px}#bmi .tab2-item .clock_img{flex-basis:5%}#bmi .tab2-item .d-flex{display:flex;flex:1}#bmi .tab2-item .ia-center{align-items:center}#bmi .tab2-item .switch{position:relative;width:70px;height:30px;overflow:hidden;border:none;padding:0;background:none}#bmi .tab2-item .switch.b2{border-radius:15px;border:none;background:none;padding:0}#bmi .tab2-item .switch.b2 .checkbox{position:relative;width:100%;height:100%;padding:0;margin:0;opacity:0;cursor:pointer;z-index:3;border:none}#bmi .tab2-item .knobs{z-index:2;position:absolute;top:0;right:0;bottom:0;left:0}#bmi .tab2-item .switch .knobs:before{content:'Off';left:7px}#bmi .tab2-item .switch .knobs:before,#bmi .tab2-item .switch .knobs:after{color:white;z-index:1}#bmi .tab2-item .switch .knobs:before,#bmi .tab2-item .switch .knobs:after,#bmi .tab2-item .switch .knobs span{position:absolute;top:6px;width:17px;height:17px;font-size:18px;font-weight:bold;text-align:center;line-height:1;padding:0 3px;border-radius:2px;transition:0.4s ease all}#bmi .tab2-item .switch .knobs:after{content:'On';right:17px}#bmi .tab2-item .switch .knobs:after{padding:0 12px}#bmi .tab2-item .switch .checkbox:checked+.knobs:before,#bmi .tab2-item .switch .checkbox:not(:checked)+.knobs:after{opacity:0}#bmi .tab2-item .switch .knobs:before,#bmi .tab2-item .switch .knobs:after{color:white;z-index:1}#bmi .tab2-item .switch .knobs:after{padding:0 12px}#bmi .tab2-item .switch .knobs:before,#bmi .tab2-item .switch .knobs:after,#bmi .tab2-item .switch .knobs span{position:absolute;top:6px;width:17px;height:17px;font-size:18px;font-weight:bold;text-align:center;line-height:1;padding:0 3px;border-radius:2px;transition:0.4s ease all}#bmi .tab2-item .layer,#bmi .tab2-item .layer_str{width:100%;background-color:#d5d5d5;transition:0.3s ease all;z-index:1}#bmi .tab2-item .button-cover,#bmi .tab2-item .knobs,#bmi .tab2-item .layer,#bmi .tab2-item .layer_str{position:absolute;top:0;right:0;bottom:0;left:0}#bmi .tab2-item .switch.b2 .checkbox{position:relative;width:100%;height:100%;padding:0;margin:0;opacity:0;cursor:pointer;z-index:3;border:none}#bmi .tab2-item .title_whereStored{font-size:20px;font-weight:bold}#bmi .tab2-item .ml25{margin-left:25px}#bmi .tab2-item .switch .knobs span{left:48px;background-color:white;z-index:2}#bmi .tab2-item .switch .knobs:before,#bmi .tab2-item .switch .knobs:after,#bmi .tab2-item .switch .knobs span{position:absolute;top:6px;width:17px;height:17px;font-size:18px;font-weight:bold;text-align:center;line-height:1;padding:0 3px;border-radius:2px;transition:0.4s ease all}#bmi .tab2-item .switch .knobs span{padding:0;border-radius:50%;top:6px}#bmi .tab2-item .not_ready{position:absolute;left:0;width:100%;height:100%;background-color:#e5e5e5;opacity:0.7;border-radius:10px}#bmi .tab2-item .link-white:hover{text-decoration:underline;color:white}#bmi .tab2-item .link-white{color:white;text-decoration:none}#bmi .tab2-item .crown2{width:20px;height:20px;margin-left:7px;z-index:1}#bmi .tab2-item .d-flex .w100 .input-locally_web_server{width:100%;height:55px;border-radius:10px;margin:8px 0 !important;text-align:left !important;padding:0 20px;color:black}#bmi .tab2-item .w270{min-width:270px}#bmi .tab2-item:hover .bg_clock_day2{display:flex;justify-content:center;align-items:center}#bmi .tab2-item.activeList{color:white;background:#257671 !important;border-bottom-left-radius:0;border-bottom-right-radius:0}#bmi .tab2-item.activeList .switch .checkbox:checked ~ .layer_str{background-color:#154e4b}#bmi .tab2-item.activeList .bg_grey{background:#f8f8f8}#bmi .tab2-item.activeList .switch .checkbox:checked+.knobs:before,#bmi .tab2-item.activeList .switch .checkbox:not(:checked)+.knobs:after{opacity:0}#bmi .tab2-item.activeList .switch .checkbox:checked+.knobs span{left:7px;background-color:white}#bmi .container-radio input{position:absolute;opacity:0;cursor:pointer}#bmi .checkmark-radio{position:absolute;top:0;left:0;height:25px;width:25px;background-color:#fff;border:1px solid;border-radius:50%}#bmi .container-radio:hover input ~ .checkmark-radio{background-color:#cecece}#bmi .container-radio input:checked ~ .checkmark-radio{background-color:white;border:1px solid #257671}#bmi .checkmark-radio:after{content:"";position:absolute;display:none}#bmi .container-radio input:checked ~ .checkmark-radio:after{display:block}#bmi .container-radio .checkmark-radio:after{top:5px;left:5px;width:10px;height:10px;border-radius:50%;background:#257671}#bmi .container-checkbox .checkmark-checkbox:after{left:9px;top:5px;width:5px;height:10px;border:solid white;border-width:0 3px 3px 0;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg)}#bmi .input-mar{margin:30px 0}#bmi .container-40{margin:0 40px}#bmi .container-36{margin:0 36px 0 40px}#bmi .container-55{margin:0 55px}#bmi .d-flex{display:flex}#bmi .w270{min-width:270px}#bmi .w100{width:100%}#bmi .pos-r{position:relative}#bmi .mt20{margin-top:20px}#bmi .pb30{padding-bottom:30px}#bmi .pt30{padding-top:30px}#bmi .bg_grey{background:#f8f8f8}#bmi .input-file{width:100%;height:55px}#bmi .input-file-user{position:relative;height:55px;width:525px;font-size:14px}#bmi .input-file-user::placeholder{font-size:14px}#bmi .input-label-file{color:#aaaeb3;width:525px;height:55px;border:1px solid #d1d4d9;border-radius:10px;display:flex;align-items:center;padding:0 30px}#bmi #copy-password{height:45px;width:410px;border-radius:10px;border:1px solid #d1d4d9;text-align:left}#bmi #copy-url{height:45px;width:480px;border-radius:10px;border:1px solid #d1d4d9}#bmi #copy-key{height:45px;width:230px;border-radius:10px;border:1px solid #d1d4d9}#bmi .input-other{height:45px;width:255px;border-radius:10px;border:1px solid #d1d4d9}#bmi #creatingBackUp{height:55px;border:1px solid #c6c9cf;border-radius:10px;padding:0 30px}#bmi .creatingBackUp input[type=text]{display:flex;font-size:20px;text-align:left;justify-content:center;margin:8px 5px;box-sizing:border-box;border:1px solid #d1d4d9}#bmi #backupsfile{border:1px dashed #a9a9a9;border-radius:10px;display:flex;justify-content:center}#bmi .drop{height:300px;display:flex;align-items:center;justify-content:center}#bmi .drop .dz-default{display:none}#bmi #textAreaCopy{height:230px;padding:25px;box-sizing:border-box;font-size:14px;color:#aaaaaa}#bmi .inprogressCreate{height:130px;padding:30px 40px;border:1px solid #aaaaaa;border-radius:10px;color:black;font-size:13px;overflow-y:auto}#bmi #text-areaSomeHick{height:240px;padding:25px;box-sizing:border-box;font-size:14px;color:#aaaaaa}#bmi #backupIsNowAccessible{height:51px;width:99%;border-radius:10px;border:1px solid #d1d4d9;text-align:left;padding-left:10px}#bmi .backupSuccess_link_container{display:flex;align-items:center;position:relative;margin:15px 70px 0}#bmi .input-config_set{width:280px;height:45px;border-radius:10px;padding-left:10px;text-align:left !important}#bmi .link_duplicate{color:#6bd5a0;margin:0 13px;text-decoration:none}#bmi .link_export{color:#0e80c9;margin:0 13px;text-decoration:none}#bmi .link_delete{color:#c20000;margin:0 13px;text-decoration:none}#bmi .d-flex .w100 .input-locally_web_server{width:100%;height:55px;border-radius:10px;margin:8px 0 !important;text-align:left !important;padding:0 20px;color:black}#bmi div .dropzone{position:relative;cursor:pointer;margin:20px 0;height:340px;border:2px dashed rgba(0,0,0,0.3);padding:20px;border-radius:20px;color:gray;background-color:#f9f9f9}#bmi .dropzone:hover{background:linear-gradient(90deg, #d1efe6, #e5f6f1)}#bmi .input-file-dropzone{opacity:0;width:100%;height:340px;position:absolute;top:0;left:0;cursor:pointer}#bmi .mt25{margin-top:25px}#bmi .mt16{margin-top:16px}#bmi .container-input{display:block;position:relative;padding-left:5px;cursor:pointer;font-size:22px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}#bmi .custom-input{width:65px;height:45px;justify-content:center;align-items:center;border-radius:5px;border:1px solid #d1d4d9}#bmi .bg_grey .d-flex input[type=text]{margin:8px 10px}#bmi .d-flex input[type=text],#bmi .d-flex input[type=number],#bmi .d-flex input[type=email]{font-size:20px;text-align:center;justify-content:center;margin:8px 5px;box-sizing:border-box;border:1px solid #d1d4d9;border-radius:5px}#bmi .d-flex input[type=email]{font-size:17px}#bmi .d-flex input[type=text]:focus,#bmi .d-flex input[type=number]:focus,#bmi .d-flex input[type=email]:focus{box-shadow:none}#bmi .container-radio{display:block;position:relative;padding-left:35px;cursor:pointer;font-size:22px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;margin-right:25px;line-height:25px;margin-top:5px}#bmi .mtf2{margin-top:2px}#bmi .mtf3{margin-top:3px}#bmi .checkmark-radio{position:absolute;top:0;left:0;height:20px;width:20px;background-color:#fff;border:1px solid;border-radius:50%}#bmi .tab2-img{width:35px;height:40px}#bmi .container-radio{opacity:0.5 !important;transition:.3s all}#bmi .container-radio.active{opacity:1 !important}#bmi .bmi-text-input{height:55px;border-radius:10px;margin:8px 0 !important;text-align:left !important;padding:0 20px;color:black;min-width:500px;border:1px solid #d1d4d9;box-shadow:0 !important;box-shadow:none !important;font-size:20px;text-align:center !important}#bmi .bmi-text-input.small{height:45px;line-height:45px;min-width:255px}#bmi #format-tip-wrp{margin-bottom:60px}#bmi .bmi-dropdown{display:inline-block;position:relative;border-radius:5px;border:1px solid #d1d4d9;background:#fff;font-size:18px;line-height:22px}#bmi .bmi-dropdown .dropdown-title{position:relative;padding:10px 8px;padding-right:30px;text-align:center;cursor:pointer}#bmi .bmi-dropdown .dropdown-title::before{content:'';position:absolute;border:solid #257671;border-width:0 3px 3px 0;padding:3px;transform:rotate(45deg);-webkit-transform:rotate(45deg);right:10px;top:calc(50% - 6px);transition:.3s all}#bmi .bmi-dropdown .dropdown-title::after{content:'';position:absolute;border-left:1px solid #37b0a9;opacity:.3;height:26px;top:8px;right:29px;transition:.3s all}#bmi .dropdown-options{font-size:18px;line-height:22px;display:none;position:absolute;background:white;text-align:center;z-index:1000;min-width:100%;border:1px solid #257671;top:calc(100% + 8px);right:0;left:-1px;border-radius:5px;box-shadow:0px 0px 20px -5px rgba(0,0,0,0.4);overflow:auto;max-height:300px}#bmi .dropdown-options .active-option{position:relative;opacity:.6}#bmi .dropdown-options .active-option::after{content:'';position:absolute;top:0;left:0;right:0;bottom:0;width:100%;height:100%;cursor:not-allowed}#bmi .dropdown-options .dropdown-option{padding:10px 8px;white-space:nowrap;text-overflow:ellipsis;transition:.3s all;cursor:pointer}#bmi .dropdown-options .dropdown-option:not(.active-option):hover{background:#257671;color:white}#bmi .dropdown-options::before{content:'';position:absolute;left:0;right:0;margin:0 auto;top:-5px;width:0;height:0;border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:5px solid #257671}#bmi .bmi-dropdown.active{border-color:#257671}#bmi .bmi-dropdown.active .dropdown-title::before{transform:rotate(-135deg);-webkit-transform:rotate(-135deg);top:calc(50% - 3px)}#bmi .bmi-switch{position:relative;display:inline-block;width:70px;height:30px}#bmi .bmi-switch input{display:none}#bmi .bmi-switch-slider{position:absolute;cursor:pointer;top:0;left:0;right:0;bottom:0;background-color:#257671;-webkit-transition:0.4s;transition:0.4s}#bmi .bmi-switch-slider:before{position:absolute;content:"";height:17px;width:17px;left:6px;bottom:7px;background-color:white;-webkit-transition:0.4s;transition:0.4s}#bmi input:checked+.bmi-switch-slider{background-color:#d5d5d5}#bmi input:checked+.bmi-switch-slider:before{-webkit-transform:translateX(40px);-ms-transform:translateX(40px);transform:translateX(40px)}#bmi .off{opacity:0}#bmi .off,#bmi .on{font-size:18px;font-weight:bold;color:white;position:absolute;transform:translate(0, -50%);top:50%;transition:.3s all}#bmi .off{left:10px}#bmi .on{right:10px}#bmi input:checked+.bmi-switch-slider .off{opacity:1}#bmi input:checked+.bmi-switch-slider .on{opacity:0}#bmi .bmi-switch-slider.round{border-radius:15px}#bmi .bmi-switch-slider.round:before{border-radius:50%}#bmi .label_e50._bottom_ea7{border-top-left-radius:8px !important;border-top-right-radius:34px !important;min-width:300px}#bmi .label_e50{position:fixed;z-index:2147483648;-webkit-backface-visibility:hidden;backface-visibility:hidden;height:40px;box-shadow:0 12px 14px 8px rgba(0,0,0,0.17);filter:blur(0)}#bmi jdiv{-webkit-animation:0s none;animation:0s none;-webkit-backface-visibility:visible;backface-visibility:visible;background:none;border:0;box-shadow:none;box-sizing:content-box;bottom:auto;caption-side:top;clear:none;clip:auto;cursor:auto;display:inline;direction:ltr;flex:none;height:auto;-webkit-hyphens:manual;-ms-hyphens:manual;hyphens:manual;image-rendering:auto;justify-content:flex-start;left:auto;letter-spacing:normal;line-height:normal;margin:0;max-height:none;max-width:none;min-height:0;min-width:0;-o-object-fit:fill;object-fit:fill;opacity:1;order:1;orphans:2;outline:0 none;overflow:visible;padding:0;perspective:none;position:static;resize:none;right:auto;text-align:left;text-decoration:none;text-indent:0;text-overflow:clip;text-shadow:none;text-transform:none;top:auto;transform:none;transition:all 0s ease 0s;unicode-bidi:normal;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;vertical-align:baseline;white-space:normal;width:auto;word-break:normal;word-spacing:normal;word-wrap:normal;z-index:auto;zoom:normal;filter:none !important;font-weight:400;-webkit-text-size-adjust:inherit;-webkit-font-smoothing:antialiased;-webkit-text-fill-color:currentColor}#bmi .hoverl_bc6{cursor:pointer}#bmi .label_e50._bottom_ea7 .text_468._noAd_b4d,#bmi .label_e50._left_bba .text_468._noAd_b4d,#bmi .label_e50._right_56b .text_468._noAd_b4d{margin:0 33px 0 16px}#bmi .label_e50._bottom_ea7 .text_468,#bmi .label_e50._left_bba .text_468,#bmi .label_e50._right_56b .text_468{transform:translateZ(0);margin:0 37px 0 16px;min-width:160px;visibility:visible}#bmi .label_e50 .text_468{font:inherit;text-indent:0;line-height:40px;vertical-align:top;white-space:nowrap;-webkit-font-smoothing:antialiased;visibility:visible;-webkit-backface-visibility:hidden;backface-visibility:hidden}#bmi .contentTransitionWrap_c73{-webkit-animation-name:fadeIn_d9b;animation-name:fadeIn_d9b;-webkit-animation-duration:0.15s;animation-duration:0.15s;-webkit-animation-fill-mode:backwards;animation-fill-mode:backwards;-webkit-animation-timing-function:ease;animation-timing-function:ease}#bmi .leaf_2cc{position:absolute;width:32px;height:33px;z-index:6;overflow:hidden}#bmi .leaf_2cc._bottom_afb,#bmi .leaf_2cc._left_7af,#bmi .leaf_2cc._right_ff0{right:0;top:0;width:33px;border-radius:0 24px 0 0 !important}#bmi .cssLeaf_464{background-image:url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2232%22%20height%3D%2240%22%20viewBox%3D%220%200%2032%2040%22%3E%0A%20%20%20%20%3Cg%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%0A%20%20%20%20%20%20%20%20%3Cpath%20fill%3D%22%23424867%22%20d%3D%22M0%200h9.02L32%2033.196V40H0z%22%2F%3E%0A%20%20%20%20%20%20%20%20%3Cpath%20fill%3D%22%2318C139%22%20d%3D%22M9%200c3.581.05%2023%205.426%2023%2033.08v.03C18.922%2030.751%209%2019.311%209%205.554V0z%22%2F%3E%0A%20%20%20%20%3C%2Fg%3E%0A%3C%2Fsvg%3E%0A");position:absolute;height:33px;width:33px;left:1px}#bmi #bmi_support_chat *{cursor:pointer !important}#bmi #bmi_support_chat{cursor:pointer !important;opacity:1;transition:0.3s all}#bmi #bmi_support_chat:hover{opacity:0.9}#bmi *{outline:0}#bmi-preload{width:calc(50%);margin:0 auto;padding-right:20px;margin-top:50px}#bmi-preload .progress{position:relative;height:4px;display:block;width:100%;background-color:#acece6;border-radius:2px;background-clip:padding-box;margin:0.5rem 0 1rem 0;overflow:hidden}#bmi-preload .progress .determinate{position:absolute;background-color:inherit;top:0;bottom:0;background-color:#26a69a;transition:width .3s linear}#bmi-preload .progress .indeterminate{background-color:#26a69a}#bmi-preload .progress .indeterminate:before{content:'';position:absolute;background-color:inherit;top:0;left:0;bottom:0;will-change:left, right;-webkit-animation:indeterminate 2.1s cubic-bezier(0.65, 0.815, 0.735, 0.395) infinite;animation:indeterminate 2.1s cubic-bezier(0.65, 0.815, 0.735, 0.395) infinite}#bmi-preload .progress .indeterminate:after{content:'';position:absolute;background-color:inherit;top:0;left:0;bottom:0;will-change:left, right;-webkit-animation:indeterminate-short 2.1s cubic-bezier(0.165, 0.84, 0.44, 1) infinite;animation:indeterminate-short 2.1s cubic-bezier(0.165, 0.84, 0.44, 1) infinite;-webkit-animation-delay:1.15s;animation-delay:1.15s}@-webkit-keyframes indeterminate{0%{left:-35%;right:100%}60%{left:100%;right:-90%}100%{left:100%;right:-90%}}@keyframes indeterminate{0%{left:-35%;right:100%}60%{left:100%;right:-90%}100%{left:100%;right:-90%}}@-webkit-keyframes indeterminate-short{0%{left:-200%;right:100%}60%{left:107%;right:-8%}100%{left:107%;right:-8%}}@keyframes indeterminate-short{0%{left:-200%;right:100%}60%{left:107%;right:-8%}100%{left:107%;right:-8%}}.tooltipster-fall,.tooltipster-grow.tooltipster-show{-webkit-transition-timing-function:cubic-bezier(0.175, 0.885, 0.32, 1);-moz-transition-timing-function:cubic-bezier(0.175, 0.885, 0.32, 1.15);-ms-transition-timing-function:cubic-bezier(0.175, 0.885, 0.32, 1.15);-o-transition-timing-function:cubic-bezier(0.175, 0.885, 0.32, 1.15)}.tooltipster-base{display:flex;pointer-events:none;position:absolute}.tooltipster-box{flex:1 1 auto}.tooltipster-content{color:#333;box-sizing:border-box;max-height:100%;max-width:100%;overflow:hidden;line-height:21px !important}.tooltipster-ruler{bottom:0;left:0;overflow:hidden;position:fixed;right:0;top:0;visibility:hidden}.tooltipster-fade{opacity:0;-webkit-transition-property:opacity;-moz-transition-property:opacity;-o-transition-property:opacity;-ms-transition-property:opacity;transition-property:opacity}.tooltipster-fade.tooltipster-show{opacity:1}.tooltipster-grow{-webkit-transform:scale(0, 0);-moz-transform:scale(0, 0);-o-transform:scale(0, 0);-ms-transform:scale(0, 0);transform:scale(0, 0);-webkit-transition-property:-webkit-transform;-moz-transition-property:-moz-transform;-o-transition-property:-o-transform;-ms-transition-property:-ms-transform;transition-property:transform;-webkit-backface-visibility:hidden}.tooltipster-grow.tooltipster-show{-webkit-transform:scale(1, 1);-moz-transform:scale(1, 1);-o-transform:scale(1, 1);-ms-transform:scale(1, 1);transform:scale(1, 1);-webkit-transition-timing-function:cubic-bezier(0.175, 0.885, 0.32, 1.15);transition-timing-function:cubic-bezier(0.175, 0.885, 0.32, 1.15)}.tooltipster-swing{opacity:0;-webkit-transform:rotateZ(4deg);-moz-transform:rotateZ(4deg);-o-transform:rotateZ(4deg);-ms-transform:rotateZ(4deg);transform:rotateZ(4deg);-webkit-transition-property:-webkit-transform,opacity;-moz-transition-property:-moz-transform;-o-transition-property:-o-transform;-ms-transition-property:-ms-transform;transition-property:transform}.tooltipster-swing.tooltipster-show{opacity:1;-webkit-transform:rotateZ(0);-moz-transform:rotateZ(0);-o-transform:rotateZ(0);-ms-transform:rotateZ(0);transform:rotateZ(0);-webkit-transition-timing-function:cubic-bezier(0.23, 0.635, 0.495, 1);-webkit-transition-timing-function:cubic-bezier(0.23, 0.635, 0.495, 2.4);-moz-transition-timing-function:cubic-bezier(0.23, 0.635, 0.495, 2.4);-ms-transition-timing-function:cubic-bezier(0.23, 0.635, 0.495, 2.4);-o-transition-timing-function:cubic-bezier(0.23, 0.635, 0.495, 2.4);transition-timing-function:cubic-bezier(0.23, 0.635, 0.495, 2.4)}.tooltipster-fall{-webkit-transition-property:top;-moz-transition-property:top;-o-transition-property:top;-ms-transition-property:top;transition-property:top;-webkit-transition-timing-function:cubic-bezier(0.175, 0.885, 0.32, 1.15);transition-timing-function:cubic-bezier(0.175, 0.885, 0.32, 1.15)}.tooltipster-fall.tooltipster-initial{top:0 !important}.tooltipster-fall.tooltipster-dying{-webkit-transition-property:all;-moz-transition-property:all;-o-transition-property:all;-ms-transition-property:all;transition-property:all;top:0 !important;opacity:0}.tooltipster-slide{-webkit-transition-property:left;-moz-transition-property:left;-o-transition-property:left;-ms-transition-property:left;transition-property:left;-webkit-transition-timing-function:cubic-bezier(0.175, 0.885, 0.32, 1);-webkit-transition-timing-function:cubic-bezier(0.175, 0.885, 0.32, 1.15);-moz-transition-timing-function:cubic-bezier(0.175, 0.885, 0.32, 1.15);-ms-transition-timing-function:cubic-bezier(0.175, 0.885, 0.32, 1.15);-o-transition-timing-function:cubic-bezier(0.175, 0.885, 0.32, 1.15);transition-timing-function:cubic-bezier(0.175, 0.885, 0.32, 1.15)}.tooltipster-slide.tooltipster-initial{left:-40px !important}.tooltipster-slide.tooltipster-dying{-webkit-transition-property:all;-moz-transition-property:all;-o-transition-property:all;-ms-transition-property:all;transition-property:all;left:0 !important;opacity:0}@keyframes tooltipster-fading{0%{opacity:0}100%{opacity:1}}.tooltipster-update-fade{animation:tooltipster-fading 0.4s}@keyframes tooltipster-rotating{25%{transform:rotate(-2deg)}75%{transform:rotate(2deg)}100%{transform:rotate(0)}}.tooltipster-update-rotate{animation:tooltipster-rotating 0.6s}@keyframes tooltipster-scaling{50%{transform:scale(1.1)}100%{transform:scale(1)}}.tooltipster-update-scale{animation:tooltipster-scaling 0.6s}.tooltipster-sidetip .tooltipster-box{background:#fff;border-radius:10px}.tooltipster-sidetip.tooltipster-bottom .tooltipster-box{margin-top:8px}.tooltipster-sidetip.tooltipster-left .tooltipster-box{margin-right:8px}.tooltipster-sidetip.tooltipster-right .tooltipster-box{margin-left:8px}.tooltipster-sidetip.tooltipster-top .tooltipster-box{margin-bottom:8px}.tooltipster-sidetip .tooltipster-content{border-radius:10px !important;font-size:15px;line-height:18px;padding:16px 20px !important;font-family:'Montserrat', sans-serif !important}.tooltipster-sidetip .tooltipster-arrow{overflow:hidden;position:absolute}.tooltipster-sidetip.tooltipster-bottom .tooltipster-arrow{height:10px;margin-left:-10px;top:0;width:20px}.tooltipster-sidetip.tooltipster-left .tooltipster-arrow{height:20px;margin-top:-10px;right:0;top:0;width:10px}.tooltipster-sidetip.tooltipster-right .tooltipster-arrow{height:20px;margin-top:-10px;left:0;top:0;width:10px}.tooltipster-sidetip.tooltipster-top .tooltipster-arrow{bottom:0;height:10px;margin-left:-10px;width:20px}.tooltipster-sidetip .tooltipster-arrow-background,.tooltipster-sidetip .tooltipster-arrow-border{height:0;position:absolute;width:0}.tooltipster-sidetip .tooltipster-arrow-background{border:10px solid transparent}.tooltipster-sidetip.tooltipster-bottom .tooltipster-arrow-background{border-bottom-color:#fff;left:0;top:3px}.tooltipster-sidetip.tooltipster-left .tooltipster-arrow-background{border-left-color:#fff;left:-3px;top:0}.tooltipster-sidetip.tooltipster-right .tooltipster-arrow-background{border-right-color:#fff;left:3px;top:0}.tooltipster-sidetip.tooltipster-top .tooltipster-arrow-background{border-top-color:#fff;left:0;top:-3px}.tooltipster-sidetip .tooltipster-arrow-border{border:10px solid transparent;left:0;top:0}.tooltipster-sidetip.tooltipster-bottom .tooltipster-arrow-border{border-bottom-color:#fff}.tooltipster-sidetip.tooltipster-left .tooltipster-arrow-border{border-left-color:#fff}.tooltipster-sidetip.tooltipster-right .tooltipster-arrow-border{border-right-color:#fff}.tooltipster-sidetip.tooltipster-top .tooltipster-arrow-border{border-top-color:#fff}.tooltipster-sidetip .tooltipster-arrow-uncropped{position:relative}.tooltipster-sidetip.tooltipster-bottom .tooltipster-arrow-uncropped{top:-10px}.tooltipster-sidetip.tooltipster-right .tooltipster-arrow-uncropped{left:-10px}.bmi-tt-default-customized .tooltipster-box{background:#2b8984 !important}.bmi-tt-default-customized .tooltipster-content{background:#2b8984 !important;color:white;padding:16px 20px !important;font-weight:500}.bmi-tt-default-customized.tooltipster-bottom .tooltipster-arrow-background{border-bottom-color:#2b8984 !important}.bmi-tt-default-customized.tooltipster-left .tooltipster-arrow-background{border-left-color:#2b8984 !important}.bmi-tt-default-customized.tooltipster-right .tooltipster-arrow-background{border-right-color:#2b8984 !important}.bmi-tt-default-customized.tooltipster-top .tooltipster-arrow-background{border-top-color:#2b8984 !important}.bmi-tt-default-customized.tooltipster-top .tooltipster-arrow-border{border-top-color:#2b8984 !important}.bmi-tt-default-customized.tooltipster-bottom .tooltipster-arrow-border{border-bottom-color:#2b8984 !important}.bmi-tt-default-customized.tooltipster-right .tooltipster-arrow-border{border-right-color:#2b8984 !important}.bmi-tt-default-customized.tooltipster-left .tooltipster-arrow-border{border-left-color:#2b8984 !important}.bmi-tooltip-premium-css{text-align:center;width:350px}.bmi-premium-element *{cursor:not-allowed !important;border-color:rgba(198,201,206,0.5) !important}.bmi-tt-default a{color:white !important}.bmi-tt-banner{width:350px}.bmi-tt-center{text-align:center}.bmi-info-icon{position:absolute;top:calc(50% - 8px);width:16px;height:16px;background:url("../images/info-min.png");display:inline-block;line-height:16px;background-repeat:no-repeat;background-position:center;background-size:cover;margin:0;margin-left:3px;cursor:help}.toplevel_page_backup-migration .wp-menu-image img{padding:0 !important;height:20px;margin-top:7px}.toplevel_page_backup-migration.current .wp-menu-image img{filter:brightness(0) invert(1) grayscale(1) !important;opacity:0.85 !important}
|
admin/images/002-monitor-white.svg
ADDED
@@ -0,0 +1,15 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?xml version="1.0" encoding="utf-8"?>
|
2 |
+
<!-- Generator: Adobe Illustrator 23.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
3 |
+
<svg version="1.1" id="Shape_12_xA0_Зображення_1_"
|
4 |
+
xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 34 36"
|
5 |
+
enable-background="new 0 0 34 36" xml:space="preserve">
|
6 |
+
<image overflow="visible" width="34" height="36" id="Shape_12_xA0_Зображення" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACIAAAAkCAYAAADsHujfAAAACXBIWXMAAAsSAAALEgHS3X78AAAA
|
7 |
+
GXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAURJREFUeNpi/P//fzsDA0MFw8CC
|
8 |
+
XyxAQg7K6QDicwPgiCYg1mAAhsjS/xDgPRBBAbT3MMhyJiCbg2EQAJBDmAeLQ74OBoewILFVgFFl
|
9 |
+
PABu4IE55C1UYMIABsh/kEM6gVgIiMUHyBF/gXgjIzA6QInVD4hFB9AhR0EhUgnEzQOcVr+AHKIJ
|
10 |
+
5SwA4hsD4IiEwVKyboGVrIMCjDoEX8nKA4wqwQFwAyvMIZ+gAisGOkT6gVgJiCVBLaUBcsdeRmgW
|
11 |
+
MgNSfAMYIOdYgI7IAjKmDnBafQmKGmsoZxMQvxgAR3iA281IJavNaMk6WrIO9iL+O5S9DZhm/gxU
|
12 |
+
4xnUVDSFNookBygw/oECgZEK2U8CSHEB8TNGRsYfA9cPgJYDlJZDo7lm0DqEEUuct0N7fqRVWqRX
|
13 |
+
msuAifsgvsT38D99QCayvQABBgAmT/EYtRbn0QAAAABJRU5ErkJggg==">
|
14 |
+
</image>
|
15 |
+
</svg>
|
admin/images/Amazon.svg
ADDED
@@ -0,0 +1,47 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?xml version="1.0" encoding="utf-8"?>
|
2 |
+
<!-- Generator: Adobe Illustrator 23.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
3 |
+
<svg version="1.1" id="Layer_3_xA0_Зображення_1_"
|
4 |
+
xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 39 31"
|
5 |
+
enable-background="new 0 0 39 31" xml:space="preserve">
|
6 |
+
<image overflow="visible" width="39" height="31" id="Layer_3_xA0_Зображення" xlink:href="data:image/png;base64,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
|
45 |
+
T4ABADAJQYT/mLhTAAAAAElFTkSuQmCC">
|
46 |
+
</image>
|
47 |
+
</svg>
|
admin/images/alert_error-min.png
ADDED
Binary file
|
admin/images/alert_info-min.png
ADDED
Binary file
|
admin/images/alert_success-min.png
ADDED
Binary file
|
admin/images/alert_warning-min.png
ADDED
Binary file
|
admin/images/arrow-min.png
ADDED
Binary file
|
admin/images/backblaze.svg
ADDED
@@ -0,0 +1,44 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?xml version="1.0" encoding="utf-8"?>
|
2 |
+
<!-- Generator: Adobe Illustrator 23.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
3 |
+
<svg version="1.1" id="Layer_7_xA0_Зображення_1_"
|
4 |
+
xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 25 41"
|
5 |
+
enable-background="new 0 0 25 41" xml:space="preserve">
|
6 |
+
<image overflow="visible" width="25" height="41" id="Layer_7_xA0_Зображення" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAApCAYAAADAk4LOAAAACXBIWXMAAAsSAAALEgHS3X78AAAA
|
7 |
+
GXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAB79JREFUeNq0VwlQVOcd/79j37WA
|
8 |
+
LCDLIjfsStBim2CIiBIkAZMajaPGWLVNtOlYkqbpRGPHKTOdSTvtNKYTk+pkzGFzVIh1WknUNF41
|
9 |
+
URCJR1ABd5EbVmCXa9nr3f3e41DLlWT0m3n73ve97/1/3//6/f8LMMXgb7TE9X3wzwVwL4fY7WIa
|
10 |
+
C56u6N314dZ7CtTxq5KScwAq3+JMvGcg/ktXbVUIpM6W0/J9ZeDTgpy/NBjCpSsDjsrErt/99c/3
|
11 |
+
BASjaRxwDKOBA+cfXt0evNESf9dBqKR4s+QfxEhsJojQD71v7Xvp7pvrwpUFonITcNoAJBjB8/mp
|
12 |
+
lXcdxPvpfzcBEKDiGPoNA6GlM3nodKXl//f1l5VHfC8Qz5HThX1nD2ZRZByKLxUwtF0VRfQM7Oge
|
13 |
+
ye2JbHvulT1cThY9mRxysheqpLDXEufux8AAOEUhuQrI4AM6Nq0PFKV9dJ9jYWEVk2LtpBNm3fxO
|
14 |
+
mohOt6Fh8bIqf2ddJM0mIyUUwFQcJBiA0MK8stCCXFHb53zh93v77FVppo2r/vSdnKQEJabWmnWx
|
15 |
+
GilzlZmtXmGt6EpTa/A49TJEqL6zX9t0X311PldL0m/IWNX1xrvx39rxiiiR9gfyLvoaLtzPMFbk
|
16 |
+
bEUzHEoWDASlE0IXFVQbc+c7tL2dW0re1e6GCEuAzcoc/NYgHc9sK+2vrchgGdvwG+TsYe/KyOkk
|
17 |
+
mDatfkuPpNJDD3vrzsymwAQgyyhV0SmmGGOO9xz7Mt9emLfaSMYjDdRbAJqGQgBoY4qIEvMzbT54
|
18 |
+
8OjPFAgAhUeDNOCmg/bGWG15Wk2QE98HLUgp7g4AHQRFFZUU1xman6MLEm92J2DAAEaRIMgdoHj8
|
19 |
+
+dOay3P8q1yv41wSRSQg+fLEIc1LzOgzET7DrSKSAYJAAozg2rP3lelByo8tVyCo58NEg8DCINBU
|
20 |
+
H+P7+pv7tLlxcfYJTWtMUoBi4sDnqEpsWrbx0JQgvKMpE0fuUUGdmIkZFkSlB/reKd2uzU3rV5Yx
|
21 |
+
xlRZ4gf1CKTpVHAf/miF/aGl5fz1FnpCELHdGY1DyBQKq+gI4TB44Og6od1poOJjh0KWLDwpgXtE
|
22 |
+
VRwYOgU8Vf9Z3lD4xLVgbaNlHAjOsYKK8nmqQRDhIAy0Ud5TlTnanHvoh+UacSKKGQ4U5B+atYG/
|
23 |
+
7WqaI7/oMt/Qbr0DhLREt2oRBNjkfIkZCMRdXhC7en6kzen7rJUGmIkCQhhRVtXjkOXSIdhzw3w9
|
24 |
+
K/ey6Owyj4EgPjqkZ7YoT1EiNao0Q88f34zUpuz9P2gzREULihq807CqBCybDoHBVmPLquLPxkBm
|
25 |
+
vripNCR1kTMgNiJZkxEzhjQZBG7BA7pdFc8Qj5GkDBMEi2Z6zpAM/ef+Nb//4JGlY/ZJPf1JAc3F
|
26 |
+
CEH/dUQVw3x1uxaqIICW5VHFP63QllAAWERXD4thzMRnMhj02+CBwxtw1BjE6bU8Pva67ctT84wZ
|
27 |
+
D14UhE4Q/R0gBVygBLwg+d3gl1vBtGh15YwVRSe0/XJ37xJebke5NUmtQuWBRJU0WGfPxOrT89qN
|
28 |
+
C7P2J7z3+vbR9+0v/HYF72h5XOpyzZVcrhjMQA4xmbbjkZuf3RG+skivJfa5jzqGrp2xUlz8OBoa
|
29 |
+
o6NAAAwxZidWg8cP8Er7jOinnvswbPnSlyM2rHJPV3N6dr79cvPWLTs52jpMppNlV4AHMjqyD7Nn
|
30 |
+
PlrlvVKRrXERFZLgCV/zxMd0etpRIjKiOurnP3FN9HF96sIWX2N1IsUl62aZtAAGfEgTSwdpSJjV
|
31 |
+
rF4RsmkuBWSvJ6xn3+5ilP3FVOQsoT55QSthMbmYZJvT/OpvNtIpiUGUJ7hjXlEEAaFTAmglRmME
|
32 |
+
Y8qDrXjI4uyzWsipsgI4GwIUmwQkZQKpt5cKNjdYPZUncjr/8cbqoeNnivSgiYlWCFNYlwweJGiK
|
33 |
+
ZkfWQl6EsGWPfIqHrSgsowxJoPCekWxQdS7CWSMQbDhQXKJGHsDXNxWNfj9z2y9fk7SDae3RuKKI
|
34 |
+
2BkjIMA7gIvI8Ea9uOlNnJmd2hu2dMkXPPToL8e5UR0mx/6yA2tHlyI3P/2OedmzJ31iMyh+vy5Y
|
35 |
+
/1BRQQ54wO+3AzXDMpD6RVkBEWIM6vpG73i+RHuQee8EJ0PcxkSDv+taRNvmrZ+MriUf3vdIzNrN
|
36 |
+
7yvgByHQBkKwA0T+JhAhXMC8YcvfEnbttnHzM6uHdRsZbet+fcBZumuNkZkNKiaP4y1VEkEQWiF6
|
37 |
+
Q/FfEj/ePZZT7j1/z+Qbm/NQTrC0NcVBmkwnI55ZOzSpr+rSslvPa/0Wi/otbrjfGr2ucja1hkxQ
|
38 |
+
L4BBrc/Ireh5/e3HJ/139vyOJ4WOrvhbXrq9c+zojrfnLjnrb6lNoIlE1MnTevd4SyNca4GQWboQ
|
39 |
+
s3LAzplzicmwXTBYYpq15kBy9cUNnju+jolM6U068sHDlMXcPQ5EG8G6Jq7jpW17+4+Vr9e8SYEF
|
40 |
+
lV9mxFfqiPVwFI08wvOgleAIQyPfoKewyLS2Oa01Gcjhvgk1uX24d+97cqD88194T1c8Jgv9I5tJ
|
41 |
+
vTvBCFqviLLqQyB+vRk3GM28af1TryXs3VkyvkhMM3rf258WqKnND9Y6cuR+T7rk7rOoPn8YEKRA
|
42 |
+
RIS6SHOUnZ2XcSpk0cJ/h6/58YSd/f8EGADf2EvwBWN89QAAAABJRU5ErkJggg==">
|
43 |
+
</image>
|
44 |
+
</svg>
|
admin/images/backup-min.svg
ADDED
@@ -0,0 +1 @@
|
|
|
1 |
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 45 48"><path d="M42.36 29c-2.17-3.17-5.2-4.87-9-5.24l.01-8.26c0-.75-.08-1.45-.62-2.04.54-.6.62-1.3.62-2.04l-.01-8.96c0-1.5-1-2.47-2.48-2.47H2.8C1.2 0 .26.95.26 2.54l-.01 8.7c0 .8.02 1.6.63 2.2-.5.56-.63 1.18-.63 1.87v8.37c0 .88-.07 1.76.62 2.43-.45.53-.63 1.07-.62 1.7v9.26c0 1.57.95 2.53 2.52 2.53h18.6a11.87 11.87 0 0 0 13.55 7.69c5.25-1.07 9.15-5.6 9.44-10.94.16-2.67-.48-5.14-2-7.35zM2.9 1.6h27.82c.85 0 1.06.22 1.06 1.1v8.96c0 .8-.23 1.04-1 1.04H2.9c-.86 0-1.06-.22-1.06-1.1v-8.9c-.01-.88.2-1.1 1.05-1.1zM1.84 15.23c0-.7.25-.96.94-.96h28.05c.68 0 .94.25.95.9v8.36c0 .06-.01.13-.02.25-1.44.13-2.83.4-4.1 1.07-.76.4-1.5.5-2.35.5l-22.44-.01c-.8 0-1.03-.23-1.03-1.02l-.01-9.1zm19.12 22.8H2.83c-.73 0-.98-.24-.98-.97v-9.2c0-.64.27-.9.9-.9H24.2c.06 0 .12.01.26.03-3.08 3.1-4.2 6.76-3.5 11.06zm11.5 7.9c-5.6-.01-10.16-4.66-10.15-10.33s4.6-10.27 10.26-10.26c5.64.01 10.23 4.63 10.22 10.3-.01 5.73-4.6 10.3-10.33 10.28zM27.05 11.1c.88 0 1.6-.72 1.58-1.6-.01-.86-.72-1.56-1.57-1.56a1.59 1.59 0 0 0-1.58 1.61 1.57 1.57 0 0 0 1.57 1.56zm-.01 12.68c.88 0 1.6-.72 1.6-1.6-.01-.86-.7-1.56-1.57-1.57-.88 0-1.6.7-1.58 1.6 0 .86.7 1.56 1.56 1.57zm7.88 3.2H30.2v6.33h-6.26v4.76h6.3v6.3h4.73v-6.32h6.26v-4.76h-6.3v-6.3zm4.7 7.88v1.6h-6.25v6.32H31.8v-6.3h-6.3v-1.6h6.26v-6.32h1.58v6.3h6.28z" fill="#fff"/></svg>
|
admin/images/big_bg_clock_green-min.png
ADDED
Binary file
|
admin/images/big_bg_clock_white-min.png
ADDED
Binary file
|
admin/images/clock.svg
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
1 |
+
<svg width="30" height="30" viewBox="0 0 30 30" fill="none" xmlns="http://www.w3.org/2000/svg">
|
2 |
+
<path d="M15 0C10.8594 0 7.32422 1.46484 4.39453 4.39453C1.46484 7.32422 0 10.8594 0 15C0 19.1406 1.46484 22.6758 4.39453 25.6055C7.32422 28.5352 10.8594 30 15 30C19.1406 30 22.6758 28.5352 25.6055 25.6055C28.5352 22.6758 30 19.1406 30 15C30 10.8594 28.5352 7.32422 25.6055 4.39453C22.6758 1.46484 19.1406 0 15 0ZM26.25 16.2305H27.3633C27.0508 19.1992 25.8496 21.7383 23.7598 23.8477C21.6699 25.957 19.1602 27.1289 16.2305 27.3633V26.25C16.2305 25.4297 15.8203 25.0195 15 25.0195C14.1797 25.0195 13.7695 25.4297 13.7695 26.25V27.3633C10.8008 27.0508 8.26172 25.8496 6.15234 23.7598C4.04297 21.6699 2.87109 19.1602 2.63672 16.2305H3.75C4.57031 16.2305 4.98047 15.8203 4.98047 15C4.98047 14.1797 4.57031 13.7695 3.75 13.7695H2.63672C2.87109 10.8008 4.04297 8.26172 6.15234 6.15234C8.26172 4.04297 10.8008 2.87109 13.7695 2.63672V3.75C13.7695 4.57031 14.1797 4.98047 15 4.98047C15.8203 4.98047 16.2305 4.57031 16.2305 3.75V2.63672C19.1992 2.94922 21.7383 4.15039 23.8477 6.24023C25.957 8.33008 27.1289 10.8398 27.3633 13.7695H26.25C25.4297 13.7695 25.0195 14.1797 25.0195 15C25.0195 15.8203 25.4297 16.2305 26.25 16.2305ZM16.3477 14.8828L18.6328 9.25781C18.75 8.90625 18.7402 8.57422 18.6035 8.26172C18.4668 7.94922 18.2227 7.73438 17.8711 7.61719C17.0898 7.34375 16.543 7.59766 16.2305 8.37891L13.4766 15.2344L18.8672 23.2617C19.0625 23.5742 19.3945 23.7305 19.8633 23.7305C20.0586 23.7305 20.3125 23.6523 20.625 23.4961C21.3672 23.1055 21.4844 22.5195 20.9766 21.7383L16.3477 14.8828Z" fill="#257671"/>
|
3 |
+
</svg>
|
admin/images/clock2.svg
ADDED
@@ -0,0 +1,5 @@
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<svg width="30" height="30" viewBox="0 0 30 30" fill="none" xmlns="http://www.w3.org/2000/svg">
|
2 |
+
<path d="M15 0C10.8594 0 7.32422 1.46484 4.39453 4.39453C1.46484 7.32422 0 10.8594 0 15C0 19.1406 1.46484 22.6758 4.39453 25.6055C7.32422 28.5352 10.8594 30 15 30C19.1406 30 22.6758 28.5352 25.6055 25.6055C28.5352 22.6758 30 19.1406 30 15C30 10.8594 28.5352 7.32422 25.6055 4.39453C22.6758 1.46484 19.1406 0 15 0ZM26.25 16.2305H27.3633C27.0508 19.1992 25.8496 21.7383 23.7598 23.8477C21.6699 25.957 19.1602 27.1289 16.2305 27.3633V26.25C16.2305 25.4297 15.8203 25.0195 15 25.0195C14.1797 25.0195 13.7695 25.4297 13.7695 26.25V27.3633C10.8008 27.0508 8.26172 25.8496 6.15234 23.7598C4.04297 21.6699 2.87109 19.1602 2.63672 16.2305H3.75C4.57031 16.2305 4.98047 15.8203 4.98047 15C4.98047 14.1797 4.57031 13.7695 3.75 13.7695H2.63672C2.87109 10.8008 4.04297 8.26172 6.15234 6.15234C8.26172 4.04297 10.8008 2.87109 13.7695 2.63672V3.75C13.7695 4.57031 14.1797 4.98047 15 4.98047C15.8203 4.98047 16.2305 4.57031 16.2305 3.75V2.63672C19.1992 2.94922 21.7383 4.15039 23.8477 6.24023C25.957 8.33008 27.1289 10.8398 27.3633 13.7695H26.25C25.4297 13.7695 25.0195 14.1797 25.0195 15C25.0195 15.8203 25.4297 16.2305 26.25 16.2305ZM16.3477 14.8828L18.6328 9.25781C18.75 8.90625 18.7402 8.57422 18.6035 8.26172C18.4668 7.94922 18.2227 7.73438 17.8711 7.61719C17.0898 7.34375 16.543 7.59766 16.2305 8.37891L13.4766 15.2344L18.8672 23.2617C19.0625 23.5742 19.3945 23.7305 19.8633 23.7305C20.0586 23.7305 20.3125 23.6523 20.625 23.4961C21.3672 23.1055 21.4844 22.5195 20.9766 21.7383L16.3477 14.8828Z" fill="#ccc"/>
|
3 |
+
</svg>
|
4 |
+
|
5 |
+
|
admin/images/clocks-min.png
ADDED
Binary file
|
admin/images/close-min.png
ADDED
Binary file
|
admin/images/copy-icon.png
ADDED
Binary file
|
admin/images/crown-bg.png
ADDED
Binary file
|
admin/images/download-min.png
ADDED
Binary file
|
admin/images/dream-objects.svg
ADDED
@@ -0,0 +1,47 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?xml version="1.0" encoding="utf-8"?>
|
2 |
+
<!-- Generator: Adobe Illustrator 23.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
3 |
+
<svg version="1.1" id="Layer_8_xA0_Зображення_1_"
|
4 |
+
xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 36 35"
|
5 |
+
enable-background="new 0 0 36 35" xml:space="preserve">
|
6 |
+
<image overflow="visible" width="36" height="35" id="Layer_8_xA0_Зображення" xlink:href="data:image/png;base64,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
|
45 |
+
T3e/wAAAAABJRU5ErkJggg==">
|
46 |
+
</image>
|
47 |
+
</svg>
|
admin/images/ftp.svg
ADDED
@@ -0,0 +1,37 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?xml version="1.0" encoding="utf-8"?>
|
2 |
+
<!-- Generator: Adobe Illustrator 23.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
3 |
+
<svg version="1.1" id="Shape_16_xA0_Зображення_1_"
|
4 |
+
xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 39 40"
|
5 |
+
enable-background="new 0 0 39 40" xml:space="preserve">
|
6 |
+
<image overflow="visible" width="39" height="40" id="Shape_16_xA0_Зображення" xlink:href="data:image/png;base64,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
|
35 |
+
SpRPo4WIAAAAAElFTkSuQmCC">
|
36 |
+
</image>
|
37 |
+
</svg>
|
admin/images/google-cloud.svg
ADDED
@@ -0,0 +1,49 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?xml version="1.0" encoding="utf-8"?>
|
2 |
+
<!-- Generator: Adobe Illustrator 23.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
3 |
+
<svg version="1.1" id="Layer_2_xA0_Зображення_1_"
|
4 |
+
xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 42 33"
|
5 |
+
enable-background="new 0 0 42 33" xml:space="preserve">
|
6 |
+
<image overflow="visible" width="42" height="33" id="Layer_2_xA0_Зображення" xlink:href="data:image/png;base64,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">
|
48 |
+
</image>
|
49 |
+
</svg>
|
admin/images/google-drive.svg
ADDED
@@ -0,0 +1,51 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?xml version="1.0" encoding="utf-8"?>
|
2 |
+
<!-- Generator: Adobe Illustrator 23.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
3 |
+
<svg version="1.1" id="Layer_1_xA0_Зображення_1_"
|
4 |
+
xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 39 33"
|
5 |
+
enable-background="new 0 0 39 33" xml:space="preserve">
|
6 |
+
<image overflow="visible" width="39" height="33" id="Layer_1_xA0_Зображення" xlink:href="data:image/png;base64,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
|
49 |
+
vwIMAJakr2+6t2qdAAAAAElFTkSuQmCC">
|
50 |
+
</image>
|
51 |
+
</svg>
|
admin/images/happy-smile.png
ADDED
Binary file
|
admin/images/info-min.png
ADDED
Binary file
|
admin/images/kitty-cat.svg
ADDED
@@ -0,0 +1 @@
|
|
|
1 |
+
<?xml version="1.0" ?><!DOCTYPE svg PUBLIC '-//W3C//DTD SVG 1.1//EN' 'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd'><svg fill-rule="evenodd" height="96pt" overflow="visible" stroke-linejoin="bevel" stroke-width="0.501" version="1.1" viewBox="0 0 96 96" width="96pt" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><defs><marker id="DefaultArrow2" markerHeight="1" markerUnits="strokeWidth" markerWidth="1" orient="auto" overflow="visible" viewBox="0 0 1 1"><g transform="scale(0.0092592592)"><path d="M -9 54 L -9 -54 L 117 0 z"/></g></marker><marker id="DefaultArrow3" markerHeight="1" markerUnits="strokeWidth" markerWidth="1" orient="auto" overflow="visible" viewBox="0 0 1 1"><g transform="scale(0.0092592592)"><path d="M -27 54 L -9 0 L -27 -54 L 135 0 z"/></g></marker><marker id="DefaultArrow4" markerHeight="1" markerUnits="strokeWidth" markerWidth="1" orient="auto" overflow="visible" viewBox="0 0 1 1"><g transform="scale(0.0092592592)"><path d="M -9,0 L -9,-45 C -9,-51.708 2.808,-56.580 9,-54 L 117,-9 C 120.916,-7.369 126.000,-4.242 126,0 C 126,4.242 120.916,7.369 117,9 L 9,54 C 2.808,56.580 -9,51.708 -9,45 z"/></g></marker><marker id="DefaultArrow5" markerHeight="1" markerUnits="strokeWidth" markerWidth="1" orient="auto" overflow="visible" viewBox="0 0 1 1"><g transform="scale(0.0092592592)"><path d="M -54, 0 C -54,29.807 -29.807,54 0,54 C 29.807,54 54,29.807 54,0 C 54,-29.807 29.807,-54 0,-54 C -29.807,-54 -54,-29.807 -54,0 z"/></g></marker><marker id="DefaultArrow6" markerHeight="1" markerUnits="strokeWidth" markerWidth="1" orient="auto" overflow="visible" viewBox="0 0 1 1"><g transform="scale(0.0092592592)"><path d="M -63,0 L 0,63 L 63,0 L 0,-63 z"/></g></marker><marker id="DefaultArrow7" markerHeight="1" markerUnits="strokeWidth" markerWidth="1" orient="auto" overflow="visible" viewBox="0 0 1 1"><g transform="scale(0.0092592592)"><path d="M 18,-54 L 108,-54 L 63,0 L 108,54 L 18, 54 L -36,0 z"/></g></marker><marker id="DefaultArrow8" markerHeight="1" markerUnits="strokeWidth" markerWidth="1" orient="auto" overflow="visible" viewBox="0 0 1 1"><g transform="scale(0.0092592592)"><path d="M -36,0 L 18,-54 L 54,-54 L 18,-18 L 27,-18 L 63,-54 L 99,-54 L 63,-18 L 72,-18 L 108,-54 L 144,-54 L 90,0 L 144,54 L 108,54 L 72,18 L 63,18 L 99,54 L 63,54 L 27,18 L 18,18 L 54,54 L 18,54 z"/></g></marker><marker id="DefaultArrow9" markerHeight="1" markerUnits="strokeWidth" markerWidth="1" orient="auto" overflow="visible" viewBox="0 0 1 1"><g transform="scale(0.0092592592)"><path d="M 0,45 L -45,0 L 0, -45 L 45, 0 z M 0, 63 L-63, 0 L 0, -63 L 63, 0 z"/></g></marker><filter id="StainedFilter"><feBlend in="SourceGraphic" in2="BackgroundImage" mode="multiply" result="blend"/><feComposite in="blend" in2="SourceAlpha" operator="in" result="comp"/></filter><filter id="BleachFilter"><feBlend in="SourceGraphic" in2="BackgroundImage" mode="screen" result="blend"/><feComposite in="blend" in2="SourceAlpha" operator="in" result="comp"/></filter><filter id="InvertTransparencyBitmapFilter"><feComponentTransfer><feFuncR amplitude="1.055" exponent=".416666666" offset="-0.055" type="gamma"/><feFuncG amplitude="1.055" exponent=".416666666" offset="-0.055" type="gamma"/><feFuncB amplitude="1.055" exponent=".416666666" offset="-0.055" type="gamma"/></feComponentTransfer><feComponentTransfer><feFuncR intercept="1" slope="-1" type="linear"/><feFuncG intercept="1" slope="-1" type="linear"/><feFuncB intercept="1" slope="-1" type="linear"/><feFuncA intercept="0" slope="1" type="linear"/></feComponentTransfer><feComponentTransfer><feFuncR amplitude="1" exponent="2.4" offset="0" type="gamma"/><feFuncG amplitude="1" exponent="2.4" offset="0" type="gamma"/><feFuncB amplitude="1" exponent="2.4" offset="0" type="gamma"/></feComponentTransfer></filter></defs><g fill="none" font-family="Times New Roman" font-size="16" id="Document" stroke="black" transform="scale(1 -1)"><g id="Spread" transform="translate(0 -96)"><g id="Layer 1"><g id="Group" stroke-linejoin="round"><path d="M 48.991,19.687 C 70.466,18.515 87.895,13.443 87.895,8.368 C 87.895,3.293 70.466,0.126 48.991,1.299 C 27.516,2.471 10.087,7.543 10.087,12.618 C 10.087,17.693 27.516,20.86 48.991,19.687 Z" fill="#000000" fill-opacity="0.298039" marker-end="none" marker-start="none" stroke="none" stroke-linecap="round" stroke-miterlimit="79.8403193612775" stroke-opacity="0.298039" stroke-width="0.75"/><g id="Group_1"><path d="M 36.49,5.373 L 36.605,6.192 L 32.613,7.026 C 30.491,7.654 28.557,8.431 26.885,9.349 C 25.616,10.044 24.466,10.753 23.425,11.476 L 20.923,13.445 L 17.888,12.723 C 15.049,12.336 5.676,10.935 4.981,17.152 C 4.766,19.084 5.197,20.84 8.101,22.474 C 9.764,23.409 11.441,24.507 13.093,25.697 L 14.175,26.541 L 13.806,29.181 C 13.548,34.131 15.214,38.792 17.686,43.226 L 18.208,44.069 L 17.737,46.773 C 17.721,48.943 18.357,51.115 19.362,52.619 C 21.523,55.855 25.402,58.491 28.886,60.012 L 29.425,60.228 L 31.583,63.781 C 33.205,66.82 34.787,70.487 36.432,74.203 L 38.565,78.872 L 38.292,79.832 C 37.343,83.291 35.116,92.459 37.671,94.972 C 39.4,96.67 42.611,95.469 45.492,93.599 L 48.599,91.154 L 51.158,92.351 C 56.068,94.082 61.647,94.08 65.925,92.247 L 68.292,90.711 L 71.881,92.765 C 74.746,94.16 77.855,95.104 79.942,94.266 C 85.749,91.933 80.196,76.864 79.593,75.468 L 79.476,75.34 L 80.34,73.61 C 85.067,62.773 87.573,49.649 86.641,38.149 L 85.54,31.718 L 85.622,31.493 C 85.347,24.154 89.681,19.122 88.838,12.727 C 87.344,1.387 75.219,-1.465 66.435,3.461 L 63.291,5.771 L 61.489,4.809 C 57.45,2.918 53.182,1.458 49.396,0.943 C 46.562,0.558 37.187,-0.844 36.49,5.373 Z M 77.159,15.168 L 75.854,13.966 L 75.549,13.991 C 77.047,13.656 77.298,14.359 77.159,15.168 Z" fill="#a75214" marker-end="none" marker-start="none" stroke="none"/><g fill="#f68634" id="Group_2" stroke-linecap="round"><path d="M 40.063,79.163 C 39.249,81.948 36.762,91.946 38.737,93.888 C 40.678,95.795 49.138,89.53 49.928,87.629 C 46.13,85.643 43.345,82.283 40.799,78.868 L 40.063,79.163 Z" marker-end="none" marker-start="none" stroke="#a75214" stroke-miterlimit="79.8403193612775" stroke-width="1.5"/><path d="M 8.847,21.15 C 6.492,19.825 6.342,18.667 6.492,17.321 C 6.973,13.022 13.7,13.687 17.683,14.23 C 24.912,15.213 34.165,19.873 39.769,24.241 C 50.888,32.912 36.036,44.35 27.252,35.874 C 22.692,31.473 15.691,24.999 8.847,21.15 Z" marker-end="none" marker-start="none" stroke="#a75214" stroke-miterlimit="79.8403193612775" stroke-width="1.5"/><path d="M 15.324,29.261 C 14.663,41.947 26.962,51.887 32.925,63.066 C 36.487,69.74 39.077,77.431 42.982,84.158 C 48.013,92.819 62.581,94.529 68.643,88.705 C 84.109,73.845 91.784,35.529 78.493,19.236 C 69.692,5.407 40.608,3.558 27.616,10.682 C 17.974,15.97 15.712,21.846 15.324,29.261 Z" marker-end="none" marker-start="none" stroke="#a75214" stroke-miterlimit="79.8403193612775" stroke-width="1.5"/><path d="M 40.357,9.37 C 38.001,8.045 37.851,6.888 38.001,5.542 C 38.483,1.242 45.211,1.909 49.192,2.45 C 56.422,3.433 65.676,8.094 71.278,12.462 C 82.399,21.131 67.546,32.57 58.762,24.095 C 54.201,19.692 47.202,13.22 40.357,9.37 Z" marker-end="none" marker-start="none" stroke="#a75214" stroke-miterlimit="79.8403193612775" stroke-width="1.5"/><path d="M 29.495,58.62 C 26.162,57.165 22.568,54.683 20.627,51.775 C 18.867,49.141 18.59,44.359 21.068,42.058 C 21.738,41.437 22.599,41.297 23.425,41.616 C 28.627,43.624 26.042,50.688 26.516,53.395 C 26.527,53.453 30.367,58.684 30.786,59.138 C 30.363,58.984 29.932,58.811 29.495,58.62 Z" marker-end="none" marker-start="none" stroke="#a75214" stroke-miterlimit="79.8403193612775" stroke-width="1.5"/><path d="M 53.02,20.414 C 54.837,21.373 55.697,19.179 54.492,18.352 L 70.983,13.64 C 74.75,14.435 82.91,23.505 73.781,26.893 C 70.461,28.124 56.966,30.952 57.511,25.272 C 57.637,25.047 52.999,20.678 53.02,20.414 Z" marker-end="none" marker-start="none" stroke="none" stroke-miterlimit="79.8403193612775" stroke-width="0.75"/><path d="M 84.104,31.55 C 83.799,23.413 88.136,19.032 87.332,12.926 C 85.858,1.739 72.106,-0.55 63.962,7.152 C 59.56,10.708 56.498,19.306 61.593,21.13 C 67.431,22.363 71.034,13.441 75.219,12.508 C 79.445,11.565 79.234,16.033 77.606,17.908 C 79.24,19.542 83.49,28.098 84.104,31.55 Z" marker-end="none" marker-start="none" stroke="#a75214" stroke-miterlimit="79.8403193612775" stroke-width="1.5"/><path d="M 66.271,87.408 C 68.695,89.506 76.208,94.129 79.376,92.856 C 83.297,91.281 79.36,78.762 78.198,76.071 C 76.477,76.361 67.827,84.388 66.345,86.083 L 66.271,87.408 Z" marker-end="none" marker-start="none" stroke="#a75214" stroke-miterlimit="79.8403193612775" stroke-width="1.5"/><path d="M 64.058,88.434 C 65.51,87.251 66.7,87.265 68.476,87.256 C 68.886,83.627 76.248,81.81 77.604,79.452 C 77.834,78.832 77.744,75.111 77.899,74.152 C 73.603,69.521 63.839,82.879 62.881,86.52 C 62.718,87.137 63.111,87.454 63.469,87.551 C 63.439,87.925 63.635,88.219 64.058,88.434 Z" marker-end="none" marker-start="none" stroke="none" stroke-miterlimit="79.8403193612775" stroke-width="0.75"/></g></g><path d="M 38.094,8.127 C 34.325,8 28.303,10.598 23.567,14.134 C 19.906,25.157 24.018,33.218 26.61,37.178 C 30.349,42.887 36.559,48.965 43.493,49.802 C 56.448,49.733 55.543,24.339 51.478,18.469 C 50.608,17.213 37.476,8.535 38.094,8.127 Z" fill="#feb761" marker-end="none" marker-start="none" stroke="none" stroke-linecap="round" stroke-miterlimit="79.8403193612775" stroke-width="0.75"/><path d="M 78.324,21.359 C 80.25,24.441 79.531,31.291 82.037,34.171 C 82.512,34.386 83.608,34.543 83.788,34.188 C 83.114,31.106 82.938,30.106 83.368,27.768 C 83.641,26.273 85.397,21.545 85.007,19.859 C 84.947,19.603 83.973,19.429 83.665,19.331 C 82.856,19.074 82.022,19.76 81.165,19.787 C 81.385,20.189 81.614,21.128 80.961,21.471 C 80.572,21.429 79.893,22.228 79.313,21.663 C 79.106,21.391 78.601,21.3 78.324,21.359 Z" fill="#f68634" marker-end="none" marker-start="none" stroke="none" stroke-linecap="round" stroke-miterlimit="79.8403193612775" stroke-width="0.75"/><path d="M 43.529,68.049 C 45.847,63.353 52.768,64.961 53.263,67.756 C 53.902,71.349 45.645,70.6 44.138,69.432 C 43.545,69.181 43.321,68.731 43.529,68.049 Z" fill="#a75214" marker-end="none" marker-start="none" stroke="none" stroke-linecap="round" stroke-miterlimit="79.8403193612775" stroke-width="0.75"/><path d="M 37.329,75.364 C 37.502,76.256 37.914,77.043 38.488,77.669 L 46.422,76.142 C 46.722,75.347 46.814,74.464 46.642,73.572 C 46.147,71.001 43.66,69.317 41.09,69.811 C 38.52,70.306 36.834,72.794 37.329,75.364 Z" fill="#ffffff" marker-end="none" marker-start="none" stroke="#a75214" stroke-linecap="round" stroke-miterlimit="79.8403193612775" stroke-width="1.5"/><path d="M 47.899,69.289 C 48.923,69.289 49.755,68.884 49.755,68.385 C 49.755,67.886 48.923,67.481 47.899,67.481 C 46.875,67.481 46.043,67.886 46.043,68.385 C 46.043,68.884 46.875,69.289 47.899,69.289 Z" fill="#f8dab6" marker-end="none" marker-start="none" stroke="none" stroke-linecap="round" stroke-miterlimit="79.8403193612775" stroke-width="0.75"/><path d="M 54.922,71.659 C 55.115,72.666 55.58,73.551 56.225,74.256 L 65.163,72.536 C 65.501,71.642 65.604,70.647 65.411,69.64 C 64.854,66.747 62.052,64.848 59.157,65.405 C 56.263,65.963 54.365,68.765 54.922,71.659 Z" fill="#ffffff" marker-end="none" marker-start="none" stroke="#a75214" stroke-linecap="round" stroke-miterlimit="79.8403193612775" stroke-width="1.5"/><path d="M 48.512,65.088 C 48.64,64.616 49,62.454 49.425,62.274 C 49.638,62.183 50.046,62.279 50.556,62.394 C 50.774,62.406 51.138,62.529 51.404,62.565 C 51.969,62.653 52.579,62.681 53.151,62.502 C 56.051,61.591 56.817,58.567 55.661,55.961 C 53.86,51.904 47.295,53.072 48.664,55.81 C 48.955,56.391 50.847,56.724 51.097,56.266" fill="none" stroke="#a75214" stroke-linecap="round" stroke-miterlimit="79.8403193612775" stroke-width="1.5"/><path d="M 85.625,68.739 L 85.625,68.739 Z" fill="#000000" marker-end="none" marker-start="none" stroke="none" stroke-linecap="round" stroke-miterlimit="79.8403193612775" stroke-width="0.75"/><path d="M 52.315,61.97 C 52.855,61.633 53.366,61.159 53.683,60.601 C 55.283,57.784 50.865,56.838 49.121,56.57 C 48.693,56.176 48.563,55.349 49.044,54.897 C 51.186,52.886 55.723,54.808 55.585,58.167 C 55.523,59.658 54.415,61.925 52.619,61.628 L 52.315,61.97 Z" fill="#502c11" marker-end="none" marker-start="none" stroke="none" stroke-linecap="round" stroke-miterlimit="79.8403193612775" stroke-width="0.75"/><path d="M 58.095,72.807 C 58.095,73.137 58.163,73.451 58.288,73.736 L 62.729,72.9 C 62.73,72.869 62.731,72.837 62.731,72.807 C 62.731,71.528 61.692,70.49 60.413,70.49 C 59.134,70.49 58.095,71.528 58.095,72.807 Z" fill="#a75214" marker-end="none" marker-start="none" stroke="none" stroke-linecap="round" stroke-miterlimit="79.8403193612775" stroke-width="0.75"/><path d="M 40.602,76.42 C 40.602,76.71 40.661,76.987 40.766,77.24 L 44.859,76.47 C 44.859,76.452 44.86,76.437 44.86,76.42 C 44.86,75.246 43.906,74.292 42.732,74.292 C 41.557,74.292 40.602,75.246 40.602,76.42 Z" fill="#a75214" marker-end="none" marker-start="none" stroke="none" stroke-linecap="round" stroke-miterlimit="79.8403193612775" stroke-width="0.75"/><path d="M 58.026,49.273 C 56.965,46.836 55.62,43.837 53.904,41.764 C 50.37,37.494 44.375,35.229 45.658,32.487 C 48.897,25.567 67.067,36.553 69.217,42.647" fill="none" stroke="#a75214" stroke-linecap="round" stroke-miterlimit="79.8403193612775" stroke-width="1.5"/><path d="M 69.235,84.293 C 71.525,85.617 73.818,88.934 76.687,88.704 C 78.431,87.239 75.739,79.694 74.71,78.868 C 73.391,80.213 70.525,83.188 69.082,83.532 L 69.235,84.293 Z" fill="#feb761" marker-end="none" marker-start="none" stroke="none" stroke-linecap="round" stroke-miterlimit="79.8403193612775" stroke-width="0.75"/><path d="M 41.38,84.077 C 40.905,85.364 39.533,89.16 40.183,90.073 C 41.024,91.251 44.38,88.591 44.899,87.791 C 44.056,87.193 41.701,84.859 41.451,83.888 C 41.43,83.942 41.407,84.006 41.38,84.077 Z" fill="#feb761" marker-end="none" marker-start="none" stroke="none" stroke-linecap="round" stroke-miterlimit="79.8403193612775" stroke-width="0.75"/><path d="M 58.739,61.022 C 61.051,59.68 62.018,57.386 63.455,55.394" fill="none" stroke="#a75214" stroke-linecap="round" stroke-miterlimit="79.8403193612775" stroke-width="1.125"/><path d="M 61.021,62.543 C 62.851,61.676 64.561,60.432 66.04,59.044" fill="none" stroke="#a75214" stroke-linecap="round" stroke-miterlimit="79.8403193612775" stroke-width="1.125"/><path d="M 37.749,58.892 C 39.432,60.294 41.5,61.681 43.834,62.086" fill="none" stroke="#a75214" stroke-linecap="round" stroke-miterlimit="79.8403193612775" stroke-width="1.125"/><path d="M 37.446,62.999 C 38.862,64.018 41.322,64.439 43.073,64.519" fill="none" stroke="#a75214" stroke-linecap="round" stroke-miterlimit="79.8403193612775" stroke-width="1.125"/><path d="M 47.323,79.081 C 47.594,80.361 47.725,82.395 47.054,83.796" fill="none" stroke="#a75214" stroke-linecap="round" stroke-miterlimit="79.8403193612775" stroke-width="1.125"/><path d="M 45.546,79.31 C 45.418,80.323 45.519,81.246 45.242,82.275" fill="none" stroke="#a75214" stroke-linecap="round" stroke-miterlimit="79.8403193612775" stroke-width="1.125"/><path d="M 56.877,77.027 C 57.661,79.184 58.955,81.253 60.68,82.731" fill="none" stroke="#a75214" stroke-linecap="round" stroke-miterlimit="79.8403193612775" stroke-width="1.125"/><path d="M 59.615,77.484 C 60.228,78.562 61.045,79.675 62.201,80.221" fill="none" stroke="#a75214" stroke-linecap="round" stroke-miterlimit="79.8403193612775" stroke-width="1.125"/><path d="M 84.636,51.17 C 83.115,49.726 76.628,47.758 76.763,51.113 C 78.375,53.826 81.843,52.968 83.911,55.479 C 84.06,54.268 84.198,52.183 84.636,51.17 Z" fill="#a75214" marker-end="none" marker-start="none" stroke="none" stroke-linecap="round" stroke-miterlimit="79.8403193612775" stroke-width="0.75"/><path d="M 85.701,44.326 C 84.18,42.883 77.693,40.913 77.828,44.269 C 79.44,46.981 82.908,46.124 84.976,48.634 C 85.125,47.423 85.263,45.339 85.701,44.326 Z" fill="#a75214" marker-end="none" marker-start="none" stroke="none" stroke-linecap="round" stroke-miterlimit="79.8403193612775" stroke-width="0.75"/><path d="M 85.472,37.102 C 83.952,35.658 77.465,33.688 77.6,37.044 C 79.211,39.757 82.68,38.899 84.748,41.409 C 84.896,40.198 85.034,38.113 85.472,37.102 Z" fill="#a75214" marker-end="none" marker-start="none" stroke="none" stroke-linecap="round" stroke-miterlimit="79.8403193612775" stroke-width="0.75"/><path d="M 44.037,10.3 C 46.489,9.52 48.411,4.052 47.051,2.92 C 46.543,2.495 44.749,2.586 44.013,2.615 C 40.874,2.742 36.224,4.899 40.375,8.43 C 41.29,9.209 43.303,9.95 43.724,10.372 C 43.829,10.357 43.933,10.333 44.037,10.3 Z" fill="#feb761" marker-end="none" marker-start="none" stroke="none" stroke-linecap="round" stroke-miterlimit="79.8403193612775" stroke-width="0.75"/><path d="M 12.2,21.937 C 14.525,21.179 16.345,15.874 15.057,14.775 C 14.576,14.363 12.875,14.449 12.177,14.478 C 9.201,14.602 4.794,16.695 8.728,20.123 C 9.596,20.879 11.504,21.598 11.904,22.008 C 12.003,21.992 12.101,21.97 12.2,21.937 Z" fill="#feb761" marker-end="none" marker-start="none" stroke="none" stroke-linecap="round" stroke-miterlimit="79.8403193612775" stroke-width="0.75"/><path d="M 19.993,47.27 C 20.096,45.604 20.981,41.399 23.73,42.579 C 26.374,43.714 25.81,46.98 25.717,49.039 C 22.661,49.527 22.169,48.58 20.352,47.579 L 19.993,47.27 Z" fill="#feb761" marker-end="none" marker-start="none" stroke="none" stroke-linecap="round" stroke-miterlimit="79.8403193612775" stroke-width="0.75"/><path d="M 61.973,10.94 C 61.496,11.178 60.414,13.502 60.224,14.058 C 59.902,14.996 59.308,17.142 59.539,18.089 C 60.946,23.858 67.296,18.697 68.742,16.263 C 68.437,14.134 63.795,10.031 61.973,10.94 Z" fill="#feb761" marker-end="none" marker-start="none" stroke="none" stroke-linecap="round" stroke-miterlimit="79.8403193612775" stroke-width="0.75"/></g></g></g></g></svg>
|
admin/images/link-min.png
ADDED
Binary file
|
admin/images/lock-experimental.png
ADDED
Binary file
|
admin/images/lock-min.svg
ADDED
@@ -0,0 +1 @@
|
|
|
1 |
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 24"><path fill-rule="evenodd" fill="#a2a2a2" d="M19.5 11.7c-.02-.46.01-.92-.3-1.33-.46-.58-1.05-.8-1.77-.75-.5.04-.53.03-.53-.43l-.02-2.36C16.6 2.93 13.24.13 9.3.47 6.3.7 3.78 2.82 3.18 5.7c-.22 1.03-.16 2.12-.2 3.2-.02.7 0 .7-.74.72-1.15 0-1.86.7-1.86 1.85v10.37c0 1.2.7 1.87 1.9 1.87h15.2c1.32 0 1.98-.65 1.98-1.95v-8.3l.03-1.76zm-8.33 4.82a.77.77 0 0 0-.34.74v1.92c-.01.54-.4.93-.9.93-.5 0-.88-.4-.9-.94v-1.4c.03-.55-.02-1-.52-1.45-.8-.73-.67-1.95.17-2.67a1.94 1.94 0 0 1 2.71.21c.7.83.62 2-.23 2.66zm3.16-6.9l-3.37-.03-5.85.02c.08-1.23.02-2.42.27-3.54.52-2.3 2.83-3.74 5.22-3.43 2.28.3 4.06 2.3 4.07 4.6l.01 2.06c.01.3-.12.34-.35.33z"/></svg>
|
admin/images/log-min.svg
ADDED
@@ -0,0 +1 @@
|
|
|
1 |
+
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 22 23"><defs><path id="A" d="M21.85 10.05a5.07 5.07 0 0 0-.03-.55c-.08-.6-.6-1.06-1.23-1.1-.22-.01-.44 0-.7 0v-2.6c0-.22-.06-.4-.22-.58L15.14.3c-.08-.08-.17-.15-.25-.22H2.98c-.37.15-.66.35-.73.75-.02.1-.02.2-.02.3V8.4H1.8C.98 8.4.5 8.74.3 9.5c-.01.02-.02.03-.03.05v7.07c.07.18.12.38.23.54.24.38.6.57 1.06.6h.67v4.5c0 .7.37 1.05 1.1 1.05H18.8c.73 0 1.1-.36 1.1-1.06v-4.48h.47c.92 0 1.48-.54 1.48-1.4v-6.3zM3.2 1.02L3.44 1H14c.2 0 .26.05.26.25v4.28c0 .45.14.6.62.6h4.05V8.4H3.2V1.02zm9.8 11.9c-.02.83-.18 1.57-.7 2.2-.72.86-1.7 1.14-2.8 1.04-1.57-.15-2.63-1.26-2.7-2.8-.04-.7.04-1.4.4-2.03.6-1.06 1.57-1.53 2.8-1.52 1.8.01 2.85 1.27 2.97 2.78a6.03 6.03 0 0 0 .03.32zM2.55 9.94H4v4.98h2.57v1.15H2.55V9.94zm16.37 12.2H3.2V17.8h15.72v4.36zm.44-6.3l-1.6.28a5.21 5.21 0 0 1-2.04-.17 2.78 2.78 0 0 1-2.03-2.44c-.1-.92.07-1.8.72-2.52.48-.54 1.1-.86 1.8-1.02.88-.2 1.76-.17 2.64.06.1.03.2.07.3.1l-.3 1.12c-.53-.22-1.07-.27-1.62-.25-1.35.04-2.17.95-2 2.23.12.97.64 1.57 1.54 1.72.34.06.7.01 1.04 0a.14.14 0 0 0 .16-.17v-1.15H17v-1.08c.05-.01.08-.01.12-.01h2.26v3.3zM8.8 11.46c-.6.75-.63 2.15-.1 2.97.57.87 1.8.87 2.37.01.3-.44.37-.93.4-1.42-.02-.55-.1-1.08-.45-1.53-.54-.73-1.64-.75-2.2-.03z"/></defs><clipPath id="B"><use xlink:href="#A"/></clipPath><image overflow="visible" clip-path="url(#B)" width="22" height="23" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAXCAIAAACAiijJAAAACXBIWXMAAAsSAAALEgHS3X78AAAA GXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAWZJREFUeNp8VFGWrTAIC5Xv2f8e 5v/tTniFQqXWjsdz9RZMIUmhn3+/QIOud1+R8X5BCbgydGG7GO2GAD1N/Xdc9j6WxL+/bXFENxSG Kui25IYPrPjUY70cUstfwwwSq5BKRpPAWlIHynheNeQQsdWdXbTAoqyqN1J7XFESwqq7HpSZHX10 diU/Iai/a6CwbQi/Lam9UZDUTI5iM2fatKPBxUOZoVgLiTvu3siIVtaza7aFuUo4SNOs+EYQ9S6o ssPJXNFCD1iB2NIsHiOZihQtkHKYzPJR/GOWbqhrhcAr6bbdUMok2c3CQVjwJ6sQu8ytmCVkrr4o jWAitrNZojv2/1Jst/KnLnOsyqdZOBvXOAIvLR5QcqxqlnADL/XNLkKRv80SM4GLAg9DyfYwi7qj jjOBVx1fKKXtKcc2E3hzwxgqG9BilmUm8Feaa/k+bMeZwAdnVrPMo/E9Ew4Qf5hlmwn/BRgAyMAN jQnpGUYAAAAASUVORK5CYII="/></svg>
|
admin/images/logo-min.png
ADDED
Binary file
|
admin/images/logo.png
ADDED
Binary file
|
admin/images/microsoft-azure.svg
ADDED
@@ -0,0 +1,43 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?xml version="1.0" encoding="utf-8"?>
|
2 |
+
<!-- Generator: Adobe Illustrator 23.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
3 |
+
<svg version="1.1" id="Layer_4_xA0_Зображення_1_"
|
4 |
+
xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 48 28"
|
5 |
+
enable-background="new 0 0 48 28" xml:space="preserve">
|
6 |
+
<image overflow="visible" width="48" height="28" id="Layer_4_xA0_Зображення" xlink:href="data:image/png;base64,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">
|
42 |
+
</image>
|
43 |
+
</svg>
|
admin/images/minimize-min.png
ADDED
Binary file
|
admin/images/next-icon-min.png
ADDED
Binary file
|
admin/images/nut-big.png
ADDED
Binary file
|
admin/images/nut-mid.png
ADDED
Binary file
|
admin/images/nut-small.png
ADDED
Binary file
|
admin/images/onedrive.svg
ADDED
@@ -0,0 +1,39 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?xml version="1.0" encoding="utf-8"?>
|
2 |
+
<!-- Generator: Adobe Illustrator 23.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
3 |
+
<svg version="1.1" id="Layer_5_xA0_Зображення_1_"
|
4 |
+
xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 44 28"
|
5 |
+
enable-background="new 0 0 44 28" xml:space="preserve">
|
6 |
+
<image overflow="visible" width="44" height="28" id="Layer_5_xA0_Зображення" xlink:href="data:image/png;base64,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">
|
38 |
+
</image>
|
39 |
+
</svg>
|
admin/images/openstack-swift.svg
ADDED
@@ -0,0 +1,28 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?xml version="1.0" encoding="utf-8"?>
|
2 |
+
<!-- Generator: Adobe Illustrator 23.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
3 |
+
<svg version="1.1" id="Layer_9_xA0_Зображення_1_"
|
4 |
+
xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 34 33"
|
5 |
+
enable-background="new 0 0 34 33" xml:space="preserve">
|
6 |
+
<image overflow="visible" width="34" height="33" id="Layer_9_xA0_Зображення" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACIAAAAhCAYAAAC803lsAAAACXBIWXMAAAsSAAALEgHS3X78AAAA
|
7 |
+
GXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAABBpJREFUeNrMV11oHFUUPufeubOT
|
8 |
+
nWS3SVMTV7R5qKJQtEG0EJMi2NJisQ/NQx98kaL2oS9VKKLgT7H0pSq+iEgVC/0RH3wQwSoUDIKC
|
9 |
+
lUIRrT4IInZjaeL+z+zszs4cz2yyyc7ubMRmmubCcPfunbn3u+d85zvnInCzj5w8XDt/4RAqtQl1
|
10 |
+
RUBEcCsbIlCtLkCTOTU5/rF5/sRb6Lx77lnryCunhDEK2G8CeB6/uPQFP9TWQ8Tv9kYR30HH72DI
|
11 |
+
Y00ClS3wnL/APH7sKBZGd2Upl8/gxqE6+D7CWjaBRMWyDmYyLxhoH6RTsOYgguYTYqofGI4mIKFX
|
12 |
+
MXDH7Woeu0lXNXFrzPD/ua5FUKnNh4KoZOlklQI79nprJds3t8CBFKDZV28u0BWQC2OtJ3YhgApl
|
13 |
+
HTemr6s9EzNo6C65DVxiPfY4PC5HDcsBUdXRGj9enaB8aTP2J92IWF62SNQ5GYQS94zMGi8ffCjx
|
14 |
+
zL751Tiq/tlF0zl55op3+ZctOLTBjXQNzeUzZJUBha5CHPJnQctsvbZaEEHTp3dahZGdv5Nb3QJz
|
15 |
+
pMLeY/cpbVjTHn/4GFTsNA9CoSPm/pFy230/wTfx0Ffee/cZXu83FkyvI4Qli1sF1kvD+tkvd1Dd
|
16 |
+
TYAUFFJjy0YxdtecenLyShwb1U5/sZXXvbOL3j7/K9DFfGqKQ5Q5oqlQmvAbf4O+Y/f3A99+9Fgc
|
17 |
+
QHLqkQtIsCdCXZlE7B1MmzcQ6Q5QYQ7hPMu+2ZePLa2k+ws9ZJ7JKgsaSNkgKQGl7AgrqVCK+LRf
|
18 |
+
ytZa4X3QVwEGsQ5ouqAjeNuBtCQ+iOPAT0HfmSeI4rOY74vFSJAhLV/cW6OKNQJcKTFZRRhnBchy
|
19 |
+
NsV27rI93OJtBFkHNX36iafAdpKsbn5oPlcUavuDWZg5FQsQ/cCuV7n7cDElt59YgERn/Shr9bX3
|
20 |
+
j5JTG8Dl8FoAWixxrrn/18Tz05/EsZH9wtv7MWlsY6505xopbMzBOFcXrKygh0okD65B4tF9l1KX
|
21 |
+
zm6PA0jenPjKt67vRjA6VJ6a1YgmxzKzVKpkmKwhocFSSlHRGnXe+9Q0Dh+wVgPC/fo7WX39g810
|
22 |
+
uQZiaNDtsIhiss5jYWxvFiKANCu0YkXh8IY/1NT4RTASDXBd7JIAjLjStMY6F4B1VzZ++HnKz954
|
23 |
+
AAdMt6tU9FlZlbYCEL6NNSvMsq1TpXiTNSs1oxWTXLOmTHepzIwAomGvmjv4gMtOLnpdfmIQElpR
|
24 |
+
4sVqZDlOiRccukaQfW8mUcWUlbm6dhN8I9fqVCo17zBrrmLB3bdUCWziCePFp0/4tSxQvhgIieLy
|
25 |
+
ve3xOnr/P+Z7vdeaa5snUMHlzbP/hMRz+99p2tg6dPwl9/OZgzw5yAxeG8sElzXfK6q9k+fM02++
|
26 |
+
8a8AAwBpB96T4TiRdAAAAABJRU5ErkJggg==">
|
27 |
+
</image>
|
28 |
+
</svg>
|
admin/images/premium.png
ADDED
Binary file
|
admin/images/premium.svg
ADDED
@@ -0,0 +1,10 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" id="Shape_2967_copy_3_1_" x="0px" y="0px" viewBox="0 0 20 20" style="enable-background:new 0 0 20 20;" xml:space="preserve">
|
2 |
+
<style type="text/css">
|
3 |
+
.st0{fill-rule:evenodd;clip-rule:evenodd;fill:#FFC000;}
|
4 |
+
</style>
|
5 |
+
<g id="Shape_2967_copy_3">
|
6 |
+
<g>
|
7 |
+
<path class="st0" d="M10,0C4.48,0,0,4.48,0,10c0,5.52,4.48,10,10,10c5.52,0,10-4.48,10-10C20,4.48,15.52,0,10,0z M13.94,14.88 H6.06L3.38,7.12l4.71,2.4L10,5.28l1.91,4.25l4.71-2.4L13.94,14.88z"/>
|
8 |
+
</g>
|
9 |
+
</g>
|
10 |
+
</svg>
|
admin/images/rackspace.svg
ADDED
@@ -0,0 +1,44 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?xml version="1.0" encoding="utf-8"?>
|
2 |
+
<!-- Generator: Adobe Illustrator 23.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
3 |
+
<svg version="1.1" id="Layer_6_xA0_Зображення_1_"
|
4 |
+
xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 36 37"
|
5 |
+
enable-background="new 0 0 36 37" xml:space="preserve">
|
6 |
+
<image overflow="visible" width="36" height="37" id="Layer_6_xA0_Зображення" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAlCAYAAAAqXEs9AAAACXBIWXMAAAsSAAALEgHS3X78AAAA
|
7 |
+
GXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAB7BJREFUeNq8WAtUk1Ucv/vGGAw2
|
8 |
+
GY9N2OaQfCFaQCdRcYJDSDg8TdFeVmqiWYkHUpSj0EFSSk2tzNJax5KOnFAKCYKNh7wGqCMGggIO
|
9 |
+
JXmoMBAEB4yvez/YGo/JVuY9557vPv7/e3/3/7r/+5HAUy6urq4XKisr/UgkkppOp3cwmUwFn8+/
|
10 |
+
OnPmzIL58+dn7d69Ww2eRekbHGC5L/aogk1cX7Wxsbm9bt26WJFIRNW3DvlpASLb2eKy6mqVE5+f
|
11 |
+
aMtifeMt9Dln7cjPwqwYt7rUgwzQ28fu7++fVlNTIywuLt6wf//+BrFYfHP8OqSnAab6nSjL1s52
|
12 |
+
J0c79qD69l0bfGiQwqAzHqsdufc6ScPtrscTew/GHbBLLRLvvSLJj9TwCYXCPbm5uYeeikQU7++b
|
13 |
+
WSNcE3nNWZBRbsrrvQJVUgFrJWDiMmAF2xawzcDrAAu/a7vgWo9wzceI74Tou3lLBII0jRqjoqJi
|
14 |
+
/hOQO3sOLZYv9U8uIdvil4Epng8XzYNVNmtZeq3fG0dKKQ6qEmCHlwJ7opYANjFfDCg4Li7lojXW
|
15 |
+
vv7aV7q2lZKS8rLRQNq/Oc/5c5HPuctw4XxiAxtiQzFs345JJNRQF7ThZC7so/lCYAbnHXAp4OIS
|
16 |
+
2L+5Yv1xRHMm+ae1442dSqU+amxsNDFcPR/u21hCtX6ENho5PQduxCPAyJcGZiGa1s9OR1+Cfak5
|
17 |
+
v6nhzZ07qpcEf18MrCEwOgFOnVloSRgt1XRwMg9cvXp1gmEGKww7nTd6YgRCc+oCYIKXWnJUiKa3
|
18 |
+
Qs74A9JcdVks60zNNiMAHjlDkkLwaLx1Y8wBNOYfFnpWX0igUCj9GRkZpk8Ec23eolwJIRVbCIRL
|
19 |
+
gEEVSQmNPzibFkrQ8RblIVUNKFppGl4oMbccOHaFxnuE+r+Is+c9KUahGhkZGaYXjOx5z1K06Yhx
|
20 |
+
crRgkJTQeM2SkFxEp0yXMJAEbwS8fUaXv8rj5YJMBDKzaBnq23M4f04FyNvb+9TkavIMyswhwDiM
|
21 |
+
qxy8iLAJC/xRVR3hMTfXRKxF0mncFO2ltbmd++KRPbVGJ8aj/rc/iFZOBQZVeMWUTTTgiNikbALM
|
22 |
+
9DGS0fWYW29Ff6Ghl3sE7EFjcnf/1Pq1HwRcdXrxQgbsN2+OOqKhcXR0vG4IIEtLy9tjwDz4Od0L
|
23 |
+
nbYIBjZdm9HUImCJ7GlY+XsBXcPTvO9wAFIZ4pOMuvytV7dv18yfOPmVhyFgUDUxMekcA6jcak47
|
24 |
+
WlzjTeOlgza9GRZxdLxU68O3HZDyZourPP0//Sv+BFd3ztPTM9VQQNDTlDqq2hsrJsBwJrEdJB0G
|
25 |
+
DIZMXPl7vo2h8Sst/TdLMpk8ZCggGCBbMMTYnVNMbftWFGcKzImZiYUEBsBDYO0bcIEZ4N1hKKCS
|
26 |
+
gsIAtVptcEbBYDA6CEAdqZe29eOtFFNgDXvDEwhxCIcMTIDN+qAkY64baXmZrzH0Dg4O9QSgrozc
|
27 |
+
DzAoBVxPRjIIlIA+/QUFa9P6cmM2aGho8DSGHmaUUqz1yGmXvuYapxHp4JOqaxgMAYaPZ7Ixi8fF
|
28 |
+
xTHb2trmGMPj5eWVhfWUVPgNgV6AAbNJiXCgAhRAB/TlHkYBam5u5g0PDxtsPywWq2nr1q1V2EBz
|
29 |
+
y0skaCG4HnMegsZszpqtYEe8fl13PGLLliCo8xSYxGf6+/vvSktLw3TnYbrKMOYAwcHBI8H2qr3b
|
30 |
+
tUJA03Fx+zHujgJdbcCGk7rMfr5+x8a7LIzG1UqlUgsiLCxsuREBcbC2tpZI/LGhTiWbDCz0pNk4
|
31 |
+
7GHA3IlfoLWNAwnR2TnZO8afsKmpyUUgEORr+t3d3Y8NlQ5UVbyzs7NqxDUpM7pQmjlZMEQJVgnM
|
32 |
+
ie99fGIGopVUlHGmOm18fPy7iBa+v3iGSAc+jVrHxgrKjA59gAqBOX7FyqVeQ+sTEvTjVBvQaDTt
|
33 |
+
fQQvy7ap6KHtjQkNGEY1UyJPmqwMw4A4bZajDLXPp120kPyW/saUD8a+Pubhw4dRugF4PF7Zk2hh
|
34 |
+
QpYQGhpaPAYQlc+tR24P9FwZZsxpDaj1x+X8ED2OOKHAt9ar6AsTrkx9NH5+fheOHTu2f/w4RnNb
|
35 |
+
IEWB7x9jxrVfDF4XgEK5QSRtdXU+hhppRUXFIvQNCQlJwTBswvzChQsl2dnZr0zGizEEHhdNiEtV
|
36 |
+
NUFhJsAUULkcIv7Uy6tfMhTQ/fv3nZOSksxXrVrVCaPved05Nze3dLlcvlIfLwYDXhWN7VwzAB4Q
|
37 |
+
Lq6RFA6lRoFAMTtrBZE7t997zpinfk9Pj3liYuIL8L01Xyf4fS6TyYKn5G45ekaYp31dcLQuX0nm
|
38 |
+
Er9O4g5+YmZokEOVRCINjubHmjynOSYmxt+ol+l1r/Bfc4gEjTsKyAq/YeXcjeYEvr4cYwDp1sDA
|
39 |
+
wOMJCQnORj+Vh7oeUsrZc5sko6DQU7nF1lUTtOYaA8LCwkK5YsWKr2FwXICYk5OTZ5w6dcrDaFAq
|
40 |
+
Rct0KdtJMZLo0/Eas1mE/SR+edzGnuMghXeOSo+KUMRtdHd3Tw4PD387NjbW6t/+zJiQjXVdKqQr
|
41 |
+
9uxK7pCXBlJhjiQAnVqadzdvZvf19/O7urrsuFwu7c6dOyoIpoPNZreIRCLF//qLrnHLR+/BN1Zh
|
42 |
+
k/dqa/AMy98CDAB9eR/BgGYbqAAAAABJRU5ErkJggg==">
|
43 |
+
</image>
|
44 |
+
</svg>
|
admin/images/red-close-min.svg
ADDED
@@ -0,0 +1 @@
|
|
|
1 |
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 13 12"><path fill-rule="evenodd" fill="#d0302d" d="M12.4 2.6c.3-.3.52-.62.57-1.05 0-.01.01-.02.02-.03V1.2l-.12-.42a1.57 1.57 0 0 0-1.26-.99c-.02 0-.05-.02-.07-.02h-.35c-.05.01-.1.03-.15.04-.34.07-.63.25-.88.5L6.7 3.72c-.03.02-.06.07-.1.1-.02.01-.04.01-.07.02-.02-.05-.04-.1-.08-.14L3.05.3C2.76.02 2.43-.2 2-.24 2-.23 2-.24 2-.25h-.35c-.17.05-.34.08-.5.15C.14.35-.14 1.65.6 2.44l2.2 2.2L4.2 6l.1.12c-.05.03-.1.05-.13.1L.7 9.65c-.53.53-.67 1.24-.37 1.88.46.97 1.76 1.23 2.55.5l.82-.8L6.47 8.5c.03-.03.06-.08.08-.12h.06c.04.05.07.1.12.16l3.44 3.4c.54.53 1.25.66 1.9.34.5-.24.8-.65.9-1.2L13 11v-.35c-.01-.05-.03-.1-.04-.15-.07-.34-.25-.62-.5-.87L9 6.23c-.03-.03-.08-.07-.13-.1.05-.05.08-.1.12-.12l3.4-3.4z"/></svg>
|
admin/images/red-cross.svg
ADDED
@@ -0,0 +1,204 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?xml version="1.0" encoding="utf-8"?>
|
2 |
+
<!-- Generator: Adobe Illustrator 23.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
3 |
+
<svg version="1.1" id="Layer_1229_xA0_Зображення_1_"
|
4 |
+
xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 144 123"
|
5 |
+
enable-background="new 0 0 144 123" xml:space="preserve">
|
6 |
+
<image overflow="visible" width="144" height="123" id="Layer_1229_xA0_Зображення" xlink:href="data:image/png;base64,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
|
202 |
+
rkJggg==">
|
203 |
+
</image>
|
204 |
+
</svg>
|
admin/images/restore-icon-min.png
ADDED
Binary file
|
admin/images/restore-min.svg
ADDED
@@ -0,0 +1 @@
|
|
|
1 |
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 13 12"><path fill-rule="evenodd" fill="#fff" d="M11 6.65c.01 2.13-1.8 3.77-3.73 4-1.82.23-3.6-.62-4.45-2.2-.84-1.54-.52-3.43.8-4.67C4.85 2.6 6.6 2.43 7.56 2.7l-1 1.18c-.07.07-.14.15-.07.23.05.06.15.1.24.1l1.25.08 3.02.18c.34.02.53-.2.44-.52L10.27.1c-.02-.08-.1-.16-.2-.2-.04-.02-.15.05-.2.1l-.9 1.06c-.07.08-.12.1-.2.06a6.52 6.52 0 0 0-4.74.22C1.33 2.52-.1 5.44.65 8.13c.68 2.4 2.93 4.18 5.56 4.36 1.36.1 2.62-.18 3.77-.87 1.7-1 2.65-2.47 2.9-4.33.03-.2.03-.42.04-.63H11z"/></svg>
|
admin/images/search-min.png
ADDED
Binary file
|
admin/images/sftp-scp.svg
ADDED
@@ -0,0 +1,29 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?xml version="1.0" encoding="utf-8"?>
|
2 |
+
<!-- Generator: Adobe Illustrator 23.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
3 |
+
<svg version="1.1" id="Shape_17_xA0_Зображення_1_"
|
4 |
+
xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 37 38"
|
5 |
+
enable-background="new 0 0 37 38" xml:space="preserve">
|
6 |
+
<image overflow="visible" width="37" height="38" id="Shape_17_xA0_Зображення" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACUAAAAmCAYAAABDClKtAAAACXBIWXMAAAsSAAALEgHS3X78AAAA
|
7 |
+
GXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAABGRJREFUeNrMWFtsDUEYnjlZvYUh
|
8 |
+
jUgRDyTEg5BIG22kbhX3XtLqUVKJRAURiRC0r6Re+oIKQiSi9KrVG4rWrVF1SRBCQl1eGg9C2LiU
|
9 |
+
csY3e6a7Z/fsOj3tntYk3/6zu//OfPvPzLf/LCX9KKzy7mSYM8BcQig13eS0P038ATqADeraOW9C
|
10 |
+
OYdskVV1pMFUAd8IJ6V4RA3ZRDDReGA7EAPkgdi1AZNi1e074FKCTtpxukZdM/cDGWBhFfcSYM4D
|
11 |
+
yUARiJWERYpV3xZvdBLIhwuiQ3aq3tTfZJCFVXaOgDmMl9wCWwEUgNz3kKRYza1JMHV4cAbsVtU7
|
12 |
+
7zRxuYBcAcwR4DmQreYlv3Mkxc7fSAUZEeJezTl3wX0SoYLFkyyHMxo0vCB2o++exyB0fStmaBuh
|
13 |
+
/BWQFElCoqh5KZ3oLwl4CVwFyR16pFhtW7QMZQFW1wmxStTVab/IEBVWdScKNA6hugX9C9nZDFKt
|
14 |
+
LagsBTCR6ZPg5W0daRpi+dMQ+kXtr3E6ExWxEG4pGCpB6AXwzCAQ4Ewt7Dg3N04dXoJyB5LchiQX
|
15 |
+
/kJUZwHzFUJ84kapmr3kGBnmAinaBi5HFD9zTv6T4hNcPFqYqUGK1bV4Aq2/ftUzJJSoT+Pi8Q+f
|
16 |
+
z9/5hcvFuNgg50QHu9CyC+TG4P5n2JTIk+J9pAKHzzcBGC8nJCwfCycGjALiXZk3tW3TgU2GPrZt
|
17 |
+
BGYYi8A6fJrlf/ThNcGteceXAcWQIo9cfBgdstzo32eNlKbordKhHhCq+0EoLpxfuqLkOYsPot2J
|
18 |
+
sD7Z5yQ1J61Ej5RQIdbQwFGvwZUas+g4iZyTEFKbZyix1T5nMV4NPfMqkl0uLuSaBZDbE3MSyyB/
|
19 |
+
2g9/G3IwipxPInzHg/yIgwhHjiTyLLpbiif5pGZkvxlu5YQkfRJ0lP9IzfWJrpjUvKl2Ea4nqBk5
|
20 |
+
5ayxTqSsImt4AOwDShHN9xH/yoCV5TPD16O+R0pCIZCBaxBUXgTMdmWI6hspEGucN8UA1FnRKY8C
|
21 |
+
PEauwXVHQl0KBuXIMHk3q2/oy2mQn8tAyCG0zCku9nRf5MNfcfwJ9GienLiUjfImvOBHNTOLy352
|
22 |
+
oe2HgUtR0b7MxgOFOMTJukj+PqurvF9Zc/VUNPTWFUXPzOqC6TLOM8+ZPshajn6pXEThB6o9Ninq
|
23 |
+
PwSJ2uhNKEUP1QYV+81YRd57jCtPnVNaO5LW9qlZZQcmxIk4zpbpMClTV+QPfzrcWIdtHjnqcXVl
|
24 |
+
uZHkEV0SZOZ5uSwOGKPVL52NB6JlPWHoFD04ySvGjXpZvwnsBcl42G4QWzjE6bDOdJye9lI+GoDy
|
25 |
+
8pGAIB/nyry5WJECHNDPm6v2A6nmdNicefYa6TDvCye37ngGGY0pQgPZxXKZDvuWA9MC+7Qqern8
|
26 |
+
DSjqB3F4BLzX/in564MXzxXrhFjqgqmuXJto2mJp4nnllAhDE+rNwf8NwhA+fXtOwvvnYPYTG4gs
|
27 |
+
kbp0oaF0nKSHJXThZqL9T4tf/xVgAN4NylGysIuoAAAAAElFTkSuQmCC">
|
28 |
+
</image>
|
29 |
+
</svg>
|
admin/images/stars.gif
ADDED
Binary file
|
admin/images/success.png
ADDED
Binary file
|
admin/images/support-1.svg
ADDED
@@ -0,0 +1 @@
|
|
|
1 |
+
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="66" height="63" viewBox="0 0 66 63" id="img" fill="currentColor"><defs><filter id="filter" x="282" y="1117" width="66" height="63" filterUnits="userSpaceOnUse"><feOffset result="offset" dx="0.877" dy="1.798" in="SourceAlpha"></feOffset> <feGaussianBlur result="blur" stdDeviation="2.646"></feGaussianBlur> <feFlood result="flood" flood-opacity="0.08"></feFlood> <feComposite result="composite" operator="in" in2="blur"></feComposite> <feBlend result="blend" in="SourceGraphic"></feBlend></filter></defs> <path d="M287.648,1146.81a8.609,8.609,0,0,1,2.508-4.62,8.057,8.057,0,0,1,4.883-2.07,18.346,18.346,0,0,1,6.867-14.18,18.746,18.746,0,0,1,30.555,14.15c3.413,0.47,5.849,2.18,6.92,5.49,1.545,4.78-.944,9.62-5.631,10.65a22.243,22.243,0,0,1-5.3.24,1.63,1.63,0,0,1-1.654-1.82c0-4.21-.008-8.43,0-12.64a1.733,1.733,0,0,1,1.834-1.89c0.571-.04,1.146-0.01,1.871-0.01-0.2-5.65-2.38-10.2-6.983-13.39-5.706-3.95-11.811-4.29-17.974-1.06a16.06,16.06,0,0,0-8.565,14.37c0.545,0.03,1.1.05,1.661,0.08a1.8,1.8,0,0,1,1.979,1.99q0.016,6.21,0,12.42c0,1.32-.339,1.62-2.6,2.25,1.727,2.21,3.238,4.46,5.079,6.41a9.307,9.307,0,0,0,6.5,2.54,1.182,1.182,0,0,0,1.327-.75,3.647,3.647,0,0,1,6.9,1.84,3.632,3.632,0,0,1-3.028,3.4,3.566,3.566,0,0,1-3.784-1.82,1.492,1.492,0,0,0-1.5-.88,12.481,12.481,0,0,1-10.256-5.88c-0.953-1.47-1.86-2.96-2.836-4.42a1.564,1.564,0,0,0-.943-0.67c-4.366-.31-6.85-2.69-7.834-6.77v-2.96Zm11.085,7.9v-12.82c-3.06-.14-6.092-0.37-8.085,2.48a6.574,6.574,0,0,0-.286,7.4C292.2,1155.01,295.422,1154.89,298.733,1154.71Zm29.984-12.82v12.82c3.216,0.18,6.372.31,8.274-2.81a6.56,6.56,0,0,0-.073-7.31C334.993,1141.55,331.875,1141.72,328.717,1141.89Zm-14.54,22.9a1.875,1.875,0,0,0-1.9,1.76,1.9,1.9,0,0,0,3.8.11A1.88,1.88,0,0,0,314.177,1164.79Zm-0.237-38.49a14.141,14.141,0,0,1,2.336.31,1.521,1.521,0,0,1,.978.99c0.052,0.76-.641.87-1.25,0.75a10.235,10.235,0,0,0-6.34.55,31.447,31.447,0,0,0-4.574,2.98c-0.483.34-.88,0.87-1.468,0.32a1,1,0,0,1,.164-1.58A13.968,13.968,0,0,1,313.94,1126.3Zm5.46,2.35a1.767,1.767,0,0,1,.847-0.48,11.267,11.267,0,0,1,1.675,1.33,2.736,2.736,0,0,1-.939.8A1.753,1.753,0,0,1,319.4,1128.65Z" transform="translate(-282 -1117)" class="cls-1"></path></svg>
|
admin/images/support-2.svg
ADDED
@@ -0,0 +1 @@
|
|
|
1 |
+
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="69" height="47" viewBox="0 0 69 47" id="img" fill="currentColor"><defs><filter id="filter" x="572" y="1122" width="69" height="47" filterUnits="userSpaceOnUse"><feOffset result="offset" dx="0.877" dy="1.798" in="SourceAlpha"></feOffset> <feGaussianBlur result="blur" stdDeviation="2.646"></feGaussianBlur> <feFlood result="flood" flood-opacity="0.08"></feFlood> <feComposite result="composite" operator="in" in2="blur"></feComposite> <feBlend result="blend" in="SourceGraphic"></feBlend></filter></defs> <path d="M632.188,1134.43c-0.675,2.31-2.013,3.88-4.583,4.22a1.628,1.628,0,0,0-.733,1.07c-1.34,4.66-2.642,9.33-3.955,14-0.087.3-.187,0.61-0.287,0.93H585.87c-0.861-3.64-1.719-7.25-2.574-10.87-0.194-.82-0.391-1.64-0.569-2.46-0.341-1.58-.622-2.86-2.7-3.49-2.682-.8-3.551-4.21-2.192-6.67a5.049,5.049,0,0,1,6.85-1.94,4.908,4.908,0,0,1,1.756,6.9c-0.188.3-.409,0.58-0.61,0.87,5.38,6.57,11.5,5.92,15.7-1.64-2.4-3.11-2.438-5.79-.1-7.74a5.075,5.075,0,0,1,6.852.31c2.1,2.2,1.859,4.91-.907,7.79a50.3,50.3,0,0,0,3.7,4.31,5.9,5.9,0,0,0,6.483,1.02,17.2,17.2,0,0,0,5.84-4.01,5.072,5.072,0,0,1-1.112-4.36,5,5,0,0,1,9.7-.11,2.417,2.417,0,0,0,.209.42v1.45Zm-7.453,4.78a57.321,57.321,0,0,1-6.162,3.69,7.834,7.834,0,0,1-9.493-1.75,43.1,43.1,0,0,1-3.8-5.26,10.627,10.627,0,0,1-.63-1.15c-1.274,1.77-2.369,3.57-3.736,5.14-4.079,4.67-9.083,5.06-13.964,1.2-0.8-.63-1.562-1.32-2.556-2.16,1.074,4.56,2.07,8.85,3.125,13.12a1.224,1.224,0,0,0,.94.46c1.464,0.05,2.931.02,4.4,0.02q13.5,0,26.993-.01c0.529,0,1.117.2,1.344-.63C622.363,1147.59,623.581,1143.32,624.735,1139.21Zm-42.493-8.42a2.758,2.758,0,0,0-2.845,2.67,2.8,2.8,0,1,0,5.609.07A2.727,2.727,0,0,0,582.242,1130.79Zm42.124,2.97a2.85,2.85,0,0,0,2.829,2.74,2.9,2.9,0,0,0,2.778-2.82,2.792,2.792,0,0,0-2.855-2.69A2.734,2.734,0,0,0,624.366,1133.76Zm-19.608-5.13a2.746,2.746,0,0,0-2.877,2.63,3.038,3.038,0,0,0,2.777,2.98,3.133,3.133,0,0,0,2.832-2.82A2.755,2.755,0,0,0,604.758,1128.63Zm-0.569,30.46c-5.5,0-11-.01-16.492.01-0.845,0-1.693-.09-1.645-1.11,0.045-.94.859-1.1,1.72-1.1,11,0.01,21.989,0,32.984.04a2.159,2.159,0,0,1,1.609.85c0.4,0.75-.264,1.3-1.44,1.31H604.189Z" transform="translate(-572 -1122)" class="cls-1"></path></svg>
|
admin/images/support-3.svg
ADDED
@@ -0,0 +1 @@
|
|
|
1 |
+
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="70" height="56" viewBox="0 0 70 56" id="img" fill="currentColor"><defs><filter id="filter" x="870" y="1118" width="70" height="56" filterUnits="userSpaceOnUse"><feOffset result="offset" dx="0.877" dy="1.798" in="SourceAlpha"></feOffset> <feGaussianBlur result="blur" stdDeviation="2.646"></feGaussianBlur> <feFlood result="flood" flood-opacity="0.08"></feFlood> <feComposite result="composite" operator="in" in2="blur"></feComposite> <feBlend result="blend" in="SourceGraphic"></feBlend></filter></defs> <path d="M929.12,1132.08a1.422,1.422,0,0,0-1.238.55c-0.331.32-.667,0.63-1,0.95a29.832,29.832,0,0,0-2.774,2.84,3.443,3.443,0,0,1-4.386,1.1,3.314,3.314,0,0,1-1.7-2.4,2.5,2.5,0,0,1,.444-2.33c0.8-.81,1.608-1.61,2.416-2.41,0.774-.76,1.548-1.53,2.316-2.3a1.094,1.094,0,0,0-.559-2.09l-0.853-.24c-1.38-.38-2.807-0.78-4.223-1.04a1.981,1.981,0,0,0-1.449.33c-2.48,2.33-4.938,4.78-7.308,7.26a2.016,2.016,0,0,0-.37,1.46,19.146,19.146,0,0,0,.577,2.4c0.133,0.47.271,0.95,0.387,1.43a1.808,1.808,0,0,1-.122,1.44c-0.513.69-1.067,1.33-1.654,2.01-0.217.25-.439,0.51-0.663,0.77l-0.359.42-1.768-1.79c-1-1.02-1.88-1.91-2.764-2.81-0.055-.05-0.11-0.11-0.165-0.16a1.763,1.763,0,0,1-.585-2.27,2.168,2.168,0,0,0-.54-1.08,18.126,18.126,0,0,0-1.7-1.64c-0.279-.25-0.569-0.51-0.865-0.78l-0.585-.54,0.743-.29a4.723,4.723,0,0,1,5.089.64c0.962,0.76,1.192.75,2.056-.08,1.118-1.08,2.26-2.21,3.393-3.36,0.818-.83.816-1.25-0.01-2.05a12.424,12.424,0,0,0-16.071-.74c-2.391,2-4.636,4.27-6.807,6.47-0.842.86-1.713,1.74-2.582,2.59a1,1,0,0,0,0,1.56c0.177,0.2.365,0.4,0.564,0.61,0.1,0.1.192,0.2,0.291,0.31l0.316,0.34-1.825,1.96-0.37-.31c-0.1-.08-0.185-0.16-0.264-0.22-0.16-.13-0.291-0.24-0.415-0.36-1.021-.94-1.276-0.94-2.27.04l-0.384.38c-0.992.97-2.019,1.97-3,2.99-0.79.81-.664,1.2-0.081,1.79,2.614,2.63,5.284,5.26,7.866,7.8a1.065,1.065,0,0,0,1.728-.03c1.2-1.16,2.478-2.42,3.743-3.72a1.054,1.054,0,0,0-.008-1.72c-0.2-.2-0.385-0.4-0.51-0.53l-0.38-.41,1.638-2.24,0.418,0.38a5.633,5.633,0,0,0,1.618,1.22,2.488,2.488,0,0,0,1.3-.57l0.333-.2,5.715,5.44-2.243,2.22c-1.489,1.47-2.979,2.95-4.471,4.42a5.4,5.4,0,0,0-1.778,3.63,5.279,5.279,0,0,0,9.022,3.99c1.549-1.5,3.04-2.99,4.619-4.57q1.012-1.02,2.039-2.04l0.358-.36,2.438,2.42c1.71,1.7,3.4,3.39,5.1,5.06,0.795,0.79,1.223.8,2,.05,1.62-1.58,3.241-3.19,4.818-4.79,0.845-.86.846-1.23,0.006-2.08-1.139-1.16-2.308-2.33-3.473-3.46-0.84-.82-1.686-1.62-2.582-2.47-0.4-.37-0.81-0.76-1.228-1.16l-0.389-.37,0.4-.36c0.27-.25.526-0.47,0.765-0.68a11.96,11.96,0,0,0,1.238-1.18,2.1,2.1,0,0,1,2.512-.68,25.749,25.749,0,0,0,3.582.92,1.649,1.649,0,0,0,1.146-.16c2.147-2.09,4.289-4.25,6.36-6.35l1.75-1.77v-0.73l-0.432-1.48c-0.358-1.23-.715-2.45-1.076-3.68A1.456,1.456,0,0,0,929.12,1132.08Zm-34.9-5.35a10.322,10.322,0,0,1,12.331.01l0.4,0.31-0.453.57c-0.083.1-.152,0.19-0.223,0.27-0.842,1.01-1.822,1.92-3.726.93a4.976,4.976,0,0,0-4.634.12,2.71,2.71,0,0,1-1.247.36,2.32,2.32,0,0,1-1.771-1.05,5.371,5.371,0,0,0-.479-0.52c-0.084-.09-0.168-0.18-0.251-0.26l-0.374-.4Zm-9.464,22.4-6.635-6.63,2.44-2.15,6.452,6.43Zm1.863-6.03-2.339-2.78,1.733-1.73,2.827,2.73Zm5.828-1.56-6.559-6.51,6.274-6.22,6.53,6.51Zm2.988,0.09,3.722-3.7,5.6,5.53-3.854,3.64Zm23.809,16.18-3.707,3.53-6.777-6.69,3.626-3.68Zm8.6-17.84c-0.46.46-.922,0.91-1.384,1.36-1.047,1.03-2.129,2.09-3.153,3.16a1.96,1.96,0,0,1-2.283.58c-0.509-.17-1.03-0.29-1.581-0.42s-1.136-.27-1.7-0.46a1.863,1.863,0,0,0-2.175.61c-5.451,5.46-11.022,10.97-16.41,16.3l-0.473.47a3.558,3.558,0,0,1-2.493,1.12,3.238,3.238,0,0,1-3.141-3.83,5.315,5.315,0,0,1,1.358-2.19c6.333-6.34,11.561-11.52,16.452-16.31,0.893-.87,1.078-1.53.685-2.43a0.967,0.967,0,0,1-.073-0.33l0-.03c-1.48-2.77-.836-5.11,1.969-7.14a10.674,10.674,0,0,0,1.556-1.47c0.234-.25.475-0.51,0.724-0.76,1.686-1.67,1.892-1.7,4.4-.67l0.719,0.29-0.563.53c-0.413.39-.819,0.78-1.22,1.16-0.951.9-1.85,1.76-2.776,2.61a1.67,1.67,0,0,0-.576,2.03,31.312,31.312,0,0,1,1.02,3.66,1.42,1.42,0,0,0,1.238,1.27,34.306,34.306,0,0,1,3.94,1.06,1.444,1.444,0,0,0,1.725-.46c0.9-.94,1.835-1.89,2.738-2.81,0.385-.39.772-0.78,1.161-1.18l0.484-.49,0.326,0.61C929.518,1138,929.476,1138.35,927.847,1139.97Z" transform="translate(-870 -1118)" class="cls-1"></path></svg>
|
admin/images/thumb.png
ADDED
Binary file
|
admin/images/timemachine.svg
ADDED
@@ -0,0 +1 @@
|
|
|
1 |
+
<?xml version="1.0" encoding="UTF-8"?><svg viewBox="0 0 30 30" xmlns="http://www.w3.org/2000/svg"><circle cx="15" cy="15" r="15" fill="#257671"/><path d="m13.998 10.5-0.0024 5.6844c0 0.2158 0.0857 0.4221 0.2381 0.5744l4.0664 4.0657 1.149-1.1489-3.8285-3.8277 0.0024-5.3479h-1.625z" fill="#fff"/><path d="m15.625 4c-5.7191 0-10.452 4.2474-11.245 9.75h-3.3799l4.0625 4.0625 4.0625-4.0625h-3.1032c0.77732-4.6038 4.7815-8.125 9.6032-8.125 5.3765 0 9.75 4.3735 9.75 9.75 0 5.3765-4.3735 9.75-9.75 9.75-3.0223 0-5.8247-1.3679-7.6886-3.753l-1.2806 0.9997c2.174 2.7819 5.4431 4.3783 8.9692 4.3783 6.2723 0 11.375-5.1035 11.375-11.375 0-6.2714-5.1027-11.375-11.375-11.375z" fill="#fff"/></svg>
|
admin/images/trash.png
ADDED
Binary file
|
admin/images/unlocked-min.svg
ADDED
@@ -0,0 +1 @@
|
|
|
1 |
+
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 19 26"><defs><path id="A" d="M19 13.4c0-1.08-.7-1.8-1.8-1.8h-.8v-.5-3.6c-.01-.6-.03-1.2-.15-1.76-.55-2.53-2.1-4.27-4.55-5.1C9.17-.24 6.83.23 4.8 1.94c-2 1.7-2.57 3.96-2.33 6.48 0 .02.03.04.03.04h2.15V7c.02-2.17 1.7-4.1 3.93-4.5 2.18-.4 4.5.87 5.24 2.92.2.57.3 1.2.33 1.8l.02 4.38H1.67c-1.1 0-1.83.72-1.83 1.8v10.43c0 1.2.7 1.88 1.9 1.88h15.4c1.1 0 1.84-.72 1.84-1.8v-2.7l.01-7.8zm-8.35 5.13c-.27.2-.34.4-.33.7l.01 1.88c0 .58-.37.98-.9.98s-.9-.4-.9-.97v-1.5c.04-.5-.04-.88-.5-1.27-.82-.7-.72-1.97.1-2.68.84-.73 2.07-.63 2.8.23.66.8.54 2-.3 2.63z"/></defs><clipPath id="B"><use xlink:href="#A"/></clipPath><image overflow="visible" clip-path="url(#B)" width="19" height="26" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAAaCAIAAADaPfBTAAAACXBIWXMAAAsSAAALEgHS3X78AAAA GXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACJJREFUeNpiVC0rZCALMDGQC0Z1 juoc1Tmqc1QnfXQCBBgAx7IBQEz79mMAAAAASUVORK5CYII="/></svg>
|
admin/images/upload-min.png
ADDED
Binary file
|
admin/images/upload.svg
ADDED
@@ -0,0 +1,47 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?xml version="1.0" encoding="utf-8"?>
|
2 |
+
<!-- Generator: Adobe Illustrator 23.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
3 |
+
<svg version="1.1" id="Shape_703_xA0_Зображення_1_"
|
4 |
+
xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 97 73"
|
5 |
+
enable-background="new 0 0 97 73" xml:space="preserve">
|
6 |
+
<image overflow="visible" width="97" height="73" id="Shape_703_xA0_Зображення" xlink:href="data:image/png;base64,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">
|
46 |
+
</image>
|
47 |
+
</svg>
|
admin/images/warning-grey.png
ADDED
Binary file
|
admin/images/warning-red.png
ADDED
Binary file
|
admin/images/x-face.png
ADDED
Binary file
|
admin/js/backup-migration.min.js
ADDED
@@ -0,0 +1 @@
|
|
|
1 |
+
!function(t,e){"function"==typeof define&&define.amd?define(["jquery"],function(t){return e(t)}):"object"==typeof exports?module.exports=e(require("jquery")):e(jQuery)}(0,function(t){var e={animation:"fade",animationDuration:350,content:null,contentAsHTML:!1,contentCloning:!1,debug:!0,delay:300,delayTouch:[300,500],functionInit:null,functionBefore:null,functionReady:null,functionAfter:null,functionFormat:null,IEmin:6,interactive:!1,multiple:!1,parent:null,plugins:["sideTip"],repositionOnScroll:!1,restoration:"none",selfDestruction:!0,theme:[],timer:0,trackerInterval:500,trackOrigin:!1,trackTooltip:!1,trigger:"hover",triggerClose:{click:!1,mouseleave:!1,originClick:!1,scroll:!1,tap:!1,touchleave:!1},triggerOpen:{click:!1,mouseenter:!1,tap:!1,touchstart:!1},updateAnimation:"rotate",zIndex:9999999},i="undefined"!=typeof window?window:null,o={hasTouchCapability:!(!i||!("ontouchstart"in i||i.DocumentTouch&&i.document instanceof i.DocumentTouch||i.navigator.maxTouchPoints)),hasTransitions:function(){if(!i)return!1;var t=(i.document.body||i.document.documentElement).style,e="transition",o=["Moz","Webkit","Khtml","O","ms"];if("string"==typeof t[e])return!0;e=e.charAt(0).toUpperCase()+e.substr(1);for(var n=0;n<o.length;n++)if("string"==typeof t[o[n]+e])return!0;return!1}(),IE:!1,semVer:"4.2.8",window:i},n=function(){this.__$emitterPrivate=t({}),this.__$emitterPublic=t({}),this.__instancesLatestArr=[],this.__plugins={},this._env=o};function r(t){this.$container,this.constraints=null,this.__$tooltip,this.__init(t)}function s(e,i){var o=!0;return t.each(e,function(t,n){if(void 0===i[t]||e[t]!==i[t])return o=!1,!1}),o}function a(e){var i=e.attr("id"),n=i?o.window.document.getElementById(i):null;return n?n===e[0]:t.contains(o.window.document.body,e[0])}n.prototype={__bridge:function(e,i,o){if(!i[o]){var n=function(){};n.prototype=e;var r=new n;r.__init&&r.__init(i),t.each(e,function(t,e){0!=t.indexOf("__")&&(i[t]||(i[t]=function(){return r[t].apply(r,Array.prototype.slice.apply(arguments))},i[t].bridged=r))}),i[o]=r}return this},__setWindow:function(t){return o.window=t,this},_getRuler:function(t){return new r(t)},_off:function(){return this.__$emitterPrivate.off.apply(this.__$emitterPrivate,Array.prototype.slice.apply(arguments)),this},_on:function(){return this.__$emitterPrivate.on.apply(this.__$emitterPrivate,Array.prototype.slice.apply(arguments)),this},_one:function(){return this.__$emitterPrivate.one.apply(this.__$emitterPrivate,Array.prototype.slice.apply(arguments)),this},_plugin:function(e){if("string"==typeof e){var i=e,o=null;return i.indexOf(".")>0?o=this.__plugins[i]:t.each(this.__plugins,function(t,e){if(e.name.substring(e.name.length-i.length-1)=="."+i)return o=e,!1}),o}if(e.name.indexOf(".")<0)throw new Error("Plugins must be namespaced");return this.__plugins[e.name]=e,e.core&&this.__bridge(e.core,this,e.name),this},_trigger:function(){var t=Array.prototype.slice.apply(arguments);return"string"==typeof t[0]&&(t[0]={type:t[0]}),this.__$emitterPrivate.trigger.apply(this.__$emitterPrivate,t),this.__$emitterPublic.trigger.apply(this.__$emitterPublic,t),this},instances:function(e){var i=[];return t(e||".tooltipstered").each(function(){var e=t(this),o=e.data("tooltipster-ns");o&&t.each(o,function(t,o){i.push(e.data(o))})}),i},instancesLatest:function(){return this.__instancesLatestArr},off:function(){return this.__$emitterPublic.off.apply(this.__$emitterPublic,Array.prototype.slice.apply(arguments)),this},on:function(){return this.__$emitterPublic.on.apply(this.__$emitterPublic,Array.prototype.slice.apply(arguments)),this},one:function(){return this.__$emitterPublic.one.apply(this.__$emitterPublic,Array.prototype.slice.apply(arguments)),this},origins:function(e){return t((e?e+" ":"")+".tooltipstered").toArray()},setDefaults:function(i){return t.extend(e,i),this},triggerHandler:function(){return this.__$emitterPublic.triggerHandler.apply(this.__$emitterPublic,Array.prototype.slice.apply(arguments)),this}},t.tooltipster=new n,t.Tooltipster=function(e,i){this.__callbacks={close:[],open:[]},this.__closingTime,this.__Content,this.__contentBcr,this.__destroyed=!1,this.__$emitterPrivate=t({}),this.__$emitterPublic=t({}),this.__enabled=!0,this.__garbageCollector,this.__Geometry,this.__lastPosition,this.__namespace="tooltipster-"+Math.round(1e6*Math.random()),this.__options,this.__$originParents,this.__pointerIsOverOrigin=!1,this.__previousThemes=[],this.__state="closed",this.__timeouts={close:[],open:null},this.__touchEvents=[],this.__tracker=null,this._$origin,this._$tooltip,this.__init(e,i)},t.Tooltipster.prototype={__init:function(i,n){var r=this;if(r._$origin=t(i),r.__options=t.extend(!0,{},e,n),r.__optionsFormat(),!o.IE||o.IE>=r.__options.IEmin){var s=null;if(void 0===r._$origin.data("tooltipster-initialTitle")&&(void 0===(s=r._$origin.attr("title"))&&(s=null),r._$origin.data("tooltipster-initialTitle",s)),null!==r.__options.content)r.__contentSet(r.__options.content);else{var a,l=r._$origin.attr("data-tooltip-content");l&&(a=t(l)),a&&a[0]?r.__contentSet(a.first()):r.__contentSet(s)}r._$origin.removeAttr("title").addClass("tooltipstered"),r.__prepareOrigin(),r.__prepareGC(),t.each(r.__options.plugins,function(t,e){r._plug(e)}),o.hasTouchCapability&&t(o.window.document.body).on("touchmove."+r.__namespace+"-triggerOpen",function(t){r._touchRecordEvent(t)}),r._on("created",function(){r.__prepareTooltip()})._on("repositioned",function(t){r.__lastPosition=t.position})}else r.__options.disabled=!0},__contentInsert:function(){var t=this._$tooltip.find(".tooltipster-content"),e=this.__Content;return this._trigger({type:"format",content:this.__Content,format:function(t){e=t}}),this.__options.functionFormat&&(e=this.__options.functionFormat.call(this,this,{origin:this._$origin[0]},this.__Content)),"string"!=typeof e||this.__options.contentAsHTML?t.empty().append(e):t.text(e),this},__contentSet:function(e){return e instanceof t&&this.__options.contentCloning&&(e=e.clone(!0)),this.__Content=e,this._trigger({type:"updated",content:e}),this},__destroyError:function(){throw new Error("This tooltip has been destroyed and cannot execute your method call.")},__geometry:function(){var e=this._$origin,i=this._$origin.is("area");if(i){var n=this._$origin.parent().attr("name");e=t('img[usemap="#'+n+'"]')}var r=e[0].getBoundingClientRect(),s=t(o.window.document),a=t(o.window),l=e,c={available:{document:null,window:null},document:{size:{height:s.height(),width:s.width()}},window:{scroll:{left:o.window.scrollX||o.window.document.documentElement.scrollLeft,top:o.window.scrollY||o.window.document.documentElement.scrollTop},size:{height:a.height(),width:a.width()}},origin:{fixedLineage:!1,offset:{},size:{height:r.bottom-r.top,width:r.right-r.left},usemapImage:i?e[0]:null,windowOffset:{bottom:r.bottom,left:r.left,right:r.right,top:r.top}}};if(i){var p=this._$origin.attr("shape"),u=this._$origin.attr("coords");if(u&&(u=u.split(","),t.map(u,function(t,e){u[e]=parseInt(t)})),"default"!=p)switch(p){case"circle":var d=u[0],_=u[1],f=u[2],h=_-f,m=d-f;c.origin.size.height=2*f,c.origin.size.width=c.origin.size.height,c.origin.windowOffset.left+=m,c.origin.windowOffset.top+=h;break;case"rect":var g=u[0],b=u[1],w=u[2],v=u[3];c.origin.size.height=v-b,c.origin.size.width=w-g,c.origin.windowOffset.left+=g,c.origin.windowOffset.top+=b;break;case"poly":for(var y=0,k=0,x=0,$=0,C="even",T=0;T<u.length;T++){var O=u[T];"even"==C?(O>x&&(x=O,0===T&&(y=x)),O<y&&(y=O),C="odd"):(O>$&&($=O,1==T&&(k=$)),O<k&&(k=O),C="even")}c.origin.size.height=$-k,c.origin.size.width=x-y,c.origin.windowOffset.left+=y,c.origin.windowOffset.top+=k}}for(this._trigger({type:"geometry",edit:function(t){c.origin.size.height=t.height,c.origin.windowOffset.left=t.left,c.origin.windowOffset.top=t.top,c.origin.size.width=t.width},geometry:{height:c.origin.size.height,left:c.origin.windowOffset.left,top:c.origin.windowOffset.top,width:c.origin.size.width}}),c.origin.windowOffset.right=c.origin.windowOffset.left+c.origin.size.width,c.origin.windowOffset.bottom=c.origin.windowOffset.top+c.origin.size.height,c.origin.offset.left=c.origin.windowOffset.left+c.window.scroll.left,c.origin.offset.top=c.origin.windowOffset.top+c.window.scroll.top,c.origin.offset.bottom=c.origin.offset.top+c.origin.size.height,c.origin.offset.right=c.origin.offset.left+c.origin.size.width,c.available.document={bottom:{height:c.document.size.height-c.origin.offset.bottom,width:c.document.size.width},left:{height:c.document.size.height,width:c.origin.offset.left},right:{height:c.document.size.height,width:c.document.size.width-c.origin.offset.right},top:{height:c.origin.offset.top,width:c.document.size.width}},c.available.window={bottom:{height:Math.max(c.window.size.height-Math.max(c.origin.windowOffset.bottom,0),0),width:c.window.size.width},left:{height:c.window.size.height,width:Math.max(c.origin.windowOffset.left,0)},right:{height:c.window.size.height,width:Math.max(c.window.size.width-Math.max(c.origin.windowOffset.right,0),0)},top:{height:Math.max(c.origin.windowOffset.top,0),width:c.window.size.width}};"html"!=l[0].tagName.toLowerCase();){if("fixed"==l.css("position")){c.origin.fixedLineage=!0;break}l=l.parent()}return c},__optionsFormat:function(){return"number"==typeof this.__options.animationDuration&&(this.__options.animationDuration=[this.__options.animationDuration,this.__options.animationDuration]),"number"==typeof this.__options.delay&&(this.__options.delay=[this.__options.delay,this.__options.delay]),"number"==typeof this.__options.delayTouch&&(this.__options.delayTouch=[this.__options.delayTouch,this.__options.delayTouch]),"string"==typeof this.__options.theme&&(this.__options.theme=[this.__options.theme]),null===this.__options.parent?this.__options.parent=t(o.window.document.body):"string"==typeof this.__options.parent&&(this.__options.parent=t(this.__options.parent)),"hover"==this.__options.trigger?(this.__options.triggerOpen={mouseenter:!0,touchstart:!0},this.__options.triggerClose={mouseleave:!0,originClick:!0,touchleave:!0}):"click"==this.__options.trigger&&(this.__options.triggerOpen={click:!0,tap:!0},this.__options.triggerClose={click:!0,tap:!0}),this._trigger("options"),this},__prepareGC:function(){var e=this;return e.__options.selfDestruction?e.__garbageCollector=setInterval(function(){var i=(new Date).getTime();e.__touchEvents=t.grep(e.__touchEvents,function(t,e){return i-t.time>6e4}),a(e._$origin)||e.close(function(){e.destroy()})},2e4):clearInterval(e.__garbageCollector),e},__prepareOrigin:function(){var t=this;if(t._$origin.off("."+t.__namespace+"-triggerOpen"),o.hasTouchCapability&&t._$origin.on("touchstart."+t.__namespace+"-triggerOpen touchend."+t.__namespace+"-triggerOpen touchcancel."+t.__namespace+"-triggerOpen",function(e){t._touchRecordEvent(e)}),t.__options.triggerOpen.click||t.__options.triggerOpen.tap&&o.hasTouchCapability){var e="";t.__options.triggerOpen.click&&(e+="click."+t.__namespace+"-triggerOpen "),t.__options.triggerOpen.tap&&o.hasTouchCapability&&(e+="touchend."+t.__namespace+"-triggerOpen"),t._$origin.on(e,function(e){t._touchIsMeaningfulEvent(e)&&t._open(e)})}if(t.__options.triggerOpen.mouseenter||t.__options.triggerOpen.touchstart&&o.hasTouchCapability){e="";t.__options.triggerOpen.mouseenter&&(e+="mouseenter."+t.__namespace+"-triggerOpen "),t.__options.triggerOpen.touchstart&&o.hasTouchCapability&&(e+="touchstart."+t.__namespace+"-triggerOpen"),t._$origin.on(e,function(e){!t._touchIsTouchEvent(e)&&t._touchIsEmulatedEvent(e)||(t.__pointerIsOverOrigin=!0,t._openShortly(e))})}if(t.__options.triggerClose.mouseleave||t.__options.triggerClose.touchleave&&o.hasTouchCapability){e="";t.__options.triggerClose.mouseleave&&(e+="mouseleave."+t.__namespace+"-triggerOpen "),t.__options.triggerClose.touchleave&&o.hasTouchCapability&&(e+="touchend."+t.__namespace+"-triggerOpen touchcancel."+t.__namespace+"-triggerOpen"),t._$origin.on(e,function(e){t._touchIsMeaningfulEvent(e)&&(t.__pointerIsOverOrigin=!1)})}return t},__prepareTooltip:function(){var e=this,i=e.__options.interactive?"auto":"";return e._$tooltip.attr("id",e.__namespace).css({"pointer-events":i,zIndex:e.__options.zIndex}),t.each(e.__previousThemes,function(t,i){e._$tooltip.removeClass(i)}),t.each(e.__options.theme,function(t,i){e._$tooltip.addClass(i)}),e.__previousThemes=t.merge([],e.__options.theme),e},__scrollHandler:function(e){if(this.__options.triggerClose.scroll)this._close(e);else if(a(this._$origin)&&a(this._$tooltip)){var i=null;if(e.target===o.window.document)this.__Geometry.origin.fixedLineage||this.__options.repositionOnScroll&&this.reposition(e);else{i=this.__geometry();var n=!1;if("fixed"!=this._$origin.css("position")&&this.__$originParents.each(function(e,o){var r=t(o),s=r.css("overflow-x"),a=r.css("overflow-y");if("visible"!=s||"visible"!=a){var l=o.getBoundingClientRect();if("visible"!=s&&(i.origin.windowOffset.left<l.left||i.origin.windowOffset.right>l.right))return n=!0,!1;if("visible"!=a&&(i.origin.windowOffset.top<l.top||i.origin.windowOffset.bottom>l.bottom))return n=!0,!1}if("fixed"==r.css("position"))return!1}),n)this._$tooltip.css("visibility","hidden");else if(this._$tooltip.css("visibility","visible"),this.__options.repositionOnScroll)this.reposition(e);else{var r=i.origin.offset.left-this.__Geometry.origin.offset.left,s=i.origin.offset.top-this.__Geometry.origin.offset.top;this._$tooltip.css({left:this.__lastPosition.coord.left+r,top:this.__lastPosition.coord.top+s})}}this._trigger({type:"scroll",event:e,geo:i})}return this},__stateSet:function(t){return this.__state=t,this._trigger({type:"state",state:t}),this},__timeoutsClear:function(){return clearTimeout(this.__timeouts.open),this.__timeouts.open=null,t.each(this.__timeouts.close,function(t,e){clearTimeout(e)}),this.__timeouts.close=[],this},__trackerStart:function(){var t=this,e=t._$tooltip.find(".tooltipster-content");return t.__options.trackTooltip&&(t.__contentBcr=e[0].getBoundingClientRect()),t.__tracker=setInterval(function(){if(a(t._$origin)&&a(t._$tooltip)){if(t.__options.trackOrigin){var i=t.__geometry(),o=!1;s(i.origin.size,t.__Geometry.origin.size)&&(t.__Geometry.origin.fixedLineage?s(i.origin.windowOffset,t.__Geometry.origin.windowOffset)&&(o=!0):s(i.origin.offset,t.__Geometry.origin.offset)&&(o=!0)),o||(t.__options.triggerClose.mouseleave?t._close():t.reposition())}if(t.__options.trackTooltip){var n=e[0].getBoundingClientRect();n.height===t.__contentBcr.height&&n.width===t.__contentBcr.width||(t.reposition(),t.__contentBcr=n)}}else t._close()},t.__options.trackerInterval),t},_close:function(e,i,n){var r=this,s=!0;if(r._trigger({type:"close",event:e,stop:function(){s=!1}}),s||n){i&&r.__callbacks.close.push(i),r.__callbacks.open=[],r.__timeoutsClear();var a=function(){t.each(r.__callbacks.close,function(t,i){i.call(r,r,{event:e,origin:r._$origin[0]})}),r.__callbacks.close=[]};if("closed"!=r.__state){var l=!0,c=(new Date).getTime()+r.__options.animationDuration[1];if("disappearing"==r.__state&&c>r.__closingTime&&r.__options.animationDuration[1]>0&&(l=!1),l){r.__closingTime=c,"disappearing"!=r.__state&&r.__stateSet("disappearing");var p=function(){clearInterval(r.__tracker),r._trigger({type:"closing",event:e}),r._$tooltip.off("."+r.__namespace+"-triggerClose").removeClass("tooltipster-dying"),t(o.window).off("."+r.__namespace+"-triggerClose"),r.__$originParents.each(function(e,i){t(i).off("scroll."+r.__namespace+"-triggerClose")}),r.__$originParents=null,t(o.window.document.body).off("."+r.__namespace+"-triggerClose"),r._$origin.off("."+r.__namespace+"-triggerClose"),r._off("dismissable"),r.__stateSet("closed"),r._trigger({type:"after",event:e}),r.__options.functionAfter&&r.__options.functionAfter.call(r,r,{event:e,origin:r._$origin[0]}),a()};o.hasTransitions?(r._$tooltip.css({"-moz-animation-duration":r.__options.animationDuration[1]+"ms","-ms-animation-duration":r.__options.animationDuration[1]+"ms","-o-animation-duration":r.__options.animationDuration[1]+"ms","-webkit-animation-duration":r.__options.animationDuration[1]+"ms","animation-duration":r.__options.animationDuration[1]+"ms","transition-duration":r.__options.animationDuration[1]+"ms"}),r._$tooltip.clearQueue().removeClass("tooltipster-show").addClass("tooltipster-dying"),r.__options.animationDuration[1]>0&&r._$tooltip.delay(r.__options.animationDuration[1]),r._$tooltip.queue(p)):r._$tooltip.stop().fadeOut(r.__options.animationDuration[1],p)}}else a()}return r},_off:function(){return this.__$emitterPrivate.off.apply(this.__$emitterPrivate,Array.prototype.slice.apply(arguments)),this},_on:function(){return this.__$emitterPrivate.on.apply(this.__$emitterPrivate,Array.prototype.slice.apply(arguments)),this},_one:function(){return this.__$emitterPrivate.one.apply(this.__$emitterPrivate,Array.prototype.slice.apply(arguments)),this},_open:function(e,i){var n=this;if(!n.__destroying&&a(n._$origin)&&n.__enabled){var r=!0;if("closed"==n.__state&&(n._trigger({type:"before",event:e,stop:function(){r=!1}}),r&&n.__options.functionBefore&&(r=n.__options.functionBefore.call(n,n,{event:e,origin:n._$origin[0]}))),!1!==r&&null!==n.__Content){i&&n.__callbacks.open.push(i),n.__callbacks.close=[],n.__timeoutsClear();var s,l=function(){"stable"!=n.__state&&n.__stateSet("stable"),t.each(n.__callbacks.open,function(t,e){e.call(n,n,{origin:n._$origin[0],tooltip:n._$tooltip[0]})}),n.__callbacks.open=[]};if("closed"!==n.__state)s=0,"disappearing"===n.__state?(n.__stateSet("appearing"),o.hasTransitions?(n._$tooltip.clearQueue().removeClass("tooltipster-dying").addClass("tooltipster-show"),n.__options.animationDuration[0]>0&&n._$tooltip.delay(n.__options.animationDuration[0]),n._$tooltip.queue(l)):n._$tooltip.stop().fadeIn(l)):"stable"==n.__state&&l();else{if(n.__stateSet("appearing"),s=n.__options.animationDuration[0],n.__contentInsert(),n.reposition(e,!0),o.hasTransitions?(n._$tooltip.addClass("tooltipster-"+n.__options.animation).addClass("tooltipster-initial").css({"-moz-animation-duration":n.__options.animationDuration[0]+"ms","-ms-animation-duration":n.__options.animationDuration[0]+"ms","-o-animation-duration":n.__options.animationDuration[0]+"ms","-webkit-animation-duration":n.__options.animationDuration[0]+"ms","animation-duration":n.__options.animationDuration[0]+"ms","transition-duration":n.__options.animationDuration[0]+"ms"}),setTimeout(function(){"closed"!=n.__state&&(n._$tooltip.addClass("tooltipster-show").removeClass("tooltipster-initial"),n.__options.animationDuration[0]>0&&n._$tooltip.delay(n.__options.animationDuration[0]),n._$tooltip.queue(l))},0)):n._$tooltip.css("display","none").fadeIn(n.__options.animationDuration[0],l),n.__trackerStart(),t(o.window).on("resize."+n.__namespace+"-triggerClose",function(e){var i=t(document.activeElement);(i.is("input")||i.is("textarea"))&&t.contains(n._$tooltip[0],i[0])||n.reposition(e)}).on("scroll."+n.__namespace+"-triggerClose",function(t){n.__scrollHandler(t)}),n.__$originParents=n._$origin.parents(),n.__$originParents.each(function(e,i){t(i).on("scroll."+n.__namespace+"-triggerClose",function(t){n.__scrollHandler(t)})}),n.__options.triggerClose.mouseleave||n.__options.triggerClose.touchleave&&o.hasTouchCapability){n._on("dismissable",function(t){t.dismissable?t.delay?(d=setTimeout(function(){n._close(t.event)},t.delay),n.__timeouts.close.push(d)):n._close(t):clearTimeout(d)});var c=n._$origin,p="",u="",d=null;n.__options.interactive&&(c=c.add(n._$tooltip)),n.__options.triggerClose.mouseleave&&(p+="mouseenter."+n.__namespace+"-triggerClose ",u+="mouseleave."+n.__namespace+"-triggerClose "),n.__options.triggerClose.touchleave&&o.hasTouchCapability&&(p+="touchstart."+n.__namespace+"-triggerClose",u+="touchend."+n.__namespace+"-triggerClose touchcancel."+n.__namespace+"-triggerClose"),c.on(u,function(t){if(n._touchIsTouchEvent(t)||!n._touchIsEmulatedEvent(t)){var e="mouseleave"==t.type?n.__options.delay:n.__options.delayTouch;n._trigger({delay:e[1],dismissable:!0,event:t,type:"dismissable"})}}).on(p,function(t){!n._touchIsTouchEvent(t)&&n._touchIsEmulatedEvent(t)||n._trigger({dismissable:!1,event:t,type:"dismissable"})})}n.__options.triggerClose.originClick&&n._$origin.on("click."+n.__namespace+"-triggerClose",function(t){n._touchIsTouchEvent(t)||n._touchIsEmulatedEvent(t)||n._close(t)}),(n.__options.triggerClose.click||n.__options.triggerClose.tap&&o.hasTouchCapability)&&setTimeout(function(){if("closed"!=n.__state){var e="",i=t(o.window.document.body);n.__options.triggerClose.click&&(e+="click."+n.__namespace+"-triggerClose "),n.__options.triggerClose.tap&&o.hasTouchCapability&&(e+="touchend."+n.__namespace+"-triggerClose"),i.on(e,function(e){n._touchIsMeaningfulEvent(e)&&(n._touchRecordEvent(e),n.__options.interactive&&t.contains(n._$tooltip[0],e.target)||n._close(e))}),n.__options.triggerClose.tap&&o.hasTouchCapability&&i.on("touchstart."+n.__namespace+"-triggerClose",function(t){n._touchRecordEvent(t)})}},0),n._trigger("ready"),n.__options.functionReady&&n.__options.functionReady.call(n,n,{origin:n._$origin[0],tooltip:n._$tooltip[0]})}if(n.__options.timer>0){d=setTimeout(function(){n._close()},n.__options.timer+s);n.__timeouts.close.push(d)}}}return n},_openShortly:function(t){var e=this,i=!0;if("stable"!=e.__state&&"appearing"!=e.__state&&!e.__timeouts.open&&(e._trigger({type:"start",event:t,stop:function(){i=!1}}),i)){var o=0==t.type.indexOf("touch")?e.__options.delayTouch:e.__options.delay;o[0]?e.__timeouts.open=setTimeout(function(){e.__timeouts.open=null,e.__pointerIsOverOrigin&&e._touchIsMeaningfulEvent(t)?(e._trigger("startend"),e._open(t)):e._trigger("startcancel")},o[0]):(e._trigger("startend"),e._open(t))}return e},_optionsExtract:function(e,i){var o=this,n=t.extend(!0,{},i),r=o.__options[e];return r||(r={},t.each(i,function(t,e){var i=o.__options[t];void 0!==i&&(r[t]=i)})),t.each(n,function(e,i){void 0!==r[e]&&("object"!=typeof i||i instanceof Array||null==i||"object"!=typeof r[e]||r[e]instanceof Array||null==r[e]?n[e]=r[e]:t.extend(n[e],r[e]))}),n},_plug:function(e){var i=t.tooltipster._plugin(e);if(!i)throw new Error('The "'+e+'" plugin is not defined');return i.instance&&t.tooltipster.__bridge(i.instance,this,i.name),this},_touchIsEmulatedEvent:function(t){for(var e=!1,i=(new Date).getTime(),o=this.__touchEvents.length-1;o>=0;o--){var n=this.__touchEvents[o];if(!(i-n.time<500))break;n.target===t.target&&(e=!0)}return e},_touchIsMeaningfulEvent:function(t){return this._touchIsTouchEvent(t)&&!this._touchSwiped(t.target)||!this._touchIsTouchEvent(t)&&!this._touchIsEmulatedEvent(t)},_touchIsTouchEvent:function(t){return 0==t.type.indexOf("touch")},_touchRecordEvent:function(t){return this._touchIsTouchEvent(t)&&(t.time=(new Date).getTime(),this.__touchEvents.push(t)),this},_touchSwiped:function(t){for(var e=!1,i=this.__touchEvents.length-1;i>=0;i--){var o=this.__touchEvents[i];if("touchmove"==o.type){e=!0;break}if("touchstart"==o.type&&t===o.target)break}return e},_trigger:function(){var e=Array.prototype.slice.apply(arguments);return"string"==typeof e[0]&&(e[0]={type:e[0]}),e[0].instance=this,e[0].origin=this._$origin?this._$origin[0]:null,e[0].tooltip=this._$tooltip?this._$tooltip[0]:null,this.__$emitterPrivate.trigger.apply(this.__$emitterPrivate,e),t.tooltipster._trigger.apply(t.tooltipster,e),this.__$emitterPublic.trigger.apply(this.__$emitterPublic,e),this},_unplug:function(e){var i=this;if(i[e]){var o=t.tooltipster._plugin(e);o.instance&&t.each(o.instance,function(t,o){i[t]&&i[t].bridged===i[e]&&delete i[t]}),i[e].__destroy&&i[e].__destroy(),delete i[e]}return i},close:function(t){return this.__destroyed?this.__destroyError():this._close(null,t),this},content:function(t){var e=this;if(void 0===t)return e.__Content;if(e.__destroyed)e.__destroyError();else if(e.__contentSet(t),null!==e.__Content){if("closed"!==e.__state&&(e.__contentInsert(),e.reposition(),e.__options.updateAnimation))if(o.hasTransitions){var i=e.__options.updateAnimation;e._$tooltip.addClass("tooltipster-update-"+i),setTimeout(function(){"closed"!=e.__state&&e._$tooltip.removeClass("tooltipster-update-"+i)},1e3)}else e._$tooltip.fadeTo(200,.5,function(){"closed"!=e.__state&&e._$tooltip.fadeTo(200,1)})}else e._close();return e},destroy:function(){var e=this;if(e.__destroyed)e.__destroyError();else{"closed"!=e.__state?e.option("animationDuration",0)._close(null,null,!0):e.__timeoutsClear(),e._trigger("destroy"),e.__destroyed=!0,e._$origin.removeData(e.__namespace).off("."+e.__namespace+"-triggerOpen"),t(o.window.document.body).off("."+e.__namespace+"-triggerOpen");var i=e._$origin.data("tooltipster-ns");if(i)if(1===i.length){var n=null;"previous"==e.__options.restoration?n=e._$origin.data("tooltipster-initialTitle"):"current"==e.__options.restoration&&(n="string"==typeof e.__Content?e.__Content:t("<div></div>").append(e.__Content).html()),n&&e._$origin.attr("title",n),e._$origin.removeClass("tooltipstered"),e._$origin.removeData("tooltipster-ns").removeData("tooltipster-initialTitle")}else i=t.grep(i,function(t,i){return t!==e.__namespace}),e._$origin.data("tooltipster-ns",i);e._trigger("destroyed"),e._off(),e.off(),e.__Content=null,e.__$emitterPrivate=null,e.__$emitterPublic=null,e.__options.parent=null,e._$origin=null,e._$tooltip=null,t.tooltipster.__instancesLatestArr=t.grep(t.tooltipster.__instancesLatestArr,function(t,i){return e!==t}),clearInterval(e.__garbageCollector)}return e},disable:function(){return this.__destroyed?(this.__destroyError(),this):(this._close(),this.__enabled=!1,this)},elementOrigin:function(){if(!this.__destroyed)return this._$origin[0];this.__destroyError()},elementTooltip:function(){return this._$tooltip?this._$tooltip[0]:null},enable:function(){return this.__enabled=!0,this},hide:function(t){return this.close(t)},instance:function(){return this},off:function(){return this.__destroyed||this.__$emitterPublic.off.apply(this.__$emitterPublic,Array.prototype.slice.apply(arguments)),this},on:function(){return this.__destroyed?this.__destroyError():this.__$emitterPublic.on.apply(this.__$emitterPublic,Array.prototype.slice.apply(arguments)),this},one:function(){return this.__destroyed?this.__destroyError():this.__$emitterPublic.one.apply(this.__$emitterPublic,Array.prototype.slice.apply(arguments)),this},open:function(t){return this.__destroyed?this.__destroyError():this._open(null,t),this},option:function(e,i){return void 0===i?this.__options[e]:(this.__destroyed?this.__destroyError():(this.__options[e]=i,this.__optionsFormat(),t.inArray(e,["trigger","triggerClose","triggerOpen"])>=0&&this.__prepareOrigin(),"selfDestruction"===e&&this.__prepareGC()),this)},reposition:function(t,e){return this.__destroyed?this.__destroyError():"closed"!=this.__state&&a(this._$origin)&&(e||a(this._$tooltip))&&(e||this._$tooltip.detach(),this.__Geometry=this.__geometry(),this._trigger({type:"reposition",event:t,helper:{geo:this.__Geometry}})),this},show:function(t){return this.open(t)},status:function(){return{destroyed:this.__destroyed,enabled:this.__enabled,open:"closed"!==this.__state,state:this.__state}},triggerHandler:function(){return this.__destroyed?this.__destroyError():this.__$emitterPublic.triggerHandler.apply(this.__$emitterPublic,Array.prototype.slice.apply(arguments)),this}},t.fn.tooltipster=function(){var i=Array.prototype.slice.apply(arguments);if(0===this.length)return this;if("string"==typeof i[0]){var o="#*$~&";return this.each(function(){var e=t(this).data("tooltipster-ns"),n=e?t(this).data(e[0]):null;if(!n)throw new Error("You called Tooltipster's \""+i[0]+'" method on an uninitialized element');if("function"!=typeof n[i[0]])throw new Error('Unknown method "'+i[0]+'"');this.length>1&&"content"==i[0]&&(i[1]instanceof t||"object"==typeof i[1]&&null!=i[1]&&i[1].tagName)&&!n.__options.contentCloning&&n.__options.debug;var r=n[i[0]](i[1],i[2]);if(r!==n||"instance"===i[0])return o=r,!1}),"#*$~&"!==o?o:this}t.tooltipster.__instancesLatestArr=[];var n=i[0]&&void 0!==i[0].multiple,r=n&&i[0].multiple||!n&&e.multiple,s=i[0]&&void 0!==i[0].content,a=s&&i[0].content||!s&&e.content,l=i[0]&&void 0!==i[0].contentCloning,c=(l&&i[0].contentCloning,i[0]&&void 0!==i[0].debug);c&&i[0].debug;return this.length>1&&(a instanceof t||"object"==typeof a&&null!=a&&a.tagName),this.each(function(){var e=!1,o=t(this),n=o.data("tooltipster-ns"),s=null;n?r&&(e=!0):e=!0,e&&(s=new t.Tooltipster(this,i[0]),n||(n=[]),n.push(s.__namespace),o.data("tooltipster-ns",n),o.data(s.__namespace,s),s.__options.functionInit&&s.__options.functionInit.call(s,s,{origin:this}),s._trigger("init")),t.tooltipster.__instancesLatestArr.push(s)}),this},r.prototype={__init:function(e){this.__$tooltip=e,this.__$tooltip.css({left:0,overflow:"hidden",position:"absolute",top:0}).find(".tooltipster-content").css("overflow","auto"),this.$container=t('<div class="tooltipster-ruler"></div>').append(this.__$tooltip).appendTo(o.window.document.body)},__forceRedraw:function(){var t=this.__$tooltip.parent();this.__$tooltip.detach(),this.__$tooltip.appendTo(t)},constrain:function(t,e){return this.constraints={width:t,height:e},this.__$tooltip.css({display:"block",height:"",overflow:"auto",width:t}),this},destroy:function(){this.__$tooltip.detach().find(".tooltipster-content").css({display:"",overflow:""}),this.$container.remove()},free:function(){return this.constraints=null,this.__$tooltip.css({display:"",height:"",overflow:"visible",width:""}),this},measure:function(){this.__forceRedraw();var t=this.__$tooltip[0].getBoundingClientRect(),e={size:{height:t.height||t.bottom-t.top,width:t.width||t.right-t.left}};if(this.constraints){var i=this.__$tooltip.find(".tooltipster-content"),n=this.__$tooltip.outerHeight(),r=i[0].getBoundingClientRect(),s={height:n<=this.constraints.height,width:t.width<=this.constraints.width&&r.width>=i[0].scrollWidth-1};e.fits=s.height&&s.width}return o.IE&&o.IE<=11&&e.size.width!==o.window.document.documentElement.clientWidth&&(e.size.width=Math.ceil(e.size.width)+1),e}};var l=navigator.userAgent.toLowerCase();-1!=l.indexOf("msie")?o.IE=parseInt(l.split("msie")[1]):-1!==l.toLowerCase().indexOf("trident")&&-1!==l.indexOf(" rv:11")?o.IE=11:-1!=l.toLowerCase().indexOf("edge/")&&(o.IE=parseInt(l.toLowerCase().split("edge/")[1])),t.tooltipster._plugin({name:"tooltipster.sideTip",instance:{__defaults:function(){return{arrow:!0,distance:6,functionPosition:null,maxWidth:null,minIntersection:16,minWidth:0,position:null,side:"top",viewportAware:!0}},__init:function(t){var e=this;e.__instance=t,e.__namespace="tooltipster-sideTip-"+Math.round(1e6*Math.random()),e.__previousState="closed",e.__options,e.__optionsFormat(),e.__instance._on("state."+e.__namespace,function(t){"closed"==t.state?e.__close():"appearing"==t.state&&"closed"==e.__previousState&&e.__create(),e.__previousState=t.state}),e.__instance._on("options."+e.__namespace,function(){e.__optionsFormat()}),e.__instance._on("reposition."+e.__namespace,function(t){e.__reposition(t.event,t.helper)})},__close:function(){this.__instance.content()instanceof t&&this.__instance.content().detach(),this.__instance._$tooltip.remove(),this.__instance._$tooltip=null},__create:function(){var e=t('<div class="tooltipster-base tooltipster-sidetip"><div class="tooltipster-box"><div class="tooltipster-content"></div></div><div class="tooltipster-arrow"><div class="tooltipster-arrow-uncropped"><div class="tooltipster-arrow-border"></div><div class="tooltipster-arrow-background"></div></div></div></div>');this.__options.arrow||e.find(".tooltipster-box").css("margin",0).end().find(".tooltipster-arrow").hide(),this.__options.minWidth&&e.css("min-width",this.__options.minWidth+"px"),this.__options.maxWidth&&e.css("max-width",this.__options.maxWidth+"px"),this.__instance._$tooltip=e,this.__instance._trigger("created")},__destroy:function(){this.__instance._off("."+self.__namespace)},__optionsFormat:function(){if(this.__options=this.__instance._optionsExtract("tooltipster.sideTip",this.__defaults()),this.__options.position&&(this.__options.side=this.__options.position),"object"!=typeof this.__options.distance&&(this.__options.distance=[this.__options.distance]),this.__options.distance.length<4&&(void 0===this.__options.distance[1]&&(this.__options.distance[1]=this.__options.distance[0]),void 0===this.__options.distance[2]&&(this.__options.distance[2]=this.__options.distance[0]),void 0===this.__options.distance[3]&&(this.__options.distance[3]=this.__options.distance[1])),this.__options.distance={top:this.__options.distance[0],right:this.__options.distance[1],bottom:this.__options.distance[2],left:this.__options.distance[3]},"string"==typeof this.__options.side){this.__options.side=[this.__options.side,{top:"bottom",right:"left",bottom:"top",left:"right"}[this.__options.side]],"left"==this.__options.side[0]||"right"==this.__options.side[0]?this.__options.side.push("top","bottom"):this.__options.side.push("right","left")}6===t.tooltipster._env.IE&&!0!==this.__options.arrow&&(this.__options.arrow=!1)},__reposition:function(e,i){var o,n=this,r=n.__targetFind(i),s=[];n.__instance._$tooltip.detach();var a=n.__instance._$tooltip.clone(),l=t.tooltipster._getRuler(a),c=!1,p=n.__instance.option("animation");switch(p&&a.removeClass("tooltipster-"+p),t.each(["window","document"],function(o,p){var u=null;if(n.__instance._trigger({container:p,helper:i,satisfied:c,takeTest:function(t){u=t},results:s,type:"positionTest"}),1==u||0!=u&&0==c&&("window"!=p||n.__options.viewportAware))for(o=0;o<n.__options.side.length;o++){var d={horizontal:0,vertical:0},_=n.__options.side[o];"top"==_||"bottom"==_?d.vertical=n.__options.distance[_]:d.horizontal=n.__options.distance[_],n.__sideChange(a,_),t.each(["natural","constrained"],function(t,o){if(u=null,n.__instance._trigger({container:p,event:e,helper:i,mode:o,results:s,satisfied:c,side:_,takeTest:function(t){u=t},type:"positionTest"}),1==u||0!=u&&0==c){var a={container:p,distance:d,fits:null,mode:o,outerSize:null,side:_,size:null,target:r[_],whole:null},f=("natural"==o?l.free():l.constrain(i.geo.available[p][_].width-d.horizontal,i.geo.available[p][_].height-d.vertical)).measure();if(a.size=f.size,a.outerSize={height:f.size.height+d.vertical,width:f.size.width+d.horizontal},"natural"==o?i.geo.available[p][_].width>=a.outerSize.width&&i.geo.available[p][_].height>=a.outerSize.height?a.fits=!0:a.fits=!1:a.fits=f.fits,"window"==p&&(a.fits?a.whole="top"==_||"bottom"==_?i.geo.origin.windowOffset.right>=n.__options.minIntersection&&i.geo.window.size.width-i.geo.origin.windowOffset.left>=n.__options.minIntersection:i.geo.origin.windowOffset.bottom>=n.__options.minIntersection&&i.geo.window.size.height-i.geo.origin.windowOffset.top>=n.__options.minIntersection:a.whole=!1),s.push(a),a.whole)c=!0;else if("natural"==a.mode&&(a.fits||a.size.width<=i.geo.available[p][_].width))return!1}})}}),n.__instance._trigger({edit:function(t){s=t},event:e,helper:i,results:s,type:"positionTested"}),s.sort(function(t,e){return t.whole&&!e.whole?-1:!t.whole&&e.whole?1:t.whole&&e.whole?(i=n.__options.side.indexOf(t.side))<(o=n.__options.side.indexOf(e.side))?-1:i>o?1:"natural"==t.mode?-1:1:t.fits&&!e.fits?-1:!t.fits&&e.fits?1:t.fits&&e.fits?(i=n.__options.side.indexOf(t.side))<(o=n.__options.side.indexOf(e.side))?-1:i>o?1:"natural"==t.mode?-1:1:"document"==t.container&&"bottom"==t.side&&"natural"==t.mode?-1:1;var i,o}),(o=s[0]).coord={},o.side){case"left":case"right":o.coord.top=Math.floor(o.target-o.size.height/2);break;case"bottom":case"top":o.coord.left=Math.floor(o.target-o.size.width/2)}switch(o.side){case"left":o.coord.left=i.geo.origin.windowOffset.left-o.outerSize.width;break;case"right":o.coord.left=i.geo.origin.windowOffset.right+o.distance.horizontal;break;case"top":o.coord.top=i.geo.origin.windowOffset.top-o.outerSize.height;break;case"bottom":o.coord.top=i.geo.origin.windowOffset.bottom+o.distance.vertical}"window"==o.container?"top"==o.side||"bottom"==o.side?o.coord.left<0?i.geo.origin.windowOffset.right-this.__options.minIntersection>=0?o.coord.left=0:o.coord.left=i.geo.origin.windowOffset.right-this.__options.minIntersection-1:o.coord.left>i.geo.window.size.width-o.size.width&&(i.geo.origin.windowOffset.left+this.__options.minIntersection<=i.geo.window.size.width?o.coord.left=i.geo.window.size.width-o.size.width:o.coord.left=i.geo.origin.windowOffset.left+this.__options.minIntersection+1-o.size.width):o.coord.top<0?i.geo.origin.windowOffset.bottom-this.__options.minIntersection>=0?o.coord.top=0:o.coord.top=i.geo.origin.windowOffset.bottom-this.__options.minIntersection-1:o.coord.top>i.geo.window.size.height-o.size.height&&(i.geo.origin.windowOffset.top+this.__options.minIntersection<=i.geo.window.size.height?o.coord.top=i.geo.window.size.height-o.size.height:o.coord.top=i.geo.origin.windowOffset.top+this.__options.minIntersection+1-o.size.height):(o.coord.left>i.geo.window.size.width-o.size.width&&(o.coord.left=i.geo.window.size.width-o.size.width),o.coord.left<0&&(o.coord.left=0)),n.__sideChange(a,o.side),i.tooltipClone=a[0],i.tooltipParent=n.__instance.option("parent").parent[0],i.mode=o.mode,i.whole=o.whole,i.origin=n.__instance._$origin[0],i.tooltip=n.__instance._$tooltip[0],delete o.container,delete o.fits,delete o.mode,delete o.outerSize,delete o.whole,o.distance=o.distance.horizontal||o.distance.vertical;var u,d,_,f=t.extend(!0,{},o);if(n.__instance._trigger({edit:function(t){o=t},event:e,helper:i,position:f,type:"position"}),n.__options.functionPosition){var h=n.__options.functionPosition.call(n,n.__instance,i,f);h&&(o=h)}l.destroy(),"top"==o.side||"bottom"==o.side?(u={prop:"left",val:o.target-o.coord.left},d=o.size.width-this.__options.minIntersection):(u={prop:"top",val:o.target-o.coord.top},d=o.size.height-this.__options.minIntersection),u.val<this.__options.minIntersection?u.val=this.__options.minIntersection:u.val>d&&(u.val=d),_=i.geo.origin.fixedLineage?i.geo.origin.windowOffset:{left:i.geo.origin.windowOffset.left+i.geo.window.scroll.left,top:i.geo.origin.windowOffset.top+i.geo.window.scroll.top},o.coord={left:_.left+(o.coord.left-i.geo.origin.windowOffset.left),top:_.top+(o.coord.top-i.geo.origin.windowOffset.top)},n.__sideChange(n.__instance._$tooltip,o.side),i.geo.origin.fixedLineage?n.__instance._$tooltip.css("position","fixed"):n.__instance._$tooltip.css("position",""),n.__instance._$tooltip.css({left:o.coord.left,top:o.coord.top,height:o.size.height,width:o.size.width}).find(".tooltipster-arrow").css({left:"",top:""}).css(u.prop,u.val),n.__instance._$tooltip.appendTo(n.__instance.option("parent")),n.__instance._trigger({type:"repositioned",event:e,position:o})},__sideChange:function(t,e){t.removeClass("tooltipster-bottom").removeClass("tooltipster-left").removeClass("tooltipster-right").removeClass("tooltipster-top").addClass("tooltipster-"+e)},__targetFind:function(t){var e={},i=this.__instance._$origin[0].getClientRects();i.length>1&&(1==this.__instance._$origin.css("opacity")&&(this.__instance._$origin.css("opacity",.99),i=this.__instance._$origin[0].getClientRects(),this.__instance._$origin.css("opacity",1)));if(i.length<2)e.top=Math.floor(t.geo.origin.windowOffset.left+t.geo.origin.size.width/2),e.bottom=e.top,e.left=Math.floor(t.geo.origin.windowOffset.top+t.geo.origin.size.height/2),e.right=e.left;else{var o=i[0];e.top=Math.floor(o.left+(o.right-o.left)/2),o=i.length>2?i[Math.ceil(i.length/2)-1]:i[0],e.right=Math.floor(o.top+(o.bottom-o.top)/2),o=i[i.length-1],e.bottom=Math.floor(o.left+(o.right-o.left)/2),o=i.length>2?i[Math.ceil((i.length+1)/2)-1]:i[i.length-1],e.left=Math.floor(o.top+(o.bottom-o.top)/2)}return e}}})}),jQuery(document).ready(function($){var fchunker_upload={fchunker:function(t){$.extend(t),$.upId&&$.upUrl&&($.domHtml=$("#"+$.upId).html(),$.upInputId=$.upId+"_input")},fchunker_limitFileSize:function(t,e){for(var i=["KB","MB","GB"],o=e.toUpperCase(),n=0,r=0;r<i.length;r++){var s=o.indexOf(i[r]);if(s>-1){n=parseInt(o.substr(0,s))*Math.pow(1024,r+1);break}}return!(t.size>n)},upErrorMsg:function(t){$.upError=t},upStop:function(t){$.upError=t},upStatus:function(){return!$.upError||("function"==typeof $.upStop&&$.upStop($.upError),!1)},fchunker_getPercent:function(t,e){if(t=parseFloat(t),e=parseFloat(e),isNaN(t)||isNaN(e))return"-";return e<=0?0:Math.round(t/e*1e4)/100},fchunker_upload:function(t,e){$.upError="",$.tempFile=$("#"+$.upInputId)[0].files[0],"file"==t&&($.tempFile=e);var i=$.tempFile;if(!i)return!1;"function"==typeof $.upStart&&$.upStart();var o=i.name,n=o.lastIndexOf("."),r=o.length,s=o.substring(n+1,r);if($.upType&&(uptype=$.upType.split(","),-1==$.inArray(s,uptype)&&($.upError="Type error: Error-"+s)),$.upMaxSize&&($.fchunker_limitFileSize(i,$.upMaxSize+"MB")||($.upError="Error")),0==$.upStatus())return!1;$.taskStart=+new Date,setTimeout("jQuery.fchunker_upload_core()","100")},fchunker_upload_core:function(){var file=$.tempFile;if(!file)return!1;$.upShardSize||($.upShardSize=2);for(var filename=file.name,size=file.size,index1=filename.lastIndexOf("."),index2=filename.length,suffix=filename.substring(index1+1,index2),shardSize=1024*$.upShardSize*1024,succeed=0,shardCount=Math.ceil(size/shardSize),re=[],start,end=0,i=0;i<shardCount;++i)re[i]=[],start=i*shardSize,end=Math.min(size,start+shardSize),re[i].file_data=file.slice(start,end),re[i].file_name=filename,re[i].file_size=size;const URL=$.upUrl;var i2=0,i3=1,fcs=Array(),xhr=new XMLHttpRequest;function ajaxStack(stack){if(0!=$.upStatus()){var form=new FormData;stack[i2]&&(fcs=stack[i2],form.append("file_data",fcs.file_data),form.append("file_name",fcs.file_name),form.append("file_size",fcs.file_size),form.append("file_total",shardCount),form.append("file_index",i3),form.append("taskStart",$.taskStart),form.append("action","backup_migration"),form.append("token","bmi"),form.append("f","upload-backup"),xhr.open("POST",URL,!0),xhr.setRequestHeader("X-Requested-With","XMLHttpRequest"),xhr.setRequestHeader("HTTP_X_REQUESTED_WITH","XMLHttpRequest"),xhr.onload=function(){ajaxStack(stack)},xhr.onreadystatechange=function(){if(0!=$.upStatus()&&4==xhr.readyState&&200==xhr.status){var data=xhr.responseText?eval("("+xhr.responseText+")"):"";++succeed;var cent=$.fchunker_getPercent(succeed,shardCount);"function"==typeof $.upEvent&&$.upEvent(cent),100==cent?setTimeout(function(){"function"==typeof $.upCallBack&&$.upCallBack(data)},500):"function"==typeof $.upCallBack&&$.upCallBack(data)}},xhr.send(form),i2++,i3++,form.delete("file_data"),form.delete("file_name"),form.delete("file_size"),form.delete("file_total"),form.delete("taskStart"),form.delete("file_index"),form.delete("action"),form.delete("token"),form.delete("f"))}}ajaxStack(re),re=null,file=null}};$.extend(fchunker_upload)}),jQuery(window).on("load",function(){setTimeout(function(){jQuery("#bmi").css({opacity:0}),jQuery("#bmi-preload").css({opacity:1}),jQuery("#bmi-preload").animate({opacity:0},150,function(){jQuery("#bmi-preload").remove(),jQuery("#bmi").css({display:"block"}),jQuery.bmi.dropdowns.init(),setTimeout(function(){jQuery("#bmi").animate({opacity:1},350)},100)})},50)}),jQuery(document).ready(function(t){let e=!1;t.extend({bmi:{clipboard:function(e){try{const i=document.createElement("textarea");return i.value=e,i.setAttribute("readonly",""),i.style.position="absolute",i.style.left="-9999px",document.body.appendChild(i),i.select(),document.execCommand("copy"),document.body.removeChild(i),t.bmi.alert("success",t("#bmi-success-copy").text(),3e3),!0}catch(e){return console.log(e),t.bmi.alert("warning",t("#bmi-failed-copy").text(),3e3),!1}},alert:function(e="default",i="---",o=7e3){t(".bmi-notification-box").length<=0&&t("body").find("#bmi").prepend(t('<div class="bmi-notification-box"></div>')),e="default"==e?"":"success"==e?" is-success":"warning"==e?" is-warning":"error"==e?" is-danger":" is-info";let n=Math.floor(Math.random()*Math.floor(64e3)),r=`<div style="display: none;" id="ntf-${n}" class="bmi-notification${e}">\n <button class="bmi-times-button" onclick="jQuery.bmi.hideAlert(this)">×</button>\n <div class="bmi-cf">\n <div class="bmi-left bmi-alert-icon"><div class="bmi-icon-bg"></div></div>\n <div class="bmi-left bmi-alert-msg-title">\n <div class="bmi-title${e}">Backup Migration</div>\n <div>${i}</div>\n </div>\n </div>\n </div>`;t(".bmi-notification-box").prepend(r);let s=t(`#ntf-${n}`);s.css({opacity:0,display:"block"});let a=s.outerWidth();s.outerHeight();s.css({right:"-35vw","font-size":"0px",width:0,padding:0,opacity:"0"}),s.animate({right:"15px",width:a,padding:"1rem 2rem 1rem 1.5rem",opacity:"1"},{duration:200,queue:!1}),s.animate({"font-size":"16px"},{duration:300,queue:!1}),setTimeout(()=>{t(`#ntf-${n}`).css({width:""})},250),setTimeout(()=>{s.animate({"font-size":"0px"},{duration:200,queue:!1}),s.animate({right:"-35vw",height:0,width:0,margin:0,padding:0,opacity:"0"},300,function(){s.remove()})},o)},_msg:function(e){"msg"==e.status&&(void 0===e.level&&(e.level="info"),t.bmi.alert(e.level,e.why,3e3),console.log("Backup-migration: ","["+e.level.toUpperCase()+"]",e.why))},hideAlert:function(e){let i=t(e).parents(".bmi-notification");i.animate({"font-size":"0px"},{duration:200,queue:!1}),i.animate({right:"-35vw",height:0,width:0,margin:0,padding:0,opacity:"0"},300,function(){i.remove()})},modal:function(e=!1){let i=!1;return 0!=e&&(i=document.getElementById(e)),{clearModal:function(){i.querySelectorAll(".customselect").forEach(function(t){t.classList.remove("active")}),i.querySelectorAll('input[type="text"]').forEach(function(t){t.value="",t.setAttribute("value","")})},open:function(e=function(){}){i.classList.add("before-open"),setTimeout(function(){i.classList.add("open"),t("html")[0].style.overflowY="hidden",setTimeout(e,410)},10)},close:function(e=function(){}){i.offsetWidth>0&&i.offsetHeight>0?(i.classList.add("before-close"),setTimeout(function(){i.classList.add("closed"),setTimeout(function(){i.classList.remove("before-open"),i.classList.remove("open"),i.classList.remove("before-close"),i.classList.remove("closed"),t.bmi.modal(i.id).clearModal(),e()},410)},10)):(i.classList.remove("before-open"),i.classList.remove("open"),i.classList.remove("before-close"),i.classList.remove("closed"),e()),t("html")[0].style.overflowY="auto"},closeAll:function(){document.querySelectorAll(".modal").forEach(function(e){t.bmi.modal(e.id).close()}),t("html")[0].style.overflowY="auto"}}},json:function(e){return new Promise(function(i,o){try{return i(JSON.parse(e))}catch(n){if("string"!=typeof e)return o(!1);{let n=t.bmi.reverse(e).indexOf("}");n=0==n?e.length:-n,e=e.slice(e.indexOf("{"),n);try{return i(JSON.parse(e))}catch(t){return o(!1)}}}})},reverse:function(e){return"string"==typeof e?""===e?"":t.bmi.reverse(e.substr(1))+e.charAt(0):e},ajax:function(e,i={}){return new Promise(function(o,n){function r(t,i){i||(i=t),console.log("------- BACKUP MIGRATION ERROR START -------"),!1===t?(console.log("Call: ",e),console.log("Status: ",i.status),console.log("Error: ",i.responseText)):console.log(i),console.log("-------- BACKUP MIGRATION ERROR END --------\n\n"),n(t,i.responseText)}i.action="backup_migration",i.token="bmi",i.f=e,t.post(ajaxurl,i).done(e=>{t.bmi.json(e).then(function(t){o(t)}).catch(function(t){r("json")})}).fail(t=>{r(!1,t)})})},tooltips:{init:function(){let e={delay:200,debug:!1,delayTouch:[100,200],interactive:!1,distance:0,side:"top",contentAsHTML:!1,maxWidth:460,triggerOpen:{mouseenter:!0,touchstart:!0},triggerClose:{mouseleave:!0,click:!0,tap:!0},theme:["bmi-tooltip","bmi-tt-default","bmi-tt-default-customized"],repositionOnScroll:!0,functionReady:function(){setTimeout(()=>{let e=t.tooltipster.instances();for(instance in e)e[instance].reposition()},10)}},i=t(".tooltip"),o=t(".tooltip-html"),n=t(".premium-wrapper"),r=JSON.parse(JSON.stringify(e));r.contentAsHTML=!0,r.interactive=!0;for(let o=0;o<i.length;++o){let n=i[o],r=n.getAttribute("data-top"),s=n.getAttribute("side"),a=JSON.parse(JSON.stringify(e));a.content=n.getAttribute("tooltip"),r&&(a.distance=parseInt(r)),s&&s.trim().length>0&&(a.side=s),t(n).tooltipster(a)}for(let e=0;e<o.length;++e){let i=o[e],n=i.getAttribute("side"),s=JSON.parse(JSON.stringify(r));s.content=i.getAttribute("tooltip"),n&&n.trim().length>0&&(s.side=n),t(i).tooltipster(s)}for(let i=0;i<n.length;++i){let o=n[i],r=JSON.parse(JSON.stringify(e));r.contentAsHTML=!0,r.interactive=!0,r.maxWidth=500,o.getAttribute("tooltip")?r.content=o.getAttribute("tooltip"):r.content=t("#premium-tooltip")[0].innerHTML,o.getAttribute("side")&&(r.side=o.getAttribute("side")),t(o).tooltipster(r)}},hideAll:function(e=!1){function i(){let e=t.tooltipster.instances();for(instance in e)e[instance].close()}e?i():setTimeout(i,10)}},collapsers:{toggle:function(i){if(!0===e)return;e=!0;let o=i.getAttribute("group");i.classList.contains("active")?t.bmi.collapsers.close(i):t.bmi.collapsers.open(i,o)},open:function(i,o){t.bmi.collapsers.closeGroup(o),t(i).addClass("active"),t(i).find(".content").show(300),setTimeout(function(){e=!1},300)},close:function(i){t(i).removeClass("active"),t(i).find(".content").hide(300),setTimeout(function(){e=!1},300)},closeGroup:function(i){t('.collapser[group="'+i+'"]').removeClass("active"),t('.collapser[group="'+i+'"]').find(".content").hide(300),setTimeout(function(){e=!1},300)},closeAll:function(){t(".collapser").removeClass("active"),t(".collapser").find(".content").hide(300),setTimeout(function(){e=!1},300)}},isUrlValid:function(t){return!!new RegExp("^(?:(?:(?:https?|ftp):)?\\/\\/)(?:\\S+(?::\\S*)?@)?(?:(?!(?:10|127)(?:\\.\\d{1,3}){3})(?!(?:169\\.254|192\\.168)(?:\\.\\d{1,3}){2})(?!172\\.(?:1[6-9]|2\\d|3[0-1])(?:\\.\\d{1,3}){2})(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[1-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))|(?:(?:[a-z0-9\\u00a1-\\uffff][a-z0-9\\u00a1-\\uffff_-]{0,62})?[a-z0-9\\u00a1-\\uffff]\\.)+(?:[a-z\\u00a1-\\uffff]{2,}\\.?))(?::\\d{2,5})?(?:[/?#]\\S*)?$","i").test(t)},bytesToHuman:function(t,e,i,o,n){return(e=Math,i=e.log,o=1024,n=i(t)/i(o)|0,t/e.pow(o,n)).toFixed(2)+" "+(n?"KMGTPEZY"[--n]+"B":"Bytes")},getCurrentBackups:function(e=function(){}){t("#reloading-bm-list").length>0&&"none"==t("#reloading-bm-list")[0].style.display&&(t("#reloading-bm-list").show(),t.bmi.ajax("get-current-backups",{}).then(function(i){t("#reloading-bm-list").hide(),e(i)}).catch(function(t){console.log(t)}))},fillWithNewBackups:function(e,i=function(){}){backups={},t("#bmi_restore_tbody").html("");let o=Object.keys(e).sort(function(t,i){return+new Date(e[t][1].replace(/\-/g,"/"))-+new Date(e[i][1].replace(/\-/g,"/"))}),n=0;for(;n<o.length;++n){let i=o[n],r="locked"===e[i][5];i=(i=i.replace(/ /g,"")).trim();let s="bmi_br_backup_"+n,a=t(".br_tr_template").clone();a.removeClass("br_tr_template"),a[0].style.display="none",a.find(".br_label").attr("for",s),a.find(".br_checkbox").attr("id",s),a.find(".bc-download-btn").attr("href",t("#BMI_BLOG_URL").text().trim()+"/?backup-migration=BMI_BACKUP&backup-id="+i),a.find(".bc-logs-btn").attr("href",t("#BMI_BLOG_URL").text().trim()+"/?backup-migration=BMI_BACKUP_LOGS&backup-id="+i),a.find(".br_date").text(e[i][1]),a.find(".br_name").text(i),a.find(".br_size").text(t.bmi.bytesToHuman(e[i][4])+" ("+e[i][2]+")"),r?a.find(".bc-unlocked-btn").hide():a.find(".bc-locked-btn").hide(),a.prependTo("#bmi_restore_tbody"),e[i].push(i),backups[s]=e[i]}if(0==n){let e=t("#bmi_restore_tbody").data("empty");t("#bmi_restore_tbody").html('<tr><td class="center text-muted" colspan="100%">'+e+"</td></tr>")}t.bmi.tooltips.init(),t.bmi.showMoreBackups(),i()},showMoreBackups:function(e){backups={};let i=t("#bmi_restore_tbody").find("tr:hidden");for(let e=0;e<i.length&&e<10;++e)setTimeout(function(){t(i[e]).show(300)},50*e);i.length-10<=0?t("#load-more-backups-wrp").hide(300):t("#load-more-backups-wrp").show(300)},reloadBackups:function(e=function(){}){t.bmi.getCurrentBackups(function(i){t.bmi.fillWithNewBackups(i.backups,function(){e(),t("#backups-select-all").prop("checked",!1),t(".del-all-btn-wrp").hide(300)})})},hideAllLists:function(){let e=t(".dropdown-open");if(!(e.length<=0))for(let i=0;i<e.length;++i){let o=t(e[i]);o.hasClass("ignored-open")?o.removeClass("ignored-open"):(o.hide(300),o.removeClass("dropdown-open"),t(o[0].closest(".bmi-dropdown")).removeClass("active"))}},setOption:function(e,i=null,o=!1){let n=e.find(".dropdown-options");e.attr("data-optioner")&&(n=t(".optioner-"+e.attr("data-optioner"))),n.find(".active-option").removeClass("active-option"),!1!==o&&(i=n.find('.dropdown-option[data-value="'+o+'"]')),t(i).hasClass("active-option")||(e.find(".dropdown-title").text(i.text()),e.attr("data-selected",i.data("value")),i.addClass("active-option"),!1===o&&e.change(),t.bmi.hideAllLists())},prepareFile:function(e,i){let o=document.createElement("a");o.setAttribute("href","data:text/plain;charset=utf-8,"+encodeURIComponent(i)),o.setAttribute("download",e),o.style.display="none",document.body.appendChild(o),o.click(),document.body.removeChild(o),t.bmi.alert("success",t("#bmi-download-should-start").text(),3e3)}}})}),jQuery(document).ready(function(t){t(".collapser .header").on("click",function(e){e.preventDefault();let i=t(this).parent(".collapser")[0];t.bmi.collapsers.toggle(i)}),t(".bmi_will_collapse").on("change",function(e){e.preventDefault();let i=!1;"radio"==this.getAttribute("type")&&"false"==this.getAttribute("value")&&(i=!0),$child=t(this).data("if-checked"),!0!==this.checked||i?t("#"+$child).hide(300):t("#"+$child).show(300)}),t(".collapser-openner").on("click",function(e){e.preventDefault();let i="configuration",o=t(this).data("el");t(this).data("group")&&(i=t(this).data("group")),t.bmi.collapsers.open(o,i),setTimeout(function(){t([document.documentElement,document.body]).animate({scrollTop:t(o).offset().top-50+"px"},300)},300)}),function(){let e=t(".bmi_will_collapse");for(let i=0;i<e.length;++i){let o=!1;$trigger=e[i],$child=t($trigger).data("if-checked"),"radio"==$trigger.getAttribute("type")&&"false"==$trigger.getAttribute("value")&&(o=!0),!0===$trigger.checked?t("#"+$child).show():t("#"+$child).hide()}}()}),jQuery(document).ready(function(t){var e=!0,i=!1;t.bmi.crons=function(){function o(){!function(e,i){t.bmi.ajax("calculate-cron",e).then(function(e){"success"==e.status?i(e):(i(!1),t.bmi._msg(e))}).catch(function(t){i(!1),console.log(t)})}({type:t('[data-id="cron-period"]').attr("data-selected"),day:t('[data-id="cron-day"]').attr("data-selected"),week:t('[data-id="cron-week"]').attr("data-selected"),hour:t('[data-id="cron-hour"]').attr("data-selected"),minute:t('[data-id="cron-minute"]').attr("data-selected"),keep:t('[data-id="cron-keep-backups"]').attr("data-selected"),enabled:!0==!t("#cron-btn-toggle")[0].checked},function(i){"success"===i.status&&!1!==i?(t(".cron-time-server").tooltipster("option","interactive",!1),t(".cron-time-server").tooltipster("option","contentAsHTML",!0),!0===t("#cron-btn-toggle")[0].checked&&(i.data="---"),t(".cron-time-server").tooltipster("content","<b>"+t("#bmi-next-cron").text()+"</b>"+i.data+"<br><b>"+t("#bmi-current-time").text()+"</b>"+i.currdata),e?e=!1:t.bmi.alert("success",t("#bmi-cron-updated").text(),1500)):e?e=!1:t.bmi.alert("error",t("#bmi-cron-updated-fail").text(),2500)})}function n(e){"month"==e?(t(".cron-the").show(),t('[data-id="cron-day"]').show(),t('[data-id="cron-week"]').hide(),t("#cron-on-word").show()):"week"==e?(t(".cron-the").hide(),t('[data-id="cron-day"]').hide(),t('[data-id="cron-week"]').show(),t("#cron-on-word").show()):(t(".cron-the").hide(),t('[data-id="cron-day"]').hide(),t('[data-id="cron-week"]').hide(),t("#cron-on-word").hide())}!0!==i&&(i=!0,t("#bmi").on("change",'[data-id="cron-period"]',function(t){o(),n(t.target.getAttribute("data-selected"))}),t("#bmi").on("change",'[data-id="cron-day"]',function(t){t.target.getAttribute("data-selected");o()}),t("#bmi").on("change",'[data-id="cron-week"]',function(t){t.target.getAttribute("data-selected");o()}),t("#bmi").on("change",'[data-id="cron-hour"]',function(t){t.target.getAttribute("data-selected");o()}),t("#bmi").on("change",'[data-id="cron-minute"]',function(t){t.target.getAttribute("data-selected");o()}),t("#bmi").on("change",'[data-id="cron-keep-backups"]',function(t){t.target.getAttribute("data-selected");o()}),t("#i-backup-cron").on("click",function(){t(".cron-backups").find(".turned-off").is(":visible")&&(t("#cron-btn-toggle").prop("checked",!1),t(".cron-backups").removeClass("disabled"),o(),t(".cron-backups").find(".turned-on").css({opacity:0}),t(".cron-backups").find(".turned-off").css({opacity:0}),t(".cron-backups").find(".turned-on").show(),t(".cron-backups").find(".turned-on").css({opacity:1}),setTimeout(function(){t(".cron-backups").find(".turned-off").hide()},300))}),t("#cron-btn-toggle").on("change",function(){this.checked?t(".cron-backups").addClass("disabled"):t(".cron-backups").removeClass("disabled"),o()}),n(t('[data-id="cron-period"]')[0].getAttribute("data-selected")),o())}}),jQuery(document).ready(function(t){t.bmi.dropdowns={init:function(){let e=t("#bmi");function i(e="null",i="---"){let o=t(".option-template").clone();return o.removeClass("option-template"),o.attr("data-value",e),o.text(i),o}function o(o){if("none"!=o.style.display){o.style.display="none";let n=t(o),r=n.find("option"),s=function(e="---"){let i=t(".dropdown-template").clone();return i.removeClass("dropdown-template"),i.find(".dropdown-title").text(e),i}(function(t){let e="";for(let i=0;i<t.length;++i){let o=t[i].innerText;e.length<o.length&&(e=o)}return e}(r));s=function(e,o){let n=t(e).find(".dropdown-options");t(e).attr("data-optioner")&&(n=t(".optioner-"+t(e).attr("data-optioner")));for(let t=0;t<o.length;++t){let e=o[t];n.append(i(e.value,e.innerText))}return e}(s,r);let a=r[0].value,l=o.getAttribute("data-parent"),c=o.getAttribute("data-classes"),p="true"===o.getAttribute("data-hide");if(n.data("def")&&(a=n.data("def")),t(s).attr("data-id",o.id),t(s).attr("class",((null!=c?c:"")+" bmi-dropdown").trim()),t(s).insertBefore(n),null!==l){let e=parseInt(864197532*Math.random()+123456789);t(s).attr("data-optioner",e),t(s).find(".dropdown-options").attr("data-oparent",e),t(s).find(".dropdown-options").addClass("optioner-"+e),t(s).find(".dropdown-options").appendTo(l),t(l).css({position:"relative"})}let u=t(s).clone();if(!u)return;u[0].style.visibility="hidden",e.append(u);let d=u.width();u.remove(),t.bmi.setOption(t(s),null,a),t(s).find(".dropdown-title")[0].style.minWidth=d+10+"px",p&&t(s).hide()}}!function(){let t=e.find("select");for(let e=0;e<t.length;++e)o(t[e])}(),t.bmi.crons(),e.on("click",function(e){t(e.target).hasClass("bmi-dropdown")||e.target.closest(".bmi-dropdown")||t.bmi.hideAllLists()}),e.on("click",".dropdown-title",function(e){$dropdown=t(e.target.closest(".bmi-dropdown")),function(e){let i=e.find(".dropdown-options");if(e.attr("data-optioner")){(i=t(".optioner-"+e.attr("data-optioner"))).css({position:"absolute"});let o=e[0].offsetWidth,n=e[0].offsetLeft+240,r=e[0].offsetTop+e[0].offsetHeight+5;i.css({maxWidth:o+"px",minWidth:o+"px",top:r+"px",left:n+"px"})}i.hasClass("dropdown-open")?(e.removeClass("active"),i.removeClass("dropdown-open"),i.hide(300)):(e.addClass("active"),i.addClass("dropdown-open"),i.addClass("ignored-open"),i.show(300))}($dropdown),t.bmi.hideAllLists()}),e.on("click",".dropdown-option",function(e){t(e.target.closest(".dropdown-options")).attr("data-oparent")?($dropdown=t('.bmi-dropdown[data-optioner="'+t(e.target.closest(".dropdown-options")).attr("data-oparent")+'"]'),$option=t(e.target),t.bmi.setOption($dropdown,$option)):($dropdown=t(e.target.closest(".bmi-dropdown")),$option=t(e.target),t.bmi.setOption($dropdown,$option))})}}}),jQuery(document).ready(function(t){var e,i,o=!1,n=!1,r=0;let s=0,a=0,l=null,c=null,p=null,u=!1,d=!1,_=!1;function f(e){return $cb=t("#"+e).is(":checked"),!0===$cb?"true":"false"}function h(){return size=0,t("#files-group-plugins").is(":checked")&&(size+=parseInt(t('label[for="files-group-plugins"]').find(".value").attr("bytes"))),t("#files-group-uploads").is(":checked")&&(size+=parseInt(t('label[for="files-group-uploads"]').find(".value").attr("bytes"))),t("#files-group-themes").is(":checked")&&(size+=parseInt(t('label[for="files-group-themes"]').find(".value").attr("bytes"))),t("#files-group-other-contents").is(":checked")&&(size+=parseInt(t('label[for="files-group-other-contents"]').find(".value").attr("bytes"))),t("#files-group-wp-install").is(":checked")&&(size+=parseInt(t('label[for="files-group-wp-install"]').find(".value").attr("bytes"))),size}function m(e,i){if(a+=1,s+=parseInt(i.bytes),i.bytes<=1e4)t("#bmi-scan-"+e).find(".value").text("(0 MB)");else{let o=(parseInt(i.bytes)/1024/1024).toFixed(2);t("#bmi-scan-"+e).find(".value").text("("+o+" MB)")}t("#bmi-scan-"+e).find(".value").attr("bytes",parseInt(i.bytes)),5==a&&(t("#bmi-scan-total").find(".value").text("("+t.bmi.bytesToHuman(s)+")"),t("#bmi-scan-total").find(".value").attr("bytes",parseInt(s)),w())}function g(e){t.bmi.ajax("scan-directory",{folder:e}).then(function(t){m(e,t)}).catch(function(t){m(t,{bytes:"0",readable:"0 B"})})}function b(e=!1,i=function(){}){t.bmi.ajax("is-running-backup",{}).then(function(o){"success"==o.status?i(!1):1==e?i(!0):t.bmi._msg(o)}).catch(function(t){i(!1),console.log(t)})}function w(){let e=parseInt(t("#bmi-scan-total").find(".value").attr("bytes")),i=parseInt(h());t("#files-group-backup").is(":checked")||(e=0,i=0);let o=((e-i)/1024/1024).toFixed(2),n=(i/1024/1024).toFixed(2);"0.00"==o&&(o="0"),"0.00"==n&&(n="0"),t("#esta-exclude").text(o+" MB"),t("#esta-size-for").text(n+" MB")}function v(){t("#prenotice-modal .prenotice").hide(),t("#prenotice-size").text(t.bmi.bytesToHuman(h())),t(".prenotic-3").show(),"true"!==f("database-group-backup")||"true"!==f("database-group-backup")||"true"===f("files-group-backup")&&("true"!==f("files-group-plugins")&&"true"!==f("files-group-themes")&&"true"!==f("files-group-uploads")&&"true"!==f("files-group-wp-install")&&f("files-group-other-contents"),1)||t(".prenotic-6").show(),"true"===f("database-group-backup")||"true"===f("database-group-backup")||"true"!==f("files-group-backup")||"true"!==f("files-group-plugins")&&"true"!==f("files-group-themes")&&"true"!==f("files-group-uploads")&&"true"!==f("files-group-wp-install")&&"true"!==f("files-group-other-contents")||t(".prenotic-5").show(),"true"===f("database-group-backup")&&"true"===f("files-group-backup")&&"true"===f("files-group-plugins")&&"true"===f("files-group-themes")&&"true"===f("files-group-uploads")&&"true"===f("files-group-other-contents")||t(".prenotic-4").show(),t("#prenotice-modal .prenotice:visible").css({background:""});let e=t("#prenotice-modal .prenotice"),i=[];for(let t=0;t<e.length;++t)"none"!==e[t].style.display&&i.push(e[t]);for(let t=0;t<i.length;t+=2)i[t].style.background="#f8f8f8"}function y(t,e=function(){}){try{window.XMLHttpRequest?xmlhttp=new XMLHttpRequest:xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"),xmlhttp.onloadend=function(){4==xmlhttp.readyState&&200==xmlhttp.status?e(xmlhttp.responseText):e(!1)},xmlhttp.open("GET",t),xmlhttp.send()}catch(t){e(!1)}}function k(e,i){if(!1===e)return;let o=e.split("\n"),n=r;r=o.length,n>0&&n--;for(let e=n;e<o.length;++e){let n=o[e],r=document.createElement("DIV"),s="";"[INFO]"==n.substr(0,6)?s="blue":"[SUCCESS]"==n.substr(0,9)?s="green":"[WARN]"==n.substr(0,6)?s="orange":"[ERROR]"==n.substr(0,7)&&(s="red"),"[STEP]"==n.substr(0,6)&&(r.classList.add("bold"),r.classList.add("step"),t("#restore-progress-modal").hasClass("open")?t("#restore_current_step").text(n.slice(29)):t("#current_step").text(n.slice(29))),s.length>0&&r.classList.add(s),r.style.display="none",r.innerText=n,setTimeout(function(){i.appendChild(r),t(r).show(55),i.scrollTop=i.scrollHeight},55*e)}setTimeout(function(){i.scrollTop=i.scrollHeight},110)}function x(e=0,r=1e3,s=null){if(c==e)return;c=e,clearInterval(i);let a=parseFloat(t(".progress-percentage")[0].style.left)-1;if(t("#restore-progress-modal").hasClass("open")&&(a=parseFloat(t("#restore-progress-modal .progress-percentage")[0].style.left)-1),a>e&&0!=e)return;let l=e-a,p=a,d=Math.abs(Math.floor(r/l));i=setInterval(function(){if(p+=1,t("#restore-progress-modal").hasClass("open")?(t("#restore-progress-modal .progress-active-bar")[0].style.width=p.toFixed(2)+"%",t("#restore-progress-modal .progress-percentage")[0].style.left=p.toFixed(2)+"%",t("#restore-progress-modal .progress-percentage")[0].innerText=p.toFixed(0)+"%"):(t(".progress-active-bar")[0].style.width=p.toFixed(2)+"%",t(".progress-percentage")[0].style.left=p.toFixed(2)+"%",t(".progress-percentage")[0].innerText=p.toFixed(0)+"%"),p>=100&&clearInterval(i),p>=100&&null!=s&&(c=null,t("#backup-progress-modal").hasClass("open"))){o=!0,n=!0,S(s,0==u)}p>e&&clearInterval(i)},d)}t("#live-log-toggle").on("click",function(){t(".expanded-logs").length>0?t(this).text(t(this).data("hide")):t(this).text(t(this).data("show")),t("#live-log-wrapper").toggleClass("expanded-logs")}),t("#backup-stop").on("click",function(){t.bmi.ajax("stop-backup",{}).then(function(e){"success"==e.status?t.bmi.alert("success",t("#bmi-abort-soon").text(),3e3):t.bmi._msg(e)}).catch(function(t){console.log(t)})}),t("#bmi_restore_tbody").on("click",".bc-unlocked-btn",function(e){e.preventDefault();let i=e.target,o=i.closest("tr").querySelector(".br_name").innerText.trim();t.bmi.ajax("lock-backup",{filename:o}).then(function(e){"success"==e.status?(t.bmi.alert("success",t("#bmi-lock-success").text(),3e3),t(i.closest("tr").querySelector(".bc-unlocked-btn")).hide(),t(i.closest("tr").querySelector(".bc-locked-btn")).show()):(t.bmi.alert("error",t("#bmi-lock-error").text(),3e3),console.error("BMI Backend error: ",e))}).catch(function(t){console.log(t)})}),t("#files-group-backup").on("change",w),t(".basic-file-exlusion").on("change",'input[type="checkbox"]',w),t("#bmi_restore_tbody").on("click",".bc-locked-btn",function(e){e.preventDefault();let i=e.target,o=i.closest("tr").querySelector(".br_name").innerText.trim();t.bmi.ajax("unlock-backup",{filename:o}).then(function(e){"success"==e.status?(t.bmi.alert("success",t("#bmi-unlock-success").text(),3e3),t(i.closest("tr").querySelector(".bc-locked-btn")).hide(),t(i.closest("tr").querySelector(".bc-unlocked-btn")).show()):(t.bmi.alert("error",t("#bmi-unlock-error").text(),3e3),console.error("BMI Backend error: ",e))}).catch(function(t){console.log(t)})}),t("#bmi_restore_tbody").on("click",".bc-url-btn",function(e){let i=e.target.closest("tr").querySelector(".bc-download-btn").getAttribute("href");t.bmi.clipboard(i)}),t("#bmi_restore_tbody").on("click",".bc-remove-btn",function(e){let i=e.target.closest("tr").querySelector(".br_name").innerText.trim();p=[i],t("#delete-confirm-modal").find(".text2").hide(),t("#delete-confirm-modal").find(".text1").show(),t.bmi.modal("delete-confirm-modal").open()}),t("#sure_delete").on("click",function(){t.bmi.ajax("delete-backup",{filenames:p}).then(function(e){p=null,"success"==e.status?(t.bmi.reloadBackups(),t.bmi.modal("delete-confirm-modal").close(),t.bmi.alert("success",t("#bmi-remove-success").text(),3e3)):(t.bmi.alert("warning",t("#bmi-remove-error").text(),3e3),console.error("BMI Backend error: ",e))}).catch(function(t){console.log(t)})}),t("#add-exclusion-rule").on("click",function(e){e.preventDefault();let i=t(".exclusion_template").clone();i[0].classList.remove("exclusion_template"),i[0].style.display="none",t("#bmi_exclusion_rules").append(i),i.show(300)}),t("#bmi_exclusion_rules").on("click",".kill-exclusion-rule",function(e){e.preventDefault(),$el=e.target,$parent=$el.closest(".exclude-row"),$parent&&(t($parent).hide(300),setTimeout(function(){$parent.remove()},320))}),t("#i-backup-creator").on("click",function(){if(!isNaN(h()))return h()/1024/1024>1e3*parseInt(t("#BMI_REV").text().trim())?E():void("true"===f("database-group-backup")||"true"===f("files-group-backup")&&("true"===f("files-group-plugins")||"true"===f("files-group-themes")||"true"===f("files-group-uploads")||"true"===f("files-group-wp-install")||"true"===f("files-group-other-contents"))?(v(),b(!1,function(){t.bmi.modal("prenotice-modal").open()})):t.bmi.alert("warning",t("#bmi-no-selected").text(),3e3));t.bmi.alert("warning",t("#bmi-preb-processing").text(),3e3)}),t("#BFFSIN").on("change",function(t){let e=parseInt(this.value);isNaN(e)?this.value=1:this.value=e>9999?9999:e<=0?1:e}),t(".save-btn").on("click",function(e){e.preventDefault();let i={},o=t(this.closest(".save-action")).data("save");if(o){if("save-storage"==o)i.directory=t("#bmi_path_storage_default").val(),i.access="true"===t('[name="radioAccessViaLink"]:checked').val()?"true":"false";else if("save-file-config"==o){i.database_group=f("database-group-backup"),i.files_group=f("files-group-backup"),i["files-group-plugins"]=f("files-group-plugins"),i["files-group-uploads"]=f("files-group-uploads"),i["files-group-themes"]=f("files-group-themes"),i["files-group-other-contents"]=f("files-group-other-contents"),i["files-group-wp-install"]=f("files-group-wp-install"),i.files_by_filters=f("files_by_filters"),i.ex_b_fs=f("ex_b_fs"),i.BFFSIN=t("#BFFSIN").val()?t("#BFFSIN").val():"1",i.ex_b_names=f("ex_b_names"),i.ex_b_fpaths=f("ex_b_fpaths"),i.ex_b_dpaths=f("ex_b_dpaths");let e=[],o=t("#bmi_exclusion_rules").find(".exclude-row");for(let i=0;i<o.length;++i){let n=t(o[i]),r=n.find(".exclusion_txt").val(),s=n.find(".exclusion_position").find(".bmi-dropdown").data("selected")+"",a=n.find(".exclusion_where").find(".bmi-dropdown").data("selected")+"";e.push({txt:r,pos:s,whr:a})}i["dynamic-names"]=e,i["dynamic-fpaths-names"]=t("#dynamic-fpaths-names").val().split("\n"),i["dynamic-dpaths-names"]=t("#dynamic-dpaths-names").val().split("\n")}else if("store-config"==o)i.name=t("#backup_filename").val().trim();else{if("save-other-options"!=o)return;i.email=t("#email-for-notices").val().trim(),i.email_title=t("#email-title-for-notices").val().trim(),i.schedule_issues=f("scheduled-issues"),i.uninstall_config=f("uninstalling-configs"),i.uninstall_backups=f("uninstalling-backups")}t.bmi.ajax(o,i).then(function(e){"success"==e.status?e.errors<=0?(t.bmi.alert("success",t("#bmi-save-success").text(),3e3),t.bmi.collapsers.closeAll()):t.bmi.alert("warning",t("#bmi-save-issues").text(),3e3):t.bmi._msg(e)}).catch(function(t){console.log(t)})}}),t(".close-chapters").on("click",function(e){e.preventDefault(),t.bmi.collapsers.closeAll()}),t("#rescan-for-backups").on("click",function(){t.bmi.reloadBackups()});var $=0;function C(e=function(){}){let i=t("#BMI_BLOG_URL").text().trim();y(i+"?backup-migration=PROGRESS_LOGS&progress-id=latest_progress.log&backup-id=current&t="+ +new Date,function(o){y(i+"?backup-migration=PROGRESS_LOGS&progress-id=latest.log&backup-id=current&t="+ +new Date,function(i){let n=t(".log-wrapper").find("pre")[0],r=t("#bmi-making-archive").text().trim();if(o&&0!=o&&void 0!==o&&(x(parseInt(o.split("/")[0])/parseInt(o.split("/")[1])*100),t("#current_step").text().trim().slice(0,r.length)==r)){let e=document.getElementById("bmi_counter_magic");if(e){(async function(t,e,i,o){let n=null,r=function(s){if($>i)return;n||(n=s);let a=Math.min((s-n)/o,1);t.innerText=Math.floor(a*(i-e)+e),a<1&&window.requestAnimationFrame(r)};window.requestAnimationFrame(r)})(e,parseInt(e.innerText),$=parseInt(o.split("/")[0]),2e3),t("#bmi_magic_max_count").text("---")&&100!=parseInt(o.split("/")[1])&&t("#bmi_magic_max_count").text(parseInt(o.split("/")[1]))}else{let e=parseInt(o.split("/")[1]);100==e&&(e="---"),t("#current_step").html(r+' (<span id="bmi_counter_magic">0</span>/<span id="bmi_magic_max_count">'+e+"</span>)")}}i&&0!=i&&void 0!==i&&k(i,n),e()})})}function T(){t(".log-wrapper").find("pre")[0].innerText="",x(0),setTimeout(function(){C(function(){!function t(){e=setTimeout(function(){C(function(){!0===u&&t()})},1e3)}()})})}function O(){x(0),setTimeout(function(){L(function(){!function t(){e=setTimeout(function(){L(function(){!0===d&&t()})},1e3)}()})})}function I(t=function(){}){b(!0,function(e){t(e)})}function S(r,s=!1){(o&&n||s)&&setTimeout(function(){u=!1,t("#backup-progress-modal").hasClass("open")&&(t.bmi.modal("backup-progress-modal").close(),"true"==t('[name="radioAccessViaLink"]:checked').val()?t("#accessible-at-section").show():t("#accessible-at-section").hide(),t.bmi.modal("backup-success-modal").open()),clearInterval(i),clearTimeout(e);let o=t("#BMI_BLOG_URL").text().trim()+"?backup-migration=BMI_BACKUP&backup-id="+r.filename+"&t="+ +new Date,n=t("#BMI_BLOG_URL").text().trim()+"?backup-migration=PROGRESS_LOGS&progress-id=latest.log&backup-id=current&t="+ +new Date;t("#text-input-copy")[0].value=o,t("#download-backup-url").attr("href",o),t("#download-backup-log-url").attr("href",n),t.bmi.reloadBackups(),setTimeout(function(){clearInterval(i),t(".log-wrapper").find("pre")[0].innerText="",t(".progress-active-bar")[0].style.width="0%",t(".progress-percentage")[0].style.left="0%",t(".progress-percentage")[0].innerText="0%"},300)},700)}function z(){setTimeout(function(){t("#backup-error-pre").text("Loading..."),t.bmi.modal("backup-error-modal").open(),y(t("#BMI_BLOG_URL").text().trim()+"?backup-migration=PROGRESS_LOGS&progress-id=latest.log&backup-id=current&t="+ +new Date,function(e){if(0==e)z();else{let i=t("#backup-error-pre")[0];t("#backup-error-pre").text(""),r=0,k(e,i)}})},100)}function E(){t.bmi.modal("bfs-modal").open()}function A(){I(function(e){!0===e?t("#backup-progress-modal").hasClass("open")||(!1===u&&(o=!1,u=!0,_=!0),t("#bmi-ongoing-backup").show(300)):(t("#bmi-ongoing-backup").is(":visible")&&t("#bmi-ongoing-backup").hide(300),t("#backup-progress-modal").hasClass("open")&&!0===_?(!0===u&&(u=!1),_=!1,t.bmi.getCurrentBackups(function(e){t.bmi.fillWithNewBackups(e.backups,function(){y(t("#BMI_BLOG_URL").text().trim()+"?backup-migration=PROGRESS_LOGS&progress-id=latest.log&backup-id=current&t="+ +new Date,function(e){if(!1===e)t.bmi.modal("backup-progress-modal").close();else{let i="Backup process aborted",o="[ERROR]";if((e=e.split("\n"))[e.length-1].includes(i)||e[e.length-2].includes(i))t.bmi.modal("backup-progress-modal").close(),t.bmi.alert("info",t("#bmi-aborted-al").text(),3e3);else if(e[e.length-1].includes(o)||e[e.length-2].includes(o))t.bmi.modal("backup-progress-modal").close(),z();else{t.bmi.modal("backup-progress-modal").close(),t.bmi.modal("backup-success-modal").open();let e=t(t("#bmi_restore_tbody").find("tr")[0]).find(".bc-download-btn").attr("href");t("#download-backup-url").attr({href:e}),t("#text-input-copy").val(e)}}})})})):!0!==u||t("#backup-progress-modal").hasClass("open")||(u=!1,t.bmi.reloadBackups()))})}function L(e=function(){}){let i=t("#BMI_BLOG_URL").text().trim();y(i+"?backup-migration=PROGRESS_LOGS&progress-id=latest_migration.log&backup-id=current&t="+ +new Date,function(o){y(i+"?backup-migration=PROGRESS_LOGS&progress-id=latest_migration_progress.log&backup-id=current&t="+ +new Date,function(i){let n=t("#restore-live-log-wrapper").find("pre")[0];if(0!=o){let t=o.split("\n");(t=void 0!==t[t.length-2]?t[t.length-2]:"").includes("[")&&t.includes("]")&&k(o,n)}0!=i&&x(i),e({progress:i,logs:o})})})}function B(e=function(){}){t.bmi.ajax("htaccess-litespeed",{}).then(function(t){setTimeout(function(){e(!0)},400)}).catch(function(t){e(!1),console.log(t)})}function M(e=function(){}){t.bmi.ajax("migration-locked",{}).then(function(i){"success"==i.status?e(!0):(t.bmi._msg(i),e(!1))}).catch(function(t){console.log(t)})}function P(e=""){if(!t("#restore-progress-modal").hasClass("open"))return;d=!1,t("#restore-error-pre").text("Loading..."),y(t("#BMI_BLOG_URL").text().trim()+"?backup-migration=PROGRESS_LOGS&progress-id=latest_migration.log&backup-id=current&t="+ +new Date,function(i){let o=t("#restore-error-pre")[0];t("#restore-error-pre").text(""),r=0,e.length>0&&(i+="\n"+e),k(i,o)}),t.bmi.modal("restore-progress-modal").close(),t.bmi.modal("restore-error-modal").open()}function D(o=!1){let n=l;if(!n||n.trim().length<=0)return t.bmi.alert("warning",t("#bmi-no-file").text(),3e3);t("#pre-restore-modal").hasClass("open")&&t.bmi.modal("pre-restore-modal").close(),t("#restore-progress-modal").hasClass("open")||t.bmi.modal("restore-progress-modal").open(),o||(t("#restore-live-log-wrapper").find("pre")[0].innerText=""),r=0,d=!0,O(),B(function(){t.bmi.ajax("restore-backup",{file:n,remote:o}).then(function(o){"success"===o.status?setTimeout(function(){clearInterval(i),clearTimeout(e),d=!1,t.bmi.modal("restore-progress-modal").close(),t.bmi.modal("restore-success-modal").open(),setTimeout(function(){t("#restore-progress-modal .progress-active-bar")[0].style.width="0%",t("#restore-progress-modal .progress-percentage")[0].style.left="0%",t("#restore-progress-modal .progress-percentage")[0].innerText="0%"},500)},1500):"error"===o.status?setTimeout(function(){clearInterval(i),clearTimeout(e),P()},1e3):(t.bmi.modal("pre-restore-modal").close(),t.bmi.modal("restore-progress-modal").close(),t.bmi._msg(o))}).catch(function(t,e){P(e),console.log(t)})})}function R(){return t("#bmi_restore_tbody").find('input[type="checkbox"]:checked')}function j(e){e.preventDefault(),t("#format-tip-wrp")[0].style.minWidth="calc(100% - 120px)","none"===t("#format-tip-wrp")[0].style.display?t("#format-tip-wrp").show(300):t("#format-tip-wrp").hide(300)}t("#configuration-reset-absolute").on("click",function(e){e.preventDefault(),t.bmi.ajax("reset-configuration",{}).then(function(e){"success"==e.status?window.location.reload():t.bmi._msg(e)}).catch(function(t){console.log(t)})}),t("#download-site-infos").on("click",function(e){e.preventDefault(),t.bmi.ajax("get-site-data",{}).then(function(e){"success"==e.status?t.bmi.prepareFile("bmi-site-info.debug",JSON.stringify(e.data)):t.bmi._msg(e)}).catch(function(t){console.log(t)})}),t("#start-entire-backup").on("click",function(){t.bmi.modal("prenotice-modal").close(),function(e=function(){}){t.bmi.ajax("reset-latest",{}).then(function(i){"success"==i.status?(e(),t.bmi.modal("backup-progress-modal").open()):t.bmi._msg(i)}).catch(function(t){console.log(t)})}(function(){B(function(){_=!1,o=!1,u=!0,t.bmi.ajax("create-backup",{estaminated_size:h()}).then(function(n){"success"==n.status?(o=!0,clearTimeout(e),u=!1,C(function(){setTimeout(function(){x(101,500,n),S(n,!0)},350)})):(u=!1,setTimeout(function(){clearInterval(i),t(".log-wrapper").find("pre")[0].innerText="",t(".progress-active-bar")[0].style.width="0%",t(".progress-percentage")[0].style.left="0%",t(".progress-percentage")[0].innerText="0%"},300),t.bmi._msg(n),t("#backup-progress-modal").hasClass("open")&&(t.bmi.modal("backup-progress-modal").close(),void 0!==n.bfs?E():z()))}).catch(function(e){t("#backup-progress-modal").hasClass("open")&&(t.bmi.modal("backup-progress-modal").close(),z()),console.log(e)}),r=0,u=!0,T()}),T()})}),t("#open_trouble_extenstion").on("click",function(){t("#trouble_extenstion").hasClass("openned")?(t("#trouble_extenstion").hide(300),t("#trouble_extenstion").removeClass("openned"),t(this).removeClass("active")):(t("#trouble_extenstion").show(300),t("#trouble_extenstion").addClass("openned"),t(this).addClass("active"))}),t("#switch-show-trs").on("click",function(){let e=this.dataset.see,i=this.dataset.hide,o=t(".hide-show-tr");t(this).hasClass("shown")?(o.hide(300),t(this).removeClass("shown"),this.innerText=e):(o.show(300),t(this).addClass("shown"),this.innerText=i)}),t("#ex_b_fs").on("change",function(){t("#ex_b_fs").is(":checked")?t("#bmi__collon").show():t("#bmi__collon").hide()}),t("#show-upload-area").on("click",function(){t(".upload_area").hasClass("hidden")?(t(".upload_area").show(300),t(".upload_area").removeClass("hidden"),t([document.documentElement,document.body]).animate({scrollTop:t(this).offset().top-50+"px"},300)):(t(".upload_area").hide(300),t(".upload_area").addClass("hidden"))}),t(".bmi-copper").on("click",function(e){e.preventDefault();let i=t("#"+this.getAttribute("data-copy"))[0];i.value&&i.value.length>0?t.bmi.clipboard(i.value):t.bmi.clipboard(i.innerText)}),t("#bmi_restore_tbody").on("click",".restore-btn",function(e){M(function(i){if(i){let i=e.target.closest("tr").querySelector(".br_name").innerText;if(l=i,!i||i.trim().length<=0)return t.bmi.alert("warning",t("#bmi-no-file").text(),3e3);t("#restore-ok").prop("checked",!1),t.bmi.modal("pre-restore-modal").open()}})}),t("#quick-download-migration").on("click",function(){let e=t("#bm-d-url").val();t.bmi.isUrlValid(e)?M(function(i){i&&(e.length>0?(l=-100,t("#restore-ok").prop("checked",!1),t.bmi.modal("pre-restore-modal").open()):t.bmi.alert("warning",t("#bmi-invalid-url").text(),5e3))}):t.bmi.alert("warning",t("#bmi-invalid-url").text(),5e3)}),t("#restore-start-sure").on("click",function(){t("#restore-ok").is(":checked")?-100===l?(l=null,t("#restore-live-log-wrapper").find("pre")[0].innerText="",M(function(o){B(function(){if(o){let o=t("#bm-d-url").val();t("#restore_current_step").text(t("#bmi-downloading-remote").text()),t.bmi.ajax("download-backup",{url:o}).then(function(o){clearInterval(i),clearTimeout(e),"success"===o.status?(t.bmi.reloadBackups(),l=o.name,x(100,300),setTimeout(function(){clearInterval(i),t("#restore-progress-modal .progress-active-bar")[0].style.width="0%",t("#restore-progress-modal .progress-percentage")[0].style.left="0%",t("#restore-progress-modal .progress-percentage")[0].innerText="0%",t("#restore_current_step").text(t("#bmi-restoring-prepare").text()),setTimeout(function(){D(!0)},300)},600)):"error"===o.status?P():(t.bmi._msg(o),P())}).catch(function(t,e){P(e),console.log(t)}),t("#restore-live-log-wrapper").find("pre")[0].innerText="",r=0,d=!0,O(),t.bmi.modal("pre-restore-modal").close(),t.bmi.modal("restore-progress-modal").open()}})})):D():t.bmi.alert("warning",t("#bmi-restore-require-checkmark").text(),3e3)}),t(".backup-minimize").on("click",function(){I(function(e){!0===e?t("#bmi-ongoing-backup").show(300):t("#bmi-ongoing-backup").hide()})}),setInterval(function(){A()},4500),A(),t("#bmi-ongoing-backup").on("click",function(){I(function(e){!0===e?(r=0,T(),t.bmi.modal("backup-progress-modal").open()):(t.bmi.alert("info",t("#bmi-bc-ended").text(),3e3),t.bmi.reloadBackups()),t("#bmi-ongoing-backup").hide(300)})}),t("#bmi_restore_tbody").on("change",'input[type="checkbox"]',function(e){let i=R().length;i>0?t(".del-all-btn-wrp").show(300):t(".del-all-btn-wrp").hide(300),i==t("#bmi_restore_tbody").find('input[type="checkbox"]').length?t("#backups-select-all").prop("checked",!0):t("#backups-select-all").prop("checked",!1)}),t("#backups-select-all").on("change",function(){!0===this.checked?t("#bmi_restore_tbody").find('input[type="checkbox"]').prop("checked",!0):t("#bmi_restore_tbody").find('input[type="checkbox"]').prop("checked",!1),R().length>0?t(".del-all-btn-wrp").show(300):t(".del-all-btn-wrp").hide(300)}),t(".lrn-mr-btn, .closer-learn-more").on("click",function(){t(".learn_more_about_cron").hasClass("open")?(t(".learn_more_about_cron").removeClass("open"),t(".learn_more_about_cron").hide(300),t(".lrn-mr-btn").show(),t(".lrn-mr-btn").css({opacity:0}),t(".lrn-mr-btn").animate({opacity:1},300)):(t(".learn_more_about_cron").addClass("open"),t(".learn_more_about_cron").show(300),t(".lrn-mr-btn").css({opacity:1}),t(".lrn-mr-btn").animate({opacity:0},300,function(){t(".lrn-mr-btn").hide()}))}),t("#bmi-error-toggle").on("click",function(){t(".error-body").hasClass("open")?(t(".error-body").hide(300),t(".error-body").removeClass("open"),t("#bmi-error-toggle").text(t("#bmi-error-toggle").data("expand"))):(t(".error-body").show(300),t(".error-body").addClass("open"),t("#bmi-error-toggle").text(t("#bmi-error-toggle").data("collapse")))}),t("#bmi-error-dismiss").on("click",function(){t(".error-noticer").hide(300),setTimeout(function(){t(".error-noticer").remove()},330),t.bmi.ajax("dismiss-error-notice",{}).then(function(t){}).catch(function(t){})}),t(".deleteAllSelected").on("click",function(){let e=R(),i=[];for(let t=0;t<e.length;++t){let o=e[t].closest("tr");i.push(o.querySelector(".br_name").innerText)}t("#delete-confirm-modal").find(".text1").hide(),t("#delete-confirm-modal").find(".text2").show();let o=i.length;o<=0||(t("#backup-multiple-del-count").text(o),o>1?(t("#del-only-one").hide(),t("#del-more-than-one").show()):(t("#del-more-than-one").hide(),t("#del-only-one").show()),p=i,t.bmi.modal("delete-confirm-modal").open())}),t("#load-more-backups").on("click",function(e){e.preventDefault(),t.bmi.showMoreBackups()}),t("#show-format-tip").on("click",j),t("#hide-format-tip").on("click",j),t(".go-to-marbs").on("click",function(e){e.preventDefault(),document.getElementById("marbs").click(),t.bmi.modal().closeAll()}),t(".site-reloader").on("click",function(){window.location.reload()}),async function(){g("plugins"),g("uploads"),g("themes"),g("contents_others"),g("wordpress")}(),t.bmi.ajax("get-dynamic-names",{}).then(function(e){let i=e.data;if(t("#bmi_exclusion_rules").text(""),void 0!==i&&void 0!==i.length){for(let e=0;e<i.length;++e){let o=t(".exclusion_template").clone();o.removeClass("exclusion_template"),o.find(".exclusion_txt").val(i[e].txt);let n=o.find(".exclusion_position").find("select"),r=o.find(".exclusion_where").find("select");n&&(n[0].setAttribute("data-def",i[e].pos),r&&(r[0].setAttribute("data-def",i[e].whr),t("#bmi_exclusion_rules").append(o)))}t("#dynamic-fpaths-names").text(e["dynamic-fpaths-names"].join("\n")),t("#dynamic-dpaths-names").text(e["dynamic-dpaths-names"].join("\n"))}}).catch(function(t){console.log(t)}),t.bmi.reloadBackups(),function(){let e=1e3*parseInt(t("#server-time-auto").attr("data-time")),i=new Date(e);t("#server-time-auto").text(i.toUTCString()),setInterval(function(){e+=1e3,i=new Date(e),t("#server-time-auto").text(i.toUTCString())},1e3),t("#ex_b_fs").is(":checked")?t("#bmi__collon").show():t("#bmi__collon").hide()}()}),jQuery(document).ready(function(t){t(".modal-opener").on("click",function(e){this.getAttribute("data-modal")&&""!=this.getAttribute("data-modal")&&(e.preventDefault(),this.getAttribute("data-close")&&t.bmi.modal(this.getAttribute("data-close")).close(),t.bmi.modal(this.getAttribute("data-modal")).open())}),t(".modal-closer").on("click",function(e){this.getAttribute("data-close")&&""!=this.getAttribute("data-close")?(e.preventDefault(),t.bmi.modal(this.getAttribute("data-close")).close()):this.closest(".modal")&&(e.preventDefault(),t("#"+this.closest(".modal").getAttribute("id")).length>0&&t.bmi.modal(this.closest(".modal").getAttribute("id")).close())}),t(".modal-close").on("click",function(e){this.closest(".modal")&&(e.preventDefault(),t.bmi.modal(this.closest(".modal").id).close())}),t(".modal").on("click",function(e){e.target!=this||t(e.target).hasClass("modal-no-close")||t.bmi.modal(this.id).close()})}),jQuery(document).ready(function(t){t.bmi.tooltips.init();let e,i=-1,o=!1,n="";for(let t=0;t<12;++t)n+="<div></div>";function r(o){clearInterval(e),0==o?(t(".upload-progress-bar").find("span")[0].style.width=o+"%",t(".upload-percentage").text(o+"%")):100==o?(t(".upload-progress-bar").find("span")[0].style.width=o+"%",t(".upload-percentage").text(o+"%")):function(o=0,n=1e3){if(i==o)return;i=o,clearInterval(e);let r=parseInt(t(".upload-percentage").text())-1;if(r>o&&0!=o)return;let s=o-r,a=r,l=Math.abs(Math.floor(n/s));e=setInterval(function(){a+=1,t(".upload-progress-bar").find("span")[0].style.width=a+"%",t(".upload-percentage").text(a+"%"),a>=100&&(clearInterval(e),i=null)},l)}(o,1e3)}t(".spinner-loader").html(n).addClass("lds-spinner"),t.fchunker({upId:"upid",upShardSize:"5",upMaxSize:"2000",upUrl:ajaxurl,upType:"zip",upCallBack:function(e){var i=e.status,n=e.message;e.url,Math.random();2==i&&(setTimeout(function(){t("#drop-area").show(300),t(".upload-progress").hide(300)},100),t.bmi.alert("success",t("#bmi-upload-end").text(),3e3),t.bmi.modal("upload-success-modal").open(),t.bmi.reloadBackups()),1==i&&(o||(t.bmi.alert("success",t("#bmi-upload-start").text(),3e3),o=!0)),0==i&&(t.upErrorMsg(n),t("#drop-area").show(300),t(".upload-progress").hide(300)),5==i&&(t.bmi.modal("upload-invalid-manifest-modal").open(),t("#drop-area").show(300),t(".upload-progress").hide(300)),3==i&&(r(100),t.upErrorMsg(n),t("#drop-area").show(300),t(".upload-progress").hide(300))},upEvent:function(t){r(t)},upStop:function(e){r(0),setTimeout(function(){t("#drop-area").show(300),t(".upload-progress").hide(300)},100),e.includes("Type error")?(t.bmi.modal("upload-wrong-file-modal").open(),t.bmi.alert("warning",t("#bmi-upload-wrong").text(),3e3)):e.includes("File already exists")?(t.bmi.modal("upload-exist-file-modal").open(),t.bmi.alert("warning",t("#bmi-upload-exists").text(),3e3)):(t.bmi.alert("error",t("#bmi-upload-error").text(),3e3),console.error(e))},upStart:function(){o=!1,i=-1,r(0),setTimeout(function(){t("#drop-area").hide(300),t(".upload-progress").show(300)},100)}})}),jQuery(document).ready(function(t){function e(t){for(let e=0;e<t.length;++e){let i=t[e].closest(".container-radio");i&&void 0!=typeof i.classList&&(i.classList.remove("active"),!0===t[e].checked&&i.classList.add("active"))}}t('input[type="radio"]').on("change",function(){let t=this.getAttribute("name");this.closest(".container-radio");e(document.querySelectorAll('[name="'+t+'"]'))}),e(document.getElementById("bmi").querySelectorAll('input[type="radio"]'))}),jQuery(document).ready(function(t){let e=!1;t(".tabs").on("click",".tab",function(i){if(this.classList.contains("active"))return;if(!0===e)return;e=!0,t.bmi.collapsers.closeAll();let o=this.getAttribute("data-point");"manage-restore-wrapper"==o?(t("#create-backup-wrapper").hide(300),t('[data-point="create-backup-wrapper"]').removeClass("active")):"create-backup-wrapper"==o&&(t("#manage-restore-wrapper").hide(300),t('[data-point="manage-restore-wrapper"]').removeClass("active")),t("#"+o).show(300),t(this).addClass("active"),setTimeout(function(){e=!1},320)})}),jQuery(document).ready(function(t){let e=document.getElementById("drop-area");function i(t){t.preventDefault(),t.stopPropagation()}function o(t){e.classList.add("highlight")}function n(t){e.classList.remove("highlight")}e&&(["dragenter","dragover","dragleave","drop"].forEach(t=>{e.addEventListener(t,i,!1)}),["dragenter","dragover"].forEach(t=>{e.addEventListener(t,o,!1),document.querySelector("body").addEventListener(t,o,!1)}),["dragleave","drop","mouseleave"].forEach(t=>{e.addEventListener(t,n,!1)}),t("body, #drop-area").on("mouseleave dragleave drop",function(){n()}),e.addEventListener("drop",function(t){!function(t){t=[...t],jQuery.fchunker_upload("file",t[0])}(t.dataTransfer.files)},!1))});
|
backup-backup.php
ADDED
@@ -0,0 +1,48 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
/**
|
4 |
+
* Plugin Name: Backup Backup
|
5 |
+
* Description: Most sophisticated backup & migration plugin for WordPress
|
6 |
+
* Author: Migrate
|
7 |
+
* Author URI: https://backupbliss.com/
|
8 |
+
* Plugin URI: https://backupbliss.com
|
9 |
+
* Text Domain: backup-migration
|
10 |
+
* Domain Path: /languages
|
11 |
+
* Version: 1.0.4
|
12 |
+
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
13 |
+
|
14 |
+
// Exit on direct access
|
15 |
+
if (!defined('ABSPATH')) {
|
16 |
+
exit;
|
17 |
+
}
|
18 |
+
|
19 |
+
// Default namespace
|
20 |
+
use BMI\Plugin\Backup_Migration_Plugin;
|
21 |
+
|
22 |
+
// Not dynamic constants
|
23 |
+
if (!defined('BMI_DEBUG')) {
|
24 |
+
define('BMI_DEBUG', false);
|
25 |
+
}
|
26 |
+
if (!defined('BMI_VERSION')) {
|
27 |
+
define('BMI_VERSION', '1.0.4');
|
28 |
+
}
|
29 |
+
if (!defined('BMI_ROOT_DIR')) {
|
30 |
+
define('BMI_ROOT_DIR', __DIR__);
|
31 |
+
}
|
32 |
+
if (!defined('BMI_ROOT_FILE')) {
|
33 |
+
define('BMI_ROOT_FILE', __FILE__);
|
34 |
+
}
|
35 |
+
|
36 |
+
// Global plugin variables
|
37 |
+
require_once BMI_ROOT_DIR . '/includes/constants.php';
|
38 |
+
|
39 |
+
// Initialize backup-migration
|
40 |
+
if (!class_exists('Backup_Migration_Plugin')) {
|
41 |
+
|
42 |
+
// Require initializator
|
43 |
+
require_once BMI_ROOT_DIR . '/includes/initializer.php';
|
44 |
+
|
45 |
+
// Initialize entire plugin
|
46 |
+
$bmi_instance = new Backup_Migration_Plugin();
|
47 |
+
$bmi_instance->initialize();
|
48 |
+
}
|
includes/ajax.php
ADDED
@@ -0,0 +1,1434 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
// Namespace
|
4 |
+
namespace BMI\Plugin;
|
5 |
+
|
6 |
+
// Exit on direct access
|
7 |
+
if (!defined('ABSPATH')) {
|
8 |
+
exit;
|
9 |
+
}
|
10 |
+
|
11 |
+
// Uses
|
12 |
+
use BMI\Plugin\Backup_Migration_Plugin as BMP;
|
13 |
+
use BMI\Plugin\BMI_Logger as Logger;
|
14 |
+
use BMI\Plugin\Checker\BMI_Checker as Checker;
|
15 |
+
use BMI\Plugin\Checker\System_Info as SI;
|
16 |
+
use BMI\Plugin\CRON\BMI_Crons as Crons;
|
17 |
+
use BMI\Plugin\Dashboard as Dashboard;
|
18 |
+
use BMI\Plugin\Extracter\BMI_Extracter as Extracter;
|
19 |
+
use BMI\Plugin\Progress\BMI_MigrationProgress as MigrationProgress;
|
20 |
+
use BMI\Plugin\Progress\BMI_ZipProgress as Progress;
|
21 |
+
use BMI\Plugin\Scanner\BMI_BackupsScanner as Backups;
|
22 |
+
use BMI\Plugin\Scanner\BMI_FileScanner as Scanner;
|
23 |
+
use BMI\Plugin\Zipper\BMI_Zipper as Zipper;
|
24 |
+
|
25 |
+
/**
|
26 |
+
* Ajax Handler for BMI
|
27 |
+
*/
|
28 |
+
class BMI_Ajax {
|
29 |
+
public function __construct() {
|
30 |
+
|
31 |
+
// Return if it's not post
|
32 |
+
if (empty($_POST)) {
|
33 |
+
return;
|
34 |
+
}
|
35 |
+
|
36 |
+
// Sanitize User Input
|
37 |
+
$this->post = BMP::sanitize($_POST);
|
38 |
+
|
39 |
+
// Log Handler Call (Verbose)
|
40 |
+
Logger::debug(__("Running POST Function: ", 'backup-migration') . $this->post['f']);
|
41 |
+
|
42 |
+
// Create backup folder
|
43 |
+
if (!file_exists(BMI_BACKUPS)) {
|
44 |
+
mkdir(BMI_BACKUPS, 0755, true);
|
45 |
+
}
|
46 |
+
|
47 |
+
// Handle User Request If Known And Sanitize Response
|
48 |
+
if ($this->post['f'] == 'scan-directory') {
|
49 |
+
BMP::res($this->dirSize());
|
50 |
+
}
|
51 |
+
if ($this->post['f'] == 'create-backup') {
|
52 |
+
BMP::res($this->prepareAndMakeBackup());
|
53 |
+
}
|
54 |
+
if ($this->post['f'] == 'reset-latest') {
|
55 |
+
BMP::res($this->resetLatestLogs());
|
56 |
+
}
|
57 |
+
if ($this->post['f'] == 'get-current-backups') {
|
58 |
+
BMP::res($this->getBackupsList());
|
59 |
+
}
|
60 |
+
if ($this->post['f'] == 'restore-backup') {
|
61 |
+
BMP::res($this->restoreBackup());
|
62 |
+
}
|
63 |
+
if ($this->post['f'] == 'is-running-backup') {
|
64 |
+
BMP::res($this->isRunningBackup());
|
65 |
+
}
|
66 |
+
if ($this->post['f'] == 'stop-backup') {
|
67 |
+
BMP::res($this->stopBackup());
|
68 |
+
}
|
69 |
+
if ($this->post['f'] == 'download-backup') {
|
70 |
+
BMP::res($this->handleQuickMigration());
|
71 |
+
}
|
72 |
+
if ($this->post['f'] == 'migration-locked') {
|
73 |
+
BMP::res($this->isMigrationLocked());
|
74 |
+
}
|
75 |
+
if ($this->post['f'] == 'upload-backup') {
|
76 |
+
BMP::res($this->handleChunkUpload());
|
77 |
+
}
|
78 |
+
if ($this->post['f'] == 'delete-backup') {
|
79 |
+
BMP::res($this->removeBackupFile());
|
80 |
+
}
|
81 |
+
if ($this->post['f'] == 'save-storage') {
|
82 |
+
BMP::res($this->saveStorageConfig());
|
83 |
+
}
|
84 |
+
if ($this->post['f'] == 'save-file-config') {
|
85 |
+
BMP::res($this->saveFilesConfig());
|
86 |
+
}
|
87 |
+
if ($this->post['f'] == 'save-other-options') {
|
88 |
+
BMP::res($this->saveOtherOptions());
|
89 |
+
}
|
90 |
+
if ($this->post['f'] == 'store-config') {
|
91 |
+
BMP::res($this->saveStorageTypeConfig());
|
92 |
+
}
|
93 |
+
if ($this->post['f'] == 'unlock-backup') {
|
94 |
+
BMP::res($this->toggleBackupLock(true));
|
95 |
+
}
|
96 |
+
if ($this->post['f'] == 'lock-backup') {
|
97 |
+
BMP::res($this->toggleBackupLock(false));
|
98 |
+
}
|
99 |
+
if ($this->post['f'] == 'get-dynamic-names') {
|
100 |
+
BMP::res($this->getDynamicNames());
|
101 |
+
}
|
102 |
+
if ($this->post['f'] == 'reset-configuration') {
|
103 |
+
BMP::res($this->resetConfiguration());
|
104 |
+
}
|
105 |
+
if ($this->post['f'] == 'get-site-data') {
|
106 |
+
BMP::res($this->getSiteData());
|
107 |
+
}
|
108 |
+
if ($this->post['f'] == 'calculate-cron') {
|
109 |
+
BMP::res($this->calculateCron());
|
110 |
+
}
|
111 |
+
if ($this->post['f'] == 'dismiss-error-notice') {
|
112 |
+
BMP::res($this->dismissErrorNotice());
|
113 |
+
}
|
114 |
+
if ($this->post['f'] == 'htaccess-litespeed') {
|
115 |
+
BMP::res($this->fixLitespeed());
|
116 |
+
}
|
117 |
+
if ($this->post['f'] == 'debugging') {
|
118 |
+
BMP::res($this->debugging());
|
119 |
+
}
|
120 |
+
}
|
121 |
+
|
122 |
+
public function siteURL() {
|
123 |
+
$protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://";
|
124 |
+
$domainName = $_SERVER['HTTP_HOST'];
|
125 |
+
|
126 |
+
return $protocol . $domainName;
|
127 |
+
}
|
128 |
+
|
129 |
+
public function dirSize() {
|
130 |
+
|
131 |
+
// Require File Scanner
|
132 |
+
require_once BMI_INCLUDES . '/scanner/files.php';
|
133 |
+
|
134 |
+
// Folder
|
135 |
+
$f = $this->post['folder'];
|
136 |
+
|
137 |
+
// Bytes
|
138 |
+
$bytes = 0;
|
139 |
+
$bm = BMP::fixSlashes(BMI_BACKUPS);
|
140 |
+
|
141 |
+
if ($f == 'plugins') {
|
142 |
+
$bytes = Scanner::scanFiles(BMP::fixSlashes(WP_PLUGIN_DIR), $bm);
|
143 |
+
} elseif ($f == 'uploads') {
|
144 |
+
$bytes = Scanner::scanFiles(BMP::fixSlashes(WP_CONTENT_DIR) . DIRECTORY_SEPARATOR . 'uploads', $bm);
|
145 |
+
} elseif ($f == 'themes') {
|
146 |
+
$bytes = Scanner::scanFiles(BMP::fixSlashes(WP_CONTENT_DIR) . DIRECTORY_SEPARATOR . 'themes', $bm);
|
147 |
+
} elseif ($f == 'contents_others') {
|
148 |
+
$bytes = Scanner::scanFilesWithIgnore(BMP::fixSlashes(WP_CONTENT_DIR), ['uploads', 'themes', 'plugins'], $bm);
|
149 |
+
} elseif ($f == 'wordpress') {
|
150 |
+
$bytes = Scanner::scanFilesWithIgnore(BMP::fixSlashes(ABSPATH), [BMP::fixSlashes(WP_CONTENT_DIR)], $bm);
|
151 |
+
}
|
152 |
+
|
153 |
+
return [
|
154 |
+
'bytes' => $bytes,
|
155 |
+
'readable' => BMP::humanSize($bytes)
|
156 |
+
];
|
157 |
+
}
|
158 |
+
|
159 |
+
public function resetLatestLogs() {
|
160 |
+
|
161 |
+
// Check time if not bugged
|
162 |
+
if (file_exists(BMI_BACKUPS . '/.running') && (time() - filemtime(BMI_BACKUPS . '/.running')) > 65) {
|
163 |
+
@unlink(BMI_BACKUPS . '/.running');
|
164 |
+
@unlink(BMI_BACKUPS . '/.abort');
|
165 |
+
}
|
166 |
+
|
167 |
+
// Check if backup is not in progress
|
168 |
+
if (file_exists(BMI_BACKUPS . '/.running')) {
|
169 |
+
return ['status' => 'msg', 'why' => __('Backup process already running, please wait till it complete.', 'backup-migration'), 'level' => 'warning'];
|
170 |
+
}
|
171 |
+
|
172 |
+
// Require logs
|
173 |
+
require_once BMI_INCLUDES . '/progress/zip.php';
|
174 |
+
|
175 |
+
// Write initial
|
176 |
+
$zip_progress = new Progress('', 0);
|
177 |
+
$zip_progress->start();
|
178 |
+
$zip_progress->log(__("Initializing backup...", 'backup-migration'), 'step');
|
179 |
+
$zip_progress->progress('0/100');
|
180 |
+
$zip_progress->end();
|
181 |
+
|
182 |
+
// Return done
|
183 |
+
return ['status' => 'success'];
|
184 |
+
}
|
185 |
+
|
186 |
+
public function makeBackupName() {
|
187 |
+
$name = Dashboard\bmi_get_config('BACKUP:NAME');
|
188 |
+
|
189 |
+
$hash = rand(1000, 9999);
|
190 |
+
$name = str_replace('%hash', $hash, $name);
|
191 |
+
$name = str_replace('%Y', date('Y'), $name);
|
192 |
+
$name = str_replace('%M', date('M'), $name);
|
193 |
+
$name = str_replace('%D', date('D'), $name);
|
194 |
+
$name = str_replace('%d', date('d'), $name);
|
195 |
+
$name = str_replace('%j', date('j'), $name);
|
196 |
+
$name = str_replace('%m', date('m'), $name);
|
197 |
+
$name = str_replace('%n', date('n'), $name);
|
198 |
+
$name = str_replace('%Y', date('Y'), $name);
|
199 |
+
$name = str_replace('%y', date('y'), $name);
|
200 |
+
$name = str_replace('%a', date('a'), $name);
|
201 |
+
$name = str_replace('%A', date('A'), $name);
|
202 |
+
$name = str_replace('%B', date('B'), $name);
|
203 |
+
$name = str_replace('%g', date('g'), $name);
|
204 |
+
$name = str_replace('%G', date('G'), $name);
|
205 |
+
$name = str_replace('%h', date('h'), $name);
|
206 |
+
$name = str_replace('%H', date('H'), $name);
|
207 |
+
$name = str_replace('%i', date('i'), $name);
|
208 |
+
$name = str_replace('%s', date('s'), $name);
|
209 |
+
$name = str_replace('%s', date('s'), $name);
|
210 |
+
|
211 |
+
$i = 2;
|
212 |
+
$tmpname = $name;
|
213 |
+
|
214 |
+
while (file_exists($tmpname . '.zip')) {
|
215 |
+
$tmpname = $name . '_' . $i;
|
216 |
+
$i++;
|
217 |
+
}
|
218 |
+
|
219 |
+
$name = $tmpname . '.zip';
|
220 |
+
|
221 |
+
return $name;
|
222 |
+
}
|
223 |
+
|
224 |
+
public function prepareAndMakeBackup($cron = false) {
|
225 |
+
|
226 |
+
// Require File Scanner
|
227 |
+
require_once BMI_INCLUDES . '/progress/zip.php';
|
228 |
+
require_once BMI_INCLUDES . '/check/checker.php';
|
229 |
+
|
230 |
+
// Backup name
|
231 |
+
$name = $this->makeBackupName();
|
232 |
+
|
233 |
+
// Progress & Logs
|
234 |
+
$zip_progress = new Progress($name, 100, 0, $cron);
|
235 |
+
$zip_progress->start();
|
236 |
+
$zip_progress->log(__("Initializing backup...", 'backup-migration'), 'step');
|
237 |
+
$zip_progress->log((__("Backup & Migration version: ", 'backup-migration') . BMI_VERSION), 'info');
|
238 |
+
$zip_progress->log(__("Site which will be backed up: ", 'backup-migration') . $this->siteURL(), 'info');
|
239 |
+
$zip_progress->log(__("Checking if backup dir is writable...", 'backup-migration'), 'info');
|
240 |
+
|
241 |
+
// Checker
|
242 |
+
$checker = new Checker($zip_progress);
|
243 |
+
|
244 |
+
if (!is_writable(dirname(BMI_BACKUPS))) {
|
245 |
+
|
246 |
+
// Abort backup
|
247 |
+
$zip_progress->log(__("Backup directory is not writable...", 'backup-migration'), 'error');
|
248 |
+
$zip_progress->log(__("Path: ", 'backup-migration') . BMI_BACKUPS, 'error');
|
249 |
+
|
250 |
+
// Close backup
|
251 |
+
@unlink(BMI_BACKUPS . '/.running');
|
252 |
+
@unlink(BMI_BACKUPS . '/.abort');
|
253 |
+
|
254 |
+
// Log and close log
|
255 |
+
$zip_progress->end();
|
256 |
+
|
257 |
+
// Return error
|
258 |
+
return ['status' => 'error'];
|
259 |
+
} else {
|
260 |
+
$zip_progress->log(__("Yup it is writable...", 'backup-migration'), 'success');
|
261 |
+
}
|
262 |
+
|
263 |
+
if (!file_exists(BMI_BACKUPS)) {
|
264 |
+
@mkdir(BMI_BACKUPS, true);
|
265 |
+
}
|
266 |
+
|
267 |
+
// Get file names (huge list mostly)
|
268 |
+
if ($fgwp = Dashboard\bmi_get_config('BACKUP:FILES') == 'true') {
|
269 |
+
$zip_progress->log(__("Scanning files...", 'backup-migration'), 'step');
|
270 |
+
$files = $this->scanFilesForBackup($zip_progress);
|
271 |
+
$files = $this->parseFilesForBackup($files, $zip_progress);
|
272 |
+
} else {
|
273 |
+
$zip_progress->log(__("Omitting files (due to settings)...", 'backup-migration'), 'warn');
|
274 |
+
$files = [];
|
275 |
+
}
|
276 |
+
|
277 |
+
// Check if there is enough space
|
278 |
+
$bytes = intval($this->total_size_for_backup * 1.2);
|
279 |
+
$zip_progress->log(__("Checking free space, reserving...", 'backup-migration'), 'step');
|
280 |
+
if ($this->total_size_for_backup_in_mb >= BMI_REV * 1000) {
|
281 |
+
|
282 |
+
// Abort backup
|
283 |
+
$zip_progress->log(__("Aborting backup...", 'backup-migration'), 'step');
|
284 |
+
$zip_progress->log(str_replace('%s', BMI_REV, __("Site weights more than %s GB.", 'backup-migration')), 'error');
|
285 |
+
|
286 |
+
// Close backup
|
287 |
+
@unlink(BMI_BACKUPS . '/.running');
|
288 |
+
@unlink(BMI_BACKUPS . '/.abort');
|
289 |
+
|
290 |
+
// Log and close log
|
291 |
+
$zip_progress->end();
|
292 |
+
|
293 |
+
// Return error
|
294 |
+
return ['status' => 'error', 'bfs' => true];
|
295 |
+
}
|
296 |
+
|
297 |
+
if (!$checker->check_free_space($bytes)) {
|
298 |
+
|
299 |
+
// Abort backup
|
300 |
+
$zip_progress->log(__("Aborting backup...", 'backup-migration'), 'step');
|
301 |
+
$zip_progress->log(__("There is no space for that backup, checked: ", 'backup-migration') . ($bytes) . __(" bytes", 'backup-migration'), 'error');
|
302 |
+
|
303 |
+
// Close backup
|
304 |
+
@unlink(BMI_BACKUPS . '/.running');
|
305 |
+
@unlink(BMI_BACKUPS . '/.abort');
|
306 |
+
|
307 |
+
// Log and close log
|
308 |
+
$zip_progress->end();
|
309 |
+
|
310 |
+
// Return error
|
311 |
+
return ['status' => 'error'];
|
312 |
+
} else {
|
313 |
+
$zip_progress->log(__("Confirmed, there is more than enough space, checked: ", 'backup-migration') . ($bytes) . __(" bytes", 'backup-migration'), 'success');
|
314 |
+
$zip_progress->bytes = $this->total_size_for_backup;
|
315 |
+
}
|
316 |
+
|
317 |
+
if (Dashboard\bmi_get_config('BACKUP:DATABASE') != 'true') {
|
318 |
+
// Do something if db is not selected
|
319 |
+
}
|
320 |
+
|
321 |
+
// Log and set files length
|
322 |
+
$zip_progress->log(__("Scanning done - found ", 'backup-migration') . sizeof($files) . __(" files...", 'backup-migration'), 'info');
|
323 |
+
$zip_progress->files = sizeof($files);
|
324 |
+
|
325 |
+
// Make Backup
|
326 |
+
$zip_progress->log(__("Backup initialized...", 'backup-migration'), 'success');
|
327 |
+
$zip_progress->log(__("Initializing archiving system...", 'backup-migration'), 'step');
|
328 |
+
|
329 |
+
return $this->createBackup($files, ABSPATH, $name, $zip_progress);
|
330 |
+
}
|
331 |
+
|
332 |
+
public function fixLitespeed() {
|
333 |
+
BMP::fixLitespeed();
|
334 |
+
|
335 |
+
return ['status' => 'success'];
|
336 |
+
}
|
337 |
+
|
338 |
+
public function revertLitespeed() {
|
339 |
+
BMP::revertLitespeed();
|
340 |
+
|
341 |
+
return ['status' => 'success'];
|
342 |
+
}
|
343 |
+
|
344 |
+
public function createBackup($files, $base, $name, &$zip_progress) {
|
345 |
+
|
346 |
+
// Require File Zipper
|
347 |
+
require_once BMI_INCLUDES . '/zipper/zipping.php';
|
348 |
+
|
349 |
+
// Backup name
|
350 |
+
$backup_path = BMI_BACKUPS . '/' . $name;
|
351 |
+
|
352 |
+
// Check time if not bugged
|
353 |
+
if (file_exists(BMI_BACKUPS . '/.running') && (time() - filemtime(BMI_BACKUPS . '/.running')) > 65) {
|
354 |
+
@unlink(BMI_BACKUPS . '/.running');
|
355 |
+
@unlink(BMI_BACKUPS . '/.abort');
|
356 |
+
}
|
357 |
+
|
358 |
+
// Mark as in progress
|
359 |
+
if (!file_exists(BMI_BACKUPS . '/.running')) {
|
360 |
+
touch(BMI_BACKUPS . '/.running');
|
361 |
+
} else {
|
362 |
+
return ['status' => 'msg', 'why' => __('Backup process already running, please wait till it complete.', 'backup-migration'), 'level' => 'warning'];
|
363 |
+
}
|
364 |
+
|
365 |
+
// Initialized
|
366 |
+
$zip_progress->log(__("Archive system initialized...", 'backup-migration'), 'success');
|
367 |
+
|
368 |
+
// Make ZIP
|
369 |
+
$zipper = new Zipper();
|
370 |
+
$zippy = $zipper->makeZIP($files, $backup_path, $name, $zip_progress);
|
371 |
+
if (!$zippy) {
|
372 |
+
|
373 |
+
// Make sure it's open
|
374 |
+
$zip_progress->start();
|
375 |
+
|
376 |
+
// Abort backup
|
377 |
+
$zip_progress->log(__("Aborting backup...", 'backup-migration'), 'step');
|
378 |
+
|
379 |
+
// Close backup
|
380 |
+
@unlink(BMI_BACKUPS . '/.running');
|
381 |
+
@unlink(BMI_BACKUPS . '/.abort');
|
382 |
+
|
383 |
+
// Log and close log
|
384 |
+
$zip_progress->end();
|
385 |
+
|
386 |
+
// Return error
|
387 |
+
if (file_exists($backup_path)) {
|
388 |
+
@unlink($backup_path);
|
389 |
+
}
|
390 |
+
|
391 |
+
return ['status' => 'error'];
|
392 |
+
}
|
393 |
+
|
394 |
+
// Backup aborted
|
395 |
+
if (file_exists(BMI_BACKUPS . '/.abort')) {
|
396 |
+
|
397 |
+
// Make sure it's open
|
398 |
+
$zip_progress->start();
|
399 |
+
|
400 |
+
if (file_exists($backup_path)) {
|
401 |
+
@unlink($backup_path);
|
402 |
+
}
|
403 |
+
@unlink(BMI_BACKUPS . '/.running');
|
404 |
+
@unlink(BMI_BACKUPS . '/.abort');
|
405 |
+
|
406 |
+
// Log and close log
|
407 |
+
$zip_progress->log(__("Backup process aborted.", 'backup-migration'), 'warn');
|
408 |
+
$zip_progress->end();
|
409 |
+
|
410 |
+
Logger::log(__("Backup process aborted.", 'backup-migration'));
|
411 |
+
|
412 |
+
return ['status' => 'msg', 'why' => __('Backup process aborted.', 'backup-migration'), 'level' => 'info'];
|
413 |
+
}
|
414 |
+
|
415 |
+
if (!file_exists($backup_path)) {
|
416 |
+
|
417 |
+
// Make sure it's open
|
418 |
+
$zip_progress->start();
|
419 |
+
|
420 |
+
// Abort backup
|
421 |
+
$zip_progress->log(__("Aborting backup...", 'backup-migration'), 'step');
|
422 |
+
$zip_progress->log(__("There is no backup file...", 'backup-migration'), 'error');
|
423 |
+
$zip_progress->log(__("We could not find backup file when it already should be here.", 'backup-migration'), 'error');
|
424 |
+
$zip_progress->log(__("This error may be related to missing space. (filled during backup)", 'backup-migration'), 'error');
|
425 |
+
$zip_progress->log(__("Path: ", 'backup-migration') . $backup_path, 'error');
|
426 |
+
|
427 |
+
// Close backup
|
428 |
+
@unlink(BMI_BACKUPS . '/.running');
|
429 |
+
@unlink(BMI_BACKUPS . '/.abort');
|
430 |
+
|
431 |
+
// Log and close log
|
432 |
+
$zip_progress->end();
|
433 |
+
|
434 |
+
// Return error
|
435 |
+
return ['status' => 'error'];
|
436 |
+
}
|
437 |
+
|
438 |
+
// End zip log
|
439 |
+
$zip_progress->log(__("New backup created and its name is: ", 'backup-migration') . $name, 'success');
|
440 |
+
$zip_progress->end();
|
441 |
+
|
442 |
+
// Unlink progress
|
443 |
+
@unlink(BMI_BACKUPS . '/.running');
|
444 |
+
@unlink(BMI_BACKUPS . '/.abort');
|
445 |
+
|
446 |
+
// Return
|
447 |
+
Logger::log(__("New backup created and its name is: ", 'backup-migration') . $name);
|
448 |
+
|
449 |
+
return ['status' => 'success', 'filename' => $name, 'root' => plugin_dir_url(BMI_ROOT_FILE)];
|
450 |
+
}
|
451 |
+
|
452 |
+
public function getBackupsList() {
|
453 |
+
|
454 |
+
// Require File Scanner
|
455 |
+
require_once BMI_INCLUDES . '/scanner/backups.php';
|
456 |
+
|
457 |
+
// Get backups
|
458 |
+
$backups = new Backups();
|
459 |
+
$manifests = $backups->getAvailableBackups();
|
460 |
+
|
461 |
+
// Return files
|
462 |
+
return ['status' => 'success', 'backups' => $manifests];
|
463 |
+
}
|
464 |
+
|
465 |
+
public function restoreBackup() {
|
466 |
+
|
467 |
+
// Require File Scanner
|
468 |
+
require_once BMI_INCLUDES . '/zipper/zipping.php';
|
469 |
+
require_once BMI_INCLUDES . '/extracter/extract.php';
|
470 |
+
require_once BMI_INCLUDES . '/progress/migration.php';
|
471 |
+
require_once BMI_INCLUDES . '/check/checker.php';
|
472 |
+
|
473 |
+
// Progress & lock file
|
474 |
+
$lock = BMI_BACKUPS . '/.migration_lock';
|
475 |
+
$progress = BMI_BACKUPS . '/latest_migration_progress.log';
|
476 |
+
|
477 |
+
if (file_exists($lock) && (time() - filemtime($lock)) < 65) {
|
478 |
+
return ['status' => 'msg', 'why' => __('Download process is currently running, please wait till it complete.', 'backup-migration'), 'level' => 'warning'];
|
479 |
+
}
|
480 |
+
|
481 |
+
// Logs
|
482 |
+
$migration = new MigrationProgress($this->post['remote']);
|
483 |
+
$migration->start();
|
484 |
+
|
485 |
+
// Checker
|
486 |
+
$checker = new Checker($migration);
|
487 |
+
$zipper = new Zipper();
|
488 |
+
|
489 |
+
// Handle remote
|
490 |
+
if ($this->post['file']) {
|
491 |
+
$migration->log(__('Restore process responded', 'backup-migration'), 'SUCCESS');
|
492 |
+
}
|
493 |
+
|
494 |
+
// Make lock file
|
495 |
+
$migration->log(__('Locking migration process', 'backup-migration'), 'SUCCESS');
|
496 |
+
touch($lock);
|
497 |
+
|
498 |
+
// Initializing
|
499 |
+
$migration->log(__('Initializing restore process', 'backup-migration'), 'STEP');
|
500 |
+
$migration->log((__("Backup & Migration version: ", 'backup-migration') . BMI_VERSION), 'info');
|
501 |
+
$migration->log(__("Site which will be restored: ", 'backup-migration') . $this->siteURL(), 'info');
|
502 |
+
|
503 |
+
// Check file size
|
504 |
+
$zippath = BMP::fixSlashes(BMI_BACKUPS) . DIRECTORY_SEPARATOR . $this->post['file'];
|
505 |
+
$manifest = $zipper->getZipFileContent($zippath, 'bmi_backup_manifest.json');
|
506 |
+
$migration->log(__('Free space checking...', 'backup-migration'), 'STEP');
|
507 |
+
$migration->log(__('Checking if there is enough amount of free space', 'backup-migration'), 'INFO');
|
508 |
+
if ($manifest) {
|
509 |
+
if (isset($manifest->bytes) && $manifest->bytes) {
|
510 |
+
$bytes = intval($manifest->bytes * 1.2);
|
511 |
+
if (!$checker->check_free_space($bytes)) {
|
512 |
+
$migration->log(__('Cannot start migration process', 'backup-migration'), 'ERROR');
|
513 |
+
$migration->log(__('Error: There is not enough space on the server, checked: ' . ($bytes) . ' bytes.', 'backup-migration'), 'ERROR');
|
514 |
+
$migration->log(__('Aborting...', 'backup-migration'), 'ERROR');
|
515 |
+
$migration->log(__('Unlocking migration', 'backup-migration'), 'INFO');
|
516 |
+
|
517 |
+
@unlink($lock);
|
518 |
+
$migration->end();
|
519 |
+
|
520 |
+
return ['status' => 'error'];
|
521 |
+
} else {
|
522 |
+
$migration->log(__('Confirmed, there is enough space on the device, checked: ' . ($bytes) . ' bytes.', 'backup-migration'), 'SUCCESS');
|
523 |
+
}
|
524 |
+
}
|
525 |
+
} else {
|
526 |
+
$migration->log(__('Cannot start migration process', 'backup-migration'), 'ERROR');
|
527 |
+
$migration->log(__('Error: Could not find manifest in backup, file may be broken', 'backup-migration'), 'ERROR');
|
528 |
+
$migration->log(__('Error: Btw. because of this I also cannot check free space', 'backup-migration'), 'ERROR');
|
529 |
+
$migration->log(__('Aborting...', 'backup-migration'), 'ERROR');
|
530 |
+
$migration->log(__('Unlocking migration', 'backup-migration'), 'INFO');
|
531 |
+
|
532 |
+
@unlink($lock);
|
533 |
+
$migration->end();
|
534 |
+
|
535 |
+
return ['status' => 'error'];
|
536 |
+
}
|
537 |
+
|
538 |
+
// New extracter
|
539 |
+
$extracter = new Extracter($this->post['file'], $migration);
|
540 |
+
|
541 |
+
// Extract
|
542 |
+
$isFine = $extracter->extractTo();
|
543 |
+
if (!$isFine) {
|
544 |
+
$migration->log(__('Aborting...', 'backup-migration'), 'ERROR');
|
545 |
+
$migration->log(__('Unlocking migration', 'backup-migration'), 'INFO');
|
546 |
+
|
547 |
+
@unlink($lock);
|
548 |
+
$migration->end();
|
549 |
+
|
550 |
+
return ['status' => 'error'];
|
551 |
+
}
|
552 |
+
|
553 |
+
$migration->progress('100');
|
554 |
+
$migration->log(__('Restore process completed', 'backup-migration'), 'SUCCESS');
|
555 |
+
$migration->log(__('Finalizing restored files', 'backup-migration'), 'STEP');
|
556 |
+
$migration->log(__('Unlocking migration', 'backup-migration'), 'INFO');
|
557 |
+
@unlink($lock);
|
558 |
+
|
559 |
+
$migration->end();
|
560 |
+
|
561 |
+
return ['status' => 'success'];
|
562 |
+
}
|
563 |
+
|
564 |
+
public function isRunningBackup() {
|
565 |
+
if (file_exists(BMI_BACKUPS . '/.running') && (time() - filemtime(BMI_BACKUPS . '/.running')) <= 65) {
|
566 |
+
return ['status' => 'msg', 'why' => __('Backup process already running, please wait till it complete.', 'backup-migration'), 'level' => 'warning'];
|
567 |
+
} else {
|
568 |
+
return ['status' => 'success'];
|
569 |
+
}
|
570 |
+
}
|
571 |
+
|
572 |
+
public function stopBackup() {
|
573 |
+
if (!file_exists(BMI_BACKUPS . '/.running')) {
|
574 |
+
return ['status' => 'msg', 'why' => __('Backup process completed or is not running.', 'backup-migration'), 'level' => 'info'];
|
575 |
+
} else {
|
576 |
+
if (!file_exists(BMI_BACKUPS . '/.abort')) {
|
577 |
+
touch(BMI_BACKUPS . '/.abort');
|
578 |
+
}
|
579 |
+
|
580 |
+
return ['status' => 'success'];
|
581 |
+
}
|
582 |
+
}
|
583 |
+
|
584 |
+
public function isMigrationLocked() {
|
585 |
+
$lock = BMI_BACKUPS . '/.migration_lock';
|
586 |
+
if (file_exists($lock) && (time() - filemtime($lock)) < 65) {
|
587 |
+
return ['status' => 'msg', 'why' => __('Download process is currently running, please wait till it complete.', 'backup-migration'), 'level' => 'warning'];
|
588 |
+
} else {
|
589 |
+
require_once BMI_INCLUDES . '/progress/migration.php';
|
590 |
+
$progress = BMI_BACKUPS . '/latest_migration_progress.log';
|
591 |
+
$migration = new MigrationProgress();
|
592 |
+
$migration->start();
|
593 |
+
$migration->log(__('Initializing restore process...', 'backup-migration'), 'STEP');
|
594 |
+
$migration->end();
|
595 |
+
|
596 |
+
file_put_contents($progress, '0');
|
597 |
+
|
598 |
+
return ['status' => 'success'];
|
599 |
+
}
|
600 |
+
}
|
601 |
+
|
602 |
+
public function downloadFile($url, $dest, $progress, $lock) {
|
603 |
+
$current_percentage = 0;
|
604 |
+
$fp = fopen($dest, 'w+');
|
605 |
+
|
606 |
+
$progressfile = $progress;
|
607 |
+
$lockfile = $lock;
|
608 |
+
|
609 |
+
$ch = curl_init(str_replace(' ', '%20', $url));
|
610 |
+
curl_setopt($ch, CURLOPT_TIMEOUT, 500);
|
611 |
+
|
612 |
+
curl_setopt($ch, CURLOPT_FILE, $fp);
|
613 |
+
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
|
614 |
+
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
|
615 |
+
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
|
616 |
+
|
617 |
+
curl_setopt($ch, CURLOPT_NOPROGRESS, false);
|
618 |
+
curl_setopt($ch, CURLOPT_PROGRESSFUNCTION, function ($resource, $download_size, $downloaded) use (&$current_percentage, &$lockfile, &$progressfile) {
|
619 |
+
if ($download_size > 0) {
|
620 |
+
$new_percentage = intval(($downloaded / $download_size) * 100);
|
621 |
+
|
622 |
+
if (intval($current_percentage) != intval($new_percentage)) {
|
623 |
+
$current_percentage = $new_percentage;
|
624 |
+
file_put_contents($progressfile, $current_percentage);
|
625 |
+
touch($lockfile);
|
626 |
+
}
|
627 |
+
}
|
628 |
+
});
|
629 |
+
|
630 |
+
curl_exec($ch);
|
631 |
+
$this->lastCurlCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
|
632 |
+
|
633 |
+
$error_msg = false;
|
634 |
+
if (curl_errno($ch)) {
|
635 |
+
$error_msg = curl_error($ch);
|
636 |
+
}
|
637 |
+
|
638 |
+
curl_close($ch);
|
639 |
+
fclose($fp);
|
640 |
+
|
641 |
+
if ($error_msg) {
|
642 |
+
return $error_msg;
|
643 |
+
} else {
|
644 |
+
return false;
|
645 |
+
}
|
646 |
+
}
|
647 |
+
|
648 |
+
public function handleQuickMigration() {
|
649 |
+
$lock = BMI_BACKUPS . '/.migration_lock';
|
650 |
+
if (file_exists($lock) && (time() - filemtime($lock)) < 65) {
|
651 |
+
return ['status' => 'msg', 'why' => __('Download process is currently running, please wait till it complete.', 'backup-migration'), 'level' => 'warning'];
|
652 |
+
}
|
653 |
+
|
654 |
+
require_once BMI_INCLUDES . '/progress/migration.php';
|
655 |
+
require_once BMI_INCLUDES . '/zipper/zipping.php';
|
656 |
+
|
657 |
+
$migration = new MigrationProgress(true);
|
658 |
+
$migration->start();
|
659 |
+
|
660 |
+
$tmp_name = 'backup_' . time() . '.zip';
|
661 |
+
$url = $this->post['url'];
|
662 |
+
$dest = BMI_BACKUPS . '/' . $tmp_name;
|
663 |
+
$progress = BMI_BACKUPS . '/latest_migration_progress.log';
|
664 |
+
|
665 |
+
$migration->log(__('Creating lock file', 'backup-migration'));
|
666 |
+
file_put_contents($lock, '');
|
667 |
+
$migration->log(__('Initializing download process', 'backup-migration'), 'STEP');
|
668 |
+
$downstart = microtime(true);
|
669 |
+
$migration->log(__('Downloading initialized', 'backup-migration'), 'SUCCESS');
|
670 |
+
$migration->log(__('Downloading remote file...', 'backup-migration'), 'STEP');
|
671 |
+
$fileError = $this->downloadFile($url, $dest, $progress, $lock);
|
672 |
+
$migration->log(__('Unlocking migration', 'backup-migration'), 'INFO');
|
673 |
+
@unlink($lock);
|
674 |
+
|
675 |
+
if ($fileError) {
|
676 |
+
$migration->log(__('Removing downloaded file', 'backup-migration'), 'INFO');
|
677 |
+
@unlink($dest);
|
678 |
+
$migration->log(__('Download error', 'backup-migration'), 'ERROR');
|
679 |
+
|
680 |
+
if (strpos($fileError, 'Failed writing body') !== false) {
|
681 |
+
$migration->log(__('Error: There is not enough space on the server', 'backup-migration'), 'ERROR');
|
682 |
+
} else {
|
683 |
+
$migration->log(__('Error', 'backup-migration') . ': ' . $fileError, 'ERROR');
|
684 |
+
}
|
685 |
+
|
686 |
+
$migration->end();
|
687 |
+
|
688 |
+
return ['status' => 'error'];
|
689 |
+
} else {
|
690 |
+
$migration->log(__('Download completed (took: ', 'backup-migration') . (microtime(true) - $downstart) . 's)', 'SUCCESS');
|
691 |
+
$migration->log(__('Looking for backup manifest', 'backup-migration'), 'STEP');
|
692 |
+
$zipper = new Zipper();
|
693 |
+
$content = $zipper->getZipFileContent($dest, 'bmi_backup_manifest.json');
|
694 |
+
if ($content) {
|
695 |
+
try {
|
696 |
+
$i = 1;
|
697 |
+
$name = $content->name;
|
698 |
+
$prepared_name = $name;
|
699 |
+
$migration->log(__('Manifest found remote name: ', 'backup-migration') . $name, 'SUCCESS');
|
700 |
+
|
701 |
+
while (file_exists(BMI_BACKUPS . '/' . $prepared_name)) {
|
702 |
+
$prepared_name = substr($name, 0, -4) . '_' . $i . '.zip';
|
703 |
+
$i++;
|
704 |
+
}
|
705 |
+
|
706 |
+
rename($dest, BMI_BACKUPS . '/' . $prepared_name);
|
707 |
+
$migration->log(__('Requesting restore process', 'backup-migration'), 'STEP');
|
708 |
+
|
709 |
+
$migration->end();
|
710 |
+
file_put_contents($progress, '0');
|
711 |
+
|
712 |
+
return ['status' => 'success', 'name' => $prepared_name];
|
713 |
+
} catch (\Exception $e) {
|
714 |
+
$migration->log(__('Error: ', 'backup-migration') . $e, 'ERROR');
|
715 |
+
$migration->log(__('Removing downloaded file', 'backup-migration'), 'ERROR');
|
716 |
+
@unlink($dest);
|
717 |
+
|
718 |
+
$migration->end();
|
719 |
+
|
720 |
+
return ['status' => 'error'];
|
721 |
+
} catch (\Throwable $e) {
|
722 |
+
$migration->log(__('Error: ', 'backup-migration') . $e, 'ERROR');
|
723 |
+
$migration->log(__('Removing downloaded file', 'backup-migration'), 'ERROR');
|
724 |
+
@unlink($dest);
|
725 |
+
|
726 |
+
$migration->end();
|
727 |
+
|
728 |
+
return ['status' => 'error'];
|
729 |
+
}
|
730 |
+
} else {
|
731 |
+
if ($this->lastCurlCode == '403') {
|
732 |
+
$migration->log(__('Backup is not available to download (Error 403).', 'backup-migration'), 'ERROR');
|
733 |
+
$migration->log(__('It is restricted by remote server configuration.', 'backup-migration'), 'ERROR');
|
734 |
+
} elseif ($this->lastCurlCode == '423') {
|
735 |
+
$migration->log(__('Backup is locked on remote site, please unlock remote downloading.', 'backup-migration'), 'ERROR');
|
736 |
+
$migration->log(__('You can find the setting in "Where shall the backup(s) be stored?" section.', 'backup-migration'), 'ERROR');
|
737 |
+
} elseif ($this->lastCurlCode == '200' || $this->lastCurlCode == '404') {
|
738 |
+
$migration->log(__('Backup does not exist under provided URL.', 'backup-migration'), 'ERROR');
|
739 |
+
$migration->log(__('Please confirm that you can download the backup file via provided URL.', 'backup-migration'), 'ERROR');
|
740 |
+
$migration->log(__('...or the manifest file does not exist in the backup.', 'backup-migration'), 'ERROR');
|
741 |
+
$migration->log(__('Missing manifest means that the backup is probably invalid.', 'backup-migration'), 'ERROR');
|
742 |
+
} else {
|
743 |
+
$migration->log(__('Manifest file does not exist', 'backup-migration'), 'ERROR');
|
744 |
+
$migration->log(__('Downloaded backup may be incomplete (missing manifest)', 'backup-migration'), 'ERROR');
|
745 |
+
$migration->log(__('...or provided URL is not a direct download of ZIP file.', 'backup-migration'), 'ERROR');
|
746 |
+
$migration->log(__('Removing downloaded file', 'backup-migration'), 'ERROR');
|
747 |
+
}
|
748 |
+
|
749 |
+
@unlink($dest);
|
750 |
+
$migration->end();
|
751 |
+
|
752 |
+
return ['status' => 'error'];
|
753 |
+
}
|
754 |
+
}
|
755 |
+
}
|
756 |
+
|
757 |
+
public function handleChunkUpload() {
|
758 |
+
require_once BMI_INCLUDES . '/uploader/chunks.php';
|
759 |
+
}
|
760 |
+
|
761 |
+
public function removeBackupFile() {
|
762 |
+
$files = $this->post['filenames'];
|
763 |
+
|
764 |
+
try {
|
765 |
+
if (is_array($files)) {
|
766 |
+
for ($i = 0; $i < sizeof($files); $i++) {
|
767 |
+
$file = $files[$i];
|
768 |
+
$file = preg_replace('/\.\./', '', $file);
|
769 |
+
if (file_exists(BMI_BACKUPS . '/' . $file)) {
|
770 |
+
unlink(BMI_BACKUPS . '/' . $file);
|
771 |
+
}
|
772 |
+
}
|
773 |
+
}
|
774 |
+
} catch (\Exception $e) {
|
775 |
+
return ['status' => 'error', 'e' => $e];
|
776 |
+
} catch (\Throwable $e) {
|
777 |
+
return ['status' => 'error', 'e' => $e];
|
778 |
+
}
|
779 |
+
|
780 |
+
return ['status' => 'success'];
|
781 |
+
}
|
782 |
+
|
783 |
+
public function saveStorageConfig() {
|
784 |
+
$dir_path = $this->post['directory']; // STORAGE::LOCAL::PATH
|
785 |
+
$accessible = $this->post['access']; // TORAGE::DIRECT::URL
|
786 |
+
$curr_path = Dashboard\bmi_get_config('STORAGE::LOCAL::PATH');
|
787 |
+
|
788 |
+
$error = 0;
|
789 |
+
$created = false;
|
790 |
+
|
791 |
+
if (!file_exists($dir_path)) {
|
792 |
+
$created = true;
|
793 |
+
@mkdir($dir_path, 0755, true);
|
794 |
+
}
|
795 |
+
|
796 |
+
if (is_writable($dir_path)) {
|
797 |
+
if (!Dashboard\bmi_set_config('STORAGE::DIRECT::URL', $accessible)) {
|
798 |
+
$error++;
|
799 |
+
}
|
800 |
+
if (!Dashboard\bmi_set_config('STORAGE::LOCAL::PATH', $dir_path)) {
|
801 |
+
$error++;
|
802 |
+
} else {
|
803 |
+
$cur_dir = BMP::fixSlashes($curr_path . DIRECTORY_SEPARATOR . 'backups');
|
804 |
+
$new_dir = BMP::fixSlashes($dir_path . DIRECTORY_SEPARATOR . 'backups');
|
805 |
+
|
806 |
+
if ($cur_dir != $new_dir) {
|
807 |
+
$scanned_directory = array_diff(scandir($cur_dir), ['..', '.']);
|
808 |
+
if (!file_exists($new_dir)) {
|
809 |
+
@mkdir($new_dir, 0755, true);
|
810 |
+
}
|
811 |
+
foreach ($scanned_directory as $i => $file) {
|
812 |
+
rename($cur_dir . DIRECTORY_SEPARATOR . $file, $new_dir . DIRECTORY_SEPARATOR . $file);
|
813 |
+
}
|
814 |
+
|
815 |
+
@rmdir($cur_dir);
|
816 |
+
@rmdir(dirname($cur_dir));
|
817 |
+
}
|
818 |
+
}
|
819 |
+
} else {
|
820 |
+
if ($created === true) {
|
821 |
+
@unlink($dir_path);
|
822 |
+
}
|
823 |
+
|
824 |
+
return ['status' => 'msg', 'why' => __('Entered path is not writable, cannot be used.', 'backup-migration'), 'level' => 'warning'];
|
825 |
+
}
|
826 |
+
|
827 |
+
return ['status' => 'success', 'errors' => $error];
|
828 |
+
}
|
829 |
+
|
830 |
+
public function saveOtherOptions() {
|
831 |
+
|
832 |
+
// Errors
|
833 |
+
$invalid_email = __('Provided email addess is not valid.', 'backup-migration');
|
834 |
+
$title_long = __('Your email title is too long, please change the title (max 64 chars).', 'backup-migration');
|
835 |
+
$title_short = __('Your email title is too short, please use longer one (at least 3 chars).', 'backup-migration');
|
836 |
+
$title_empty = __('Title field is required, please fill it.', 'backup-migration');
|
837 |
+
$email_empty = __('Email field cannot be empty, please fill it.', 'backup-migration');
|
838 |
+
|
839 |
+
$email = trim($this->post['email']); // OTHER:EMAIL
|
840 |
+
$email_title = trim($this->post['email_title']); // OTHER:EMAIL:TITLE
|
841 |
+
$schedule_issues = $this->post['schedule_issues'] === 'true' ? true : false; // OTHER:EMAIL:NOTIS
|
842 |
+
$uninstall_config = $this->post['uninstall_config'] === 'true' ? true : false; // OTHER:UNINSTALL:CONFIGS
|
843 |
+
$uninstall_backups = $this->post['uninstall_backups'] === 'true' ? true : false; // OTHER:UNINSTALL:BACKUPS
|
844 |
+
|
845 |
+
if (strlen($email) <= 0) {
|
846 |
+
return ['status' => 'msg', 'why' => $email_empty, 'level' => 'warning'];
|
847 |
+
}
|
848 |
+
if (strlen($email_title) <= 0) {
|
849 |
+
return ['status' => 'msg', 'why' => $title_empty, 'level' => 'warning'];
|
850 |
+
}
|
851 |
+
if (strlen($email_title) > 64) {
|
852 |
+
return ['status' => 'msg', 'why' => $title_long, 'level' => 'warning'];
|
853 |
+
}
|
854 |
+
if (strlen($email_title) < 3) {
|
855 |
+
return ['status' => 'msg', 'why' => $title_short, 'level' => 'warning'];
|
856 |
+
}
|
857 |
+
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
|
858 |
+
return ['status' => 'msg', 'why' => $invalid_email, 'level' => 'warning'];
|
859 |
+
}
|
860 |
+
|
861 |
+
$error = 0;
|
862 |
+
if (!Dashboard\bmi_set_config('OTHER:EMAIL', $email)) {
|
863 |
+
$error++;
|
864 |
+
}
|
865 |
+
if (!Dashboard\bmi_set_config('OTHER:EMAIL:TITLE', $email_title)) {
|
866 |
+
$error++;
|
867 |
+
}
|
868 |
+
if (!Dashboard\bmi_set_config('OTHER:EMAIL:NOTIS', $schedule_issues)) {
|
869 |
+
$error++;
|
870 |
+
}
|
871 |
+
if (!Dashboard\bmi_set_config('OTHER:UNINSTALL:CONFIGS', $uninstall_config)) {
|
872 |
+
$error++;
|
873 |
+
}
|
874 |
+
if (!Dashboard\bmi_set_config('OTHER:UNINSTALL:BACKUPS', $uninstall_backups)) {
|
875 |
+
$error++;
|
876 |
+
}
|
877 |
+
|
878 |
+
return ['status' => 'success', 'errors' => $error];
|
879 |
+
}
|
880 |
+
|
881 |
+
public function saveStorageTypeConfig() {
|
882 |
+
|
883 |
+
// Errors
|
884 |
+
$name_empty = __('Name is required, please fill the input.', 'backup-migration');
|
885 |
+
$name_long = __('Your name is too long, please change the name.', 'backup-migration');
|
886 |
+
$name_short = __('Your name is too short, please create longer one.', 'backup-migration');
|
887 |
+
$name_space = __('Please, do not use spaces in file name.', 'backup-migration');
|
888 |
+
$name_forbidden = __('Your name contains character(s) that are not allowed in file names: ', 'backup-migration');
|
889 |
+
|
890 |
+
$forbidden_chars = ['/', '\\', '<', '>', ':', '"', "'", '|', '?', '*', '.', ';', '@', '!', '~', '`', ',', '#', '$', '&', '=', '+'];
|
891 |
+
$name = trim($this->post['name']); // BACKUP:NAME
|
892 |
+
|
893 |
+
if (strlen($name) == 0) {
|
894 |
+
return ['status' => 'msg', 'why' => $name_empty, 'level' => 'warning'];
|
895 |
+
}
|
896 |
+
if (strlen($name) > 40) {
|
897 |
+
return ['status' => 'msg', 'why' => $name_long, 'level' => 'warning'];
|
898 |
+
}
|
899 |
+
if (strlen($name) < 3) {
|
900 |
+
return ['status' => 'msg', 'why' => $name_short, 'level' => 'warning'];
|
901 |
+
}
|
902 |
+
if (strpos($name, ' ') !== false) {
|
903 |
+
return ['status' => 'msg', 'why' => $name_space, 'level' => 'warning'];
|
904 |
+
}
|
905 |
+
|
906 |
+
for ($i = 0; $i < sizeof($forbidden_chars); ++$i) {
|
907 |
+
$char = $forbidden_chars[$i];
|
908 |
+
if (strpos($name, $char) !== false) {
|
909 |
+
return ['status' => 'msg', 'why' => $name_forbidden . $char, 'level' => 'warning'];
|
910 |
+
}
|
911 |
+
}
|
912 |
+
|
913 |
+
$error = 0;
|
914 |
+
if (!Dashboard\bmi_set_config('BACKUP:NAME', $name)) {
|
915 |
+
$error++;
|
916 |
+
}
|
917 |
+
|
918 |
+
return ['status' => 'success', 'errors' => $error];
|
919 |
+
}
|
920 |
+
|
921 |
+
public function saveFilesConfig() {
|
922 |
+
$db_group = $this->post['database_group']; // BACKUP:DATABASE
|
923 |
+
$files_group = $this->post['files_group']; // BACKUP:FILES
|
924 |
+
|
925 |
+
$fgp = $this->post['files-group-plugins']; // BACKUP:FILES::PLUGINS
|
926 |
+
$fgu = $this->post['files-group-uploads']; // BACKUP:FILES::UPLOADS
|
927 |
+
$fgt = $this->post['files-group-themes']; // BACKUP:FILES::THEMES
|
928 |
+
$fgoc = $this->post['files-group-other-contents']; // BACKUP:FILES::OTHERS
|
929 |
+
$fgwp = $this->post['files-group-wp-install']; // BACKUP:FILES::WP
|
930 |
+
|
931 |
+
$file_filters = $this->post['files_by_filters']; // BACKUP:FILES::FILTER
|
932 |
+
$ffs = $this->post['ex_b_fs']; // BACKUP:FILES::FILTER:SIZE
|
933 |
+
$ffsizemax = $this->post['BFFSIN']; // BACKUP:FILES::FILTER:SIZE:IN
|
934 |
+
$ffn = $this->post['ex_b_names']; // BACKUP:FILES::FILTER:NAMES
|
935 |
+
$ffp = $this->post['ex_b_fpaths']; // BACKUP:FILES::FILTER:FPATHS
|
936 |
+
$ffd = $this->post['ex_b_dpaths']; // BACKUP:FILES::FILTER:DPATHS
|
937 |
+
|
938 |
+
$existant = [];
|
939 |
+
$parsed = [];
|
940 |
+
$ffnames = $this->post['dynamic-names']; // BACKUP:FILES::FILTER:NAMES:IN
|
941 |
+
$ffpnames = array_unique($this->post['dynamic-fpaths-names']); // BACKUP:FILES::FILTER:FPATHS:IN
|
942 |
+
$ffdnames = array_unique($this->post['dynamic-dpaths-names']); // BACKUP:FILES::FILTER:DPATHS:IN
|
943 |
+
|
944 |
+
|
945 |
+
$max = sizeof($ffpnames);
|
946 |
+
for ($i = 0; $i < $max; ++$i) {
|
947 |
+
if (!is_string($ffpnames[$i]) || trim(strlen($ffpnames[$i])) <= 1) {
|
948 |
+
array_splice($ffpnames, $i, 1);
|
949 |
+
$i--;
|
950 |
+
$max--;
|
951 |
+
}
|
952 |
+
}
|
953 |
+
|
954 |
+
$max = sizeof($ffdnames);
|
955 |
+
for ($i = 0; $i < $max; ++$i) {
|
956 |
+
if (!is_string($ffdnames[$i]) || trim(strlen($ffdnames[$i])) <= 1) {
|
957 |
+
array_splice($ffdnames, $i, 1);
|
958 |
+
$i--;
|
959 |
+
$max--;
|
960 |
+
}
|
961 |
+
}
|
962 |
+
|
963 |
+
for ($i = 0; $i < sizeof($ffnames); ++$i) {
|
964 |
+
$row = $ffnames[$i];
|
965 |
+
$txt = array_key_exists('txt', $row) ? "" . $row['txt'] . "" : false;
|
966 |
+
$pos = array_key_exists('pos', $row) ? $row['pos'] : false;
|
967 |
+
$whr = array_key_exists('whr', $row) ? $row['whr'] : false;
|
968 |
+
|
969 |
+
if ($txt === false || $pos === false || $whr === false) {
|
970 |
+
continue;
|
971 |
+
}
|
972 |
+
if (trim(strlen($txt)) <= 0) {
|
973 |
+
continue;
|
974 |
+
}
|
975 |
+
if (!in_array($pos, ["1", "2", "3"])) {
|
976 |
+
continue;
|
977 |
+
}
|
978 |
+
if (!in_array($whr, ["1", "2"])) {
|
979 |
+
continue;
|
980 |
+
}
|
981 |
+
if (in_array($txt . $pos . $whr, $existant)) {
|
982 |
+
continue;
|
983 |
+
} else {
|
984 |
+
$existant[] = $txt . $pos . $whr;
|
985 |
+
}
|
986 |
+
|
987 |
+
$parsed[] = ['txt' => $txt, 'pos' => $pos, 'whr' => $whr];
|
988 |
+
}
|
989 |
+
|
990 |
+
if ($ffs == 'true' && !is_numeric($ffsizemax)) {
|
991 |
+
return ['status' => 'msg', 'why' => __('Entred file size limit, is not correct number.', 'backup-migration'), 'level' => 'warning'];
|
992 |
+
}
|
993 |
+
|
994 |
+
$error = 0;
|
995 |
+
if (!Dashboard\bmi_set_config('BACKUP:DATABASE', $db_group)) {
|
996 |
+
$error++;
|
997 |
+
}
|
998 |
+
if (!Dashboard\bmi_set_config('BACKUP:FILES', $files_group)) {
|
999 |
+
$error++;
|
1000 |
+
}
|
1001 |
+
|
1002 |
+
if (!Dashboard\bmi_set_config('BACKUP:FILES::PLUGINS', $fgp)) {
|
1003 |
+
$error++;
|
1004 |
+
}
|
1005 |
+
if (!Dashboard\bmi_set_config('BACKUP:FILES::UPLOADS', $fgu)) {
|
1006 |
+
$error++;
|
1007 |
+
}
|
1008 |
+
if (!Dashboard\bmi_set_config('BACKUP:FILES::THEMES', $fgt)) {
|
1009 |
+
$error++;
|
1010 |
+
}
|
1011 |
+
if (!Dashboard\bmi_set_config('BACKUP:FILES::OTHERS', $fgoc)) {
|
1012 |
+
$error++;
|
1013 |
+
}
|
1014 |
+
if (!Dashboard\bmi_set_config('BACKUP:FILES::WP', $fgwp)) {
|
1015 |
+
$error++;
|
1016 |
+
}
|
1017 |
+
|
1018 |
+
if (!Dashboard\bmi_set_config('BACKUP:FILES::FILTER', $file_filters)) {
|
1019 |
+
$error++;
|
1020 |
+
}
|
1021 |
+
if (!Dashboard\bmi_set_config('BACKUP:FILES::FILTER:SIZE', $ffs)) {
|
1022 |
+
$error++;
|
1023 |
+
}
|
1024 |
+
if (!Dashboard\bmi_set_config('BACKUP:FILES::FILTER:NAMES', $ffn)) {
|
1025 |
+
$error++;
|
1026 |
+
}
|
1027 |
+
if (!Dashboard\bmi_set_config('BACKUP:FILES::FILTER:FPATHS', $ffp)) {
|
1028 |
+
$error++;
|
1029 |
+
}
|
1030 |
+
if (!Dashboard\bmi_set_config('BACKUP:FILES::FILTER:DPATHS', $ffd)) {
|
1031 |
+
$error++;
|
1032 |
+
}
|
1033 |
+
|
1034 |
+
if (!Dashboard\bmi_set_config('BACKUP:FILES::FILTER:SIZE:IN', $ffsizemax)) {
|
1035 |
+
$error++;
|
1036 |
+
}
|
1037 |
+
if (!Dashboard\bmi_set_config('BACKUP:FILES::FILTER:NAMES:IN', $parsed)) {
|
1038 |
+
$error++;
|
1039 |
+
}
|
1040 |
+
if (!Dashboard\bmi_set_config('BACKUP:FILES::FILTER:FPATHS:IN', $ffpnames)) {
|
1041 |
+
$error++;
|
1042 |
+
}
|
1043 |
+
if (!Dashboard\bmi_set_config('BACKUP:FILES::FILTER:DPATHS:IN', $ffdnames)) {
|
1044 |
+
$error++;
|
1045 |
+
}
|
1046 |
+
|
1047 |
+
// return array('status' => 'msg', 'why' => __('Entred path is not writable or does not exist.', 'backup-migration'), 'level' => 'warning');
|
1048 |
+
|
1049 |
+
return ['status' => 'success', 'errors' => $error];
|
1050 |
+
}
|
1051 |
+
|
1052 |
+
public function scanFilesForBackup(&$progress) {
|
1053 |
+
require_once BMI_INCLUDES . '/scanner/files.php';
|
1054 |
+
|
1055 |
+
// Use filters?
|
1056 |
+
$is = Dashboard\bmi_get_config('BACKUP:FILES::FILTER') === 'true' ? true : false;
|
1057 |
+
|
1058 |
+
// Get settings form config
|
1059 |
+
$fgp = Dashboard\bmi_get_config('BACKUP:FILES::PLUGINS');
|
1060 |
+
$fgt = Dashboard\bmi_get_config('BACKUP:FILES::THEMES');
|
1061 |
+
$fgu = Dashboard\bmi_get_config('BACKUP:FILES::UPLOADS');
|
1062 |
+
$fgoc = Dashboard\bmi_get_config('BACKUP:FILES::OTHERS');
|
1063 |
+
$fgwp = Dashboard\bmi_get_config('BACKUP:FILES::WP');
|
1064 |
+
$dpathsis = Dashboard\bmi_get_config('BACKUP:FILES::FILTER:DPATHS') === 'true' ? true : false;
|
1065 |
+
$dpaths = Dashboard\bmi_get_config('BACKUP:FILES::FILTER:DPATHS:IN');
|
1066 |
+
$dynamesis = Dashboard\bmi_get_config('BACKUP:FILES::FILTER:NAMES') === 'true' ? true : false;
|
1067 |
+
$dynames = Dashboard\bmi_get_config('BACKUP:FILES::FILTER:NAMES:IN');
|
1068 |
+
$dynparsed = [];
|
1069 |
+
|
1070 |
+
// Filter dynames to for smaller size
|
1071 |
+
if ($is && $dynamesis) {
|
1072 |
+
for ($i = 0; $i < sizeof($dynames); ++$i) {
|
1073 |
+
$s = $dynames[$i];
|
1074 |
+
if ($s->whr == '2') {
|
1075 |
+
$dynparsed[] = ['s' => $s->txt, 'w' => $s->pos, 'z' => strlen($s->txt)];
|
1076 |
+
}
|
1077 |
+
}
|
1078 |
+
}
|
1079 |
+
|
1080 |
+
// Set exclusion rules
|
1081 |
+
$ignored_folders_default = [];
|
1082 |
+
if ($is && $dynamesis) {
|
1083 |
+
BMP::merge_arrays($ignored_folders_default, $dynparsed);
|
1084 |
+
}
|
1085 |
+
$ignored_folders = $ignored_folders_default;
|
1086 |
+
$ignored_paths_default = [BMI_CONFIG_DIR, BMI_BACKUPS, BMI_ROOT_DIR];
|
1087 |
+
if ($is && $dpathsis) {
|
1088 |
+
BMP::merge_arrays($ignored_paths_default, $dpaths);
|
1089 |
+
}
|
1090 |
+
$ignored_paths = $ignored_paths_default;
|
1091 |
+
|
1092 |
+
// Fix slashes for current system
|
1093 |
+
for ($i = 0; $i < sizeof($ignored_paths); ++$i) {
|
1094 |
+
$ignored_paths[$i] = BMP::fixSlashes($ignored_paths[$i]);
|
1095 |
+
}
|
1096 |
+
|
1097 |
+
// WordPress Paths
|
1098 |
+
$plugins_path = BMP::fixSlashes(WP_PLUGIN_DIR);
|
1099 |
+
$themes_path = BMP::fixSlashes(dirname(get_template_directory()));
|
1100 |
+
$uploads_path = BMP::fixSlashes(wp_upload_dir()['basedir']);
|
1101 |
+
$wp_contents = BMP::fixSlashes(WP_CONTENT_DIR);
|
1102 |
+
$wp_install = BMP::fixSlashes(ABSPATH);
|
1103 |
+
|
1104 |
+
// Getting plugins
|
1105 |
+
$sfgp = Scanner::equalFolderByPath($wp_install, $plugins_path, $ignored_folders);
|
1106 |
+
if ($fgp == 'true' && !$sfgp) {
|
1107 |
+
$plugins_path_files = Scanner::scanFilesGetNamesWithIgnoreFBC($plugins_path, $ignored_folders, $ignored_paths);
|
1108 |
+
}
|
1109 |
+
|
1110 |
+
// Getting themes
|
1111 |
+
$sfgt = Scanner::equalFolderByPath($wp_install, $themes_path, $ignored_folders);
|
1112 |
+
if ($fgt == 'true' && !$sfgt) {
|
1113 |
+
$themes_path_files = Scanner::scanFilesGetNamesWithIgnoreFBC($themes_path, $ignored_folders, $ignored_paths);
|
1114 |
+
}
|
1115 |
+
|
1116 |
+
// Getting uploads
|
1117 |
+
$sfgu = Scanner::equalFolderByPath($wp_install, $uploads_path, $ignored_folders);
|
1118 |
+
if ($fgu == 'true' && !$sfgu) {
|
1119 |
+
$uploads_path_files = Scanner::scanFilesGetNamesWithIgnoreFBC($uploads_path, $ignored_folders, $ignored_paths);
|
1120 |
+
}
|
1121 |
+
|
1122 |
+
// Ignore above paths
|
1123 |
+
$sfgoc = Scanner::equalFolderByPath($wp_install, $wp_contents, $ignored_folders);
|
1124 |
+
if ($fgoc == 'true' && !$sfgoc) {
|
1125 |
+
|
1126 |
+
// Ignore common folders (already scanned)
|
1127 |
+
$content_folders = [$plugins_path, $themes_path, $uploads_path];
|
1128 |
+
BMP::merge_arrays($content_folders, $ignored_paths);
|
1129 |
+
|
1130 |
+
// Getting other contents
|
1131 |
+
$wp_contents_files = Scanner::scanFilesGetNamesWithIgnoreFBC($wp_contents, $ignored_folders, $content_folders);
|
1132 |
+
}
|
1133 |
+
|
1134 |
+
// Ignore contents path
|
1135 |
+
if ($fgwp == 'true') {
|
1136 |
+
|
1137 |
+
// Ignore contents file
|
1138 |
+
$ignored_paths[] = $wp_contents;
|
1139 |
+
|
1140 |
+
// Getting WP Installation
|
1141 |
+
$wp_install_files = Scanner::scanFilesGetNamesWithIgnoreFBC($wp_install, $ignored_folders, $ignored_paths);
|
1142 |
+
}
|
1143 |
+
|
1144 |
+
// Concat all file paths
|
1145 |
+
$all_files = [];
|
1146 |
+
if ($fgp == 'true' && !$sfgp) {
|
1147 |
+
BMP::merge_arrays($all_files, $plugins_path_files);
|
1148 |
+
unset($plugins_path_files);
|
1149 |
+
}
|
1150 |
+
|
1151 |
+
if ($fgt == 'true' && !$sfgt) {
|
1152 |
+
BMP::merge_arrays($all_files, $themes_path_files);
|
1153 |
+
unset($themes_path_files);
|
1154 |
+
}
|
1155 |
+
|
1156 |
+
if ($fgu == 'true' && !$sfgu) {
|
1157 |
+
BMP::merge_arrays($all_files, $uploads_path_files);
|
1158 |
+
unset($uploads_path_files);
|
1159 |
+
}
|
1160 |
+
|
1161 |
+
if ($fgoc == 'true' && !$sfgoc) {
|
1162 |
+
BMP::merge_arrays($all_files, $wp_contents_files);
|
1163 |
+
unset($wp_contents_files);
|
1164 |
+
}
|
1165 |
+
|
1166 |
+
if ($fgwp == 'true') {
|
1167 |
+
BMP::merge_arrays($all_files, $wp_install_files);
|
1168 |
+
unset($wp_install_files);
|
1169 |
+
}
|
1170 |
+
|
1171 |
+
return $all_files;
|
1172 |
+
}
|
1173 |
+
|
1174 |
+
public function parseFilesForBackup(&$files, &$progress) {
|
1175 |
+
$is = Dashboard\bmi_get_config('BACKUP:FILES::FILTER') === 'true' ? true : false;
|
1176 |
+
$acis = (Dashboard\bmi_get_config('BACKUP:FILES::FILTER:FPATHS') === 'true' && $is) ? true : false;
|
1177 |
+
$ac = Dashboard\bmi_get_config('BACKUP:FILES::FILTER:FPATHS:IN');
|
1178 |
+
|
1179 |
+
$abis = (Dashboard\bmi_get_config('BACKUP:FILES::FILTER:NAMES') === 'true' && $is) ? true : false;
|
1180 |
+
$ab = Dashboard\bmi_get_config('BACKUP:FILES::FILTER:NAMES:IN');
|
1181 |
+
$abres = [];
|
1182 |
+
$acres = new \stdClass();
|
1183 |
+
|
1184 |
+
if ($is && $acis) {
|
1185 |
+
foreach ($ac as $key => $value) {
|
1186 |
+
$value = BMP::fixSlashes($value);
|
1187 |
+
$acres->{$value} = 1;
|
1188 |
+
}
|
1189 |
+
}
|
1190 |
+
|
1191 |
+
if ($is && $abis) {
|
1192 |
+
for ($i = 0; $i < sizeof($ab); ++$i) {
|
1193 |
+
$s = $ab[$i];
|
1194 |
+
if ($s->whr == '1') {
|
1195 |
+
$abres[] = ['s' => $s->txt, 'w' => $s->pos, 'z' => strlen($s->txt)];
|
1196 |
+
}
|
1197 |
+
}
|
1198 |
+
}
|
1199 |
+
|
1200 |
+
$sizemax = Dashboard\bmi_get_config('BACKUP:FILES::FILTER:SIZE:IN');
|
1201 |
+
$usesize = (Dashboard\bmi_get_config('BACKUP:FILES::FILTER:SIZE') === 'true' && $is) ? true : false;
|
1202 |
+
if (!is_numeric($sizemax)) {
|
1203 |
+
$usesize = false;
|
1204 |
+
$sizemax = 99999;
|
1205 |
+
} else {
|
1206 |
+
intval($sizemax);
|
1207 |
+
}
|
1208 |
+
|
1209 |
+
$total_size = 0;
|
1210 |
+
$max = $sizemax * (1024 * 1024);
|
1211 |
+
$maxfor = sizeof($files);
|
1212 |
+
for ($i = 0; $i < $maxfor; ++$i) {
|
1213 |
+
|
1214 |
+
// Remove size from path and get the size
|
1215 |
+
$files[$i] = explode(',', $files[$i]);
|
1216 |
+
$last = sizeof($files[$i]) - 1;
|
1217 |
+
$size = intval($files[$i][$last]);
|
1218 |
+
unset($files[$i][$last]);
|
1219 |
+
$files[$i] = implode(',', $files[$i]);
|
1220 |
+
|
1221 |
+
if ($usesize && Scanner::fileTooLarge($size, $max)) {
|
1222 |
+
$progress->log(__("Removing file from backup (too large) ", 'backup-migration') . $files[$i] . ' (' . number_format(($size / 1024 / 1024), 2) . ' MB)', 'WARN');
|
1223 |
+
array_splice($files, $i, 1);
|
1224 |
+
$maxfor--;
|
1225 |
+
$i--;
|
1226 |
+
|
1227 |
+
continue;
|
1228 |
+
}
|
1229 |
+
|
1230 |
+
if ($abis && Scanner::equalFolder(basename($files[$i]), $abres)) {
|
1231 |
+
$progress->log(__("Removing file from backup (due to exclude rules): ", 'backup-migration') . $files[$i], 'WARN');
|
1232 |
+
array_splice($files, $i, 1);
|
1233 |
+
$maxfor--;
|
1234 |
+
$i--;
|
1235 |
+
|
1236 |
+
continue;
|
1237 |
+
}
|
1238 |
+
|
1239 |
+
if ($acis && property_exists($acres, $files[$i])) {
|
1240 |
+
$progress->log(__("Removing file from backup (due to path rules): ", 'backup-migration') . $files[$i], 'WARN');
|
1241 |
+
array_splice($files, $i, 1);
|
1242 |
+
$maxfor--;
|
1243 |
+
$i--;
|
1244 |
+
|
1245 |
+
continue;
|
1246 |
+
}
|
1247 |
+
|
1248 |
+
$total_size += $size;
|
1249 |
+
}
|
1250 |
+
|
1251 |
+
|
1252 |
+
$this->total_size_for_backup = $total_size;
|
1253 |
+
$this->total_size_for_backup_in_mb = ($total_size / 1024 / 1024);
|
1254 |
+
|
1255 |
+
return $files;
|
1256 |
+
}
|
1257 |
+
|
1258 |
+
public function toggleBackupLock($unlock = false) {
|
1259 |
+
|
1260 |
+
// Require lib
|
1261 |
+
require_once BMI_INCLUDES . '/zipper/zipping.php';
|
1262 |
+
|
1263 |
+
// Backup name
|
1264 |
+
$filename = $this->post['filename'];
|
1265 |
+
|
1266 |
+
// Init Zipper
|
1267 |
+
$zipper = new Zipper();
|
1268 |
+
|
1269 |
+
// Path to Backup
|
1270 |
+
$path = BMI_BACKUPS . DIRECTORY_SEPARATOR . $filename;
|
1271 |
+
$path_dir = BMP::fixSlashes(dirname($path));
|
1272 |
+
|
1273 |
+
// Check if file exists
|
1274 |
+
if (!file_exists($path)) {
|
1275 |
+
return ['status' => 'fail'];
|
1276 |
+
}
|
1277 |
+
|
1278 |
+
// Check if directory is correct
|
1279 |
+
if ($path_dir != BMP::fixSlashes(BMI_BACKUPS)) {
|
1280 |
+
return ['status' => 'fail'];
|
1281 |
+
}
|
1282 |
+
|
1283 |
+
// Toggle the lock
|
1284 |
+
$status = $zipper->lock_zip($path, $unlock);
|
1285 |
+
|
1286 |
+
// Return the status
|
1287 |
+
return ['status' => ($status ? 'success' : 'fail')];
|
1288 |
+
}
|
1289 |
+
|
1290 |
+
public function getDynamicNames() {
|
1291 |
+
$data = Dashboard\bmi_get_config('BACKUP:FILES::FILTER:NAMES:IN');
|
1292 |
+
$fpdata = Dashboard\bmi_get_config('BACKUP:FILES::FILTER:FPATHS:IN');
|
1293 |
+
$fddata = Dashboard\bmi_get_config('BACKUP:FILES::FILTER:DPATHS:IN');
|
1294 |
+
|
1295 |
+
for ($i = 0; $i < sizeof($fpdata); ++$i) {
|
1296 |
+
$fpdata[$i] = BMP::fixSlashes($fpdata[$i]);
|
1297 |
+
}
|
1298 |
+
|
1299 |
+
for ($i = 0; $i < sizeof($fddata); ++$i) {
|
1300 |
+
$fddata[$i] = BMP::fixSlashes($fddata[$i]);
|
1301 |
+
}
|
1302 |
+
|
1303 |
+
return [
|
1304 |
+
'status' => 'success',
|
1305 |
+
'dynamic-fpaths-names' => $fpdata,
|
1306 |
+
'dynamic-dpaths-names' => $fddata,
|
1307 |
+
'data' => $data
|
1308 |
+
];
|
1309 |
+
}
|
1310 |
+
|
1311 |
+
public function resetConfiguration() {
|
1312 |
+
if (file_exists(BMI_CONFIG_PATH)) {
|
1313 |
+
unlink(BMI_CONFIG_PATH);
|
1314 |
+
}
|
1315 |
+
|
1316 |
+
return ['status' => 'success'];
|
1317 |
+
}
|
1318 |
+
|
1319 |
+
public function getSiteData() {
|
1320 |
+
require_once BMI_INCLUDES . '/check/system_info.php';
|
1321 |
+
$bmi = new SI();
|
1322 |
+
$bmi = $bmi->to_array();
|
1323 |
+
|
1324 |
+
return ['status' => 'success', 'data' => $bmi];
|
1325 |
+
}
|
1326 |
+
|
1327 |
+
public function calculateCron() {
|
1328 |
+
require_once BMI_INCLUDES . '/cron/handler.php';
|
1329 |
+
|
1330 |
+
$minutes = [];
|
1331 |
+
$keeps = [];
|
1332 |
+
$days = [];
|
1333 |
+
$weeks = [];
|
1334 |
+
$hours = [];
|
1335 |
+
|
1336 |
+
for ($i = 1; $i <= 28; ++$i) {
|
1337 |
+
$days[] = substr('0' . $i, -2);
|
1338 |
+
}
|
1339 |
+
for ($i = 1; $i <= 7; ++$i) {
|
1340 |
+
$weeks[] = $i . '';
|
1341 |
+
}
|
1342 |
+
for ($i = 0; $i <= 23; ++$i) {
|
1343 |
+
$hours[] = substr('0' . $i, -2);
|
1344 |
+
}
|
1345 |
+
for ($i = 0; $i <= 55; $i += 5) {
|
1346 |
+
$minutes[] = substr('0' . $i, -2);
|
1347 |
+
}
|
1348 |
+
for ($i = 1; $i <= 20; ++$i) {
|
1349 |
+
$keeps[] = $i . '';
|
1350 |
+
}
|
1351 |
+
|
1352 |
+
$errors = 0;
|
1353 |
+
if (in_array($this->post['type'], ['month', 'week', 'day'])) {
|
1354 |
+
if (!Dashboard\bmi_set_config('CRON:TYPE', $this->post['type'])) {
|
1355 |
+
$errors++;
|
1356 |
+
}
|
1357 |
+
}
|
1358 |
+
if (in_array($this->post['day'], $days)) {
|
1359 |
+
if (!Dashboard\bmi_set_config('CRON:DAY', $this->post['day'])) {
|
1360 |
+
$errors++;
|
1361 |
+
}
|
1362 |
+
}
|
1363 |
+
if (in_array($this->post['week'], $weeks)) {
|
1364 |
+
if (!Dashboard\bmi_set_config('CRON:WEEK', $this->post['week'])) {
|
1365 |
+
$errors++;
|
1366 |
+
}
|
1367 |
+
}
|
1368 |
+
if (in_array($this->post['hour'], $hours)) {
|
1369 |
+
if (!Dashboard\bmi_set_config('CRON:HOUR', $this->post['hour'])) {
|
1370 |
+
$errors++;
|
1371 |
+
}
|
1372 |
+
}
|
1373 |
+
if (in_array($this->post['minute'], $minutes)) {
|
1374 |
+
if (!Dashboard\bmi_set_config('CRON:MINUTE', $this->post['minute'])) {
|
1375 |
+
$errors++;
|
1376 |
+
}
|
1377 |
+
}
|
1378 |
+
if (in_array($this->post['keep'], $keeps)) {
|
1379 |
+
if (!Dashboard\bmi_set_config('CRON:KEEP', $this->post['keep'])) {
|
1380 |
+
$errors++;
|
1381 |
+
}
|
1382 |
+
}
|
1383 |
+
|
1384 |
+
if ($this->post['enabled'] === 'true') {
|
1385 |
+
$this->post['enabled'] = true;
|
1386 |
+
} else {
|
1387 |
+
$this->post['enabled'] = false;
|
1388 |
+
}
|
1389 |
+
|
1390 |
+
if (!Dashboard\bmi_set_config('CRON:ENABLED', $this->post['enabled'])) {
|
1391 |
+
$errors++;
|
1392 |
+
}
|
1393 |
+
|
1394 |
+
if ($errors === 0) {
|
1395 |
+
$time = Crons::calculate_date([
|
1396 |
+
'type' => $this->post['type'],
|
1397 |
+
'week' => $this->post['week'],
|
1398 |
+
'day' => $this->post['day'],
|
1399 |
+
'hour' => $this->post['hour'],
|
1400 |
+
'minute' => $this->post['minute']
|
1401 |
+
], time());
|
1402 |
+
|
1403 |
+
$file = BMI_INCLUDES . '/htaccess/.plan';
|
1404 |
+
if (file_exists($file)) {
|
1405 |
+
$earlier = intval(file_get_contents($file));
|
1406 |
+
} else {
|
1407 |
+
$earlier = 0;
|
1408 |
+
}
|
1409 |
+
|
1410 |
+
if (!wp_next_scheduled('bmi_do_backup_right_now') || $earlier === 0 || (abs($time - $earlier) >= 15)) {
|
1411 |
+
wp_clear_scheduled_hook('bmi_do_backup_right_now');
|
1412 |
+
if ($this->post['enabled'] === true) {
|
1413 |
+
wp_schedule_single_event($time, 'bmi_do_backup_right_now');
|
1414 |
+
file_put_contents($file, $time);
|
1415 |
+
}
|
1416 |
+
}
|
1417 |
+
|
1418 |
+
return [
|
1419 |
+
'status' => 'success',
|
1420 |
+
'data' => date('Y-m-d H:i:s', $time),
|
1421 |
+
'currdata' => date('Y-m-d H:i:s')
|
1422 |
+
];
|
1423 |
+
} else {
|
1424 |
+
return ['status' => 'error'];
|
1425 |
+
}
|
1426 |
+
}
|
1427 |
+
|
1428 |
+
public function dismissErrorNotice() {
|
1429 |
+
delete_option('bmi_display_email_issues');
|
1430 |
+
}
|
1431 |
+
|
1432 |
+
public function debugging() {
|
1433 |
+
}
|
1434 |
+
}
|
includes/check/checker.php
ADDED
@@ -0,0 +1,110 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
// Namespace
|
4 |
+
namespace BMI\Plugin\Checker;
|
5 |
+
|
6 |
+
// Use
|
7 |
+
use BMI\Plugin\BMI_Logger AS Logger;
|
8 |
+
use BMI\Plugin\Progress\BMI_ZipProgress AS Progress;
|
9 |
+
|
10 |
+
// Exit on direct access
|
11 |
+
if (!defined('ABSPATH')) exit;
|
12 |
+
|
13 |
+
/**
|
14 |
+
* BMI_Checker
|
15 |
+
*/
|
16 |
+
class BMI_Checker {
|
17 |
+
|
18 |
+
function __construct($progress = false) {
|
19 |
+
|
20 |
+
$this->issues = array();
|
21 |
+
$this->progress = $progress;
|
22 |
+
|
23 |
+
}
|
24 |
+
|
25 |
+
public function make_backup_check() {
|
26 |
+
|
27 |
+
}
|
28 |
+
|
29 |
+
public function make_restore_check() {
|
30 |
+
|
31 |
+
}
|
32 |
+
|
33 |
+
public function logs($log, $status = 'INFO') {
|
34 |
+
|
35 |
+
if ($this->progress) {
|
36 |
+
$this->progress->log($log, $status);
|
37 |
+
}
|
38 |
+
|
39 |
+
}
|
40 |
+
|
41 |
+
public function is_enabled($func) {
|
42 |
+
|
43 |
+
$disabled = explode(',', ini_get('disable_functions'));
|
44 |
+
return !in_array($func, $disabled);
|
45 |
+
|
46 |
+
}
|
47 |
+
|
48 |
+
public function check_free_space($size) {
|
49 |
+
|
50 |
+
$this->logs('Requires at least ' . $size . ' bytes.');
|
51 |
+
if ($this->is_enabled('disk_free_space')) {
|
52 |
+
|
53 |
+
$this->logs(__('Disk free space function is not disabled - using...', 'backup-migration'));
|
54 |
+
$free = intval(disk_free_space(BMI_BACKUPS));
|
55 |
+
$this->logs(__('There is ', 'backup-migration') . number_format($free / 1024 / 1024, 2) . __(' MB free.', 'backup-migration'), 'SUCCESS');
|
56 |
+
if ($free > $size) {
|
57 |
+
$this->logs(__('Great! We have enough space.', 'backup-migration'), 'SUCCESS');
|
58 |
+
return true;
|
59 |
+
} else {
|
60 |
+
return false;
|
61 |
+
}
|
62 |
+
|
63 |
+
} else {
|
64 |
+
|
65 |
+
// Log
|
66 |
+
$this->logs(__('Disk free space function is disabled by hosting.', 'backup-migration'));
|
67 |
+
$this->logs(__('Using dummy file to check free space (it can take some time).', 'backup-migration'));
|
68 |
+
|
69 |
+
// TMP Filename
|
70 |
+
$file = BMI_BACKUPS . '/' . '.space_check';
|
71 |
+
try {
|
72 |
+
|
73 |
+
// 2 GB = (1024 * 1024 * 1024 * 2)
|
74 |
+
$total = $size;
|
75 |
+
|
76 |
+
$fh = fopen($file, 'w');
|
77 |
+
$chunk = 1024;
|
78 |
+
while ($size > 0) {
|
79 |
+
fputs($fh, str_pad('', min($chunk, $size)));
|
80 |
+
$size -= $chunk;
|
81 |
+
}
|
82 |
+
fclose($fh);
|
83 |
+
|
84 |
+
$fs = filesize($file);
|
85 |
+
@unlink($file);
|
86 |
+
|
87 |
+
if ($fs > ($total - 100)) return true;
|
88 |
+
else return false;
|
89 |
+
|
90 |
+
} catch (\Exception $e) {
|
91 |
+
|
92 |
+
Logger::error($e);
|
93 |
+
if (file_exists($file)) unlink($file);
|
94 |
+
|
95 |
+
return false;
|
96 |
+
|
97 |
+
} catch (\Throwable $e) {
|
98 |
+
|
99 |
+
Logger::error($e);
|
100 |
+
if (file_exists($file)) unlink($file);
|
101 |
+
|
102 |
+
return false;
|
103 |
+
|
104 |
+
}
|
105 |
+
|
106 |
+
}
|
107 |
+
|
108 |
+
}
|
109 |
+
|
110 |
+
}
|
includes/check/system_info.php
ADDED
@@ -0,0 +1,497 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
// Namespace
|
4 |
+
namespace BMI\Plugin\Checker;
|
5 |
+
|
6 |
+
// Use
|
7 |
+
use BMI\Plugin\Backup_Migration_Plugin as BMP;
|
8 |
+
use BMI\Plugin\BMI_Logger as Logger;
|
9 |
+
|
10 |
+
/**
|
11 |
+
* Class System_Info
|
12 |
+
*/
|
13 |
+
class System_Info {
|
14 |
+
/**
|
15 |
+
* Get the available memory
|
16 |
+
*
|
17 |
+
* @var float|int // flot|int
|
18 |
+
*/
|
19 |
+
protected $memory_available;
|
20 |
+
|
21 |
+
/**
|
22 |
+
* Get the PHP version
|
23 |
+
*
|
24 |
+
* @var float // Version
|
25 |
+
*/
|
26 |
+
protected $php_version;
|
27 |
+
|
28 |
+
/**
|
29 |
+
* Get the MySQL version
|
30 |
+
*
|
31 |
+
* @var float // MySQL version
|
32 |
+
*/
|
33 |
+
protected $mysql_version;
|
34 |
+
|
35 |
+
/**
|
36 |
+
* Get the webserver
|
37 |
+
*
|
38 |
+
* @var String // webserver used.
|
39 |
+
*/
|
40 |
+
protected $webserver;
|
41 |
+
|
42 |
+
/**
|
43 |
+
* Get the Operating Server
|
44 |
+
*
|
45 |
+
* @var String // OS used.
|
46 |
+
*/
|
47 |
+
protected $os;
|
48 |
+
/**
|
49 |
+
* Get the Free Space After Backup
|
50 |
+
*
|
51 |
+
* @var false|float|int
|
52 |
+
*/
|
53 |
+
protected $free_space_after_backup;
|
54 |
+
|
55 |
+
public function is_enabled($func) {
|
56 |
+
$disabled = explode(',', ini_get('disable_functions'));
|
57 |
+
|
58 |
+
return !in_array($func, $disabled);
|
59 |
+
}
|
60 |
+
|
61 |
+
/**
|
62 |
+
* Get the timezone from WordPress details.
|
63 |
+
*
|
64 |
+
* @return String // timezone
|
65 |
+
*/
|
66 |
+
public function get_timezone() {
|
67 |
+
if (! isset($this->timezone)) {
|
68 |
+
if (function_exists('wp_timezone')) {
|
69 |
+
$this->timezone = wp_timezone()->getName();
|
70 |
+
} else {
|
71 |
+
$date = new \DateTime();
|
72 |
+
$time_zone = $date->getTimezone();
|
73 |
+
$this->timezone = $time_zone->getName();
|
74 |
+
}
|
75 |
+
}
|
76 |
+
|
77 |
+
return $this->timezone;
|
78 |
+
}
|
79 |
+
|
80 |
+
/**
|
81 |
+
* Get the Webserver by executing shell details.
|
82 |
+
*
|
83 |
+
* @return String // webserver name
|
84 |
+
*/
|
85 |
+
public function get_webserver() {
|
86 |
+
if (! isset($this->webserver)) {
|
87 |
+
if (isset($_SERVER['SERVER_SOFTWARE'])) {
|
88 |
+
$this->webserver = sanitize_text_field(wp_unslash($_SERVER['SERVER_SOFTWARE']));
|
89 |
+
}
|
90 |
+
}
|
91 |
+
|
92 |
+
return $this->webserver;
|
93 |
+
}
|
94 |
+
|
95 |
+
/**
|
96 |
+
* Get the Webserver from phpinfo details.
|
97 |
+
*
|
98 |
+
* @return String // os fingureprint
|
99 |
+
*/
|
100 |
+
public function get_os() {
|
101 |
+
if ($this->is_enabled('php_uname')) {
|
102 |
+
if (! isset($this->os)) {
|
103 |
+
$this->os = strtolower(php_uname('s'));
|
104 |
+
}
|
105 |
+
|
106 |
+
return $this->os;
|
107 |
+
} else {
|
108 |
+
return __('Blocked by hosting', 'backup-migration');
|
109 |
+
}
|
110 |
+
}
|
111 |
+
|
112 |
+
/**
|
113 |
+
* Get the homeurl from WordPress details.
|
114 |
+
*
|
115 |
+
* @return String // os
|
116 |
+
*/
|
117 |
+
public function get_operating_system() {
|
118 |
+
if ($this->is_enabled('php_uname')) {
|
119 |
+
if (! isset($this->operating_system)) {
|
120 |
+
$this->operating_system = php_uname('s') . ' ' . php_uname('v');
|
121 |
+
}
|
122 |
+
|
123 |
+
return $this->operating_system;
|
124 |
+
} else {
|
125 |
+
return __('Blocked by hosting', 'backup-migration');
|
126 |
+
}
|
127 |
+
}
|
128 |
+
|
129 |
+
/**
|
130 |
+
* Get the upload directory url from WordPress details.
|
131 |
+
*
|
132 |
+
* @return String // upload directory url
|
133 |
+
*/
|
134 |
+
public function get_upload_dir_url() {
|
135 |
+
if (! isset($this->upload_dir_url)) {
|
136 |
+
$upload_dir_url = wp_get_upload_dir();
|
137 |
+
$this->upload_dir_url = $upload_dir_url['baseurl'];
|
138 |
+
}
|
139 |
+
|
140 |
+
return $this->upload_dir_url;
|
141 |
+
}
|
142 |
+
|
143 |
+
/**
|
144 |
+
* Get the content directory
|
145 |
+
*
|
146 |
+
* @return String // content directory
|
147 |
+
*/
|
148 |
+
public function get_content_dir() {
|
149 |
+
if (! isset($this->content_dir)) {
|
150 |
+
$content_dir = plugin_dir_path(WP_CONTENT_DIR . '/' . 'plugins/');
|
151 |
+
$this->content_dir = $content_dir;
|
152 |
+
}
|
153 |
+
|
154 |
+
return $this->content_dir;
|
155 |
+
}
|
156 |
+
|
157 |
+
/**
|
158 |
+
* Get the plugin directory from WordPress details.
|
159 |
+
*
|
160 |
+
* @return String // plugin directory
|
161 |
+
*/
|
162 |
+
public function get_plugin_dir() {
|
163 |
+
if (! isset($this->plugin_dir)) {
|
164 |
+
$plugin_dir = plugin_dir_path(WP_CONTENT_DIR . '/plugins/plugin-folder');
|
165 |
+
$this->plugin_dir = $plugin_dir;
|
166 |
+
}
|
167 |
+
|
168 |
+
return $this->plugin_dir;
|
169 |
+
}
|
170 |
+
|
171 |
+
/**
|
172 |
+
* Get the active plugins.
|
173 |
+
*
|
174 |
+
* @return String // active plugins
|
175 |
+
*/
|
176 |
+
public function get_active_plugins_info() {
|
177 |
+
if (! isset($this->active_plugins)) {
|
178 |
+
$active_plugins = get_option('active_plugins', false);
|
179 |
+
|
180 |
+
$arr_active_plugins = [];
|
181 |
+
|
182 |
+
foreach ($active_plugins as $path) {
|
183 |
+
$arr_data = [];
|
184 |
+
if (! function_exists('get_plugin_data')) {
|
185 |
+
require_once ABSPATH . 'wp-admin/includes/plugin.php';
|
186 |
+
}
|
187 |
+
$plugin_data = get_plugin_data(WP_PLUGIN_DIR . '/' . $path);
|
188 |
+
if (
|
189 |
+
isset($plugin_data['Name']) && ! empty($plugin_data['Name'])
|
190 |
+
&& isset($plugin_data['Version']) && ! empty($plugin_data['Version'])
|
191 |
+
) {
|
192 |
+
$arr_data['name'] = $plugin_data['Name'];
|
193 |
+
$arr_data['version'] = $plugin_data['Version'];
|
194 |
+
$arr_data['slug'] = $plugin_data['TextDomain'];
|
195 |
+
|
196 |
+
array_push($arr_active_plugins, $arr_data);
|
197 |
+
unset($arr_data);
|
198 |
+
}
|
199 |
+
}
|
200 |
+
$this->active_plugins = $arr_active_plugins;
|
201 |
+
}
|
202 |
+
|
203 |
+
return $this->active_plugins;
|
204 |
+
}
|
205 |
+
|
206 |
+
/**
|
207 |
+
* Get the check multisite.
|
208 |
+
*
|
209 |
+
* @return bool // check multisite
|
210 |
+
*/
|
211 |
+
public function check_multisite() {
|
212 |
+
if (! isset($this->is_multisite)) {
|
213 |
+
$this->is_multisite = is_multisite();
|
214 |
+
}
|
215 |
+
|
216 |
+
return $this->is_multisite;
|
217 |
+
}
|
218 |
+
|
219 |
+
/**
|
220 |
+
* Get the disk free space
|
221 |
+
*
|
222 |
+
* @return float // disk free space
|
223 |
+
*/
|
224 |
+
public function get_disk_free_space() {
|
225 |
+
if ($this->is_enabled('disk_free_space')) {
|
226 |
+
if (! isset($this->disk_free_space)) {
|
227 |
+
$this->disk_free_space = disk_free_space(getcwd());
|
228 |
+
}
|
229 |
+
|
230 |
+
return $this->disk_free_space;
|
231 |
+
} else {
|
232 |
+
return __('Blocked by hosting', 'backup-migration');
|
233 |
+
}
|
234 |
+
}
|
235 |
+
|
236 |
+
/**
|
237 |
+
* Get the php version
|
238 |
+
*
|
239 |
+
* @return String // php version
|
240 |
+
*/
|
241 |
+
public function get_php_version() {
|
242 |
+
if (! isset($this->php_version)) {
|
243 |
+
$this->php_version = explode(' ', phpversion())[0];
|
244 |
+
}
|
245 |
+
|
246 |
+
return $this->php_version;
|
247 |
+
}
|
248 |
+
|
249 |
+
/**
|
250 |
+
* Get the php loaded extensions
|
251 |
+
*
|
252 |
+
* @return String // php loaded extensions
|
253 |
+
*/
|
254 |
+
public function get_php_loaded_extensions() {
|
255 |
+
if (! isset($this->php_loaded_extensions)) {
|
256 |
+
$this->php_loaded_extensions = get_loaded_extensions();
|
257 |
+
}
|
258 |
+
|
259 |
+
return $this->php_loaded_extensions;
|
260 |
+
}
|
261 |
+
|
262 |
+
/**
|
263 |
+
* Get the disable functions
|
264 |
+
*
|
265 |
+
* @return String // disable functions
|
266 |
+
*/
|
267 |
+
public function get_php_disable_functions() {
|
268 |
+
if (! isset($this->disable_functions)) {
|
269 |
+
$this->disable_functions = explode(',', ini_get('disable_functions'));
|
270 |
+
}
|
271 |
+
|
272 |
+
return $this->disable_functions;
|
273 |
+
}
|
274 |
+
|
275 |
+
/**
|
276 |
+
* Get the backtrack limit
|
277 |
+
*
|
278 |
+
* @return String // backtrack limit
|
279 |
+
*/
|
280 |
+
public function get_backtrack_limit() {
|
281 |
+
if (! isset($this->backtrack_limit)) {
|
282 |
+
$this->backtrack_limit = (int) ini_get('pcre.backtrack_limit');
|
283 |
+
}
|
284 |
+
|
285 |
+
return $this->backtrack_limit;
|
286 |
+
}
|
287 |
+
|
288 |
+
/**
|
289 |
+
* Get the is mysql character set
|
290 |
+
*
|
291 |
+
* @return String // mysql character set
|
292 |
+
*/
|
293 |
+
public function get_mysql_character_set() {
|
294 |
+
global $wpdb;
|
295 |
+
if (! isset($this->get_mysql_character_set)) {
|
296 |
+
$charset_query = $wpdb->get_charset_collate();
|
297 |
+
$matches = [];
|
298 |
+
preg_match('/SET\s+(\w+)/', $charset_query, $matches);
|
299 |
+
if (count($matches) > 1) {
|
300 |
+
return $matches[1];
|
301 |
+
}
|
302 |
+
}
|
303 |
+
|
304 |
+
return '';
|
305 |
+
}
|
306 |
+
|
307 |
+
/**
|
308 |
+
* Get the is get active_themes_info
|
309 |
+
*
|
310 |
+
* @return String // active_themes_info
|
311 |
+
*/
|
312 |
+
public function get_active_themes_info() {
|
313 |
+
if (! isset($this->wp_active_themes_info)) {
|
314 |
+
$arr_active_themes = [];
|
315 |
+
$theme = wp_get_theme();
|
316 |
+
$theme_name = $theme->get('TextDomain');
|
317 |
+
$theme_version = $theme->get('TextDomain');
|
318 |
+
if (
|
319 |
+
isset($theme_name) && ! empty($theme_name)
|
320 |
+
&& isset($theme_version) && ! empty($theme_version)
|
321 |
+
) {
|
322 |
+
$arr_data['name'] = $theme->get('Name');
|
323 |
+
$arr_data['version'] = $theme->get('Version');
|
324 |
+
$arr_data['slug'] = $theme->get('TextDomain');
|
325 |
+
|
326 |
+
array_push($arr_active_themes, $arr_data);
|
327 |
+
unset($arr_data);
|
328 |
+
}
|
329 |
+
$this->wp_active_themes_info = $arr_active_themes;
|
330 |
+
}
|
331 |
+
|
332 |
+
return $this->wp_active_themes_info;
|
333 |
+
}
|
334 |
+
|
335 |
+
/**
|
336 |
+
* Get the is get php_version_primary()
|
337 |
+
*
|
338 |
+
* @return String // php_version_primary()
|
339 |
+
*/
|
340 |
+
public function get_php_version_primary() {
|
341 |
+
if (! isset($this->php_version_primary)) {
|
342 |
+
$this->php_version_primary = explode('.', $this->get_php_version());
|
343 |
+
|
344 |
+
return $this->php_version_primary[0];
|
345 |
+
}
|
346 |
+
}
|
347 |
+
|
348 |
+
/**
|
349 |
+
* Get the is get php_version_secondary()
|
350 |
+
*
|
351 |
+
* @return String // php_version_secondary()
|
352 |
+
*/
|
353 |
+
public function get_php_version_secondary() {
|
354 |
+
if (! isset($this->php_version_secondary)) {
|
355 |
+
$this->php_version_secondary = explode('.', $this->get_php_version());
|
356 |
+
|
357 |
+
return $this->php_version_secondary[1];
|
358 |
+
}
|
359 |
+
}
|
360 |
+
|
361 |
+
/**
|
362 |
+
* Get the is get php_version_minor()
|
363 |
+
*
|
364 |
+
* @return String // php_version_minor()
|
365 |
+
*/
|
366 |
+
public function get_php_version_minor() {
|
367 |
+
if (! isset($this->php_version_minor)) {
|
368 |
+
$this->php_version_minor = explode('.', $this->get_php_version());
|
369 |
+
|
370 |
+
return $this->php_version_minor[2];
|
371 |
+
}
|
372 |
+
}
|
373 |
+
|
374 |
+
/**
|
375 |
+
* Get changes human redeable sizes to numbers()
|
376 |
+
*
|
377 |
+
* @param String $num // readble size to be converted to byte
|
378 |
+
*
|
379 |
+
* @return number // readble_size_to_bytes()
|
380 |
+
*/
|
381 |
+
public function readble_size_to_bytes($num) {
|
382 |
+
$num_split = str_split(strval(strtolower($num)));
|
383 |
+
$num_split_temp = $num_split;
|
384 |
+
$num_end = end($num_split);
|
385 |
+
array_pop($num_split);
|
386 |
+
$num_join = implode('', $num_split);
|
387 |
+
if ('m' === $num_end) {
|
388 |
+
$num = doubleval($num_join) * 1048576;
|
389 |
+
} elseif ('k' === $num_end) {
|
390 |
+
$num = doubleval($num_join) * 1024;
|
391 |
+
} elseif ('g' === $num_end) {
|
392 |
+
$num = doubleval($num_join) * 1073741824;
|
393 |
+
}
|
394 |
+
|
395 |
+
return $num;
|
396 |
+
}
|
397 |
+
|
398 |
+
/**
|
399 |
+
* List of system information.
|
400 |
+
*
|
401 |
+
* @return array // List of system information
|
402 |
+
*/
|
403 |
+
public function to_array() {
|
404 |
+
global $wpdb;
|
405 |
+
if (function_exists('curl_version')) {
|
406 |
+
$curl_version = curl_version();
|
407 |
+
} else {
|
408 |
+
$curl_version = [];
|
409 |
+
}
|
410 |
+
|
411 |
+
return [
|
412 |
+
// WP related.
|
413 |
+
'wp_version' => get_bloginfo('version'),
|
414 |
+
'wp_site_url' => \site_url(),
|
415 |
+
'wp_timezone' => $this->get_timezone(),
|
416 |
+
'wp_blog_time' => time(),
|
417 |
+
'wp_root_dir' => ABSPATH,
|
418 |
+
'wp_language' => get_bloginfo('language'),
|
419 |
+
'wp_cache' => defined('WP_CACHE') ? WP_CACHE : null,
|
420 |
+
'wp_fs_method' => defined('FS_METHOD') ? FS_METHOD : null,
|
421 |
+
'wp_db_charset' => defined('DB_CHARSET') ? DB_CHARSET : null,
|
422 |
+
'wp_db_collate' => defined('DB_COLLATE') ? DB_COLLATE : null,
|
423 |
+
'wp_debug' => defined('WP_DEBUG') ? WP_DEBUG : null,
|
424 |
+
'wp_debug_log' => defined('WP_DEBUG_LOG') ? WP_DEBUG_LOG : null,
|
425 |
+
'wp_debug_display' => defined('WP_DEBUG_DISPLAY') ? WP_DEBUG_DISPLAY : null,
|
426 |
+
'wp_script_debug' => defined('SCRIPT_DEBUG') ? SCRIPT_DEBUG : null,
|
427 |
+
// 'wp_content_dir' => File_System::normalize_path( $this->get_content_dir() ),
|
428 |
+
// 'wp_plugin_dir' => ( new File_System() )->get_plugin_root_directory(),
|
429 |
+
// 'wp_theme_dir' => ( new File_System() )->get_theme_root_directory(),
|
430 |
+
// 'wp_upload_dir' => ( new File_System() )->get_upload_directory(),
|
431 |
+
'wp_upload_dir_url' => $this->get_upload_dir_url(),
|
432 |
+
'wp_multisite_enabled' => $this->check_multisite(),
|
433 |
+
'wp_memory_limit_readable' => defined('WP_MEMORY_LIMIT') ? WP_MEMORY_LIMIT : null,
|
434 |
+
'wp_memory_limit_bytes' => defined('WP_MEMORY_LIMIT') ? $this->readble_size_to_bytes(WP_MEMORY_LIMIT) : null,
|
435 |
+
'wp_max_memory_limit_readble' => defined('WP_MAX_MEMORY_LIMIT') ? WP_MAX_MEMORY_LIMIT : null,
|
436 |
+
'wp_max_memory_limit_bytes' => defined('WP_MAX_MEMORY_LIMIT') ? $this->readble_size_to_bytes(WP_MAX_MEMORY_LIMIT) : null,
|
437 |
+
'wp_active_plugins_info' => $this->get_active_plugins_info(),
|
438 |
+
'wp_alternative_cron_enabled' => defined('ALTERNATE_WP_CRON') ? ALTERNATE_WP_CRON : null,
|
439 |
+
'wp_cron_enabled' => defined('DISABLE_WP_CRON') ? false : true,
|
440 |
+
'wp_cron_lock_timeout' => defined('WP_CRON_LOCK_TIMEOUT') ? WP_CRON_LOCK_TIMEOUT : null,
|
441 |
+
'wp_cron_job_running' => defined('DOING_CRON') ? DOING_CRON : false,
|
442 |
+
'wp_http_block_external' => defined('WP_HTTP_BLOCK_EXTERNAL') ? true : false,
|
443 |
+
'wp_automatic_update_disable' => defined('AUTOMATIC_UPDATER_DISABLED') ? true : false,
|
444 |
+
'wp_active_themes_info' => $this->get_active_themes_info(),
|
445 |
+
|
446 |
+
// Webserver related information.
|
447 |
+
'web_server_name' => $this->get_webserver(),
|
448 |
+
'operating_system_short_name' => $this->get_os(),
|
449 |
+
'operating_system_full' => $this->get_operating_system(),
|
450 |
+
'server_ip' => isset($_SERVER['REMOTE_ADDR']) ? sanitize_text_field(wp_unslash($_SERVER['REMOTE_ADDR'])) : null,
|
451 |
+
'temp_folder' => get_temp_dir(),
|
452 |
+
|
453 |
+
// PHP Library related info.
|
454 |
+
|
455 |
+
// Disk & storage related info.
|
456 |
+
'disk_free_space_bytes' => $this->get_disk_free_space(),
|
457 |
+
|
458 |
+
'disk_free_space_readable' => (($this->is_enabled('disk_total_space')) ? BMP::humanSize($this->get_disk_free_space()) : __('Blocked by hosting', 'backup-migration')),
|
459 |
+
'dir_disk_space_bytes' => (($this->is_enabled('disk_total_space')) ? disk_total_space(ABSPATH) : __('Blocked by hosting', 'backup-migration')),
|
460 |
+
'dir_disk_space_readable' => (($this->is_enabled('disk_total_space')) ? BMP::humanSize(disk_total_space(ABSPATH)) : __('Blocked by hosting', 'backup-migration')),
|
461 |
+
|
462 |
+
// PHP Configuration information.
|
463 |
+
'php_memory_limit_bytes' => $this->readble_size_to_bytes(ini_get('memory_limit')),
|
464 |
+
'php_memory_limit_readable' => ini_get('memory_limit'),
|
465 |
+
'php_max_execution_time' => ini_get('max_execution_time'),
|
466 |
+
'php_upload_max_filesize_bytes' => $this->readble_size_to_bytes(ini_get('upload_max_filesize')),
|
467 |
+
'php_upload_max_filesize_readable' => ini_get('upload_max_filesize'),
|
468 |
+
'php_max_input_vars' => (int) ini_get('max_input_vars'),
|
469 |
+
'php_post_max_size_bytes' => $this->readble_size_to_bytes(ini_get('post_max_size')),
|
470 |
+
'php_post_max_size_readable' => ini_get('post_max_size'),
|
471 |
+
|
472 |
+
'php_version_primary' => $this->get_php_version_primary(),
|
473 |
+
'php_version_secondary' => $this->get_php_version_secondary(),
|
474 |
+
'php_version_minor' => $this->get_php_version_minor(),
|
475 |
+
'php_version_full' => $this->get_php_version(),
|
476 |
+
|
477 |
+
'php_sapi' => php_sapi_name(),
|
478 |
+
'php_allow_url_fopen' => ini_get('allow_url_fopen') === 1 ? true : false,
|
479 |
+
'php_loaded_extensions' => $this->get_php_loaded_extensions(),
|
480 |
+
'php_disable_functions' => $this->get_php_disable_functions(),
|
481 |
+
'php_xml_support' => extension_loaded('xml'),
|
482 |
+
'php_backtrack_limit' => $this->get_backtrack_limit(),
|
483 |
+
'php_fast_cgi' => strpos(php_sapi_name(), 'fcgi') !== false, // for some it was coming fpm-fcgi and on some cgi-fcgi so changed to account for both.
|
484 |
+
'php_zip_archive_class_exists' => class_exists('ZipArchive'),
|
485 |
+
'php_mcrypt_exists' => extension_loaded('mcrypt'),
|
486 |
+
|
487 |
+
// MySql Configuration information.
|
488 |
+
'mysql_version' => $wpdb->db_version(),
|
489 |
+
'mysql_character_set' => $this->get_mysql_character_set(),
|
490 |
+
|
491 |
+
'curl_version' => isset($curl_version['version']) ? $curl_version['version'] : null,
|
492 |
+
'curl_ssl_enabled' => isset($curl_version['features']) ? (bool) ($curl_version['features'] & 4) : false,
|
493 |
+
'php_open_ssl_version_text' => isset($curl_version['ssl_version']) ? $curl_version['ssl_version'] : null,
|
494 |
+
'php_open_ssl_version_number' => isset($curl_version['ssl_version_number']) ? $curl_version['ssl_version_number'] : null,
|
495 |
+
];
|
496 |
+
}
|
497 |
+
}
|
includes/config.php
ADDED
@@ -0,0 +1,158 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
// Namespace
|
4 |
+
namespace BMI\Plugin\Dashboard;
|
5 |
+
|
6 |
+
// Exit on direct access
|
7 |
+
if (!defined('ABSPATH')) exit;
|
8 |
+
|
9 |
+
if (!function_exists('bmi_get_config')) {
|
10 |
+
function bmi_get_config($setting) {
|
11 |
+
|
12 |
+
// Load default and additional
|
13 |
+
$defaults = json_decode(file_get_contents(BMI_CONFIG_DEFAULT));
|
14 |
+
|
15 |
+
// Result default
|
16 |
+
if (isset($defaults->{$setting}))
|
17 |
+
$result = $defaults->{$setting};
|
18 |
+
else $result = array();
|
19 |
+
|
20 |
+
// Load user config
|
21 |
+
if (file_exists(BMI_CONFIG_PATH) && BMI_CONFIG_STATUS) {
|
22 |
+
|
23 |
+
// Get file contents
|
24 |
+
$bmi_config_contents = file_get_contents(BMI_CONFIG_PATH);
|
25 |
+
$bmi_config_json = json_decode($bmi_config_contents);
|
26 |
+
|
27 |
+
// If config is correct set it
|
28 |
+
if (json_last_error() == JSON_ERROR_NONE) {
|
29 |
+
|
30 |
+
// Setting exist?
|
31 |
+
if (isset($bmi_config_json->{$setting})) {
|
32 |
+
|
33 |
+
// Get result
|
34 |
+
$result = $bmi_config_json->{$setting};
|
35 |
+
|
36 |
+
}
|
37 |
+
|
38 |
+
}
|
39 |
+
|
40 |
+
}
|
41 |
+
|
42 |
+
// Replace exceptions
|
43 |
+
if ($setting == 'STORAGE::LOCAL::PATH' && $result == 'default') {
|
44 |
+
$result = BMI_BACKUPS_DEFAULT;
|
45 |
+
}
|
46 |
+
|
47 |
+
// Replace backshashes
|
48 |
+
if ($setting == 'STORAGE::LOCAL::PATH') {
|
49 |
+
$result = str_replace('\\\\', DIRECTORY_SEPARATOR, $result);
|
50 |
+
$result = str_replace('\\', DIRECTORY_SEPARATOR, $result);
|
51 |
+
$result = str_replace('/', DIRECTORY_SEPARATOR, $result);
|
52 |
+
}
|
53 |
+
|
54 |
+
// Return setting
|
55 |
+
return $result;
|
56 |
+
|
57 |
+
}
|
58 |
+
}
|
59 |
+
|
60 |
+
if (!function_exists('bmi_set_config')) {
|
61 |
+
function bmi_set_config($setting, $value) {
|
62 |
+
|
63 |
+
// Load default and additional
|
64 |
+
if (file_exists(BMI_CONFIG_PATH)) {
|
65 |
+
|
66 |
+
// Get file contents
|
67 |
+
$bmi_config_contents = file_get_contents(BMI_CONFIG_PATH);
|
68 |
+
$bmi_config_json = json_decode($bmi_config_contents);
|
69 |
+
|
70 |
+
// Result default
|
71 |
+
$default = bmi_get_config($setting);
|
72 |
+
|
73 |
+
// If config is correct set it
|
74 |
+
if (!(json_last_error() == JSON_ERROR_NONE)) {
|
75 |
+
|
76 |
+
// Setting refill base
|
77 |
+
$bmi_config_json = json_decode(json_encode(array()));;
|
78 |
+
|
79 |
+
}
|
80 |
+
|
81 |
+
// Check if setting is not empty
|
82 |
+
if (isset($value) && (!is_string($value) || strlen(trim($value)) > 0)) {
|
83 |
+
|
84 |
+
// Set new setting
|
85 |
+
@$bmi_config_json->{$setting} = $value;
|
86 |
+
|
87 |
+
} else return false;
|
88 |
+
|
89 |
+
// Write edited settings
|
90 |
+
file_put_contents(BMI_CONFIG_PATH, json_encode($bmi_config_json));
|
91 |
+
return true;
|
92 |
+
|
93 |
+
}
|
94 |
+
|
95 |
+
return false;
|
96 |
+
|
97 |
+
}
|
98 |
+
}
|
99 |
+
|
100 |
+
if (!function_exists('bmi_try_checked')) {
|
101 |
+
function bmi_try_checked($setting, $reversed = false) {
|
102 |
+
|
103 |
+
if (!$reversed) {
|
104 |
+
|
105 |
+
if (bmi_get_config($setting) == 'true' || bmi_get_config($setting) === true) {
|
106 |
+
echo ' checked';
|
107 |
+
} else return false;
|
108 |
+
|
109 |
+
} else {
|
110 |
+
|
111 |
+
if (bmi_get_config($setting) == 'true' || bmi_get_config($setting) === true) {
|
112 |
+
return false;
|
113 |
+
} else {
|
114 |
+
echo ' checked';
|
115 |
+
}
|
116 |
+
|
117 |
+
}
|
118 |
+
|
119 |
+
}
|
120 |
+
}
|
121 |
+
|
122 |
+
if (!function_exists('bmi_try_value')) {
|
123 |
+
function bmi_try_value($setting) {
|
124 |
+
|
125 |
+
$res = bmi_get_config($setting);
|
126 |
+
if ($res !== false) {
|
127 |
+
echo ' value="' . sanitize_text_field($res) . '"';
|
128 |
+
} else echo '';
|
129 |
+
|
130 |
+
}
|
131 |
+
}
|
132 |
+
|
133 |
+
// Get config and parse it
|
134 |
+
if (file_exists(BMI_CONFIG_PATH)) {
|
135 |
+
|
136 |
+
// Get file contents
|
137 |
+
$bmi_config_contents = file_get_contents(BMI_CONFIG_PATH);
|
138 |
+
$bmi_config_json = json_decode($bmi_config_contents);
|
139 |
+
|
140 |
+
// If config is correct set it
|
141 |
+
if (json_last_error() == JSON_ERROR_NONE) {
|
142 |
+
|
143 |
+
if (!defined('BMI_CONFIG_STATUS')) define('BMI_CONFIG_STATUS', true);
|
144 |
+
if (!defined('BMI_BACKUPS')) define('BMI_BACKUPS', bmi_get_config('STORAGE::LOCAL::PATH') . DIRECTORY_SEPARATOR . 'backups');
|
145 |
+
|
146 |
+
} else {
|
147 |
+
|
148 |
+
if (!defined('BMI_CONFIG_STATUS')) define('BMI_CONFIG_STATUS', false);
|
149 |
+
|
150 |
+
}
|
151 |
+
|
152 |
+
} else {
|
153 |
+
|
154 |
+
@mkdir(dirname(BMI_CONFIG_PATH), 0755, true);
|
155 |
+
@copy(BMI_CONFIG_DEFAULT, BMI_CONFIG_PATH);
|
156 |
+
if (!defined('BMI_CONFIG_STATUS')) define('BMI_CONFIG_STATUS', true);
|
157 |
+
|
158 |
+
}
|
includes/constants.php
ADDED
@@ -0,0 +1,76 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
// Namespace
|
4 |
+
namespace BMI\Plugin;
|
5 |
+
|
6 |
+
// Exit on direct access
|
7 |
+
if (!defined('ABSPATH')) {
|
8 |
+
exit;
|
9 |
+
}
|
10 |
+
|
11 |
+
// Plugin includes
|
12 |
+
if (!defined('BMI_AUTHOR_URI')) {
|
13 |
+
define('BMI_AUTHOR_URI', 'https://premium.backupbliss.com/');
|
14 |
+
}
|
15 |
+
if (!defined('BMI_INCLUDES')) {
|
16 |
+
define('BMI_INCLUDES', BMI_ROOT_DIR . DIRECTORY_SEPARATOR . 'includes');
|
17 |
+
}
|
18 |
+
if (!defined('BMI_BACKUPS_DEFAULT')) {
|
19 |
+
define('BMI_BACKUPS_DEFAULT', WP_CONTENT_DIR . DIRECTORY_SEPARATOR . 'backup-migration');
|
20 |
+
}
|
21 |
+
if (!defined('BMI_CONFIG_DEFAULT')) {
|
22 |
+
define('BMI_CONFIG_DEFAULT', BMI_INCLUDES . DIRECTORY_SEPARATOR . 'htaccess' . DIRECTORY_SEPARATOR . 'default.json');
|
23 |
+
}
|
24 |
+
if (!defined('BMI_CONFIG_PATH')) {
|
25 |
+
define('BMI_CONFIG_PATH', WP_CONTENT_DIR . DIRECTORY_SEPARATOR . 'backup-migration' . DIRECTORY_SEPARATOR . 'config.json');
|
26 |
+
}
|
27 |
+
if (!defined('BMI_CONFIG_DIR')) {
|
28 |
+
define('BMI_CONFIG_DIR', dirname(BMI_CONFIG_PATH));
|
29 |
+
}
|
30 |
+
if (!defined('BMI_REV')) {
|
31 |
+
define('BMI_REV', 1);
|
32 |
+
}
|
33 |
+
|
34 |
+
// Load configuration
|
35 |
+
require_once BMI_INCLUDES . DIRECTORY_SEPARATOR . 'config.php';
|
36 |
+
|
37 |
+
// Default constants
|
38 |
+
if (!defined('BMI_ASSETS')) {
|
39 |
+
define('BMI_ASSETS', plugin_dir_url(BMI_ROOT_FILE) . 'admin');
|
40 |
+
}
|
41 |
+
if (!defined('BMI_BACKUPS')) {
|
42 |
+
define('BMI_BACKUPS', WP_CONTENT_DIR . DIRECTORY_SEPARATOR . 'backup-migration' . DIRECTORY_SEPARATOR . 'backups');
|
43 |
+
}
|
44 |
+
|
45 |
+
// Fill folders if not removed (security)
|
46 |
+
if (!file_exists(BMI_BACKUPS)) {
|
47 |
+
mkdir(BMI_BACKUPS, 0755, true);
|
48 |
+
}
|
49 |
+
if (!file_exists(BMI_CONFIG_DIR)) {
|
50 |
+
mkdir(BMI_CONFIG_DIR, 0755, true);
|
51 |
+
}
|
52 |
+
if (!file_exists(BMI_CONFIG_PATH)) {
|
53 |
+
touch(BMI_CONFIG_PATH);
|
54 |
+
}
|
55 |
+
|
56 |
+
// Secure config and logs
|
57 |
+
if (!file_exists(BMI_CONFIG_DIR . DIRECTORY_SEPARATOR . 'index.php')) {
|
58 |
+
touch(BMI_CONFIG_DIR . DIRECTORY_SEPARATOR . 'index.php');
|
59 |
+
}
|
60 |
+
if (!file_exists(BMI_CONFIG_DIR . DIRECTORY_SEPARATOR . 'index.html')) {
|
61 |
+
touch(BMI_CONFIG_DIR . DIRECTORY_SEPARATOR . 'index.html');
|
62 |
+
}
|
63 |
+
if (!file_exists(BMI_CONFIG_DIR . DIRECTORY_SEPARATOR . '.htaccess')) {
|
64 |
+
copy(BMI_INCLUDES . DIRECTORY_SEPARATOR . 'htaccess' . DIRECTORY_SEPARATOR . '.htaccess', BMI_CONFIG_DIR . DIRECTORY_SEPARATOR . '.htaccess');
|
65 |
+
}
|
66 |
+
|
67 |
+
// Secure backups (if in backup dir)
|
68 |
+
if (!file_exists(BMI_BACKUPS . DIRECTORY_SEPARATOR . 'index.php')) {
|
69 |
+
touch(BMI_BACKUPS . DIRECTORY_SEPARATOR . 'index.php');
|
70 |
+
}
|
71 |
+
if (!file_exists(BMI_BACKUPS . DIRECTORY_SEPARATOR . 'index.html')) {
|
72 |
+
touch(BMI_BACKUPS . DIRECTORY_SEPARATOR . 'index.html');
|
73 |
+
}
|
74 |
+
if (!file_exists(BMI_BACKUPS . DIRECTORY_SEPARATOR . '.htaccess')) {
|
75 |
+
copy(BMI_INCLUDES . DIRECTORY_SEPARATOR . 'htaccess' . DIRECTORY_SEPARATOR . '.htaccess', BMI_BACKUPS . DIRECTORY_SEPARATOR . '.htaccess');
|
76 |
+
}
|
includes/cron/handler.php
ADDED
@@ -0,0 +1,117 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
// Namespace
|
4 |
+
namespace BMI\Plugin\CRON;
|
5 |
+
|
6 |
+
// Use
|
7 |
+
use BMI\Plugin\BMI_Logger AS Logger;
|
8 |
+
|
9 |
+
// Exit on direct access
|
10 |
+
if (!defined('ABSPATH')) exit;
|
11 |
+
|
12 |
+
/**
|
13 |
+
* BMI_Crons
|
14 |
+
*/
|
15 |
+
class BMI_Crons {
|
16 |
+
|
17 |
+
function __construct() {
|
18 |
+
|
19 |
+
}
|
20 |
+
|
21 |
+
public static function calculate_date($base, $curr = false) {
|
22 |
+
|
23 |
+
$type = $base['type'];
|
24 |
+
$week = intval($base['week']);
|
25 |
+
$day = intval($base['day']);
|
26 |
+
$hour = intval($base['hour']);
|
27 |
+
$minutes = intval($base['minute']);
|
28 |
+
|
29 |
+
if (isset($curr) && $curr != false) {
|
30 |
+
$timestamp = $curr;
|
31 |
+
} else $timestamp = time();
|
32 |
+
|
33 |
+
$current = new \DateTime();
|
34 |
+
$current->setTimestamp($timestamp);
|
35 |
+
|
36 |
+
$future = new \DateTime();
|
37 |
+
$future->setTimestamp($timestamp);
|
38 |
+
$future->setTime($hour, $minutes, 0);
|
39 |
+
|
40 |
+
$c_minute = intval($current->format('i'));
|
41 |
+
$c_hour = intval($current->format('G'));
|
42 |
+
$c_month_day = intval($current->format('j'));
|
43 |
+
$c_month = intval($current->format('n'));
|
44 |
+
$c_week = intval($current->format('N'));
|
45 |
+
|
46 |
+
if ($type == 'day') {
|
47 |
+
|
48 |
+
if ($current->getTimestamp() >= $future->getTimestamp()) {
|
49 |
+
|
50 |
+
$future->modify('+1 day');
|
51 |
+
|
52 |
+
}
|
53 |
+
|
54 |
+
} else if ($type == 'week') {
|
55 |
+
|
56 |
+
if ($c_week >= $week) {
|
57 |
+
|
58 |
+
if ($c_week == $week) {
|
59 |
+
|
60 |
+
if ($c_hour >= $hour && (($c_hour > $hour) || ($c_hour == $hour && $c_minute >= $minutes))) {
|
61 |
+
// if () {
|
62 |
+
$offset = (7 - ($c_week - $week));
|
63 |
+
$future->modify("+$offset day");
|
64 |
+
// }
|
65 |
+
}
|
66 |
+
|
67 |
+
} else {
|
68 |
+
|
69 |
+
// if ($c_hour <= $hour) {
|
70 |
+
$offset = (7 - ($c_week - $week));
|
71 |
+
$future->modify("+$offset day");
|
72 |
+
// }
|
73 |
+
|
74 |
+
}
|
75 |
+
|
76 |
+
|
77 |
+
} else {
|
78 |
+
|
79 |
+
$offset = ($week - $c_week);
|
80 |
+
$future->modify("+$offset day");
|
81 |
+
|
82 |
+
}
|
83 |
+
|
84 |
+
} else if ($type == 'month') {
|
85 |
+
|
86 |
+
if ($c_month_day >= $day) {
|
87 |
+
|
88 |
+
if ($c_month_day == $day && $c_hour <= $hour) {
|
89 |
+
if ($c_minute >= $minutes) {
|
90 |
+
|
91 |
+
$days = cal_days_in_month(CAL_GREGORIAN, $c_month, $current->format('Y'));
|
92 |
+
$offset = ($days - ($c_month_day - $day));
|
93 |
+
$future->modify("+$offset day");
|
94 |
+
|
95 |
+
}
|
96 |
+
} else {
|
97 |
+
|
98 |
+
$offset = ($day - $c_month_day);
|
99 |
+
$future->modify("+1 month");
|
100 |
+
$future->modify("+$offset day");
|
101 |
+
|
102 |
+
}
|
103 |
+
|
104 |
+
} else {
|
105 |
+
|
106 |
+
$offset = ($day - $c_month_day);
|
107 |
+
$future->modify("+$offset day");
|
108 |
+
|
109 |
+
}
|
110 |
+
|
111 |
+
}
|
112 |
+
|
113 |
+
return $future->getTimestamp();
|
114 |
+
|
115 |
+
}
|
116 |
+
|
117 |
+
}
|
includes/dashboard/chapter/AA-Template.php
ADDED
@@ -0,0 +1,9 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
// Namespace
|
4 |
+
namespace BMI\Plugin\Dashboard;
|
5 |
+
|
6 |
+
// Exit on direct access
|
7 |
+
if (!defined('ABSPATH')) exit;
|
8 |
+
|
9 |
+
?>
|
includes/dashboard/chapter/other_config.php
ADDED
@@ -0,0 +1,298 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
// Namespace
|
4 |
+
namespace BMI\Plugin\Dashboard;
|
5 |
+
|
6 |
+
// Exit on direct access
|
7 |
+
if (!defined('ABSPATH')) {
|
8 |
+
exit;
|
9 |
+
}
|
10 |
+
|
11 |
+
// Tooltips
|
12 |
+
$deinstalled_info = __('This will be triggered on plugin removal via WordPress plugins tab', 'backup-migration');
|
13 |
+
|
14 |
+
?>
|
15 |
+
|
16 |
+
<div class="mt mb f18 lh30">
|
17 |
+
|
18 |
+
<!-- -->
|
19 |
+
<div class="mm cf mbl">
|
20 |
+
<div class="f20 bold mbll">
|
21 |
+
<?php _e('Email notifications', 'backup-migration'); ?>
|
22 |
+
</div>
|
23 |
+
|
24 |
+
<div class="left mw250 lh65">
|
25 |
+
<?php _e('Email address:', 'backup-migration'); ?>
|
26 |
+
</div>
|
27 |
+
<div class="left">
|
28 |
+
<div class="">
|
29 |
+
<?php
|
30 |
+
$ee = sanitize_text_field(bmi_get_config('OTHER:EMAIL'));
|
31 |
+
if (strlen($ee) <= 1) {
|
32 |
+
$ee = get_bloginfo('admin_email');
|
33 |
+
}
|
34 |
+
?>
|
35 |
+
<input type="text" id="email-for-notices" class="bmi-text-input small" value="<?php echo $ee; ?>" />
|
36 |
+
</div>
|
37 |
+
<div class="f16">
|
38 |
+
<?php _e('This is where the log files will be sent to. You can enter several email addresses, separated by comma.', 'backup-migration'); ?>
|
39 |
+
</div>
|
40 |
+
</div>
|
41 |
+
</div>
|
42 |
+
|
43 |
+
<!-- -->
|
44 |
+
<div class="mm cf mbl">
|
45 |
+
<div class="left mw250 lh65">
|
46 |
+
<?php _e('From field:', 'backup-migration'); ?>
|
47 |
+
</div>
|
48 |
+
<div class="left">
|
49 |
+
<div class="">
|
50 |
+
<input type="text" id="email-title-for-notices" class="bmi-text-input small" value="<?php echo sanitize_text_field(bmi_get_config('OTHER:EMAIL:TITLE')); ?>" />
|
51 |
+
</div>
|
52 |
+
<div class="f16">
|
53 |
+
<?php _e('This will show up as sender of the emails', 'backup-migration'); ?>
|
54 |
+
</div>
|
55 |
+
</div>
|
56 |
+
</div>
|
57 |
+
|
58 |
+
<!-- -->
|
59 |
+
<div class="mm cf mbl">
|
60 |
+
|
61 |
+
<div class="left mw250 lh50" style="line-height: 145px;">
|
62 |
+
<?php _e("You'll get an email if...", 'backup-migration'); ?>
|
63 |
+
</div>
|
64 |
+
|
65 |
+
<div class="left lh40">
|
66 |
+
<table>
|
67 |
+
<tbody>
|
68 |
+
<tr>
|
69 |
+
<td>
|
70 |
+
<label class="premium-wrapper">
|
71 |
+
<input type="checkbox" disabled>
|
72 |
+
<span><?php _e("Backups was created successfully", 'backup-migration'); ?></span>
|
73 |
+
<span class="premium premium-img premium-ntt"></span>
|
74 |
+
</label>
|
75 |
+
</td>
|
76 |
+
<td>
|
77 |
+
<label class="premium-wrapper">
|
78 |
+
<input type="checkbox" disabled>
|
79 |
+
<span><?php _e("Backup creation failed", 'backup-migration'); ?></span>
|
80 |
+
<span class="premium premium-img premium-ntt"></span>
|
81 |
+
</label>
|
82 |
+
</td>
|
83 |
+
</tr>
|
84 |
+
<tr>
|
85 |
+
<td>
|
86 |
+
<label class="premium-wrapper">
|
87 |
+
<input type="checkbox" disabled>
|
88 |
+
<span><?php _e("Restore succeeded", 'backup-migration'); ?></span>
|
89 |
+
<span class="premium premium-img premium-ntt"></span>
|
90 |
+
</label>
|
91 |
+
</td>
|
92 |
+
<td>
|
93 |
+
<label class="premium-wrapper">
|
94 |
+
<input type="checkbox" disabled>
|
95 |
+
<span><?php _e("Restore failed", 'backup-migration'); ?></span>
|
96 |
+
<span class="premium premium-img premium-ntt"></span>
|
97 |
+
</label>
|
98 |
+
</td>
|
99 |
+
</tr>
|
100 |
+
<tr>
|
101 |
+
<td colspan="2">
|
102 |
+
<label for="scheduled-issues">
|
103 |
+
<input type="checkbox" id="scheduled-issues"<?php bmi_try_checked('OTHER:EMAIL:NOTIS'); ?>>
|
104 |
+
<span>
|
105 |
+
<?php _e("There are (new) issues with scheduling (creating automatic backups)", 'backup-migration'); ?><br>
|
106 |
+
<span class="f14">
|
107 |
+
<?php _e("(Make sure that your hosting does not block mail functions, otherwise you have to configure SMTP mail.)", 'backup-migration'); ?>
|
108 |
+
</span>
|
109 |
+
</span>
|
110 |
+
</label>
|
111 |
+
</td>
|
112 |
+
</tr>
|
113 |
+
</tbody>
|
114 |
+
</table>
|
115 |
+
</div>
|
116 |
+
|
117 |
+
</div>
|
118 |
+
|
119 |
+
<!-- -->
|
120 |
+
<div class="mm mbl">
|
121 |
+
<div class="cf">
|
122 |
+
|
123 |
+
<div class="left mr20">
|
124 |
+
<?php _e("Add logs to emails?", 'backup-migration'); ?>
|
125 |
+
</div>
|
126 |
+
|
127 |
+
<div class="left">
|
128 |
+
<div class="left d-flex mr60 ia-center">
|
129 |
+
<label class="container-radio">
|
130 |
+
<?php _e("No", 'backup-migration'); ?>
|
131 |
+
<input type="radio" checked name="add_logs_email">
|
132 |
+
<span class="checkmark-radio"></span>
|
133 |
+
</label>
|
134 |
+
<div class="inline premium-wrapper cf">
|
135 |
+
<label class="left container-radio ml25 not-allowed">
|
136 |
+
<?php _e("Yes", 'backup-migration'); ?>
|
137 |
+
<input type="radio" disabled name="add_logs_email">
|
138 |
+
<span class="checkmark-radio"></span>
|
139 |
+
</label>
|
140 |
+
<span class="left premium premium-img premium-nt mtf3"></span>
|
141 |
+
</div>
|
142 |
+
</div>
|
143 |
+
</div>
|
144 |
+
|
145 |
+
</div>
|
146 |
+
|
147 |
+
<div class="f16 mtll">
|
148 |
+
<?php _e("If you want to also receive the backup file as attachment of the email (for backup notifications), please set this in chapter Where will backups be stored?.", 'backup-migration'); ?>
|
149 |
+
</div>
|
150 |
+
</div>
|
151 |
+
|
152 |
+
<!-- -->
|
153 |
+
<div class="mm">
|
154 |
+
<div class="f20 bold">
|
155 |
+
<?php _e("Backup triggers", 'backup-migration'); ?>
|
156 |
+
</div>
|
157 |
+
|
158 |
+
<div class="f16 mtll">
|
159 |
+
<?php _e('At the top of the plugin you can create a backup instantly ("Create backup now" - button), or schedule them. Here are more options which trigger the backup creation:', 'backup-migration'); ?>
|
160 |
+
</div>
|
161 |
+
</div>
|
162 |
+
|
163 |
+
<!-- -->
|
164 |
+
<div class="mbl mtl overlayed">
|
165 |
+
|
166 |
+
<?php include BMI_INCLUDES . '/dashboard/templates/premium-overlay.php'; ?>
|
167 |
+
|
168 |
+
<div class="mm">
|
169 |
+
<div class="cf">
|
170 |
+
<div class="left">
|
171 |
+
<div class="f20 bold mr20 premium-wrapper">
|
172 |
+
<?php _e("Before updates", 'backup-migration'); ?>
|
173 |
+
<span class="premium premium-img premium-ntt"></span>
|
174 |
+
</div>
|
175 |
+
</div>
|
176 |
+
<div class="left">
|
177 |
+
<label for="before-updates-switch" class="bmi-switch">
|
178 |
+
<input type="checkbox" disabled checked id="before-updates-switch">
|
179 |
+
<div class="bmi-switch-slider round">
|
180 |
+
<span class="on"><?php _e("On", 'backup-migration'); ?></span>
|
181 |
+
<span class="off"><?php _e("Off", 'backup-migration'); ?></span>
|
182 |
+
</div>
|
183 |
+
</label>
|
184 |
+
</div>
|
185 |
+
</div>
|
186 |
+
</div>
|
187 |
+
<div class="mm">
|
188 |
+
<div class="mtll f16">
|
189 |
+
<?php _e("Activate this so that a backup is created before there are automatic WordPress updates (WordPress core, plugins, themes, or language files).", 'backup-migration'); ?>
|
190 |
+
</div>
|
191 |
+
</div>
|
192 |
+
|
193 |
+
</div>
|
194 |
+
|
195 |
+
<!-- -->
|
196 |
+
<div class="overlayed">
|
197 |
+
|
198 |
+
<?php include BMI_INCLUDES . '/dashboard/templates/premium-overlay.php'; ?>
|
199 |
+
|
200 |
+
<table class="mm">
|
201 |
+
<tbody>
|
202 |
+
<tr>
|
203 |
+
<td style="vertical-align: top;">
|
204 |
+
<div class="f20 bold mw250 lh65 premium-wrapper">
|
205 |
+
<?php _e("Trigger by URI", 'backup-migration'); ?>
|
206 |
+
<span class="premium premium-img premium-ntt"></span>
|
207 |
+
</div>
|
208 |
+
</td>
|
209 |
+
<td>
|
210 |
+
<div class="">
|
211 |
+
<div class="cf">
|
212 |
+
<div class="left mr20">
|
213 |
+
<input type="text" class="bmi-text-input small" id="trigger-input1" />
|
214 |
+
</div>
|
215 |
+
<div class="left">
|
216 |
+
<a href="#" class="btn inline btn-with-img btn-img-low-pad btn-pad left bmi-copper othersec mm30" data-copy="trigger-input1">
|
217 |
+
<div class="text">
|
218 |
+
<img src="<?php echo $this->get_asset('images', 'copy-icon.png'); ?>" alt="copy-img">
|
219 |
+
<div class="f18 semibold"><?php _e('Copy', 'backup-migration') ?></div>
|
220 |
+
</div>
|
221 |
+
</a>
|
222 |
+
</div>
|
223 |
+
</div>
|
224 |
+
<div class="f16 mtlll">
|
225 |
+
<?php _e("Copy & paste this url into a browser and press enter to trigger the backup creation.", 'backup-migration'); ?><br>
|
226 |
+
<?php _e("Make sure you keep this url a secret. For safety reasons this only works once per hour & you’ll get emailed when it used.", 'backup-migration'); ?>
|
227 |
+
</div>
|
228 |
+
<div class="mtll cf">
|
229 |
+
<div class="left lh60 mr20"><?php _e("Key:", 'backup-migration'); ?></div>
|
230 |
+
<div class="left mr20">
|
231 |
+
<input type="text" class="bmi-text-input small" />
|
232 |
+
</div>
|
233 |
+
<div class="left">
|
234 |
+
<a href="#" class="btn mm30 othersec"><?php _e("Save", 'backup-migration'); ?></a>
|
235 |
+
</div>
|
236 |
+
</div>
|
237 |
+
<div class="f16 mtlll">
|
238 |
+
<?php _e("Change the key (which is part of above url) if you suspect an unauthorized person got access to it.", 'backup-migration'); ?>
|
239 |
+
</div>
|
240 |
+
</div>
|
241 |
+
</td>
|
242 |
+
</tr>
|
243 |
+
</tbody>
|
244 |
+
</table>
|
245 |
+
|
246 |
+
</div>
|
247 |
+
|
248 |
+
<!-- -->
|
249 |
+
<div class="mbl mtl overlayed" style="display: none;">
|
250 |
+
|
251 |
+
<?php include BMI_INCLUDES . '/dashboard/templates/premium-overlay.php'; ?>
|
252 |
+
|
253 |
+
<div class="mm f20 bold premium-wrapper">
|
254 |
+
<?php _e("WP CLI", 'backup-migration'); ?>
|
255 |
+
<span class="premium premium-img premium-ntt"></span>
|
256 |
+
</div>
|
257 |
+
<div class="mm mtll f16">
|
258 |
+
<?php _e('Trigger backups via WP CLI.', 'backup-migration'); ?>
|
259 |
+
</div>
|
260 |
+
<div class="mm mtll">
|
261 |
+
<?php _e('If you selected the "schedule backups" - option at the top of the plugin, and backups are not created, then please check out the Cron settings. Or just ask us in the forum.', 'backup-migration'); ?>
|
262 |
+
</div>
|
263 |
+
</div>
|
264 |
+
|
265 |
+
<!-- -->
|
266 |
+
<div class="mm mbl mtl">
|
267 |
+
<div class="f20 bold">
|
268 |
+
<?php _e("Clean-ups", 'backup-migration'); ?>
|
269 |
+
</div>
|
270 |
+
<div class="mtll">
|
271 |
+
<span class="relative">
|
272 |
+
<?php _e("When this plugins is", 'backup-migration'); ?> <b><?php _e("de-installed:", 'backup-migration'); ?></b>
|
273 |
+
<span class="bmi-info-icon tooltip" tooltip="<?php echo $deinstalled_info; ?>"></span>
|
274 |
+
</span>
|
275 |
+
</div>
|
276 |
+
|
277 |
+
<div class="lh40">
|
278 |
+
<label for="uninstalling-configs">
|
279 |
+
<input type="checkbox" id="uninstalling-configs"<?php bmi_try_checked('OTHER:UNINSTALL:CONFIGS'); ?> />
|
280 |
+
<span><?php _e("Delete all plugins settings (this means if you install it again, you have to configure it again)", 'backup-migration'); ?></span>
|
281 |
+
</label>
|
282 |
+
</div>
|
283 |
+
<div class="lh40">
|
284 |
+
<label for="uninstalling-backups">
|
285 |
+
<input type="checkbox" id="uninstalling-backups"<?php bmi_try_checked('OTHER:UNINSTALL:BACKUPS'); ?> />
|
286 |
+
<span><?php _e("Delete all backups (created by this plugin)", 'backup-migration'); ?></span>
|
287 |
+
</label>
|
288 |
+
</div>
|
289 |
+
</div>
|
290 |
+
|
291 |
+
<!-- -->
|
292 |
+
<div class="mm mtll">
|
293 |
+
<?php _e("If you're looking for other options not listed above, check out the", 'backup-migration'); ?> <a href="#" class="secondary hoverable nodec collapser-openner" data-el="#troubleshooting-chapter"><?php _e("troubleshooting", 'backup-migration'); ?></a> <?php _e("chapter as they might be there.", 'backup-migration'); ?>
|
294 |
+
</div>
|
295 |
+
|
296 |
+
</div>
|
297 |
+
|
298 |
+
<?php include BMI_INCLUDES . '/dashboard/chapter/save-button.php'; ?>
|
includes/dashboard/chapter/save-button.php
ADDED
@@ -0,0 +1,18 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
// Namespace
|
4 |
+
namespace BMI\Plugin\Dashboard;
|
5 |
+
|
6 |
+
// Exit on direct access
|
7 |
+
if (!defined('ABSPATH')) exit;
|
8 |
+
|
9 |
+
?>
|
10 |
+
|
11 |
+
<div class="mm mtl mbl lh30">
|
12 |
+
<a href="#" class="btn save-btn"><?php _e("Save", 'backup-migration'); ?></a>
|
13 |
+
</div>
|
14 |
+
|
15 |
+
<div class="mm center f20 mb">
|
16 |
+
<a href="#" class="text-muted close-chapters nodec"><?php _e("Collapse this chapter", 'backup-migration'); ?></a>
|
17 |
+
</div>
|
18 |
+
<div class="mbll"></div>
|
includes/dashboard/chapter/store_config.php
ADDED
@@ -0,0 +1,155 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
// Namespace
|
4 |
+
namespace BMI\Plugin\Dashboard;
|
5 |
+
|
6 |
+
// Exit on direct access
|
7 |
+
if (!defined('ABSPATH')) exit;
|
8 |
+
|
9 |
+
?>
|
10 |
+
|
11 |
+
<div class="mm mt mb">
|
12 |
+
|
13 |
+
<div class="lh30">
|
14 |
+
<div class="f20 semibold"><?php _e("File name", 'backup-migration'); ?></div>
|
15 |
+
<div class="f20"><?php _e("Your backup(s) will be given the following file name(s)", 'backup-migration'); ?></div>
|
16 |
+
</div>
|
17 |
+
|
18 |
+
<div class="center mtl f18">
|
19 |
+
<div class="">
|
20 |
+
<input type="text" id="backup_filename" class="bmi-text-input" value="<?php echo sanitize_text_field(bmi_get_config('BACKUP:NAME')); ?>">
|
21 |
+
<span class="oll mrr">.zip </span><a href="#" id="show-format-tip" class="nodec secondary hoverable"><?php _e("Huh? Explain this please", 'backup-migration'); ?></a>
|
22 |
+
</div>
|
23 |
+
</div>
|
24 |
+
|
25 |
+
</div>
|
26 |
+
|
27 |
+
<div class="mm lh30 f16 bg-second mtl mbl" id="format-tip-wrp" style="display: none;">
|
28 |
+
|
29 |
+
<div class="lh30 f18">
|
30 |
+
<?php _e("We’re giving you maximum flexibility to automatically name your backup files in the way you want. Simply use below keys:", 'backup-migration'); ?>
|
31 |
+
</div>
|
32 |
+
<div class="mm mtl">
|
33 |
+
<div class="format-entry"><b>%Y</b> = <?php _e("A full numeric representation of a year, 4 digits", 'backup-migration'); ?></div>
|
34 |
+
<div class="format-entry"><b>%M</b> = <?php _e("A short textual representation of a month, three letters", 'backup-migration'); ?></div>
|
35 |
+
<div class="format-entry"><b>%D</b> = <?php _e("A textual representation of a day, three letters", 'backup-migration'); ?></div>
|
36 |
+
<div class="format-entry"><b>%d</b> = <?php _e("Day of the month, 2 digits with leading zeros", 'backup-migration'); ?></div>
|
37 |
+
<div class="format-entry"><b>%j</b> = <?php _e("Day of the month without leading zeros", 'backup-migration'); ?></div>
|
38 |
+
<div class="format-entry"><b>%m</b> = <?php _e("Numeric representation of a month, with leading zeros", 'backup-migration'); ?></div>
|
39 |
+
<div class="format-entry"><b>%n</b> = <?php _e("Numeric representation of a month, without leading zeros", 'backup-migration'); ?></div>
|
40 |
+
<div class="format-entry"><b>%Y</b> = <?php _e("A full numeric representation of a year, 4 digits", 'backup-migration'); ?></div>
|
41 |
+
<div class="format-entry"><b>%y</b> = <?php _e("A two digit representation of a year", 'backup-migration'); ?></div>
|
42 |
+
<div class="format-entry"><b>%a</b> = <?php _e("Lowercase Ante meridiem and Post meridiem", 'backup-migration'); ?></div>
|
43 |
+
<div class="format-entry"><b>%A</b> = <?php _e("Uppercase Ante meridiem and Post meridiem", 'backup-migration'); ?></div>
|
44 |
+
<div class="format-entry"><b>%B</b> = <?php _e("Swatch Internet time", 'backup-migration'); ?></div>
|
45 |
+
<div class="format-entry"><b>%g</b> = <?php _e("12-hour format of an hour without leading zeros", 'backup-migration'); ?></div>
|
46 |
+
<div class="format-entry"><b>%G</b> = <?php _e("24-hour format of an hour without leading zeros", 'backup-migration'); ?></div>
|
47 |
+
<div class="format-entry"><b>%h</b> = <?php _e("12-hour format of an hour with leading zeros", 'backup-migration'); ?></div>
|
48 |
+
<div class="format-entry"><b>%H</b> = <?php _e("24-hour format of an hour with leading zeros", 'backup-migration'); ?></div>
|
49 |
+
<div class="format-entry"><b>%i</b> = <?php _e("Minutes with leading zeros", 'backup-migration'); ?></div>
|
50 |
+
<div class="format-entry"><b>%s</b> = <?php _e("Seconds with leading zeros", 'backup-migration'); ?></div>
|
51 |
+
<div class="format-entry"><b>%hash</b> = <?php _e("4 digit random hash", 'backup-migration'); ?></div>
|
52 |
+
</div>
|
53 |
+
<div class="right-align">
|
54 |
+
<a href="#" class="hoverable nodec secondary" id="hide-format-tip"><?php _e("Hide", 'backup-migration'); ?></a>
|
55 |
+
</div>
|
56 |
+
|
57 |
+
</div>
|
58 |
+
|
59 |
+
<div class="mm mb">
|
60 |
+
|
61 |
+
<div class="lh30">
|
62 |
+
<div class="f20 semibold"><?php _e("Zipping", 'backup-migration'); ?></div>
|
63 |
+
<div class="f20"><?php _e("Please select the compression method of your backup files:", 'backup-migration'); ?></div>
|
64 |
+
</div>
|
65 |
+
|
66 |
+
<table class="f20 mtl">
|
67 |
+
<tbody>
|
68 |
+
<tr>
|
69 |
+
|
70 |
+
<td>
|
71 |
+
<div class="lh30">
|
72 |
+
|
73 |
+
<div class="mbll">
|
74 |
+
<label class="container-radio">
|
75 |
+
Zip
|
76 |
+
<input type="radio" name="smart_exclusion_db" value="false" checked>
|
77 |
+
<span class="checkmark-radio"></span>
|
78 |
+
</label>
|
79 |
+
</div>
|
80 |
+
|
81 |
+
<div class="mbll">
|
82 |
+
<span class="cf premium-wrapper">
|
83 |
+
<label class="left container-radio ml25 not-allowed">
|
84 |
+
Tar
|
85 |
+
<input type="radio" disabled name="smart_exclusion_db" value="true">
|
86 |
+
<span class="checkmark-radio"></span>
|
87 |
+
</label>
|
88 |
+
<span class="left premium premium-img premium-nt"></span>
|
89 |
+
</span>
|
90 |
+
</div>
|
91 |
+
|
92 |
+
<div class="">
|
93 |
+
<span class="cf premium-wrapper">
|
94 |
+
<label class="left container-radio ml25 not-allowed">
|
95 |
+
Tar GZip
|
96 |
+
<input type="radio" disabled name="smart_exclusion_db" value="true">
|
97 |
+
<span class="checkmark-radio"></span>
|
98 |
+
</label>
|
99 |
+
<span class="left premium premium-img premium-nt"></span>
|
100 |
+
</span>
|
101 |
+
</div>
|
102 |
+
|
103 |
+
</div>
|
104 |
+
</td>
|
105 |
+
|
106 |
+
<td>
|
107 |
+
<div class="f16 mw850 bol lh30">
|
108 |
+
<i><?php _e('“ZIP” is the standard choice (compression level 1). Use “Tar” (compression level 2) or Tar.gz (compression level 5) if you want to have more compression (i.e. smaller file sizes). However, this will also put more load on the backup creation.', 'backup-migration'); ?></i>
|
109 |
+
</div>
|
110 |
+
</td>
|
111 |
+
|
112 |
+
</tr>
|
113 |
+
</tbody>
|
114 |
+
</table>
|
115 |
+
|
116 |
+
</div>
|
117 |
+
|
118 |
+
<div class="mm mt mb overlayed">
|
119 |
+
|
120 |
+
<?php include BMI_INCLUDES . '/dashboard/templates/premium-overlay.php'; ?>
|
121 |
+
|
122 |
+
<div class="">
|
123 |
+
<div class="lh30">
|
124 |
+
<div class="f20 semibold">
|
125 |
+
<span class="cf premium-wrapper">
|
126 |
+
<div class="left"><?php _e("Encryption", 'backup-migration'); ?></div>
|
127 |
+
<span class="left premium premium-img"></span>
|
128 |
+
</span>
|
129 |
+
</div>
|
130 |
+
<div class="f20"><?php _e("Do you want to encrypt and password protect your files?", 'backup-migration'); ?></div>
|
131 |
+
</div>
|
132 |
+
|
133 |
+
<div class="mtl">
|
134 |
+
<div class="left d-flex mr60 ia-center">
|
135 |
+
<label class="container-radio">
|
136 |
+
<?php _e("No", 'backup-migration'); ?>
|
137 |
+
<input type="radio" name="" value="false" checked>
|
138 |
+
<span class="checkmark-radio"></span>
|
139 |
+
</label>
|
140 |
+
<label class="left container-radio ml25 not-allowed">
|
141 |
+
<?php _e("Yes", 'backup-migration'); ?>
|
142 |
+
<input type="radio" disabled name="" value="true">
|
143 |
+
<span class="checkmark-radio"></span>
|
144 |
+
</label>
|
145 |
+
</div>
|
146 |
+
</div>
|
147 |
+
</div>
|
148 |
+
|
149 |
+
</div>
|
150 |
+
|
151 |
+
<div class="mm f16 mtl mbl">
|
152 |
+
<i><?php _e("For other security settings, e.g. who can access your backup directories, please go to the", 'backup-migration'); ?> <a href="#" class="hoverable secondary nodec collapser-openner" data-el="#other-options"><?php _e("Other options", 'backup-migration'); ?></a> <?php _e("chapter.", 'backup-migration'); ?></i>
|
153 |
+
</div>
|
154 |
+
|
155 |
+
<?php include BMI_INCLUDES . '/dashboard/chapter/save-button.php'; ?>
|
includes/dashboard/chapter/troubleshooting.php
ADDED
@@ -0,0 +1,195 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
// Namespace
|
4 |
+
namespace BMI\Plugin\Dashboard;
|
5 |
+
|
6 |
+
// Use
|
7 |
+
use BMI\Plugin\Checker\System_Info as SI;
|
8 |
+
|
9 |
+
// Exit on direct access
|
10 |
+
if (!defined('ABSPATH')) {
|
11 |
+
exit;
|
12 |
+
}
|
13 |
+
|
14 |
+
// Tooltips
|
15 |
+
$ctl = __("Your account on Wordpress.org (where you open a new support thread) is different to the one you login to your WordPress dashboard (where you are now). If you don’t have a WordPress.org account yet, please sign up at the top right on the Support Forum page, and then scroll down on that page . It only takes a minute :) Thank you!", 'backup-migration');
|
16 |
+
|
17 |
+
?>
|
18 |
+
|
19 |
+
<div class="mm mt mb f20 lh40">
|
20 |
+
|
21 |
+
<div class="mbl">
|
22 |
+
<?php _e("If something doesn't work, you have several options - pick one:", 'backup-migration'); ?>
|
23 |
+
</div>
|
24 |
+
|
25 |
+
<table class="center-table trouble-section">
|
26 |
+
|
27 |
+
<tr class="lh30">
|
28 |
+
<td style="width: 33%">
|
29 |
+
<a href="https://wordpress.org/support/plugin/backup-backup/" target="_blank" class="nodec">
|
30 |
+
<div class="shadow">
|
31 |
+
<div class="flex flexcenter mtl mtb">
|
32 |
+
<div style="width: 66px; height: 63px;">
|
33 |
+
<svg style="width: 66px; height: 63px;"><use xlink:href="<?php echo $this->get_asset('images', 'support-1.svg'); ?>#img"></use></svg>
|
34 |
+
</div>
|
35 |
+
<div class="semibold">
|
36 |
+
<?php _e("Ask us in the Support forum", 'backup-migration'); ?>
|
37 |
+
</div>
|
38 |
+
</div>
|
39 |
+
<div class="f16">
|
40 |
+
<?php _e("Your first port of call. We'll try to respond quickly!", 'backup-migration'); ?>
|
41 |
+
</div>
|
42 |
+
</div>
|
43 |
+
</a>
|
44 |
+
</td>
|
45 |
+
<td style="width: 33%">
|
46 |
+
<a href="<?php echo BMI_AUTHOR_URI; ?>" target="_blank" class="nodec">
|
47 |
+
<div class="shadow">
|
48 |
+
<div class="flex flexcenter mtl mtb">
|
49 |
+
<div style="width: 69px; height: 63px;">
|
50 |
+
<svg style="width: 69px; height: 63px; margin-top: 10px;"><use xlink:href="<?php echo $this->get_asset('images', 'support-2.svg'); ?>#img"></use></svg>
|
51 |
+
</div>
|
52 |
+
<div class="semibold">
|
53 |
+
<?php _e("Get the Premium Plugin", 'backup-migration'); ?>
|
54 |
+
</div>
|
55 |
+
</div>
|
56 |
+
<div class="f16">
|
57 |
+
<?php _e("...which includes support, so we can help you in more detail if you get stuck.", 'backup-migration'); ?>
|
58 |
+
</div>
|
59 |
+
</div>
|
60 |
+
</a>
|
61 |
+
</td>
|
62 |
+
<td style="width: 33%">
|
63 |
+
<div class="shadow" id="open_trouble_extenstion">
|
64 |
+
<div class="flex flexcenter mtl mtb">
|
65 |
+
<div style="width: 70px; height: 63px;">
|
66 |
+
<svg style="width: 70px; height: 63px;"><use xlink:href="<?php echo $this->get_asset('images', 'support-3.svg'); ?>#img"></use></svg>
|
67 |
+
</div>
|
68 |
+
<div class="semibold">
|
69 |
+
<?php _e("Check advanced options", 'backup-migration'); ?>
|
70 |
+
</div>
|
71 |
+
</div>
|
72 |
+
<div class="f16">
|
73 |
+
<?php _e("...in an effort to fix it yourself. Be sure you know what you are doing!", 'backup-migration'); ?>
|
74 |
+
</div>
|
75 |
+
</div>
|
76 |
+
</td>
|
77 |
+
</tr>
|
78 |
+
<tr>
|
79 |
+
<td class="mtlll">
|
80 |
+
<span class="tooltip hoverable info-cursor f18" tooltip="<?php echo $ctl; ?>"><?php _e("Cannot log in there?", 'backup-migration'); ?></span>
|
81 |
+
</td>
|
82 |
+
<td></td>
|
83 |
+
<td></td>
|
84 |
+
</tr>
|
85 |
+
|
86 |
+
</table>
|
87 |
+
|
88 |
+
</div>
|
89 |
+
|
90 |
+
<div id="trouble_extenstion" class="f20" style="display: none; min-width: calc(100% - 45px - 45px);">
|
91 |
+
|
92 |
+
<div class="mm">
|
93 |
+
<div class="f26 semibold mb">
|
94 |
+
<?php _e("Troubleshooting settings", 'backup-migration'); ?>
|
95 |
+
</div>
|
96 |
+
<div class="f20 semibold">
|
97 |
+
<?php _e("Site information", 'backup-migration'); ?>
|
98 |
+
</div>
|
99 |
+
<div class="f16 mtll mbll">
|
100 |
+
<?php _e("Here is some information about your site, which may help to debug if there is an issue:", 'backup-migration'); ?>
|
101 |
+
</div>
|
102 |
+
</div>
|
103 |
+
|
104 |
+
<div class="mm bg-second f16 mtl mbl lh25">
|
105 |
+
<table style="width: 100%">
|
106 |
+
<tbody>
|
107 |
+
|
108 |
+
<?php
|
109 |
+
require_once BMI_INCLUDES . '/check/system_info.php';
|
110 |
+
$info = new SI();
|
111 |
+
$info = $info->to_array();
|
112 |
+
$i = 0;
|
113 |
+
foreach ($info as $key => $value) {
|
114 |
+
$i++; ?>
|
115 |
+
<tr class="<?php echo(($i <= 7)?'ignored-tr':'hide-show-tr'); ?>">
|
116 |
+
<th align="left"><?php echo ucwords(str_replace('_', ' ', $key)); ?></th>
|
117 |
+
<td><?php
|
118 |
+
|
119 |
+
if (is_object($value)) {
|
120 |
+
echo $value->format('Y-m-d H:i:s.u');
|
121 |
+
} elseif (is_array($value)) {
|
122 |
+
if (sizeof($value) === 0) {
|
123 |
+
echo '---';
|
124 |
+
} else {
|
125 |
+
if ($key == 'wp_active_themes_info') {
|
126 |
+
echo $value[0]['name'] . '@' . $value[0]['version'];
|
127 |
+
} elseif ($key == 'wp_active_plugins_info') {
|
128 |
+
$disp = '';
|
129 |
+
for ($i = 0; $i < sizeof($value); ++$i) {
|
130 |
+
$disp .= $value[$i]['name'] . '@' . $value[$i]['version'] . ' | ';
|
131 |
+
}
|
132 |
+
echo rtrim($disp, ' | ');
|
133 |
+
} else {
|
134 |
+
echo implode(' | ', $value);
|
135 |
+
}
|
136 |
+
}
|
137 |
+
} elseif (is_bool($value)) {
|
138 |
+
echo $value === true ? 'true' : 'false';
|
139 |
+
} else {
|
140 |
+
if (strlen($value) == '0') {
|
141 |
+
echo '---';
|
142 |
+
} else {
|
143 |
+
echo $value;
|
144 |
+
}
|
145 |
+
} ?></td>
|
146 |
+
</tr>
|
147 |
+
<?php
|
148 |
+
}
|
149 |
+
?>
|
150 |
+
<tr class="ignored-tr">
|
151 |
+
<th style="width: 400px"></th>
|
152 |
+
<td align="right">
|
153 |
+
<span class="hoverable secondary" id="switch-show-trs" data-see="<?php _e("See more", 'backup-migration'); ?>" data-hide="<?php _e("Collapse", 'backup-migration'); ?>">
|
154 |
+
<?php _e("See more", 'backup-migration'); ?>
|
155 |
+
</span>
|
156 |
+
</td>
|
157 |
+
</tr>
|
158 |
+
</tbody>
|
159 |
+
</table>
|
160 |
+
</div>
|
161 |
+
|
162 |
+
<div class="mm mtll f16">
|
163 |
+
<a href="#" class="nodec secondary hoverable" id="download-site-infos"><?php _e("Download your site infos", 'backup-migration'); ?></a> <?php _e("(e.g. for easy sharing with us, so that we can debug)", 'backup-migration'); ?>
|
164 |
+
</div>
|
165 |
+
|
166 |
+
<div class="mm mtl semibold">
|
167 |
+
<?php _e("Logging", 'backup-migration'); ?>
|
168 |
+
</div>
|
169 |
+
|
170 |
+
<div class="mm mtll f16">
|
171 |
+
<?php _e("All backup creation & restore processes are documented in log files which to debug issues.", 'backup-migration'); ?>
|
172 |
+
<a href="<?php echo get_site_url(); ?>/?backup-migration=PROGRESS_LOGS&progress-id=complete_logs.log&backup-id=current&t=<?php echo time(); ?>"
|
173 |
+
download="<?php _e('bmi-debug-info', 'backup-migration') ?>" class="nodec hoverable secondary">
|
174 |
+
<?php _e("Download logs.", 'backup-migration'); ?>
|
175 |
+
</a>
|
176 |
+
</div>
|
177 |
+
|
178 |
+
<div class="mm mtl mbll semibold">
|
179 |
+
<?php _e("Reset configuration", 'backup-migration'); ?>
|
180 |
+
</div>
|
181 |
+
|
182 |
+
<div class="mm mb f16">
|
183 |
+
<?php _e("Please", 'backup-migration'); ?> <a href="#" class="hoverable secondary modal-opener nodec" data-modal="reset-confirm-modal"><?php _e("click here", 'backup-migration'); ?></a> <?php _e("to reset plugin configuration.", 'backup-migration'); ?>
|
184 |
+
</div>
|
185 |
+
|
186 |
+
<div class="mm mb f18">
|
187 |
+
<?php _e("If you’re looking for other options not listed above, check out the", 'backup-migration'); ?> <a href="#" class="collapser-openner nodec secondary hoverable" data-el="#other-options"><?php _e("Other options", 'backup-migration'); ?></a> <?php _e("chapter as they might be there.", 'backup-migration'); ?>
|
188 |
+
</div>
|
189 |
+
|
190 |
+
</div>
|
191 |
+
|
192 |
+
<div class="mm center f20 mb">
|
193 |
+
<a href="#" class="text-muted close-chapters nodec"><?php _e("Collapse this chapter", 'backup-migration'); ?></a>
|
194 |
+
</div>
|
195 |
+
<div class="mbll"></div>
|
includes/dashboard/chapter/what_backed_up.php
ADDED
@@ -0,0 +1,389 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
// Namespace
|
4 |
+
namespace BMI\Plugin\Dashboard;
|
5 |
+
|
6 |
+
// Use
|
7 |
+
use BMI\Plugin\Backup_Migration_Plugin as BMP;
|
8 |
+
|
9 |
+
// Exit on direct access
|
10 |
+
if (!defined('ABSPATH')) {
|
11 |
+
exit;
|
12 |
+
}
|
13 |
+
|
14 |
+
function siteURL() {
|
15 |
+
$protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://";
|
16 |
+
$domainName = $_SERVER['HTTP_HOST'];
|
17 |
+
|
18 |
+
return $protocol . $domainName;
|
19 |
+
}
|
20 |
+
|
21 |
+
// Tooltips
|
22 |
+
$sellcodes_url = BMI_AUTHOR_URI;
|
23 |
+
$tooltip_files = __("Here are stored all plugin, theme, WordPress installation files, but also files from Media library and other folders and files located in your server’s site directory. Note that WordPress keeps records of files such as Media library in the Databases, so you should also backup Databases if you want WordPress to “see” e.g. recovered media files. Size here is the total size you can get.", 'backup-migration');
|
24 |
+
$domain = siteURL();
|
25 |
+
$tooltip_exclude_file = __("Enter the paths to the files you want to exclude from your backup (one per line).", 'backup-migration');
|
26 |
+
$tooltip_exclude_path = __("Enter the paths to the directories/folders you want to exclude from your backup (one per line).", 'backup-migration');
|
27 |
+
$tooltip_premium_details = __("You can already exclude files based on filters (click on “Yes” below), however in the premium plugin you’ll also be able to browse through them.", 'backup-migration') . "<br><br>";
|
28 |
+
$tooltip_premium_details .= __("This feature isn’t ready yet in the premium plugin, that’s why you can buy it at a", 'backup-migration') . "<b>" . __("big discount", 'backup-migration') . "</b>. <a href='" . $sellcodes_url . "' target='_blank'>" . __("Learn more", 'backup-migration') . "</a>.";
|
29 |
+
|
30 |
+
$tooltip_smart_exclusion = __("This feature isn’t ready yet in the premium plugin, that’s why you can buy it at a <b>big discount</b>. ", 'backup-migration');
|
31 |
+
$tooltip_smart_exclusion .= "<a href='" . $sellcodes_url . "' target='_blank'>" . __("Learn more", 'backup-migration') . "</a>.";
|
32 |
+
|
33 |
+
if (!function_exists('bmi_cb_collapsible')) {
|
34 |
+
function bmi_cb_collapsible($c) {
|
35 |
+
echo ' class="bmi_will_collapse" data-if-checked="' . $c . '"';
|
36 |
+
}
|
37 |
+
}
|
38 |
+
|
39 |
+
?>
|
40 |
+
|
41 |
+
<!-- Files -->
|
42 |
+
<div class="mm mt lh30">
|
43 |
+
<div class="mbl">
|
44 |
+
<?php _e("Here you can define what exactly will be included in the backup. If your site is very large it may make sense to only backup certain parts of it.", 'backup-migration'); ?>
|
45 |
+
</div>
|
46 |
+
|
47 |
+
<div class="">
|
48 |
+
|
49 |
+
<label for="files-group-backup">
|
50 |
+
<input id="files-group-backup"<?php bmi_cb_collapsible('file_group_cb'); ?> type="checkbox"<?php bmi_try_checked('BACKUP:FILES'); ?>>
|
51 |
+
<span id="bmi-scan-total" class="relative">
|
52 |
+
<b><?php _e("Files", 'backup-migration'); ?></b>
|
53 |
+
<span class="value">(<div class="spinner-loader"></div>)</span>
|
54 |
+
<span class="bmi-info-icon tooltip" tooltip="<?php echo $tooltip_files; ?>"></span>
|
55 |
+
</span>
|
56 |
+
</label>
|
57 |
+
|
58 |
+
</div>
|
59 |
+
|
60 |
+
</div>
|
61 |
+
|
62 |
+
<div id="file_group_cb">
|
63 |
+
<div class="mm92 lh30 file-checkboxes-wrapper mbl npb">
|
64 |
+
<div class="">
|
65 |
+
<span class="medium"><?php _e("Select which files you want to have backed up.", 'backup-migration'); ?></span>
|
66 |
+
</div>
|
67 |
+
<div class="flex file-checkboxes basic-file-exlusion">
|
68 |
+
|
69 |
+
<label for="files-group-plugins">
|
70 |
+
<div class="cf nm">
|
71 |
+
<div class="left nm" id="bmi-scan-plugins">
|
72 |
+
<input type="checkbox" id="files-group-plugins"<?php bmi_try_checked('BACKUP:FILES::PLUGINS'); ?>>
|
73 |
+
<span class="medium"><?php _e("Plugins", 'backup-migration'); ?></span> <span class="value">(<div class="spinner-loader"></div>)</span>
|
74 |
+
</div>
|
75 |
+
<div class="right mrr premium-wrapper nm" tooltip="<?php echo $tooltip_premium_details; ?>">
|
76 |
+
<div class="nm">
|
77 |
+
<span class="left f15">
|
78 |
+
<?php _e("Details", 'backup-migration'); ?>
|
79 |
+
</span>
|
80 |
+
<span class="right premium premium-img"></span>
|
81 |
+
</div>
|
82 |
+
</div>
|
83 |
+
</div>
|
84 |
+
</label>
|
85 |
+
|
86 |
+
<label for="files-group-uploads">
|
87 |
+
<div class="cf nm">
|
88 |
+
<div class="left nm" id="bmi-scan-plugins">
|
89 |
+
<input type="checkbox" id="files-group-uploads"<?php bmi_try_checked('BACKUP:FILES::UPLOADS'); ?>>
|
90 |
+
<span id="bmi-scan-uploads">
|
91 |
+
<span class="medium"><?php _e("Uploads", 'backup-migration'); ?></span> <span class="value">(<div class="spinner-loader"></div>)</span>
|
92 |
+
</span>
|
93 |
+
</div>
|
94 |
+
<div class="right mrr premium-wrapper nm" tooltip="<?php echo $tooltip_premium_details; ?>">
|
95 |
+
<div class="nm">
|
96 |
+
<span class="left f15">
|
97 |
+
<?php _e("Details", 'backup-migration'); ?>
|
98 |
+
</span>
|
99 |
+
<span class="right premium premium-img"></span>
|
100 |
+
</div>
|
101 |
+
</div>
|
102 |
+
</div>
|
103 |
+
</label>
|
104 |
+
|
105 |
+
<label for="files-group-themes">
|
106 |
+
<div class="cf nm">
|
107 |
+
<div class="left nm" id="bmi-scan-plugins">
|
108 |
+
<input type="checkbox" id="files-group-themes"<?php bmi_try_checked('BACKUP:FILES::THEMES'); ?>>
|
109 |
+
<span id="bmi-scan-themes">
|
110 |
+
<span class="medium"><?php _e("Themes", 'backup-migration'); ?></span> <span class="value">(<div class="spinner-loader"></div>)</span>
|
111 |
+
</span>
|
112 |
+
</div>
|
113 |
+
<div class="right mrr premium-wrapper nm" tooltip="<?php echo $tooltip_premium_details; ?>">
|
114 |
+
<div class="nm">
|
115 |
+
<span class="left f15">
|
116 |
+
<?php _e("Details", 'backup-migration'); ?>
|
117 |
+
</span>
|
118 |
+
<span class="right premium premium-img"></span>
|
119 |
+
</div>
|
120 |
+
</div>
|
121 |
+
</div>
|
122 |
+
</label>
|
123 |
+
|
124 |
+
<label for="files-group-other-contents">
|
125 |
+
<div class="cf nm">
|
126 |
+
<div class="left nm" id="bmi-scan-plugins">
|
127 |
+
<input type="checkbox" id="files-group-other-contents"<?php bmi_try_checked('BACKUP:FILES::OTHERS'); ?>>
|
128 |
+
<span id="bmi-scan-contents_others">
|
129 |
+
<span class="medium"><?php _e("Everything else in wp-content", 'backup-migration'); ?></span> <span class="value">(<div class="spinner-loader"></div>)</span>
|
130 |
+
</span>
|
131 |
+
</div>
|
132 |
+
<div class="right mrr premium-wrapper nm" tooltip="<?php echo $tooltip_premium_details; ?>">
|
133 |
+
<div class="nm">
|
134 |
+
<span class="left f15">
|
135 |
+
<?php _e("Details", 'backup-migration'); ?>
|
136 |
+
</span>
|
137 |
+
<span class="right premium premium-img"></span>
|
138 |
+
</div>
|
139 |
+
</div>
|
140 |
+
</div>
|
141 |
+
</label>
|
142 |
+
|
143 |
+
<label for="files-group-wp-install">
|
144 |
+
<div class="cf nm">
|
145 |
+
<div class="left nm" id="bmi-scan-plugins">
|
146 |
+
<input type="checkbox" id="files-group-wp-install"<?php bmi_try_checked('BACKUP:FILES::WP'); ?>>
|
147 |
+
<span id="bmi-scan-wordpress">
|
148 |
+
<span class="medium"><?php _e("WordPress installation", 'backup-migration'); ?></span> <span class="value">(<div class="spinner-loader"></div>)</span>
|
149 |
+
</span>
|
150 |
+
</div>
|
151 |
+
<div class="right mrr premium-wrapper nm" tooltip="<?php echo $tooltip_premium_details; ?>">
|
152 |
+
<div class="nm">
|
153 |
+
<span class="left f15">
|
154 |
+
<?php _e("Details", 'backup-migration'); ?>
|
155 |
+
</span>
|
156 |
+
<span class="right premium premium-img"></span>
|
157 |
+
</div>
|
158 |
+
</div>
|
159 |
+
</div>
|
160 |
+
</label>
|
161 |
+
|
162 |
+
</div>
|
163 |
+
<div class="mtl cf">
|
164 |
+
<div class="left inline-radio">
|
165 |
+
<?php _e("Want to exclude files based on filters?", 'backup-migration'); ?>
|
166 |
+
</div>
|
167 |
+
<div class="left d-flex mr60 ia-center">
|
168 |
+
<label class="container-radio">
|
169 |
+
<?php _e("No", 'backup-migration'); ?>
|
170 |
+
<input type="radio" name="exclude_files_by_filters"<?php bmi_cb_collapsible('file_filters_exclusion'); ?> value="false"<?php bmi_try_checked('BACKUP:FILES::FILTER', true); ?>>
|
171 |
+
<span class="checkmark-radio"></span>
|
172 |
+
</label>
|
173 |
+
<label class="container-radio ml25">
|
174 |
+
<?php _e("Yes", 'backup-migration'); ?>
|
175 |
+
<input id="files_by_filters" type="radio" name="exclude_files_by_filters"<?php bmi_cb_collapsible('file_filters_exclusion'); ?> value="true"<?php bmi_try_checked('BACKUP:FILES::FILTER'); ?>>
|
176 |
+
<span class="checkmark-radio"></span>
|
177 |
+
</label>
|
178 |
+
</div>
|
179 |
+
</div>
|
180 |
+
</div>
|
181 |
+
|
182 |
+
<!-- Files @ Filter (Excluder) -->
|
183 |
+
<div class="mm mtl mbl lh30 bg-second" id="file_filters_exclusion">
|
184 |
+
<div class="rr">
|
185 |
+
|
186 |
+
<div>
|
187 |
+
<label for="ex_b_fs">
|
188 |
+
<input type="checkbox" id="ex_b_fs"<?php bmi_cb_collapsible('file_filters_size'); ?><?php bmi_try_checked('BACKUP:FILES::FILTER:SIZE'); ?>>
|
189 |
+
<span id="bmi-scan-plugins">
|
190 |
+
<span class="medium"><?php _e("Exclude by", 'backup-migration'); ?> <b><?php _e("file size", 'backup-migration'); ?></b></span><span id="bmi__collon">:</span>
|
191 |
+
</span>
|
192 |
+
</label>
|
193 |
+
<div class="rr mtll" id="file_filters_size">
|
194 |
+
|
195 |
+
<?php _e("Do not backup files which are larger than", 'backup-migration'); ?>
|
196 |
+
<input type="number" min="0" id="BFFSIN" class="mbfieldlimit" <?php bmi_try_value('BACKUP:FILES::FILTER:SIZE:IN'); ?>>
|
197 |
+
MB
|
198 |
+
|
199 |
+
</div>
|
200 |
+
</div>
|
201 |
+
<div class="mtl" side="left">
|
202 |
+
<label for="ex_b_names">
|
203 |
+
<input type="checkbox" id="ex_b_names"<?php bmi_cb_collapsible('file_filters_names'); ?><?php bmi_try_checked('BACKUP:FILES::FILTER:NAMES'); ?>>
|
204 |
+
<span id="bmi-scan-plugins">
|
205 |
+
<span class="medium"><?php _e("Exclude by", 'backup-migration'); ?> <b><?php _e("file / folder name", 'backup-migration'); ?></b> <?php _e("(case-sensitive)", 'backup-migration'); ?></span>
|
206 |
+
</span>
|
207 |
+
</label>
|
208 |
+
<div class="rr" id="file_filters_names">
|
209 |
+
|
210 |
+
<div id="bmi_exclusion_rules"></div>
|
211 |
+
<div class="f16 hoverable mtll inline">
|
212 |
+
<a href="#" id="add-exclusion-rule" class="nodec secondary hoverable">+ <?php _e("Add an exclusion rule", 'backup-migration'); ?></a>
|
213 |
+
</div>
|
214 |
+
|
215 |
+
<div class="mt">
|
216 |
+
<?php _e('File names include the extension, e.g. if you select to exclude all files which end with “.psd” at the end then all files in psd format will be excluded.', 'backup-migration'); ?>
|
217 |
+
</div>
|
218 |
+
|
219 |
+
<div class="mtl mbll">
|
220 |
+
<?php _e("The folder where backups are stored (i.e. the backups which this plugin creates) is always excluded, to prevent you from taking backups of your own backups.", 'backup-migration'); ?>
|
221 |
+
</div>
|
222 |
+
|
223 |
+
</div>
|
224 |
+
</div>
|
225 |
+
|
226 |
+
<div class="mtl" side="left">
|
227 |
+
<label for="ex_b_fpaths">
|
228 |
+
<input type="checkbox" id="ex_b_fpaths"<?php bmi_cb_collapsible('file_filters_fpaths'); ?><?php bmi_try_checked('BACKUP:FILES::FILTER:FPATHS'); ?>>
|
229 |
+
<span id="bmi-scan-plugins" class="relative">
|
230 |
+
<span class="medium"><?php _e("Exclude by", 'backup-migration'); ?> <b><?php _e("file path", 'backup-migration'); ?></b></span>
|
231 |
+
<span class="bmi-info-icon tooltip" tooltip="<?php echo $tooltip_exclude_file; ?>"></span>
|
232 |
+
</span>
|
233 |
+
</label>
|
234 |
+
<div class="rr mtll" id="file_filters_fpaths">
|
235 |
+
|
236 |
+
<?php
|
237 |
+
$ex0 = __('Examples:', 'backup-migration');
|
238 |
+
$ex1 = BMP::fixSlashes(ABSPATH . 'wp-config.php');
|
239 |
+
$ex2 = BMP::fixSlashes(ABSPATH . 'debug.log');
|
240 |
+
$ex3 = BMP::fixSlashes(ABSPATH . 'readme.html');
|
241 |
+
?>
|
242 |
+
|
243 |
+
<textarea id="dynamic-fpaths-names" class="fullwidth bmi-txtar" name="name" rows="6" cols="80" placeholder="<?php echo $ex0 . ' ' . $ex1 . ' ' . $ex2 . ' ' . $ex3 ?>">
|
244 |
+
</textarea>
|
245 |
+
|
246 |
+
</div>
|
247 |
+
</div>
|
248 |
+
|
249 |
+
<div class="mtl" side="left">
|
250 |
+
<label for="ex_b_dpaths">
|
251 |
+
<input type="checkbox" id="ex_b_dpaths"<?php bmi_cb_collapsible('file_filters_dpaths'); ?><?php bmi_try_checked('BACKUP:FILES::FILTER:DPATHS'); ?>>
|
252 |
+
<span id="bmi-scan-plugins" class="relative">
|
253 |
+
<span class="medium"><?php _e("Exclude by", 'backup-migration'); ?> <b><?php _e("directory path", 'backup-migration'); ?></b></span>
|
254 |
+
<span class="bmi-info-icon tooltip" tooltip="<?php echo $tooltip_exclude_path; ?>"></span>
|
255 |
+
</span>
|
256 |
+
</label>
|
257 |
+
<div class="rr mtll" id="file_filters_dpaths">
|
258 |
+
|
259 |
+
<?php
|
260 |
+
$ex4 = BMP::fixSlashes(ABSPATH . 'wp-admin');
|
261 |
+
$ex5 = BMP::fixSlashes(ABSPATH . 'wp-includes');
|
262 |
+
$ex6 = BMP::fixSlashes(WP_CONTENT_DIR . '/uploads');
|
263 |
+
?>
|
264 |
+
|
265 |
+
<textarea id="dynamic-dpaths-names" class="fullwidth bmi-txtar" name="name" rows="6" cols="80" placeholder="<?php echo $ex0 . ' ' . $ex4 . ' ' . $ex5 . ' ' . $ex6 ?>">
|
266 |
+
</textarea>
|
267 |
+
|
268 |
+
</div>
|
269 |
+
</div>
|
270 |
+
|
271 |
+
</div>
|
272 |
+
</div>
|
273 |
+
</div>
|
274 |
+
|
275 |
+
<!-- Database -->
|
276 |
+
<div class="mm mtl lh30">
|
277 |
+
<div class="">
|
278 |
+
|
279 |
+
<label for="database-group-backup">
|
280 |
+
<input id="database-group-backup"<?php bmi_cb_collapsible('database_group_cb'); ?> type="checkbox"<?php bmi_try_checked('BACKUP:DATABASE'); ?>>
|
281 |
+
<span class="relative">
|
282 |
+
<b><?php _e("Databases", 'backup-migration'); ?> </b>
|
283 |
+
<span class="bmi-info-icon tooltip" tooltip="<?php echo $tooltip_files; ?>"></span>
|
284 |
+
</span>
|
285 |
+
</label>
|
286 |
+
|
287 |
+
</div>
|
288 |
+
</div>
|
289 |
+
|
290 |
+
<div id="database_group_cb">
|
291 |
+
<div class="mm92 mbl lh30 file-checkboxes-wrapper">
|
292 |
+
|
293 |
+
<div class="mbl">
|
294 |
+
<span class="regular"><?php _e("All databases (on the domain", 'backup-migration'); ?> <a href="<?php echo $domain; ?>" target="_blank"><?php echo $domain; ?></a>) <?php _e("will be backed up unless you exclude them by defining exclusion rules.", 'backup-migration'); ?></span>
|
295 |
+
</div>
|
296 |
+
|
297 |
+
<div class="flex file-checkboxes">
|
298 |
+
<div class="premium-wrapper">
|
299 |
+
<label class="autowidth premium premium-img">
|
300 |
+
<input type="checkbox" disabled>
|
301 |
+
<span>
|
302 |
+
<span class="regular text-muted"><?php _e("Exclude certain tables from backups", 'backup-migration'); ?></span>
|
303 |
+
</span>
|
304 |
+
</label>
|
305 |
+
</div>
|
306 |
+
</div>
|
307 |
+
|
308 |
+
</div>
|
309 |
+
</div>
|
310 |
+
|
311 |
+
<div class="mm mtll lh30">
|
312 |
+
|
313 |
+
<div class="cf">
|
314 |
+
<div class="left inline-radio semibold">
|
315 |
+
<?php _e('Want to apply "smart" exclusions rules?', 'backup-migration'); ?>
|
316 |
+
</div>
|
317 |
+
|
318 |
+
<div class="left d-flex mr60 ia-center">
|
319 |
+
<label id="nnmysql" class="container-radio active">
|
320 |
+
<?php _e("No", 'backup-migration'); ?>
|
321 |
+
<input id="nnmysql" type="radio" name="smart_exclusion_db_first_bm" value="true" checked>
|
322 |
+
<span class="checkmark-radio"></span>
|
323 |
+
</label>
|
324 |
+
<span class="cf premium-wrapper" tooltip="<?php echo $tooltip_smart_exclusion; ?>">
|
325 |
+
<label class="left container-radio ml25 not-allowed">
|
326 |
+
<?php _e("Yes", 'backup-migration'); ?>
|
327 |
+
<input type="radio" disabled name="smart_exclusion_db_first_bm">
|
328 |
+
<span class="checkmark-radio"></span>
|
329 |
+
</label>
|
330 |
+
<span class="left premium premium-img premium-nt mtf3"></span>
|
331 |
+
</span>
|
332 |
+
</div>
|
333 |
+
</div>
|
334 |
+
|
335 |
+
</div>
|
336 |
+
|
337 |
+
<div class="mm lh30 mbll">
|
338 |
+
<?php _e('With the "Files" and "Databases" options above you can already define what to include or exclude in your backup. However, you may want to exclude elements in your backups where you are not sure in which file or table they reside. For example, you may want to exclude all spam comments in your backups. This is what the "smart" exclusion rules are for. This is also a good way to clean your site of things you do not want.', 'backup-migration'); ?>
|
339 |
+
</div>
|
340 |
+
|
341 |
+
<div class="mm mtl mbl lh40 bg-second f20 overlayed">
|
342 |
+
|
343 |
+
<?php include BMI_INCLUDES . '/dashboard/templates/premium-overlay.php'; ?>
|
344 |
+
|
345 |
+
<div class="cf">
|
346 |
+
<label class="left half chhl">
|
347 |
+
<input type="checkbox" name="" value="">
|
348 |
+
<span><?php _e("Exclude", 'backup-migration'); ?> <b><?php _e("spam comments", 'backup-migration'); ?></b></span>
|
349 |
+
</label>
|
350 |
+
<label class="left half chhl">
|
351 |
+
<input type="checkbox" name="" value="">
|
352 |
+
<span><?php _e("Exclude all", 'backup-migration'); ?> <b><?php _e("cache files", 'backup-migration'); ?></b></span>
|
353 |
+
</label>
|
354 |
+
<label class="left half chhl">
|
355 |
+
<input type="checkbox" name="" value="">
|
356 |
+
<span><?php _e("Exclude all", 'backup-migration'); ?> <b><?php _e("deactivated plugins", 'backup-migration'); ?></b></span>
|
357 |
+
</label>
|
358 |
+
<label class="left half chhl">
|
359 |
+
<input type="checkbox" name="" value="">
|
360 |
+
<span><?php _e("Exclude all", 'backup-migration'); ?> <b><?php _e("debug logs", 'backup-migration'); ?></b></span>
|
361 |
+
</label>
|
362 |
+
<label class="left half chhl">
|
363 |
+
<input type="checkbox" name="" value="">
|
364 |
+
<span><?php _e("Exclude", 'backup-migration'); ?> <b><?php _e("all non-used themes", 'backup-migration'); ?></b></span>
|
365 |
+
</label>
|
366 |
+
<label class="left half chhl">
|
367 |
+
<input type="checkbox" name="" value="">
|
368 |
+
<span><?php _e("Exclude all", 'backup-migration'); ?> <b><?php _e("thumbnails", 'backup-migration'); ?></b></span>
|
369 |
+
</label>
|
370 |
+
<label class="left half chhl">
|
371 |
+
<input type="checkbox" name="" value="">
|
372 |
+
<span><?php _e("Exclude", 'backup-migration'); ?> <b><?php _e("post revisions", 'backup-migration'); ?></b></span>
|
373 |
+
</label>
|
374 |
+
</div>
|
375 |
+
|
376 |
+
</div>
|
377 |
+
|
378 |
+
|
379 |
+
<div class="mm mt mblll bold">
|
380 |
+
<?php _e("Summary / Sanity check", 'backup-migration'); ?>
|
381 |
+
</div>
|
382 |
+
|
383 |
+
<div class="mm mbl lh30 f20">
|
384 |
+
<?php _e("With above exclusion rules you excluded", 'backup-migration'); ?> <b id="esta-exclude">0 B</b> <?php _e("of data, which means your backup will be about", 'backup-migration'); ?> <b id="esta-size-for">0 B</b> <?php _e("large, unzipped.", 'backup-migration'); ?>
|
385 |
+
<!-- <?php _e("(refresh)", 'backup-migration'); ?> -->
|
386 |
+
<!-- <?php _e("See the list of files you excluded.", 'backup-migration'); ?> -->
|
387 |
+
</div>
|
388 |
+
|
389 |
+
<?php include BMI_INCLUDES . '/dashboard/chapter/save-button.php'; ?>
|
includes/dashboard/chapter/where_config.php
ADDED
@@ -0,0 +1,234 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
// Namespace
|
4 |
+
namespace BMI\Plugin\Dashboard;
|
5 |
+
|
6 |
+
// Exit on direct access
|
7 |
+
if (!defined('ABSPATH')) {
|
8 |
+
exit;
|
9 |
+
}
|
10 |
+
|
11 |
+
// Preorder URL
|
12 |
+
$preorder = BMI_AUTHOR_URI;
|
13 |
+
|
14 |
+
?>
|
15 |
+
|
16 |
+
<div class="mm mt mbl f20">
|
17 |
+
<?php _e("Select all the storage options you want to use:", 'backup-migration'); ?>
|
18 |
+
</div>
|
19 |
+
|
20 |
+
<div class="mm60">
|
21 |
+
<div class="mm tilo">
|
22 |
+
|
23 |
+
<div class="tab2">
|
24 |
+
<div class="tab2-item d-flex jst-sb ia-center activeList">
|
25 |
+
<div class="d-flex ia-center">
|
26 |
+
<img src="<?php echo $this->get_asset('images', '002-monitor-white.svg') ?>" alt="logo" class="tab2-img">
|
27 |
+
<span class="ml25">
|
28 |
+
<span class="title_whereStored"><?php _e("Locally", 'backup-migration'); ?></span>
|
29 |
+
<?php _e("(on this web server)", 'backup-migration'); ?>
|
30 |
+
</span>
|
31 |
+
</div>
|
32 |
+
<div class="ia-center">
|
33 |
+
<div class="b2 switch"><input type="checkbox" disabled="disabled" checked class="checkbox">
|
34 |
+
<div class="knobs"><span></span></div>
|
35 |
+
<div class="layer_str"></div>
|
36 |
+
</div>
|
37 |
+
</div>
|
38 |
+
</div>
|
39 |
+
<div class="bg_grey">
|
40 |
+
<div class="container-40 lh30 pt30 pb30">
|
41 |
+
<div class="d-flex">
|
42 |
+
<div class="w270" style="margin-top: 23px;"><span><?php _e("Backup directory path:", 'backup-migration'); ?></span></div>
|
43 |
+
<div>
|
44 |
+
<div class="w100 pos-r"><input type="text" id="bmi_path_storage_default" placeholder="<?php _e("Enter directory path", 'backup-migration'); ?>" class="input-locally_web_server" value="<?php echo sanitize_text_field(bmi_get_config('STORAGE::LOCAL::PATH')); ?>">
|
45 |
+
<!---->
|
46 |
+
</div>
|
47 |
+
<div class="mt20"><span>
|
48 |
+
<?php _e("That’s where your local backups will be stored. If you picked external storage this folder will also be used (to store your backup temporarily, until it is uploaded to the external storage).", 'backup-migration'); ?>
|
49 |
+
</span></div>
|
50 |
+
</div>
|
51 |
+
</div>
|
52 |
+
<div class="d-flex">
|
53 |
+
<div class="w270" style="margin-top: 23px;"><span><?php _e("Accessible via direct link?", 'backup-migration'); ?></span></div>
|
54 |
+
<div>
|
55 |
+
<div class="w100">
|
56 |
+
<div class="d-flex mr60 ia-center" style="margin-top: 23px;">
|
57 |
+
|
58 |
+
<label class="container-radio">
|
59 |
+
<?php _e("No", 'backup-migration'); ?>
|
60 |
+
<input type="radio" name="radioAccessViaLink" value="false"<?php echo (bmi_get_config('STORAGE::DIRECT::URL') === 'false')?' checked':'' ?>>
|
61 |
+
<span class="checkmark-radio"></span>
|
62 |
+
</label>
|
63 |
+
|
64 |
+
<label class="container-radio ml25">
|
65 |
+
<?php _e("Yes", 'backup-migration'); ?>
|
66 |
+
<input type="radio" name="radioAccessViaLink" value="true"<?php echo (bmi_get_config('STORAGE::DIRECT::URL') === 'true')?' checked':'' ?>>
|
67 |
+
<span class="checkmark-radio"></span>
|
68 |
+
</label>
|
69 |
+
|
70 |
+
</div>
|
71 |
+
</div>
|
72 |
+
<div class="mt20">
|
73 |
+
<span>
|
74 |
+
<?php _e('Select “Yes” if you want your (manually created) backups to be available via a direct link. This makes migration from one site to another super-fast.', 'backup-migration'); ?>
|
75 |
+
</span>
|
76 |
+
</div>
|
77 |
+
</div>
|
78 |
+
</div>
|
79 |
+
</div>
|
80 |
+
</div>
|
81 |
+
<div class="tab2-item">
|
82 |
+
<div class="not_ready"></div>
|
83 |
+
<div class="bg_clock_day2"><img src="<?php echo $this->get_asset('images', 'clock2.svg') ?>" alt="clock" class="clock_img">
|
84 |
+
<p class="f16"><?php _e("Coming soon also in the free plugin", 'backup-migration'); ?> – <b><?php _e("stay tuned!", 'backup-migration'); ?></b></p>
|
85 |
+
</div>
|
86 |
+
<div class="d-flex ia-center"><img src="<?php echo $this->get_asset('images', 'google-drive.svg') ?>" alt="logo" class="tab2-img"> <span class="ml25 title_whereStored"><?php _e("Google Drive", 'backup-migration'); ?></span></div>
|
87 |
+
<div class="ia-center">
|
88 |
+
<div class="b2 switch"><input type="checkbox" disabled="disabled" class="checkbox">
|
89 |
+
<div class="knobs"><span></span></div>
|
90 |
+
<div class="layer_str"></div>
|
91 |
+
</div>
|
92 |
+
</div>
|
93 |
+
</div>
|
94 |
+
<div class="tab2-item">
|
95 |
+
<div class="not_ready"></div>
|
96 |
+
<div class="bg_clock_day2"><img src="<?php echo $this->get_asset('images', 'clock2.svg') ?>" alt="clock" class="clock_img">
|
97 |
+
<p class="f16"><?php _e("Coming soon in the Premium Plugin", 'backup-migration'); ?> – <b><a href="<?php echo $preorder; ?>" target="_blanck" class="link-white"><?php _e("Order it now at a <b>big discount</b>!", 'backup-migration'); ?></a></b></p>
|
98 |
+
</div>
|
99 |
+
<div class="d-flex ia-center"><img src="<?php echo $this->get_asset('images', 'google-cloud.svg') ?>" alt="logo" class="tab2-img"> <span class="ml25 title_whereStored">Google Cloud</span> <img src="<?php echo $this->get_asset('images', 'premium.svg') ?>"
|
100 |
+
alt="logo" class="crown2"></div>
|
101 |
+
<div class="ia-center">
|
102 |
+
<div class="b2 switch"><input type="checkbox" disabled="disabled" class="checkbox">
|
103 |
+
<div class="knobs"><span></span></div>
|
104 |
+
<div class="layer_str"></div>
|
105 |
+
</div>
|
106 |
+
</div>
|
107 |
+
</div>
|
108 |
+
<div class="tab2-item">
|
109 |
+
<div class="not_ready"></div>
|
110 |
+
<div class="bg_clock_day2"><img src="<?php echo $this->get_asset('images', 'clock2.svg') ?>" alt="clock" class="clock_img">
|
111 |
+
<p class="f16"><?php _e("Coming soon also in the free plugin", 'backup-migration'); ?> – <b><?php _e("stay tuned!", 'backup-migration'); ?></b></p>
|
112 |
+
</div>
|
113 |
+
<div class="d-flex ia-center"><img src="<?php echo $this->get_asset('images', 'ftp.svg') ?>" alt="logo" class="tab2-img"> <span class="ml25 title_whereStored">FTP</span></div>
|
114 |
+
<div class="ia-center">
|
115 |
+
<div class="b2 switch"><input type="checkbox" disabled="disabled" class="checkbox">
|
116 |
+
<div class="knobs"><span></span></div>
|
117 |
+
<div class="layer_str"></div>
|
118 |
+
</div>
|
119 |
+
</div>
|
120 |
+
</div>
|
121 |
+
<div class="tab2-item">
|
122 |
+
<div class="not_ready"></div>
|
123 |
+
<div class="bg_clock_day2"><img src="<?php echo $this->get_asset('images', 'clock2.svg') ?>" alt="clock" class="clock_img">
|
124 |
+
<p class="f16"><?php _e("Coming soon in the Premium Plugin", 'backup-migration'); ?> – <b><a href="<?php echo $preorder; ?>" target="_blanck" class="link-white"><?php _e("Order it now at a <b>big discount</b>!", 'backup-migration'); ?></a></b></p>
|
125 |
+
</div>
|
126 |
+
<div class="d-flex ia-center"><img src="<?php echo $this->get_asset('images', 'sftp-scp.svg') ?>" alt="logo" class="tab2-img"> <span class="ml25 title_whereStored">SFTP / SCP</span> <img src="<?php echo $this->get_asset('images', 'premium.svg') ?>"
|
127 |
+
alt="logo" class="crown2"></div>
|
128 |
+
<div class="ia-center">
|
129 |
+
<div class="b2 switch"><input type="checkbox" disabled="disabled" class="checkbox">
|
130 |
+
<div class="knobs"><span></span></div>
|
131 |
+
<div class="layer_str"></div>
|
132 |
+
</div>
|
133 |
+
</div>
|
134 |
+
</div>
|
135 |
+
<div class="tab2-item">
|
136 |
+
<div class="not_ready"></div>
|
137 |
+
<div class="bg_clock_day2"><img src="<?php echo $this->get_asset('images', 'clock2.svg') ?>" alt="clock" class="clock_img">
|
138 |
+
<p class="f16"><?php _e("Coming soon also in the free plugin", 'backup-migration'); ?> – <b><?php _e("stay tuned!", 'backup-migration'); ?></b></p>
|
139 |
+
</div>
|
140 |
+
<div class="d-flex ia-center"><img src="<?php echo $this->get_asset('images', 'Amazon.svg') ?>" alt="logo" class="tab2-img"> <span class="ml25 title_whereStored">Amazon S3</span></div>
|
141 |
+
<div class="ia-center">
|
142 |
+
<div class="b2 switch"><input type="checkbox" disabled="disabled" class="checkbox">
|
143 |
+
<div class="knobs"><span></span></div>
|
144 |
+
<div class="layer_str"></div>
|
145 |
+
</div>
|
146 |
+
</div>
|
147 |
+
</div>
|
148 |
+
<div class="tab2-item">
|
149 |
+
<div class="not_ready"></div>
|
150 |
+
<div class="bg_clock_day2"><img src="<?php echo $this->get_asset('images', 'clock2.svg') ?>" alt="clock" class="clock_img">
|
151 |
+
<p class="f16"><?php _e("Coming soon in the Premium Plugin", 'backup-migration'); ?> – <b><a href="<?php echo $preorder; ?>" target="_blanck" class="link-white"><?php _e("Order it now at a <b>big discount</b>!", 'backup-migration'); ?></a></b></p>
|
152 |
+
</div>
|
153 |
+
<div class="d-flex ia-center"><img src="<?php echo $this->get_asset('images', 'microsoft-azure.svg') ?>" alt="logo" class="tab2-img"> <span class="ml25 title_whereStored">Microsoft Azure</span> <img src="<?php echo $this->get_asset('images', 'premium.svg') ?>"
|
154 |
+
alt="logo" class="crown2"></div>
|
155 |
+
<div class="ia-center">
|
156 |
+
<div class="b2 switch"><input type="checkbox" disabled="disabled" class="checkbox">
|
157 |
+
<div class="knobs"><span></span></div>
|
158 |
+
<div class="layer_str"></div>
|
159 |
+
</div>
|
160 |
+
</div>
|
161 |
+
</div>
|
162 |
+
<div class="tab2-item">
|
163 |
+
<div class="not_ready"></div>
|
164 |
+
<div class="bg_clock_day2"><img src="<?php echo $this->get_asset('images', 'clock2.svg') ?>" alt="clock" class="clock_img">
|
165 |
+
<p class="f16"><?php _e("Coming soon in the Premium Plugin", 'backup-migration'); ?> – <b><a href="<?php echo $preorder; ?>" target="_blanck" class="link-white"><?php _e("Order it now at a <b>big discount</b>!", 'backup-migration'); ?></a></b></p>
|
166 |
+
</div>
|
167 |
+
<div class="d-flex ia-center"><img src="<?php echo $this->get_asset('images', 'onedrive.svg') ?>" alt="logo" class="tab2-img"> <span class="ml25 title_whereStored">OneDrive</span> <img src="<?php echo $this->get_asset('images', 'premium.svg') ?>"
|
168 |
+
alt="logo" class="crown2"></div>
|
169 |
+
<div class="ia-center">
|
170 |
+
<div class="b2 switch"><input type="checkbox" disabled="disabled" class="checkbox">
|
171 |
+
<div class="knobs"><span></span></div>
|
172 |
+
<div class="layer_str"></div>
|
173 |
+
</div>
|
174 |
+
</div>
|
175 |
+
</div>
|
176 |
+
<div class="tab2-item">
|
177 |
+
<div class="not_ready"></div>
|
178 |
+
<div class="bg_clock_day2"><img src="<?php echo $this->get_asset('images', 'clock2.svg') ?>" alt="clock" class="clock_img">
|
179 |
+
<p class="f16"><?php _e("Coming soon also in the free plugin", 'backup-migration'); ?> – <b><?php _e("stay tuned!", 'backup-migration'); ?></b></p>
|
180 |
+
</div>
|
181 |
+
<div class="d-flex ia-center"><img src="<?php echo $this->get_asset('images', 'rackspace.svg') ?>" alt="logo" class="tab2-img"> <span class="ml25 title_whereStored">Rackspace</span></div>
|
182 |
+
<div class="ia-center">
|
183 |
+
<div class="b2 switch"><input type="checkbox" disabled="disabled" class="checkbox">
|
184 |
+
<div class="knobs"><span></span></div>
|
185 |
+
<div class="layer_str"></div>
|
186 |
+
</div>
|
187 |
+
</div>
|
188 |
+
</div>
|
189 |
+
<div class="tab2-item">
|
190 |
+
<div class="not_ready"></div>
|
191 |
+
<div class="bg_clock_day2"><img src="<?php echo $this->get_asset('images', 'clock2.svg') ?>" alt="clock" class="clock_img">
|
192 |
+
<p class="f16"><?php _e("Coming soon in the Premium Plugin", 'backup-migration'); ?> – <b><a href="<?php echo $preorder; ?>" target="_blanck" class="link-white"><?php _e("Order it now at a <b>big discount</b>!", 'backup-migration'); ?></a></b></p>
|
193 |
+
</div>
|
194 |
+
<div class="d-flex ia-center"><img src="<?php echo $this->get_asset('images', 'backblaze.svg') ?>" alt="logo" class="tab2-img"> <span class="ml25 title_whereStored">Backblaze</span> <img src="<?php echo $this->get_asset('images', 'premium.svg') ?>"
|
195 |
+
alt="logo" class="crown2"></div>
|
196 |
+
<div class="ia-center">
|
197 |
+
<div class="b2 switch"><input type="checkbox" disabled="disabled" class="checkbox">
|
198 |
+
<div class="knobs"><span></span></div>
|
199 |
+
<div class="layer_str"></div>
|
200 |
+
</div>
|
201 |
+
</div>
|
202 |
+
</div>
|
203 |
+
<div class="tab2-item">
|
204 |
+
<div class="not_ready"></div>
|
205 |
+
<div class="bg_clock_day2"><img src="<?php echo $this->get_asset('images', 'clock2.svg') ?>" alt="clock" class="clock_img">
|
206 |
+
<p class="f16"><?php _e("Coming soon also in the free plugin", 'backup-migration'); ?> – <b><?php _e("stay tuned!", 'backup-migration'); ?></b></p>
|
207 |
+
</div>
|
208 |
+
<div class="d-flex ia-center"><img src="<?php echo $this->get_asset('images', 'dream-objects.svg') ?>" alt="logo" class="tab2-img"> <span class="ml25 title_whereStored">DreamObjects</span></div>
|
209 |
+
<div class="ia-center">
|
210 |
+
<div class="b2 switch"><input type="checkbox" disabled="disabled" class="checkbox">
|
211 |
+
<div class="knobs"><span></span></div>
|
212 |
+
<div class="layer_str"></div>
|
213 |
+
</div>
|
214 |
+
</div>
|
215 |
+
</div>
|
216 |
+
<div class="tab2-item">
|
217 |
+
<div class="not_ready"></div>
|
218 |
+
<div class="bg_clock_day2"><img src="<?php echo $this->get_asset('images', 'clock2.svg') ?>" alt="clock" class="clock_img">
|
219 |
+
<p class="f16"><?php _e("Coming soon also in the free plugin", 'backup-migration'); ?> – <b><?php _e("stay tuned!", 'backup-migration'); ?></b></p>
|
220 |
+
</div>
|
221 |
+
<div class="d-flex ia-center"><img src="<?php echo $this->get_asset('images', 'openstack-swift.svg') ?>" alt="logo" class="tab2-img"> <span class="ml25 title_whereStored">Openstack (Swift)</span></div>
|
222 |
+
<div class="ia-center">
|
223 |
+
<div class="b2 switch"><input type="checkbox" disabled="disabled" class="checkbox">
|
224 |
+
<div class="knobs"><span></span></div>
|
225 |
+
<div class="layer_str"></div>
|
226 |
+
</div>
|
227 |
+
</div>
|
228 |
+
</div>
|
229 |
+
</div>
|
230 |
+
|
231 |
+
</div>
|
232 |
+
</div>
|
233 |
+
|
234 |
+
<?php include BMI_INCLUDES . '/dashboard/chapter/save-button.php'; ?>
|
includes/dashboard/modals/AA-Modal-Template.php
ADDED
@@ -0,0 +1,25 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
// Namespace
|
4 |
+
namespace BMI\Plugin\Dashboard;
|
5 |
+
|
6 |
+
// Exit on direct access
|
7 |
+
if (!defined('ABSPATH')) exit;
|
8 |
+
|
9 |
+
?>
|
10 |
+
|
11 |
+
<a href="#" class="modal-opener" data-modal="test-modal">Open test modal</a>
|
12 |
+
|
13 |
+
<div class="modal" id="test-modal">
|
14 |
+
|
15 |
+
<div class="modal-wrapper" style="max-width: 564px; max-width: min(564px, 80vw);">
|
16 |
+
<a href="#" class="modal-close">×</a>
|
17 |
+
<div class="modal-content">
|
18 |
+
|
19 |
+
<div class="mm60 f26 medium">We noticed:</div>
|
20 |
+
|
21 |
+
|
22 |
+
</div>
|
23 |
+
</div>
|
24 |
+
|
25 |
+
</div>
|
includes/dashboard/modals/backup-error-modal.php
ADDED
@@ -0,0 +1,67 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
// Namespace
|
4 |
+
namespace BMI\Plugin\Dashboard;
|
5 |
+
|
6 |
+
// Exit on direct access
|
7 |
+
if (!defined('ABSPATH')) exit;
|
8 |
+
|
9 |
+
?>
|
10 |
+
|
11 |
+
<div class="modal" id="backup-error-modal">
|
12 |
+
|
13 |
+
<div class="modal-wrapper no-hpad" style="max-width: 900px; max-width: min(900px, 80vw)">
|
14 |
+
<a href="#" class="modal-close">×</a>
|
15 |
+
<div class="modal-content center">
|
16 |
+
|
17 |
+
<div class="mm60 f30 bold black mb">
|
18 |
+
<div class="mb"><?php _e('There were some hick-ups...', 'backup-migration') ?></div>
|
19 |
+
<img src="<?php echo $this->get_asset('images', 'x-face.png'); ?>" alt="red-cross" width="110px">
|
20 |
+
</div>
|
21 |
+
|
22 |
+
<div class="mm60 f20 left-align">
|
23 |
+
<?php _e('The backup process ran into some difficulties. Error report:', 'backup-migration'); ?>
|
24 |
+
</div>
|
25 |
+
|
26 |
+
<div class="mm60 relative">
|
27 |
+
<div class="log-wrapper">
|
28 |
+
<pre id="backup-error-pre" style="min-height: 32px;"></pre>
|
29 |
+
</div>
|
30 |
+
|
31 |
+
<div class="mm60 right-align" style="position: absolute; top: 15px; right: 30px;">
|
32 |
+
<a href="#" class="btn inline btn-with-img btn-img-low-pad btn-pad bmi-copper" data-copy="backup-error-pre">
|
33 |
+
<div class="text">
|
34 |
+
<img src="<?php echo $this->get_asset('images', 'copy-icon.png'); ?>" alt="copy-img">
|
35 |
+
<div class="f18 semibold"><?php _e('Copy', 'backup-migration') ?></div>
|
36 |
+
</div>
|
37 |
+
</a>
|
38 |
+
</div>
|
39 |
+
</div>
|
40 |
+
|
41 |
+
<div class="mm60 f20 mbl mtl lh30 left-align">
|
42 |
+
<?php
|
43 |
+
_e('Please copy this and post into a new support thread you open in the Support Forum - we are happy to help you quickly (100% free)!', 'backup-migration');
|
44 |
+
?>
|
45 |
+
</div>
|
46 |
+
|
47 |
+
<div class="mm60 flex flexcenter mtl">
|
48 |
+
<div class="flex1 f16">
|
49 |
+
<a href="<?php echo get_site_url(); ?>/?backup-migration=PROGRESS_LOGS&progress-id=latest.log&backup-id=current&t=<?php echo time(); ?>"
|
50 |
+
class="hoverable nodec secondary" download="restore_error_log">
|
51 |
+
<?php _e('Download logs', 'backup-migration') ?>
|
52 |
+
</a>
|
53 |
+
</div>
|
54 |
+
<div class="flex2">
|
55 |
+
<a class="btn inline semibold mm60 f16" href="#">
|
56 |
+
<?php _e('Go to Support Forum', 'backup-migration') ?>
|
57 |
+
</a>
|
58 |
+
</div>
|
59 |
+
<div class="flex1 f16 tooltip-html info-cursor" tooltip="<?php _e("Your account on Wordpress.org (where you open a new support thread) is different to the one you login to your WordPress dashboard (where you are now). If you don't have a WordPress.org account yet, please sign up at the top right on here. It only takes a minute :) Thank you!", 'backup-migration') ?>">
|
60 |
+
<?php _e('Cannot login there?', 'backup-migration') ?>
|
61 |
+
</div>
|
62 |
+
</div>
|
63 |
+
|
64 |
+
</div>
|
65 |
+
</div>
|
66 |
+
|
67 |
+
</div>
|
includes/dashboard/modals/backup-progress-modal.php
ADDED
@@ -0,0 +1,76 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
// Namespace
|
4 |
+
namespace BMI\Plugin\Dashboard;
|
5 |
+
|
6 |
+
// Exit on direct access
|
7 |
+
if (!defined('ABSPATH')) exit;
|
8 |
+
|
9 |
+
?>
|
10 |
+
|
11 |
+
<div class="modal modal-no-close" id="backup-progress-modal">
|
12 |
+
|
13 |
+
<div class="modal-wrapper" style="max-width: 900px; max-width: min(900px, 80vw)">
|
14 |
+
<div class="modal-content center">
|
15 |
+
|
16 |
+
<div class="mm60 f26 bold black"><?php _e('Backup in progress', 'backup-migration') ?></div>
|
17 |
+
|
18 |
+
<div class="progress-bar-wrapper">
|
19 |
+
|
20 |
+
<div class="progress-bar">
|
21 |
+
<div class="progress-active-bar" style="width: 0%;"></div>
|
22 |
+
<div class="progress-percentage" style="left: 0%;">0%</div>
|
23 |
+
</div>
|
24 |
+
|
25 |
+
</div>
|
26 |
+
|
27 |
+
<div class="step-progress cf">
|
28 |
+
<div class="right f16 medium hoverable pointer"
|
29 |
+
data-show="<?php _e('Show live log', 'backup-migration') ?>"
|
30 |
+
data-hide="<?php _e('Hide live log', 'backup-migration') ?>"
|
31 |
+
id="live-log-toggle"
|
32 |
+
>
|
33 |
+
<?php _e('Hide live log', 'backup-migration') ?>
|
34 |
+
</div>
|
35 |
+
<div class="left f16 medium">
|
36 |
+
<?php _e('Step: ', 'backup-migration') ?>
|
37 |
+
<span id="current_step"><?php _e('Preparing backup process...', 'backup-migration') ?></span>
|
38 |
+
</div>
|
39 |
+
</div>
|
40 |
+
|
41 |
+
<div class="live-log" id="live-log-wrapper">
|
42 |
+
|
43 |
+
<div class="log-wrapper">
|
44 |
+
<pre></pre>
|
45 |
+
</div>
|
46 |
+
<div class="f16 semibold secondary hoverable pointer">
|
47 |
+
<a href="<?php echo get_site_url(); ?>/?backup-migration=PROGRESS_LOGS&progress-id=latest.log&backup-id=current&t=<?php echo time(); ?>"
|
48 |
+
download="<?php _e('live_progress', 'backup-migration') ?>" class="nlink">
|
49 |
+
<?php _e('Download live log', 'backup-migration') ?>
|
50 |
+
</a>
|
51 |
+
</div>
|
52 |
+
|
53 |
+
</div>
|
54 |
+
|
55 |
+
<div class="f18 semibold mtll">
|
56 |
+
<?php _e('Please don’t do any major modifications on your site while the backup is running.', 'backup-migration') ?>
|
57 |
+
</div>
|
58 |
+
|
59 |
+
<div class="mtl">
|
60 |
+
<div>
|
61 |
+
<a href="#" class="btn inline btn-with-img btn-img-low-pad btn-pad modal-closer backup-minimize">
|
62 |
+
<div class="text">
|
63 |
+
<img src="<?php echo $this->get_asset('images', 'minimize-min.png'); ?>" alt="minimize-img">
|
64 |
+
<div class="f18 semibold"><?php _e('Minimize this window', 'backup-migration') ?></div>
|
65 |
+
</div>
|
66 |
+
</a>
|
67 |
+
</div>
|
68 |
+
<div class="text-grey text-muted mtll f16 modal-closer medium red-text inline" data-close="backup-progress-modal" id="backup-stop">
|
69 |
+
<?php _e('Stop the backup process', 'backup-migration') ?>
|
70 |
+
</div>
|
71 |
+
</div>
|
72 |
+
|
73 |
+
</div>
|
74 |
+
</div>
|
75 |
+
|
76 |
+
</div>
|
includes/dashboard/modals/backup-success-modal.php
ADDED
@@ -0,0 +1,74 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
// Namespace
|
4 |
+
namespace BMI\Plugin\Dashboard;
|
5 |
+
|
6 |
+
// Exit on direct access
|
7 |
+
if (!defined('ABSPATH')) exit;
|
8 |
+
|
9 |
+
?>
|
10 |
+
|
11 |
+
<div class="modal" id="backup-success-modal">
|
12 |
+
|
13 |
+
<div class="modal-wrapper" style="max-width: 900px; max-width: min(900px, 80vw)">
|
14 |
+
<div class="modal-content">
|
15 |
+
|
16 |
+
<div class="mms f30 bold center black"><?php _e('Backup successful!', 'backup-migration') ?></div>
|
17 |
+
|
18 |
+
<div class="center mbl mtl">
|
19 |
+
<img src="<?php echo $this->get_asset('images', 'happy-smile.png'); ?>" alt="happy-img">
|
20 |
+
</div>
|
21 |
+
|
22 |
+
<div id="accessible-at-section">
|
23 |
+
<div class="mms mbl">
|
24 |
+
<div class="f18 mbll">
|
25 |
+
<?php _e('Your backup is now accessible at:', 'backup-migration') ?>
|
26 |
+
</div>
|
27 |
+
<div class="cf success-copy-input">
|
28 |
+
<input type="text" id="text-input-copy" readonly class="left f18">
|
29 |
+
<a href="#" class="btn inline btn-with-img btn-img-low-pad btn-pad left bmi-copper" data-copy="text-input-copy">
|
30 |
+
<div class="text">
|
31 |
+
<img src="<?php echo $this->get_asset('images', 'copy-icon.png'); ?>" alt="copy-img">
|
32 |
+
<div class="f18 semibold"><?php _e('Copy', 'backup-migration') ?></div>
|
33 |
+
</div>
|
34 |
+
</a>
|
35 |
+
</div>
|
36 |
+
</div>
|
37 |
+
|
38 |
+
<div class="mms f18 mtl lh30">
|
39 |
+
<?php _e('To migrate your site, just copy above link, install our plugin on the target site, go to the', 'backup-migration') ?>
|
40 |
+
"<a href="#" class="hoverable secondary go-to-marbs"><?php _e('Manage & Restore Backups', 'backup-migration') ?></a>"
|
41 |
+
<?php _e('- tab, and paste the link there.', 'backup-migration') ?>
|
42 |
+
</div>
|
43 |
+
</div>
|
44 |
+
|
45 |
+
<div class="f18 mtl mbl mms lh14">
|
46 |
+
<?php _e('You can manage the backup on the', 'backup-migration') ?>
|
47 |
+
"<a href="#" class="hoverable secondary go-to-marbs"><?php _e('Manage & Restore Backups', 'backup-migration') ?></a>"
|
48 |
+
<?php _e('- tab.', 'backup-migration') ?>
|
49 |
+
</div>
|
50 |
+
|
51 |
+
<div class="mms mtl flex-here lh50">
|
52 |
+
<div class="f18 align-left">
|
53 |
+
<a href="#" class="nlink hoverable" id="download-backup-url" download><?php _e('Download backup', 'backup-migration') ?></a>
|
54 |
+
</div>
|
55 |
+
|
56 |
+
<div class="center">
|
57 |
+
<a href="#" class="btn inline btn-pad modal-closer grey-btn nplr" data-close="backup-success-modal">
|
58 |
+
<div class="text">
|
59 |
+
<div class="f18 semibold"><?php _e('Close window', 'backup-migration') ?></div>
|
60 |
+
</div>
|
61 |
+
</a>
|
62 |
+
</div>
|
63 |
+
|
64 |
+
<div class="f18 inline align-right">
|
65 |
+
<a href="#" class="nlink hoverable" id="download-backup-log-url" download="<?php _e('backup-logs', 'backup-migration') ?>">
|
66 |
+
<?php _e('Download logs', 'backup-migration') ?>
|
67 |
+
</a>
|
68 |
+
</div>
|
69 |
+
</div>
|
70 |
+
|
71 |
+
</div>
|
72 |
+
</div>
|
73 |
+
|
74 |
+
</div>
|
includes/dashboard/modals/bfs-modal.php
ADDED
@@ -0,0 +1,76 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
// Namespace
|
4 |
+
namespace BMI\Plugin\Dashboard;
|
5 |
+
|
6 |
+
// Exit on direct access
|
7 |
+
if (!defined('ABSPATH')) exit;
|
8 |
+
|
9 |
+
?>
|
10 |
+
|
11 |
+
<div class="modal" id="bfs-modal">
|
12 |
+
|
13 |
+
<div class="modal-wrapper no-hpad" style="max-width: 1080px; max-width: min(1080px, 80vw);">
|
14 |
+
<a href="#" class="modal-close">×</a>
|
15 |
+
<div class="modal-content">
|
16 |
+
|
17 |
+
<table>
|
18 |
+
<tbody>
|
19 |
+
<tr>
|
20 |
+
|
21 |
+
<td>
|
22 |
+
<div class="mm60">
|
23 |
+
<img class="center block inline" style="height: 379px; transform: rotateY(180deg);" src="<?php echo $this->get_asset('images', 'kitty-cat.svg'); ?>" alt="kitty">
|
24 |
+
</div>
|
25 |
+
</td>
|
26 |
+
<td>
|
27 |
+
<div class="f20 lh30 mm" style="padding-left: 0;">
|
28 |
+
<div class="f35 semibold mbl">
|
29 |
+
<?php _e("Wow, your site is", 'backup-migration'); ?> <span class="bold"><?php _e("FAT!", 'backup-migration'); ?></span>
|
30 |
+
</div>
|
31 |
+
|
32 |
+
<div class="mbl">
|
33 |
+
<?php printf(__("For large sites (above %sGB) we point you to the premium plugin, because:", 'backup-migration'), BMI_REV); ?>
|
34 |
+
</div>
|
35 |
+
|
36 |
+
<div class="mbl">
|
37 |
+
<ul>
|
38 |
+
<li class="hasArrowRight"><?php _e("Big sites tend to be more support heavy", 'backup-migration'); ?></li>
|
39 |
+
<li class="hasArrowRight"><?php _e("We also need to buy food", 'backup-migration'); ?></li>
|
40 |
+
<li class="hasArrowRight"><?php _e("The plugin offers many features for free which other plugins don’t", 'backup-migration'); ?></li>
|
41 |
+
</ul>
|
42 |
+
</div>
|
43 |
+
|
44 |
+
<div class="mbll">
|
45 |
+
<?php _e("We made it really affordable and it’s a great way to show your appreciation and support the further development of the plugin :) Thank you!", 'backup-migration'); ?>
|
46 |
+
</div>
|
47 |
+
|
48 |
+
<a href="#" class="btn center lh45">
|
49 |
+
<div class="f18"><?php _e("Yes, that’s fair…", 'backup-migration'); ?></div>
|
50 |
+
<div class="f30 bold"><?php _e("Get premium", 'backup-migration'); ?></div>
|
51 |
+
<div class="f18"><?php _e("(which includes other cool features too!)", 'backup-migration'); ?></div>
|
52 |
+
</a>
|
53 |
+
|
54 |
+
</div>
|
55 |
+
</td>
|
56 |
+
|
57 |
+
</tr>
|
58 |
+
</tbody>
|
59 |
+
</table>
|
60 |
+
|
61 |
+
<div class="center f18 mt">
|
62 |
+
<span class="text-muted">
|
63 |
+
<?php _e("Tip: You can also", 'backup-migration'); ?>
|
64 |
+
</span>
|
65 |
+
<span class="hoverable secondary">
|
66 |
+
<a href="#" class="modal-closer secondary collapser-openner nodec" data-el="#exlucde-parts"><?php _e("exclude parts from backup", 'backup-migration'); ?></a>
|
67 |
+
</span>
|
68 |
+
<span class="text-muted">
|
69 |
+
, <?php _e("which makes it smaller so that you stay below this limit.", 'backup-migration'); ?>
|
70 |
+
</span>
|
71 |
+
</div>
|
72 |
+
|
73 |
+
</div>
|
74 |
+
</div>
|
75 |
+
|
76 |
+
</div>
|
includes/dashboard/modals/delete-confirm-modal.php
ADDED
@@ -0,0 +1,49 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
// Namespace
|
4 |
+
namespace BMI\Plugin\Dashboard;
|
5 |
+
|
6 |
+
// Exit on direct access
|
7 |
+
if (!defined('ABSPATH')) exit;
|
8 |
+
|
9 |
+
?>
|
10 |
+
|
11 |
+
<div class="modal" id="delete-confirm-modal">
|
12 |
+
|
13 |
+
<div class="modal-wrapper" style="max-width: 380px; max-width: min(380px, 80vw);">
|
14 |
+
<a href="#" class="modal-close">×</a>
|
15 |
+
<div class="modal-content">
|
16 |
+
|
17 |
+
<div class="mbl center">
|
18 |
+
<img class="center block inline" src="<?php echo $this->get_asset('images', 'trash.png'); ?>" alt="trash">
|
19 |
+
</div>
|
20 |
+
|
21 |
+
<div class="center f24 bold mbl lh30 text1">
|
22 |
+
<?php _e("You’re sure you want to", 'backup-migration'); ?><br>
|
23 |
+
<?php _e("delete this backup?", 'backup-migration'); ?>
|
24 |
+
</div>
|
25 |
+
|
26 |
+
<div class="center f24 bold mbl lh30 text2" style="display: none;">
|
27 |
+
<?php _e("You’re sure you want to", 'backup-migration'); ?><br>
|
28 |
+
<?php _e("delete", 'backup-migration'); ?>
|
29 |
+
(<span id="backup-multiple-del-count">1</span>)
|
30 |
+
<span id="del-only-one"><?php _e("backup?", 'backup-migration'); ?></span>
|
31 |
+
<span id="del-more-than-one" style="display: none;"><?php _e("backups?", 'backup-migration'); ?></span>
|
32 |
+
</div>
|
33 |
+
|
34 |
+
<div class="center f19 mbl">
|
35 |
+
<a href="#" id="sure_delete" class="btn bold red inline mm60">
|
36 |
+
<?php _e("Yes, kill it!", 'backup-migration'); ?>
|
37 |
+
</a>
|
38 |
+
</div>
|
39 |
+
|
40 |
+
<div class="center f19">
|
41 |
+
<a href="#" class="bold modal-closer hoverable text-muted nodec">
|
42 |
+
<?php _e("No, cancel", 'backup-migration'); ?>
|
43 |
+
</a>
|
44 |
+
</div>
|
45 |
+
|
46 |
+
</div>
|
47 |
+
</div>
|
48 |
+
|
49 |
+
</div>
|
includes/dashboard/modals/pre-restore-modal.php
ADDED
@@ -0,0 +1,68 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
// Namespace
|
4 |
+
namespace BMI\Plugin\Dashboard;
|
5 |
+
|
6 |
+
// Exit on direct access
|
7 |
+
if (!defined('ABSPATH')) {
|
8 |
+
exit;
|
9 |
+
}
|
10 |
+
|
11 |
+
// Premium
|
12 |
+
$sellcodes = BMI_AUTHOR_URI;
|
13 |
+
$tooltip = "This feature isn’t ready yet in the premium plugin, that’s why you can buy it at a <b>big discount</b>. ";
|
14 |
+
$tooltip .= "<a href='" . $sellcodes . "' target='_blank'>Learn more</a>.";
|
15 |
+
|
16 |
+
?>
|
17 |
+
|
18 |
+
<div class="modal" id="pre-restore-modal">
|
19 |
+
|
20 |
+
<div class="modal-wrapper no-hpad no-vpad" style="max-width: 900px; max-width: min(900px, 80vw)">
|
21 |
+
<a href="#" class="modal-close">×</a>
|
22 |
+
<div class="modal-content">
|
23 |
+
|
24 |
+
<div class="prenotices">
|
25 |
+
|
26 |
+
<div class="prenotice red top">
|
27 |
+
<div class="text bold">
|
28 |
+
<?php _e('All existing folders, files & databases on this site will be overwritten and destroyed for good. *', 'backup-migration') ?>
|
29 |
+
</div>
|
30 |
+
</div>
|
31 |
+
|
32 |
+
</div>
|
33 |
+
|
34 |
+
<div class="mm60 center f20 mbl">
|
35 |
+
<label for="restore-ok">
|
36 |
+
<input type="checkbox" id="restore-ok" />
|
37 |
+
<span><?php _e('Yes, I understand that. I am sound in mind.', 'backup-migration') ?></span>
|
38 |
+
</label>
|
39 |
+
</div>
|
40 |
+
|
41 |
+
<div class="mm60 center mbl">
|
42 |
+
<a href="#" class="btn max280" id="restore-start-sure">
|
43 |
+
<div class="text">
|
44 |
+
<div class="f20 bold"><?php _e('Start restoring!', 'backup-migration') ?></div>
|
45 |
+
</div>
|
46 |
+
</a>
|
47 |
+
</div>
|
48 |
+
|
49 |
+
<div class="mm60 center mbl f18">
|
50 |
+
<div class="premium-wrapper center block inline" tooltip="<?php echo $tooltip; ?>">
|
51 |
+
<div class="premium premium-img">
|
52 |
+
<?php _e('Only want to restore parts of the backup?', 'backup-migration') ?>
|
53 |
+
</div>
|
54 |
+
</div>
|
55 |
+
</div>
|
56 |
+
|
57 |
+
<div class="mm60 f18 center mbll">
|
58 |
+
<a href="#" class="modal-closer text-muted" data-close="pre-restore-modal"><?php _e('Close window & do not restore', 'backup-migration') ?></a>
|
59 |
+
</div>
|
60 |
+
|
61 |
+
<div class="mm60 center mb">
|
62 |
+
<?php _e('* Only those folders, files & database will be replaced which also exist in the backup file.', 'backup-migration') ?>
|
63 |
+
</div>
|
64 |
+
|
65 |
+
</div>
|
66 |
+
</div>
|
67 |
+
|
68 |
+
</div>
|
includes/dashboard/modals/prenotice-modal.php
ADDED
@@ -0,0 +1,69 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
// Namespace
|
4 |
+
namespace BMI\Plugin\Dashboard;
|
5 |
+
|
6 |
+
// Exit on direct access
|
7 |
+
if (!defined('ABSPATH')) exit;
|
8 |
+
|
9 |
+
?>
|
10 |
+
|
11 |
+
<div class="modal" id="prenotice-modal">
|
12 |
+
|
13 |
+
<div class="modal-wrapper no-hpad" style="max-width: 660px; max-width: min(660px, 80vw);">
|
14 |
+
<a href="#" class="modal-close">×</a>
|
15 |
+
<div class="modal-content">
|
16 |
+
|
17 |
+
<div class="mm60 f26 medium black"><?php _e('We noticed:', 'backup-migration') ?></div>
|
18 |
+
<div class="prenotices">
|
19 |
+
|
20 |
+
<div class="prenotice red prenotic-1">
|
21 |
+
<div class="text">
|
22 |
+
<?php _e('You running quite low on space. Maybe it would be good to clear up some space before you do the backup.', 'backup-migration') ?>
|
23 |
+
</div>
|
24 |
+
</div>
|
25 |
+
<div class="prenotice prenotic-2">
|
26 |
+
<div class="text">
|
27 |
+
<?php _e('You may not have enough memory (RAM) to create the backup. You can still try, if it fails check out the troubleshooting section.', 'backup-migration') ?>
|
28 |
+
</div>
|
29 |
+
</div>
|
30 |
+
<div class="prenotice prenotic-3">
|
31 |
+
<div class="text">
|
32 |
+
<?php _e('Based on your selections ', 'backup-migration') ?>
|
33 |
+
<span id="prenotice-size"></span><?php _e(' of data (unzipped) will be backed up.', 'backup-migration') ?>
|
34 |
+
</div>
|
35 |
+
</div>
|
36 |
+
<div class="prenotice prenotic-4">
|
37 |
+
<div class="text">
|
38 |
+
<?php _e('You selected to only back up part of your site (not a complete backup).', 'backup-migration') ?>
|
39 |
+
</div>
|
40 |
+
</div>
|
41 |
+
<div class="prenotice prenotic-5">
|
42 |
+
<div class="text">
|
43 |
+
<?php _e('You selected only files for backup - without database.', 'backup-migration') ?>
|
44 |
+
</div>
|
45 |
+
</div>
|
46 |
+
<div class="prenotice prenotic-6">
|
47 |
+
<div class="text">
|
48 |
+
<?php _e('You selected only database to backup - without website files.', 'backup-migration') ?>
|
49 |
+
</div>
|
50 |
+
</div>
|
51 |
+
|
52 |
+
</div>
|
53 |
+
<div class="mm60 center">
|
54 |
+
<a href="#" class="btn btn-with-img" id="start-entire-backup">
|
55 |
+
<div class="text">
|
56 |
+
<img style="margin-top: 1px;" src="<?php echo $this->get_asset('images', 'backup-min.svg'); ?>" alt="server-img" height="50px" class="img-now">
|
57 |
+
<div class="f18 regular"><?php _e('That’s all fine / I don’t care…', 'backup-migration') ?></div>
|
58 |
+
<div class="f25 bold"><?php _e('Create the backup!', 'backup-migration') ?></div>
|
59 |
+
</div>
|
60 |
+
</a>
|
61 |
+
<div class="text-grey text-muted mtl f18 modal-closer inline" data-close="prenotice-modal">
|
62 |
+
<?php _e('Don’t do backup & close this pop-up', 'backup-migration') ?>
|
63 |
+
</div>
|
64 |
+
</div>
|
65 |
+
|
66 |
+
</div>
|
67 |
+
</div>
|
68 |
+
|
69 |
+
</div>
|
includes/dashboard/modals/reset-confirm-modal.php
ADDED
@@ -0,0 +1,40 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
// Namespace
|
4 |
+
namespace BMI\Plugin\Dashboard;
|
5 |
+
|
6 |
+
// Exit on direct access
|
7 |
+
if (!defined('ABSPATH')) exit;
|
8 |
+
|
9 |
+
?>
|
10 |
+
|
11 |
+
<div class="modal" id="reset-confirm-modal">
|
12 |
+
|
13 |
+
<div class="modal-wrapper" style="min-height: 0px; max-width: 564px; max-width: min(564px, 80vw);">
|
14 |
+
<div class="modal-content">
|
15 |
+
|
16 |
+
<div class="flex flexcenter">
|
17 |
+
<div class="mr20">
|
18 |
+
<img class="inline" src="<?php echo $this->get_asset('images', 'warning-red.png'); ?>" alt="error">
|
19 |
+
</div>
|
20 |
+
<div class="semibold f18 center lh30">
|
21 |
+
<?php _e("Do you really want to reset the configuration?", 'backup-migration'); ?><br>
|
22 |
+
<?php _e("This action cannot be undone!", 'backup-migration'); ?>
|
23 |
+
</div>
|
24 |
+
</div>
|
25 |
+
|
26 |
+
<div class="center mtl">
|
27 |
+
<div class="cf inline">
|
28 |
+
<div class="left inline mr50">
|
29 |
+
<a href="#" class="btn bold mm red" id="configuration-reset-absolute"><?php _e("Yes, reset", 'backup-migration'); ?></a>
|
30 |
+
</div>
|
31 |
+
<div class="left inline">
|
32 |
+
<a href="#" class="btn bold mm grey nodec modal-closer"><?php _e("No, cancel", 'backup-migration'); ?></a>
|
33 |
+
</div>
|
34 |
+
</div>
|
35 |
+
</div>
|
36 |
+
|
37 |
+
</div>
|
38 |
+
</div>
|
39 |
+
|
40 |
+
</div>
|
includes/dashboard/modals/restore-error-modal.php
ADDED
@@ -0,0 +1,67 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
// Namespace
|
4 |
+
namespace BMI\Plugin\Dashboard;
|
5 |
+
|
6 |
+
// Exit on direct access
|
7 |
+
if (!defined('ABSPATH')) exit;
|
8 |
+
|
9 |
+
?>
|
10 |
+
|
11 |
+
<div class="modal" id="restore-error-modal">
|
12 |
+
|
13 |
+
<div class="modal-wrapper no-hpad" style="max-width: 900px; max-width: min(900px, 80vw)">
|
14 |
+
<a href="#" class="modal-close">×</a>
|
15 |
+
<div class="modal-content center">
|
16 |
+
|
17 |
+
<div class="mm60 f30 bold black flex flexcenter mb">
|
18 |
+
<img src="<?php echo $this->get_asset('images', 'red-cross.svg'); ?>" alt="red-cross" width="110px">
|
19 |
+
<?php _e('Restore failed', 'backup-migration') ?>
|
20 |
+
</div>
|
21 |
+
|
22 |
+
<div class="mm60 f20 left-align">
|
23 |
+
<?php _e('The restoring process ran into some difficulties. Error report:', 'backup-migration') ?>
|
24 |
+
</div>
|
25 |
+
|
26 |
+
<div class="mm60 relative">
|
27 |
+
<div class="log-wrapper">
|
28 |
+
<pre id="restore-error-pre" style="min-height: 32px;"></pre>
|
29 |
+
</div>
|
30 |
+
|
31 |
+
<div class="mm60 right-align" style="position: absolute; top: 15px; right: 30px;">
|
32 |
+
<a href="#" class="btn inline btn-with-img btn-img-low-pad btn-pad bmi-copper" data-copy="restore-error-pre">
|
33 |
+
<div class="text">
|
34 |
+
<img src="<?php echo $this->get_asset('images', 'copy-icon.png'); ?>" alt="copy-img">
|
35 |
+
<div class="f18 semibold"><?php _e('Copy', 'backup-migration') ?></div>
|
36 |
+
</div>
|
37 |
+
</a>
|
38 |
+
</div>
|
39 |
+
</div>
|
40 |
+
|
41 |
+
<div class="mm60 f20 mbl mtl lh30 left-align">
|
42 |
+
<?php
|
43 |
+
_e('Please copy this and post into a new support thread you open in the Support Forum - we are happy to help you quickly (100% free)!', 'backup-migration');
|
44 |
+
?>
|
45 |
+
</div>
|
46 |
+
|
47 |
+
<div class="mm60 flex flexcenter mtl">
|
48 |
+
<div class="flex1 f16">
|
49 |
+
<a href="<?php echo get_site_url(); ?>/?backup-migration=PROGRESS_LOGS&progress-id=latest_migration.log&backup-id=current&t=<?php echo time(); ?>"
|
50 |
+
class="hoverable nodec secondary" download="restore_error_log">
|
51 |
+
<?php _e('Download logs', 'backup-migration') ?>
|
52 |
+
</a>
|
53 |
+
</div>
|
54 |
+
<div class="flex2">
|
55 |
+
<a class="btn inline semibold mm60 f16" href="#">
|
56 |
+
<?php _e('Go to Support Forum', 'backup-migration') ?>
|
57 |
+
</a>
|
58 |
+
</div>
|
59 |
+
<div class="flex1 f16 tooltip-html info-cursor" tooltip="<?php _e("Your account on Wordpress.org (where you open a new support thread) is different to the one you login to your WordPress dashboard (where you are now). If you don't have a WordPress.org account yet, please sign up at the top right on here. It only takes a minute :) Thank you!", 'backup-migration') ?>">
|
60 |
+
<?php _e('Cannot login there?', 'backup-migration') ?>
|
61 |
+
</div>
|
62 |
+
</div>
|
63 |
+
|
64 |
+
</div>
|
65 |
+
</div>
|
66 |
+
|
67 |
+
</div>
|
includes/dashboard/modals/restore-progress-modal.php
ADDED
@@ -0,0 +1,51 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
// Namespace
|
4 |
+
namespace BMI\Plugin\Dashboard;
|
5 |
+
|
6 |
+
// Exit on direct access
|
7 |
+
if (!defined('ABSPATH')) exit;
|
8 |
+
|
9 |
+
?>
|
10 |
+
|
11 |
+
<div class="modal modal-no-close modal-not-allowed" id="restore-progress-modal">
|
12 |
+
|
13 |
+
<div class="modal-wrapper no-hpad" style="max-width: 900px; max-width: min(900px, 80vw)">
|
14 |
+
<div class="modal-content center">
|
15 |
+
|
16 |
+
<div class="mm60 f30 bold black"><?php _e('Restoring in progress', 'backup-migration') ?></div>
|
17 |
+
|
18 |
+
<div class="red-error-bg tml">
|
19 |
+
<div class="red-warning mtl mbl f18">
|
20 |
+
<?php _e('Do not close this window as long as the restoring process is ongoing', 'backup-migration'); ?>
|
21 |
+
</div>
|
22 |
+
</div>
|
23 |
+
|
24 |
+
<div class="mm60 progress-bar-wrapper">
|
25 |
+
|
26 |
+
<div class="progress-bar">
|
27 |
+
<div class="progress-active-bar" style="width: 0%;"></div>
|
28 |
+
<div class="progress-percentage" style="left: 0%;">0%</div>
|
29 |
+
</div>
|
30 |
+
|
31 |
+
</div>
|
32 |
+
|
33 |
+
<div class="mm60 step-progress cf">
|
34 |
+
<div class="left f16 medium">
|
35 |
+
<?php _e('Step: ', 'backup-migration') ?>
|
36 |
+
<span id="restore_current_step"><?php _e('Preparing restore process...', 'backup-migration') ?></span>
|
37 |
+
</div>
|
38 |
+
</div>
|
39 |
+
|
40 |
+
<div class="mm60 live-log" id="restore-live-log-wrapper">
|
41 |
+
|
42 |
+
<div class="log-wrapper">
|
43 |
+
<pre></pre>
|
44 |
+
</div>
|
45 |
+
|
46 |
+
</div>
|
47 |
+
|
48 |
+
</div>
|
49 |
+
</div>
|
50 |
+
|
51 |
+
</div>
|
includes/dashboard/modals/restore-success-modal.php
ADDED
@@ -0,0 +1,74 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
// Namespace
|
4 |
+
namespace BMI\Plugin\Dashboard;
|
5 |
+
|
6 |
+
// Exit on direct access
|
7 |
+
if (!defined('ABSPATH')) exit;
|
8 |
+
|
9 |
+
?>
|
10 |
+
|
11 |
+
<div class="modal modal-no-close" id="restore-success-modal">
|
12 |
+
|
13 |
+
<div class="modal-wrapper no-hpad" style="max-width: 850px; max-width: min(850px, 80vw)">
|
14 |
+
<div class="modal-content center">
|
15 |
+
|
16 |
+
<div class="mm60 f35 bold black mbl mtl"><?php _e('Restore successful!', 'backup-migration') ?></div>
|
17 |
+
<img class="mb mtl" src="<?php echo $this->get_asset('images', 'happy-smile.png'); ?>" alt="success">
|
18 |
+
|
19 |
+
<div class="mbl f20 lh30">
|
20 |
+
<?php _e("Liked how easy it was? Then PLEASE support the further", 'backup-migration'); ?><br>
|
21 |
+
<?php _e("development of our plugins by doing the following:", 'backup-migration'); ?>
|
22 |
+
</div>
|
23 |
+
|
24 |
+
<div class="cf mb inline center block suc-buttns">
|
25 |
+
<div class="left a1">
|
26 |
+
<a href="#" class="btn lime">
|
27 |
+
<div class="flex nowrap flexcenter">
|
28 |
+
<div class="fcentr">
|
29 |
+
<img class="center block inline" src="<?php echo $this->get_asset('images', 'thumb.png'); ?>" alt="trash">
|
30 |
+
</div>
|
31 |
+
<div class="fbcont lh20">
|
32 |
+
<span class="fbhead semibold"><?php _e("Give us a nice rating", 'backup-migration'); ?></span>
|
33 |
+
<?php _e("…so that others discover our", 'backup-migration'); ?>
|
34 |
+
<?php _e("plugin & benefit from it too.", 'backup-migration'); ?>
|
35 |
+
</div>
|
36 |
+
</div>
|
37 |
+
</a>
|
38 |
+
</div>
|
39 |
+
<div class="left a2">
|
40 |
+
<a href="#" class="btn">
|
41 |
+
<div class="flex nowrap flexcenter">
|
42 |
+
<div class="fcentr">
|
43 |
+
<img class="center block inline" src="<?php echo $this->get_asset('images', 'crown-bg.png'); ?>" alt="trash">
|
44 |
+
</div>
|
45 |
+
<div class="fbcont lh20">
|
46 |
+
<span class="fbhead semibold"><?php _e("Get our Premium plugin", 'backup-migration'); ?></span>
|
47 |
+
<?php _e("…to benefit from many cool features & support.", 'backup-migration'); ?>
|
48 |
+
</div>
|
49 |
+
</div>
|
50 |
+
|
51 |
+
</a>
|
52 |
+
</div>
|
53 |
+
</div>
|
54 |
+
|
55 |
+
<div class="mb f28 secondary center semibold">
|
56 |
+
<?php _e("Thank you!!", 'backup-migration'); ?>
|
57 |
+
</div>
|
58 |
+
|
59 |
+
<div class="center mbl">
|
60 |
+
<a href="#" class="btn width50 f22 inline grey bold nodec site-reloader">
|
61 |
+
<?php _e("Ok, close", 'backup-migration'); ?>
|
62 |
+
</a>
|
63 |
+
</div>
|
64 |
+
|
65 |
+
<div class="center f17 mbl">
|
66 |
+
<a href="<?php echo get_site_url(); ?>/?backup-migration=PROGRESS_LOGS&progress-id=latest_migration.log&backup-id=current&t=<?php echo time(); ?>"
|
67 |
+
download="<?php _e('restore_process_logs', 'backup-migration') ?>">
|
68 |
+
<?php _e("Download the log", 'backup-migration'); ?></a> <?php _e("of the restoration process", 'backup-migration'); ?>
|
69 |
+
</div>
|
70 |
+
|
71 |
+
</div>
|
72 |
+
</div>
|
73 |
+
|
74 |
+
</div>
|
includes/dashboard/modals/upload-exist-file-modal.php
ADDED
@@ -0,0 +1,41 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
// Namespace
|
4 |
+
namespace BMI\Plugin\Dashboard;
|
5 |
+
|
6 |
+
// Exit on direct access
|
7 |
+
if (!defined('ABSPATH')) exit;
|
8 |
+
|
9 |
+
?>
|
10 |
+
|
11 |
+
<div class="modal" id="upload-exist-file-modal">
|
12 |
+
|
13 |
+
<div class="modal-wrapper" style="max-width: 564px; max-width: min(564px, 80vw);">
|
14 |
+
<div class="modal-content">
|
15 |
+
|
16 |
+
<div class="center">
|
17 |
+
<div class="mbl cf center block inline">
|
18 |
+
<div class="left center">
|
19 |
+
<img class="inline" src="<?php echo $this->get_asset('images', 'warning-red.png'); ?>" alt="error">
|
20 |
+
</div>
|
21 |
+
<div class="left f24 bold lh50 mms"><?php _e("File already exist", 'backup-migration'); ?></div>
|
22 |
+
</div>
|
23 |
+
</div>
|
24 |
+
|
25 |
+
<div class="center f19 regular mbl lh30">
|
26 |
+
<?php _e("The file you tried to upload already match,", 'backup-migration'); ?><br>
|
27 |
+
<?php _e("name and size of file which already,", 'backup-migration'); ?><br>
|
28 |
+
<?php _e("exist in your backup directory.", 'backup-migration'); ?><br><br>
|
29 |
+
<?php _e("If you wish to have duplicate change name of the upload.", 'backup-migration'); ?><br>
|
30 |
+
</div>
|
31 |
+
|
32 |
+
<div class="center">
|
33 |
+
<a href="#" class="btn modal-closer inline mm60 center block bold nodec">
|
34 |
+
<?php _e("Ok, close", 'backup-migration'); ?>
|
35 |
+
</a>
|
36 |
+
</div>
|
37 |
+
|
38 |
+
</div>
|
39 |
+
</div>
|
40 |
+
|
41 |
+
</div>
|
includes/dashboard/modals/upload-invalid-manifest-modal.php
ADDED
@@ -0,0 +1,39 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
// Namespace
|
4 |
+
namespace BMI\Plugin\Dashboard;
|
5 |
+
|
6 |
+
// Exit on direct access
|
7 |
+
if (!defined('ABSPATH')) exit;
|
8 |
+
|
9 |
+
?>
|
10 |
+
|
11 |
+
<div class="modal" id="upload-invalid-manifest-modal">
|
12 |
+
|
13 |
+
<div class="modal-wrapper" style="max-width: 564px; max-width: min(564px, 80vw);">
|
14 |
+
<div class="modal-content">
|
15 |
+
|
16 |
+
<div class="center">
|
17 |
+
<div class="mbl cf center block inline">
|
18 |
+
<div class="left center">
|
19 |
+
<img class="inline" src="<?php echo $this->get_asset('images', 'warning-red.png'); ?>" alt="error">
|
20 |
+
</div>
|
21 |
+
<div class="left f24 bold lh50 mms"><?php _e("Invalid backup", 'backup-migration'); ?></div>
|
22 |
+
</div>
|
23 |
+
</div>
|
24 |
+
|
25 |
+
<div class="center f19 regular mbl lh30">
|
26 |
+
<?php _e("Uploaded file is not valid backup,", 'backup-migration'); ?><br>
|
27 |
+
<?php _e("we removed the file from the server.", 'backup-migration'); ?>
|
28 |
+
</div>
|
29 |
+
|
30 |
+
<div class="center">
|
31 |
+
<a href="#" class="btn modal-closer inline mm60 center block bold nodec">
|
32 |
+
<?php _e("Ok, close", 'backup-migration'); ?>
|
33 |
+
</a>
|
34 |
+
</div>
|
35 |
+
|
36 |
+
</div>
|
37 |
+
</div>
|
38 |
+
|
39 |
+
</div>
|
includes/dashboard/modals/upload-success-modal.php
ADDED
@@ -0,0 +1,39 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
// Namespace
|
4 |
+
namespace BMI\Plugin\Dashboard;
|
5 |
+
|
6 |
+
// Exit on direct access
|
7 |
+
if (!defined('ABSPATH')) exit;
|
8 |
+
|
9 |
+
?>
|
10 |
+
|
11 |
+
<div class="modal" id="upload-success-modal">
|
12 |
+
|
13 |
+
<div class="modal-wrapper" style="max-width: 645px; max-width: min(645px, 80vw);">
|
14 |
+
<div class="modal-content">
|
15 |
+
|
16 |
+
<div class="center">
|
17 |
+
<div class="mbl cf center block inline">
|
18 |
+
<div class="left center">
|
19 |
+
<img class="inline" src="<?php echo $this->get_asset('images', 'success.png'); ?>" alt="success">
|
20 |
+
</div>
|
21 |
+
<div class="left f24 bold lh50"><?php _e("Upload successful!", 'backup-migration'); ?></div>
|
22 |
+
</div>
|
23 |
+
</div>
|
24 |
+
|
25 |
+
<div class="f19 mbl center lh30">
|
26 |
+
<?php _e("We also triggered a rescan of your local folder automatically,", 'backup-migration'); ?><br>
|
27 |
+
<?php _e("so that the file will show up in your list of backups.", 'backup-migration'); ?>
|
28 |
+
</div>
|
29 |
+
|
30 |
+
<div class="center">
|
31 |
+
<a href="#" class="btn modal-closer inline mm60 center block bold nodec">
|
32 |
+
<?php _e("Ok, close", 'backup-migration'); ?>
|
33 |
+
</a>
|
34 |
+
</div>
|
35 |
+
|
36 |
+
</div>
|
37 |
+
</div>
|
38 |
+
|
39 |
+
</div>
|
includes/dashboard/modals/upload-wrong-file-modal.php
ADDED
@@ -0,0 +1,39 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
// Namespace
|
4 |
+
namespace BMI\Plugin\Dashboard;
|
5 |
+
|
6 |
+
// Exit on direct access
|
7 |
+
if (!defined('ABSPATH')) exit;
|
8 |
+
|
9 |
+
?>
|
10 |
+
|
11 |
+
<div class="modal" id="upload-wrong-file-modal">
|
12 |
+
|
13 |
+
<div class="modal-wrapper" style="max-width: 564px; max-width: min(564px, 80vw);">
|
14 |
+
<div class="modal-content">
|
15 |
+
|
16 |
+
<div class="center">
|
17 |
+
<div class="mbl cf center block inline">
|
18 |
+
<div class="left center">
|
19 |
+
<img class="inline" src="<?php echo $this->get_asset('images', 'warning-red.png'); ?>" alt="error">
|
20 |
+
</div>
|
21 |
+
<div class="left f24 bold lh50 mms"><?php _e("Not right file type", 'backup-migration'); ?></div>
|
22 |
+
</div>
|
23 |
+
</div>
|
24 |
+
|
25 |
+
<div class="center f19 regular mbl lh30">
|
26 |
+
<?php _e("The file you tried to upload isn’t a zip-file.", 'backup-migration'); ?><br>
|
27 |
+
<?php _e("All backup files are saved as zip.", 'backup-migration'); ?>
|
28 |
+
</div>
|
29 |
+
|
30 |
+
<div class="center">
|
31 |
+
<a href="#" class="btn modal-closer inline mm60 center block bold nodec">
|
32 |
+
<?php _e("Ok, close", 'backup-migration'); ?>
|
33 |
+
</a>
|
34 |
+
</div>
|
35 |
+
|
36 |
+
</div>
|
37 |
+
</div>
|
38 |
+
|
39 |
+
</div>
|
includes/dashboard/modules/backup-ongoing.php
ADDED
@@ -0,0 +1,19 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<div class="f17 hoverable" id="bmi-ongoing-backup" style="display: none;">
|
2 |
+
|
3 |
+
<div class="nuts">
|
4 |
+
<img class="nut spinning nut-1" src="<?php echo $this->get_asset('images', 'nut-big.png'); ?>" alt="nut">
|
5 |
+
<img class="nut spinning-reverse nut-2" src="<?php echo $this->get_asset('images', 'nut-mid.png'); ?>" alt="nut">
|
6 |
+
<img class="nut spinning-reverse nut-3" src="<?php echo $this->get_asset('images', 'nut-small.png'); ?>" alt="nut">
|
7 |
+
</div>
|
8 |
+
|
9 |
+
<div class="centered">
|
10 |
+
<div class="bold">
|
11 |
+
<?php _e("Backup in progress!", 'backup-migration'); ?>
|
12 |
+
</div>
|
13 |
+
|
14 |
+
<div class="">
|
15 |
+
<?php _e("Click to see status quo", 'backup-migration'); ?>
|
16 |
+
</div>
|
17 |
+
</div>
|
18 |
+
|
19 |
+
</div>
|
includes/dashboard/modules/backup_controller.php
ADDED
@@ -0,0 +1,213 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
// Namespace
|
4 |
+
namespace BMI\Plugin\Dashboard;
|
5 |
+
|
6 |
+
// Exit on direct access
|
7 |
+
if (!defined('ABSPATH')) exit;
|
8 |
+
|
9 |
+
// ThMaker
|
10 |
+
function __th($n) {
|
11 |
+
|
12 |
+
$ths = [__("st", 'backup-migration'), __("nd", 'backup-migration'), __("rd", 'backup-migration'), __("th", 'backup-migration')];
|
13 |
+
$n = intval($n);
|
14 |
+
$nah = [11, 12, 13];
|
15 |
+
|
16 |
+
if (in_array($n, $nah)) return $ths[3];
|
17 |
+
else {
|
18 |
+
|
19 |
+
if (substr(''.$n, -1) == '1') return $ths[0];
|
20 |
+
elseif (substr(''.$n, -1) == '2') return $ths[1];
|
21 |
+
elseif (substr(''.$n, -1) == '3') return $ths[2];
|
22 |
+
else return $ths[3];
|
23 |
+
|
24 |
+
}
|
25 |
+
|
26 |
+
}
|
27 |
+
|
28 |
+
?>
|
29 |
+
|
30 |
+
<div class="backup-creator cf section-bmi" id="bmi-section--cron">
|
31 |
+
<div class="left">
|
32 |
+
<div class="create-now pointer bmi-backup-btn one shadow" id="i-backup-creator">
|
33 |
+
<div class="insider"></div>
|
34 |
+
<div class="insider-2"></div>
|
35 |
+
<div class="vcenter">
|
36 |
+
<img src="<?php echo $this->get_asset('images', 'backup-min.svg'); ?>" alt="server-img" height="50px" class="img-now">
|
37 |
+
<div class="text">
|
38 |
+
<span class="medium pointer">
|
39 |
+
<?php _e('Create backup', 'backup-migration') ?> <span class="bold"><?php _e('now!', 'backup-migration') ?></span>
|
40 |
+
</span>
|
41 |
+
</div>
|
42 |
+
</div>
|
43 |
+
</div>
|
44 |
+
</div>
|
45 |
+
<div class="left cron-backups-wrap" id="i-backup-cron">
|
46 |
+
<div class="cron-backups shadow relative<?php echo ((bmi_get_config('CRON:ENABLED') === false) ? ' disabled' : '') ?>">
|
47 |
+
<div class="turned-off pointer transition"<?php echo ((bmi_get_config('CRON:ENABLED') === true) ? ' style="display: none"' : '') ?>>
|
48 |
+
<div class="vcenter">
|
49 |
+
<div class="fullwidth">
|
50 |
+
<div class="cf inline lh28">
|
51 |
+
<div class="left">
|
52 |
+
<img src="<?php echo $this->get_asset('images', 'timemachine.svg'); ?>" alt="cron-icon" height="30px;">
|
53 |
+
</div>
|
54 |
+
<div class="left">
|
55 |
+
<span class="f20 regular">
|
56 |
+
<?php _e('... or have', 'backup-migration') ?>
|
57 |
+
<span class="semibold"><?php _e('backups created automatically', 'backup-migration') ?></span>
|
58 |
+
</span>
|
59 |
+
</div>
|
60 |
+
</div>
|
61 |
+
</div>
|
62 |
+
</div>
|
63 |
+
</div>
|
64 |
+
<div class="turned-on f18"<?php echo ((bmi_get_config('CRON:ENABLED') === false) ? ' style="display: none"' : '') ?>>
|
65 |
+
|
66 |
+
<div class="cron-a cf">
|
67 |
+
<div class="left semibold relative">
|
68 |
+
<?php _e("Automatic backups creation", 'backup-migration'); ?>
|
69 |
+
<span class="bmi-info-icon tooltip cron-time-server" tooltip=""></span>
|
70 |
+
</div>
|
71 |
+
<div class="right">
|
72 |
+
|
73 |
+
<label for="cron-btn-toggle" class="bmi-switch">
|
74 |
+
<input type="checkbox" id="cron-btn-toggle"<?php echo ((bmi_get_config('CRON:ENABLED') === false) ? ' checked' : '') ?>>
|
75 |
+
<div class="bmi-switch-slider round">
|
76 |
+
<span class="on"><?php _e("On", 'backup-migration'); ?></span>
|
77 |
+
<span class="off"><?php _e("Off", 'backup-migration'); ?></span>
|
78 |
+
</div>
|
79 |
+
</label>
|
80 |
+
|
81 |
+
</div>
|
82 |
+
</div>
|
83 |
+
|
84 |
+
<div class="cron-bc">
|
85 |
+
<div class="cron-b bg-second cf">
|
86 |
+
<table class="ooo-to-pad">
|
87 |
+
<tbody>
|
88 |
+
<tr>
|
89 |
+
<td class="orr" style="min-width: 76px;"><?php _e("Create a backup every", 'backup-migration'); ?></td>
|
90 |
+
<td>
|
91 |
+
<select id="cron-period" data-parent="#bmi-section--cron" data-classes="orr" data-def="<?php echo sanitize_text_field(bmi_get_config('CRON:TYPE')); ?>">
|
92 |
+
<option value="month"><?php _e("Month", 'backup-migration'); ?></option>
|
93 |
+
<option value="week"><?php _e("Week", 'backup-migration'); ?></option>
|
94 |
+
<option value="day"><?php _e("Day", 'backup-migration'); ?></option>
|
95 |
+
</select>
|
96 |
+
</td>
|
97 |
+
<td id="cron-on-word"><?php _e("on", 'backup-migration'); ?></td>
|
98 |
+
<td class="cron-the"><?php _e("the", 'backup-migration'); ?></td>
|
99 |
+
<td>
|
100 |
+
<select id="cron-day" data-parent="#bmi-section--cron" data-classes="left orr oll" data-def="<?php echo sanitize_text_field(bmi_get_config('CRON:DAY')); ?>">
|
101 |
+
<?php for ($i = 0; $i < 28; ++$i): ?>
|
102 |
+
<?php $d = ($i+1); ?>
|
103 |
+
<option value="<?php echo $d; ?>"><?php echo $d . __th($d); ?></option>
|
104 |
+
<?php endfor; ?>
|
105 |
+
</select>
|
106 |
+
</td>
|
107 |
+
<td>
|
108 |
+
<select id="cron-week" data-parent="#bmi-section--cron" data-classes="orr oll" data-hide="true" data-def="<?php echo sanitize_text_field(bmi_get_config('CRON:WEEK')); ?>">
|
109 |
+
<option value="1"><?php _e("Monday", 'backup-migration'); ?></option>
|
110 |
+
<option value="2"><?php _e("Tuesday", 'backup-migration'); ?></option>
|
111 |
+
<option value="3"><?php _e("Wednesday", 'backup-migration'); ?></option>
|
112 |
+
<option value="4"><?php _e("Thursday", 'backup-migration'); ?></option>
|
113 |
+
<option value="5"><?php _e("Friday", 'backup-migration'); ?></option>
|
114 |
+
<option value="6"><?php _e("Saturday", 'backup-migration'); ?></option>
|
115 |
+
<option value="7"><?php _e("Sunday", 'backup-migration'); ?></option>
|
116 |
+
</select>
|
117 |
+
</td>
|
118 |
+
<td class="orr"><?php _e("at", 'backup-migration'); ?></td>
|
119 |
+
<td>
|
120 |
+
<select id="cron-hour" data-parent="#bmi-section--cron" data-def="<?php echo sanitize_text_field(bmi_get_config('CRON:HOUR')); ?>">
|
121 |
+
<?php for ($i = 0; $i < 24; ++$i): ?>
|
122 |
+
<?php $d = substr('0' . ($i), -2); ?>
|
123 |
+
<option value="<?php echo $d; ?>"><?php echo $d; ?></option>
|
124 |
+
<?php endfor; ?>
|
125 |
+
</select>
|
126 |
+
</td>
|
127 |
+
<td class="orr oll"><?php _e("hours and", 'backup-migration'); ?></td>
|
128 |
+
<td>
|
129 |
+
<select id="cron-minute" data-parent="#bmi-section--cron" data-def="<?php echo sanitize_text_field(bmi_get_config('CRON:MINUTE')); ?>">
|
130 |
+
<?php for ($i = 0; $i < 60; $i += 5): ?>
|
131 |
+
<?php $d = substr('0' . ($i), -2); ?>
|
132 |
+
<option value="<?php echo $d; ?>"><?php echo $d; ?></option>
|
133 |
+
<?php endfor; ?>
|
134 |
+
</select>
|
135 |
+
</td>
|
136 |
+
<td class="orr"><?php _e("minutes", 'backup-migration'); ?></td>
|
137 |
+
</tr>
|
138 |
+
</tbody>
|
139 |
+
</table>
|
140 |
+
</div>
|
141 |
+
|
142 |
+
<div class="cron-c cf">
|
143 |
+
<table class="left ooo-to-pad" style="max-width: calc(100% - 110px);">
|
144 |
+
<tbody>
|
145 |
+
<tr>
|
146 |
+
<td class="orr oll">
|
147 |
+
<?php _e("...and keep the last", 'backup-migration'); ?>
|
148 |
+
</td>
|
149 |
+
<td>
|
150 |
+
<select id="cron-keep-backups" data-parent="#bmi-section--cron" data-def="<?php echo sanitize_text_field(bmi_get_config('CRON:KEEP')); ?>">
|
151 |
+
<?php for ($i = 0; $i < 20; ++$i): ?>
|
152 |
+
<option value="<?php echo ($i+1); ?>"><?php echo ($i+1); ?></option>
|
153 |
+
<?php endfor; ?>
|
154 |
+
</select>
|
155 |
+
</td>
|
156 |
+
<td class="orr oll">
|
157 |
+
<?php _e("backups that have been created automatically.", 'backup-migration'); ?>
|
158 |
+
</td>
|
159 |
+
</tr>
|
160 |
+
</tbody>
|
161 |
+
</table>
|
162 |
+
<div class="lrn-mr-btn hoverable secondary right">
|
163 |
+
<?php _e('Learn more', 'backup-migration'); ?>
|
164 |
+
</div>
|
165 |
+
</div>
|
166 |
+
</div>
|
167 |
+
|
168 |
+
</div>
|
169 |
+
</div>
|
170 |
+
</div>
|
171 |
+
</div>
|
172 |
+
|
173 |
+
<div class="mbl learn_more_about_cron" style="display: none;">
|
174 |
+
<ol style="list-style: outside;">
|
175 |
+
<li>
|
176 |
+
<?php _e("Above times are", 'backup-migration'); ?>
|
177 |
+
<b><?php _e("server times", 'backup-migration'); ?></b>
|
178 |
+
(<span id="server-time-auto" data-time="<?php echo time(); ?>"></span>)
|
179 |
+
</li>
|
180 |
+
<li>
|
181 |
+
<?php _e("There needs to be", 'backup-migration'); ?>
|
182 |
+
<b><?php _e("at least one visitor", 'backup-migration'); ?></b>
|
183 |
+
<?php _e("so that the backup process gets triggered (learn more about this in the", 'backup-migration'); ?>
|
184 |
+
<span class="secondary hoverable collapser-openner" data-el="#troubleshooting-chapter"><?php _e("troubleshooting section", 'backup-migration'); ?></span>)
|
185 |
+
</li>
|
186 |
+
<li>
|
187 |
+
<?php _e("We suggest to", 'backup-migration'); ?>
|
188 |
+
<b><?php _e("only keep 2 or 3 backups", 'backup-migration'); ?></b>
|
189 |
+
<?php _e("otherwise you may run out of space.", 'backup-migration'); ?>
|
190 |
+
</li>
|
191 |
+
<li>
|
192 |
+
<b><?php _e("Locked backups will not be deleted", 'backup-migration'); ?></b>
|
193 |
+
<?php _e("automatically. Those are indicated by a lock sign", 'backup-migration'); ?>
|
194 |
+
<img src="<?php echo $this->get_asset('images', 'lock-min.svg'); ?>" alt="lock" class="inline" height="18px">.
|
195 |
+
<?php _e('Manually created backups (i.e. those after click on "Create backup now!") are locked, while automatically created backups are unlocked.', 'backup-migration'); ?>
|
196 |
+
<?php _e("You can change their lock status on the", 'backup-migration'); ?>
|
197 |
+
<span class="secondary hoverable go-to-marbs"><?php _e("Manage & Restore Backup(s)", 'backup-migration'); ?></span>
|
198 |
+
<?php _e("tab", 'backup-migration'); ?>.
|
199 |
+
</li>
|
200 |
+
<li>
|
201 |
+
<?php _e("For", 'backup-migration'); ?>
|
202 |
+
<b><?php _e("other triggers", 'backup-migration'); ?></b>
|
203 |
+
<?php _e("when your backups are created, please go", 'backup-migration'); ?>
|
204 |
+
<span class="secondary hoverable collapser-openner" data-el="#other-options"><?php _e("here", 'backup-migration'); ?></span>.
|
205 |
+
</li>
|
206 |
+
<li>
|
207 |
+
<?php _e("Settings change saves automatically and it's confirmed with alert.", 'backup-migration'); ?>.
|
208 |
+
</li>
|
209 |
+
</ol>
|
210 |
+
<div class="right-align hoverable secondary closer-learn-more">
|
211 |
+
<?php _e("Collapse", 'backup-migration'); ?>
|
212 |
+
</div>
|
213 |
+
</div>
|
includes/dashboard/modules/backups-table-header.php
ADDED
@@ -0,0 +1,42 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
// Namespace
|
4 |
+
namespace BMI\Plugin\Dashboard;
|
5 |
+
|
6 |
+
// Exit on direct access
|
7 |
+
if (!defined('ABSPATH')) exit;
|
8 |
+
|
9 |
+
?>
|
10 |
+
|
11 |
+
<tr>
|
12 |
+
<th>
|
13 |
+
<label for="backups-select-all">
|
14 |
+
<input id="backups-select-all" type="checkbox">
|
15 |
+
<div class="inline tooltip" tooltip="<?php _e('When your backup was created, in server time', 'backup-migration') ?>" data-top="5">
|
16 |
+
<?php _e('Backup date', 'backup-migration') ?>
|
17 |
+
</div>
|
18 |
+
</label>
|
19 |
+
</th>
|
20 |
+
<th>
|
21 |
+
<div class="inline tooltip" tooltip="<?php _e('The name of your backup. To see the logic which default names your backups get, go to chapter "How backups will be stored"', 'backup-migration') ?>" data-top="5">
|
22 |
+
<?php _e('Filename', 'backup-migration') ?>
|
23 |
+
</div>
|
24 |
+
</th>
|
25 |
+
<th>
|
26 |
+
<div class="inline tooltip" tooltip="<?php _e('Size of your backup file', 'backup-migration') ?>" data-top="5">
|
27 |
+
<?php _e('Size', 'backup-migration') ?>
|
28 |
+
</div>
|
29 |
+
</th>
|
30 |
+
<th style="text-align: center;">
|
31 |
+
<div class="tooltip inline" tooltip="<?php _e('Locked backups can only be deleted manually. Unlocked backups get deleted automatically according to the deletion processes which you defined at the top of the "Create backups" - tab. Click on the icon(s) to change the lock status.', 'backup-migration') ?>" data-top="5">
|
32 |
+
<?php _e('Locked?', 'backup-migration') ?>
|
33 |
+
</div>
|
34 |
+
</th>
|
35 |
+
<th>
|
36 |
+
<div class="inline tooltip" tooltip="<?php _e('Move over the icons to see what you can do with the backup(s)', 'backup-migration') ?>" data-top="5">
|
37 |
+
<?php _e('Actions', 'backup-migration') ?>
|
38 |
+
</div>
|
39 |
+
</th>
|
40 |
+
<th></th>
|
41 |
+
<th></th>
|
42 |
+
</tr>
|
includes/dashboard/modules/backups-under-table.php
ADDED
@@ -0,0 +1,93 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
// Namespace
|
4 |
+
namespace BMI\Plugin\Dashboard;
|
5 |
+
use BMI\Plugin\Backup_Migration_Plugin AS BMP;
|
6 |
+
|
7 |
+
// Exit on direct access
|
8 |
+
if (!defined('ABSPATH')) exit;
|
9 |
+
|
10 |
+
?>
|
11 |
+
|
12 |
+
<div class="cf lh28 valign-restore">
|
13 |
+
|
14 |
+
<div class="left cf hoverable" id="show-upload-area">
|
15 |
+
<div class="left">
|
16 |
+
<img class="a2" src="<?php echo $this->get_asset('images', 'upload-min.png'); ?>" width="15px" alt="image">
|
17 |
+
</div>
|
18 |
+
<div class="left f16 secondary hoverable">
|
19 |
+
<?php _e('Upload backup files', 'backup-migration') ?>
|
20 |
+
</div>
|
21 |
+
</div>
|
22 |
+
|
23 |
+
<div class="left cf" style="margin-left: 35px;">
|
24 |
+
<div class="left">
|
25 |
+
<img class="a1" src="<?php echo $this->get_asset('images', 'search-min.png'); ?>" width="15px" alt="image">
|
26 |
+
</div>
|
27 |
+
<div class="left f16">
|
28 |
+
<?php _e('Rescan for backup files:', 'backup-migration') ?>
|
29 |
+
<a href="#" id="rescan-for-backups" class="secondary hoverable"><?php _e('Locally', 'backup-migration') ?></a>
|
30 |
+
<span style="display: none;">| <a href="#"><?php _e('Remotely', 'backup-migration') ?></a></span>
|
31 |
+
<span id="reloading-bm-list" style="display: none;"><div class="spinner-loader"></div></span>
|
32 |
+
</div>
|
33 |
+
</div>
|
34 |
+
|
35 |
+
</div>
|
36 |
+
|
37 |
+
<div class="mtl del-all-btn-wrp mbll" style="display: none;">
|
38 |
+
<button class="btn red deleteAllSelected"><?php _e('Delete all selected backups', 'backup-migration') ?></button>
|
39 |
+
</div>
|
40 |
+
|
41 |
+
<div class="upload_area hidden">
|
42 |
+
|
43 |
+
<div id="drop-area">
|
44 |
+
<label for="upid_input">
|
45 |
+
<form class="my-form center mt">
|
46 |
+
<div class="img_upload center block"></div>
|
47 |
+
<div class="f18 muted-text mtll">
|
48 |
+
<?php _e("Drag & drop your backup file here", 'backup-migration'); ?>
|
49 |
+
</div>
|
50 |
+
<div class="cf mtl center block inline">
|
51 |
+
<div class="left ortext">
|
52 |
+
<?php _e("...or", 'backup-migration'); ?>
|
53 |
+
</div>
|
54 |
+
<div class="left">
|
55 |
+
<div class="btn upload_button">
|
56 |
+
<?php _e("Browse for file", 'backup-migration'); ?>
|
57 |
+
</div>
|
58 |
+
</div>
|
59 |
+
</div>
|
60 |
+
<input type="file" id="upid_input" accept=".zip" onchange="jQuery.fchunker_upload()">
|
61 |
+
</form>
|
62 |
+
</label>
|
63 |
+
</div>
|
64 |
+
|
65 |
+
<div class="mtl center upload-progress" style="display: none;">
|
66 |
+
|
67 |
+
<div class="upload-title mtl">
|
68 |
+
<?php _e("Upload in progress", 'backup-migration'); ?>
|
69 |
+
</div>
|
70 |
+
|
71 |
+
<div class="upload-progress-bar">
|
72 |
+
<span>
|
73 |
+
<div class="upload-percentage">99%</div>
|
74 |
+
</span>
|
75 |
+
</div>
|
76 |
+
|
77 |
+
<div class="mtll">
|
78 |
+
<a href="#" class="f16 medium red-text nodec hoverable" onclick="window.location.reload()"><?php _e("Cancel upload", 'backup-migration'); ?></a>
|
79 |
+
</div>
|
80 |
+
|
81 |
+
</div>
|
82 |
+
|
83 |
+
<div class="f18 mt30 lh30">
|
84 |
+
<?php _e("Alternatively, you can place the files (e.g. via FTP) into your local backup directory", 'backup-migration'); ?> (<?php echo BMP::fixSlashes(BMI_BACKUPS); ?>) <?php _e('or remote storage, and then use the "Rescan for backup files"-option above to make them show up in the list.', 'backup-migration'); ?>
|
85 |
+
</div>
|
86 |
+
|
87 |
+
</div>
|
88 |
+
|
89 |
+
<div class="center mtll" id="load-more-backups-wrp">
|
90 |
+
<a href="#" id="load-more-backups" style="display: none;" class="btn inline semibold mm60">
|
91 |
+
<?php _e('Load more', 'backup-migration'); ?>
|
92 |
+
</a>
|
93 |
+
</div>
|
includes/dashboard/modules/email-errors.php
ADDED
@@ -0,0 +1,35 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
// Namespace
|
4 |
+
namespace BMI\Plugin\Dashboard;
|
5 |
+
use BMI\Plugin\Backup_Migration_Plugin AS BMP;
|
6 |
+
|
7 |
+
// Exit on direct access
|
8 |
+
if (!defined('ABSPATH')) exit;
|
9 |
+
|
10 |
+
?>
|
11 |
+
|
12 |
+
<?php if (get_option('bmi_display_email_issues', false)): ?>
|
13 |
+
|
14 |
+
<div class="error-noticer">
|
15 |
+
<div class="error-header">
|
16 |
+
<div class="cf">
|
17 |
+
<div class="left">
|
18 |
+
<?php _e('We have some notices regarding most recent automated backup.', 'backup-migration'); ?>
|
19 |
+
</div>
|
20 |
+
<div class="right hoverable">
|
21 |
+
<span id="bmi-error-toggle" data-expand="<?php _e('Expand', 'backup-migration'); ?>" data-collapse="<?php _e('Collapse', 'backup-migration'); ?>">
|
22 |
+
<?php _e('Expand', 'backup-migration'); ?>
|
23 |
+
</span> |
|
24 |
+
<span id="bmi-error-dismiss">
|
25 |
+
<?php _e('Dismiss', 'backup-migration'); ?>
|
26 |
+
</span>
|
27 |
+
</div>
|
28 |
+
</div>
|
29 |
+
</div>
|
30 |
+
<div class="error-body">
|
31 |
+
<?php echo get_option('bmi_display_email_issues', false); ?>
|
32 |
+
</div>
|
33 |
+
</div>
|
34 |
+
|
35 |
+
<?php endif; ?>
|
includes/dashboard/modules/super-quick-migration.php
ADDED
@@ -0,0 +1,33 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
// Namespace
|
4 |
+
namespace BMI\Plugin\Dashboard;
|
5 |
+
|
6 |
+
// Exit on direct access
|
7 |
+
if (!defined('ABSPATH')) exit;
|
8 |
+
|
9 |
+
?>
|
10 |
+
|
11 |
+
<div class="collapser ignorehov section-bmi shadow section-bmi" group="quick-migration">
|
12 |
+
<div class="header f20 pointer ignorehov transition heading-sq"><span class="bold"><?php _e('Super-quick migration', 'backup-migration') ?></span></div>
|
13 |
+
<div class="content">
|
14 |
+
<img src="<?php echo $this->get_asset('images', 'clocks-min.png'); ?>" class="bg-quick-migration" alt="bg-watches">
|
15 |
+
<div class="content-above">
|
16 |
+
|
17 |
+
<div class="f16 medium text-heading">
|
18 |
+
<?php _e('Paste here the url you got after creating a backup:', 'backup-migration') ?>
|
19 |
+
</div>
|
20 |
+
|
21 |
+
<input type="text" id="bm-d-url" placeholder="<?php _e('E.g.', 'backup-migration') ?> https://your-site.com/?backup=bmi_backup.zip&secret" class="light">
|
22 |
+
|
23 |
+
<div class="center">
|
24 |
+
<button type="button" id="quick-download-migration" class="f16 semibold with-icon centred">
|
25 |
+
<div class="for-img">
|
26 |
+
<img src="<?php echo $this->get_asset('images', 'restore-icon-min.png'); ?>" alt="restore-img">
|
27 |
+
<span><?php _e('Restore now!', 'backup-migration') ?></span>
|
28 |
+
</div>
|
29 |
+
</button>
|
30 |
+
</div>
|
31 |
+
</div>
|
32 |
+
</div>
|
33 |
+
</div>
|
includes/dashboard/modules/upload-backup.php
ADDED
@@ -0,0 +1,13 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
// Namespace
|
4 |
+
namespace BMI\Plugin\Dashboard;
|
5 |
+
|
6 |
+
// Exit on direct access
|
7 |
+
if (!defined('ABSPATH')) exit;
|
8 |
+
|
9 |
+
?>
|
10 |
+
|
11 |
+
<div class="">
|
12 |
+
|
13 |
+
</div>
|
includes/dashboard/settings.php
ADDED
@@ -0,0 +1,207 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
// Namespace
|
4 |
+
namespace BMI\Plugin\Dashboard;
|
5 |
+
|
6 |
+
// Exit on direct access
|
7 |
+
if (!defined('ABSPATH')) {
|
8 |
+
exit;
|
9 |
+
}
|
10 |
+
|
11 |
+
// Configuration sets tooltip
|
12 |
+
$sellcodes_url = BMI_AUTHOR_URI;
|
13 |
+
$configu_sets = __('This feature isn’t ready yet in the premium plugin, that’s why you can buy it at a <b>big discount</b>. ', 'backup-migration') . " <a href='" . $sellcodes_url . "' target='_blank'>" . __('Learn more', 'backup-migration') . '.</a>';
|
14 |
+
|
15 |
+
?>
|
16 |
+
|
17 |
+
<style>#wpfooter { display: none !important; }</style>
|
18 |
+
<div id="bmi-preload">
|
19 |
+
<div class="progress">
|
20 |
+
<div class="indeterminate"></div>
|
21 |
+
</div>
|
22 |
+
</div>
|
23 |
+
|
24 |
+
<div id="bmi" style="display: none;">
|
25 |
+
|
26 |
+
<!-- Translations for JS -->
|
27 |
+
<?php require_once 'translations.php'; ?>
|
28 |
+
|
29 |
+
<!-- Plugin Title -->
|
30 |
+
<div class="heading f30 semibold">
|
31 |
+
<?php _e('Welcome to Backup & Migration!', 'backup-migration'); ?>
|
32 |
+
</div>
|
33 |
+
|
34 |
+
<!-- TABS -->
|
35 |
+
<div class="tabs cf shadow rbb">
|
36 |
+
<div class="tab left semibold f22 active pointer transition" data-point="create-backup-wrapper">
|
37 |
+
<?php _e('Create backup(s)', 'backup-migration') ?>
|
38 |
+
</div>
|
39 |
+
<div id="marbs" class="tab left semibold f22 pointer transition" data-point="manage-restore-wrapper">
|
40 |
+
<?php _e('Manage & Restore Backup(s)', 'backup-migration') ?>
|
41 |
+
</div>
|
42 |
+
</div>
|
43 |
+
|
44 |
+
<!-- Error handling -->
|
45 |
+
<?php require_once 'modules/email-errors.php'; ?>
|
46 |
+
|
47 |
+
<!-- @@TAB@@ Create backups(s) -->
|
48 |
+
<div class="tab-wrapper" id="create-backup-wrapper">
|
49 |
+
|
50 |
+
<!-- BACKUP BTNS -->
|
51 |
+
<?php require_once 'modules/backup_controller.php'; ?>
|
52 |
+
|
53 |
+
<!-- CONFIGURATION HEADER -->
|
54 |
+
<div class="cf section-bmi lh30">
|
55 |
+
<div class="left f20">
|
56 |
+
<?php _e('Configuration options', 'backup-migration') ?>
|
57 |
+
</div>
|
58 |
+
<div class="right f18 secondary premium-wrapper" tooltip="<?php echo $configu_sets; ?>">
|
59 |
+
<div class="premium premium-img">
|
60 |
+
<?php _e('+ Add / manage configuration set(s)', 'backup-migration') ?>
|
61 |
+
</div>
|
62 |
+
</div>
|
63 |
+
</div>
|
64 |
+
|
65 |
+
<!-- CONFIGURATION SECTION 1 -->
|
66 |
+
<div class="collapser section-bmi shadow" id="exlucde-parts" group="configuration">
|
67 |
+
<div class="header f20 pointer transition">
|
68 |
+
<span class="bold"><?php _e('What', 'backup-migration') ?></span> <?php _e('will be backed up?', 'backup-migration') ?>
|
69 |
+
</div>
|
70 |
+
<div class="content save-action f20" data-save="save-file-config">
|
71 |
+
|
72 |
+
<?php require_once 'chapter/what_backed_up.php'; ?>
|
73 |
+
|
74 |
+
</div>
|
75 |
+
</div>
|
76 |
+
|
77 |
+
<!-- CONFIGURATION SECTION 2 -->
|
78 |
+
<div class="collapser section-bmi shadow" group="configuration">
|
79 |
+
<div class="header f20 pointer transition">
|
80 |
+
<span class="bold"><?php _e('Where', 'backup-migration') ?></span> <?php _e('shall the backup(s) be stored?', 'backup-migration') ?>
|
81 |
+
</div>
|
82 |
+
<div class="content save-action" data-save="save-storage">
|
83 |
+
|
84 |
+
<?php require_once 'chapter/where_config.php'; ?>
|
85 |
+
|
86 |
+
</div>
|
87 |
+
</div>
|
88 |
+
|
89 |
+
<!-- CONFIGURATION SECTION 3 -->
|
90 |
+
<div class="collapser section-bmi shadow" group="configuration">
|
91 |
+
<div class="header f20 pointer transition">
|
92 |
+
<span class="bold"><?php _e('How', 'backup-migration') ?></span> <?php _e('shall the backup(s) be stored?', 'backup-migration') ?>
|
93 |
+
</div>
|
94 |
+
<div class="content save-action" data-save="store-config">
|
95 |
+
|
96 |
+
<?php require_once 'chapter/store_config.php'; ?>
|
97 |
+
|
98 |
+
</div>
|
99 |
+
</div>
|
100 |
+
|
101 |
+
<!-- SECTION DIVIDER -->
|
102 |
+
<hr class="section-bmi">
|
103 |
+
|
104 |
+
<!-- GLOBAL CONFIGURATION -->
|
105 |
+
<div class="collapser section-bmi shadow" id="other-options" group="configuration">
|
106 |
+
<div class="header f20 pointer transition"><span class="bold"><?php _e('Other options', 'backup-migration') ?></span></div>
|
107 |
+
<div class="content save-action" data-save="save-other-options">
|
108 |
+
|
109 |
+
<?php require_once 'chapter/other_config.php'; ?>
|
110 |
+
|
111 |
+
</div>
|
112 |
+
</div>
|
113 |
+
|
114 |
+
<!-- TROUBLESHOOTING -->
|
115 |
+
<div class="collapser section-bmi shadow" id="troubleshooting-chapter" group="configuration">
|
116 |
+
<div class="header f20 pointer transition"><span class="bold"><?php _e('Troubleshooting', 'backup-migration') ?></span></div>
|
117 |
+
<div class="content">
|
118 |
+
|
119 |
+
<?php require_once 'chapter/troubleshooting.php'; ?>
|
120 |
+
|
121 |
+
</div>
|
122 |
+
</div>
|
123 |
+
|
124 |
+
</div>
|
125 |
+
|
126 |
+
<!-- @@TAB@@ Manage backups(s) -->
|
127 |
+
<div class="tab-wrapper rbb" id="manage-restore-wrapper" style="display: none;">
|
128 |
+
|
129 |
+
<!-- Super Quick Migration -->
|
130 |
+
<?php require_once 'modules/super-quick-migration.php'; ?>
|
131 |
+
|
132 |
+
<div class="restore-wrapper shadow fullwidth rbb rbt">
|
133 |
+
<div class="f22 regular m mbl"><?php _e("Your saved backups:", 'backup-migration'); ?></div>
|
134 |
+
|
135 |
+
<!-- Super Quick Migration -->
|
136 |
+
<div class="quick-migration m">
|
137 |
+
|
138 |
+
<!-- Templates -->
|
139 |
+
<div style="display: none; visibility: none;" class="hide">
|
140 |
+
|
141 |
+
<!-- Backup Row Template -->
|
142 |
+
<?php require_once 'templates/backup-row-template.php'; ?>
|
143 |
+
|
144 |
+
<!-- Exclusion Rule Row Template -->
|
145 |
+
<?php require_once 'templates/exclusion-rule-template.php'; ?>
|
146 |
+
|
147 |
+
<!-- Dropdown Template -->
|
148 |
+
<?php require_once 'templates/dropdown-template.php'; ?>
|
149 |
+
|
150 |
+
<!-- Dropdown Option Template -->
|
151 |
+
<?php require_once 'templates/option-template.php'; ?>
|
152 |
+
|
153 |
+
</div>
|
154 |
+
|
155 |
+
<!-- Backups TABLE -->
|
156 |
+
<div class="">
|
157 |
+
|
158 |
+
<div class="table-wrapper">
|
159 |
+
<table>
|
160 |
+
<thead>
|
161 |
+
|
162 |
+
<!-- Table Header -->
|
163 |
+
<?php require_once 'modules/backups-table-header.php'; ?>
|
164 |
+
|
165 |
+
</thead>
|
166 |
+
<tbody id="bmi_restore_tbody" data-empty="<?php _e('You have not created any backups yet.', 'backup-migration'); ?>">
|
167 |
+
<tr>
|
168 |
+
<td colspan="100%"><?php _e('You have not created any backups yet.', 'backup-migration'); ?></td>
|
169 |
+
</tr>
|
170 |
+
</tbody>
|
171 |
+
</table>
|
172 |
+
</div>
|
173 |
+
|
174 |
+
<!-- Backup options -->
|
175 |
+
<?php require_once 'modules/backups-under-table.php'; ?>
|
176 |
+
|
177 |
+
</div>
|
178 |
+
|
179 |
+
<!-- Upload Backup -->
|
180 |
+
<?php require_once 'modules/upload-backup.php'; ?>
|
181 |
+
|
182 |
+
</div>
|
183 |
+
|
184 |
+
</div>
|
185 |
+
</div>
|
186 |
+
|
187 |
+
<!-- Modals -->
|
188 |
+
<?php require_once 'modals/upload-invalid-manifest-modal.php'; ?>
|
189 |
+
<?php require_once 'modals/backup-progress-modal.php'; ?>
|
190 |
+
<?php require_once 'modals/backup-success-modal.php'; ?>
|
191 |
+
<?php require_once 'modals/prenotice-modal.php'; ?>
|
192 |
+
<?php require_once 'modals/pre-restore-modal.php'; ?>
|
193 |
+
<?php require_once 'modals/backup-error-modal.php'; ?>
|
194 |
+
<?php require_once 'modals/restore-progress-modal.php'; ?>
|
195 |
+
<?php require_once 'modals/restore-success-modal.php'; ?>
|
196 |
+
<?php require_once 'modals/restore-error-modal.php'; ?>
|
197 |
+
<?php require_once 'modals/upload-wrong-file-modal.php'; ?>
|
198 |
+
<?php require_once 'modals/upload-exist-file-modal.php'; ?>
|
199 |
+
<?php require_once 'modals/upload-success-modal.php'; ?>
|
200 |
+
<?php require_once 'modals/delete-confirm-modal.php'; ?>
|
201 |
+
<?php require_once 'modals/reset-confirm-modal.php'; ?>
|
202 |
+
<?php require_once 'modals/bfs-modal.php'; ?>
|
203 |
+
|
204 |
+
<!-- Other modules -->
|
205 |
+
<?php require_once 'modules/backup-ongoing.php'; ?>
|
206 |
+
|
207 |
+
</div>
|
includes/dashboard/templates/AA-Template.php
ADDED
@@ -0,0 +1,9 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
// Namespace
|
4 |
+
namespace BMI\Plugin\Dashboard;
|
5 |
+
|
6 |
+
// Exit on direct access
|
7 |
+
if (!defined('ABSPATH')) exit;
|
8 |
+
|
9 |
+
?>
|
includes/dashboard/templates/backup-row-template.php
ADDED
@@ -0,0 +1,42 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
// Namespace
|
4 |
+
namespace BMI\Plugin\Dashboard;
|
5 |
+
|
6 |
+
// Exit on direct access
|
7 |
+
if (!defined('ABSPATH')) exit;
|
8 |
+
|
9 |
+
?>
|
10 |
+
|
11 |
+
<table>
|
12 |
+
<tr class="br_tr_template">
|
13 |
+
<td>
|
14 |
+
<label class="br_label" for="">
|
15 |
+
<input class="br_checkbox" id="" type="checkbox">
|
16 |
+
<span class="br_date">---</span>
|
17 |
+
</label>
|
18 |
+
</td>
|
19 |
+
<td class="br_name">---</td>
|
20 |
+
<td class="br_size">---</td>
|
21 |
+
<td class="center">
|
22 |
+
<img class="tooltip bc-unlocked-btn hoverable" tooltip="<?php _e('Lock backup files', 'backup-migration') ?>" src="<?php echo $this->get_asset('images', 'unlocked-min.svg'); ?>" height="23px" alt="image">
|
23 |
+
<img class="tooltip bc-locked-btn hoverable" tooltip="<?php _e('Unlock backup files', 'backup-migration') ?>" src="<?php echo $this->get_asset('images', 'lock-min.svg'); ?>" height="23px" alt="image">
|
24 |
+
</td>
|
25 |
+
<td>
|
26 |
+
<a href="#" class="bc-download-btn hoverable nodec untab" tabindex="-1" download>
|
27 |
+
<img class="tooltip" tooltip="<?php _e('Download the backup file. Click on it downloads it', 'backup-migration') ?>" src="<?php echo $this->get_asset('images', 'download-min.png'); ?>" height="23px" alt="image">
|
28 |
+
</a>
|
29 |
+
<img class="tooltip bc-url-btn hoverable untab" tabindex="-1" tooltip="<?php _e('Copy link to backup file for super-quick migration', 'backup-migration') ?>" src="<?php echo $this->get_asset('images', 'link-min.png'); ?>" height="23px" alt="image">
|
30 |
+
<a href="#" class="bc-logs-btn hoverable nodec untab" tabindex="-1" download>
|
31 |
+
<img class="tooltip" tooltip="<?php _e('Download log file which was created at time of backup', 'backup-migration') ?>" src="<?php echo $this->get_asset('images', 'log-min.svg'); ?>" height="23px" alt="image">
|
32 |
+
</a>
|
33 |
+
</td>
|
34 |
+
<td>
|
35 |
+
<div class="restore-btn hoverable tooltip" tooltip="<?php _e('Restore this backup on this site', 'backup-migration') ?>">
|
36 |
+
<img src="<?php echo $this->get_asset('images', 'restore-min.svg'); ?>" width="12px" alt="image">
|
37 |
+
<?php _e('Restore', 'backup-migration') ?>
|
38 |
+
</div>
|
39 |
+
</td>
|
40 |
+
<td><img class="tooltip bc-remove-btn hoverable" tooltip="<?php _e('Delete this backup', 'backup-migration') ?>" src="<?php echo $this->get_asset('images', 'red-close-min.svg'); ?>" height="12px" alt="image"></td>
|
41 |
+
</tr>
|
42 |
+
</table>
|
includes/dashboard/templates/dropdown-template.php
ADDED
@@ -0,0 +1,14 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
// Namespace
|
4 |
+
namespace BMI\Plugin\Dashboard;
|
5 |
+
|
6 |
+
// Exit on direct access
|
7 |
+
if (!defined('ABSPATH')) exit;
|
8 |
+
|
9 |
+
?>
|
10 |
+
|
11 |
+
<div class="bmi-dropdown dropdown-template" data-selected="-1">
|
12 |
+
<div class="dropdown-title"></div>
|
13 |
+
<div class="dropdown-options"></div>
|
14 |
+
</div>
|
includes/dashboard/templates/exclusion-rule-template.php
ADDED
@@ -0,0 +1,34 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
// Namespace
|
4 |
+
namespace BMI\Plugin\Dashboard;
|
5 |
+
|
6 |
+
// Exit on direct access
|
7 |
+
if (!defined('ABSPATH')) {
|
8 |
+
exit;
|
9 |
+
}
|
10 |
+
|
11 |
+
?>
|
12 |
+
|
13 |
+
<div class="mtll exclude-row exclusion_template">
|
14 |
+
<span><?php _e("Exclude if string", 'backup-migration'); ?></span>
|
15 |
+
<input class="exclusion_txt" type="text">
|
16 |
+
<span class="orr"><?php _e("appears", 'backup-migration'); ?></span>
|
17 |
+
<div class="exclusion_position inline">
|
18 |
+
<select>
|
19 |
+
<option value="1"><?php _e("anywhere in", 'backup-migration'); ?></option>
|
20 |
+
<option value="2"><?php _e("at the beginning of", 'backup-migration'); ?></option>
|
21 |
+
<option value="3"><?php _e("at the end of", 'backup-migration'); ?></option>
|
22 |
+
</select>
|
23 |
+
</div>
|
24 |
+
<span class="oll orr"><?php _e("the", 'backup-migration'); ?></span>
|
25 |
+
<div class="exclusion_where inline">
|
26 |
+
<select>
|
27 |
+
<option value="1"><?php _e("file name", 'backup-migration'); ?></option>
|
28 |
+
<option value="2"><?php _e("folder name", 'backup-migration'); ?></option>
|
29 |
+
</select>
|
30 |
+
</div>
|
31 |
+
<span class="oll kill-exclusion-rule">
|
32 |
+
<img src="<?php echo $this->get_asset('images', 'red-close-min.svg') ?>" alt="close-img" class="hoverable" height="15px">
|
33 |
+
</span>
|
34 |
+
</div>
|
includes/dashboard/templates/option-template.php
ADDED
@@ -0,0 +1,11 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
// Namespace
|
4 |
+
namespace BMI\Plugin\Dashboard;
|
5 |
+
|
6 |
+
// Exit on direct access
|
7 |
+
if (!defined('ABSPATH')) exit;
|
8 |
+
|
9 |
+
?>
|
10 |
+
|
11 |
+
<div class="option-template dropdown-option"></div>
|
includes/dashboard/templates/premium-overlay.php
ADDED
@@ -0,0 +1,26 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
// Namespace
|
4 |
+
namespace BMI\Plugin\Dashboard;
|
5 |
+
|
6 |
+
// Exit on direct access
|
7 |
+
if (!defined('ABSPATH')) {
|
8 |
+
exit;
|
9 |
+
}
|
10 |
+
|
11 |
+
?>
|
12 |
+
|
13 |
+
<div class="overlay-premium">
|
14 |
+
<div class="clocks_container">
|
15 |
+
<div>
|
16 |
+
<img src="<?php echo $this->get_asset('images', 'clock.svg') ?>" alt="clocks-bg">
|
17 |
+
</div>
|
18 |
+
<div>
|
19 |
+
<p class="f18 secondary"><?php _e("Coming soon in the Premium Plugin", 'backup-migration'); ?> –
|
20 |
+
<b>
|
21 |
+
<a href="<?php echo $sellcodes_url; ?>" target="_blank" class="secondary"><?php _e("Order it now at a <b>big discount</b>!", 'backup-migration'); ?></a>
|
22 |
+
</b>
|
23 |
+
</p>
|
24 |
+
</div>
|
25 |
+
</div>
|
26 |
+
</div>
|
includes/dashboard/translations.php
ADDED
@@ -0,0 +1,114 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
// Namespace
|
4 |
+
namespace BMI\Plugin\Dashboard;
|
5 |
+
|
6 |
+
// Exit on direct access
|
7 |
+
if (!defined('ABSPATH')) {
|
8 |
+
exit;
|
9 |
+
}
|
10 |
+
|
11 |
+
?>
|
12 |
+
|
13 |
+
<div class="translations">
|
14 |
+
<div id="premium-tooltip">
|
15 |
+
<?php _e("This feature isn’t ready yet in the premium plugin, that’s why you can buy it at a <b>big discount</b>.", 'backup-migration') ?>
|
16 |
+
<a href="<?php echo BMI_AUTHOR_URI; ?>" target="_blank"><?php _e('Learn more', 'backup-migration') ?>.</a>
|
17 |
+
</div>
|
18 |
+
<div id="bmi-success-copy">
|
19 |
+
<?php _e('Text copied successfully', 'backup-migration') ?>
|
20 |
+
</div>
|
21 |
+
<div id="bmi-failed-copy">
|
22 |
+
<?php _e('Your browser does not support copying, please copy by hand', 'backup-migration') ?>
|
23 |
+
</div>
|
24 |
+
<div id="bmi-abort-soon">
|
25 |
+
<?php _e('Backup will be aborted in few seconds.', 'backup-migration') ?>
|
26 |
+
</div>
|
27 |
+
<div id="bmi-aborted-al">
|
28 |
+
<?php _e('Backup process aborted.', 'backup-migration') ?>
|
29 |
+
</div>
|
30 |
+
<div id="bmi-downloading-remote">
|
31 |
+
<?php _e('Downloading backup file...', 'backup-migration') ?>
|
32 |
+
</div>
|
33 |
+
<div id="bmi-restoring-prepare">
|
34 |
+
<?php _e('Preparing restore process...', 'backup-migration') ?>
|
35 |
+
</div>
|
36 |
+
<div id="bmi-restore-require-checkmark">
|
37 |
+
<?php _e('You have to confirm that you understand the risk.', 'backup-migration') ?>
|
38 |
+
</div>
|
39 |
+
<div id="bmi-upload-start">
|
40 |
+
<?php _e('File upload started.', 'backup-migration') ?>
|
41 |
+
</div>
|
42 |
+
<div id="bmi-upload-error">
|
43 |
+
<?php _e('There was an error during file upload.', 'backup-migration') ?>
|
44 |
+
</div>
|
45 |
+
<div id="bmi-upload-end">
|
46 |
+
<?php _e('File has been uploaded successfully.', 'backup-migration') ?>
|
47 |
+
</div>
|
48 |
+
<div id="bmi-upload-wrong">
|
49 |
+
<?php _e('File has wrong type.', 'backup-migration') ?>
|
50 |
+
</div>
|
51 |
+
<div id="bmi-upload-exists">
|
52 |
+
<?php _e('File already exist in backup directory.', 'backup-migration') ?>
|
53 |
+
</div>
|
54 |
+
<div id="bmi-remove-success">
|
55 |
+
<?php _e('Backup(s) removed successfully.', 'backup-migration') ?>
|
56 |
+
</div>
|
57 |
+
<div id="bmi-remove-error">
|
58 |
+
<?php _e('Cannot remove backup(s) file(s) due to unknown error.', 'backup-migration') ?>
|
59 |
+
</div>
|
60 |
+
<div id="bmi-save-success">
|
61 |
+
<?php _e('Configuration saved successfully.', 'backup-migration') ?>
|
62 |
+
</div>
|
63 |
+
<div id="bmi-save-issues">
|
64 |
+
<?php _e('There was an issue during saving, some settings may stay unchanged.', 'backup-migration') ?>
|
65 |
+
</div>
|
66 |
+
<div id="bmi-no-file">
|
67 |
+
<?php _e('Could not find this backup, it may be deleted or there was an error with getting the name.', 'backup-migration') ?>
|
68 |
+
</div>
|
69 |
+
<div id="bmi-unlock-success">
|
70 |
+
<?php _e('File unlocked successfully.', 'backup-migration') ?>
|
71 |
+
</div>
|
72 |
+
<div id="bmi-unlock-error">
|
73 |
+
<?php _e('Could not unlock this backup due to unknown error, please reload and try again.', 'backup-migration') ?>
|
74 |
+
</div>
|
75 |
+
<div id="bmi-lock-success">
|
76 |
+
<?php _e('File locked successfully.', 'backup-migration') ?>
|
77 |
+
</div>
|
78 |
+
<div id="bmi-lock-error">
|
79 |
+
<?php _e('Could not lock this backup due to unknown error, please reload and try again.', 'backup-migration') ?>
|
80 |
+
</div>
|
81 |
+
<div id="bmi-download-should-start">
|
82 |
+
<?php _e('Download process should start.', 'backup-migration') ?>
|
83 |
+
</div>
|
84 |
+
<div id="bmi-preb-processing">
|
85 |
+
<?php _e('We are processing your files, please wait till it complete. You can check the progress in the "What will be backed up?" tab.', 'backup-migration') ?>
|
86 |
+
</div>
|
87 |
+
<div id="bmi-no-selected">
|
88 |
+
<?php _e('There is nothing to backup. Please select database and / or files to backup.', 'backup-migration') ?>
|
89 |
+
</div>
|
90 |
+
<div id="bmi-invalid-url">
|
91 |
+
<?php _e('The URL you provided does not seems to be correct.', 'backup-migration') ?>
|
92 |
+
</div>
|
93 |
+
<div id="bmi-bc-ended">
|
94 |
+
<?php _e('Backup process ended, we triggered backup list reload for your.', 'backup-migration') ?>
|
95 |
+
</div>
|
96 |
+
<div id="bmi-current-time">
|
97 |
+
<?php _e('Current server time: ', 'backup-migration') ?>
|
98 |
+
</div>
|
99 |
+
<div id="bmi-next-cron">
|
100 |
+
<?php _e('Next backup planned: ', 'backup-migration') ?>
|
101 |
+
</div>
|
102 |
+
<div id="bmi-cron-updated">
|
103 |
+
<?php _e('Settings updated successfully', 'backup-migration') ?>
|
104 |
+
</div>
|
105 |
+
<div id="bmi-cron-updated-fail">
|
106 |
+
<?php _e('Could not update CRON setting now, please check the logs.', 'backup-migration') ?>
|
107 |
+
</div>
|
108 |
+
<div id="bmi-making-archive">
|
109 |
+
<?php _e("Making archive", 'backup-migration') ?>
|
110 |
+
</div>
|
111 |
+
<div id="BMI_URL_ROOT"><?php echo plugin_dir_url(BMI_ROOT_FILE); ?></div>
|
112 |
+
<div id="BMI_BLOG_URL"><?php echo get_site_url(); ?></div>
|
113 |
+
<div id="BMI_REV"><?php echo BMI_REV; ?></div>
|
114 |
+
</div>
|
includes/database/manager.php
ADDED
@@ -0,0 +1,185 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
// Namespace
|
4 |
+
namespace BMI\Plugin\Database;
|
5 |
+
|
6 |
+
// Use
|
7 |
+
use BMI\Plugin\BMI_Logger AS Logger;
|
8 |
+
use BMI\Plugin\Progress\BMI_ZipProgress AS Progress;
|
9 |
+
|
10 |
+
// Exit on direct access
|
11 |
+
if (!defined('ABSPATH')) exit;
|
12 |
+
|
13 |
+
/**
|
14 |
+
* BMI_Database
|
15 |
+
*/
|
16 |
+
class BMI_Database {
|
17 |
+
|
18 |
+
function __construct($host, $user, $pass, $name) {
|
19 |
+
|
20 |
+
$this->host = $host;
|
21 |
+
$this->user = $user;
|
22 |
+
$this->pass = $pass;
|
23 |
+
$this->name = $name;
|
24 |
+
|
25 |
+
}
|
26 |
+
|
27 |
+
public function exportDatabase(/*$tables = false, */$backup_name = false) {
|
28 |
+
|
29 |
+
$mysqli = new \mysqli($this->host, $this->user, $this->pass, $this->name);
|
30 |
+
$mysqli->select_db($this->name);
|
31 |
+
$mysqli->query("SET NAMES 'utf8'");
|
32 |
+
|
33 |
+
$file = fopen(BMI_INCLUDES . DIRECTORY_SEPARATOR . 'htaccess' . DIRECTORY_SEPARATOR . $backup_name, 'w');
|
34 |
+
$queryTables = $mysqli->query('SHOW TABLES');
|
35 |
+
while ($row = $queryTables->fetch_row()) {
|
36 |
+
|
37 |
+
$target_tables[] = $row[0];
|
38 |
+
|
39 |
+
}
|
40 |
+
|
41 |
+
// if ($tables !== false) {
|
42 |
+
//
|
43 |
+
// $target_tables = array_intersect( $target_tables, $tables);
|
44 |
+
//
|
45 |
+
// }
|
46 |
+
|
47 |
+
fwrite($file, "SET SQL_MODE = \"NO_AUTO_VALUE_ON_ZERO\";\r\n");
|
48 |
+
fwrite($file, "SET time_zone = \"+00:00\";\r\n\r\n\r\n");
|
49 |
+
fwrite($file, "/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;\r\n");
|
50 |
+
fwrite($file, "/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;\r\n");
|
51 |
+
fwrite($file, "/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;\r\n");
|
52 |
+
fwrite($file, "SET SQL_MODE = \"NO_AUTO_VALUE_ON_ZERO\";\r\n");
|
53 |
+
fwrite($file, "/*!40101 SET NAMES utf8 */;\r\n");
|
54 |
+
fwrite($file, "--\r\n-- Database: `" . $this->name . "`\r\n");
|
55 |
+
fwrite($file, "--\r\n\r\n\r\n");
|
56 |
+
|
57 |
+
foreach ($target_tables as $table) {
|
58 |
+
|
59 |
+
if (empty($table)) { continue; }
|
60 |
+
|
61 |
+
$result = $mysqli->query('SELECT * FROM `'.$table.'`');
|
62 |
+
$fields_amount = $result->field_count;
|
63 |
+
$rows_num = $mysqli->affected_rows;
|
64 |
+
$res = $mysqli->query('SHOW CREATE TABLE ' . $table);
|
65 |
+
$TableMLine = $res->fetch_row();
|
66 |
+
|
67 |
+
fwrite($file, "\n\n".$TableMLine[1].";\n\n");;
|
68 |
+
$TableMLine[1] = str_ireplace('CREATE TABLE `','CREATE TABLE IF NOT EXISTS `', $TableMLine[1]);
|
69 |
+
|
70 |
+
for ($i = 0, $st_counter = 0; $i < $fields_amount; $i++, $st_counter = 0) {
|
71 |
+
|
72 |
+
while ($row = $result->fetch_row()) {
|
73 |
+
|
74 |
+
if ($st_counter%100 == 0 || $st_counter == 0) {
|
75 |
+
|
76 |
+
fwrite($file, "\nINSERT INTO " . $table . " VALUES");
|
77 |
+
|
78 |
+
}
|
79 |
+
|
80 |
+
fwrite($file, "\n(");
|
81 |
+
|
82 |
+
for ($j = 0; $j < $fields_amount; $j++) {
|
83 |
+
|
84 |
+
$row[$j] = str_replace("\n","\\n", addslashes($row[$j]));
|
85 |
+
|
86 |
+
if (isset($row[$j])) {
|
87 |
+
|
88 |
+
fwrite($file, '"'.$row[$j].'"');
|
89 |
+
|
90 |
+
} else {
|
91 |
+
|
92 |
+
fwrite($file, '""');
|
93 |
+
|
94 |
+
}
|
95 |
+
|
96 |
+
if ($j<($fields_amount-1)) {
|
97 |
+
fwrite($file, ',');
|
98 |
+
}
|
99 |
+
|
100 |
+
}
|
101 |
+
|
102 |
+
fwrite($file, ")");
|
103 |
+
|
104 |
+
if ((($st_counter+1)%100==0 && $st_counter!=0) || $st_counter+1==$rows_num) {
|
105 |
+
|
106 |
+
fwrite($file, ";");
|
107 |
+
|
108 |
+
} else {
|
109 |
+
|
110 |
+
fwrite($file, ",");
|
111 |
+
|
112 |
+
}
|
113 |
+
|
114 |
+
$st_counter=$st_counter+1;
|
115 |
+
|
116 |
+
}
|
117 |
+
|
118 |
+
}
|
119 |
+
|
120 |
+
fwrite($file, "\n\n\n");
|
121 |
+
|
122 |
+
}
|
123 |
+
|
124 |
+
fwrite($file, "\r\n\r\n/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;\r\n");
|
125 |
+
fwrite($file, "/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;\r\n");
|
126 |
+
fwrite($file, "/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;");
|
127 |
+
|
128 |
+
$backup_name = $backup_name ? $backup_name : $this->name.'___('.date('H-i-s').'_'.date('d-m-Y').').sql';
|
129 |
+
|
130 |
+
fclose($file);
|
131 |
+
|
132 |
+
}
|
133 |
+
|
134 |
+
public function importDatabase($sql_file_OR_content) {
|
135 |
+
|
136 |
+
@set_time_limit(3000);
|
137 |
+
$SQL_CONTENT = $sql_file_OR_content;
|
138 |
+
$allLines = explode("\n", $SQL_CONTENT);
|
139 |
+
$mysqli = new \mysqli($this->host, $this->user, $this->pass, $this->name);
|
140 |
+
|
141 |
+
if (mysqli_connect_errno()) {
|
142 |
+
|
143 |
+
Logger::error("Failed to connect to MySQL: " . mysqli_connect_error());
|
144 |
+
|
145 |
+
}
|
146 |
+
|
147 |
+
$qyr = $mysqli->query('SET foreign_key_checks = 0');
|
148 |
+
preg_match_all("/\nCREATE TABLE(.*?)\`(.*?)\`/si", "\n" . $SQL_CONTENT, $target_tables);
|
149 |
+
|
150 |
+
foreach ($target_tables[2] as $table) {
|
151 |
+
|
152 |
+
$mysqli->query('DROP TABLE IF EXISTS ' . $table);
|
153 |
+
|
154 |
+
}
|
155 |
+
|
156 |
+
$qyr = $mysqli->query('SET foreign_key_checks = 1');
|
157 |
+
$mysqli->query("SET NAMES 'utf8'");
|
158 |
+
|
159 |
+
$templine = '';
|
160 |
+
foreach ($allLines as $line) {
|
161 |
+
|
162 |
+
if (substr($line, 0, 2) != '--' && $line != '') {
|
163 |
+
|
164 |
+
$templine .= $line;
|
165 |
+
if (substr(trim($line), -1, 1) == ';') {
|
166 |
+
|
167 |
+
if (!$mysqli->query($templine)) {
|
168 |
+
|
169 |
+
Logger::error('Error performing query \'<strong>' . $templine . '\': ' . $mysqli->error . '<br /><br />');
|
170 |
+
|
171 |
+
}
|
172 |
+
|
173 |
+
$templine = '';
|
174 |
+
|
175 |
+
}
|
176 |
+
|
177 |
+
}
|
178 |
+
|
179 |
+
}
|
180 |
+
|
181 |
+
return __("Importing finished. Now, Delete the import file.", 'backup-migration');
|
182 |
+
|
183 |
+
}
|
184 |
+
|
185 |
+
}
|
includes/extracter/extract.php
ADDED
@@ -0,0 +1,287 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
// Namespace
|
4 |
+
namespace BMI\Plugin\Extracter;
|
5 |
+
|
6 |
+
// Use
|
7 |
+
use BMI\Plugin\BMI_Logger as Logger;
|
8 |
+
use BMI\Plugin\Dashboard as Dashboard;
|
9 |
+
use BMI\Plugin\Database\BMI_Database as Database;
|
10 |
+
use BMI\Plugin\Progress\BMI_ZipProgress as Progress;
|
11 |
+
use BMI\Plugin\Zipper\Zip as Zip;
|
12 |
+
|
13 |
+
// Exit on direct access
|
14 |
+
if (!defined('ABSPATH')) {
|
15 |
+
exit;
|
16 |
+
}
|
17 |
+
|
18 |
+
/**
|
19 |
+
* BMI_Extracter
|
20 |
+
*/
|
21 |
+
class BMI_Extracter {
|
22 |
+
public function __construct($backup, &$migration) {
|
23 |
+
|
24 |
+
// Globals
|
25 |
+
global $table_prefix;
|
26 |
+
|
27 |
+
// Requirements
|
28 |
+
require_once BMI_INCLUDES . '/database/manager.php';
|
29 |
+
|
30 |
+
// Backup name
|
31 |
+
$this->backup_name = $backup;
|
32 |
+
|
33 |
+
// Logger
|
34 |
+
$this->migration = $migration;
|
35 |
+
|
36 |
+
// Temp name
|
37 |
+
$this->tmptime = time();
|
38 |
+
$this->tmp = ABSPATH . '/backup-migration_' . $this->tmptime;
|
39 |
+
|
40 |
+
// Prepare database connection
|
41 |
+
$this->db = new Database(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);
|
42 |
+
|
43 |
+
// Save current wp-config to replace (only those required)
|
44 |
+
$this->DB_NAME = DB_NAME;
|
45 |
+
$this->DB_USER = DB_USER;
|
46 |
+
$this->DB_PASSWORD = DB_PASSWORD;
|
47 |
+
$this->DB_HOST = DB_HOST;
|
48 |
+
$this->DB_CHARSET = DB_CHARSET;
|
49 |
+
$this->DB_COLLATE = DB_COLLATE;
|
50 |
+
|
51 |
+
$this->AUTH_KEY = AUTH_KEY;
|
52 |
+
$this->SECURE_AUTH_KEY = SECURE_AUTH_KEY;
|
53 |
+
$this->LOGGED_IN_KEY = LOGGED_IN_KEY;
|
54 |
+
$this->NONCE_KEY = NONCE_KEY;
|
55 |
+
$this->AUTH_SALT = AUTH_SALT;
|
56 |
+
$this->SECURE_AUTH_SALT = SECURE_AUTH_SALT;
|
57 |
+
$this->LOGGED_IN_SALT = LOGGED_IN_SALT;
|
58 |
+
$this->NONCE_SALT = NONCE_SALT;
|
59 |
+
|
60 |
+
$this->ABSPATH = ABSPATH;
|
61 |
+
$this->WP_CONTENT_DIR = WP_CONTENT_DIR;
|
62 |
+
|
63 |
+
$this->WP_DEBUG_LOG = WP_DEBUG_LOG;
|
64 |
+
$this->table_prefix = $table_prefix;
|
65 |
+
|
66 |
+
// Make temp dir
|
67 |
+
$this->migration->log(__('Making temporary directory', 'backup-migration'), 'INFO');
|
68 |
+
mkdir($this->tmp);
|
69 |
+
|
70 |
+
// Deny read of this folder
|
71 |
+
copy(BMI_INCLUDES . '/htaccess/.htaccess', $this->tmp . '/.htaccess');
|
72 |
+
touch($this->tmp . '/index.html');
|
73 |
+
touch($this->tmp . '/index.php');
|
74 |
+
}
|
75 |
+
|
76 |
+
public function replacePath($path, $sub, $content) {
|
77 |
+
$path .= DIRECTORY_SEPARATOR . 'wordpress' . $sub;
|
78 |
+
$rii = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($path));
|
79 |
+
|
80 |
+
$clent = strlen($content);
|
81 |
+
$sublen = strlen($path);
|
82 |
+
$files = [];
|
83 |
+
$dirs = [];
|
84 |
+
|
85 |
+
foreach ($rii as $file) {
|
86 |
+
if (!$file->isDir()) {
|
87 |
+
$files[] = substr($file->getPathname(), $sublen);
|
88 |
+
} else {
|
89 |
+
$dirs[] = substr($file->getPathname(), $sublen);
|
90 |
+
}
|
91 |
+
}
|
92 |
+
|
93 |
+
for ($i = 0; $i < sizeof($dirs); ++$i) {
|
94 |
+
$src = $path . $dirs[$i];
|
95 |
+
if (strpos($src, $content) !== false) {
|
96 |
+
$dest = $this->WP_CONTENT_DIR . $sub . substr($dirs[$i], $clent);
|
97 |
+
} else {
|
98 |
+
$dest = $this->ABSPATH . $sub . $dirs[$i];
|
99 |
+
}
|
100 |
+
|
101 |
+
if (!file_exists($dest)) {
|
102 |
+
@mkdir($dest, 0755, true);
|
103 |
+
}
|
104 |
+
}
|
105 |
+
|
106 |
+
for ($i = 0; $i < sizeof($files); ++$i) {
|
107 |
+
if (strpos($files[$i], 'debug.log') !== false) {
|
108 |
+
array_splice($files, $i, 1);
|
109 |
+
|
110 |
+
break;
|
111 |
+
}
|
112 |
+
}
|
113 |
+
|
114 |
+
$max = sizeof($files);
|
115 |
+
for ($i = 0; $i < $max; ++$i) {
|
116 |
+
$src = $path . $files[$i];
|
117 |
+
if (strpos($src, $content) !== false) {
|
118 |
+
$dest = $this->WP_CONTENT_DIR . $sub . substr($files[$i], $clent);
|
119 |
+
} else {
|
120 |
+
$dest = $this->ABSPATH . $sub . $files[$i];
|
121 |
+
}
|
122 |
+
|
123 |
+
@rename($src, $dest);
|
124 |
+
|
125 |
+
if ($i % 100 === 0) {
|
126 |
+
$this->migration->progress(intval((($i / $max) * 100) / 2));
|
127 |
+
}
|
128 |
+
}
|
129 |
+
}
|
130 |
+
|
131 |
+
public function replaceAll($content) {
|
132 |
+
$this->replacePath($this->tmp, DIRECTORY_SEPARATOR, $content);
|
133 |
+
}
|
134 |
+
|
135 |
+
public function cleanup() {
|
136 |
+
$dir = $this->tmp;
|
137 |
+
$it = new \RecursiveDirectoryIterator($dir, \RecursiveDirectoryIterator::SKIP_DOTS);
|
138 |
+
$files = new \RecursiveIteratorIterator($it, \RecursiveIteratorIterator::CHILD_FIRST);
|
139 |
+
|
140 |
+
$this->migration->log(__('Removing ', 'backup-migration') . iterator_count($files) . __(' files', 'backup-migration'), 'INFO');
|
141 |
+
foreach ($files as $file) {
|
142 |
+
if ($file->isDir()) {
|
143 |
+
@rmdir($file->getRealPath());
|
144 |
+
} else {
|
145 |
+
@unlink($file->getRealPath());
|
146 |
+
}
|
147 |
+
}
|
148 |
+
|
149 |
+
@rmdir($dir);
|
150 |
+
}
|
151 |
+
|
152 |
+
public function extractTo() {
|
153 |
+
try {
|
154 |
+
|
155 |
+
// Require Universal Zip Library
|
156 |
+
require_once BMI_INCLUDES . '/zipper/src/zip.php';
|
157 |
+
|
158 |
+
// Verbose
|
159 |
+
Logger::log('Restoring site...');
|
160 |
+
|
161 |
+
// Time start
|
162 |
+
$start = microtime(true);
|
163 |
+
$this->migration->log(__('Scanning archive...', 'backup-migration'), 'STEP');
|
164 |
+
|
165 |
+
// Source
|
166 |
+
$src = BMI_BACKUPS . '/' . $this->backup_name;
|
167 |
+
|
168 |
+
// Extract
|
169 |
+
$this->zip = new Zip();
|
170 |
+
$isOk = $this->zip->unzip_file($src, $this->tmp, $this->migration);
|
171 |
+
if (!$isOk) {
|
172 |
+
$this->cleanup();
|
173 |
+
|
174 |
+
return false;
|
175 |
+
}
|
176 |
+
|
177 |
+
$this->migration->log(__('Files extracted...', 'backup-migration'), 'SUCCESS');
|
178 |
+
|
179 |
+
// WP Config backup
|
180 |
+
$this->migration->log(__('Saving wp-config file...', 'backup-migration'), 'STEP');
|
181 |
+
rename(ABSPATH . '/wp-config.php', ABSPATH . '/wp-config.' . $this->tmptime . '.php');
|
182 |
+
$this->migration->log(__('File wp-config saved', 'backup-migration'), 'SUCCESS');
|
183 |
+
|
184 |
+
$this->migration->log(__('Getting backup manifest...', 'backup-migration'), 'STEP');
|
185 |
+
$manifest = json_decode(file_get_contents($this->tmp . '/bmi_backup_manifest.json'));
|
186 |
+
$this->migration->log(__('Manifest loaded', 'backup-migration'), 'SUCCESS');
|
187 |
+
|
188 |
+
$this->migration->log(__('Restoring files...', 'backup-migration'), 'STEP');
|
189 |
+
$contentDirectory = $this->WP_CONTENT_DIR;
|
190 |
+
$pathtowp = DIRECTORY_SEPARATOR . 'wp-content';
|
191 |
+
if (isset($manifest->config->WP_CONTENT_DIR) && isset($manifest->config->ABSPATH)) {
|
192 |
+
$absi = $manifest->config->ABSPATH;
|
193 |
+
$cotsi = $manifest->config->WP_CONTENT_DIR;
|
194 |
+
if (strlen($absi) <= strlen($cotsi) && substr($cotsi, 0, strlen($absi)) == $absi) {
|
195 |
+
$inside = true;
|
196 |
+
$pathtowp = substr($cotsi, strlen($absi));
|
197 |
+
} else {
|
198 |
+
$inside = false;
|
199 |
+
$pathtowp = $cotsi;
|
200 |
+
}
|
201 |
+
}
|
202 |
+
|
203 |
+
$this->replaceAll($pathtowp);
|
204 |
+
$this->migration->log(__('Files restored', 'backup-migration'), 'SUCCESS');
|
205 |
+
|
206 |
+
// Restore WP Config ** It allows to recover session after restore no matter what
|
207 |
+
$curr_prefix = $this->table_prefix;
|
208 |
+
$new_prefix = $manifest->config->table_prefix;
|
209 |
+
$this->migration->log(__('Restoring wp-config file...', 'backup-migration'), 'STEP');
|
210 |
+
$file = file(ABSPATH . '/wp-config.' . $this->tmptime . '.php');
|
211 |
+
rename(ABSPATH . '/wp-config.' . $this->tmptime . '.php', ABSPATH . '/wp-config.php');
|
212 |
+
$wpconfig = file_get_contents(ABSPATH . '/wp-config.php');
|
213 |
+
if (strpos($wpconfig, '"' . $curr_prefix . '";') !== false) {
|
214 |
+
$wpconfig = str_replace('"' . $curr_prefix . '";', '"' . $new_prefix . '";', $wpconfig);
|
215 |
+
} elseif (strpos($wpconfig, "'" . $curr_prefix . "';") !== false) {
|
216 |
+
$wpconfig = str_replace("'" . $curr_prefix . "';", "'" . $new_prefix . "';", $wpconfig);
|
217 |
+
}
|
218 |
+
file_put_contents(ABSPATH . '/wp-config.php', $wpconfig);
|
219 |
+
$this->migration->log(__('WP-Config restored', 'backup-migration'), 'SUCCESS');
|
220 |
+
|
221 |
+
$this->migration->log(__('Restoring database...', 'backup-migration'), 'STEP');
|
222 |
+
if (file_exists($this->tmp . '/bmi_database_backup.sql')) {
|
223 |
+
$old_domain = $manifest->domain;
|
224 |
+
$new_domain = parse_url(home_url())['host'];
|
225 |
+
|
226 |
+
$sql = file_get_contents($this->tmp . '/bmi_database_backup.sql');
|
227 |
+
$sql = str_replace($old_domain, $new_domain, $sql);
|
228 |
+
$this->db->importDatabase($sql);
|
229 |
+
$this->migration->log(__('Database restored', 'backup-migration'), 'SUCCESS');
|
230 |
+
|
231 |
+
$this->migration->log(__('Making new login session', 'backup-migration'), 'STEP');
|
232 |
+
if ($manifest->cron === true || $manifest->cron === 'true' || $manifest->uid === 0 || $manifest->uid === '0') {
|
233 |
+
$manifest->uid = 1;
|
234 |
+
}
|
235 |
+
if (is_numeric($manifest->uid)) {
|
236 |
+
$existant = (bool) get_users(['include' => $manifest->uid, 'fields' => 'ID']);
|
237 |
+
if ($existant) {
|
238 |
+
$user = get_user_by('id', $manifest->uid);
|
239 |
+
} else {
|
240 |
+
$existant = (bool) get_users(['include' => 1, 'fields' => 'ID']);
|
241 |
+
if ($existant) {
|
242 |
+
$user = get_user_by('id', 1);
|
243 |
+
}
|
244 |
+
}
|
245 |
+
}
|
246 |
+
|
247 |
+
if (isset($user) && is_object($user) && property_exists($user, 'ID')) {
|
248 |
+
clean_user_cache(get_current_user_id());
|
249 |
+
clean_user_cache($user->ID);
|
250 |
+
wp_clear_auth_cookie();
|
251 |
+
wp_set_current_user($user->ID, $user->user_login);
|
252 |
+
wp_set_auth_cookie($user->ID, 1, is_ssl());
|
253 |
+
do_action('wp_login', $user->user_login, $user);
|
254 |
+
update_user_caches($user);
|
255 |
+
}
|
256 |
+
|
257 |
+
$this->migration->log(__('User should be logged in', 'backup-migration'), 'SUCCESS');
|
258 |
+
} else {
|
259 |
+
$this->migration->log(__('There is no Database file, omitting...', 'backup-migration'), 'INFO');
|
260 |
+
}
|
261 |
+
|
262 |
+
$this->migration->log(__('Cleaning temporary files...', 'backup-migration'), 'STEP');
|
263 |
+
$this->cleanup();
|
264 |
+
$this->migration->log(__('Temporary files cleaned', 'backup-migration'), 'SUCCESS');
|
265 |
+
$this->migration->log(__('Restore process took: ', 'backup-migration') . (microtime(true) - $start) . 's', 'INFO');
|
266 |
+
Logger::log('Site restored...');
|
267 |
+
|
268 |
+
return true;
|
269 |
+
} catch (\Exception $e) {
|
270 |
+
|
271 |
+
// On this tragedy at least remove tmp files
|
272 |
+
$this->migration->log(__('Something bad happened...', 'backup-migration'), 'ERROR');
|
273 |
+
$this->migration->log($e->getMessage(), 'ERROR');
|
274 |
+
$this->cleanup();
|
275 |
+
|
276 |
+
return false;
|
277 |
+
} catch (\Throwable $e) {
|
278 |
+
|
279 |
+
// On this tragedy at least remove tmp files
|
280 |
+
$this->migration->log(__('Something bad happened...', 'backup-migration'), 'ERROR');
|
281 |
+
$this->migration->log($e->getMessage(), 'ERROR');
|
282 |
+
$this->cleanup();
|
283 |
+
|
284 |
+
return false;
|
285 |
+
}
|
286 |
+
}
|
287 |
+
}
|
includes/htaccess/.htaccess
ADDED
@@ -0,0 +1,17 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
|
2 |
+
# Added by Backup Migration Plugin
|
3 |
+
|
4 |
+
# Deny all backup and config files
|
5 |
+
<Files "*">
|
6 |
+
|
7 |
+
Require all denied
|
8 |
+
|
9 |
+
</Files>
|
10 |
+
|
11 |
+
# Redirect if it's possible to home directory
|
12 |
+
<IfModule mod_rewrite.c>
|
13 |
+
|
14 |
+
RewriteEngine On
|
15 |
+
RewriteRule (.*) / [R]
|
16 |
+
|
17 |
+
</IfModule>
|
includes/htaccess/.litespeed
ADDED
@@ -0,0 +1,7 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# Backup Migration START
|
2 |
+
<IfModule Litespeed>
|
3 |
+
RewriteEngine On
|
4 |
+
RewriteRule .* - [E=noconntimeout:1]
|
5 |
+
RewriteRule .* - [E=noabort:1]
|
6 |
+
</IfModule>
|
7 |
+
# Backup Migration END
|
includes/htaccess/default.json
ADDED
@@ -0,0 +1,39 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
{
|
2 |
+
"STORAGE::DIRECT::URL": "true",
|
3 |
+
"STORAGE::LOCAL::PATH": "default",
|
4 |
+
"BACKUP:DATABASE": "true",
|
5 |
+
"BACKUP:FILES": "true",
|
6 |
+
"BACKUP:FILES::PLUGINS": "true",
|
7 |
+
"BACKUP:FILES::UPLOADS": "true",
|
8 |
+
"BACKUP:FILES::THEMES": "true",
|
9 |
+
"BACKUP:FILES::OTHERS": "true",
|
10 |
+
"BACKUP:FILES::WP": "false",
|
11 |
+
"BACKUP:FILES::FILTER:SIZE": "false",
|
12 |
+
"BACKUP:FILES::FILTER:SIZE:IN": "100",
|
13 |
+
"BACKUP:FILES::FILTER:NAMES": "true",
|
14 |
+
"BACKUP:FILES::FILTER:FPATHS": "false",
|
15 |
+
"BACKUP:FILES::FILTER:DPATHS": "false",
|
16 |
+
"BACKUP:FILES::FILTER:NAMES:IN": [
|
17 |
+
{"txt": "wp-clone", "pos": "1", "whr": "1" },
|
18 |
+
{"txt": "backup", "pos": "1", "whr": "1" },
|
19 |
+
{"txt": "backup", "pos": "1", "whr": "2" },
|
20 |
+
{"txt": "snapshot", "pos": "1", "whr": "1" },
|
21 |
+
{"txt": "upgrade", "pos": "2", "whr": "1" },
|
22 |
+
{"txt": "mysql.sql", "pos": "3", "whr": "1" },
|
23 |
+
{"txt": "debug.log", "pos": "3", "whr": "1" }
|
24 |
+
],
|
25 |
+
"BACKUP:FILES::FILTER:FPATHS:IN": [],
|
26 |
+
"BACKUP:FILES::FILTER:DPATHS:IN": [],
|
27 |
+
"BACKUP:NAME": "BM_Backup_%Y-%m-%d_%H_%i_%s_%hash",
|
28 |
+
"OTHER:EMAIL:TITLE": "Backup Migration Plugin",
|
29 |
+
"OTHER:EMAIL:NOTIS": true,
|
30 |
+
"OTHER:UNINSTALL:CONFIGS": false,
|
31 |
+
"OTHER:UNINSTALL:BACKUPS": false,
|
32 |
+
"CRON:ENABLED": false,
|
33 |
+
"CRON:TYPE": "month",
|
34 |
+
"CRON:DAY": "1",
|
35 |
+
"CRON:WEEK": "1",
|
36 |
+
"CRON:HOUR": "08",
|
37 |
+
"CRON:MINUTE": "00",
|
38 |
+
"CRON:KEEP": "2"
|
39 |
+
}
|
includes/initializer.php
ADDED
@@ -0,0 +1,637 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
// Namespace
|
4 |
+
namespace BMI\Plugin;
|
5 |
+
|
6 |
+
// Exit on direct access
|
7 |
+
if (!defined('ABSPATH')) {
|
8 |
+
exit;
|
9 |
+
}
|
10 |
+
|
11 |
+
// Require classes
|
12 |
+
require_once BMI_INCLUDES . '/logger.php';
|
13 |
+
|
14 |
+
// Alias for classes
|
15 |
+
use BMI\Plugin\BMI_Logger as Logger;
|
16 |
+
use BMI\Plugin\CRON\BMI_Crons as Crons;
|
17 |
+
use BMI\Plugin\Dashboard as Dashboard;
|
18 |
+
use BMI\Plugin\Scanner\BMI_BackupsScanner as Backups;
|
19 |
+
use BMI\Plugin\Zipper\BMI_Zipper as Zipper;
|
20 |
+
|
21 |
+
// Uninstallator
|
22 |
+
function bmi_uninstall_handler() {
|
23 |
+
require_once BMI_ROOT_DIR . '/uninstall.php';
|
24 |
+
}
|
25 |
+
|
26 |
+
/**
|
27 |
+
* Backup Migration Main Class
|
28 |
+
*/
|
29 |
+
class Backup_Migration_Plugin {
|
30 |
+
public function initialize() {
|
31 |
+
|
32 |
+
// Handle CRONs
|
33 |
+
add_action('bmi_do_backup_right_now', [$this, 'handle_cron_backup']);
|
34 |
+
add_action('bmi_handle_cron_check', [$this, 'handle_cron_check']);
|
35 |
+
add_action('plugins_loaded', [$this, 'handle_crons']);
|
36 |
+
|
37 |
+
// Return if CRON time
|
38 |
+
if (function_exists('wp_doing_cron') && wp_doing_cron()) {
|
39 |
+
return;
|
40 |
+
}
|
41 |
+
|
42 |
+
// POST Logic
|
43 |
+
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
44 |
+
|
45 |
+
// Register AJAX Handler
|
46 |
+
add_action('wp_ajax_backup_migration', [$this, 'ajax']);
|
47 |
+
|
48 |
+
// Stop GET Registration
|
49 |
+
return;
|
50 |
+
}
|
51 |
+
|
52 |
+
// File downloading
|
53 |
+
add_action('init', [$this, 'handle_downloading']);
|
54 |
+
|
55 |
+
// Hooks
|
56 |
+
register_activation_hook(BMI_ROOT_FILE, [$this, 'activation']);
|
57 |
+
register_deactivation_hook(BMI_ROOT_FILE, [$this, 'deactivation']);
|
58 |
+
register_uninstall_hook(BMI_ROOT_FILE, 'bmi_uninstall_handler');
|
59 |
+
|
60 |
+
// Actions
|
61 |
+
add_action('admin_init', [$this, 'admin_init_hook']);
|
62 |
+
add_action('admin_menu', [$this, 'submenu']);
|
63 |
+
add_action('admin_notices', [$this, 'admin_notices']);
|
64 |
+
|
65 |
+
// Settings action
|
66 |
+
add_filter('plugin_action_links_' . plugin_basename(BMI_ROOT_FILE), [$this, 'settings_action']);
|
67 |
+
|
68 |
+
// Ignore below actions if those true
|
69 |
+
if (function_exists('wp_doing_ajax') && wp_doing_ajax()) {
|
70 |
+
return;
|
71 |
+
}
|
72 |
+
|
73 |
+
// Styles & scripts
|
74 |
+
add_action('admin_head', [$this, 'enqueue_styles']);
|
75 |
+
add_action('admin_footer', [$this, 'enqueue_scripts']);
|
76 |
+
}
|
77 |
+
|
78 |
+
public function ajax() {
|
79 |
+
if (isset($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) === 'xmlhttprequest') {
|
80 |
+
if (isset($_POST['token']) && $_POST['token'] == 'bmi' && isset($_POST['f']) && is_admin()) {
|
81 |
+
try {
|
82 |
+
|
83 |
+
// Extend execution time
|
84 |
+
$exectime = intval(ini_get('max_execution_time'));
|
85 |
+
if ($exectime < 10800 && $exectime != 0) {
|
86 |
+
set_time_limit(10800);
|
87 |
+
}
|
88 |
+
|
89 |
+
// Require AJAX Handler
|
90 |
+
require_once BMI_INCLUDES . '/ajax.php';
|
91 |
+
$handler = new BMI_Ajax();
|
92 |
+
} catch (\Exception $e) {
|
93 |
+
Logger::error('POST error:');
|
94 |
+
Logger::error($e);
|
95 |
+
$this->res(['status' => 'error', 'error' => $e]);
|
96 |
+
exit;
|
97 |
+
} catch (\Throwable $e) {
|
98 |
+
Logger::error('POST error:');
|
99 |
+
Logger::error($e);
|
100 |
+
$this->res(['status' => 'error', 'error' => $e]);
|
101 |
+
exit;
|
102 |
+
}
|
103 |
+
}
|
104 |
+
}
|
105 |
+
}
|
106 |
+
|
107 |
+
public function submenu() {
|
108 |
+
|
109 |
+
// Menu icon
|
110 |
+
$icon_url = $this->get_asset('images', 'logo-min.png');
|
111 |
+
|
112 |
+
// Main menu slug
|
113 |
+
$parentSlug = 'backup-migration';
|
114 |
+
|
115 |
+
// Content
|
116 |
+
$content = [$this, 'settings_page'];
|
117 |
+
|
118 |
+
// Main menu hook
|
119 |
+
add_menu_page('Backup Migration', '<span id="bmi-menu">Backup Migration</span>', 'read', $parentSlug, $content, $icon_url, $position = 98);
|
120 |
+
|
121 |
+
// Remove default submenu by menu
|
122 |
+
remove_submenu_page($parentSlug, $parentSlug);
|
123 |
+
}
|
124 |
+
|
125 |
+
public function settings_action($links) {
|
126 |
+
$text = __('Manage', 'backup-migration');
|
127 |
+
$links['bmi-settings-link'] = '<a href="' . admin_url('/admin.php?page=backup-migration') . '">' . $text . '</a>';
|
128 |
+
|
129 |
+
return $links;
|
130 |
+
}
|
131 |
+
|
132 |
+
public function settings_page() {
|
133 |
+
|
134 |
+
// Set email if does not exist
|
135 |
+
if (!Dashboard\bmi_get_config('OTHER:EMAIL')) {
|
136 |
+
Dashboard\bmi_set_config('OTHER:EMAIL', get_bloginfo('admin_email'));
|
137 |
+
}
|
138 |
+
|
139 |
+
// Require The HTML
|
140 |
+
require_once BMI_INCLUDES . '/dashboard/settings.php';
|
141 |
+
}
|
142 |
+
|
143 |
+
public function admin_init_hook() {
|
144 |
+
if (get_option('_bmi_redirect', false)) {
|
145 |
+
delete_option('_bmi_redirect', false);
|
146 |
+
wp_safe_redirect(admin_url('admin.php?page=backup-migration'));
|
147 |
+
}
|
148 |
+
}
|
149 |
+
|
150 |
+
public function admin_notices() {
|
151 |
+
if (get_current_screen()->id != 'toplevel_page_backup-migration' && get_option('bmi_display_email_issues', false)) {
|
152 |
+
?>
|
153 |
+
<div class="notice notice-warning">
|
154 |
+
<p>
|
155 |
+
<?php _e('There was an error during automated backup, please', 'backup-migration'); ?>
|
156 |
+
<?php echo '<a href="' . admin_url('/admin.php?page=backup-migration') . '">' . __('check that.', 'backup-migration') . '</a>'; ?>
|
157 |
+
</p>
|
158 |
+
</div>
|
159 |
+
<?php
|
160 |
+
}
|
161 |
+
}
|
162 |
+
|
163 |
+
public function handle_crons() {
|
164 |
+
$time = get_option('bmi_backup_check', 0);
|
165 |
+
if ((time() - $time) > 60) {
|
166 |
+
update_option('bmi_backup_check', time());
|
167 |
+
|
168 |
+
if (Dashboard\bmi_get_config('CRON:ENABLED') !== true) {
|
169 |
+
return;
|
170 |
+
}
|
171 |
+
do_action('bmi_handle_cron_check');
|
172 |
+
}
|
173 |
+
}
|
174 |
+
|
175 |
+
public function email_error($msg) {
|
176 |
+
Logger::log('Displaying some issues about email sending...');
|
177 |
+
update_option('bmi_display_email_issues', $msg);
|
178 |
+
}
|
179 |
+
|
180 |
+
public function backup_inproper_time($should_time) {
|
181 |
+
Logger::log('Sending notification about backup being late');
|
182 |
+
$email = Dashboard\bmi_get_config('OTHER:EMAIL') != false ? Dashboard\bmi_get_config('OTHER:EMAIL') : get_bloginfo('admin_email');
|
183 |
+
$subject = Dashboard\bmi_get_config('OTHER:EMAIL:TITLE');
|
184 |
+
$message = __("Automatic backup was not on time because there was no traffic on the site.", 'backup-migration') . "\n";
|
185 |
+
$message .= __("Backup was made on: ", 'backup-migration') . date('Y-m-d H:i:s') . __(', but should be on: ', 'backup-migration') . date('Y-m-d H:i:s', $should_time);
|
186 |
+
$message .= ' ' . __("(server time)", 'backup-migration');
|
187 |
+
|
188 |
+
Logger::debug($message);
|
189 |
+
if (!$this->send_notification_mail($email, $subject, $message)) {
|
190 |
+
$issue = __("Couldn't send mail to you, please check server configuration.", 'backup-migration') . '<br>';
|
191 |
+
$issue .= '<b>' . __("Message you missed because of this: ", 'backup-migration') . '</b>' . $message;
|
192 |
+
$this->email_error($issue);
|
193 |
+
}
|
194 |
+
}
|
195 |
+
|
196 |
+
public function handle_cron_check() {
|
197 |
+
$now = time();
|
198 |
+
if (file_exists(BMI_INCLUDES . '/htaccess/.last')) {
|
199 |
+
$last = file_get_contents(BMI_INCLUDES . '/htaccess/.last');
|
200 |
+
$last_status = explode('.', $last)[0];
|
201 |
+
$last_time = intval(explode('.', $last)[1]);
|
202 |
+
} else {
|
203 |
+
$last_time = 0;
|
204 |
+
$last_status = 0;
|
205 |
+
}
|
206 |
+
|
207 |
+
$plan = intval(file_get_contents(BMI_INCLUDES . '/htaccess/.plan'));
|
208 |
+
if ($last_time < $plan && ((time() - $plan) > 55)) {
|
209 |
+
if ($last_status !== '0') {
|
210 |
+
$this->backup_inproper_time($plan);
|
211 |
+
if (!wp_next_scheduled('bmi_do_backup_right_now')) {
|
212 |
+
wp_schedule_single_event(time(), 'bmi_do_backup_right_now');
|
213 |
+
}
|
214 |
+
}
|
215 |
+
}
|
216 |
+
}
|
217 |
+
|
218 |
+
public function get_next_cron($curr = false) {
|
219 |
+
if ($curr === false) {
|
220 |
+
$curr = time();
|
221 |
+
}
|
222 |
+
|
223 |
+
$time = Crons::calculate_date([
|
224 |
+
'type' => Dashboard\bmi_get_config('CRON:TYPE'),
|
225 |
+
'week' => Dashboard\bmi_get_config('CRON:WEEK'),
|
226 |
+
'day' => Dashboard\bmi_get_config('CRON:DAY'),
|
227 |
+
'hour' => Dashboard\bmi_get_config('CRON:HOUR'),
|
228 |
+
'minute' => Dashboard\bmi_get_config('CRON:MINUTE')
|
229 |
+
], $curr);
|
230 |
+
|
231 |
+
return $time;
|
232 |
+
}
|
233 |
+
|
234 |
+
public function handle_cron_error($e) {
|
235 |
+
Logger::error(__("Automatic backup failed at time: ", 'backup-migration') . date('Y-m-d, H:i:s'));
|
236 |
+
if (is_object($e) || is_array($e)) {
|
237 |
+
Logger::error('Error: ' . $e->getMessage());
|
238 |
+
} else {
|
239 |
+
Logger::error('Error: ' . $e);
|
240 |
+
}
|
241 |
+
|
242 |
+
$notis = Dashboard\bmi_get_config('OTHER:EMAIL:NOTIS');
|
243 |
+
if (in_array($notis, [true, 'true'])) {
|
244 |
+
$email = Dashboard\bmi_get_config('OTHER:EMAIL') != false ? Dashboard\bmi_get_config('OTHER:EMAIL') : get_bloginfo('admin_email');
|
245 |
+
$subject = Dashboard\bmi_get_config('OTHER:EMAIL:TITLE');
|
246 |
+
$message = __("There was an error during automatic backup, please check the logs.", 'backup-migration');
|
247 |
+
if (is_string($e)) {
|
248 |
+
$message .= "\nError: " . $e;
|
249 |
+
}
|
250 |
+
|
251 |
+
$this->send_notification_mail($email, $subject, $message);
|
252 |
+
}
|
253 |
+
|
254 |
+
@unlink(BMI_BACKUPS . '/.cron');
|
255 |
+
}
|
256 |
+
|
257 |
+
public function send_notification_mail($email, $subject, $message) {
|
258 |
+
$email_fail = __("Could not send the email notification about that fail", 'backup-migration');
|
259 |
+
|
260 |
+
try {
|
261 |
+
if (wp_mail($email, $subject, $message)) {
|
262 |
+
Logger::info(__("Sent email notification to: ", 'backup-migration') . $email);
|
263 |
+
|
264 |
+
return true;
|
265 |
+
} else {
|
266 |
+
Logger::error($email_fail);
|
267 |
+
$this->email_error(__("Couldn't send notification via email, please check the email and your server settings.", 'backup-migration'));
|
268 |
+
|
269 |
+
return false;
|
270 |
+
}
|
271 |
+
} catch (\Exception $e) {
|
272 |
+
Logger::error($email_fail);
|
273 |
+
$this->email_error(__("Couldn't send notification via email due to error, please check plugin logs for more details.", 'backup-migration'));
|
274 |
+
|
275 |
+
return false;
|
276 |
+
} catch (\Throwable $e) {
|
277 |
+
Logger::error($email_fail);
|
278 |
+
$this->email_error(__("Couldn't send notification via email due to error, please check plugin logs for more details.", 'backup-migration'));
|
279 |
+
|
280 |
+
return false;
|
281 |
+
}
|
282 |
+
}
|
283 |
+
|
284 |
+
public function handle_after_cron() {
|
285 |
+
require_once BMI_INCLUDES . '/scanner/backups.php';
|
286 |
+
$backups = new Backups();
|
287 |
+
$list = $backups->getAvailableBackups();
|
288 |
+
|
289 |
+
$cron_list = [];
|
290 |
+
$cron_dates = [];
|
291 |
+
foreach ($list as $key => $value) {
|
292 |
+
if ($list[$key][6] == true) {
|
293 |
+
if ($list[$key][5] == 'unlocked') {
|
294 |
+
$cron_list[$list[$key][1]] = $list[$key][0];
|
295 |
+
$cron_dates[] = $list[$key][1];
|
296 |
+
}
|
297 |
+
}
|
298 |
+
}
|
299 |
+
|
300 |
+
usort($cron_dates, function ($a, $b) {
|
301 |
+
return (strtotime($a) < strtotime($b)) ? -1 : 1;
|
302 |
+
});
|
303 |
+
|
304 |
+
$cron_dates = array_slice($cron_dates, 0, -(intval(Dashboard\bmi_get_config('CRON:KEEP'))));
|
305 |
+
foreach ($cron_dates as $key => $value) {
|
306 |
+
$name = $cron_list[$cron_dates[$key]];
|
307 |
+
Logger::log(__("Removing backup due to keep rules: ", 'backup-migration') . $name);
|
308 |
+
@unlink(BMI_BACKUPS . DIRECTORY_SEPARATOR . $name);
|
309 |
+
}
|
310 |
+
}
|
311 |
+
|
312 |
+
public function set_last_cron($status, $time) {
|
313 |
+
$file = BMI_INCLUDES . '/htaccess/.last';
|
314 |
+
file_put_contents($file, $status . '.' . $time);
|
315 |
+
}
|
316 |
+
|
317 |
+
public function handle_cron_backup() {
|
318 |
+
|
319 |
+
// Planned time
|
320 |
+
$plan = intval(file_get_contents(BMI_INCLUDES . '/htaccess/.plan'));
|
321 |
+
|
322 |
+
// Check difference
|
323 |
+
if ((time() - $plan) > 45) {
|
324 |
+
Logger::log('Backup failed to run on proper time, but running now.');
|
325 |
+
Logger::log('Planned time: ' . date('Y-m-d H:i:s', $plan));
|
326 |
+
$this->backup_inproper_time($plan);
|
327 |
+
}
|
328 |
+
|
329 |
+
// Now
|
330 |
+
$now = time();
|
331 |
+
$this->set_last_cron('0', $now);
|
332 |
+
|
333 |
+
// Extend execution time
|
334 |
+
$exectime = intval(ini_get('max_execution_time'));
|
335 |
+
if ($exectime < 10800 && $exectime != 0) {
|
336 |
+
set_time_limit(10800);
|
337 |
+
}
|
338 |
+
|
339 |
+
if (Dashboard\bmi_get_config('CRON:ENABLED') !== true) {
|
340 |
+
return;
|
341 |
+
}
|
342 |
+
Logger::log(__("Automatic backup called at time: ", 'backup-migration') . date('Y-m-d, H:i:s'));
|
343 |
+
|
344 |
+
try {
|
345 |
+
require_once BMI_INCLUDES . '/ajax.php';
|
346 |
+
$isBackup = (file_exists(BMI_BACKUPS . '/.running') && (time() - filemtime(BMI_BACKUPS . '/.running')) <= 65) ? true : false;
|
347 |
+
$isCron = (file_exists(BMI_BACKUPS . '/.cron') && (time() - filemtime(BMI_BACKUPS . '/.cron')) <= 65) ? true : false;
|
348 |
+
if ($isCron) {
|
349 |
+
return;
|
350 |
+
}
|
351 |
+
|
352 |
+
if ($isBackup) {
|
353 |
+
$this->handle_cron_error(__("Could not make the backup: Backup already running, please wait till it complete.", 'backup-migration'));
|
354 |
+
$this->set_last_cron('2', $now);
|
355 |
+
} else {
|
356 |
+
touch(BMI_BACKUPS . '/.cron');
|
357 |
+
|
358 |
+
$handler = new BMI_Ajax();
|
359 |
+
$handler->resetLatestLogs();
|
360 |
+
$backup = $handler->prepareAndMakeBackup(true);
|
361 |
+
|
362 |
+
if ($backup['status'] == 'success') {
|
363 |
+
Logger::log(__("Automatic backup successed: ", 'backup-migration') . $backup['filename']);
|
364 |
+
$this->handle_after_cron();
|
365 |
+
$this->set_last_cron('1', $now);
|
366 |
+
} elseif ($backup['status'] == 'msg') {
|
367 |
+
$this->handle_cron_error($backup['why']);
|
368 |
+
$this->set_last_cron('3', $now);
|
369 |
+
} else {
|
370 |
+
$this->handle_cron_error(__("Could not make the backup due to internal server error.", 'backup-migration'));
|
371 |
+
$this->set_last_cron('4', $now);
|
372 |
+
}
|
373 |
+
}
|
374 |
+
} catch (\Exception $e) {
|
375 |
+
$this->handle_cron_error($e);
|
376 |
+
$this->set_last_cron('5', $now);
|
377 |
+
} catch (\Throwable $e) {
|
378 |
+
$this->handle_cron_error($e);
|
379 |
+
$this->set_last_cron('5', $now);
|
380 |
+
}
|
381 |
+
|
382 |
+
@unlink(BMI_BACKUPS . '/.cron');
|
383 |
+
require_once BMI_INCLUDES . '/cron/handler.php';
|
384 |
+
$time = $this->get_next_cron();
|
385 |
+
|
386 |
+
wp_clear_scheduled_hook('bmi_do_backup_right_now');
|
387 |
+
wp_schedule_single_event($time, 'bmi_do_backup_right_now');
|
388 |
+
|
389 |
+
$file = BMI_INCLUDES . '/htaccess/.plan';
|
390 |
+
file_put_contents($file, $time);
|
391 |
+
}
|
392 |
+
|
393 |
+
public function enqueue_scripts() {
|
394 |
+
|
395 |
+
// Only for BM Settings
|
396 |
+
if (get_current_screen()->id != 'toplevel_page_backup-migration') {
|
397 |
+
return;
|
398 |
+
}
|
399 |
+
wp_enqueue_script('backup-migration-script', $this->get_asset('js', 'backup-migration.min.js'), ['jquery'], BMI_VERSION, true);
|
400 |
+
}
|
401 |
+
|
402 |
+
public function enqueue_styles() {
|
403 |
+
|
404 |
+
// Only for BM Settings
|
405 |
+
if (get_current_screen()->id != 'toplevel_page_backup-migration') {
|
406 |
+
return;
|
407 |
+
}
|
408 |
+
wp_enqueue_style('backup-migration-style', $this->get_asset('css', 'bmi-plugin.min.css'), [], BMI_VERSION);
|
409 |
+
}
|
410 |
+
|
411 |
+
public function handle_downloading() {
|
412 |
+
$allowed = ['BMI_BACKUP', 'BMI_BACKUP_LOGS', 'PROGRESS_LOGS'];
|
413 |
+
$get_bmi = !empty($_GET['backup-migration']) ? sanitize_text_field($_GET['backup-migration']) : false;
|
414 |
+
$get_bid = !empty($_GET['backup-id']) ? sanitize_text_field($_GET['backup-id']) : false;
|
415 |
+
$get_pid = !empty($_GET['progress-id']) ? sanitize_text_field($_GET['progress-id']) : false;
|
416 |
+
|
417 |
+
if (isset($get_bmi) && in_array($get_bmi, $allowed)) {
|
418 |
+
if (isset($get_bid) && strlen($get_bid) > 0) {
|
419 |
+
$type = $get_bmi;
|
420 |
+
if ($type == 'BMI_BACKUP') {
|
421 |
+
if (Dashboard\bmi_get_config('STORAGE::DIRECT::URL') === 'true' || current_user_can('administrator')) {
|
422 |
+
$backupname = $get_bid;
|
423 |
+
$file = $this->fixSlashes(BMI_BACKUPS . DIRECTORY_SEPARATOR . $backupname);
|
424 |
+
|
425 |
+
// Prevent parent directory downloading
|
426 |
+
if (file_exists($file) && $this->fixSlashes(dirname($file)) == $this->fixSlashes(BMI_BACKUPS)) {
|
427 |
+
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
|
428 |
+
header('Content-Disposition: attachment; filename="' . $backupname . '"');
|
429 |
+
header('Content-Type: application/octet-stream');
|
430 |
+
header('Content-Length: ' . filesize($file));
|
431 |
+
header('Content-Description: File Transfer');
|
432 |
+
header('Content-Transfer-Encoding: binary');
|
433 |
+
header('Pragma: public');
|
434 |
+
header('Expires: 0');
|
435 |
+
http_response_code(200);
|
436 |
+
|
437 |
+
if (ob_get_level()) {
|
438 |
+
ob_end_clean();
|
439 |
+
}
|
440 |
+
|
441 |
+
readfile($file);
|
442 |
+
exit;
|
443 |
+
}
|
444 |
+
} else {
|
445 |
+
header('HTTP/1.0 423 Locked');
|
446 |
+
echo __("Backup download is restricted (allowed for admins only).", 'backup-migration');
|
447 |
+
exit;
|
448 |
+
}
|
449 |
+
} elseif ($type == 'BMI_BACKUP_LOGS') {
|
450 |
+
$backupname = $get_bid;
|
451 |
+
$file = $this->fixSlashes(BMI_BACKUPS . DIRECTORY_SEPARATOR . $backupname);
|
452 |
+
|
453 |
+
// Prevent parent directory downloading
|
454 |
+
if (file_exists($file) && $this->fixSlashes(dirname($file)) == $this->fixSlashes(BMI_BACKUPS)) {
|
455 |
+
require_once BMI_INCLUDES . '/zipper/zipping.php';
|
456 |
+
|
457 |
+
$zipper = new Zipper();
|
458 |
+
$logs = $zipper->getZipFileContentPlain($file, 'bmi_logs_this_backup.log');
|
459 |
+
header('Content-Type: text/plain');
|
460 |
+
|
461 |
+
if ($logs) {
|
462 |
+
header('Content-Disposition: attachment; filename="' . substr($backupname, 0, -4) . '.log"');
|
463 |
+
http_response_code(200);
|
464 |
+
echo $logs;
|
465 |
+
exit;
|
466 |
+
} else {
|
467 |
+
header('HTTP/1.0 404 Not found');
|
468 |
+
echo __("There was an error during getting logs, this file is not right log file.", 'backup-migration');
|
469 |
+
exit;
|
470 |
+
}
|
471 |
+
}
|
472 |
+
} elseif ($type == 'PROGRESS_LOGS') {
|
473 |
+
header('Content-Type: text/plain');
|
474 |
+
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
|
475 |
+
http_response_code(200);
|
476 |
+
$allowed_progress = ['latest.log', 'latest_progress.log', 'latest_migration_progress.log', 'latest_migration.log', 'complete_logs.log'];
|
477 |
+
if (isset($get_pid) && in_array($get_pid, $allowed_progress)) {
|
478 |
+
if ($get_pid == 'complete_logs.log') {
|
479 |
+
$file = BMI_CONFIG_DIR . DIRECTORY_SEPARATOR . 'complete_logs.log';
|
480 |
+
readfile($file);
|
481 |
+
} else {
|
482 |
+
$file = dirname(BMI_BACKUPS) . DIRECTORY_SEPARATOR . 'backups' . DIRECTORY_SEPARATOR . $get_pid;
|
483 |
+
if (file_exists($file) && (time() - filemtime($file)) < (60 * 5)) {
|
484 |
+
readfile($file);
|
485 |
+
} else {
|
486 |
+
if (file_exists($file) && !(time() - filemtime($file)) < (60 * 5)) {
|
487 |
+
echo __("Due to security reasons access to this file is disabled at this moment.", 'backup-migration') . "\n";
|
488 |
+
echo __("Human readable: file expired.", 'backup-migration');
|
489 |
+
} else {
|
490 |
+
echo '';
|
491 |
+
}
|
492 |
+
}
|
493 |
+
}
|
494 |
+
|
495 |
+
exit;
|
496 |
+
}
|
497 |
+
}
|
498 |
+
}
|
499 |
+
}
|
500 |
+
}
|
501 |
+
|
502 |
+
public function activation() {
|
503 |
+
Logger::log(__("Activated", 'backup-migration'));
|
504 |
+
$this->fixLitespeed();
|
505 |
+
|
506 |
+
update_option('_bmi_redirect', true);
|
507 |
+
}
|
508 |
+
|
509 |
+
public function deactivation() {
|
510 |
+
Logger::log(__("Deactivated", 'backup-migration'));
|
511 |
+
$this->revertLitespeed();
|
512 |
+
}
|
513 |
+
|
514 |
+
public static function res($array) {
|
515 |
+
echo json_encode(Backup_Migration_Plugin::sanitize($array));
|
516 |
+
}
|
517 |
+
|
518 |
+
public static function sanitize($data = []) {
|
519 |
+
$array = [];
|
520 |
+
|
521 |
+
if (is_array($data) || is_object($data)) {
|
522 |
+
foreach ($data as $key => $value) {
|
523 |
+
$key = ((is_numeric($key))?intval($key):sanitize_text_field($key));
|
524 |
+
|
525 |
+
if (is_array($value) || is_object($value)) {
|
526 |
+
$array[$key] = Backup_Migration_Plugin::sanitize($value);
|
527 |
+
} else {
|
528 |
+
$array[$key] = sanitize_text_field($value);
|
529 |
+
}
|
530 |
+
}
|
531 |
+
} elseif (is_string($data)) {
|
532 |
+
return sanitize_text_field($data);
|
533 |
+
} elseif (is_bool($data)) {
|
534 |
+
return $data;
|
535 |
+
} elseif (is_null($data)) {
|
536 |
+
return 'false';
|
537 |
+
} else {
|
538 |
+
Logger::log(__("Unknow AJAX Sanitize Type: ", 'backup-migration') . gettype($data));
|
539 |
+
wp_die();
|
540 |
+
}
|
541 |
+
|
542 |
+
return $array;
|
543 |
+
}
|
544 |
+
|
545 |
+
public static function fixLitespeed() {
|
546 |
+
$litepath = BMI_INCLUDES . DIRECTORY_SEPARATOR . 'htaccess' . DIRECTORY_SEPARATOR . '.litespeed';
|
547 |
+
$htpath = ABSPATH . DIRECTORY_SEPARATOR . '.htaccess';
|
548 |
+
if (file_exists($htpath)) {
|
549 |
+
$litespeed = file_get_contents($litepath);
|
550 |
+
$htaccess = file_get_contents($htpath);
|
551 |
+
$htaccess = explode("\n", $htaccess);
|
552 |
+
$litespeed = explode("\n", $litespeed);
|
553 |
+
|
554 |
+
$hasAlready = false;
|
555 |
+
for ($i = 0; $i < sizeof($htaccess); ++$i) {
|
556 |
+
if (strpos($htaccess[$i], 'Backup Migration') !== false) {
|
557 |
+
$hasAlready = true;
|
558 |
+
|
559 |
+
break;
|
560 |
+
}
|
561 |
+
}
|
562 |
+
|
563 |
+
if ($hasAlready) {
|
564 |
+
return ['status' => 'success'];
|
565 |
+
}
|
566 |
+
$htaccess[] = '';
|
567 |
+
for ($i = 0; $i < sizeof($litespeed); ++$i) {
|
568 |
+
$htaccess[] = $litespeed[$i];
|
569 |
+
}
|
570 |
+
|
571 |
+
file_put_contents($htpath, implode("\n", $htaccess));
|
572 |
+
} else {
|
573 |
+
copy($litepath, $htpath);
|
574 |
+
}
|
575 |
+
|
576 |
+
return ['status' => 'success'];
|
577 |
+
}
|
578 |
+
|
579 |
+
public static function revertLitespeed() {
|
580 |
+
$htpath = ABSPATH . DIRECTORY_SEPARATOR . '.htaccess';
|
581 |
+
$addline = true;
|
582 |
+
|
583 |
+
$htaccess = file_get_contents($htpath);
|
584 |
+
$htaccess = explode("\n", $htaccess);
|
585 |
+
$htFilter = [];
|
586 |
+
|
587 |
+
for ($i = 0; $i < sizeof($htaccess); ++$i) {
|
588 |
+
if (strpos($htaccess[$i], 'Backup Migration START')) {
|
589 |
+
$addline = false;
|
590 |
+
|
591 |
+
continue;
|
592 |
+
} elseif (strpos($htaccess[$i], 'Backup Migration END')) {
|
593 |
+
$addline = true;
|
594 |
+
|
595 |
+
continue;
|
596 |
+
} else {
|
597 |
+
if ($addline == true) {
|
598 |
+
$htFilter[] = $htaccess[$i];
|
599 |
+
}
|
600 |
+
}
|
601 |
+
}
|
602 |
+
|
603 |
+
file_put_contents($htpath, trim(implode("\n", $htFilter)));
|
604 |
+
|
605 |
+
return ['status' => 'success'];
|
606 |
+
}
|
607 |
+
|
608 |
+
public static function humanSize($bytes) {
|
609 |
+
$label = ['B', 'KB', 'MB', 'GB', 'TB', 'PB'];
|
610 |
+
for ($i = 0; $bytes >= 1024 && $i < (count($label) - 1); $bytes /= 1024, $i++);
|
611 |
+
|
612 |
+
return (round($bytes, 2) . " " . $label[$i]);
|
613 |
+
}
|
614 |
+
|
615 |
+
public static function fixSlashes($str) {
|
616 |
+
$str = str_replace('\\\\', DIRECTORY_SEPARATOR, $str);
|
617 |
+
$str = str_replace('\\', DIRECTORY_SEPARATOR, $str);
|
618 |
+
$str = str_replace('\/', DIRECTORY_SEPARATOR, $str);
|
619 |
+
$str = str_replace('/', DIRECTORY_SEPARATOR, $str);
|
620 |
+
|
621 |
+
if ($str[strlen($str) - 1] == DIRECTORY_SEPARATOR) {
|
622 |
+
$str = substr($str, 0, -1);
|
623 |
+
}
|
624 |
+
|
625 |
+
return $str;
|
626 |
+
}
|
627 |
+
|
628 |
+
public static function merge_arrays(&$array1, &$array2) {
|
629 |
+
for ($i = 0; $i < sizeof($array2); ++$i) {
|
630 |
+
$array1[] = $array2[$i];
|
631 |
+
}
|
632 |
+
}
|
633 |
+
|
634 |
+
private function get_asset($base = '', $asset) {
|
635 |
+
return BMI_ASSETS . '/' . $base . '/' . $asset;
|
636 |
+
}
|
637 |
+
}
|
includes/logger.php
ADDED
@@ -0,0 +1,43 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
// Namespace
|
4 |
+
namespace BMI\Plugin;
|
5 |
+
|
6 |
+
// Exit on direct access
|
7 |
+
if (!defined('ABSPATH')) exit;
|
8 |
+
|
9 |
+
/**
|
10 |
+
* Main Plugin Logger
|
11 |
+
*/
|
12 |
+
class BMI_Logger {
|
13 |
+
|
14 |
+
public static function append($type, $log) {
|
15 |
+
|
16 |
+
$date = '[' . date('Y-m-d H:i:s') . '] ';
|
17 |
+
$file = fopen(BMI_CONFIG_DIR . DIRECTORY_SEPARATOR . 'complete_logs.log', 'a');
|
18 |
+
fwrite($file, $date . $type . ' ' . $log . "\n");
|
19 |
+
fclose($file);
|
20 |
+
|
21 |
+
}
|
22 |
+
|
23 |
+
public static function log($log) {
|
24 |
+
|
25 |
+
BMI_Logger::append('[LOG]', $log);
|
26 |
+
|
27 |
+
}
|
28 |
+
|
29 |
+
public static function error($log) {
|
30 |
+
|
31 |
+
BMI_Logger::append('[ERROR]', $log);
|
32 |
+
|
33 |
+
}
|
34 |
+
|
35 |
+
public static function debug($log) {
|
36 |
+
|
37 |
+
if (BMI_DEBUG === TRUE) {
|
38 |
+
BMI_Logger::append('[DEBUG]', $log);
|
39 |
+
}
|
40 |
+
|
41 |
+
}
|
42 |
+
|
43 |
+
}
|
includes/progress/migration.php
ADDED
@@ -0,0 +1,54 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
// Namespace
|
4 |
+
namespace BMI\Plugin\Progress;
|
5 |
+
|
6 |
+
// Use
|
7 |
+
use BMI\Plugin\BMI_Logger AS Logger;
|
8 |
+
|
9 |
+
// Exit on direct access
|
10 |
+
if (!defined('ABSPATH')) exit;
|
11 |
+
|
12 |
+
/**
|
13 |
+
* Main File Scanner Logic
|
14 |
+
*/
|
15 |
+
class BMI_MigrationProgress {
|
16 |
+
|
17 |
+
public function __construct($continue = false) {
|
18 |
+
|
19 |
+
if (!file_exists(BMI_BACKUPS)) mkdir(BMI_BACKUPS);
|
20 |
+
|
21 |
+
$this->latest = BMI_BACKUPS . '/latest_migration.log';
|
22 |
+
$this->progress = BMI_BACKUPS . '/latest_migration_progress.log';
|
23 |
+
|
24 |
+
if (file_exists($this->latest) && !$continue) unlink($this->latest);
|
25 |
+
|
26 |
+
}
|
27 |
+
|
28 |
+
public function start($muted = false) {
|
29 |
+
|
30 |
+
$this->muted = $muted;
|
31 |
+
$this->file = fopen($this->latest, 'a') or die(__("Unable to open file!", 'backup-migration'));
|
32 |
+
|
33 |
+
}
|
34 |
+
|
35 |
+
public function progress($progress = '0') {
|
36 |
+
|
37 |
+
file_put_contents($this->progress, $progress);
|
38 |
+
|
39 |
+
}
|
40 |
+
|
41 |
+
public function log($log = '', $level = 'INFO') {
|
42 |
+
|
43 |
+
if (!$this->muted)
|
44 |
+
fwrite($this->file, '[' . strtoupper($level) . '] [' . date('Y-m-d H:i:s') . '] ' . $log . "\n");
|
45 |
+
|
46 |
+
}
|
47 |
+
|
48 |
+
public function end() {
|
49 |
+
|
50 |
+
fclose($this->file);
|
51 |
+
|
52 |
+
}
|
53 |
+
|
54 |
+
}
|
includes/progress/zip.php
ADDED
@@ -0,0 +1,110 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
// Namespace
|
4 |
+
namespace BMI\Plugin\Progress;
|
5 |
+
|
6 |
+
// Use
|
7 |
+
use BMI\Plugin\BMI_Logger AS Logger;
|
8 |
+
|
9 |
+
// Exit on direct access
|
10 |
+
if (!defined('ABSPATH')) exit;
|
11 |
+
|
12 |
+
/**
|
13 |
+
* Main File Scanner Logic
|
14 |
+
*/
|
15 |
+
class BMI_ZipProgress {
|
16 |
+
|
17 |
+
public function __construct($backup_name, $files = 0, $bytes = 0, $cron = false) {
|
18 |
+
|
19 |
+
if (!file_exists(BMI_BACKUPS)) mkdir(BMI_BACKUPS);
|
20 |
+
|
21 |
+
$this->name = $backup_name;
|
22 |
+
$this->date = date('Y-m-d H:i:s');
|
23 |
+
$this->millis = microtime(true);
|
24 |
+
$this->cron = $cron;
|
25 |
+
$this->logfilename = substr($backup_name, 0, -4) . '.log';
|
26 |
+
$this->latest = BMI_BACKUPS . '/latest.log';
|
27 |
+
$this->latest_progress = BMI_BACKUPS . '/latest_progress.log';
|
28 |
+
$this->files = $files;
|
29 |
+
$this->bytes = $bytes;
|
30 |
+
|
31 |
+
if (file_exists($this->latest)) @unlink($this->latest);
|
32 |
+
if (file_exists($this->latest_progress)) @unlink($this->latest_progress);
|
33 |
+
|
34 |
+
file_put_contents($this->latest_progress, '0/100');
|
35 |
+
|
36 |
+
}
|
37 |
+
|
38 |
+
public function createManifest() {
|
39 |
+
|
40 |
+
global $table_prefix;
|
41 |
+
|
42 |
+
$manifest = array(
|
43 |
+
'name' => $this->name,
|
44 |
+
'date' => $this->date,
|
45 |
+
'files' => $this->files,
|
46 |
+
'bytes' => $this->bytes,
|
47 |
+
'cron' => $this->cron,
|
48 |
+
'manifest' => date('Y-m-d H:i:s'),
|
49 |
+
'millis_start' => $this->millis,
|
50 |
+
'millis_end' => microtime(true),
|
51 |
+
'version' => BMI_VERSION,
|
52 |
+
'domain' => parse_url(home_url())['host'],
|
53 |
+
'dbdomain' => get_option('siteurl'),
|
54 |
+
'uid' => get_current_user_id(),
|
55 |
+
'config' => array(
|
56 |
+
'ABSPATH' => ABSPATH,
|
57 |
+
'DB_NAME' => DB_NAME,
|
58 |
+
'DB_USER' => DB_USER,
|
59 |
+
'DB_PASSWORD' => DB_PASSWORD,
|
60 |
+
'DB_HOST' => DB_HOST,
|
61 |
+
'DB_CHARSET' => DB_CHARSET,
|
62 |
+
'DB_COLLATE' => DB_COLLATE,
|
63 |
+
'AUTH_KEY' => AUTH_KEY,
|
64 |
+
'SECURE_AUTH_KEY' => SECURE_AUTH_KEY,
|
65 |
+
'LOGGED_IN_KEY' => LOGGED_IN_KEY,
|
66 |
+
'NONCE_KEY' => NONCE_KEY,
|
67 |
+
'AUTH_SALT' => AUTH_SALT,
|
68 |
+
'SECURE_AUTH_SALT' => SECURE_AUTH_SALT,
|
69 |
+
'LOGGED_IN_SALT' => LOGGED_IN_SALT,
|
70 |
+
'NONCE_SALT' => NONCE_SALT,
|
71 |
+
'WP_DEBUG_LOG' => WP_DEBUG_LOG,
|
72 |
+
'WP_CONTENT_URL' => WP_CONTENT_URL,
|
73 |
+
'WP_CONTENT_DIR' => WP_CONTENT_DIR,
|
74 |
+
'table_prefix' => $table_prefix
|
75 |
+
)
|
76 |
+
);
|
77 |
+
|
78 |
+
return json_encode($manifest);
|
79 |
+
|
80 |
+
}
|
81 |
+
|
82 |
+
public function start($muted = false) {
|
83 |
+
|
84 |
+
$this->muted = $muted;
|
85 |
+
$this->file = fopen($this->latest, 'a') or die(__("Unable to open file!", 'backup-migration'));
|
86 |
+
|
87 |
+
}
|
88 |
+
|
89 |
+
public function log($log = '', $level = 'INFO') {
|
90 |
+
|
91 |
+
if (!$this->muted)
|
92 |
+
fwrite($this->file, '[' . strtoupper($level) . '] [' . date('Y-m-d H:i:s') . '] ' . $log . "\n");
|
93 |
+
|
94 |
+
}
|
95 |
+
|
96 |
+
public function progress($progress = '0') {
|
97 |
+
|
98 |
+
$this->progress = fopen($this->latest_progress, 'w') or die(__("Unable to open file!", 'backup-migration'));
|
99 |
+
fwrite($this->progress, $progress);
|
100 |
+
fclose($this->progress);
|
101 |
+
|
102 |
+
}
|
103 |
+
|
104 |
+
public function end() {
|
105 |
+
|
106 |
+
fclose($this->file);
|
107 |
+
|
108 |
+
}
|
109 |
+
|
110 |
+
}
|
includes/scanner/backups.php
ADDED
@@ -0,0 +1,90 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
// Namespace
|
4 |
+
namespace BMI\Plugin\Scanner;
|
5 |
+
|
6 |
+
// Use
|
7 |
+
use BMI\Plugin\BMI_Logger AS Logger;
|
8 |
+
use BMI\Plugin\Zipper\BMI_Zipper AS Zipper;
|
9 |
+
use BMI\Plugin\Zipper\PclZip AS PclZip;
|
10 |
+
use BMI\Plugin\Zipper\Zip AS Zip;
|
11 |
+
|
12 |
+
// Exit on direct access
|
13 |
+
if (!defined('ABSPATH')) exit;
|
14 |
+
|
15 |
+
/**
|
16 |
+
* Main Backup Scanner Logic
|
17 |
+
*/
|
18 |
+
class BMI_BackupsScanner {
|
19 |
+
|
20 |
+
public function scanBackupDir($path) {
|
21 |
+
|
22 |
+
$files = [];
|
23 |
+
foreach (new \DirectoryIterator($path) as $fileInfo) {
|
24 |
+
|
25 |
+
if ($fileInfo->isDot()) continue;
|
26 |
+
if ($fileInfo->isFile()) {
|
27 |
+
if (in_array($fileInfo->getExtension(), ['zip', 'tar', 'tar.gz', 'gz', 'rar', '7zip'])) {
|
28 |
+
|
29 |
+
$files[] = array(
|
30 |
+
'filename' => $fileInfo->getFilename(),
|
31 |
+
'path' => $path,
|
32 |
+
'size' => $fileInfo->getSize()
|
33 |
+
);
|
34 |
+
|
35 |
+
}
|
36 |
+
}
|
37 |
+
|
38 |
+
}
|
39 |
+
|
40 |
+
return $files;
|
41 |
+
|
42 |
+
}
|
43 |
+
|
44 |
+
public function getManifestFromZip($zip_path, &$zipper) {
|
45 |
+
|
46 |
+
// Get manifest content
|
47 |
+
$res = array();
|
48 |
+
$manifest = $zipper->getZipFileContent($zip_path, 'bmi_backup_manifest.json');
|
49 |
+
if ($manifest) {
|
50 |
+
|
51 |
+
$res[] = $manifest->name;
|
52 |
+
$res[] = $manifest->date;
|
53 |
+
$res[] = $manifest->files;
|
54 |
+
$res[] = $manifest->manifest;
|
55 |
+
$res[] = filesize($zip_path);
|
56 |
+
$res[] = $zipper->is_locked_zip($zip_path) ? 'locked' : 'unlocked';
|
57 |
+
$res[] = $manifest->cron;
|
58 |
+
|
59 |
+
return $res;
|
60 |
+
|
61 |
+
} else return false;
|
62 |
+
|
63 |
+
}
|
64 |
+
|
65 |
+
public function getAvailableBackups() {
|
66 |
+
|
67 |
+
// Require Universal Zip Library
|
68 |
+
require_once BMI_INCLUDES . '/zipper/zipping.php';
|
69 |
+
$zipper = new Zipper();
|
70 |
+
|
71 |
+
// Scan for manifests
|
72 |
+
$manifests = array();
|
73 |
+
$backups = array();
|
74 |
+
|
75 |
+
if (file_exists(BMI_BACKUPS))
|
76 |
+
$backups = $this->scanBackupDir(BMI_BACKUPS);
|
77 |
+
|
78 |
+
for ($i = 0; $i < sizeof($backups); ++$i) {
|
79 |
+
|
80 |
+
$backup = $backups[$i];
|
81 |
+
$manifest = $this->getManifestFromZip($backup['path'] . '/' . $backup['filename'], $zipper);
|
82 |
+
if ($manifest) $manifests[$backup['filename']] = $manifest;
|
83 |
+
|
84 |
+
}
|
85 |
+
|
86 |
+
return $manifests;
|
87 |
+
|
88 |
+
}
|
89 |
+
|
90 |
+
}
|
includes/scanner/files.php
ADDED
@@ -0,0 +1,461 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
// Namespace
|
4 |
+
namespace BMI\Plugin\Scanner;
|
5 |
+
|
6 |
+
// Use
|
7 |
+
use BMI\Plugin\BMI_Logger AS Logger;
|
8 |
+
use BMI\Plugin\Zipper\BMI_Zipper AS Zipper;
|
9 |
+
|
10 |
+
// Exit on direct access
|
11 |
+
if (!defined('ABSPATH')) exit;
|
12 |
+
|
13 |
+
/**
|
14 |
+
* Main File Scanner Logic
|
15 |
+
*/
|
16 |
+
class BMI_FileScanner {
|
17 |
+
|
18 |
+
public static function equalEnd($name, $nsiz, $rsiz, $rule) {
|
19 |
+
|
20 |
+
if (substr($name, -$rsiz) == $rule) return true;
|
21 |
+
|
22 |
+
}
|
23 |
+
|
24 |
+
public static function equalStart($name, $nsiz, $rsiz, $rule) {
|
25 |
+
|
26 |
+
if (substr($name, 0, $rsiz) == $rule) return true;
|
27 |
+
|
28 |
+
}
|
29 |
+
|
30 |
+
public static function equalAnywhere($name, $rule) {
|
31 |
+
|
32 |
+
if (strpos($name, $rule) !== false) return true;
|
33 |
+
|
34 |
+
}
|
35 |
+
|
36 |
+
public static function equalFolder($name, $ignores) {
|
37 |
+
|
38 |
+
$s = strlen($name);
|
39 |
+
for ($i = 0; $i < sizeof($ignores); ++$i) {
|
40 |
+
|
41 |
+
if ($ignores[$i]['z'] > $s) continue;
|
42 |
+
if ($ignores[$i]['w'] == '1') {
|
43 |
+
|
44 |
+
if (BMI_FileScanner::equalAnywhere($name, $ignores[$i]['s'])) return true;
|
45 |
+
else continue;
|
46 |
+
|
47 |
+
} elseif ($ignores[$i]['w'] == '2') {
|
48 |
+
|
49 |
+
if (BMI_FileScanner::equalStart($name, $s, $ignores[$i]['z'], $ignores[$i]['s'])) return true;
|
50 |
+
else continue;
|
51 |
+
|
52 |
+
} elseif ($ignores[$i]['w'] == '3') {
|
53 |
+
|
54 |
+
if (BMI_FileScanner::equalEnd($name, $s, $ignores[$i]['z'], $ignores[$i]['s'])) return true;
|
55 |
+
else continue;
|
56 |
+
|
57 |
+
}
|
58 |
+
|
59 |
+
}
|
60 |
+
|
61 |
+
return false;
|
62 |
+
|
63 |
+
}
|
64 |
+
|
65 |
+
public static function equalFolderByPath($abs, $path, $ignores) {
|
66 |
+
|
67 |
+
$alen = strlen($abs);
|
68 |
+
$path = substr($path, $alen + 1);
|
69 |
+
$paths = explode(DIRECTORY_SEPARATOR, $path);
|
70 |
+
|
71 |
+
for ($i=0; $i < sizeof($paths); ++$i) {
|
72 |
+
|
73 |
+
$c = $paths[$i];
|
74 |
+
if (BMI_FileScanner::equalFolder($c, $ignores)) {
|
75 |
+
|
76 |
+
return true;
|
77 |
+
|
78 |
+
}
|
79 |
+
|
80 |
+
}
|
81 |
+
|
82 |
+
return false;
|
83 |
+
|
84 |
+
}
|
85 |
+
|
86 |
+
public static function scanDirectory($path) {
|
87 |
+
|
88 |
+
$files = [];
|
89 |
+
foreach (new \DirectoryIterator($path) as $fileInfo) {
|
90 |
+
|
91 |
+
if ($fileInfo->isDot()) continue;
|
92 |
+
if ($fileInfo->isFile()) {
|
93 |
+
|
94 |
+
$files[] = $fileInfo->getFilename() . DIRECTORY_SEPARATOR . $fileInfo->getSize();
|
95 |
+
|
96 |
+
} else {
|
97 |
+
|
98 |
+
$files[] = [];
|
99 |
+
$index = sizeof($files) - 1;
|
100 |
+
$dirName = $fileInfo->getFilename();
|
101 |
+
$newBase = $path . DIRECTORY_SEPARATOR . $dirName;
|
102 |
+
$files[$index] = BMI_FileScanner::scanDirectory($newBase);
|
103 |
+
array_unshift($files[$index], $dirName);
|
104 |
+
|
105 |
+
}
|
106 |
+
|
107 |
+
}
|
108 |
+
|
109 |
+
return $files;
|
110 |
+
|
111 |
+
}
|
112 |
+
|
113 |
+
public static function scanDirectorySizeOnly($path, $bm) {
|
114 |
+
|
115 |
+
$files = [];
|
116 |
+
foreach (new \DirectoryIterator($path) as $fileInfo) {
|
117 |
+
|
118 |
+
if ($fileInfo->isDot()) continue;
|
119 |
+
if ($fileInfo->isFile()) {
|
120 |
+
|
121 |
+
$files[] = $fileInfo->getSize();
|
122 |
+
|
123 |
+
} else {
|
124 |
+
|
125 |
+
$files[] = [];
|
126 |
+
$index = sizeof($files) - 1;
|
127 |
+
$dirName = $fileInfo->getFilename();
|
128 |
+
$newBase = $path . DIRECTORY_SEPARATOR . $dirName;
|
129 |
+
if ($newBase == $bm) continue;
|
130 |
+
$files[$index] = BMI_FileScanner::scanDirectorySizeOnly($newBase, $bm);
|
131 |
+
array_unshift($files[$index], $dirName);
|
132 |
+
|
133 |
+
}
|
134 |
+
|
135 |
+
}
|
136 |
+
|
137 |
+
return $files;
|
138 |
+
|
139 |
+
}
|
140 |
+
|
141 |
+
public static function scanDirectorySizeOnlyAndIgnore($path, $ignored = [], $bm) {
|
142 |
+
|
143 |
+
$files = [];
|
144 |
+
foreach (new \DirectoryIterator($path) as $fileInfo) {
|
145 |
+
|
146 |
+
if ($fileInfo->isDot()) continue;
|
147 |
+
if ($fileInfo->isFile()) {
|
148 |
+
|
149 |
+
$files[] = $fileInfo->getSize();
|
150 |
+
|
151 |
+
} else {
|
152 |
+
|
153 |
+
$dirPath = $fileInfo->getPath();
|
154 |
+
$dirName = $fileInfo->getFilename();
|
155 |
+
if (in_array($dirName, $ignored) || in_array($dirPath, $ignored)) {
|
156 |
+
Logger::debug('Dodging ' . $dirName);
|
157 |
+
continue;
|
158 |
+
}
|
159 |
+
|
160 |
+
$files[] = [];
|
161 |
+
$index = sizeof($files) - 1;
|
162 |
+
$newBase = $path . DIRECTORY_SEPARATOR . $dirName;
|
163 |
+
if ($newBase == $bm) continue;
|
164 |
+
$files[$index] = BMI_FileScanner::scanDirectorySizeOnlyAndIgnoreDirOnly($newBase, $ignored, $bm);
|
165 |
+
array_unshift($files[$index], $dirName);
|
166 |
+
|
167 |
+
}
|
168 |
+
|
169 |
+
}
|
170 |
+
|
171 |
+
return $files;
|
172 |
+
|
173 |
+
}
|
174 |
+
|
175 |
+
public static function scanDirectorySizeOnlyAndIgnoreDirOnly($path, $ignored = [], $bm) {
|
176 |
+
|
177 |
+
$files = [];
|
178 |
+
foreach (new \DirectoryIterator($path) as $fileInfo) {
|
179 |
+
|
180 |
+
if ($fileInfo->isDot()) continue;
|
181 |
+
if ($fileInfo->isFile()) {
|
182 |
+
|
183 |
+
$files[] = $fileInfo->getSize();
|
184 |
+
|
185 |
+
} else {
|
186 |
+
|
187 |
+
$dirName = $fileInfo->getFilename();
|
188 |
+
$dirPath = $fileInfo->getPath();
|
189 |
+
if (in_array($dirPath, $ignored)) {
|
190 |
+
Logger::debug('Dodging ' . $dirName);
|
191 |
+
continue;
|
192 |
+
}
|
193 |
+
|
194 |
+
$files[] = [];
|
195 |
+
$index = sizeof($files) - 1;
|
196 |
+
$newBase = $path . DIRECTORY_SEPARATOR . $dirName;
|
197 |
+
if ($newBase == $bm) continue;
|
198 |
+
$files[$index] = BMI_FileScanner::scanDirectorySizeOnlyAndIgnoreDirOnly($newBase, $ignored, $bm);
|
199 |
+
array_unshift($files[$index], $dirName);
|
200 |
+
|
201 |
+
}
|
202 |
+
|
203 |
+
}
|
204 |
+
|
205 |
+
return $files;
|
206 |
+
|
207 |
+
}
|
208 |
+
|
209 |
+
public static function scanDirectoryNameOnly($path) {
|
210 |
+
|
211 |
+
$files = [];
|
212 |
+
foreach (new \DirectoryIterator($path) as $fileInfo) {
|
213 |
+
|
214 |
+
if ($fileInfo->isDot()) continue;
|
215 |
+
if ($fileInfo->isFile()) {
|
216 |
+
|
217 |
+
$files[] = $fileInfo->getFilename();
|
218 |
+
|
219 |
+
} else {
|
220 |
+
|
221 |
+
$files[] = [];
|
222 |
+
$index = sizeof($files) - 1;
|
223 |
+
$dirName = $fileInfo->getFilename();
|
224 |
+
$newBase = $path . DIRECTORY_SEPARATOR . $dirName;
|
225 |
+
$files[$index] = BMI_FileScanner::scanDirectoryNameOnly($newBase);
|
226 |
+
array_unshift($files[$index], $dirName);
|
227 |
+
|
228 |
+
}
|
229 |
+
|
230 |
+
}
|
231 |
+
|
232 |
+
return $files;
|
233 |
+
|
234 |
+
}
|
235 |
+
|
236 |
+
public static function scanDirectoryNameOnlyAndIgnore($path, $ignored = []) {
|
237 |
+
|
238 |
+
$files = [];
|
239 |
+
foreach (new \DirectoryIterator($path) as $fileInfo) {
|
240 |
+
|
241 |
+
if ($fileInfo->isDot()) continue;
|
242 |
+
if ($fileInfo->isFile()) {
|
243 |
+
|
244 |
+
$files[] = $fileInfo->getFilename();
|
245 |
+
|
246 |
+
} else {
|
247 |
+
|
248 |
+
$dirName = $fileInfo->getFilename();
|
249 |
+
if (in_array($dirName, $ignored)) {
|
250 |
+
Logger::debug('Dodging ' . $dirName);
|
251 |
+
continue;
|
252 |
+
}
|
253 |
+
|
254 |
+
$files[] = [];
|
255 |
+
$index = sizeof($files) - 1;
|
256 |
+
$newBase = $path . DIRECTORY_SEPARATOR . $dirName;
|
257 |
+
$files[$index] = BMI_FileScanner::scanDirectoryNameOnlyAndIgnore($newBase, $ignored);
|
258 |
+
array_unshift($files[$index], $dirName);
|
259 |
+
|
260 |
+
}
|
261 |
+
|
262 |
+
}
|
263 |
+
|
264 |
+
return $files;
|
265 |
+
|
266 |
+
}
|
267 |
+
|
268 |
+
public static function scanDirectoryNameOnlyAndIgnoreFBC($path, $ignored_folders = [], $ignored_paths = []) {
|
269 |
+
|
270 |
+
$files = [];
|
271 |
+
foreach (new \DirectoryIterator($path) as $fileInfo) {
|
272 |
+
|
273 |
+
if ($fileInfo->isDot()) continue;
|
274 |
+
if ($fileInfo->isFile()) {
|
275 |
+
|
276 |
+
$files[] = $fileInfo->getFilename() . ',' . $fileInfo->getSize();
|
277 |
+
|
278 |
+
} else {
|
279 |
+
|
280 |
+
$dirName = $fileInfo->getFilename();
|
281 |
+
if (BMI_FileScanner::equalFolder($dirName, $ignored_folders)) {
|
282 |
+
Logger::debug('Dodging folder ' . $dirName);
|
283 |
+
continue;
|
284 |
+
}
|
285 |
+
|
286 |
+
$files[] = [];
|
287 |
+
$index = sizeof($files) - 1;
|
288 |
+
$newBase = $path . DIRECTORY_SEPARATOR . $dirName;
|
289 |
+
if (in_array($newBase, $ignored_paths)) {
|
290 |
+
Logger::debug('Dodging path ' . $newBase);
|
291 |
+
continue;
|
292 |
+
}
|
293 |
+
|
294 |
+
$files[$index] = BMI_FileScanner::scanDirectoryNameOnlyAndIgnoreFBC($newBase, $ignored_folders, $ignored_paths);
|
295 |
+
array_unshift($files[$index], $dirName);
|
296 |
+
|
297 |
+
}
|
298 |
+
|
299 |
+
}
|
300 |
+
|
301 |
+
return $files;
|
302 |
+
|
303 |
+
}
|
304 |
+
|
305 |
+
public static function getSizeOfFileList($fileList) {
|
306 |
+
|
307 |
+
$size = 0;
|
308 |
+
for ($i = 0; $i < sizeOf($fileList); $i++) {
|
309 |
+
|
310 |
+
if ($i == 0) continue;
|
311 |
+
if (!is_array($fileList[$i])) {
|
312 |
+
|
313 |
+
$size += intval($fileList[$i]);
|
314 |
+
|
315 |
+
} else {
|
316 |
+
|
317 |
+
$size += BMI_FileScanner::getSizeOfFileList($fileList[$i]);
|
318 |
+
|
319 |
+
}
|
320 |
+
|
321 |
+
}
|
322 |
+
return $size;
|
323 |
+
|
324 |
+
}
|
325 |
+
|
326 |
+
public static function getFileFullPaths($base, $fileList) {
|
327 |
+
|
328 |
+
$paths = []; $merge = [];
|
329 |
+
for ($i = 0; $i < sizeOf($fileList); $i++) {
|
330 |
+
|
331 |
+
if ($i == 0) {
|
332 |
+
|
333 |
+
$base = $base . DIRECTORY_SEPARATOR . $fileList[$i];
|
334 |
+
continue;
|
335 |
+
|
336 |
+
}
|
337 |
+
|
338 |
+
if (!is_array($fileList[$i])) {
|
339 |
+
|
340 |
+
$paths[] = $base . DIRECTORY_SEPARATOR . $fileList[$i];
|
341 |
+
|
342 |
+
} else {
|
343 |
+
|
344 |
+
$merge[] = BMI_FileScanner::getFileFullPaths($base, $fileList[$i]);
|
345 |
+
|
346 |
+
}
|
347 |
+
|
348 |
+
}
|
349 |
+
|
350 |
+
$paths = array_merge($paths, ...$merge);
|
351 |
+
return $paths;
|
352 |
+
|
353 |
+
}
|
354 |
+
|
355 |
+
public static function scanFiles($path, $bm) {
|
356 |
+
|
357 |
+
// Get TOP Dir name
|
358 |
+
$z = explode(DIRECTORY_SEPARATOR, $path);
|
359 |
+
$z = $z[sizeof($z) - 1];
|
360 |
+
|
361 |
+
// Scan Directory
|
362 |
+
$x = BMI_FileScanner::scanDirectorySizeOnly($path, $bm);
|
363 |
+
|
364 |
+
// Push TOP Lever (root) Directory
|
365 |
+
array_unshift($x, $z);
|
366 |
+
|
367 |
+
// Calculate size
|
368 |
+
$y = BMI_FileScanner::getSizeOfFileList($x);
|
369 |
+
|
370 |
+
// Return size in Bytes
|
371 |
+
return $y;
|
372 |
+
|
373 |
+
}
|
374 |
+
|
375 |
+
public static function scanFilesGetNamesWithIgnore($path, $ignored = []) {
|
376 |
+
|
377 |
+
// Require Zipper
|
378 |
+
require_once BMI_INCLUDES . '/zipper/zipping.php';
|
379 |
+
|
380 |
+
// Get TOP Dir name
|
381 |
+
$z = explode(DIRECTORY_SEPARATOR, $path);
|
382 |
+
$z = $z[sizeof($z) - 1];
|
383 |
+
|
384 |
+
// Scan Directory
|
385 |
+
$x = BMI_FileScanner::scanDirectoryNameOnlyAndIgnore($path, $ignored);
|
386 |
+
|
387 |
+
// Push TOP Lever (root) Directory
|
388 |
+
array_unshift($x, $z);
|
389 |
+
|
390 |
+
// Parse Output to Array of Full Paths
|
391 |
+
$path = substr($path, 0, -(strlen($z) + 1));
|
392 |
+
$y = BMI_FileScanner::getFileFullPaths($path, $x);
|
393 |
+
|
394 |
+
// Return array of Full Paths
|
395 |
+
return $y;
|
396 |
+
|
397 |
+
}
|
398 |
+
|
399 |
+
public static function scanFilesGetNamesWithIgnoreFBC($path, $ignored = [], $ignored_paths = []) {
|
400 |
+
|
401 |
+
// Require Zipper
|
402 |
+
require_once BMI_INCLUDES . '/zipper/zipping.php';
|
403 |
+
|
404 |
+
// Exclude paths which won't exist in current $path
|
405 |
+
$max = sizeof($ignored_paths);
|
406 |
+
for ($i = 0; $i < $max; ++$i) {
|
407 |
+
|
408 |
+
if (strpos($ignored_paths[$i], $path) === false) {
|
409 |
+
array_splice($ignored_paths, $i, 1);
|
410 |
+
$max--; $i--;
|
411 |
+
}
|
412 |
+
|
413 |
+
}
|
414 |
+
|
415 |
+
// Get TOP Dir name
|
416 |
+
$z = explode(DIRECTORY_SEPARATOR, $path);
|
417 |
+
$z = $z[sizeof($z) - 1];
|
418 |
+
|
419 |
+
// Scan Directory
|
420 |
+
$x = BMI_FileScanner::scanDirectoryNameOnlyAndIgnoreFBC($path, $ignored, $ignored_paths);
|
421 |
+
|
422 |
+
// Push TOP Lever (root) Directory
|
423 |
+
array_unshift($x, $z);
|
424 |
+
|
425 |
+
// Parse Output to Array of Full Paths
|
426 |
+
$path = substr($path, 0, -(strlen($z) + 1));
|
427 |
+
$y = BMI_FileScanner::getFileFullPaths($path, $x);
|
428 |
+
|
429 |
+
// Return array of Full Paths
|
430 |
+
return $y;
|
431 |
+
|
432 |
+
}
|
433 |
+
|
434 |
+
public static function scanFilesWithIgnore($path, $ignored, $bm) {
|
435 |
+
|
436 |
+
// Get TOP Dir name
|
437 |
+
$z = explode(DIRECTORY_SEPARATOR, $path);
|
438 |
+
$z = $z[sizeof($z) - 1];
|
439 |
+
|
440 |
+
// Scan Directory
|
441 |
+
$x = BMI_FileScanner::scanDirectorySizeOnlyAndIgnore($path, $ignored, $bm);
|
442 |
+
|
443 |
+
// Push TOP Lever (root) Directory
|
444 |
+
array_unshift($x, $z);
|
445 |
+
|
446 |
+
// Calculate size
|
447 |
+
$y = BMI_FileScanner::getSizeOfFileList($x);
|
448 |
+
|
449 |
+
// Return size in Bytes
|
450 |
+
return $y;
|
451 |
+
|
452 |
+
}
|
453 |
+
|
454 |
+
public static function fileTooLarge($size, $max) {
|
455 |
+
|
456 |
+
if ($size > $max) return true;
|
457 |
+
else return false;
|
458 |
+
|
459 |
+
}
|
460 |
+
|
461 |
+
}
|
includes/uploader/chunks.php
ADDED
@@ -0,0 +1,133 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
// Namespace
|
4 |
+
namespace BMI\Plugin\Uploader;
|
5 |
+
|
6 |
+
// Use
|
7 |
+
use BMI\Plugin\Zipper\BMI_Zipper AS Zipper;
|
8 |
+
|
9 |
+
// Exit on direct access
|
10 |
+
if (!defined('ABSPATH')) exit;
|
11 |
+
|
12 |
+
header('Content-Type: application/json; charset=utf-8');
|
13 |
+
$file = isset($_FILES['file_data']) ? $_FILES['file_data'] : null;
|
14 |
+
$name = isset($this->post['file_name']) ? $this->post['file_name'] : null;
|
15 |
+
$total = isset($this->post['file_total']) ? $this->post['file_total'] : 0;
|
16 |
+
$index = isset($this->post['file_index']) ? $this->post['file_index'] : 0;
|
17 |
+
$size = isset($this->post['file_size']) ? $this->post['file_size'] : null;
|
18 |
+
$taskStart = isset($this->post['taskStart']) ? $this->post['taskStart'] : 123;
|
19 |
+
|
20 |
+
$info = pathinfo($name);
|
21 |
+
$ext = isset($info['extension']) ? $info['extension'] : '';
|
22 |
+
|
23 |
+
$beforename = $name;
|
24 |
+
$name = substr($name, 0, -(strlen($ext) + 1));
|
25 |
+
$noextname = $name;
|
26 |
+
$file_name = $name . '-' . $taskStart . '.' . $ext;
|
27 |
+
$newfile = BMI_BACKUPS . '/' . $file_name;
|
28 |
+
$afterfile = BMI_BACKUPS . '/' . $beforename;
|
29 |
+
$url = plugin_dir_url(BMI_ROOT_FILE) . '/backups' . '/' . $file_name;
|
30 |
+
|
31 |
+
function jsonMsg($status, $message, $url = '', $afterfile = false) {
|
32 |
+
|
33 |
+
if ($status === 2) {
|
34 |
+
|
35 |
+
require_once BMI_INCLUDES . '/zipper/zipping.php';
|
36 |
+
$zipper = new Zipper();
|
37 |
+
$manifest = $zipper->getZipFileContent($afterfile, 'bmi_backup_manifest.json');
|
38 |
+
|
39 |
+
if ($manifest === false) {
|
40 |
+
@unlink($afterfile);
|
41 |
+
$status = 5;
|
42 |
+
}
|
43 |
+
|
44 |
+
}
|
45 |
+
|
46 |
+
$arr['status'] = $status;
|
47 |
+
$arr['message'] = $message;
|
48 |
+
$arr['url'] = $url;
|
49 |
+
|
50 |
+
echo json_encode($arr);
|
51 |
+
die();
|
52 |
+
|
53 |
+
}
|
54 |
+
|
55 |
+
if (!$file || !$name) {
|
56 |
+
|
57 |
+
jsonMsg(0, 'Missing file?');
|
58 |
+
|
59 |
+
}
|
60 |
+
|
61 |
+
$imgarr = array('zip');
|
62 |
+
if (!in_array(strtolower($ext), $imgarr)) {
|
63 |
+
|
64 |
+
jsonMsg(0, 'Invalid file type');
|
65 |
+
|
66 |
+
}
|
67 |
+
|
68 |
+
function completed($newfile, $noextname, $ext) {
|
69 |
+
|
70 |
+
chmod($newfile, 0755);
|
71 |
+
|
72 |
+
$i = 1;
|
73 |
+
$curr_fil = BMI_BACKUPS . '/' . $noextname . '.' . $ext;
|
74 |
+
while (file_exists($curr_fil)) {
|
75 |
+
$i++;
|
76 |
+
$curr_fil = BMI_BACKUPS . '/' . $noextname . '-' . $i . '.' . $ext;
|
77 |
+
}
|
78 |
+
rename($newfile, $curr_fil);
|
79 |
+
|
80 |
+
}
|
81 |
+
|
82 |
+
clearstatcache($afterfile);
|
83 |
+
if (is_file($afterfile) && ($size == filesize($afterfile))) {
|
84 |
+
|
85 |
+
jsonMsg(3, 'File already exists.', $url);
|
86 |
+
|
87 |
+
}
|
88 |
+
|
89 |
+
if ($file['error'] == 0) {
|
90 |
+
|
91 |
+
if (!file_exists($newfile)) {
|
92 |
+
|
93 |
+
if (!move_uploaded_file($file['tmp_name'], $newfile)) {
|
94 |
+
|
95 |
+
jsonMsg(0, 'Cannot move file');
|
96 |
+
|
97 |
+
}
|
98 |
+
|
99 |
+
if ($index == $total) {
|
100 |
+
|
101 |
+
completed($newfile, $noextname, $ext);
|
102 |
+
jsonMsg(2, 'Upload completed', $url, $afterfile);
|
103 |
+
|
104 |
+
}
|
105 |
+
|
106 |
+
jsonMsg(1, 'Uploading');
|
107 |
+
|
108 |
+
}
|
109 |
+
|
110 |
+
if ($index <= $total) {
|
111 |
+
|
112 |
+
$content = file_get_contents($file['tmp_name']);
|
113 |
+
if (!file_put_contents($newfile, $content, FILE_APPEND)) {
|
114 |
+
|
115 |
+
jsonMsg(0, 'Cannot write file');
|
116 |
+
|
117 |
+
}
|
118 |
+
|
119 |
+
if ($index == $total) {
|
120 |
+
|
121 |
+
completed($newfile, $noextname, $ext);
|
122 |
+
jsonMsg(2, 'Upload completed', $url, $afterfile);
|
123 |
+
|
124 |
+
}
|
125 |
+
|
126 |
+
jsonMsg(1, 'Uploading');
|
127 |
+
}
|
128 |
+
|
129 |
+
} else {
|
130 |
+
|
131 |
+
jsonMsg(0, 'No file uploaded');
|
132 |
+
|
133 |
+
}
|
includes/zipper/src/zip.php
ADDED
@@ -0,0 +1,500 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace BMI\Plugin\Zipper;
|
4 |
+
|
5 |
+
use BMI\Plugin\Backup_Migration_Plugin as BMP;
|
6 |
+
use BMI\Plugin\BMI_Logger as Logger;
|
7 |
+
use BMI\Plugin\Dashboard as Dashboard;
|
8 |
+
use BMI\Plugin\Database\BMI_Database as Database;
|
9 |
+
use BMI\Plugin\Progress\BMI_ZipProgress as Progress;
|
10 |
+
|
11 |
+
class Zip {
|
12 |
+
protected $lib;
|
13 |
+
protected $org_files;
|
14 |
+
protected $new_file_path;
|
15 |
+
protected $new_file_name;
|
16 |
+
protected $backupname;
|
17 |
+
protected $zip_progress;
|
18 |
+
|
19 |
+
protected $extr_file;
|
20 |
+
protected $extr_dirc;
|
21 |
+
protected $start_zip;
|
22 |
+
|
23 |
+
public function __construct() {
|
24 |
+
$this->lib = 0;
|
25 |
+
$this->extr_file = 0;
|
26 |
+
$this->new_file_path = 0;
|
27 |
+
$this->org_files = [];
|
28 |
+
}
|
29 |
+
|
30 |
+
public function zip_start($file_path, $files = [], $name = '', &$zip_progress = null, $start = null) {
|
31 |
+
|
32 |
+
// save the new file path
|
33 |
+
$this->new_file_path = $file_path;
|
34 |
+
$this->backupname = $name;
|
35 |
+
$this->zip_progress = $zip_progress;
|
36 |
+
$this->start_zip = $start;
|
37 |
+
|
38 |
+
if (sizeof($files) > 0) {
|
39 |
+
$this->org_files = $files;
|
40 |
+
}
|
41 |
+
|
42 |
+
// Some php installations doesn't have the ZipArchive
|
43 |
+
// So in this case we'll use another lib called PclZip
|
44 |
+
if (class_exists("ZipArchive")) {
|
45 |
+
$this->lib = 1;
|
46 |
+
} else {
|
47 |
+
$this->lib = 2;
|
48 |
+
}
|
49 |
+
|
50 |
+
return true;
|
51 |
+
}
|
52 |
+
|
53 |
+
public function return_bytes($val) {
|
54 |
+
$val = trim($val);
|
55 |
+
$last = strtolower($val[strlen($val) - 1]);
|
56 |
+
$val = substr($val, 0, -1);
|
57 |
+
|
58 |
+
switch ($last) {
|
59 |
+
// The 'G' modifier is available since PHP 5.1.0
|
60 |
+
case 'g':
|
61 |
+
$val *= 1024;
|
62 |
+
// no break
|
63 |
+
case 'm':
|
64 |
+
$val *= 1024;
|
65 |
+
// no break
|
66 |
+
case 'k':
|
67 |
+
$val *= 1024;
|
68 |
+
}
|
69 |
+
|
70 |
+
return $val;
|
71 |
+
}
|
72 |
+
|
73 |
+
public function zip_failed($error) {
|
74 |
+
Logger::error(__("There was an error during backup (packing)...", 'backup-migration'));
|
75 |
+
Logger::error($error);
|
76 |
+
|
77 |
+
if ($this->zip_progress != null) {
|
78 |
+
$this->zip_progress->log(__("Issues during backup (packing)...", 'backup-migration'), 'ERROR');
|
79 |
+
$this->zip_progress->log($error, 'ERROR');
|
80 |
+
}
|
81 |
+
}
|
82 |
+
|
83 |
+
public function restore_failed($error) {
|
84 |
+
Logger::error(__("There was an error during restore process (extracting)...", 'backup-migration'));
|
85 |
+
Logger::error($error);
|
86 |
+
|
87 |
+
if ($this->zip_progress != null) {
|
88 |
+
$this->zip_progress->log(__("Issues during restore process (extracting)...", 'backup-migration'), 'ERROR');
|
89 |
+
$this->zip_progress->log($error, 'ERROR');
|
90 |
+
}
|
91 |
+
}
|
92 |
+
|
93 |
+
public function zip_add($in) {
|
94 |
+
|
95 |
+
// Just to make sure.. if the user haven't called the earlier method
|
96 |
+
if ($this->lib === 0 || $this->new_file_path === 0) {
|
97 |
+
throw new \Exception("PHP-ZIP: must call zip_start before zip_add");
|
98 |
+
}
|
99 |
+
|
100 |
+
// Push file
|
101 |
+
array_push($this->org_files, $in);
|
102 |
+
|
103 |
+
//
|
104 |
+
return true;
|
105 |
+
}
|
106 |
+
|
107 |
+
public function zip_end($force_lib = false) {
|
108 |
+
|
109 |
+
// Try to set limit
|
110 |
+
$this->zip_progress->log(__("Smart memory calculation...", 'backup-migration'), 'STEP');
|
111 |
+
if ((intval($this->return_bytes(ini_get('memory_limit'))) / 1024 / 1024) < 256) {
|
112 |
+
@ini_set('memory_limit', '256M');
|
113 |
+
}
|
114 |
+
|
115 |
+
$memory_limit = (intval($this->return_bytes(ini_get('memory_limit'))) / 1024 / 1024);
|
116 |
+
$this->zip_progress->log(str_replace('%s', $memory_limit, __("There is %s MBs of memory to use", 'backup-migration')), 'INFO');
|
117 |
+
$safe_limit = intval($memory_limit / 4);
|
118 |
+
$this->zip_progress->log(str_replace('%s', $safe_limit, __("Setting the safe limit to %s MB", 'backup-migration')), 'SUCCESS');
|
119 |
+
|
120 |
+
$abs = BMP::fixSlashes(ABSPATH) . DIRECTORY_SEPARATOR;
|
121 |
+
|
122 |
+
$dbbackupname = 'bmi_database_backup.sql';
|
123 |
+
$database_file = BMP::fixSlashes(BMI_INCLUDES . DIRECTORY_SEPARATOR . 'htaccess' . DIRECTORY_SEPARATOR . $dbbackupname);
|
124 |
+
$database_file_dir = BMP::fixSlashes((dirname($database_file))) . DIRECTORY_SEPARATOR;
|
125 |
+
|
126 |
+
if (Dashboard\bmi_get_config('BACKUP:DATABASE') == 'true') {
|
127 |
+
|
128 |
+
// Require Database Manager
|
129 |
+
require_once BMI_INCLUDES . DIRECTORY_SEPARATOR . 'database' . DIRECTORY_SEPARATOR . 'manager.php';
|
130 |
+
|
131 |
+
// Get database dump
|
132 |
+
$this->zip_progress->log(__("Making database backup", 'backup-migration'), 'STEP');
|
133 |
+
$this->zip_progress->log(__("Iterating database...", 'backup-migration'), 'INFO');
|
134 |
+
$databaser = new Database(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);
|
135 |
+
$databaser->exportDatabase($dbbackupname);
|
136 |
+
$this->zip_progress->log(__("Database backup finished", 'backup-migration'), 'SUCCESS');
|
137 |
+
} else {
|
138 |
+
$this->zip_progress->log(__("Omitting database backup (due to settings)...", 'backup-migration'), 'WARN');
|
139 |
+
$database_file = false;
|
140 |
+
}
|
141 |
+
|
142 |
+
// force usage of specific lib (for testing purposes)
|
143 |
+
if ($force_lib === 2) {
|
144 |
+
$this->lib = 2;
|
145 |
+
} elseif ($force_lib === 1) {
|
146 |
+
$this->lib = 1;
|
147 |
+
}
|
148 |
+
|
149 |
+
// just to make sure.. if the user haven't called the earlier method
|
150 |
+
if ($this->lib === 0 || $this->new_file_path === 0) {
|
151 |
+
throw new \Exception('PHP-ZIP: zip_start and zip_add haven\'t been called yet');
|
152 |
+
}
|
153 |
+
|
154 |
+
// All files
|
155 |
+
$max = sizeof($this->org_files);
|
156 |
+
$this->zip_progress->log(__("Making archive", 'backup-migration'), 'STEP');
|
157 |
+
$this->zip_progress->log(__("Compressing...", 'backup-migration'), 'INFO');
|
158 |
+
|
159 |
+
// using zipArchive class
|
160 |
+
if ($this->lib === 1) {
|
161 |
+
|
162 |
+
// Verbose
|
163 |
+
$this->zip_progress->log(__("Using Zlib to create Backup", 'backup-migration'));
|
164 |
+
|
165 |
+
$lib = new \ZipArchive();
|
166 |
+
if (!$lib->open($this->new_file_path, \ZIPARCHIVE::CREATE)) {
|
167 |
+
throw new \Exception('PHP-ZIP: Permission Denied or zlib can\'t be found');
|
168 |
+
}
|
169 |
+
|
170 |
+
// Add each file
|
171 |
+
for ($i = 0; $i < $max; $i++) {
|
172 |
+
$file = $this->org_files[$i];
|
173 |
+
$zippath = substr($file, strlen($abs));
|
174 |
+
$lib->addFile($file, 'wordpress' . DIRECTORY_SEPARATOR . $zippath);
|
175 |
+
|
176 |
+
if ($i % 100 === 0) {
|
177 |
+
if (file_exists(BMI_BACKUPS . DIRECTORY_SEPARATOR . '.abort')) {
|
178 |
+
break;
|
179 |
+
}
|
180 |
+
$this->zip_progress->progress($i + 1 . '/' . $max);
|
181 |
+
}
|
182 |
+
|
183 |
+
if (($i + 1) % 5000 === 0 || $i == 0) {
|
184 |
+
$this->zip_progress->log((__("Milestone: ", 'backup-migration') . ($i + 1) . '/' . $max), 'info');
|
185 |
+
}
|
186 |
+
}
|
187 |
+
|
188 |
+
if (file_exists(BMI_BACKUPS . DIRECTORY_SEPARATOR . '.abort')) {
|
189 |
+
|
190 |
+
// close the archive
|
191 |
+
$lib->close();
|
192 |
+
} else {
|
193 |
+
$this->zip_progress->log((__("Milestone: ", 'backup-migration') . $max . '/' . $max), 'info');
|
194 |
+
$this->zip_progress->log(__("Compressed ", 'backup-migration') . $max . __(" files", 'backup-migration'), 'SUCCESS');
|
195 |
+
|
196 |
+
// Log time of ZIP Process
|
197 |
+
$this->zip_progress->log(__("Archiving of ", 'backup-migration') . $max . __(" files took: ", 'backup-migration') . (microtime(true) - $this->start_zip) . 's');
|
198 |
+
|
199 |
+
$this->zip_progress->log(__("Finalizing backup", 'backup-migration'), 'STEP');
|
200 |
+
$this->zip_progress->log(__("Adding manifest...", 'backup-migration'), 'INFO');
|
201 |
+
$this->zip_progress->log(__("Closing files and archives", 'backup-migration'), 'STEP');
|
202 |
+
|
203 |
+
$this->zip_progress->end();
|
204 |
+
$logs = file_get_contents(BMI_BACKUPS . DIRECTORY_SEPARATOR . 'latest.log');
|
205 |
+
$this->zip_progress->start(true);
|
206 |
+
|
207 |
+
if ($database_file !== false) {
|
208 |
+
$lib->addFile($database_file, 'bmi_database_backup.sql');
|
209 |
+
}
|
210 |
+
|
211 |
+
$lib->addFromString('bmi_backup_manifest.json', $this->zip_progress->createManifest());
|
212 |
+
$lib->addFromString('bmi_logs_this_backup.log', $logs);
|
213 |
+
$this->zip_progress->progress($max . '/' . $max);
|
214 |
+
|
215 |
+
// close the archive
|
216 |
+
$lib->close();
|
217 |
+
}
|
218 |
+
}
|
219 |
+
|
220 |
+
// using PclZip
|
221 |
+
if ($this->lib === 2) {
|
222 |
+
|
223 |
+
// Verbose
|
224 |
+
$this->zip_progress->log(__("Using PclZip to create Backup (forced)", 'backup-migration'));
|
225 |
+
|
226 |
+
// require the lib
|
227 |
+
if (!class_exists('PclZip')) {
|
228 |
+
if (!defined('PCLZIP_TEMPORARY_DIR')) {
|
229 |
+
$bmi_tmp_dir = BMI_ROOT_DIR . '/tmp';
|
230 |
+
if (!file_exists($bmi_tmp_dir)) {
|
231 |
+
@mkdir($bmi_tmp_dir, 0775, true);
|
232 |
+
}
|
233 |
+
define('PCLZIP_TEMPORARY_DIR', $bmi_tmp_dir . '/bmi-');
|
234 |
+
}
|
235 |
+
require_once trailingslashit(ABSPATH) . 'wp-admin/includes/class-pclzip.php';
|
236 |
+
}
|
237 |
+
$common = $this->org_files;
|
238 |
+
|
239 |
+
if (!$lib = new \PclZip($this->new_file_path)) {
|
240 |
+
throw new \Exception('PHP-ZIP: Permission Denied or zlib can\'t be found');
|
241 |
+
}
|
242 |
+
|
243 |
+
try {
|
244 |
+
$chunks = array_chunk($this->org_files, 500);
|
245 |
+
$chunkslen = sizeof($chunks);
|
246 |
+
$sizeoflast = sizeof($chunks[$chunkslen - 1]);
|
247 |
+
if ($chunkslen > 1 && $sizeoflast == 1) {
|
248 |
+
$buffer = array_slice($chunks[$chunkslen - 2], -1);
|
249 |
+
$chunks[$chunkslen - 2] = array_slice($chunks[$chunkslen - 2], 0, -1);
|
250 |
+
$chunks[$chunkslen - 1][] = $buffer[0];
|
251 |
+
}
|
252 |
+
|
253 |
+
for ($i = 0; $i < $chunkslen; ++$i) {
|
254 |
+
|
255 |
+
// Abort if user wants it (check every 100 files)
|
256 |
+
if (file_exists(BMI_BACKUPS . '/.abort')) {
|
257 |
+
break;
|
258 |
+
}
|
259 |
+
|
260 |
+
$chunk = $chunks[$i];
|
261 |
+
$back = $lib->add($chunk, PCLZIP_OPT_REMOVE_PATH, $abs, PCLZIP_OPT_ADD_PATH, 'wordpress' . DIRECTORY_SEPARATOR, PCLZIP_OPT_TEMP_FILE_THRESHOLD, $safe_limit);
|
262 |
+
if ($back == 0) {
|
263 |
+
$this->zip_failed($lib->errorInfo(true));
|
264 |
+
|
265 |
+
return false;
|
266 |
+
}
|
267 |
+
|
268 |
+
$curfile = (($i * 500) + 500);
|
269 |
+
$this->zip_progress->progress($curfile . '/' . $max);
|
270 |
+
if ($curfile % 5000 === 0) {
|
271 |
+
$this->zip_progress->log(__("Milestone: ", 'backup-migration') . ($curfile . '/' . $max), 'info');
|
272 |
+
}
|
273 |
+
}
|
274 |
+
} catch (\Exception $e) {
|
275 |
+
$this->zip_failed($e->getMessage());
|
276 |
+
|
277 |
+
return false;
|
278 |
+
} catch (\Throwable $e) {
|
279 |
+
$this->zip_failed($e->getMessage());
|
280 |
+
|
281 |
+
return false;
|
282 |
+
}
|
283 |
+
|
284 |
+
if (file_exists(BMI_BACKUPS . DIRECTORY_SEPARATOR . '.abort')) {
|
285 |
+
@unlink($database_file_dir . 'bmi_backup_manifest.json');
|
286 |
+
@unlink($database_file_dir . 'bmi_logs_this_backup.log');
|
287 |
+
} else {
|
288 |
+
|
289 |
+
// End
|
290 |
+
$this->zip_progress->log(__("Milestone: ", 'backup-migration') . ($max . '/' . $max), 'info');
|
291 |
+
$this->zip_progress->log(__("Compressed ", 'backup-migration') . $max . __(" files", 'backup-migration'), 'SUCCESS');
|
292 |
+
|
293 |
+
// Log time of ZIP Process
|
294 |
+
$this->zip_progress->log(__("Archiving of ", 'backup-migration') . $max . __(" files took: ", 'backup-migration') . (microtime(true) - $this->start_zip) . 's');
|
295 |
+
|
296 |
+
$this->zip_progress->log(__("Finalizing backup", 'backup-migration'), 'STEP');
|
297 |
+
$this->zip_progress->log(__("Adding manifest...", 'backup-migration'), 'INFO');
|
298 |
+
$this->zip_progress->log(__("Closing files and archives", 'backup-migration'), 'STEP');
|
299 |
+
|
300 |
+
$this->zip_progress->end();
|
301 |
+
|
302 |
+
file_put_contents($database_file_dir . 'bmi_backup_manifest.json', $this->zip_progress->createManifest());
|
303 |
+
file_put_contents($database_file_dir . 'bmi_logs_this_backup.log', file_get_contents(BMI_BACKUPS . DIRECTORY_SEPARATOR . 'latest.log'));
|
304 |
+
|
305 |
+
$this->zip_progress->start(true);
|
306 |
+
|
307 |
+
$files = [$database_file_dir . 'bmi_backup_manifest.json', $database_file_dir . 'bmi_logs_this_backup.log'];
|
308 |
+
if ($database_file !== false) {
|
309 |
+
$files[] = $database_file;
|
310 |
+
}
|
311 |
+
$lib->add($files, PCLZIP_OPT_REMOVE_PATH, $database_file_dir);
|
312 |
+
|
313 |
+
@unlink($database_file_dir . 'bmi_backup_manifest.json');
|
314 |
+
@unlink($database_file_dir . 'bmi_logs_this_backup.log');
|
315 |
+
|
316 |
+
$this->zip_progress->progress($max . '/' . $max);
|
317 |
+
}
|
318 |
+
}
|
319 |
+
|
320 |
+
@unlink($database_file);
|
321 |
+
if (!file_exists($this->new_file_path)) {
|
322 |
+
throw new \Exception('PHP-ZIP: After doing the zipping file can not be found');
|
323 |
+
}
|
324 |
+
if (filesize($this->new_file_path) === 0) {
|
325 |
+
throw new \Exception('PHP-ZIP: After doing the zipping file size is still 0 bytes');
|
326 |
+
}
|
327 |
+
|
328 |
+
// empty the array
|
329 |
+
$this->org_files = [];
|
330 |
+
|
331 |
+
return true;
|
332 |
+
}
|
333 |
+
|
334 |
+
public function zip_files($files, $to) {
|
335 |
+
$this->zip_start($to);
|
336 |
+
$this->zip_add($files);
|
337 |
+
|
338 |
+
return $this->zip_end();
|
339 |
+
}
|
340 |
+
|
341 |
+
public function unzip_file($file_path, $target_dir = null, &$zip_progress = null) {
|
342 |
+
|
343 |
+
// Progress
|
344 |
+
$this->zip_progress = $zip_progress;
|
345 |
+
|
346 |
+
// if it doesn't exist
|
347 |
+
if (!file_exists($file_path)) {
|
348 |
+
throw new \Exception("PHP-ZIP: File doesn't Exist");
|
349 |
+
}
|
350 |
+
|
351 |
+
// check mimetype
|
352 |
+
$_FILEINFO = finfo_open(FILEINFO_MIME_TYPE);
|
353 |
+
$file_mime_type = finfo_file($_FILEINFO, $file_path);
|
354 |
+
if (!array_search($file_mime_type, [
|
355 |
+
'application/x-zip',
|
356 |
+
'application/zip',
|
357 |
+
'application/x-zip-compressed',
|
358 |
+
'application/s-compressed',
|
359 |
+
'multipart/x-zip']
|
360 |
+
)) {
|
361 |
+
throw new \Exception("PHP-ZIP: File type is not ZIP");
|
362 |
+
}
|
363 |
+
|
364 |
+
|
365 |
+
$this->extr_file = $file_path;
|
366 |
+
|
367 |
+
// if (class_exists("ZipArchive")) $this->lib = 1;
|
368 |
+
// else $this->lib = 2;
|
369 |
+
$this->lib = 2;
|
370 |
+
|
371 |
+
if ($target_dir !== null) {
|
372 |
+
return $this->unzip_to($target_dir);
|
373 |
+
} else {
|
374 |
+
return true;
|
375 |
+
}
|
376 |
+
}
|
377 |
+
|
378 |
+
public function unzip_to($target_dir) {
|
379 |
+
|
380 |
+
// validations -- start //
|
381 |
+
if ($this->lib === 0 && $this->extr_file === 0) {
|
382 |
+
throw new \Exception("PHP-ZIP: unzip_file hasn't been called");
|
383 |
+
}
|
384 |
+
// it exists, but it's not a directory
|
385 |
+
if (file_exists($target_dir) && (!is_dir($target_dir))) {
|
386 |
+
throw new \Exception("PHP-ZIP: Target directory exists as a file not a directory");
|
387 |
+
}
|
388 |
+
// it doesn't exist
|
389 |
+
if (!file_exists($target_dir)) {
|
390 |
+
if (!mkdir($target_dir)) {
|
391 |
+
throw new \Exception("PHP-ZIP: Directory not found, and unable to create it");
|
392 |
+
}
|
393 |
+
}
|
394 |
+
// validations -- end //
|
395 |
+
|
396 |
+
// Target Directory
|
397 |
+
$this->extr_dirc = $target_dir;
|
398 |
+
|
399 |
+
// Smart memory -- start //
|
400 |
+
if ($this->zip_progress != null) {
|
401 |
+
$this->zip_progress->log(__("Smart memory calculation...", 'backup-migration'), 'STEP');
|
402 |
+
}
|
403 |
+
|
404 |
+
if ((intval($this->return_bytes(ini_get('memory_limit'))) / 1024 / 1024) < 256) {
|
405 |
+
@ini_set('memory_limit', '256M');
|
406 |
+
}
|
407 |
+
|
408 |
+
$memory_limit = (intval($this->return_bytes(ini_get('memory_limit'))) / 1024 / 1024);
|
409 |
+
if ($this->zip_progress != null) {
|
410 |
+
$this->zip_progress->log(str_replace('%s', $memory_limit, __("There is %s MBs of memory to use", 'backup-migration')), 'INFO');
|
411 |
+
}
|
412 |
+
|
413 |
+
$safe_limit = intval($memory_limit / 4);
|
414 |
+
|
415 |
+
if ($this->zip_progress != null) {
|
416 |
+
$this->zip_progress->log(str_replace('%s', $safe_limit, __("Setting the safe limit to %s MB", 'backup-migration')), 'SUCCESS');
|
417 |
+
}
|
418 |
+
// Smart memory -- end //
|
419 |
+
|
420 |
+
// Extract msg
|
421 |
+
$this->zip_progress->log(__('Extracting files (this process can take some time)...', 'backup_migration'), 'STEP');
|
422 |
+
|
423 |
+
// Force PCL Zip
|
424 |
+
$this->lib = 2;
|
425 |
+
|
426 |
+
// extract using ZipArchive
|
427 |
+
// if($this->lib === 1) {
|
428 |
+
// $lib = new \ZipArchive;
|
429 |
+
// if(!$lib->open($this->extr_file)) throw new \Exception("PHP-ZIP: Unable to open the zip file");
|
430 |
+
// if(!$lib->extractTo($this->extr_dirc)) throw new \Exception("PHP-ZIP: Unable to extract files");
|
431 |
+
// $lib->close();
|
432 |
+
// }
|
433 |
+
|
434 |
+
// extarct using PclZip
|
435 |
+
if ($this->lib === 2) {
|
436 |
+
if (!class_exists('PclZip')) {
|
437 |
+
if (!defined('PCLZIP_TEMPORARY_DIR')) {
|
438 |
+
$bmi_tmp_dir = BMI_ROOT_DIR . '/tmp';
|
439 |
+
if (!file_exists($bmi_tmp_dir)) {
|
440 |
+
@mkdir($bmi_tmp_dir, 0775, true);
|
441 |
+
}
|
442 |
+
define('PCLZIP_TEMPORARY_DIR', $bmi_tmp_dir . '/bmi-');
|
443 |
+
}
|
444 |
+
require_once trailingslashit(ABSPATH) . 'wp-admin/includes/class-pclzip.php';
|
445 |
+
}
|
446 |
+
$lib = new \PclZip($this->extr_file);
|
447 |
+
$restor = $lib->extract(PCLZIP_OPT_PATH, $this->extr_dirc, PCLZIP_OPT_TEMP_FILE_THRESHOLD, $safe_limit);
|
448 |
+
if ($restor == 0) {
|
449 |
+
$this->restore_failed($lib->errorInfo(true));
|
450 |
+
|
451 |
+
return false;
|
452 |
+
}
|
453 |
+
}
|
454 |
+
|
455 |
+
return true;
|
456 |
+
}
|
457 |
+
|
458 |
+
private function dir_to_assoc_arr(DirectoryIterator $dir) {
|
459 |
+
$data = [];
|
460 |
+
foreach ($dir as $node) {
|
461 |
+
if ($node->isDir() && !$node->isDot()) {
|
462 |
+
$data[$node->getFilename()] = $this->dir_to_assoc_arr(new DirectoryIterator($node->getPathname()));
|
463 |
+
} elseif ($node->isFile()) {
|
464 |
+
$data[] = $node->getFilename();
|
465 |
+
}
|
466 |
+
}
|
467 |
+
|
468 |
+
return $data;
|
469 |
+
}
|
470 |
+
|
471 |
+
private function path() {
|
472 |
+
return join(DIRECTORY_SEPARATOR, func_get_args());
|
473 |
+
}
|
474 |
+
|
475 |
+
private function commonPath($files, $remove = true) {
|
476 |
+
foreach ($files as $index => $filesStr) {
|
477 |
+
$files[$index] = explode(DIRECTORY_SEPARATOR, $filesStr);
|
478 |
+
}
|
479 |
+
$toDiff = $files;
|
480 |
+
foreach ($toDiff as $arr_i => $arr) {
|
481 |
+
foreach ($arr as $name_i => $name) {
|
482 |
+
$toDiff[$arr_i][$name_i] = $name . "___" . $name_i;
|
483 |
+
}
|
484 |
+
}
|
485 |
+
$diff = call_user_func_array("array_diff", $toDiff);
|
486 |
+
reset($diff);
|
487 |
+
$i = key($diff) - 1;
|
488 |
+
if ($remove) {
|
489 |
+
foreach ($files as $index => $arr) {
|
490 |
+
$files[$index] = implode(DIRECTORY_SEPARATOR, array_slice($files[$index], $i));
|
491 |
+
}
|
492 |
+
} else {
|
493 |
+
foreach ($files as $index => $arr) {
|
494 |
+
$files[$index] = implode(DIRECTORY_SEPARATOR, array_slice($files[$index], 0, $i));
|
495 |
+
}
|
496 |
+
}
|
497 |
+
|
498 |
+
return $files;
|
499 |
+
}
|
500 |
+
}
|
includes/zipper/zipping.php
ADDED
@@ -0,0 +1,209 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
// Namespace
|
4 |
+
namespace BMI\Plugin\Zipper;
|
5 |
+
|
6 |
+
// Use
|
7 |
+
use BMI\Plugin\Backup_Migration_Plugin as BMP;
|
8 |
+
use BMI\Plugin\BMI_Logger as Logger;
|
9 |
+
use BMI\Plugin\Progress\BMI_ZipProgress as Progress;
|
10 |
+
|
11 |
+
// Exit on direct access
|
12 |
+
if (!defined('ABSPATH')) {
|
13 |
+
exit;
|
14 |
+
}
|
15 |
+
|
16 |
+
/**
|
17 |
+
* BMI_Zipper
|
18 |
+
*/
|
19 |
+
class BMI_Zipper {
|
20 |
+
public function makeZIP($files, $output, $name, &$zip_progress) {
|
21 |
+
|
22 |
+
// Verbose
|
23 |
+
Logger::log(__("Creating backup ", 'backup-migration'));
|
24 |
+
Logger::log(__("Found ", 'backup-migration') . sizeof($files) . __(" files to backup.", 'backup-migration'));
|
25 |
+
|
26 |
+
// Require Universal Zip Library
|
27 |
+
require_once BMI_INCLUDES . '/zipper/src/zip.php';
|
28 |
+
|
29 |
+
// Start microtime for ZIP Process
|
30 |
+
$start = microtime(true);
|
31 |
+
|
32 |
+
// Logs
|
33 |
+
$zip_progress->log(__("Preparing map of files...", 'backup-migration'), 'step');
|
34 |
+
|
35 |
+
// Try to catch error
|
36 |
+
try {
|
37 |
+
|
38 |
+
// Create new ZIP
|
39 |
+
$zip = new Zip();
|
40 |
+
$zip->zip_start($output, $files, $name, $zip_progress, $start);
|
41 |
+
|
42 |
+
// Logs
|
43 |
+
$zip_progress->log(__("Files prepared.", 'backup-migration'), 'success');
|
44 |
+
$zip_progress->log(__("Starting compression process...", 'backup-migration'), 'info');
|
45 |
+
|
46 |
+
// Close ZIP and Save
|
47 |
+
$lala = $zip->zip_end(2);
|
48 |
+
if (!$lala) {
|
49 |
+
$zip_progress->log(__("Removing files backup...", 'backup-migration'), 'error');
|
50 |
+
|
51 |
+
return false;
|
52 |
+
}
|
53 |
+
|
54 |
+
return true;
|
55 |
+
} catch (\Throwable $e) {
|
56 |
+
|
57 |
+
// Error print
|
58 |
+
$zip_progress->log(__("Reverting backup, removing file...", 'backup-migration'), 'step');
|
59 |
+
$zip_progress->log(__("There was an error during backup...", 'backup-migration'), 'error');
|
60 |
+
$zip_progress->log($e->getMessage(), 'error');
|
61 |
+
|
62 |
+
return false;
|
63 |
+
} catch (\Exception $e) {
|
64 |
+
|
65 |
+
// Error print
|
66 |
+
$zip_progress->log(__("Reverting backup, removing file...", 'backup-migration'), 'step');
|
67 |
+
$zip_progress->log(__("There was an error during backup...", 'backup-migration'), 'error');
|
68 |
+
$zip_progress->log($e->getMessage(), 'error');
|
69 |
+
|
70 |
+
return false;
|
71 |
+
}
|
72 |
+
|
73 |
+
return true;
|
74 |
+
}
|
75 |
+
|
76 |
+
public function getZipFileContent($zipname, $filename) {
|
77 |
+
if (class_exists('ZipArchive')) {
|
78 |
+
$zip = new \ZipArchive();
|
79 |
+
|
80 |
+
if ($zip->open($zipname) === true) {
|
81 |
+
if ($content = $zip->getFromName($filename)) {
|
82 |
+
return json_decode($content);
|
83 |
+
} else {
|
84 |
+
return false;
|
85 |
+
}
|
86 |
+
} else {
|
87 |
+
return false;
|
88 |
+
}
|
89 |
+
} else {
|
90 |
+
if (!class_exists('PclZip')) {
|
91 |
+
if (!defined('PCLZIP_TEMPORARY_DIR')) {
|
92 |
+
$bmi_tmp_dir = BMI_ROOT_DIR . '/tmp';
|
93 |
+
if (!file_exists($bmi_tmp_dir)) {
|
94 |
+
@mkdir($bmi_tmp_dir, 0775, true);
|
95 |
+
}
|
96 |
+
define('PCLZIP_TEMPORARY_DIR', $bmi_tmp_dir . '/bmi-');
|
97 |
+
}
|
98 |
+
require_once trailingslashit(ABSPATH) . 'wp-admin/includes/class-pclzip.php';
|
99 |
+
}
|
100 |
+
$lib = new \PclZip($zipname);
|
101 |
+
|
102 |
+
$content = $lib->extract(PCLZIP_OPT_BY_NAME, $filename, PCLZIP_OPT_EXTRACT_AS_STRING);
|
103 |
+
if (sizeof($content) > 0) {
|
104 |
+
return json_decode($content[0]['content']);
|
105 |
+
} else {
|
106 |
+
return false;
|
107 |
+
}
|
108 |
+
}
|
109 |
+
}
|
110 |
+
|
111 |
+
public function getZipFileContentPlain($zipname, $filename) {
|
112 |
+
if (class_exists('ZipArchive')) {
|
113 |
+
$zip = new \ZipArchive();
|
114 |
+
|
115 |
+
if ($zip->open($zipname) === true) {
|
116 |
+
if ($content = $zip->getFromName($filename)) {
|
117 |
+
return $content;
|
118 |
+
} else {
|
119 |
+
return false;
|
120 |
+
}
|
121 |
+
} else {
|
122 |
+
return false;
|
123 |
+
}
|
124 |
+
} else {
|
125 |
+
if (!class_exists('PclZip')) {
|
126 |
+
if (!defined('PCLZIP_TEMPORARY_DIR')) {
|
127 |
+
$bmi_tmp_dir = BMI_ROOT_DIR . '/tmp';
|
128 |
+
if (!file_exists($bmi_tmp_dir)) {
|
129 |
+
@mkdir($bmi_tmp_dir, 0775, true);
|
130 |
+
}
|
131 |
+
define('PCLZIP_TEMPORARY_DIR', $bmi_tmp_dir . '/bmi-');
|
132 |
+
}
|
133 |
+
require_once trailingslashit(ABSPATH) . 'wp-admin/includes/class-pclzip.php';
|
134 |
+
}
|
135 |
+
$lib = new \PclZip($zipname);
|
136 |
+
|
137 |
+
$content = $lib->extract(PCLZIP_OPT_BY_NAME, $filename, PCLZIP_OPT_EXTRACT_AS_STRING);
|
138 |
+
if (sizeof($content) > 0) {
|
139 |
+
return $content[0]['content'];
|
140 |
+
} else {
|
141 |
+
return false;
|
142 |
+
}
|
143 |
+
}
|
144 |
+
}
|
145 |
+
|
146 |
+
public function lock_zip($zippath, $unlock = false) {
|
147 |
+
|
148 |
+
// Require Universal Zip Library
|
149 |
+
require_once BMI_INCLUDES . '/zipper/src/zip.php';
|
150 |
+
|
151 |
+
try {
|
152 |
+
|
153 |
+
// Path to lock file
|
154 |
+
$filename = '.lock';
|
155 |
+
|
156 |
+
// Load lib
|
157 |
+
if (!class_exists('PclZip')) {
|
158 |
+
if (!defined('PCLZIP_TEMPORARY_DIR')) {
|
159 |
+
$bmi_tmp_dir = BMI_ROOT_DIR . '/tmp';
|
160 |
+
if (!file_exists($bmi_tmp_dir)) {
|
161 |
+
@mkdir($bmi_tmp_dir, 0775, true);
|
162 |
+
}
|
163 |
+
define('PCLZIP_TEMPORARY_DIR', $bmi_tmp_dir . '/bmi-');
|
164 |
+
}
|
165 |
+
require_once trailingslashit(ABSPATH) . 'wp-admin/includes/class-pclzip.php';
|
166 |
+
}
|
167 |
+
$lib = new \PclZip($zippath);
|
168 |
+
|
169 |
+
// Unlocking case
|
170 |
+
if ($unlock) {
|
171 |
+
if ($this->is_locked_zip($zippath)) {
|
172 |
+
$lib->delete(PCLZIP_OPT_BY_NAME, $filename);
|
173 |
+
} else {
|
174 |
+
return true;
|
175 |
+
}
|
176 |
+
} else {
|
177 |
+
if (!$this->is_locked_zip($zippath)) {
|
178 |
+
|
179 |
+
// Locking case
|
180 |
+
$content = json_encode(['locked' => 'true']);
|
181 |
+
$lib->add([[PCLZIP_ATT_FILE_NAME => $filename, PCLZIP_ATT_FILE_CONTENT => $content]]);
|
182 |
+
}
|
183 |
+
}
|
184 |
+
|
185 |
+
return true;
|
186 |
+
} catch (\Exception $e) {
|
187 |
+
Logger::error($e);
|
188 |
+
|
189 |
+
return false;
|
190 |
+
} catch (\Throwable $e) {
|
191 |
+
Logger::error($e);
|
192 |
+
|
193 |
+
return false;
|
194 |
+
}
|
195 |
+
}
|
196 |
+
|
197 |
+
public function is_locked_zip($zippath) {
|
198 |
+
$lock = $this->getZipFileContent($zippath, '.lock');
|
199 |
+
if ($lock) {
|
200 |
+
if ($lock->locked == 'true') {
|
201 |
+
return true;
|
202 |
+
} else {
|
203 |
+
return false;
|
204 |
+
}
|
205 |
+
} else {
|
206 |
+
return false;
|
207 |
+
}
|
208 |
+
}
|
209 |
+
}
|
readme.txt
ADDED
@@ -0,0 +1,35 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
=== Backup Migration ===
|
2 |
+
Contributors: Migrate
|
3 |
+
Tags: Backup, Migration, Restore, Clone, Duplicate
|
4 |
+
Requires at least: 4.6
|
5 |
+
Tested up to: 5.5.3
|
6 |
+
Stable tag: 1.0.4
|
7 |
+
License: GPLv3
|
8 |
+
Requires PHP: 5.6
|
9 |
+
|
10 |
+
Create backups quickly
|
11 |
+
|
12 |
+
== Description ==
|
13 |
+
|
14 |
+
Creating a backup of your site has never been easier!
|
15 |
+
|
16 |
+
Simply install the plugin, click on "Create backup now" - done.
|
17 |
+
|
18 |
+
You can also schedule backups, e.g. define that a backup should be taken automatically every week (or every day/month).
|
19 |
+
|
20 |
+
Use a wide choice of configuration options:
|
21 |
+
- Define exactly which files / databases should be in the backup, which not
|
22 |
+
- Define where the backup will be stored (as of now, only local option is available, but we'll expand this soon)
|
23 |
+
- Define what name your backup should have, in which instances you should receive a notification email, and much more
|
24 |
+
|
25 |
+
This plugin is also ideal if you want to migrate your site to another host.
|
26 |
+
|
27 |
+
If any questions come up, please ask us in the [Support Forum](https://wordpress.org/support/plugin/backup-backup) - we're always happy to help!
|
28 |
+
|
29 |
+
= 1.0.4 =
|
30 |
+
* Initial release
|
31 |
+
|
32 |
+
== Upgrade Notice ==
|
33 |
+
|
34 |
+
= 1.0.4 =
|
35 |
+
Initial release
|
uninstall.php
ADDED
@@ -0,0 +1,65 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
// Namespace
|
4 |
+
namespace BMI\Plugin\Uninstaller;
|
5 |
+
|
6 |
+
// Exit on direct access
|
7 |
+
if (!defined('ABSPATH')) exit;
|
8 |
+
|
9 |
+
// Get config
|
10 |
+
$dir = WP_CONTENT_DIR . DIRECTORY_SEPARATOR . 'backup-migration' . DIRECTORY_SEPARATOR;
|
11 |
+
$config = $dir . 'config.json';
|
12 |
+
if (file_exists($config)) {
|
13 |
+
$config = json_decode(file_get_contents($config));
|
14 |
+
if (json_last_error() == JSON_ERROR_NONE) {
|
15 |
+
|
16 |
+
if (isset($config->{'OTHER:UNINSTALL:BACKUPS'})) {
|
17 |
+
if ($config->{'OTHER:UNINSTALL:BACKUPS'} === 'true' || $config->{'OTHER:UNINSTALL:BACKUPS'} === true) {
|
18 |
+
if (isset($config->{'STORAGE::LOCAL::PATH'})) {
|
19 |
+
if ($config->{'STORAGE::LOCAL::PATH'} == 'default') {
|
20 |
+
$backups = WP_CONTENT_DIR . DIRECTORY_SEPARATOR . 'backup-migration' . DIRECTORY_SEPARATOR . 'backups';
|
21 |
+
} else {
|
22 |
+
$backups = $config->{'STORAGE::LOCAL::PATH'} . DIRECTORY_SEPARATOR . 'backups';
|
23 |
+
}
|
24 |
+
|
25 |
+
if (file_exists($backups) && is_dir($backups)) {
|
26 |
+
|
27 |
+
$files = scandir($backups);
|
28 |
+
for ($i = 0; $i < sizeof($files); ++$i) {
|
29 |
+
|
30 |
+
$file = $backups . DIRECTORY_SEPARATOR . $files[$i];
|
31 |
+
if (is_file($file) && !in_array($files[$i], ['.', '..'])) {
|
32 |
+
@unlink($file);
|
33 |
+
}
|
34 |
+
|
35 |
+
}
|
36 |
+
|
37 |
+
$files = scandir($backups);
|
38 |
+
if (sizeof($files) <= 2) rmdir($backups);
|
39 |
+
|
40 |
+
}
|
41 |
+
}
|
42 |
+
}
|
43 |
+
}
|
44 |
+
|
45 |
+
if (isset($config->{'OTHER:UNINSTALL:CONFIGS'})) {
|
46 |
+
if ($config->{'OTHER:UNINSTALL:CONFIGS'} === 'true' || $config->{'OTHER:UNINSTALL:CONFIGS'} === true) {
|
47 |
+
|
48 |
+
$files = scandir($dir);
|
49 |
+
for ($i = 0; $i < sizeof($files); ++$i) {
|
50 |
+
|
51 |
+
$file = $dir . DIRECTORY_SEPARATOR . $files[$i];
|
52 |
+
if (is_file($file) && !in_array($files[$i], ['.', '..'])) {
|
53 |
+
@unlink($file);
|
54 |
+
}
|
55 |
+
|
56 |
+
}
|
57 |
+
|
58 |
+
$files = scandir($dir);
|
59 |
+
if (sizeof($files) <= 2) rmdir($dir);
|
60 |
+
|
61 |
+
}
|
62 |
+
}
|
63 |
+
|
64 |
+
}
|
65 |
+
}
|