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
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()
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
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)
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, })
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, })
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)
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})
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()
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()
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
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, })
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, })
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()