def view_local_groups(request):

    return_dict = {}
    try:
        group_list, err = local_users.get_local_groups()
        if err:
            raise Exception(err)

        return_dict["group_list"] = group_list

        if "ack" in request.GET:
            if request.GET["ack"] == "created":
                return_dict['ack_message'] = "Local group successfully created"
            elif request.GET["ack"] == "deleted":
                return_dict['ack_message'] = "Local group successfully deleted"
            elif request.GET["ack"] == "set_membership":
                return_dict[
                    'ack_message'] = "Local group membership successfully modified"

        return django.shortcuts.render_to_response(
            'view_local_groups.html',
            return_dict,
            context_instance=django.template.context.RequestContext(request))
    except Exception, e:
        return_dict['base_template'] = 'users-groups_base.html'
        return_dict["page_title"] = 'Local groups'
        return_dict['tab'] = 'view_local_groups_tab'
        return_dict["error"] = 'Error loading local groups list'
        return_dict["error_details"] = str(e)
        return django.shortcuts.render_to_response(
            "logged_in_error.html",
            return_dict,
            context_instance=django.template.context.RequestContext(request))
def view_local_groups(request):

  return_dict = {}
  try:
    group_list, err = local_users.get_local_groups()
    if err:
      raise Exception(err)
  
    return_dict["group_list"] = group_list
  
    if "action" in request.GET:
      conf = ''
      if request.GET["action"] == "created":
        conf = "Local group successfully created"
      elif request.GET["action"] == "deleted":
        conf = "Local group successfully deleted"
      return_dict["conf"] = conf
  
    return django.shortcuts.render_to_response('view_local_groups.html', return_dict, context_instance=django.template.context.RequestContext(request))
  except Exception, e:
    return_dict['base_template'] = 'users-groups_base.html'
    return_dict["page_title"] = 'Local groups'
    return_dict['tab'] = 'view_local_groups_tab'
    return_dict["error"] = 'Error loading local groups list'
    return_dict["error_details"] = str(e)
    return django.shortcuts.render_to_response("logged_in_error.html", return_dict, context_instance=django.template.context.RequestContext(request))
def edit_local_user_gid(request):

  return_dict = {}
  try:
    group_list,err = local_users.get_local_groups()
    if err:
      raise Exception(err)
    if 'username' not in request.REQUEST:
      raise Exception("Unknown user specified")

    username = request.REQUEST["username"]
    ud,err = local_users.get_local_user(username)
    if err:
      raise Exception(err)
    if not ud:
      raise Exception("Specified user information not found")
  
    if request.method == "GET":
      # Shd be an edit request
  
      # Set initial form values
      initial = {}
      initial['username'] = ud['username']
      initial['gid'] = ud['gid']
  
      form = local_user_forms.EditLocalUserGidForm(initial = initial, group_list = group_list)
  
      return_dict["form"] = form
      return django.shortcuts.render_to_response('edit_local_user_gid.html', return_dict, context_instance=django.template.context.RequestContext(request))
  
    else:
  
      # Shd be an save request
      form = local_user_forms.EditLocalUserGidForm(request.POST, group_list = group_list)
      return_dict["form"] = form
      if form.is_valid():
        cd = form.cleaned_data
        ret, err = local_users.set_local_user_gid(cd)
        if not ret:
          if err:
            raise Exception(err)
          else:
            raise Exception("Error saving user information")
  
        audit_str = "Modified local user's primary group %s"%cd["username"]
        audit.audit("modify_local_user_gid", audit_str, request.META["REMOTE_ADDR"])
  
        return django.http.HttpResponseRedirect('/view_local_user?username=%s&searchby=username&action=gid_changed'%cd["username"])
  
      else:
        #Invalid form
        return django.shortcuts.render_to_response('edit_local_user_gid.html', return_dict, context_instance=django.template.context.RequestContext(request))
  except Exception, e:
    return_dict['base_template'] = 'users-groups_base.html'
    return_dict["page_title"] = "Modify local user's primary group"
    return_dict['tab'] = 'view_local_users_tab'
    return_dict["error"] = 'Error modifying local users primary group'
    return_dict["error_details"] = str(e)
    return django.shortcuts.render_to_response("logged_in_error.html", return_dict, context_instance=django.template.context.RequestContext(request))
def create_local_user(request):
    return_dict = {}
    try:
        group_list, err = local_users.get_local_groups()
        if err:
            raise Exception(err)
        if request.method == "GET":
            #Return the form
            #form = local_user_forms.LocalUserForm(group_list = group_list)
            form = local_user_forms.LocalUserForm()
            return_dict["form"] = form
            return django.shortcuts.render_to_response(
                "create_local_user.html",
                return_dict,
                context_instance=django.template.context.RequestContext(
                    request))
        else:
            #Form submission so create
            return_dict = {}
            #form = local_user_forms.LocalUserForm(request.POST, group_list = group_list)
            form = local_user_forms.LocalUserForm(request.POST)
            if form.is_valid():
                cd = form.cleaned_data
                #ret, err = local_users.create_local_user(cd["username"], cd["name"], cd["password"], cd['gid'])
                ret, err = local_users.create_local_user(
                    cd["username"], cd["name"], cd["password"], 1000)
                if not ret:
                    if err:
                        raise Exception(err)
                    else:
                        raise Exception("Error creating the local user.")

                audit_str = "Created a local user %s" % cd["username"]
                audit.audit("create_local_user", audit_str, request.META)
                if group_list:
                    url = '/edit_local_user_group_membership/?username=%s&ack=created' % cd[
                        'username']
                else:
                    url = '/view_local_users?ack=created'
                return django.http.HttpResponseRedirect(url)
            else:
                return_dict["form"] = form
                return django.shortcuts.render_to_response(
                    "create_local_user.html",
                    return_dict,
                    context_instance=django.template.context.RequestContext(
                        request))
    except Exception, e:
        return_dict['base_template'] = 'users-groups_base.html'
        return_dict["page_title"] = 'Create a local users'
        return_dict['tab'] = 'view_local_users_tab'
        return_dict["error"] = 'Error creating a local user'
        return_dict["error_details"] = str(e)
        return django.shortcuts.render_to_response(
            "logged_in_error.html",
            return_dict,
            context_instance=django.template.context.RequestContext(request))
def _get_user_or_group_list(type):
  ret = None
  try:
    d, err = cifs_common.load_auth_settings()
    if err:
      raise Exception(err)
    if not d:
      raise Exception("Unspecified authentication method. Could not retrieve users")
    elif d["security"] == "users":
      if type and type == "users":
        l, err = local_users.get_local_users()
        if err:
          raise Exception(err)
        if l:
          ret = []
          for ld in l:
            ret.append(ld["username"])
      else:
        l, err = local_users.get_local_groups()
        if err:
          raise Exception(err)
        if l:
          ret = []
          for ld in l:
            ret.append(ld["grpname"])
    elif d["security"] == "ads":
      if type and type == "users":
        ret, err =  cifs_common._get_ad_users_or_groups("users")
        if err:
          raise Exception(err)
      elif type and type == "groups":
        ret, err =  cifs_common._get_ad_users_or_groups("groups")
        if err:
          raise Exception(err)
    else:
      raise Exception("Unsupported authentication method. Could not retrieve users")
  except Exception, e:
    return None, 'Error retrieving user of group list : %s'%str(e)
def modify_dir_owner(request):
  return_dict = {}
  try:
    users, err = local_users.get_local_users()
    if err:
      raise Exception('Error retrieving local user list : %s'%err)
    if not users:
      raise Exception('No local users seem to be created. Please create at least one local user before performing this operation.')

    groups, err = local_users.get_local_groups()
    if err:
      raise Exception('Error retrieving local group list : %s'%err)
    if not groups:
      raise Exception('No local groups seem to be created. Please create at least one local group before performing this operation.')

    if request.method == "GET":
      if 'path' not in request.GET:
        raise Exception('Invalid request. Please use the menus.')
      path = request.GET['path']
      try:
        stat_info = os.stat(path)
      except Exception, e:
        raise Exception('Error accessing specified path : %s'%str(e))
      uid = stat_info.st_uid
      gid = stat_info.st_gid
      user_name = pwd.getpwuid(uid)[0]
      group_name = grp.getgrgid(gid)[0]

      initial = {}
      initial['path'] = path
      initial['uid'] = uid
      initial['gid'] = gid
      initial['user_name'] = user_name
      initial['group_name'] = group_name
      form = folder_management_forms.ModifyOwnershipForm(initial=initial, user_list = users, group_list = groups)
      return_dict["form"] = form
      return django.shortcuts.render_to_response('modify_dir_ownership.html', return_dict, context_instance=django.template.context.RequestContext(request))
    else:
def create_local_user(request):
  return_dict = {}
  try:
    group_list,err = local_users.get_local_groups()
    if err:
      raise Exception(err)
    if request.method == "GET":
      #Return the form
      form = local_user_forms.LocalUserForm(group_list = group_list)
      return_dict["form"] = form
      return django.shortcuts.render_to_response("create_local_user.html", return_dict, context_instance = django.template.context.RequestContext(request))
    else:
      #Form submission so create
      return_dict = {}
      form = local_user_forms.LocalUserForm(request.POST, group_list = group_list)
      if form.is_valid():
        cd = form.cleaned_data
        ret, err = local_users.create_local_user(cd["username"], cd["name"], cd["password"], cd['gid'])
        if not ret:
          if err:
            raise Exception(err)
          else:
            raise Exception("Error creating the local user.")
        audit_str = "Created a local user %s"%cd["username"]
        audit.audit("create_local_user", audit_str, request.META["REMOTE_ADDR"])
        url = '/view_local_users?action=created'
        return django.http.HttpResponseRedirect(url)
      else:
        return_dict["form"] = form
        return django.shortcuts.render_to_response("create_local_user.html", return_dict, context_instance = django.template.context.RequestContext(request))
  except Exception, e:
    return_dict['base_template'] = 'users-groups_base.html'
    return_dict["page_title"] = 'Create a local users'
    return_dict['tab'] = 'view_local_users_tab'
    return_dict["error"] = 'Error creating a local user'
    return_dict["error_details"] = str(e)
    return django.shortcuts.render_to_response("logged_in_error.html", return_dict, context_instance=django.template.context.RequestContext(request))
def edit_local_user_group_membership(request):

    return_dict = {}
    try:
        if "ack" in request.GET:
            if request.GET["ack"] == "created":
                return_dict['ack_message'] = "Local user successfully created"
        t_group_list, err = local_users.get_local_groups()
        if err:
            raise Exception(err)
        if 'username' not in request.REQUEST:
            raise Exception("Unknown user specified")

        username = request.REQUEST["username"]
        ud, err = local_users.get_local_user(username)
        if err:
            raise Exception(err)
        if not ud:
            raise Exception("Specified user information not found")
        group_list = []
        if t_group_list:
            for g in t_group_list:
                if g['grpname'] == ud['grpname']:
                    continue
                else:
                    group_list.append(g)

        if request.method == "GET":
            # Shd be an edit request

            # Set initial form values
            initial = {}
            initial['username'] = ud['username']
            initial['groups'] = ud['other_groups']

            form = local_user_forms.EditLocalUserGroupMembershipForm(
                initial=initial, group_list=group_list)

            return_dict["form"] = form
            return django.shortcuts.render_to_response(
                'edit_local_user_group_membership.html',
                return_dict,
                context_instance=django.template.context.RequestContext(
                    request))

        else:

            # Shd be an save request
            form = local_user_forms.EditLocalUserGroupMembershipForm(
                request.POST, group_list=group_list)
            return_dict["form"] = form
            if form.is_valid():
                cd = form.cleaned_data
                ret, err = local_users.set_local_user_group_membership(cd)
                if not ret:
                    if err:
                        raise Exception(err)
                    else:
                        raise Exception(
                            "Error saving user's group membership information")

                audit_str = "Modified local user group membership information %s" % cd[
                    "username"]
                audit.audit("modify_local_user_grp_membership", audit_str,
                            request.META)

                return django.http.HttpResponseRedirect(
                    '/view_local_user?username=%s&searchby=username&ack=groups_changed'
                    % cd["username"])

            else:
                #Invalid form
                return django.shortcuts.render_to_response(
                    'edit_local_user_group_membership.html',
                    return_dict,
                    context_instance=django.template.context.RequestContext(
                        request))
    except Exception, e:
        return_dict['base_template'] = 'users-groups_base.html'
        return_dict["page_title"] = 'Local users additional group membership'
        return_dict['tab'] = 'view_local_users_tab'
        return_dict[
            "error"] = 'Error modifying local users additional group membership'
        return_dict["error_details"] = str(e)
        return django.shortcuts.render_to_response(
            "logged_in_error.html",
            return_dict,
            context_instance=django.template.context.RequestContext(request))
def edit_local_user_gid(request):

    return_dict = {}
    try:
        group_list, err = local_users.get_local_groups()
        if err:
            raise Exception(err)
        if 'username' not in request.REQUEST:
            raise Exception("Unknown user specified")

        username = request.REQUEST["username"]
        ud, err = local_users.get_local_user(username)
        if err:
            raise Exception(err)
        if not ud:
            raise Exception("Specified user information not found")

        if request.method == "GET":
            # Shd be an edit request

            # Set initial form values
            initial = {}
            initial['username'] = ud['username']
            initial['gid'] = ud['gid']

            form = local_user_forms.EditLocalUserGidForm(initial=initial,
                                                         group_list=group_list)

            return_dict["form"] = form
            return django.shortcuts.render_to_response(
                'edit_local_user_gid.html',
                return_dict,
                context_instance=django.template.context.RequestContext(
                    request))

        else:

            # Shd be an save request
            form = local_user_forms.EditLocalUserGidForm(request.POST,
                                                         group_list=group_list)
            return_dict["form"] = form
            if form.is_valid():
                cd = form.cleaned_data
                ret, err = local_users.set_local_user_gid(cd)
                if not ret:
                    if err:
                        raise Exception(err)
                    else:
                        raise Exception("Error saving user information")

                audit_str = "Modified local user's primary group %s" % cd[
                    "username"]
                audit.audit("modify_local_user_gid", audit_str, request.META)

                return django.http.HttpResponseRedirect(
                    '/view_local_user?username=%s&searchby=username&ack=gid_changed'
                    % cd["username"])

            else:
                #Invalid form
                return django.shortcuts.render_to_response(
                    'edit_local_user_gid.html',
                    return_dict,
                    context_instance=django.template.context.RequestContext(
                        request))
    except Exception, e:
        return_dict['base_template'] = 'users-groups_base.html'
        return_dict["page_title"] = "Modify local user's primary group"
        return_dict['tab'] = 'view_local_users_tab'
        return_dict["error"] = 'Error modifying local users primary group'
        return_dict["error_details"] = str(e)
        return django.shortcuts.render_to_response(
            "logged_in_error.html",
            return_dict,
            context_instance=django.template.context.RequestContext(request))
def modify_dir_permissions(request):
  return_dict = {}
  try:
    if not "error" in return_dict:
      if "ack" in request.GET:
        if request.GET["ack"] == "ace_deleted":
          return_dict['ack_message'] = "ACL entry successfully removed"
        elif request.GET["ack"] == "aces_added":
          return_dict['ack_message'] = "ACL entries successfully added"
        elif request.GET["ack"] == "aces_modified":
          return_dict['ack_message'] = "ACL entries successfully modified"
        elif request.GET["ack"] == "created_dir":
          return_dict['ack_message'] = "Directory successfully created"
        elif request.GET["ack"] == "deleted_dir":
          return_dict['ack_message'] = "Directory successfully deleted"
    users, err = local_users.get_local_users()
    if err:
      raise Exception('Error retrieving local user list : %s'%err)
    if not users:
      raise Exception('No local users seem to be created. Please create at least one local user before performing this operation.')

    groups, err = local_users.get_local_groups()
    if err:
      raise Exception('Error retrieving local group list : %s'%err)
    if not groups:
      raise Exception('No local groups seem to be created. Please create at least one local group before performing this operation.')

    pools, err = zfs.get_pools() 
    ds_list = [] 
    for pool in pools:
      for ds in pool["datasets"]:
        if ds['properties']['type']['value'] == 'filesystem':
          ds_list.append(ds["name"])
    if not ds_list:
      raise Exception('No ZFS datasets available. Please create a dataset before creating shares.')

    if 'path' not in request.REQUEST:
      path = "/"+pools[0]["datasets"][0]["name"]
    else:
      path = request.REQUEST['path']
    try:
      stat_info = os.stat(path)
    except Exception, e:
      raise Exception('Error accessing specified path : %s'%str(e))
    uid = stat_info.st_uid
    gid = stat_info.st_gid
    username = pwd.getpwuid(uid)[0]
    grpname = grp.getgrgid(gid)[0]
    return_dict["username"] = username
    return_dict["grpname"] = grpname

    aces, err = acl.get_all_aces(path)
    if err:
      raise Exception(err)
    minimal_aces, err = acl.get_minimal_aces(aces)
    if err:
      raise Exception(err)
    user_aces, err = acl.get_ug_aces(aces, None, 'user')
    if err:
      raise Exception(err)
    group_aces, err = acl.get_ug_aces(aces, None, 'group')
    if err:
      raise Exception(err)

    return_dict['aces'] = aces
    return_dict['minimal_aces'] = minimal_aces
    if user_aces:
      return_dict['user_aces'] = user_aces
    if group_aces:
      return_dict['group_aces'] = group_aces
    
    return_dict['path'] = path
    return_dict["dataset"] = ds_list
    if request.method == "GET":
      # Shd be an edit request
  
      # Set initial form values
      initial = {}
      initial['path'] = path
      initial['owner_read'] = _owner_readable(stat_info)
      initial['owner_write'] = _owner_writeable(stat_info)
      initial['owner_execute'] = _owner_executeable(stat_info)
      initial['group_read'] = _group_readable(stat_info)
      initial['group_write'] = _group_writeable(stat_info)
      initial['group_execute'] = _group_executeable(stat_info)
      initial['other_read'] = _other_readable(stat_info)
      initial['other_write'] = _other_writeable(stat_info)
      initial['other_execute'] = _other_executeable(stat_info)
      if 'dataset' in request.GET:
        initial['dataset'] = request.GET['dataset']
  
      form = folder_management_forms.SetFileOwnerAndPermissionsForm(initial = initial, user_list = users, group_list = groups)
  
      return_dict["form"] = form
      return django.shortcuts.render_to_response('modify_dir_permissions.html', return_dict, context_instance=django.template.context.RequestContext(request))
  
    elif request.method == "POST":
      path = request.POST.get("path")
      # Shd be an save request
      if request.POST.get("action") == "add_folder":
        folder_name = request.POST.get("new_folder_name")
        directory = path +"/"+folder_name
        if not os.path.exists(directory):
          os.makedirs(directory)
          audit_str = "Creating %s" %directory
          audit.audit("modify_dir_owner_permissions", audit_str, request.META)
      elif request.POST.get("action") == "delete_folder":
        delete = "false"
        if len(path.split("/")) > 2:
          delete = "true"
        # Need to also check if the path is a share or not. If share, dont delete again.
        # Checking NFS
        exports,err = nfs.load_exports_list()
        if exports:
          for export in exports: 
            print id(export["path"]),id(path)
            if export["path"] == path:
              delete = "false"
              break
            else: 
              delete = "true"
              
        if delete:
          print delete
          #shutil.rmtree(path,ignore_errors=True)
          audit_str = "Deleting directory %s" %path
          audit.audit("modify_dir_owner_permissions", audit_str, request.META)
        else:
          raise Exception("Cannot delete folder. It is either a dataset of a share")
      else:
        form = common_forms.SetFileOwnerAndPermissionsForm(request.POST, user_list = users, group_list = groups)
        return_dict["form"] = form
        if form.is_valid():
          cd = form.cleaned_data
          ret, err = file_processing.set_dir_ownership_and_permissions(cd)
          if not ret:
            if err:
              raise Exception(err)
            else:
              raise Exception("Error setting directory ownership/permissions.")
  
          audit_str = "Modified directory ownsership/permissions for %s"%cd["path"]
          audit.audit("modify_dir_owner_permissions", audit_str, request.META)
  
      return django.http.HttpResponseRedirect('/modify_dir_permissions/?ack=set_permissions')
  
    else:
      return django.shortcuts.render_to_response('modify_dir_permissions.html', return_dict, context_instance=django.template.context.RequestContext(request))
def set_file_owner_and_permissions(request):
  return_dict = {}
  try:
    if 'path' not in request.REQUEST:
      raise Exception('Path not specified')
    path = request.REQUEST['path']

    users, err = local_users.get_local_users()
    if err:
      raise Exception('Error retrieving local user list : %s'%err)
    if not users:
      raise Exception('No local users seem to be created. Please create at least one local user before performing this operation.')

    groups, err = local_users.get_local_groups()
    if err:
      raise Exception('Error retrieving local group list : %s'%err)
    if not groups:
      raise Exception('No local groups seem to be created. Please create at least one local group before performing this operation.')

    try:
      stat_info = os.stat(path)
    except Exception, e:
      raise Exception('Error accessing specified path : %s'%str(e))
    uid = stat_info.st_uid
    gid = stat_info.st_gid
    username = pwd.getpwuid(uid)[0]
    grpname = grp.getgrgid(gid)[0]
    return_dict["username"] = username
    return_dict["grpname"] = grpname


    if request.method == "GET":
      # Shd be an edit request
  
      # Set initial form values
      initial = {}
      initial['path'] = path
      initial['owner_read'] = _owner_readable(stat_info)
      initial['owner_write'] = _owner_writeable(stat_info)
      initial['owner_execute'] = _owner_executeable(stat_info)
      initial['group_read'] = _group_readable(stat_info)
      initial['group_write'] = _group_writeable(stat_info)
      initial['group_execute'] = _group_executeable(stat_info)
      initial['other_read'] = _other_readable(stat_info)
      initial['other_write'] = _other_writeable(stat_info)
      initial['other_execute'] = _other_executeable(stat_info)
  
      form = common_forms.SetFileOwnerAndPermissionsForm(initial = initial, user_list = users, group_list = groups)
  
      return_dict["form"] = form
      return django.shortcuts.render_to_response('set_file_owner_and_permissions.html', return_dict, context_instance=django.template.context.RequestContext(request))
  
    else:
  
      # Shd be an save request
      form = common_forms.SetFileOwnerAndPermissionsForm(request.POST, user_list = users, group_list = groups)
      return_dict["form"] = form
      if form.is_valid():
        cd = form.cleaned_data
        ret, err = file_processing.set_dir_ownership_and_permissions(cd)
        if not ret:
          if err:
            raise Exception(err)
          else:
            raise Exception("Error setting directory ownership/permissions.")
  
        audit_str = "Modified directory ownsership/permissions for %s"%cd["path"]
        audit.audit("modify_dir_owner_permissions", audit_str, request.META["REMOTE_ADDR"])
  
        return django.http.HttpResponseRedirect('/view_zfs_pools?action=set_permissions')
  
      else:
        #Invalid form
        return django.shortcuts.render_to_response('set_file_owner_and_permissions.html', return_dict, context_instance=django.template.context.RequestContext(request))