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
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))
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') '''
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))
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))
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))
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))