Ejemplo n.º 1
0
    def clean_bsdusr_home(self):
        home = self.cleaned_data['bsdusr_home']
        user_home = self.instance.bsdusr_home

        if self.instance.bsdusr_builtin:
            return self.instance.bsdusr_home
        if home is not None:
            if home == '/nonexistent':
                return home

            if home.startswith('/mnt/'):
                bsdusr_username = self.cleaned_data.get('bsdusr_username', '')
                volumes = ['/mnt/{}'.format(volume.vol_name) for volume in Volume.objects.all()]

                if self.instance.id and home != user_home:
                    if len(zfs.list_datasets(path=user_home)) > 0 and \
                            (len(zfs.list_datasets(path=home)) > 0 and home.startswith(user_home + '/')):
                        raise forms.ValidationError(_("A dataset inside the home dataset "
                                                      "cannot be used as a home directory."))

                if home in volumes:
                    raise forms.ValidationError(_("Volume root directories cannot be used as user home directories."))

                if home.endswith(bsdusr_username):
                    return home

                if not self.instance.id:
                    home = "%s/%s" % (home.rstrip('/'), bsdusr_username)

                if not self.instance.id and not home.endswith(bsdusr_username):
                    raise forms.ValidationError(
                        _('Home directory must end with username')
                    )

                return home
Ejemplo n.º 2
0
    def clean_bsdusr_home(self):
        home = self.cleaned_data['bsdusr_home']
        user_home = self.instance.bsdusr_home

        if self.instance.bsdusr_builtin:
            return self.instance.bsdusr_home
        if home is not None:
            if home == '/nonexistent':
                return home

            if home.startswith('/mnt/'):
                bsdusr_username = self.cleaned_data.get('bsdusr_username', '')
                volumes = ['/mnt/{}'.format(volume.vol_name) for volume in Volume.objects.all()]

                if self.instance.id and home != user_home:
                    if len(zfs.list_datasets(path=user_home)) > 0 and \
                            (len(zfs.list_datasets(path=home)) > 0 and home.startswith(user_home + '/')):
                        raise forms.ValidationError(_("A dataset inside the home dataset "
                                                      "cannot be used as a home directory."))

                if home in volumes:
                    raise forms.ValidationError(_("Volume root directories cannot be used as user home directories."))

                if home.endswith(bsdusr_username):
                    return home

                if not self.instance.id:
                    home = "%s/%s" % (home.rstrip('/'), bsdusr_username)

                if not self.instance.id and not home.endswith(bsdusr_username):
                    raise forms.ValidationError(
                        _('Home directory must end with username')
                    )

                return home
Ejemplo n.º 3
0
def jail_auto_configure():
    """
    Auto configure the jail settings

    The first ZFS volume found will be selected.
    A dataset called jails will be created, if it already exists then
    append "_N" where N 2..100 until a dataset is not found.
    """

    volume = Volume.objects.filter(vol_fstype="ZFS")
    if not volume.exists():
        raise MiddlewareError(_("You need to create a Volume to proceed!"))
    volume = volume[0]
    basename = "%s/jails" % volume.vol_name
    name = basename
    for i in xrange(2, 100):
        datasets = list_datasets(path="/mnt/%s" % name, recursive=False)
        if not datasets:
            break
        else:
            name = "%s_%d" % (basename, i)
    rv, err = notifier().create_zfs_dataset(name)
    if rv != 0:
        raise MiddlewareError(_("Failed to create dataset %s: %s") % (name, err))

    try:
        jail = JailsConfiguration.objects.latest("id")
    except JailsConfiguration.DoesNotExist:
        jail = JailsConfiguration()
    jail.jc_path = "/mnt/%s" % name
    jail.save()
Ejemplo n.º 4
0
def create_samba4_dataset():
    path = None
    volume, basename = get_samba4_path()

    if volume.vol_fstype == 'ZFS':
        name = basename
        path = "/mnt/%s" % name

        datasets = list_datasets(
            path=path,
            recursive=False,
        )
        if not datasets:
            rv, err = notifier().create_zfs_dataset(name)
            if rv != 0:
                print >> sys.stderr, "Failed to create dataset %(name)s: %(error)s" % {
                    'name': name,
                    'error': err,
                }
                sys.exit(1)

    elif volume.vol_fstype == 'UFS':
        path = "/mnt/%s" % basename
        if not os.path.exists(path):
            try:
                os.makedirs(path)

            except Exception as e:
                print >> sys.stderr, "Failed to create directory %(name)s: %(error)s" % {
                    'name': path,
                    'error': e
                }
                sys.exit(1)

    return path
Ejemplo n.º 5
0
 def get_datasets(self, hierarchical=False, include_root=False):
     if self.vol_fstype == 'ZFS':
         return zfs.list_datasets(
             path=self.vol_name,
             recursive=True,
             hierarchical=hierarchical,
             include_root=include_root)
Ejemplo n.º 6
0
def dataset_delete(request, name):

    datasets = zfs.list_datasets(path=name, recursive=True)
    if request.method == 'POST':
        form = forms.Dataset_Destroy(request.POST, fs=name, datasets=datasets)
        if form.is_valid():
            if form.hold:
                proc = subprocess.Popen(
                    'zfs release freenas:repl %s' % form.hold,
                    shell=True,
                    stdout=subprocess.PIPE,
                    stderr=subprocess.PIPE,
                )
                proc.communicate()
            retval = notifier().destroy_zfs_dataset(path=name, recursive=True)
            if retval == '':
                notifier().restart("collectd")
                return JsonResp(request,
                                message=_("Dataset successfully destroyed."))
            else:
                return JsonResp(request, error=True, message=retval)
    else:
        form = forms.Dataset_Destroy(fs=name, datasets=datasets)
    return render(request, 'storage/dataset_confirm_delete.html', {
        'name': name,
        'form': form,
        'datasets': datasets,
    })
Ejemplo n.º 7
0
def dataset_delete(request, name):

    datasets = zfs.list_datasets(path=name, recursive=True)
    if request.method == 'POST':
        form = forms.Dataset_Destroy(request.POST, fs=name, datasets=datasets)
        if form.is_valid():
            if form.hold:
                proc = subprocess.Popen(
                    'zfs release freenas:repl %s' % form.hold,
                    shell=True,
                    stdout=subprocess.PIPE,
                    stderr=subprocess.PIPE,
                )
                retval = proc.communicate()[1]
                if proc.returncode != 0 and retval:
                    raise MiddlewareError(retval)
            retval = notifier().destroy_zfs_dataset(path=name, recursive=True)
            if retval == '':
                notifier().restart("collectd")
                return JsonResp(
                    request,
                    message=_("Dataset successfully destroyed."))
            else:
                return JsonResp(request, error=True, message=retval)
    else:
        form = forms.Dataset_Destroy(fs=name, datasets=datasets)
    return render(request, 'storage/dataset_confirm_delete.html', {
        'name': name,
        'form': form,
        'datasets': datasets,
    })
Ejemplo n.º 8
0
 def get_datasets(self, hierarchical=False, include_root=False):
     if self.vol_fstype == 'ZFS':
         return zfs.list_datasets(
             path=self.vol_name,
             recursive=True,
             hierarchical=hierarchical,
             include_root=include_root)
Ejemplo n.º 9
0
 def get_datasets_with_root(self, hierarchical=False):
     """
     Helper method for template call
     """
     if self.vol_fstype == 'ZFS':
         return zfs.list_datasets(path=self.vol_name,
             recursive=True,
             hierarchical=hierarchical,
             include_root=True)
Ejemplo n.º 10
0
def dataset_delete(request, name):

    datasets = zfs.list_datasets(path=name, recursive=True)
    if request.method == "POST":
        form = forms.Dataset_Destroy(request.POST, fs=name, datasets=datasets)
        if form.is_valid():
            retval = notifier().destroy_zfs_dataset(path=name, recursive=True)
            if retval == "":
                notifier().restart("collectd")
                return JsonResp(request, message=_("Dataset successfully destroyed."))
            else:
                return JsonResp(request, error=True, message=retval)
    else:
        form = forms.Dataset_Destroy(fs=name, datasets=datasets)
    return render(request, "storage/dataset_confirm_delete.html", {"name": name, "form": form, "datasets": datasets})
Ejemplo n.º 11
0
def jail_auto_configure():
    import platform
    """
    Auto configure the jail settings

    The first ZFS volume found will be selected.
    A dataset called jails will be created, if it already exists then
    append "_N" where N 2..100 until a dataset is not found.
    """

    vol_fstype = 'ZFS'
    volume = Volume.objects.filter(vol_fstype='ZFS')
    if not volume.exists():
        raise MiddlewareError(_("You need to create a ZFS volume to proceed!"))

    volume = volume[0]
    basename = "%s/jails" % volume.vol_name

    name = basename
    for i in xrange(2, 100):
        datasets = list_datasets(
            path="/mnt/%s" % name,
            recursive=False,
        )
        if not datasets:
            break
        else:
            name = "%s_%d" % (basename, i)
    rv, err = notifier().create_zfs_dataset(name)
    if rv != 0:
        raise MiddlewareError(
            _("Failed to create dataset %(name)s: %(error)s") % {
                'name': name,
                'error': err,
            })

    try:
        jail = JailsConfiguration.objects.latest('id')
    except JailsConfiguration.DoesNotExist:
        jail = JailsConfiguration()
    jail.jc_path = "/mnt/%s" % name
    jail.save()

    w = warden.Warden()
    w.wtmp = jail.jc_path
    w.jdir = jail.jc_path
    w.release = platform.release().strip()
    w.save()
Ejemplo n.º 12
0
def jail_auto_configure():
    import platform

    """
    Auto configure the jail settings

    The first ZFS volume found will be selected.
    A dataset called jails will be created, if it already exists then
    append "_N" where N 2..100 until a dataset is not found.
    """

    vol_fstype = 'ZFS'
    volume = Volume.objects.filter(vol_fstype='ZFS')
    if not volume.exists():
        raise MiddlewareError(_("You need to create a ZFS volume to proceed!"))

    volume = volume[0]
    basename = "%s/jails" % volume.vol_name

    name = basename
    for i in xrange(2, 100):
        datasets = list_datasets(
            path="/mnt/%s" % name,
            recursive=False,
        )
        if not datasets:
            break
        else:
            name = "%s_%d" % (basename, i)
    rv, err = notifier().create_zfs_dataset(name)
    if rv != 0:
        raise MiddlewareError(_("Failed to create dataset %(name)s: %(error)s") % {
            'name': name,
            'error': err,
        })

    try:
        jail = JailsConfiguration.objects.latest('id')
    except JailsConfiguration.DoesNotExist:
        jail = JailsConfiguration()
    jail.jc_path = "/mnt/%s" % name
    jail.save()

    w = warden.Warden()
    w.wtmp = jail.jc_path
    w.jdir = jail.jc_path
    w.release = platform.release().strip()
    w.save()
Ejemplo n.º 13
0
def create_samba4_dataset():
    vol_fstype = 'ZFS'
    path = None

    volume = Volume.objects.filter(vol_fstype='ZFS')
    if not volume.exists():
        volume = Volume.objects.filter(vol_fstype='UFS')
        if not volume.exists():
            print >> sys.stderr, "You need to create a volume to proceed!"
            sys.exit(1)
        vol_fstype = 'UFS'

    volume = volume[0]
    basename = "%s/.samba4" % volume.vol_name

    if vol_fstype == 'ZFS':
        name = basename
        path = "/mnt/%s" % name

        datasets = list_datasets(
            path=path,
            recursive=False,
        )
        if not datasets:
            rv, err = notifier().create_zfs_dataset(name)
            if rv != 0:
                print >> sys.stderr, "Failed to create dataset %(name)s: %(error)s" % {
                    'name': name,
                    'error': err,
                }
                sys.exit(1)

    elif vol_fstype == 'UFS':
        path = "/mnt/%s" % basename
        if not os.path.exists(path):
            try:
                os.makedirs(path)

            except Exception as e:
                print >> sys.stderr, "Failed to create directory %(name)s: %(error)s" % {
                   'name': path,
                   'error': e
                }
                sys.exit(1)

    return path
Ejemplo n.º 14
0
def dataset_delete(request, name):

    datasets = zfs.list_datasets(path=name, recursive=True)
    if request.method == 'POST':
        form = forms.Dataset_Destroy(request.POST, fs=name, datasets=datasets)
        if form.is_valid():
            retval = notifier().destroy_zfs_dataset(path=name, recursive=True)
            if retval == '':
                return JsonResp(request,
                                message=_("Dataset successfully destroyed."))
            else:
                return JsonResp(request, error=True, message=retval)
    else:
        form = forms.Dataset_Destroy(fs=name, datasets=datasets)
    return render(request, 'storage/dataset_confirm_delete.html', {
        'name': name,
        'form': form,
        'datasets': datasets,
    })
Ejemplo n.º 15
0
def dataset_delete(request, name):

    datasets = zfs.list_datasets(path=name, recursive=True)
    if request.method == 'POST':
        form = forms.Dataset_Destroy(request.POST, fs=name, datasets=datasets)
        if form.is_valid():
            retval = notifier().destroy_zfs_dataset(path=name, recursive=True)
            if retval == '':
                return JsonResp(
                    request,
                    message=_("Dataset successfully destroyed."))
            else:
                return JsonResp(request, error=True, message=retval)
    else:
        form = forms.Dataset_Destroy(fs=name, datasets=datasets)
    return render(request, 'storage/dataset_confirm_delete.html', {
        'name': name,
        'form': form,
        'datasets': datasets,
    })
Ejemplo n.º 16
0
def jail_auto_configure():
    import platform

    """
    Auto configure the jail settings

    The first ZFS volume found will be selected.
    A dataset called jails will be created, if it already exists then
    append "_N" where N 2..100 until a dataset is not found.
    """

    vol_fstype = 'ZFS'
    volume = Volume.objects.filter(vol_fstype='ZFS')
    if not volume.exists():
        log.warn("ZFS is recommended for plugins!")
        volume = Volume.objects.filter(vol_fstype='UFS')
        if not volume.exists():
            raise MiddlewareError(_("You need to create a volume to proceed!"))
        vol_fstype = 'UFS'  

    volume = volume[0]
    basename = "%s/jails" % volume.vol_name

    if vol_fstype == 'ZFS':
        name = basename
        for i in xrange(2, 100):
            datasets = list_datasets(
                path="/mnt/%s" % name,
                recursive=False,
            )
            if not datasets:
                break
            else:
                name = "%s_%d" % (basename, i)
        rv, err = notifier().create_zfs_dataset(name)
        if rv != 0:
            raise MiddlewareError(_("Failed to create dataset %(name)s: %(error)s") % {
                'name': name,
                'error': err,
            })

    elif vol_fstype == 'UFS':
        name = "/mnt/%s" % basename
        if os.path.exists(name):
            max = 1
            dirs = glob.glob("%s_*" % name)
            if dirs:
                for d in dirs:
                    parts = d.split('_')
                    if len(parts) > 1 and re.match('^[0-9]+$', parts[1]):
                        num = int(parts[1])
                        if num > max:
                            max = num

            name = "%s_%d" % (name, max + 1)

        name = name.replace('/mnt/', '')
        try:
            os.makedirs("/mnt/%s" % name)

        except Exception as e:
            raise MiddlewareError(_("Failed to create directory %(name)s: %(error)s") % {
                'name': name,
                'error': e
            })

    try:
        jail = JailsConfiguration.objects.latest('id')
    except JailsConfiguration.DoesNotExist:
        jail = JailsConfiguration()
    jail.jc_path = "/mnt/%s" % name
    jail.save()

    w = warden.Warden()
    w.wtmp = jail.jc_path
    w.jdir = jail.jc_path
    w.release = platform.release().strip()
    w.save()
Ejemplo n.º 17
0
def jail_auto_configure():
    import platform

    """
    Auto configure the jail settings

    The first ZFS volume found will be selected.
    A dataset called jails will be created, if it already exists then
    append "_N" where N 2..100 until a dataset is not found.
    """

    vol_fstype = 'ZFS'
    volume = Volume.objects.filter(vol_fstype='ZFS')
    if not volume.exists():
        log.warn("ZFS is recommended for plugins!")
        volume = Volume.objects.filter(vol_fstype='UFS')
        if not volume.exists():
            raise MiddlewareError(_("You need to create a volume to proceed!"))
        vol_fstype = 'UFS'  

    volume = volume[0]
    basename = "%s/jails" % volume.vol_name

    if vol_fstype == 'ZFS':
        name = basename
        for i in xrange(2, 100):
            datasets = list_datasets(
                path="/mnt/%s" % name,
                recursive=False,
            )
            if not datasets:
                break
            else:
                name = "%s_%d" % (basename, i)
        rv, err = notifier().create_zfs_dataset(name)
        if rv != 0:
            raise MiddlewareError(_("Failed to create dataset %(name)s: %(error)s") % {
                'name': name,
                'error': err,
            })

    elif vol_fstype == 'UFS':
        name = "/mnt/%s" % basename
        if os.path.exists(name):
            max = 1
            dirs = glob.glob("%s_*" % name)
            if dirs:
                for d in dirs:
                    parts = d.split('_')
                    if len(parts) > 1 and re.match('^[0-9]+$', parts[1]):
                        num = int(parts[1])
                        if num > max:
                            max = num

            name = "%s_%d" % (name, max + 1)

        name = name.replace('/mnt/', '')
        try:
            os.makedirs("/mnt/%s" % name)

        except Exception as e:
            raise MiddlewareError(_("Failed to create directory %(name)s: %(error)s") % {
                'name': name,
                'error': e
            })

    try:
        jail = JailsConfiguration.objects.latest('id')
    except JailsConfiguration.DoesNotExist:
        jail = JailsConfiguration()
    jail.jc_path = "/mnt/%s" % name
    jail.save()

    w = warden.Warden()
    w.wtmp = jail.jc_path
    w.jdir = jail.jc_path
    w.release = platform.release().strip()
    w.save()