Example #1
0
def status():
    d = {}
    try:
        zfs_ver, err = zfs_version()
        if err:
            raise Exception(err)
        d["zfs_version"] = zfs_ver

        os_ver = '%s %s' % (platform.system(), platform.release())
        d["os_version"] = os_ver

        dis, err = disk_info_and_status()
        if err:
            raise Exception(err)
        d["disks"] = dis

        services_stat, err = services_status()
        if err:
            raise Exception(err)
        d["services"] = services_stat

        iface_status, err = interface_status()
        if err:
            raise Exception(err)
        d["interfaces"] = iface_status

        pl, err = zfs.get_pools()
        if err:
            raise Exception(err)
        d["pools"] = pl

        lavg, err = load_avg()
        if err:
            raise Exception(err)
        d["load_avg"] = lavg

        meminfo, err = mem_info()
        if err:
            raise Exception(err)
        d["memory"] = meminfo

        ipmi, err = ipmi_status()
        if ipmi:
            d["ipmi_status"] = ipmi

        cm, err = cpu_model()
        if err:
            raise Exception(err)
        d["cpu_model"] = cm

        fqdn = socket.getfqdn()
        d["fqdn"] = fqdn

        hardware_dict, err = get_hardware_specific_info()
        if err:
            raise Exception(err)
        d["hardware_specific_dict"] = hardware_dict

    except Exception, e:
        return None, 'Error retrieving system status: %s' % str(e)
def disk_info_and_status():

  all_disks, err = disks.get_disk_info_all()
  if not disks:
    return None

  pool_list, err = zfs.get_pools()
  if pool_list:
    for sn, disk in all_disks.items():
      id = disk['id']
      found = False
      for pool in pool_list:
        if 'config' in pool and pool['config']:
         for sname, section in pool['config'].items():
          if not section:
            continue
          if ('components' not in section) or (not section['components']):
            continue
          for cname, component in section['components'].items():
            if 'type' in component and component['type'] == 'device' and component['name'] == id:
              disk['pool'] = pool['pool_name']
              found = True
              break
          if found:
            break
        if found:
          break
  return all_disks
Example #3
0
def pool_status():
    pl = None
    try:
        pl, err = zfs.get_pools()
        if err:
            raise Exception(err)
    except Exception, e:
        return None, 'Error retrieving pool status : %s' % str(e)
def delete_dir(request):
  return_dict = {}
  try:
    if 'path' not in request.REQUEST:
      raise Exception('Invalid request. Please use the menus')
    path = request.REQUEST['path']
    pools, err = zfs.get_pools() 
    ds_list = [] 
    for pool in pools:
      if pool['properties']['mountpoint']['value'] == path:
        raise Exception('The selected directory is the mountpoint of a pool and so cannot be deleted.')
      for ds in pool["datasets"]:
        if ds['properties']['type']['value'] == 'filesystem':
          if ds['properties']['mountpoint']['value'] == path:
            raise Exception('The selected directory is the mountpoint of a dataset and so cannot be deleted.')
    if request.method == "GET":
      if 'path' not in request.GET:
        raise Exception('No directory specified')
      initial = {}
      initial['path'] = request.GET['path']
      form = folder_management_forms.DirForm(initial=initial)
      return_dict['form'] = form
      return django.shortcuts.render_to_response('delete_dir_conf.html', return_dict, context_instance=django.template.context.RequestContext(request))
    else:
      form = folder_management_forms.DirForm(request.POST)
      if form.is_valid():
        cd = form.cleaned_data
        path = cd['path']
        if not os.path.exists(path):
          raise Exception('The specified directory does not exist!')

        if len(path.split("/")) < 2:
          raise Exception('Cannot delete specified directory - Invalid path')

        # 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:
              raise Exception('Cannot delete the specified directory as it is path of an NFS share')
              
        shutil.rmtree(path,ignore_errors=True)
        audit_str = "Deleted directory '%s'" %path
        audit.audit("delete_dir", audit_str, request.META)

        return django.http.HttpResponseRedirect('/dir_manager/?ack=deleted_dir')
      else:
        raise Exception('Could not delete the specified directory as there was an error in the specified parameters.')
  except Exception, e:
    return_dict['base_template'] = "storage_base.html"
    return_dict["page_title"] = 'Delete a directory'
    return_dict['tab'] = 'dir_permissions_tab'
    return_dict["error"] = 'Error deleting directory'
    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 dir_manager(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"
        elif request.GET["ack"] == "modified_ownership":
          return_dict['ack_message'] = "Directory ownership successfully modified"

    initial = {}
    if 'pool' in request.REQUEST:
      pool = request.REQUEST['pool']
      initial['pool'] = pool

    pools, err = zfs.get_pools() 
    pool_list = []
    for pool in pools:
      #print pool['pool_name']
      pool_list.append(pool['pool_name'])
    if not pool_list:
      raise Exception('No ZFS pools available. Please create a pool and dataset before using the directory manager.')


    form = folder_management_forms.DirManagerForm1(initial = initial, pool_list = pool_list)
    return_dict["form"] = form
    return django.shortcuts.render_to_response('dir_manager.html', return_dict, context_instance=django.template.context.RequestContext(request))
  except Exception, e:
    return_dict['base_template'] = "shares_base.html"
    return_dict["page_title"] = 'Directory manager'
    return_dict['tab'] = 'dir_manager_tab'
    return_dict["error"] = 'Error loading directory manager'
    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_nfs_share(request):
  return_dict = {}
  try:
    pools, err = zfs.get_pools()
    if err:
      raise Exception(err)

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

    if request.method == "GET":
      #Return the conf page
      form = nfs_shares_forms.CreateShareForm(dataset_list = ds_list)
      return_dict['form'] = form
      return django.shortcuts.render_to_response("create_nfs_share.html", return_dict, context_instance = django.template.context.RequestContext(request))
    else:
      form = nfs_shares_forms.CreateShareForm(request.POST, dataset_list = ds_list)
      path = request.POST.get("path")
      return_dict['form'] = form
      if not form.is_valid():
        return django.shortcuts.render_to_response("create_nfs_share.html", return_dict, context_instance = django.template.context.RequestContext(request))
      cd = form.cleaned_data
      result, err = nfs.save_share(cd, True)
      if err:
        raise Exception(err)
 
      audit_str = "Created NFS share %s"%path
      audit.audit("create_nfs_share", audit_str, request.META["REMOTE_ADDR"])
      return django.http.HttpResponseRedirect('/view_nfs_shares?action=created')
  except Exception, e:
    return_dict['base_template'] = "networking_base.html"
    return_dict["page_title"] = 'Create a NFS share '
    return_dict['tab'] = 'view_nfs_shares_tab'
    return_dict["error"] = 'Error creating a NFS share'
    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))
Example #7
0
def disk_info_and_status():

    all_disks = None
    try:
        all_disks, err = disks.get_disk_info_all()
        if err:
            raise Exception(err)

        if all_disks:
            pool_list, err = zfs.get_pools()
            if pool_list:
                for sn, disk in all_disks.items():
                    id = disk['id']
                    found = False
                    for pool in pool_list:
                        devices_list, err = zfs.get_disks_in_component(
                            pool['config']['pool']['root'])
                        if err:
                            raise Exception(err)
                        if devices_list and id in devices_list:
                            disk['pool'] = pool['pool_name']
    except Exception, e:
        return None, 'Error retrieving disk information and status : %s' % str(
            e)
def create_cifs_share(request):

  return_dict = {}
  try:

    pools, err = zfs.get_pools()
    if err:
      raise Exception('No ZFS pools available. Please create a pool and dataset before creating shares.')

    ds_list = [] 
    for pool in pools:
      for ds in pool["datasets"]:
        if ds['properties']['type']['value'] == 'filesystem':
          ds_list.append((ds['properties']['mountpoint']['value'], ds["name"]))

    if not ds_list:
      raise Exception('No ZFS datasets available. Please create a dataset before creating shares.')
  
    if 'dataset' in request.REQUEST:
      dataset = request.REQUEST['dataset']
    else:
      dataset = ds_list[0][0]

    if 'path' in request.REQUEST:
      path = request.REQUEST['path']
    else:
      path = dataset

    return_dict['path'] = path
    return_dict["dataset"] = ds_list

    initial = {}
    initial['path'] = path
    initial['dataset'] = dataset
    if request.method == "GET":
      #Return the form
      initial['guest_ok'] = True
      if 'name' in request.GET:
        initial['name'] = request.GET['name']

      #form = samba_shares_forms.CreateShareForm(user_list = user_list, group_list = group_list, dataset_list = ds_list, initial = {'guest_ok': True})
      form = samba_shares_forms.CreateShareForm(dataset_list = ds_list, initial = initial)
      return_dict["form"] = form

      return django.shortcuts.render_to_response("create_cifs_share.html", return_dict, context_instance = django.template.context.RequestContext(request))
    else:
      #Form submission so create
      return_dict = {}
      #form = samba_shares_forms.CreateShareForm(request.POST, user_list = user_list, group_list = group_list, dataset_list = ds_list)
      form = samba_shares_forms.CreateShareForm(request.POST, initial = initial, dataset_list = ds_list)
      return_dict["form"] = form
      if form.is_valid():
        cd = form.cleaned_data
        print cd
        name = cd["name"]
        path = cd["path"]
        if not path:
          return_dict["path_error"] = "Please select a dataset."
          return django.shortcuts.render_to_response("create_cifs_share.html", return_dict, context_instance = django.template.context.RequestContext(request))
        if 'new_folder' in cd and cd['new_folder']:
          try:
            path = '%s/%s'%(cd['path'], cd['new_folder'])
            #print path
            os.mkdir(path)
            audit_str = 'Created new directory "%s" in "%s"'%(cd['new_folder'], cd['path'])
            audit.audit("create_dir", audit_str, request.META)
          except Exception, e:
            raise Exception('Error creating subfolder %s : %s'%(cd['new_folder'], str(e)))
        os.chown(path,1000,1000)

        if "comment" in cd:
          comment = cd["comment"]
        else:
          comment = None
        if "read_only" in cd:
          read_only = cd["read_only"]
        else:
          read_only = None
        if "browseable" in cd:
          browseable = cd["browseable"]
        else:
          browseable = None

        '''
        if "guest_ok" in cd:
          guest_ok = cd["guest_ok"]
        else:
          guest_ok = None
        if "users" in cd:
          users = cd["users"]
        else:
          users = None
        if "groups" in cd:
          groups = cd["groups"]
        else:
          groups = None
        '''

        guest_ok = True
        #logger.debug("Create share request, name %s path %s, comment %s, read_only %s, browseable %s, guest_ok %s, users %s, groups %s, vol %s"%(name, path, comment, read_only, browseable, guest_ok, users, groups))
        #print '1'
        ret, err = cifs_common.create_share(name, comment, True, read_only, path, path, browseable, None, None, "unicell_novol")
        #print '2'
        if err:
          raise Exception(err)
        ret, err = cifs_unicell.generate_smb_conf()
        #print '3'
        if err:
          raise Exception(err)
  
        audit_str = "Created Samba share %s"%name
        audit.audit("create_cifs_share", audit_str, request.META)
        return django.http.HttpResponseRedirect('/view_cifs_shares?ack=created')
      else:
def load_system_config(first_time=False):

    d = None
    try:
        if first_time:
            system_status_path, err = common.get_tmp_path()
            if err:
                raise Exception(err)
        else:
            system_status_path, err = common.get_system_status_path()
            if err:
                raise Exception(err)

        msfn = "%s/master.status" % system_status_path
        mmfn = "%s/master.manifest" % system_status_path

        with open(msfn, "r") as f:
            ms_nodes = json.load(f)
        with open(mmfn, "r") as f:
            mm_nodes = json.load(f)

        d = {}
        # First load it with the master node keys
        for k in mm_nodes.keys():
            d[k] = mm_nodes[k]

        for k in d.keys():
            if k not in ms_nodes:
                continue
            status_node = ms_nodes[k]
            for sk in status_node.keys():
                if sk not in d[k]:
                    d[k][sk] = status_node[sk]
                elif sk == "disks":
                    for disk in status_node["disks"].keys():
                        if disk in d[k]["disks"]:
                            d[k]["disks"][disk].update(
                                status_node["disks"][disk])
                    pool_list, err = zfs.get_pools()
                    if pool_list:
                        for sn, disk in d[k]['disks'].items():
                            id = disk['id']
                            found = False
                            for pool in pool_list:
                                devices_list, err = zfs.get_disks_in_component(
                                    pool['config']['pool']['root'])
                                if err:
                                    raise Exception(err)
                                if devices_list and id in devices_list:
                                    disk['pool'] = pool['pool_name']
                        '''
            else:
              d[k]["disks"][disk] = status_node["disks"][disk]
            '''
                elif sk == "interfaces":
                    for interface in status_node["interfaces"].keys():
                        if interface in d[k]["interfaces"]:
                            d[k]["interfaces"][interface].update(
                                status_node["interfaces"][interface])
                        '''
            else:
              d[k]["interfaces"][interface] = status_node["interfaces"][interface]
            '''
                elif sk == "memory":
                    for mem_key in status_node["memory"].keys():
                        if mem_key not in d[k]["memory"]:
                            d[k]["memory"][mem_key] = status_node["memory"][
                                mem_key]

    except Exception, e:
        return None, 'Error loading system configuration : %s' % str(e)
def dir_contents(request):
  dir_dict_list = []
  first = request.GET.get("first")
  if first:
    src = request.GET['from']
    if src == 'dataset':
      if 'dataset_name' not in request.GET:
        raise Exception('No dataset supplied')        
      ds_name = request.GET['dataset_name']
      mnt_pnt = '/%s'%ds_name
      dirs = []
      if os.path.isdir(mnt_pnt):
        dirs = os.listdir(mnt_pnt)
      if not dirs:
        d_dict = {'id':mnt_pnt, 'text':'/','icon':'fa','children':False,'data':{'dir':mnt_pnt},'parent':"#"}
        dir_dict_list.append(d_dict)
      for dir in dirs:
        if os.path.isdir('%s/%s'%(mnt_pnt, dir)):
          subdirs, err = _has_subdirs('%s/%s'%(mnt_pnt, dir))
          if err:
            raise Exception(err)
          #subdirs = os.listdir('%s/%s'%(mnt_pnt, dir))
          if subdirs:
            d_dict = {'id':'%s/%s'%(mnt_pnt,dir), 'text':dir,'icon':'fa fa-angle-right','children':True,'data':{'dir':'%s/%s'%(mnt_pnt, dir)},'parent':"#"}
          else:
            d_dict = {'id':'%s/%s'%(mnt_pnt,dir), 'text':dir,'icon':'fa','children':False,'data':{'dir':'%s/%s'%(mnt_pnt, dir)},'parent':"#"}
          dir_dict_list.append(d_dict)
    elif src == 'pool':
      if 'pool_name' not in request.GET:
        pools, err = zfs.get_pools()
        if err:
          raise Exception(err)
        p = pools[0]
      else:
        pool = request.GET['pool_name']
        p, err = zfs.get_pool(pool)
        if err:
          raise Exception(err)
      dir_dict_list = []
      for ds in p["datasets"]:
        if ds['properties']['type']['value'] == 'filesystem':
          mnt_pnt = ds['properties']['mountpoint']['value']
          #subdirs = os.listdir(mnt_pnt)
          subdirs, err = _has_subdirs(mnt_pnt)
          if err:
            raise Exception(err)
          name = os.path.basename(mnt_pnt)
          if subdirs:
            d_dict = {'id':mnt_pnt, 'text':name,'icon':'fa fa-angle-right','children':True,'data':{'dir':mnt_pnt},'parent':"#"}
          else:
            d_dict = {'id':mnt_pnt, 'text':name,'icon':'fa','children':False,'data':{'dir':mnt_pnt},'parent':"#"}
          dir_dict_list.append(d_dict)
  else:
    if 'dir' in request.GET and request.GET['dir'] != '/':
      path = request.GET['dir']
    else:
      path = request.GET.get("pool_name")
    dirs = os.listdir(path)
    #print 'path ', path
    for d in dirs:
      #print 'dir', d
      true = True
      if os.path.isdir(path+"/"+d):
        parent = path
        subdirs, err = _has_subdirs('%s/%s'%(path, d))
        if err:
          raise Exception(err)
        '''
        contents = os.listdir('%s/%s'%(path, d))
        subdirs = False
        for content in contents:
          if os.path.isdir('%s/%s/%s'%(path,d, content)):
            subdirs = True
            break
        '''
        #print 'subdirs ', subdirs
        if subdirs:
          #print 'yes'
          d_dict = {'id':path+"/"+d, 'text':d,'icon':'fa fa-angle-right','children':True,'data':{'dir':path+"/"+d},'parent':parent}
        else:
          #print 'no'
          d_dict = {'id':path+"/"+d, 'text':d,'icon':'fa','children':False,'data':{'dir':path+"/"+d},'parent':parent}
      	dir_dict_list.append(d_dict)
  return HttpResponse(json.dumps(dir_dict_list),content_type='application/json')

  '''
Example #11
0
        return_dict["disk_new"] = disk_new



    elif page == "dashboard":
      num_nodes_bad = 0
      total_pool = 0
      total_nodes = len(si)
      nodes = {}

      for k, v in si.items():
        nodes[k] = v["node_status"]
        if v["node_status"] != 0:
          num_nodes_bad += 1
          
      pools, err = zfs.get_pools()
      if pools:
        return_dict["pools"] = pools            
      return_dict["num_nodes_bad"] = num_nodes_bad            
      return_dict["total_nodes"] = total_nodes            
      return_dict["nodes"] = nodes            
      template = "view_dashboard.html"

    elif page == "alerts":

      template = "view_alerts.html"
      alerts_list = alerts.load_alerts()
      return_dict['alerts_list'] = alerts_list


    return django.shortcuts.render_to_response(template, return_dict, context_instance=django.template.context.RequestContext(request))
def configure_ftp(request):
    return_dict = {}
    try:
        config, err = vsftp.get_ftp_config()
        if err:
            raise Exception(err)
        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"])
        cert_list, err = certificates.get_certificates()
        if err:
            raise Exception(err)
        cert_name_list = []
        for cert in cert_list:
            cert_name_list.append(cert['name'])
        #print ds_list
        if not ds_list:
            raise Exception(
                'No ZFS datasets available. Please create a dataset before configuring the FTP service.'
            )

        if request.method == 'GET':
            initial = {}
            if config:
                for key in config.keys():
                    initial[key] = config[key]
            form = ftp_management_forms.ConfigureFTPForm(
                datasets=ds_list, cert_names=cert_name_list, initial=initial)
            return_dict['form'] = form
            return django.shortcuts.render_to_response(
                'configure_ftp.html',
                return_dict,
                context_instance=django.template.context.RequestContext(
                    request))
        else:
            form = ftp_management_forms.ConfigureFTPForm(
                request.POST, cert_names=cert_name_list, datasets=ds_list)
            return_dict['form'] = form
            if not form.is_valid():
                return django.shortcuts.render_to_response(
                    "configure_ftp.html",
                    return_dict,
                    context_instance=django.template.context.RequestContext(
                        request))
            cd = form.cleaned_data
            ret, err = vsftp.update_ftp_config(cd)
            if err:
                raise Exception(err)
            users, err = local_users.get_local_users()
            if err:
                raise Exception(err)
            ret, err = vsftp.create_ftp_user_dirs(cd['dataset'], users)
            if err:
                raise Exception(err)
            audit_str = 'Updated FTP configuration.'
            if cd['ssl_enabled']:
                audit_str = audit_str + ' SSL enabled with certificate %s' % cd[
                    'cert_name']
            else:
                audit_str = audit_str + ' SSL disabled.'
            ret, err = audit.audit("update_ftp_config", audit_str,
                                   request.META)
            return django.http.HttpResponseRedirect(
                '/view_ftp_configuration?ack=saved')
    except Exception, e:
        return_dict['base_template'] = "services_base.html"
        return_dict["page_title"] = 'Configure FTP service'
        return_dict['tab'] = 'ftp_service_settings'
        return_dict["error"] = 'Error configuring the FTP service '
        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 pool_status():
  pl, err = zfs.get_pools()
  return pl
def dashboard(request,page):
  return_dict = {}
  try:
    if request.method != 'GET':
      raise Exception('Invalid access method. Please use the menus')
    si, err = system_info.load_system_config()
    if err:
      raise Exception(err)
    if not si:
      raise Exception('Error loading system configuration')
    return_dict['system_info'] = si
    #By default show error page
    template = "logged_in_error.html"
    num_nodes_bad = 0
    total_pool = 0
    total_nodes = len(si)
    nodes = {}
    # Chart specific declarations
    today_day = (datetime.date.today()).strftime('%d') # will return 02, instead of 2.
    #today_day = datetime.datetime.today().day
    #if today_day < 10:
    #  today_day = '0%d'%today_day
    value_list = []
    time_list = []
    use_salt, err = common.use_salt()
    if err:
      raise Exception(err)
        
    ks = si.keys()
    if not ks:
      raise Exception('System configuration invalid')
    info = ks[0]
    # CPU status
    if page == "cpu":
      return_dict["page_title"] = 'CPU statistics'
      return_dict['tab'] = 'cpu_tab'
      return_dict["error"] = 'Error loading CPU statistics'
      cpu,err = stats.get_system_stats(today_day,"cpu")
      if err:
        raise Exception(err)
      value_dict = {}
      if cpu:
        for key in cpu.keys():
          value_list = []
          time_list = []
          if key == "date":
            pass
          else:
            if cpu[key]:
              for a in cpu[key]:
                time_list.append(a[0])
                value_list.append(a[1])
            value_dict[key] = value_list
      return_dict["data_dict"] = value_dict
      queue,err = stats.get_system_stats(today_day,"queue")
      if err:
        raise Exception(err)
      value_dict = {}
      if queue:
        for key in queue.keys():
          value_list = []
          time_list = []
          if key == "date":
            pass
          else:
            for a in queue[key]:
              time_list.append(a[0])
              value_list.append(a[1])
            value_dict[key] = value_list
      return_dict["data_dict_queue"] = value_dict
      return_dict['node_name'] = info
      return_dict['node'] = si[info]
      d = {}
      template = "view_cpu_status.html"
    # Hardware
    elif page == "hardware":
      return_dict["page_title"] = 'Hardware status'
      return_dict['tab'] = 'hardware_tab'
      return_dict["error"] = 'Error loading hardware status'
      d = {}
      d['ipmi_status'] = si[info]['ipmi_status']
      return_dict['hardware_status'] =  d
      return_dict['node_name'] = info
      template = "view_hardware_status.html"
    # Memory
    elif page == "memory":
      return_dict["page_title"] = 'Memory statistics'
      return_dict['tab'] = 'memory_tab'
      return_dict["error"] = 'Error loading memory statistics'
      mem,err = stats.get_system_stats(today_day,"memory")
      if err:
        raise Exception(err)
      if mem:
        for a in mem["memfree"]:
          time_list.append(a[0])
          value_list.append(a[1])
      return_dict['memory_status'] =  si[info]['memory']
      template = "view_memory_status.html"
    # Network
    elif page == "network":
      return_dict["page_title"] = 'Network statistics'
      return_dict['tab'] = 'network_tab'
      return_dict["error"] = 'Error loading Network statistics'
      network,err = stats.get_system_stats(today_day,"network")
      if err:
        raise Exception(err)
      value_dict = {}
      if network:
        for key in network.keys():
          value_list = []
          time_list = []
          if key == "date" or key == "lo":
            pass
          else:
            for a in network[key]["ifutil-percent"]:
              time_list.append(a[0])
              value_list.append(a[1])
            value_dict[key] = value_list
          
      return_dict["data_dict"] = value_dict
      print si[info]["interfaces"]
      return_dict["network_status"] = si[info]['interfaces']
      template = "view_network_status.html"
    # Services
    elif page == "services":
      return_dict["page_title"] = 'System services status'
      return_dict['tab'] = 'services_tab'
      return_dict["error"] = 'Error loading system services status'
      return_dict['services_status'] = {}
      if use_salt:
        import salt.client
        client = salt.client.LocalClient()
        winbind = client.cmd(info,'cmd.run',['service winbind status'])
        smb = client.cmd(info,'cmd.run',['service smb status'])
        nfs = client.cmd(info,'cmd.run',['service nfs status'])
        iscsi = client.cmd(info,'cmd.run',['service tgtd status'])
        ntp = client.cmd(info,'cmd.run',['service ntpd status'])
        return_dict['services_status']['winbind'] = winbind[info]
        return_dict['services_status']['smb'] = smb[info]
        return_dict['services_status']['nfs'] = nfs[info]
        return_dict['services_status']['iscsi'] = iscsi[info]
        return_dict['services_status']['ntp'] = ntp[info]
      else:
        out_list, err = command.get_command_output('service winbind status', False)
        if err:
          raise Exception(err)
        if out_list:
          return_dict['services_status']['winbind'] = ' '.join(out_list)
  
        out_list, err = command.get_command_output('service smb status', False)
        if err:
          raise Exception(err)
        if out_list:
          return_dict['services_status']['smb'] = ' '.join(out_list)
  
        out_list, err = command.get_command_output('service nfs status', False)
        if err:
          raise Exception(err)
        if out_list:
          return_dict['services_status']['nfs'] = ' '.join(out_list)
  
        out_list, err = command.get_command_output('service tgtd status', False)
        if err:
          raise Exception(err)
        if out_list:
          return_dict['services_status']['iscsi'] = ' '.join(out_list)
  
        out_list, err = command.get_command_output('service ntpd status', False)
        if err:
          raise Exception(err)
        if out_list:
          return_dict['services_status']['ntp'] = ' '.join(out_list)
          
      template = "view_services_status.html"
    # Disks
    elif page == "disks":
      return_dict["page_title"] = 'Hard drives status'
      return_dict['tab'] = 'disk_tab'
      return_dict["error"] = 'Error loading hard drives status'
      sorted_disks = []
      if 'disks' in si[info] and si[info]['disks']:
        for key,value in sorted(si[info]["disks"].iteritems(), key=lambda (k,v):v["position"]):
          sorted_disks.append(key)
      return_dict['node'] = si[info]
      return_dict["disk_status"] = si[info]['disks']
      return_dict["disk_pos"] = sorted_disks
      return_dict['node_name'] = info
      template = "view_disks_status.html"
    # Pools
    elif page == "pools":
      return_dict["page_title"] = 'ZFS pools status'
      return_dict['tab'] = 'pools_tab'
      return_dict["error"] = 'Error loading ZFS pools status'
      pools, err = zfs.get_pools()
      if err:
        raise Exception(err)
      if pools:
        return_dict['pools'] = pools            
      template = "view_pools_status.html"
    return_dict["labels"] = time_list
    return_dict["data"] = value_list
    return django.shortcuts.render_to_response(template, return_dict, context_instance=django.template.context.RequestContext(request))
  except Exception, e:
    return_dict['base_template'] = "dashboard_base.html"
    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))
Example #15
0
def create_rsync_share(request):
    return_dict = {}
    try:
        pools, err = zfs.get_pools()
        if err:
            raise Exception(err)

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

        if request.method == "GET":
            form = rsync_forms.CreateShareForm(dataset_list=ds_list)
            return_dict['form'] = form
            return django.shortcuts.render_to_response(
                "create_rsync_share.html",
                return_dict,
                context_instance=django.template.context.RequestContext(
                    request))
        else:
            form = rsync_forms.CreateShareForm(request.POST,
                                               dataset_list=ds_list)
            path = request.POST.get("path")
            if not os.path.exists(path):
                os.mkdir(path)
            os.chown(path, 1000, 1000)
            return_dict['form'] = form
            if not form.is_valid():
                return django.shortcuts.render_to_response(
                    "create_rsync_share.html",
                    return_dict,
                    context_instance=django.template.context.RequestContext(
                        request))
            cd = form.cleaned_data
            result, err = rsync.create_rsync_share(
                cd["name"], cd["path"], cd["comment"], cd["browsable"],
                cd["readonly"], "integralstor", "integralstor")
            if err:
                raise Exception(err)
            audit_str = "Created RSYNC share with name '%s'. The share is set to be %s and %s" % (
                cd["name"],
                "Browsable" if cd["browsable"] else "Not Browsable",
                "Readonly" if cd["readonly"] else "Read/Write")
            audit.audit("create_rsync_share", audit_str, request.META)
            return django.http.HttpResponseRedirect(
                '/view_rsync_shares/?ack=created')
    except Exception, e:
        return_dict['base_template'] = "shares_base.html"
        return_dict["page_title"] = 'RSync shares'
        return_dict['tab'] = 'view_rsync_shares_tab'
        return_dict["error"] = 'Error creating RSync shares'
        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))
Example #16
0
def create_nfs_share(request):
    return_dict = {}
    try:
        pools, err = zfs.get_pools()
        if err:
            raise Exception(err)

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

        if 'dataset' in request.REQUEST:
            dataset = request.REQUEST['dataset']
        else:
            dataset = ds_list[0]['mountpoint']

        if 'path' in request.REQUEST:
            path = request.REQUEST['path']
        else:
            path = dataset

        return_dict['path'] = path
        return_dict["dataset"] = ds_list

        if request.method == "GET":
            #Return the conf page
            initial = {}
            initial['path'] = path
            initial['dataset'] = dataset
            form = nfs_shares_forms.CreateShareForm(initial=initial,
                                                    dataset_list=ds_list)
            return_dict['form'] = form
            return django.shortcuts.render_to_response(
                "create_nfs_share.html",
                return_dict,
                context_instance=django.template.context.RequestContext(
                    request))
        else:
            form = nfs_shares_forms.CreateShareForm(request.POST,
                                                    dataset_list=ds_list)
            return_dict['form'] = form
            if not form.is_valid():
                return django.shortcuts.render_to_response(
                    "create_nfs_share.html",
                    return_dict,
                    context_instance=django.template.context.RequestContext(
                        request))
            cd = form.cleaned_data
            if 'new_folder' in cd and cd['new_folder']:
                try:
                    os.mkdir('%s/%s' % (cd['path'], cd['new_folder']))
                    audit_str = 'Created new directory "%s" in "%s"' % (
                        cd['new_folder'], cd['path'])
                    audit.audit("create_dir", audit_str, request.META)
                    cd['path'] = '%s/%s' % (cd['path'], cd['new_folder'])
                except Exception, e:
                    raise Exception('Error creating subfolder %s : %s' %
                                    (cd['new_folder'], str(e)))
            result, err = nfs.save_share(cd, True)
            if err:
                raise Exception(err)

            audit_str = "Created NFS share %s" % cd['path']
            audit.audit("create_nfs_share", audit_str, request.META)
            return django.http.HttpResponseRedirect(
                '/view_nfs_shares?ack=created')
    except Exception, e:
        return_dict['base_template'] = "shares_base.html"
        return_dict["page_title"] = 'Create a NFS share '
        return_dict['tab'] = 'view_nfs_shares_tab'
        return_dict["error"] = 'Error creating a NFS share'
        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))
Example #18
0
def dashboard(request, page):
    return_dict = {}

    try:
        return_dict["page_title"] = 'Overall system health'
        return_dict['tab'] = 'system_health_tab'
        return_dict["error"] = 'Error loading system health data'

        if request.method != 'GET':
            raise Exception('Invalid access method. Please use the menus')
        si, err = system_info.load_system_config()
        if err:
            raise Exception(err)
        if not si:
            raise Exception('Error loading system configuration')

        node = si[si.keys()[0]]
        return_dict['node'] = node
        #print node.keys()

        #By default show error page
        template = "logged_in_error.html"

        # Chart specific declarations
        todays_date = (datetime.date.today()).strftime(
            '%02d')  # will return 02, instead of 2.
        start_hour = '%02d' % (datetime.datetime.today().hour - 3)
        end_hour = '%02d' % (datetime.datetime.today().hour)
        minute = '%02d' % (datetime.datetime.today().minute)
        start = str(start_hour) + ":" + str(minute) + str(":10")
        end = str(end_hour) + ":" + str(minute) + str(":40")

        value_list = []
        time_list = []
        use_salt, err = common.use_salt()
        if err:
            raise Exception(err)

        num_bad_disks = 0
        num_hw_raid_bad_disks = 0
        num_hw_raid_ctrl_disks = 0
        num_smart_ctrl_disks = 0
        num_disks = len(node['disks'])
        disks_ok = True
        disks_hw_ok = "N.A"
        for sn, disk in node['disks'].items():
            if 'status' in disk:
                if 'hw_raid' in disk:
                    if not disk['hw_raid']:
                        num_smart_ctrl_disks += 1
                        if (disk['status'] is not None
                                and disk['status'].upper()
                                not in ['PASSED', 'OK']):
                            num_bad_disks += 1
                            disks_ok = False
                    else:
                        num_hw_raid_ctrl_disks += 1
                        if (disk['status'] is not None
                                and disk['status'].upper() != 'OK'):
                            num_hw_raid_bad_disks += 1
                            disks_ok = False
                else:
                    #Assume its a non raid disk
                    num_smart_ctrl_disks += 1
                    if (disk['status'] is not None and disk['status'].upper()
                            not in ['PASSED', 'OK']):
                        num_bad_disks += 1
                        disks_ok = False

        return_dict['num_disks'] = num_disks
        return_dict['num_bad_disks'] = num_bad_disks
        return_dict['disks_ok'] = disks_ok
        #return_dict['disks_hw_ok'] = disks_hw_ok
        return_dict['num_hw_raid_bad_disks'] = num_hw_raid_bad_disks
        return_dict['num_hw_raid_ctrl_disks'] = num_hw_raid_ctrl_disks
        return_dict['num_smart_ctrl_disks'] = num_smart_ctrl_disks

        if 'ipmi_status' in node:
            num_sensors = len(node['ipmi_status'])
            num_bad_sensors = 0
            ipmi_ok = True
            for sensor in node['ipmi_status']:
                if sensor['status'] in ['ok', 'nr', 'na']:
                    continue
                else:
                    num_bad_sensors += 1
                    ipmi_ok = False
            return_dict['num_sensors'] = num_sensors
            return_dict['num_bad_sensors'] = num_bad_sensors
            return_dict['ipmi_ok'] = ipmi_ok

        #services_list =  ['winbind', 'smb', 'nfs', 'tgtd', 'ntpd', 'vsftpd']

        services_dict, err = services_management.get_sysd_services_status()
        if err:
            raise Exception(err)
        num_services = len(services_dict)
        num_failed_services = 0
        num_active_services = 0
        num_inactive_services = 0
        services_ok = True

        if services_dict:
            #service = services_dict.keys ()
            for service in services_dict.keys():
                if services_dict[service]["info"]["status"][
                        "status_str"] == "Active":
                    num_active_services += 1
                elif services_dict[service]["info"]["status"][
                        "status_str"] == "Inactive":
                    num_inactive_services += 1
                elif services_dict[service]["info"]["status"][
                        "status_str"] == "Failed":
                    num_failed_services += 1
                    services_ok = False
                elif services_dict[service]["info"]["status"][
                        "status_str"] == "Unknown State":
                    num_failed_services += 1
                    services_ok = False
            return_dict['num_services'] = num_services
            return_dict['num_active_services'] = num_active_services
            return_dict['num_inactive_services'] = num_inactive_services
            return_dict['num_failed_services'] = num_failed_services
            return_dict['services_ok'] = services_ok
        else:
            raise Exception('Fetched services status list is empty')

        pools, err = zfs.get_pools()
        if err:
            raise Exception(err)

        info = si.keys()[0]
        num_pools = len(pools)
        num_bad_pools = 0
        num_degraded_pools = 0
        num_high_usage = 0
        for pool in pools:
            if pool['usage']['capacity']['value'] > 75:
                num_high_usage += 1
            if pool['config']['pool']['root']['status']['state'] == 'ONLINE':
                pass
            elif pool['config']['pool']['root']['status'][
                    'state'] == 'DEGRADED':
                num_degraded_pools += 1
            else:
                num_bad_pools += 1
        return_dict['num_pools'] = num_pools
        return_dict['num_bad_pools'] = num_bad_pools
        return_dict['num_degraded_pools'] = num_degraded_pools
        return_dict['num_high_usage'] = num_high_usage

        load_avg_ok = True
        if (node["load_avg"]["5_min"] > node["load_avg"]["cpu_cores"]) or (
                node["load_avg"]["15_min"] > node["load_avg"]["cpu_cores"]):
            load_avg_ok = False
        return_dict['load_avg_ok'] = load_avg_ok

        shares_list, err = cifs_common.load_shares_list()
        if err:
            raise Exception(err)
        return_dict['num_cifs_shares'] = len(shares_list)

        exports_list, err = nfs.load_exports_list()
        if err:
            raise Exception(err)
        return_dict['num_nfs_exports'] = len(exports_list)

        target_list, err = iscsi_stgt.get_targets()
        if err:
            raise Exception(err)
        return_dict['num_iscsi_targets'] = len(target_list)

        with open('/proc/uptime', 'r') as f:
            uptime_seconds = float(f.readline().split()[0])
            uptime_str = '%s hours' % (':'.join(
                str(timedelta(seconds=uptime_seconds)).split(':')[:2]))
            return_dict['uptime_str'] = uptime_str

        # CPU status
        if page == "cpu":
            return_dict["page_title"] = 'CPU statistics'
            return_dict['tab'] = 'cpu_tab'
            return_dict["error"] = 'Error loading CPU statistics'
            cpu, err = stats.get_system_stats(todays_date, start, end, "cpu")
            if err:
                raise Exception(err)
            value_dict = {}
            if cpu:
                for key in cpu.keys():
                    value_list = []
                    time_list = []
                    if key == "date":
                        pass
                    else:
                        if cpu[key]:
                            for a in cpu[key]:
                                time_list.append(a[0])
                                value_list.append(a[1])
                        value_dict[key] = value_list
            return_dict["data_dict"] = value_dict
            queue, err = stats.get_system_stats(todays_date, start, end,
                                                "queue")
            if err:
                raise Exception(err)
            value_dict = {}
            if queue:
                for key in queue.keys():
                    value_list = []
                    time_list = []
                    if key == "date":
                        pass
                    else:
                        for a in queue[key]:
                            time_list.append(a[0])
                            value_list.append(a[1])
                        value_dict[key] = value_list
            return_dict["data_dict_queue"] = value_dict
            return_dict['node_name'] = info
            return_dict['node'] = si[info]
            d = {}
            template = "view_cpu_status.html"
        elif page == "dashboard":
            return_dict["page_title"] = 'Overall system health'
            return_dict['tab'] = 'system_health_tab'
            return_dict["error"] = 'Error loading system health data'
            template = "dashboard_system_health.html"
            hw_platform, err = common.get_hardware_platform()
            if hw_platform:
                return_dict['hw_platform'] = hw_platform
                if hw_platform == 'dell':
                    from integralstor_common.platforms import dell
                    idrac_url, err = dell.get_idrac_addr()
                    if idrac_url:
                        return_dict['idrac_url'] = idrac_url
        # Hardware
        elif page == "hardware":
            return_dict["page_title"] = 'Hardware status'
            return_dict['tab'] = 'hardware_tab'
            return_dict["error"] = 'Error loading hardware status'
            d = {}
            if 'ipmi_status' in si[info]:
                d['ipmi_status'] = si[info]['ipmi_status']
                return_dict['hardware_status'] = d
            return_dict['node_name'] = info
            template = "view_hardware_status.html"
        # Memory
        elif page == "memory":
            return_dict["page_title"] = 'Memory statistics'
            return_dict['tab'] = 'memory_tab'
            return_dict["error"] = 'Error loading memory statistics'
            mem, err = stats.get_system_stats(todays_date, start, end,
                                              "memory")
            if err:
                raise Exception(err)
            if mem:
                for a in mem["memused"]:
                    time_list.append(a[0])
                    value_list.append((a[1] / (1024 * 1024)))
            return_dict['memory_status'] = si[info]['memory']
            template = "view_memory_status.html"
        # Network
        elif page == "network":
            return_dict["page_title"] = 'Network statistics'
            return_dict['tab'] = 'network_tab'
            return_dict["error"] = 'Error loading Network statistics'
            network, err = stats.get_system_stats(todays_date, start, end,
                                                  "network")
            if err:
                raise Exception(err)
            value_dict = {}
            if network:
                for key in network.keys():
                    value_list = []
                    time_list = []
                    if key == "date" or key == "lo":
                        pass
                    else:
                        for a in network[key]["ifutil-percent"]:
                            time_list.append(a[0])
                            value_list.append(a[1])
                        value_dict[key] = value_list

            return_dict["data_dict"] = value_dict
            return_dict["network_status"] = si[info]['interfaces']
            template = "view_network_status.html"
        # Services
        elif page == "services":
            return_dict["page_title"] = 'System services status'
            return_dict['tab'] = 'services_tab'
            return_dict["error"] = 'Error loading system services status'
            return_dict['services_status'] = {}
            if use_salt:
                import salt.client
                client = salt.client.LocalClient()
                winbind = client.cmd(info, 'cmd.run',
                                     ['service winbind status'])
                smb = client.cmd(info, 'cmd.run', ['service smb status'])
                nfss = client.cmd(info, 'cmd.run', ['service nfs status'])
                iscsi = client.cmd(info, 'cmd.run', ['service tgtd status'])
                ntp = client.cmd(info, 'cmd.run', ['service ntpd status'])
                ftp = client.cmd(info, 'cmd.run', ['service vsftpd status'])
                return_dict['services_status']['winbind'] = winbind[info]
                return_dict['services_status']['smb'] = smb[info]
                return_dict['services_status']['nfs'] = nfss[info]
                return_dict['services_status']['iscsi'] = iscsi[info]
                return_dict['services_status']['ntp'] = ntp[info]
                return_dict['services_status']['ftp'] = ftp[info]
            else:
                """
        services_list, err = services_management.get_sysd_services_status ()
        if err:
          raise Exception (err)
        if services_list:
          #for service in services_list:
          return_dict['services_status'] = services_list  
        else:
          raise Exception ('Fetched services status list is empty')
        """

                out_list, err = command.get_command_output(
                    'service winbind status', False)
                if err:
                    raise Exception(err)
                if out_list:
                    return_dict['services_status']['winbind'] = ' '.join(
                        out_list)

                out_list, err = command.get_command_output(
                    'service smb status', False)
                if err:
                    raise Exception(err)
                if out_list:
                    return_dict['services_status']['smb'] = ' '.join(out_list)

                out_list, err = command.get_command_output(
                    'service nfs status', False)
                if err:
                    raise Exception(err)
                if out_list:
                    return_dict['services_status']['nfs'] = ' '.join(out_list)

                out_list, err = command.get_command_output(
                    'service tgtd status', False)
                if err:
                    raise Exception(err)
                if out_list:
                    return_dict['services_status']['iscsi'] = ' '.join(
                        out_list)

                out_list, err = command.get_command_output(
                    'service ntpd status', False)
                if err:
                    raise Exception(err)
                if out_list:
                    return_dict['services_status']['ntp'] = ' '.join(out_list)

                out_list, err = command.get_command_output(
                    'service vsftpd status', False)
                if err:
                    raise Exception(err)
                if out_list:
                    return_dict['services_status']['ftp'] = ' '.join(out_list)

            template = "view_services_status.html"
        # Disks
        elif page == "disks":
            return_dict["page_title"] = 'Hard drives status'
            return_dict['tab'] = 'disk_tab'
            return_dict["error"] = 'Error loading hard drives status'
            return_dict['node'] = si[info]
            return_dict["disk_status"] = si[info]['disks']
            #print si[info]['disks']
            return_dict['node_name'] = info
            template = "view_disks_status.html"
        # Pools
        elif page == "pools":
            return_dict["page_title"] = 'ZFS pools status'
            return_dict['tab'] = 'pools_tab'
            return_dict["error"] = 'Error loading ZFS pools status'
            pools, err = zfs.get_pools()
            if err:
                raise Exception(err)
            if pools:
                return_dict['pools'] = pools
            template = "view_pools_status.html"
        return_dict["labels"] = time_list
        return_dict["data"] = value_list
        return django.shortcuts.render_to_response(
            template,
            return_dict,
            context_instance=django.template.context.RequestContext(request))
    except Exception, e:
        return_dict['base_template'] = "dashboard_base.html"

        return_dict["error_details"] = e
        return django.shortcuts.render_to_response(
            "logged_in_error.html",
            return_dict,
            context_instance=django.template.context.RequestContext(request))
def create_cifs_share(request):

  return_dict = {}
  try:
    user_list, err = cifs_unicell.get_user_list()
    if err:
      raise Exception(err)
    group_list, err = cifs_unicell.get_group_list()
    if err:
      raise Exception(err)
    pools, err = zfs.get_pools()
    if err:
      raise Exception('No ZFS pools available. Please create a pool and dataset before creating shares.')

    ds_list = [] 
    for pool in pools:
      for ds in pool["datasets"]:
        if ds['properties']['type']['value'] == 'filesystem':
          ds_list.append({'name': ds["name"], 'mountpoint': ds["mountpoint"]})
    if not ds_list:
      raise Exception('No ZFS datasets available. Please create a dataset before creating shares.')
  
    if request.method == "GET":
      #Return the form

      form = samba_shares_forms.CreateShareForm(user_list = user_list, group_list = group_list, dataset_list = ds_list, initial = {'guest_ok': True})
      return_dict["form"] = form

      return django.shortcuts.render_to_response("create_cifs_share.html", return_dict, context_instance = django.template.context.RequestContext(request))
    else:
      #Form submission so create
      return_dict = {}
      form = samba_shares_forms.CreateShareForm(request.POST, user_list = user_list, group_list = group_list, dataset_list = ds_list)
      return_dict["form"] = form
      if form.is_valid():
        cd = form.cleaned_data
        name = cd["name"]
        path = "%s"%cd["path"]
        if not path:
          return_dict["path_error"] = "Please choose a path."
          return django.shortcuts.render_to_response("create_cifs_share.html", return_dict, context_instance = django.template.context.RequestContext(request))
        display_path = cd["path"]    
        if not os.path.isdir(display_path):
          os.mkdir(display_path)
        if "comment" in cd:
          comment = cd["comment"]
        else:
          comment = None
        if "read_only" in cd:
          read_only = cd["read_only"]
        else:
          read_only = None
        if "browseable" in cd:
          browseable = cd["browseable"]
        else:
          browseable = None
        if "guest_ok" in cd:
          guest_ok = cd["guest_ok"]
        else:
          guest_ok = None
        if "users" in cd:
          users = cd["users"]
        else:
          users = None
        if "groups" in cd:
          groups = cd["groups"]
        else:
          groups = None
        vol = "unicell"
        #logger.debug("Create share request, name %s path %s, comment %s, read_only %s, browseable %s, guest_ok %s, users %s, groups %s, vol %s"%(name, path, comment, read_only, browseable, guest_ok, users, groups))
        #print '1'
        ret, err = cifs_common.create_share(name, comment, guest_ok, read_only, display_path, display_path, browseable, users, groups,vol)
        #print '2'
        if err:
          raise Exception(err)
        ret, err = cifs_unicell.generate_smb_conf()
        #print '3'
        if err:
          raise Exception(err)
  
        audit_str = "Created Samba share %s"%name
        audit.audit("create_cifs_share", audit_str, request.META["REMOTE_ADDR"])
        return django.http.HttpResponseRedirect('/view_cifs_shares?action=created')
      else:
        return django.shortcuts.render_to_response("create_cifs_share.html", return_dict, context_instance = django.template.context.RequestContext(request))
  except Exception, e:
    return_dict['base_template'] = "shares_base.html"
    return_dict["page_title"] = 'Create a CIFS share'
    return_dict['tab'] = 'view_cifs_shares_tab'
    return_dict["error"] = 'Error creating a CIFS share'
    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))