Esempio n. 1
0
 def on_init(self):
     self.manager = Manager(self.app)
     self.providers = self.app.grab_plugins(IConfigurable)
     self.providers = sorted(self.providers, key=lambda x: x.name)
     if not self._current:
         self._current = self.providers[0].id
         self._current_name = self.providers[0].name
Esempio n. 2
0
 def send_upload(self, req, start_response):
     self.manager = Manager(self.app)
     vars = get_environment_vars(req)
     f = vars.getvalue('file', None)
     try:
         self.manager.upload(f)
         self.put_message('info', 'Upload successful.')
     except:
         self.put_message('err', 'Failed to upload. Make sure the plugin is installed.')
     self._uploader = None
     start_response('200 OK', [('Refresh', '0; URL=/')])
     return ''
Esempio n. 3
0
 def get_backups(self, req, start_response):
     data = Manager(self.app).get_backups()
     start_response('200 OK', [
         ('Content-type', 'application/gzip'),
         ('Content-length', str(data[0])),
         ('Content-Disposition', 'attachment; filename=backup-all.tar.gz')
     ])
     return data[1]
Esempio n. 4
0
class RecoveryPlugin(CategoryPlugin, URLHandler):
    text = 'Recovery'
    iconfont = 'gen-history'
    folder = None

    def on_init(self):
        self.manager = Manager(self.app)
        self.providers = self.app.grab_plugins(IConfigurable)
        self.providers = sorted(self.providers, key=lambda x: x.name)
        if not self._current:
            self._current = self.providers[0].id
            self._current_name = self.providers[0].name

    def on_session_start(self):
        self._uploader = None

    def get_ui(self):
        ui = self.app.inflate('recovery:main')

        provs = ui.find('provs')

        for p in self.providers:
            provs.append(
                    UI.ListItem(
                        UI.Label(text=p.name),
                        id=p.id,
                        active=p.id==self._current
                    )
                  )

        backs = ui.find('backs')

        for rev in self.manager.list_backups(self._current):
            backs.append(
                UI.DTR(
                    UI.Label(text=rev.revision),
                    UI.Label(text=rev.date),
                    UI.DTC(
                        UI.HContainer(
                            UI.TipIcon(
                                text='Recover',
                                iconfont="gen-folder-upload",
                                id='restore/%s/%s'%(self._current,rev.revision),
                                warning='Are you sure you wish to restore the configuration of %s as of %s (rev %s)?'%(
                                        self._current,
                                        rev.date,
                                        rev.revision
                                    )
                            ),
                            UI.TipIcon(
                                text='Download',
                                iconfont="gen-download",
                                onclick="window.open('/recovery/single/%s/%s', '_blank')" % (self._current,rev.revision),
                                id='download'
                            ),
                            UI.TipIcon(
                                text='Drop',
                                iconfont='gen-folder-minus',
                                id='drop/%s/%s'%(self._current,rev.revision),
                                warning='Are you sure you wish to delete the backed up configuration of %s as of %s (rev %s)?'%(
                                        self._current,
                                        rev.date,
                                        rev.revision
                                    )
                            ),
                            spacing=0
                        ),
                        width=0,
                    )
                )
            )

        ui.find('btnBackup').set('text', 'Backup %s'%self._current_name)
        ui.find('btnBackup').set('id', 'backup/%s'%self._current)

        if self._uploader:
            ui.append('main', UI.UploadBox(id='dlgUpload',
                text="Select archive to upload",
                multiple=False))

        return ui

    @url('^/recovery/single/.*$')
    def get_backup(self, req, start_response):
        params = req['PATH_INFO'].split('/')[3:] + ['']
        filename = '/var/backups/genesis/' + params[0] + '/' + params[1] + '.tar.gz'
        f = open(filename, 'rb')
        size = os.path.getsize(filename)

        start_response('200 OK', [
            ('Content-type', 'application/gzip'),
            ('Content-length', str(size)),
            ('Content-Disposition', 'attachment; filename=' + params[0] + '-' + params[1] + '.tar.gz')
        ])
        return f.read()

    @url('^/recovery/all$')
    def get_backups(self, req, start_response):
        data = Manager(self.app).get_backups()
        start_response('200 OK', [
            ('Content-type', 'application/gzip'),
            ('Content-length', str(data[0])),
            ('Content-Disposition', 'attachment; filename=backup-all.tar.gz')
        ])
        return data[1]

    @event('button/click')
    def on_click(self, event, params, vars=None):
        if params[0] == 'backup':
            p = self.manager.find_provider(params[1])
            try:
                self.manager.backup(p)
                self.put_message('info', 'Stored backup for %s.' % p.name)
            except:
                self.put_message('err', 'Failed to backup %s.' % p.name)
        if params[0] == 'backupall':
            errs = self.manager.backup_all()
            if errs != []:
                self.put_message('err', 'Backup failed for %s.' % ', '.join(errs))
            else:
                self.put_message('info', 'Stored full backup')
        if params[0] == 'restore':
            p = self.manager.find_provider(params[1])
            try:
                self.manager.restore(p, params[2])
                self.put_message('info', 'Restored configuration of %s (rev %s).' % (p.name, params[2]))
            except:
                self.put_message('err', 'Failed to recover %s.' % p.name)
        if params[0] == 'drop':
            try:
                self.manager.delete_backup(params[1], params[2])
                self.put_message('info', 'Deleted backup rev %s for %s.' % (params[2], params[1]))
            except:
                self.put_message('err', 'Failed to delete backup rev %s for %s.' % (params[2], params[1]))
        if params[0] == 'upload':
            self._uploader = True

    @event('listitem/click')
    def on_list_click(self, event, params, vars=None):
        for p in self.providers:
            if p.id == params[0]:
                self._current = p.id
                self._current_name = p.name

    @event('form/submit')
    @event('dialog/submit')
    def on_submit(self, event, params, vars=None):
        if params[0] == 'dlgUpload':
            if vars.getvalue('action', '') == 'OK' and vars.has_key('file'):
                f = vars['file']
                try:
                    self.manager.upload(f)
                    self.put_message('info', 'Upload successful.')
                except Exception, e:
                    self.put_message('err', 'Failed to upload backup: %s' % str(e))
        self._uploader = None
Esempio n. 5
0
class RecoveryPlugin(CategoryPlugin, URLHandler):
    text = 'Recovery'
    iconfont = 'gen-history'
    folder = None

    def on_init(self):
        self.manager = Manager(self.app)
        self.providers = self.app.grab_plugins(IConfigurable)
        self.providers = sorted(self.providers, key=lambda x: x.name)
        if not self._current:
            self._current = self.providers[0].id
            self._current_name = self.providers[0].name

    def on_session_start(self):
        self._uploader = None

    def get_ui(self):
        ui = self.app.inflate('recovery:main')

        provs = ui.find('provs')

        for p in self.providers:
            provs.append(
                UI.ListItem(UI.Label(text=p.name),
                            id=p.id,
                            active=p.id == self._current))

        backs = ui.find('backs')

        for rev in self.manager.list_backups(self._current):
            backs.append(
                UI.DTR(
                    UI.Label(text=rev.revision), UI.Label(text=rev.date),
                    UI.DTC(
                        UI.HContainer(
                            UI.TipIcon(
                                text='Recover',
                                iconfont="gen-folder-upload",
                                id='restore/%s/%s' %
                                (self._current, rev.revision),
                                warning=
                                'Restore configuration of %s as of %s (rev %s)'
                                % (self._current, rev.date, rev.revision)),
                            UI.TipIcon(
                                text='Download',
                                iconfont="gen-download",
                                onclick=
                                "window.open('/recovery/single/%s/%s', '_blank')"
                                % (self._current, rev.revision),
                                id='download'),
                            UI.TipIcon(
                                text='Drop',
                                iconfont='gen-folder-minus',
                                id='drop/%s/%s' %
                                (self._current, rev.revision),
                                warning=
                                'Delete backed up configuration of %s as of %s (rev %s)'
                                % (self._current, rev.date, rev.revision)),
                            spacing=0),
                        width=0,
                    )))

        ui.find('btnBackup').set('text', 'Backup %s' % self._current_name)
        ui.find('btnBackup').set('id', 'backup/%s' % self._current)

        if self._uploader:
            pass
        else:
            ui.remove('dlgUpload')

        return ui

    @url('^/recovery/single/.*$')
    def get_backup(self, req, start_response):
        params = req['PATH_INFO'].split('/')[3:] + ['']
        filename = '/var/backups/genesis/' + params[0] + '/' + params[
            1] + '.tar.gz'
        f = open(filename, 'rb')
        size = path.getsize(filename)

        start_response('200 OK',
                       [('Content-type', 'application/gzip'),
                        ('Content-length', str(size)),
                        ('Content-Disposition', 'attachment; filename=' +
                         params[0] + '-' + params[1] + '.tar.gz')])
        return f.read()

    @url('^/recovery/all$')
    def get_backups(self, req, start_response):
        dir = mkdtemp()
        temparch = path.join(dir, 'backup-all.tar.gz')
        shell('tar czf ' + temparch + ' -C /var/backups/ genesis')
        size = path.getsize(temparch)

        f = open(temparch, 'rb')
        arch = f.read()
        f.close()
        shell('rm -r ' + dir)

        start_response('200 OK', [
            ('Content-type', 'application/gzip'),
            ('Content-length', str(size)),
            ('Content-Disposition', 'attachment; filename=backup-all.tar.gz')
        ])
        return arch

    @url('^/recovery/upload$')
    def send_upload(self, req, start_response):
        self.manager = Manager(self.app)
        vars = get_environment_vars(req)
        f = vars.getvalue('file', None)
        try:
            self.manager.upload(f)
            self.put_message('info', 'Upload successful.')
        except:
            self.put_message(
                'err', 'Failed to upload. Make sure the plugin is installed.')
        self._uploader = None
        start_response('200 OK', [('Refresh', '0; URL=/')])
        return ''

    @event('button/click')
    def on_click(self, event, params, vars=None):
        if params[0] == 'backup':
            p = self.manager.find_provider(params[1])
            try:
                self.manager.backup(p)
                self.put_message('info', 'Stored backup for %s.' % p.name)
            except:
                self.put_message('err', 'Failed to backup %s.' % p.name)
        if params[0] == 'backupall':
            errs = self.manager.backup_all()
            if errs != []:
                self.put_message('err',
                                 'Backup failed for %s.' % ', '.join(errs))
            else:
                self.put_message('info', 'Stored full backup')
        if params[0] == 'restore':
            p = self.manager.find_provider(params[1])
            try:
                self.manager.restore(p, params[2])
                self.put_message(
                    'info', 'Restored configuration of %s (rev %s).' %
                    (p.name, params[2]))
            except:
                self.put_message('err', 'Failed to recover %s.' % p.name)
        if params[0] == 'drop':
            try:
                self.manager.delete_backup(params[1], params[2])
                self.put_message(
                    'info',
                    'Deleted backup rev %s for %s.' % (params[2], params[1]))
            except:
                self.put_message(
                    'err', 'Failed to delete backup rev %s for %s.' %
                    (params[2], params[1]))
        if params[0] == 'upload':
            self._uploader = True

    @event('listitem/click')
    def on_list_click(self, event, params, vars=None):
        for p in self.providers:
            if p.id == params[0]:
                self._current = p.id
                self._current_name = p.name
Esempio n. 6
0
class RecoveryPlugin(CategoryPlugin):
    text = 'Recovery'
    icon = '/dl/recovery/icon_small.png'
    folder = 'bottom'

    def on_init(self):
        self.manager = Manager(self.app)
        self.providers = self.app.grab_plugins(IRecoveryProvider)
        self.providers = sorted(self.providers, key=lambda x: x.name)
        if not self._current:
            self._current = self.providers[0].id
            self._current_name = self.providers[0].name

    def on_session_start(self):
        self._err = None
        self._err_text = None

    def get_ui(self):
        u = UI.PluginPanel(UI.Label(text='%i providers available' %
                                    len(self.providers)),
                           self.get_default_ui(),
                           title='Configuration recovery',
                           icon='/dl/recovery/icon.png')
        return u

    def get_default_ui(self):
        provs = UI.List(width=200, height=400)

        for p in self.providers:
            provs.append(
                UI.ListItem(UI.Label(text=p.name),
                            id=p.id,
                            active=p.id == self._current))

        backs = UI.DataTable(UI.DataTableRow(UI.Label(text='Revision'),
                                             UI.Label(text='Date'),
                                             UI.Label(),
                                             header=True),
                             width='100%',
                             noborder=True)

        for rev in self.manager.list_backups(self._current):
            backs.append(
                UI.DataTableRow(
                    UI.Label(text=rev.revision), UI.Label(text=rev.date),
                    UI.DataTableCell(UI.HContainer(
                        UI.WarningMiniButton(
                            text='Recover',
                            id='restore/%s/%s' % (self._current, rev.revision),
                            msg='Restore configuration of %s as of %s (rev %s)'
                            % (self._current_name, rev.date, rev.revision)),
                        UI.WarningMiniButton(
                            text='Drop',
                            id='drop/%s/%s' % (self._current, rev.revision),
                            msg=
                            'Delete backed up configuration of %s as of %s (rev %s)'
                            % (self._current_name, rev.date, rev.revision)),
                        spacing=0),
                                     width=0,
                                     hidden=True)))

        ui = UI.LayoutTable(
            UI.LayoutTableRow(
                UI.Label(text='Recovery providers'),
                UI.Label(text='Backups for %s' % self._current_name),
                UI.LayoutTableCell(UI.HContainer(
                    UI.WarningMiniButton(id='backup/%s' % self._current,
                                         text='Backup now',
                                         msg='Backup configuration of %s' %
                                         self._current_name),
                    UI.WarningMiniButton(
                        id='backupall',
                        text='Backup everything',
                        msg='Backup all available configurations')),
                                   width=100)),
            UI.LayoutTableRow(
                provs,
                UI.LayoutTableCell(UI.ScrollContainer(backs,
                                                      width=400,
                                                      height=400),
                                   colspan=2)))

        if self._err is not None:
            ui = UI.VContainer(
                UI.ErrorBox(title=self._err, text=self._err_text), ui)
            self._err = None
        return ui

    @event('button/click')
    @event('minibutton/click')
    def on_click(self, event, params, vars=None):
        if params[0] == 'backup':
            p = self.manager.find_provider(params[1])
            try:
                self.manager.backup_now(p)
                self._err = 'Backup complete'
                self._err_text = 'Stored backup for %s.' % p.name
            except:
                self._err = 'Backup failed'
                self._err_text = 'Failed to backup %s.' % p.name
        if params[0] == 'backupall':
            errs = self.manager.backup_all_now()
            if errs != []:
                self._err = 'Full backup failed'
                self._err_text = 'Backup failed for %s.' % ', '.join(errs)
            else:
                self._err = 'Full backup complete'
                self._err_text = 'No errors encountered.'
        if params[0] == 'restore':
            p = self.manager.find_provider(params[1])
            try:
                self.manager.restore_now(p, params[2])
                self._err = 'Recovery complete'
                self._err_text = 'Restored configuration of %s (rev %s).' % (
                    p.name, params[2])
            except:
                self._err = 'Recovery failed'
                self._err_text = 'Failed to recover %s.' % p.name
        if params[0] == 'drop':
            try:
                self.manager.delete_backup(params[1], params[2])
                self._err = 'Backup dropped'
                self._err_text = 'Deleted backup rev %s for %s.' % (params[2],
                                                                    params[1])
            except:
                self._err = 'Deletion failed'
                self._err_text = 'Failed to delete backup rev %s for %s.' % (
                    params[2], params[1])

    @event('listitem/click')
    def on_list_click(self, event, params, vars=None):
        for p in self.providers:
            if p.id == params[0]:
                self._current = p.id
                self._current_name = p.name
Esempio n. 7
0
class RecoveryPlugin(CategoryPlugin):
    text = 'Recovery'
    icon = '/dl/recovery/icon_small.png'
    folder = 'bottom'

    def on_init(self):
        self.manager = Manager(self.app)
        self.providers = self.app.grab_plugins(IRecoveryProvider)
        self.providers = sorted(self.providers, key=lambda x: x.name)
        if not self._current:
            self._current = self.providers[0].id
            self._current_name = self.providers[0].name
        
    def on_session_start(self):
        self._err = None
        self._err_text = None
        
    def get_ui(self):
        u = UI.PluginPanel(
                UI.Label(text='%i providers available' % len(self.providers)),
                self.get_default_ui(), 
                title='Configuration recovery', 
                icon='/dl/recovery/icon.png'
            )
        return u


    def get_default_ui(self):
        provs = UI.List(width=200, height=400)
                
        for p in self.providers:
            provs.append(
                    UI.ListItem(
                        UI.Label(text=p.name), 
                        id=p.id,
                        active=p.id==self._current
                    )
                  )
            
        backs = UI.DataTable(
                    UI.DataTableRow(
                        UI.Label(text='Revision'),
                        UI.Label(text='Date'),
                        UI.Label(),
                        header=True
                    ),
                    width='100%',
                    noborder=True
                )
                
        for rev in self.manager.list_backups(self._current):
            backs.append(
                UI.DataTableRow(
                    UI.Label(text=rev.revision),
                    UI.Label(text=rev.date),
                    UI.DataTableCell(
                        UI.HContainer(
                            UI.WarningMiniButton(
                                text='Recover',
                                id='restore/%s/%s'%(self._current,rev.revision),
                                msg='Restore configuration of %s as of %s (rev %s)'%(
                                        self._current_name,
                                        rev.date,
                                        rev.revision
                                    )
                            ),
                            UI.WarningMiniButton(
                                text='Drop',
                                id='drop/%s/%s'%(self._current,rev.revision),
                                msg='Delete backed up configuration of %s as of %s (rev %s)'%(
                                        self._current_name,
                                        rev.date,
                                        rev.revision
                                    )
                            ),
                            spacing=0
                        ),
                        width=0,
                        hidden=True
                    )
                )
            )       
                
        ui = UI.LayoutTable(
                   UI.LayoutTableRow(
                       UI.Label(text='Recovery providers'),
                       UI.Label(text='Backups for %s' % self._current_name),
                       UI.LayoutTableCell(
                           UI.HContainer(
                               UI.WarningMiniButton(
                                   id='backup/%s'%self._current,
                                   text='Backup now',
                                   msg='Backup configuration of %s'%self._current_name
                               ),
                               UI.WarningMiniButton(
                                   id='backupall',
                                   text='Backup everything',
                                   msg='Backup all available configurations'
                               )
                           ),
                           width=100
                       )
                   ),                    
                   UI.LayoutTableRow(
                       provs, 
                       UI.LayoutTableCell(
                           UI.ScrollContainer(
                               backs,
                               width=400,
                               height=400
                           ),
                           colspan=2
                       )
                   )
               )
               
        if self._err is not None:
            ui = UI.VContainer(UI.ErrorBox(title=self._err, text=self._err_text), ui)
            self._err = None
        return ui
                
    @event('button/click')
    @event('minibutton/click')
    def on_click(self, event, params, vars=None):
        if params[0] == 'backup':
            p = self.manager.find_provider(params[1])
            try:
                self.manager.backup_now(p)
                self._err = 'Backup complete'
                self._err_text = 'Stored backup for %s.' % p.name
            except:
                self._err = 'Backup failed'
                self._err_text = 'Failed to backup %s.' % p.name
        if params[0] == 'backupall':
            errs = self.manager.backup_all_now()
            if errs != []:
                self._err = 'Full backup failed'
                self._err_text = 'Backup failed for %s.' % ', '.join(errs)
            else:
                self._err = 'Full backup complete'
                self._err_text = 'No errors encountered.'
        if params[0] == 'restore':
            p = self.manager.find_provider(params[1])
            try:
                self.manager.restore_now(p, params[2])
                self._err = 'Recovery complete'
                self._err_text = 'Restored configuration of %s (rev %s).' % (p.name, params[2])
            except:
                self._err = 'Recovery failed'
                self._err_text = 'Failed to recover %s.' % p.name
        if params[0] == 'drop':
            try:
                self.manager.delete_backup(params[1], params[2])
                self._err = 'Backup dropped'
                self._err_text = 'Deleted backup rev %s for %s.' % (params[2], params[1])
            except:
                self._err = 'Deletion failed'
                self._err_text = 'Failed to delete backup rev %s for %s.' % (params[2], params[1])
                        
    @event('listitem/click')
    def on_list_click(self, event, params, vars=None):
        for p in self.providers:
            if p.id == params[0]:
                self._current = p.id
                self._current_name = p.name
Esempio n. 8
0
class RecoveryPlugin(CategoryPlugin):
    text = 'Recuperação'
    icon = '/dl/recovery/icon.png'
    folder = 'bottom'

    def on_init(self):
        self.manager = Manager(self.app)
        self.providers = self.app.grab_plugins(IConfigurable)
        self.providers = sorted(self.providers, key=lambda x: x.name)
        if not self._current:
            self._current = self.providers[0].id
            self._current_name = self.providers[0].name

    def get_ui(self):
        ui = self.app.inflate('recovery:main')

        provs = ui.find('provs')

        for p in self.providers:
            provs.append(
                    UI.ListItem(
                        UI.Label(text=p.name),
                        id=p.id,
                        active=p.id==self._current
                    )
                  )

        backs = ui.find('backs')

        for rev in self.manager.list_backups(self._current):
            backs.append(
                UI.DTR(
                    UI.Label(text=rev.revision),
                    UI.Label(text=rev.date),
                    UI.DTC(
                        UI.HContainer(
                            UI.TipIcon(
                                text='Recuperar',
                                icon='/dl/recovery/rev-restore.png',
                                id='restore/%s/%s'%(self._current,rev.revision),
                                warning='Restore configuration of %s as of %s (rev %s)'%(
                                        self._current,
                                        rev.date,
                                        rev.revision
                                    )
                            ),
                            UI.TipIcon(
                                text='Drop',
                                icon='/dl/recovery/rev-delete.png',
                                id='drop/%s/%s'%(self._current,rev.revision),
                                warning='Delete backed up configuration of %s as of %s (rev %s)'%(
                                        self._current,
                                        rev.date,
                                        rev.revision
                                    )
                            ),
                            spacing=0
                        ),
                        width=0,
                    )
                )
            )

        ui.find('btnBackup').set('text', 'Backup %s'%self._current_name)
        ui.find('btnBackup').set('id', 'backup/%s'%self._current)
        return ui

    @event('button/click')
    def on_click(self, event, params, vars=None):
        if params[0] == 'backup':
            p = self.manager.find_provider(params[1])
            try:
                self.manager.backup(p)
                self.put_message('info', 'Stored backup for %s.' % p.name)
            except:
                self.put_message('err', 'Failed to backup %s.' % p.name)
        if params[0] == 'backupall':
            errs = self.manager.backup_all()
            if errs != []:
                self.put_message('err', 'Backup failed for %s.' % ', '.join(errs))
            else:
                self.put_message('info', 'Stored full backup')
        if params[0] == 'restore':
            p = self.manager.find_provider(params[1])
            try:
                self.manager.restore(p, params[2])
                self.put_message('info', 'Restored configuration of %s (rev %s).' % (p.name, params[2]))
            except:
                self.put_message('err', 'Failed to recover %s.' % p.name)
        if params[0] == 'drop':
            try:
                self.manager.delete_backup(params[1], params[2])
                self.put_message('info', 'Deleted backup rev %s for %s.' % (params[2], params[1]))
            except:
                self.put_message('err', 'Failed to delete backup rev %s for %s.' % (params[2], params[1]))

    @event('listitem/click')
    def on_list_click(self, event, params, vars=None):
        for p in self.providers:
            if p.id == params[0]:
                self._current = p.id
                self._current_name = p.name
Esempio n. 9
0
class RecoveryPlugin(CategoryPlugin, URLHandler):
    text = 'Recovery'
    iconfont = 'gen-history'
    folder = None

    def on_init(self):
        self.manager = Manager(self.app)
        self.providers = self.app.grab_plugins(IConfigurable)
        self.providers = sorted(self.providers, key=lambda x: x.name)
        if not self._current:
            self._current = self.providers[0].id
            self._current_name = self.providers[0].name

    def on_session_start(self):
        self._uploader = None

    def get_ui(self):
        ui = self.app.inflate('recovery:main')

        provs = ui.find('provs')

        for p in self.providers:
            provs.append(
                    UI.ListItem(
                        UI.Label(text=p.name),
                        id=p.id,
                        active=p.id==self._current
                    )
                  )

        backs = ui.find('backs')

        for rev in self.manager.list_backups(self._current):
            backs.append(
                UI.DTR(
                    UI.Label(text=rev.revision),
                    UI.Label(text=rev.date),
                    UI.DTC(
                        UI.HContainer(
                            UI.TipIcon(
                                text='Recover',
                                iconfont="gen-folder-upload",
                                id='restore/%s/%s'%(self._current,rev.revision),
                                warning='Restore configuration of %s as of %s (rev %s)'%(
                                        self._current,
                                        rev.date,
                                        rev.revision
                                    )
                            ),
                            UI.TipIcon(
                                text='Download',
                                iconfont="gen-download",
                                onclick="window.open('/recovery/single/%s/%s', '_blank')" % (self._current,rev.revision),
                                id='download'
                            ),
                            UI.TipIcon(
                                text='Drop',
                                iconfont='gen-folder-minus',
                                id='drop/%s/%s'%(self._current,rev.revision),
                                warning='Delete backed up configuration of %s as of %s (rev %s)'%(
                                        self._current,
                                        rev.date,
                                        rev.revision
                                    )
                            ),
                            spacing=0
                        ),
                        width=0,
                    )
                )
            )

        ui.find('btnBackup').set('text', 'Backup %s'%self._current_name)
        ui.find('btnBackup').set('id', 'backup/%s'%self._current)

        if self._uploader:
            pass
        else:
            ui.remove('dlgUpload')

        return ui

    @url('^/recovery/single/.*$')
    def get_backup(self, req, start_response):
        params = req['PATH_INFO'].split('/')[3:] + ['']
        filename = '/var/backups/genesis/' + params[0] + '/' + params[1] + '.tar.gz'
        f = open(filename, 'rb')
        size = path.getsize(filename)

        start_response('200 OK', [
            ('Content-type', 'application/gzip'),
            ('Content-length', str(size)),
            ('Content-Disposition', 'attachment; filename=' + params[0] + '-' + params[1] + '.tar.gz')
        ])
        return f.read()

    @url('^/recovery/all$')
    def get_backups(self, req, start_response):
        dir = mkdtemp()
        temparch = path.join(dir, 'backup-all.tar.gz')
        shell('tar czf ' + temparch + ' -C /var/backups/ genesis')
        size = path.getsize(temparch)

        f = open(temparch, 'rb')
        arch = f.read()
        f.close()
        shell('rm -r ' + dir)

        start_response('200 OK', [
            ('Content-type', 'application/gzip'),
            ('Content-length', str(size)),
            ('Content-Disposition', 'attachment; filename=backup-all.tar.gz')
        ])
        return arch

    @url('^/recovery/upload$')
    def send_upload(self, req, start_response):
        self.manager = Manager(self.app)
        vars = get_environment_vars(req)
        f = vars.getvalue('file', None)
        try:
            self.manager.upload(f)
            self.put_message('info', 'Upload successful.')
        except:
            self.put_message('err', 'Failed to upload. Make sure the plugin is installed.')
        self._uploader = None
        start_response('200 OK', [('Refresh', '0; URL=/')])
        return ''

    @event('button/click')
    def on_click(self, event, params, vars=None):
        if params[0] == 'backup':
            p = self.manager.find_provider(params[1])
            try:
                self.manager.backup(p)
                self.put_message('info', 'Stored backup for %s.' % p.name)
            except:
                self.put_message('err', 'Failed to backup %s.' % p.name)
        if params[0] == 'backupall':
            errs = self.manager.backup_all()
            if errs != []:
                self.put_message('err', 'Backup failed for %s.' % ', '.join(errs))
            else:
                self.put_message('info', 'Stored full backup')
        if params[0] == 'restore':
            p = self.manager.find_provider(params[1])
            try:
                self.manager.restore(p, params[2])
                self.put_message('info', 'Restored configuration of %s (rev %s).' % (p.name, params[2]))
            except:
                self.put_message('err', 'Failed to recover %s.' % p.name)
        if params[0] == 'drop':
            try:
                self.manager.delete_backup(params[1], params[2])
                self.put_message('info', 'Deleted backup rev %s for %s.' % (params[2], params[1]))
            except:
                self.put_message('err', 'Failed to delete backup rev %s for %s.' % (params[2], params[1]))
        if params[0] == 'upload':
            self._uploader = True

    @event('listitem/click')
    def on_list_click(self, event, params, vars=None):
        for p in self.providers:
            if p.id == params[0]:
                self._current = p.id
                self._current_name = p.name
Esempio n. 10
0
class RecoveryPlugin(CategoryPlugin):
    text = 'Recuperação'
    icon = '/dl/recovery/icon.png'
    folder = 'bottom'

    def on_init(self):
        self.manager = Manager(self.app)
        self.providers = self.app.grab_plugins(IConfigurable)
        self.providers = sorted(self.providers, key=lambda x: x.name)
        if not self._current:
            self._current = self.providers[0].id
            self._current_name = self.providers[0].name

    def get_ui(self):
        ui = self.app.inflate('recovery:main')

        provs = ui.find('provs')

        for p in self.providers:
            provs.append(
                UI.ListItem(UI.Label(text=p.name),
                            id=p.id,
                            active=p.id == self._current))

        backs = ui.find('backs')

        for rev in self.manager.list_backups(self._current):
            backs.append(
                UI.DTR(
                    UI.Label(text=rev.revision), UI.Label(text=rev.date),
                    UI.DTC(
                        UI.HContainer(
                            UI.TipIcon(
                                text='Recuperar',
                                icon='/dl/recovery/rev-restore.png',
                                id='restore/%s/%s' %
                                (self._current, rev.revision),
                                warning=
                                'Restore configuration of %s as of %s (rev %s)'
                                % (self._current, rev.date, rev.revision)),
                            UI.TipIcon(
                                text='Drop',
                                icon='/dl/recovery/rev-delete.png',
                                id='drop/%s/%s' %
                                (self._current, rev.revision),
                                warning=
                                'Delete backed up configuration of %s as of %s (rev %s)'
                                % (self._current, rev.date, rev.revision)),
                            spacing=0),
                        width=0,
                    )))

        ui.find('btnBackup').set('text', 'Backup %s' % self._current_name)
        ui.find('btnBackup').set('id', 'backup/%s' % self._current)
        return ui

    @event('button/click')
    def on_click(self, event, params, vars=None):
        if params[0] == 'backup':
            p = self.manager.find_provider(params[1])
            try:
                self.manager.backup(p)
                self.put_message('info', 'Stored backup for %s.' % p.name)
            except:
                self.put_message('err', 'Failed to backup %s.' % p.name)
        if params[0] == 'backupall':
            errs = self.manager.backup_all()
            if errs != []:
                self.put_message('err',
                                 'Backup failed for %s.' % ', '.join(errs))
            else:
                self.put_message('info', 'Stored full backup')
        if params[0] == 'restore':
            p = self.manager.find_provider(params[1])
            try:
                self.manager.restore(p, params[2])
                self.put_message(
                    'info', 'Restored configuration of %s (rev %s).' %
                    (p.name, params[2]))
            except:
                self.put_message('err', 'Failed to recover %s.' % p.name)
        if params[0] == 'drop':
            try:
                self.manager.delete_backup(params[1], params[2])
                self.put_message(
                    'info',
                    'Deleted backup rev %s for %s.' % (params[2], params[1]))
            except:
                self.put_message(
                    'err', 'Failed to delete backup rev %s for %s.' %
                    (params[2], params[1]))

    @event('listitem/click')
    def on_list_click(self, event, params, vars=None):
        for p in self.providers:
            if p.id == params[0]:
                self._current = p.id
                self._current_name = p.name