Exemplo n.º 1
0
 def refresh_wrapper(exports, request, logger):
     try:
         refresh_nfs_exports(exports)
     except Exception as e:
         e_msg = ('A lower level error occured while refreshing '
                  'NFS exports: %s' % e.__str__())
         handle_exception(Exception(e_msg), request)
Exemplo n.º 2
0
 def _toggle_visibility(self, share, snap_name, on=True):
     for se in NFSExport.objects.filter(share=share):
         snap_realname = ('%s_%s' % (share.name, snap_name))
         mnt_pt = ('%s%s/%s' % (settings.MNT_PT, share.pool.name,
                                snap_realname))
         export_pt = mnt_pt.replace(settings.MNT_PT,
                                    settings.NFS_EXPORT_ROOT)
         export = None
         if (on):
             if (not NFSExport.objects.filter(share=share, nohide=False)):
                 #master share is not exported, so don't export the snap
                 continue
             export = NFSExport(share=share, mount=export_pt,
                                host_str=se.host_str, nohide=True)
             export.full_clean()
             export.save()
         else:
             try:
                 export = NFSExport.objects.get(share=share,
                                                host_str=se.host_str,
                                                mount=export_pt,
                                                nohide=True)
                 export.enabled = False
             except Exception, e:
                 logger.exception(e)
                 continue
         exports = create_nfs_export_input(export)
         refresh_nfs_exports(exports)
         if (not on):
             export.delete()
Exemplo n.º 3
0
    def delete(self, request, sname, export_id):
        try:
            share = Share.objects.get(name=sname)
            if (not NFSExport.objects.filter(id=export_id).exists()):
                e_msg = ('NFS export with id: %d does not exist' % export_id)
                handle_exception(Exception(e_msg), request)
            export = NFSExport.objects.get(id=export_id)

            if (len(NFSExport.objects.filter(share=share)) == 1):
                export_mnt_pt = ('/export/%s' % sname)
                umount_root(export_mnt_pt)
                if (is_share_mounted(sname, mnt_prefix='/export/')):
                    e_msg = ('Cannot delete nfs export with id: %d due to '
                             'busy mount. Try again later.' % export_id)
                    handle_exception(Exception(e_msg), request)

            export.enabled = False
            exports = self._create_nfs_export_input(export)
            export.delete()
            refresh_nfs_exports(exports)
            return Response()
        except RockStorAPIException:
            raise
        except Exception, e:
            handle_exception(e, request)
Exemplo n.º 4
0
 def refresh_wrapper(exports, request, logger):
     try:
         refresh_nfs_exports(exports)
     except Exception as e:
         e_msg = ('A lower level error occured while refreshing '
                  'NFS exports: %s' % e.__str__())
         handle_exception(Exception(e_msg), request)
Exemplo n.º 5
0
    def delete(self, request, sname, export_id):
        try:
            share = Share.objects.get(name=sname)
            if (not NFSExport.objects.filter(id=export_id).exists()):
                e_msg = ('NFS export with id: %d does not exist' % export_id)
                handle_exception(Exception(e_msg), request)
            export = NFSExport.objects.get(id=export_id)

            if (len(NFSExport.objects.filter(share=share)) == 1):
                export_mnt_pt = ('/export/%s' % sname)
                umount_root(export_mnt_pt)
                if (is_share_mounted(sname, mnt_prefix='/export/')):
                    e_msg = ('Cannot delete nfs export with id: %d due to '
                             'busy mount. Try again later.' % export_id)
                    handle_exception(Exception(e_msg), request)

            export.enabled = False
            exports = self._create_nfs_export_input(export)
            export.delete()
            refresh_nfs_exports(exports)
            return Response()
        except RockStorAPIException:
            raise
        except Exception, e:
            handle_exception(e, request)
Exemplo n.º 6
0
 def refresh_wrapper(exports, request, logger):
     try:
         refresh_nfs_exports(exports)
     except Exception as e:
         e_msg = (
             "A lower level error occurred while refreshing NFS exports: ({})."
         ).format(e.__str__())
         handle_exception(Exception(e_msg), request)
Exemplo n.º 7
0
def refresh_wrapper(exports, request, logger):
    try:
        refresh_nfs_exports(exports)
    except Exception, e:
        e_msg = ('Unable to delete the export because it is in use.'
                 ' Try again Later')
        logger.exception(e)
        handle_exception(Exception(e_msg), request)
Exemplo n.º 8
0
def refresh_wrapper(exports, request, logger):
    try:
        refresh_nfs_exports(exports)
    except Exception, e:
        e_msg = ('A lower level error occured while refreshing NFS exports. '
                 'Error: %s. This could be due to invalid input. '
                 'If so, correct your input and try again.' % e)
        logger.exception(e)
        handle_exception(Exception(e_msg), request)
Exemplo n.º 9
0
def refresh_wrapper(exports, request, logger):
    try:
        refresh_nfs_exports(exports)
    except Exception, e:
        e_msg = ('A lower level error occured while refreshing NFS exports. '
                 'Error: %s. This could be due to invalid input. '
                 'If so, correct your input and try again.' % e)
        logger.exception(e)
        handle_exception(Exception(e_msg), request)
Exemplo n.º 10
0
 def post(self, request, command):
     if (command == 'bootstrap'):
         try:
             logger.info('bootstrapping')
             exports = create_nfs_export_input(NFSExport.objects.all())
             logger.info('export = %s' % exports)
             refresh_nfs_exports(exports)
             return Response()
         except Exception, e:
             e_msg = ('Unable to export all nfs shares due to a system error')
             logger.error(e_msg)
             logger.exception(e)
             handle_exception(Exception(e_msg), request)
Exemplo n.º 11
0
    def delete(self, request, sname, export_id):
        try:
            share = Share.objects.get(name=sname)
            if (not NFSExport.objects.filter(id=export_id).exists()):
                e_msg = ('NFS export with id: %d does not exist' % export_id)
                handle_exception(Exception(e_msg), request)
            export = NFSExport.objects.get(id=export_id)

            if (is_share_mounted(share.name) and
                not SambaShare.objects.filter(share=share).exists() and
                not len(NFSExport.objects.filter(share=share)) > 1):
                umount_root(export.mount)
            export.enabled = False
            exports = self._create_nfs_export_input(export)
            export.delete()
            refresh_nfs_exports(exports)
            return Response()
        except RockStorAPIException:
            raise
        except Exception, e:
            handle_exception(e, request)
Exemplo n.º 12
0
    def _toggle_visibility(self, share, snap_name, snap_qgroup, on=True):
        cur_exports = list(NFSExport.objects.all())
        # The following may be buggy when used with system mounted (fstab) /home
        # but we currently don't allow /home to be exported.
        snap_mnt_pt = "{}{}/.{}".format(settings.MNT_PT, share.name, snap_name)
        export_pt = snap_mnt_pt.replace(settings.MNT_PT, settings.NFS_EXPORT_ROOT)
        if on:
            mount_snap(share, snap_name, snap_qgroup)

            if NFSExport.objects.filter(share=share).exists():
                se = NFSExport.objects.filter(share=share)[0]
                export_group = NFSExportGroup(
                    host_str=se.export_group.host_str, nohide=True
                )
                export_group.save()
                export = NFSExport(
                    share=share, export_group=export_group, mount=export_pt
                )
                export.full_clean()
                export.save()
                cur_exports.append(export)
        else:
            for mnt in (snap_mnt_pt, export_pt):
                try:
                    export = NFSExport.objects.get(share=share, mount=mnt)
                    cur_exports.remove(export)
                    export.export_group.delete()
                    export.delete()
                except NFSExport.DoesNotExist:
                    pass
                except Exception as e:
                    logger.exception(e)
                finally:
                    umount_root(export_pt)
                    umount_root(snap_mnt_pt)
        exports = self.create_nfs_export_input(cur_exports)
        adv_entries = [x.export_str for x in AdvancedNFSExport.objects.all()]
        exports_d = self.create_adv_nfs_export_input(adv_entries, self.request)
        exports.update(exports_d)
        refresh_nfs_exports(exports)
Exemplo n.º 13
0
    def post(self, request, sname):
        try:
            share = Share.objects.get(name=sname)
            options = {
                'host_str': '*',
                'mod_choice': 'ro',
                'sync_choice': 'async',
                'security': 'insecure',
                'id': -1,
            }
            if ('host_str' in request.DATA):
                options['host_str'] = request.DATA['host_str']
            if ('mod_choice' in request.DATA):
                options['mod_choice'] = request.DATA['mod_choice']
            if ('sync_choice' in request.DATA):
                options['sync_choice'] = request.DATA['sync_choice']

            mnt_pt = ('%s%s' % (settings.MNT_PT, share.name))
            if (not is_share_mounted(share.name)):
                pool_device = Disk.objects.filter(pool=share.pool)[0].name
                mount_share(share.subvol_name, pool_device, mnt_pt)

            export = NFSExport(share=share,
                               mount=mnt_pt,
                               host_str=options['host_str'],
                               editable=options['mod_choice'],
                               syncable=options['sync_choice'],
                               mount_security=options['security'])
            export.full_clean()
            export.save()

            exports = self._create_nfs_export_input(export)
            refresh_nfs_exports(exports)
            nfs_serializer = NFSExportSerializer(export)
            return Response(nfs_serializer.data)
        except RockStorAPIException:
            raise
        except Exception, e:
            handle_exception(e, request)
Exemplo n.º 14
0
    def _toggle_visibility(self, share, snap_name, on=True):
        cur_exports = list(NFSExport.objects.all())
        snap_mnt_pt = ('%s%s/.%s' % (settings.MNT_PT, share.name, snap_name))
        export_pt = snap_mnt_pt.replace(settings.MNT_PT,
                                        settings.NFS_EXPORT_ROOT)
        if (on):
            mount_snap(share, snap_name)

            if (NFSExport.objects.filter(share=share).exists()):
                se = NFSExport.objects.filter(share=share)[0]
                export_group = NFSExportGroup(
                    host_str=se.export_group.host_str, nohide=True)
                export_group.save()
                export = NFSExport(share=share,
                                   export_group=export_group,
                                   mount=export_pt)
                export.full_clean()
                export.save()
                cur_exports.append(export)
        else:
            for mnt in (snap_mnt_pt, export_pt):
                try:
                    export = NFSExport.objects.get(share=share, mount=mnt)
                    cur_exports.remove(export)
                    export.export_group.delete()
                    export.delete()
                except NFSExport.DoesNotExist:
                    pass
                except Exception as e:
                    logger.exception(e)
                finally:
                    umount_root(export_pt)
                    umount_root(snap_mnt_pt)
        exports = self.create_nfs_export_input(cur_exports)
        adv_entries = [x.export_str for x in AdvancedNFSExport.objects.all()]
        exports_d = self.create_adv_nfs_export_input(adv_entries, self.request)
        exports.update(exports_d)
        refresh_nfs_exports(exports)
Exemplo n.º 15
0
    def post(self, request, sname):
        try:
            share = Share.objects.get(name=sname)
            options = {
                'host_str': '*',
                'mod_choice': 'ro',
                'sync_choice': 'async',
                'security': 'insecure',
                'id': -1,
                }
            if ('host_str' in request.DATA):
                options['host_str'] = request.DATA['host_str']
            if ('mod_choice' in request.DATA):
                options['mod_choice'] = request.DATA['mod_choice']
            if ('sync_choice' in request.DATA):
                options['sync_choice'] = request.DATA['sync_choice']

            mnt_pt = ('%s%s' % (settings.MNT_PT, share.name))
            if (not is_share_mounted(share.name)):
                pool_device = Disk.objects.filter(pool=share.pool)[0].name
                mount_share(share.subvol_name, pool_device, mnt_pt)

            export = NFSExport(share=share, mount=mnt_pt,
                               host_str=options['host_str'],
                               editable=options['mod_choice'],
                               syncable=options['sync_choice'],
                               mount_security=options['security'])
            export.full_clean()
            export.save()

            exports = self._create_nfs_export_input(export)
            refresh_nfs_exports(exports)
            nfs_serializer = NFSExportSerializer(export)
            return Response(nfs_serializer.data)
        except RockStorAPIException:
            raise
        except Exception, e:
            handle_exception(e, request)
Exemplo n.º 16
0
    def _toggle_visibility(self, share, snap_name, snap_qgroup, on=True):
        cur_exports = list(NFSExport.objects.all())
        snap_mnt_pt = ('%s%s/.%s' % (settings.MNT_PT, share.name, snap_name))
        export_pt = snap_mnt_pt.replace(settings.MNT_PT,
                                        settings.NFS_EXPORT_ROOT)
        if (on):
            mount_snap(share, snap_name, snap_qgroup)

            if (NFSExport.objects.filter(share=share).exists()):
                se = NFSExport.objects.filter(share=share)[0]
                export_group = NFSExportGroup(
                    host_str=se.export_group.host_str, nohide=True)
                export_group.save()
                export = NFSExport(share=share, export_group=export_group,
                                   mount=export_pt)
                export.full_clean()
                export.save()
                cur_exports.append(export)
        else:
            for mnt in (snap_mnt_pt, export_pt):
                try:
                    export = NFSExport.objects.get(share=share, mount=mnt)
                    cur_exports.remove(export)
                    export.export_group.delete()
                    export.delete()
                except NFSExport.DoesNotExist:
                    pass
                except Exception as e:
                    logger.exception(e)
                finally:
                    umount_root(export_pt)
                    umount_root(snap_mnt_pt)
        exports = self.create_nfs_export_input(cur_exports)
        adv_entries = [x.export_str for x in AdvancedNFSExport.objects.all()]
        exports_d = self.create_adv_nfs_export_input(adv_entries, self.request)
        exports.update(exports_d)
        refresh_nfs_exports(exports)
Exemplo n.º 17
0
class CommandView(APIView):
    authentication_classes = (
        DigestAuthentication,
        SessionAuthentication,
        BasicAuthentication,
        OAuth2Authentication,
    )
    permission_classes = (IsAuthenticated, )

    def post(self, request, command):
        if (command == 'bootstrap'):
            try:
                for share in Share.objects.all():
                    if (not is_share_mounted(share.name)):
                        mnt_pt = ('%s%s' % (settings.MNT_PT, share.name))
                        pool_device = Disk.objects.filter(
                            pool=share.pool)[0].name
                        mount_share(share.subvol_name, pool_device, mnt_pt)
            except Exception, e:
                e_msg = ('Unable to mount a share(%s, %s) during bootstrap.' %
                         (pool_device, mnt_pt))
                logger.error(e_msg)
                logger.exception(e)
                handle_exception(Exception(e_msg), request)

            try:
                mnt_map = sftp_mount_map(settings.SFTP_MNT_ROOT)
                for sftpo in SFTP.objects.all():
                    sftp_mount(sftpo.share, settings.MNT_PT,
                               settings.SFTP_MNT_ROOT, mnt_map, sftpo.editable)
                    sftp_snap_toggle(sftpo.share)
            except Exception, e:
                e_msg = ('Unable to export all sftp shares due to a system'
                         ' error')
                logger.error(e_msg)
                logger.exception(e)
                handle_exception(Exception(e_msg), request)

            try:
                exports = create_nfs_export_input(NFSExport.objects.all())
                logger.info('export = %s' % exports)
                refresh_nfs_exports(exports)
            except Exception, e:
                e_msg = ('Unable to export all nfs shares due to a system'
                         'error')
                logger.error(e_msg)
                logger.exception(e)
                handle_exception(Exception(e_msg), request)
Exemplo n.º 18
0
                    export = NFSExport.objects.get(share=share, mount=mnt)
                    cur_exports.remove(export)
                    export.export_group.delete()
                    export.delete()
                except NFSExport.DoesNotExist:
                    pass
                except Exception, e:
                    logger.exception(e)
                finally:
                    umount_root(export_pt)
                    umount_root(snap_mnt_pt)
        exports = self.create_nfs_export_input(cur_exports)
        adv_entries = [x.export_str for x in AdvancedNFSExport.objects.all()]
        exports_d = self.create_adv_nfs_export_input(adv_entries, self.request)
        exports.update(exports_d)
        refresh_nfs_exports(exports)

    @transaction.atomic
    def _create(self, share, snap_name, request, uvisible, snap_type,
                writable):
        if (Snapshot.objects.filter(share=share, name=snap_name).exists()):
            e_msg = ('Snapshot(%s) already exists for the Share(%s).' %
                     (snap_name, share.name))
            handle_exception(Exception(e_msg), request)

        snap_size = 0
        qgroup_id = '0/na'
        if (snap_type == 'replication'):
            writable = False
        add_snap(share.pool, share.subvol_name, snap_name, writable)
        snap_id = share_id(share.pool, snap_name)
Exemplo n.º 19
0
                mnt_map = sftp_mount_map(settings.SFTP_MNT_ROOT)
                for sftpo in SFTP.objects.all():
                    sftp_mount(sftpo.share, settings.MNT_PT,
                               settings.SFTP_MNT_ROOT, mnt_map, sftpo.editable)
                    sftp_snap_toggle(sftpo.share)
            except Exception, e:
                e_msg = ('Unable to export all sftp shares due to a system'
                         ' error')
                logger.error(e_msg)
                logger.exception(e)
                handle_exception(Exception(e_msg), request)

            try:
                exports = create_nfs_export_input(NFSExport.objects.all())
                logger.info('export = %s' % exports)
                refresh_nfs_exports(exports)
            except Exception, e:
                e_msg = ('Unable to export all nfs shares due to a system'
                         'error')
                logger.error(e_msg)
                logger.exception(e)
                handle_exception(Exception(e_msg), request)

            #  bootstrap services
            try:
                systemctl('firewalld', 'stop')
                systemctl('firewalld', 'disable')
                systemctl('nginx', 'stop')
                systemctl('nginx', 'disable')
                systemctl('atd', 'enable')
                systemctl('atd', 'start')