1*13013Sglenn.lagasse@oracle.com# CDDL HEADER START 2*13013Sglenn.lagasse@oracle.com# 3*13013Sglenn.lagasse@oracle.com# The contents of this file are subject to the terms of the 4*13013Sglenn.lagasse@oracle.com# Common Development and Distribution License (the "License"). 5*13013Sglenn.lagasse@oracle.com# You may not use this file except in compliance with the License. 6*13013Sglenn.lagasse@oracle.com# 7*13013Sglenn.lagasse@oracle.com# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 8*13013Sglenn.lagasse@oracle.com# or http://www.opensolaris.org/os/licensing. 9*13013Sglenn.lagasse@oracle.com# See the License for the specific language governing permissions 10*13013Sglenn.lagasse@oracle.com# and limitations under the License. 11*13013Sglenn.lagasse@oracle.com# 12*13013Sglenn.lagasse@oracle.com# When distributing Covered Code, include this CDDL HEADER in each 13*13013Sglenn.lagasse@oracle.com# file and include the License file at usr/src/OPENSOLARIS.LICENSE. 14*13013Sglenn.lagasse@oracle.com# If applicable, add the following below this CDDL HEADER, with the 15*13013Sglenn.lagasse@oracle.com# fields enclosed by brackets "[]" replaced with your own identifying 16*13013Sglenn.lagasse@oracle.com# information: Portions Copyright [yyyy] [name of copyright owner] 17*13013Sglenn.lagasse@oracle.com# 18*13013Sglenn.lagasse@oracle.com# CDDL HEADER END 19*13013Sglenn.lagasse@oracle.com# 20*13013Sglenn.lagasse@oracle.com 21*13013Sglenn.lagasse@oracle.com# 22*13013Sglenn.lagasse@oracle.com# Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved. 23*13013Sglenn.lagasse@oracle.com# 24*13013Sglenn.lagasse@oracle.com 25*13013Sglenn.lagasse@oracle.com"""Boot Environment classes used by beadm.""" 26*13013Sglenn.lagasse@oracle.com 27*13013Sglenn.lagasse@oracle.comimport datetime 28*13013Sglenn.lagasse@oracle.com 29*13013Sglenn.lagasse@oracle.comclass BootEnvironment: 30*13013Sglenn.lagasse@oracle.com """Boot Environment object that is used by beadm to manage command line 31*13013Sglenn.lagasse@oracle.com options, arguments and the log.""" 32*13013Sglenn.lagasse@oracle.com 33*13013Sglenn.lagasse@oracle.com def __init__(self): 34*13013Sglenn.lagasse@oracle.com self.trgt_rpool = None 35*13013Sglenn.lagasse@oracle.com self.trgt_be_name_or_snapshot = None 36*13013Sglenn.lagasse@oracle.com self.src_be_name_or_snapshot = None 37*13013Sglenn.lagasse@oracle.com self.properties = {} 38*13013Sglenn.lagasse@oracle.com self.log_id = None 39*13013Sglenn.lagasse@oracle.com self.log = None 40*13013Sglenn.lagasse@oracle.com self.msg_buf = {} 41*13013Sglenn.lagasse@oracle.com self.description = None 42*13013Sglenn.lagasse@oracle.com 43*13013Sglenn.lagasse@oracle.comclass listBootEnvironment: 44*13013Sglenn.lagasse@oracle.com """Base class for beadm list 45*13013Sglenn.lagasse@oracle.com Determine the BE's to display. Prints command output according to option: 46*13013Sglenn.lagasse@oracle.com -d - dataset 47*13013Sglenn.lagasse@oracle.com -s - snapshot 48*13013Sglenn.lagasse@oracle.com -a - all (both dataset and snapshot) 49*13013Sglenn.lagasse@oracle.com <none> - only BE information 50*13013Sglenn.lagasse@oracle.com The -H option produces condensed, parseable output 51*13013Sglenn.lagasse@oracle.com The ';' delimits each field in the output. BEs with multiple 52*13013Sglenn.lagasse@oracle.com datasets will have multiple lines in the output. 53*13013Sglenn.lagasse@oracle.com """ 54*13013Sglenn.lagasse@oracle.com 55*13013Sglenn.lagasse@oracle.com def list(self, be_list, ddh, be_name): 56*13013Sglenn.lagasse@oracle.com """ print all output for beadm list command 57*13013Sglenn.lagasse@oracle.com be_list - list of all BEs 58*13013Sglenn.lagasse@oracle.com ddh - if True, Do not Display Headers - just parseable data 59*13013Sglenn.lagasse@oracle.com be_name - user-specified BE, if any 60*13013Sglenn.lagasse@oracle.com 61*13013Sglenn.lagasse@oracle.com returns 0 for success 62*13013Sglenn.lagasse@oracle.com side effect: beadm list output printed to stdout 63*13013Sglenn.lagasse@oracle.com """ 64*13013Sglenn.lagasse@oracle.com 65*13013Sglenn.lagasse@oracle.com #If we're listing Headers, initialize the array holding the 66*13013Sglenn.lagasse@oracle.com #column widths with the header widths themselves. Later on, 67*13013Sglenn.lagasse@oracle.com #the data in this array will get adjusted as we process actual 68*13013Sglenn.lagasse@oracle.com #row data and find that a piece of data is wider than its 69*13013Sglenn.lagasse@oracle.com #column header. 70*13013Sglenn.lagasse@oracle.com bemaxout = [0 for i in range(len(self.hdr[0]))] 71*13013Sglenn.lagasse@oracle.com if not ddh: 72*13013Sglenn.lagasse@oracle.com #iterate all header rows since their fields may not 73*13013Sglenn.lagasse@oracle.com #be of equal length. 74*13013Sglenn.lagasse@oracle.com for header in self.hdr: 75*13013Sglenn.lagasse@oracle.com icol = 0 76*13013Sglenn.lagasse@oracle.com for hc in header: 77*13013Sglenn.lagasse@oracle.com if len(hc) + 1 > bemaxout[icol]: 78*13013Sglenn.lagasse@oracle.com bemaxout[icol] = len(hc) + 1 79*13013Sglenn.lagasse@oracle.com icol += 1 80*13013Sglenn.lagasse@oracle.com 81*13013Sglenn.lagasse@oracle.com #collect BEs 82*13013Sglenn.lagasse@oracle.com beout = {} #matrix of output text [row][attribute] 83*13013Sglenn.lagasse@oracle.com beoutname = {} #list of BE names [row] 84*13013Sglenn.lagasse@oracle.com be_space = {} #space used totals for BE [BE name]['space_used','ibei'] 85*13013Sglenn.lagasse@oracle.com ibe = 0 #BE index 86*13013Sglenn.lagasse@oracle.com spacecol = -1 #to contain column where space used is displayed 87*13013Sglenn.lagasse@oracle.com for be in be_list: 88*13013Sglenn.lagasse@oracle.com if 'orig_be_name' in be: 89*13013Sglenn.lagasse@oracle.com cur_be = be['orig_be_name'] 90*13013Sglenn.lagasse@oracle.com cur_be_obj = be 91*13013Sglenn.lagasse@oracle.com 92*13013Sglenn.lagasse@oracle.com #if BE name specified, collect matching BEs 93*13013Sglenn.lagasse@oracle.com if be_name is not None and not self.beMatch(be, be_name): 94*13013Sglenn.lagasse@oracle.com continue 95*13013Sglenn.lagasse@oracle.com attrs = () 96*13013Sglenn.lagasse@oracle.com #identify BE|dataset|snapshot attributes 97*13013Sglenn.lagasse@oracle.com att = '' 98*13013Sglenn.lagasse@oracle.com for att in ('orig_be_name', 'dataset', 'snap_name'): 99*13013Sglenn.lagasse@oracle.com if att in be and att in self.lattrs: 100*13013Sglenn.lagasse@oracle.com attrs = self.lattrs[att] 101*13013Sglenn.lagasse@oracle.com if att == 'orig_be_name': 102*13013Sglenn.lagasse@oracle.com be_space[cur_be] = {} 103*13013Sglenn.lagasse@oracle.com be_space[cur_be]['space_used'] = 0 104*13013Sglenn.lagasse@oracle.com be_space[cur_be]['ibe'] = ibe 105*13013Sglenn.lagasse@oracle.com if not ddh and len(cur_be) + 1 > bemaxout[0]: 106*13013Sglenn.lagasse@oracle.com bemaxout[0] = len(cur_be) + 1 107*13013Sglenn.lagasse@oracle.com break 108*13013Sglenn.lagasse@oracle.com beout[ibe] = {} 109*13013Sglenn.lagasse@oracle.com beoutname[ibe] = cur_be 110*13013Sglenn.lagasse@oracle.com 111*13013Sglenn.lagasse@oracle.com icol = 0 #first column 112*13013Sglenn.lagasse@oracle.com for at in attrs: 113*13013Sglenn.lagasse@oracle.com #for option -s, withhold subordinate datasets 114*13013Sglenn.lagasse@oracle.com if self.__class__.__name__ == 'SnapshotList' and \ 115*13013Sglenn.lagasse@oracle.com att == 'snap_name' and 'snap_name' in be and \ 116*13013Sglenn.lagasse@oracle.com '/' in be[att]: 117*13013Sglenn.lagasse@oracle.com break 118*13013Sglenn.lagasse@oracle.com #convert output to readable format and save 119*13013Sglenn.lagasse@oracle.com save = self.getAttr(at, be, ddh, cur_be_obj) 120*13013Sglenn.lagasse@oracle.com beout[ibe][at] = save 121*13013Sglenn.lagasse@oracle.com #maintain maximum column widths 122*13013Sglenn.lagasse@oracle.com if not ddh and len(save) + 1 > bemaxout[icol]: 123*13013Sglenn.lagasse@oracle.com bemaxout[icol] = len(save) + 1 124*13013Sglenn.lagasse@oracle.com #sum all snapshots for BE 125*13013Sglenn.lagasse@oracle.com if at == 'space_used' and 'space_used' in be: 126*13013Sglenn.lagasse@oracle.com spacecol = icol 127*13013Sglenn.lagasse@oracle.com icol += 1 #next column 128*13013Sglenn.lagasse@oracle.com ibe += 1 129*13013Sglenn.lagasse@oracle.com if 'space_used' in be: 130*13013Sglenn.lagasse@oracle.com #sum all snapshots and datasets for BE in 'beadm list' 131*13013Sglenn.lagasse@oracle.com if isinstance(self, BEList): 132*13013Sglenn.lagasse@oracle.com be_space[cur_be]['space_used'] += be.get('space_used') 133*13013Sglenn.lagasse@oracle.com elif cur_be in be_space and \ 134*13013Sglenn.lagasse@oracle.com ('space_used' not in be_space[cur_be] or 135*13013Sglenn.lagasse@oracle.com be_space[cur_be]['space_used'] == 0): 136*13013Sglenn.lagasse@oracle.com #list space used separately for other options 137*13013Sglenn.lagasse@oracle.com be_space[cur_be]['space_used'] = be.get('space_used') 138*13013Sglenn.lagasse@oracle.com 139*13013Sglenn.lagasse@oracle.com #output format total lengths for each BE with any snapshots 140*13013Sglenn.lagasse@oracle.com for cur_be in be_space: 141*13013Sglenn.lagasse@oracle.com save = self.getSpaceValue(be_space[cur_be]['space_used'], ddh) 142*13013Sglenn.lagasse@oracle.com ibe = be_space[cur_be]['ibe'] 143*13013Sglenn.lagasse@oracle.com beout[ibe]['space_used'] = save 144*13013Sglenn.lagasse@oracle.com #expand column if widest column entry 145*13013Sglenn.lagasse@oracle.com if (spacecol != -1) and \ 146*13013Sglenn.lagasse@oracle.com (not ddh and len(save) + 1 > bemaxout[spacecol]): 147*13013Sglenn.lagasse@oracle.com bemaxout[spacecol] = len(save) + 1 148*13013Sglenn.lagasse@oracle.com 149*13013Sglenn.lagasse@oracle.com #print headers in columns 150*13013Sglenn.lagasse@oracle.com if not ddh: 151*13013Sglenn.lagasse@oracle.com for header in self.hdr: 152*13013Sglenn.lagasse@oracle.com outstr = '' 153*13013Sglenn.lagasse@oracle.com for icol in range(len(header)): 154*13013Sglenn.lagasse@oracle.com outstr += header[icol].ljust(bemaxout[icol]) 155*13013Sglenn.lagasse@oracle.com if outstr != '': 156*13013Sglenn.lagasse@oracle.com print outstr 157*13013Sglenn.lagasse@oracle.com 158*13013Sglenn.lagasse@oracle.com #print collected output in columns 159*13013Sglenn.lagasse@oracle.com outstr = '' 160*13013Sglenn.lagasse@oracle.com prev_be = None 161*13013Sglenn.lagasse@oracle.com cur_be = None 162*13013Sglenn.lagasse@oracle.com for ibe in beout: #index output matrix 163*13013Sglenn.lagasse@oracle.com if beoutname[ibe] != None: 164*13013Sglenn.lagasse@oracle.com cur_be = beoutname[ibe] 165*13013Sglenn.lagasse@oracle.com #find attributes for BE type 166*13013Sglenn.lagasse@oracle.com curtype = None 167*13013Sglenn.lagasse@oracle.com for att in ('orig_be_name', 'dataset', 'snap_name'): 168*13013Sglenn.lagasse@oracle.com if att in beout[ibe]: 169*13013Sglenn.lagasse@oracle.com attrs = self.lattrs[att] 170*13013Sglenn.lagasse@oracle.com curtype = att 171*13013Sglenn.lagasse@oracle.com break 172*13013Sglenn.lagasse@oracle.com 173*13013Sglenn.lagasse@oracle.com if curtype == None: #default to BE 174*13013Sglenn.lagasse@oracle.com curtype = 'orig_be_name' 175*13013Sglenn.lagasse@oracle.com if 'orig_be_name' in self.lattrs: 176*13013Sglenn.lagasse@oracle.com attrs = self.lattrs['orig_be_name'] 177*13013Sglenn.lagasse@oracle.com else: attrs = () 178*13013Sglenn.lagasse@oracle.com 179*13013Sglenn.lagasse@oracle.com if not ddh: 180*13013Sglenn.lagasse@oracle.com if prev_be != cur_be and cur_be != None: 181*13013Sglenn.lagasse@oracle.com #for -d,-s,-a, print BE alone on line 182*13013Sglenn.lagasse@oracle.com if self.__class__.__name__ != 'BEList': 183*13013Sglenn.lagasse@oracle.com print cur_be 184*13013Sglenn.lagasse@oracle.com prev_be = cur_be 185*13013Sglenn.lagasse@oracle.com 186*13013Sglenn.lagasse@oracle.com #print for one BE/snapshot/dataset 187*13013Sglenn.lagasse@oracle.com icol = 0 #first column 188*13013Sglenn.lagasse@oracle.com 189*13013Sglenn.lagasse@oracle.com #if this is a 'dataset' or 'snap_name', start line with BE 190*13013Sglenn.lagasse@oracle.com #name token 191*13013Sglenn.lagasse@oracle.com if ddh and curtype != 'orig_be_name': 192*13013Sglenn.lagasse@oracle.com outstr = cur_be 193*13013Sglenn.lagasse@oracle.com 194*13013Sglenn.lagasse@oracle.com for at in attrs: #for each attribute specified in table 195*13013Sglenn.lagasse@oracle.com if ddh: #add separators for parsing 196*13013Sglenn.lagasse@oracle.com if outstr != '': 197*13013Sglenn.lagasse@oracle.com outstr += ';' #attribute separator 198*13013Sglenn.lagasse@oracle.com if at in beout[ibe] and beout[ibe][at] != '-' and \ 199*13013Sglenn.lagasse@oracle.com beout[ibe][at] != '': 200*13013Sglenn.lagasse@oracle.com outstr += beout[ibe][at] 201*13013Sglenn.lagasse@oracle.com else: #append text justified in column 202*13013Sglenn.lagasse@oracle.com if at in beout[ibe]: 203*13013Sglenn.lagasse@oracle.com outstr += beout[ibe][at].ljust(bemaxout[icol]) 204*13013Sglenn.lagasse@oracle.com icol += 1 #next column 205*13013Sglenn.lagasse@oracle.com 206*13013Sglenn.lagasse@oracle.com if outstr != '': 207*13013Sglenn.lagasse@oracle.com print outstr 208*13013Sglenn.lagasse@oracle.com outstr = '' 209*13013Sglenn.lagasse@oracle.com 210*13013Sglenn.lagasse@oracle.com return 0 211*13013Sglenn.lagasse@oracle.com 212*13013Sglenn.lagasse@oracle.com def beMatch(self, be, be_name): 213*13013Sglenn.lagasse@oracle.com """find match on user-specified BE.""" 214*13013Sglenn.lagasse@oracle.com 215*13013Sglenn.lagasse@oracle.com if 'orig_be_name' in be: 216*13013Sglenn.lagasse@oracle.com return be.get('orig_be_name') == be_name 217*13013Sglenn.lagasse@oracle.com if 'dataset' in be: 218*13013Sglenn.lagasse@oracle.com if be.get('dataset') == be_name: 219*13013Sglenn.lagasse@oracle.com return True 220*13013Sglenn.lagasse@oracle.com out = be.get('dataset').split("/") 221*13013Sglenn.lagasse@oracle.com return out[0] == be_name 222*13013Sglenn.lagasse@oracle.com if 'snap_name' in be: 223*13013Sglenn.lagasse@oracle.com if be.get('snap_name') == be_name: 224*13013Sglenn.lagasse@oracle.com return True 225*13013Sglenn.lagasse@oracle.com out = be.get('snap_name').split('@') 226*13013Sglenn.lagasse@oracle.com if out[0] == be_name: 227*13013Sglenn.lagasse@oracle.com return True 228*13013Sglenn.lagasse@oracle.com out = be.get('snap_name').split('/') 229*13013Sglenn.lagasse@oracle.com return out[0] == be_name 230*13013Sglenn.lagasse@oracle.com return False 231*13013Sglenn.lagasse@oracle.com 232*13013Sglenn.lagasse@oracle.com def getAttr(self, at, be, ddh, beobj): 233*13013Sglenn.lagasse@oracle.com """ 234*13013Sglenn.lagasse@oracle.com Extract information by attribute and format for printing 235*13013Sglenn.lagasse@oracle.com returns '?' if normally present attribute not found - error. 236*13013Sglenn.lagasse@oracle.com """ 237*13013Sglenn.lagasse@oracle.com if at == 'blank': 238*13013Sglenn.lagasse@oracle.com return ' ' 239*13013Sglenn.lagasse@oracle.com if at == 'dash': 240*13013Sglenn.lagasse@oracle.com return '-' 241*13013Sglenn.lagasse@oracle.com if at == 'orig_be_name': 242*13013Sglenn.lagasse@oracle.com if at not in be: 243*13013Sglenn.lagasse@oracle.com return '-' 244*13013Sglenn.lagasse@oracle.com ret = be[at] 245*13013Sglenn.lagasse@oracle.com if ddh or self.__class__.__name__ == 'BEList': 246*13013Sglenn.lagasse@oracle.com return ret 247*13013Sglenn.lagasse@oracle.com return ' ' + ret #indent 248*13013Sglenn.lagasse@oracle.com if at == 'snap_name': 249*13013Sglenn.lagasse@oracle.com if at not in be: 250*13013Sglenn.lagasse@oracle.com return '-' 251*13013Sglenn.lagasse@oracle.com if self.__class__.__name__ == 'CompleteList': 252*13013Sglenn.lagasse@oracle.com ret = self.prependRootDS(be[at], beobj) 253*13013Sglenn.lagasse@oracle.com else: 254*13013Sglenn.lagasse@oracle.com ret = be[at] 255*13013Sglenn.lagasse@oracle.com if ddh: 256*13013Sglenn.lagasse@oracle.com return ret 257*13013Sglenn.lagasse@oracle.com return ' ' + ret #indent 258*13013Sglenn.lagasse@oracle.com if at == 'dataset': 259*13013Sglenn.lagasse@oracle.com if at not in be: 260*13013Sglenn.lagasse@oracle.com return '-' 261*13013Sglenn.lagasse@oracle.com if self.__class__.__name__ == 'DatasetList' or \ 262*13013Sglenn.lagasse@oracle.com self.__class__.__name__ == 'CompleteList': 263*13013Sglenn.lagasse@oracle.com ret = self.prependRootDS(be[at], beobj) 264*13013Sglenn.lagasse@oracle.com else: 265*13013Sglenn.lagasse@oracle.com ret = be[at] 266*13013Sglenn.lagasse@oracle.com if ddh: 267*13013Sglenn.lagasse@oracle.com return ret 268*13013Sglenn.lagasse@oracle.com return ' ' + ret #indent 269*13013Sglenn.lagasse@oracle.com if at == 'active': 270*13013Sglenn.lagasse@oracle.com if at not in be: 271*13013Sglenn.lagasse@oracle.com return '-' 272*13013Sglenn.lagasse@oracle.com ret = '' 273*13013Sglenn.lagasse@oracle.com if 'active' in be and be['active']: 274*13013Sglenn.lagasse@oracle.com ret += 'N' 275*13013Sglenn.lagasse@oracle.com if 'active_boot' in be and be['active_boot']: 276*13013Sglenn.lagasse@oracle.com ret += 'R' 277*13013Sglenn.lagasse@oracle.com if ret == '': 278*13013Sglenn.lagasse@oracle.com return '-' 279*13013Sglenn.lagasse@oracle.com return ret 280*13013Sglenn.lagasse@oracle.com if at == 'mountpoint': 281*13013Sglenn.lagasse@oracle.com if at not in be: 282*13013Sglenn.lagasse@oracle.com return '-' 283*13013Sglenn.lagasse@oracle.com if 'mounted' not in be or not be['mounted']: 284*13013Sglenn.lagasse@oracle.com return '-' 285*13013Sglenn.lagasse@oracle.com return be[at] 286*13013Sglenn.lagasse@oracle.com if at == 'space_used': 287*13013Sglenn.lagasse@oracle.com if at not in be: 288*13013Sglenn.lagasse@oracle.com return '0' 289*13013Sglenn.lagasse@oracle.com return self.getSpaceValue(be[at], ddh) 290*13013Sglenn.lagasse@oracle.com if at == 'mounted': 291*13013Sglenn.lagasse@oracle.com if at not in be: 292*13013Sglenn.lagasse@oracle.com return '-' 293*13013Sglenn.lagasse@oracle.com return be[at] 294*13013Sglenn.lagasse@oracle.com if at == 'date': 295*13013Sglenn.lagasse@oracle.com if at not in be: 296*13013Sglenn.lagasse@oracle.com return '?' 297*13013Sglenn.lagasse@oracle.com if ddh: 298*13013Sglenn.lagasse@oracle.com return str(be[at]) #timestamp in seconds 299*13013Sglenn.lagasse@oracle.com sec = str(datetime.datetime.fromtimestamp(be[at])) 300*13013Sglenn.lagasse@oracle.com return sec[0:len(sec)-3] #trim seconds 301*13013Sglenn.lagasse@oracle.com if at == 'policy': 302*13013Sglenn.lagasse@oracle.com if at not in be: 303*13013Sglenn.lagasse@oracle.com return '?' 304*13013Sglenn.lagasse@oracle.com return be[at] 305*13013Sglenn.lagasse@oracle.com if at == 'root_ds': 306*13013Sglenn.lagasse@oracle.com if at not in be: 307*13013Sglenn.lagasse@oracle.com return '?' 308*13013Sglenn.lagasse@oracle.com if ddh or self.__class__.__name__ == 'BEList': 309*13013Sglenn.lagasse@oracle.com return be[at] 310*13013Sglenn.lagasse@oracle.com return ' ' + be[at] 311*13013Sglenn.lagasse@oracle.com if at == 'uuid_str': 312*13013Sglenn.lagasse@oracle.com if at not in be: 313*13013Sglenn.lagasse@oracle.com return '-' 314*13013Sglenn.lagasse@oracle.com return be[at] 315*13013Sglenn.lagasse@oracle.com #default case - no match on attribute 316*13013Sglenn.lagasse@oracle.com return be[at] 317*13013Sglenn.lagasse@oracle.com 318*13013Sglenn.lagasse@oracle.com def getSpaceValue(self, num, ddh): 319*13013Sglenn.lagasse@oracle.com """Readable formatting for disk space size.""" 320*13013Sglenn.lagasse@oracle.com 321*13013Sglenn.lagasse@oracle.com if ddh: 322*13013Sglenn.lagasse@oracle.com return str(num) #return size in bytes as string 323*13013Sglenn.lagasse@oracle.com 324*13013Sglenn.lagasse@oracle.com kilo = 1024.0 325*13013Sglenn.lagasse@oracle.com mega = 1048576.0 326*13013Sglenn.lagasse@oracle.com giga = 1073741824.0 327*13013Sglenn.lagasse@oracle.com tera = 1099511627776.0 328*13013Sglenn.lagasse@oracle.com 329*13013Sglenn.lagasse@oracle.com if num == None: 330*13013Sglenn.lagasse@oracle.com return '0' 331*13013Sglenn.lagasse@oracle.com if num < kilo: 332*13013Sglenn.lagasse@oracle.com return str(num) + 'B' 333*13013Sglenn.lagasse@oracle.com if num < mega: 334*13013Sglenn.lagasse@oracle.com return str('%.1f' % (num / kilo)) + 'K' 335*13013Sglenn.lagasse@oracle.com if num < giga: 336*13013Sglenn.lagasse@oracle.com return str('%.2f' % (num / mega)) + 'M' 337*13013Sglenn.lagasse@oracle.com if num < tera: 338*13013Sglenn.lagasse@oracle.com return str('%.2f' % (num / giga)) + 'G' 339*13013Sglenn.lagasse@oracle.com return str('%.2f' % (num / tera)) + 'T' 340*13013Sglenn.lagasse@oracle.com 341*13013Sglenn.lagasse@oracle.com def prependRootDS(self, val, beobj): 342*13013Sglenn.lagasse@oracle.com """Prepend root dataset name with BE name stripped.""" 343*13013Sglenn.lagasse@oracle.com 344*13013Sglenn.lagasse@oracle.com root_ds = beobj.get('root_ds') 345*13013Sglenn.lagasse@oracle.com return root_ds[0:root_ds.rfind('/')+1] + val 346*13013Sglenn.lagasse@oracle.com 347*13013Sglenn.lagasse@oracle.com 348*13013Sglenn.lagasse@oracle.com"""Top level "beadm list" derived classes defined here. 349*13013Sglenn.lagasse@oracle.com Only table definition is done here - all methods are in the base class. 350*13013Sglenn.lagasse@oracle.com Tables driving list: 351*13013Sglenn.lagasse@oracle.com hdr - list of text to output for each column 352*13013Sglenn.lagasse@oracle.com lattrs - dictionary of attributes 353*13013Sglenn.lagasse@oracle.com Each entry specifies either BE, dataset, snapshot with 354*13013Sglenn.lagasse@oracle.com an attribute key: 355*13013Sglenn.lagasse@oracle.com orig_be_name - for BEs 356*13013Sglenn.lagasse@oracle.com dataset - for datasets 357*13013Sglenn.lagasse@oracle.com snap_name - for snapshots 358*13013Sglenn.lagasse@oracle.com Each list item in entry indicates specific datum for 359*13013Sglenn.lagasse@oracle.com column 360*13013Sglenn.lagasse@oracle.com Number of hdr columns must equal number of lattrs entries 361*13013Sglenn.lagasse@oracle.com unless ddh (dontDisplayHeaders) is true. 362*13013Sglenn.lagasse@oracle.com""" 363*13013Sglenn.lagasse@oracle.comclass BEList(listBootEnvironment): 364*13013Sglenn.lagasse@oracle.com """specify header and attribute information for BE-only output""" 365*13013Sglenn.lagasse@oracle.com 366*13013Sglenn.lagasse@oracle.com def __init__(self, ddh): 367*13013Sglenn.lagasse@oracle.com """Init function for the class.""" 368*13013Sglenn.lagasse@oracle.com self.hdr = \ 369*13013Sglenn.lagasse@oracle.com ('BE','Active','Mountpoint','Space','Policy','Created'), \ 370*13013Sglenn.lagasse@oracle.com ('--','------','----------','-----','------','-------') 371*13013Sglenn.lagasse@oracle.com if ddh: 372*13013Sglenn.lagasse@oracle.com self.lattrs = {'orig_be_name':('orig_be_name', 'uuid_str', 373*13013Sglenn.lagasse@oracle.com 'active', 'mountpoint', 'space_used', 'policy', 374*13013Sglenn.lagasse@oracle.com 'date')} 375*13013Sglenn.lagasse@oracle.com else: 376*13013Sglenn.lagasse@oracle.com self.lattrs = {'orig_be_name':('orig_be_name', 'active', 377*13013Sglenn.lagasse@oracle.com 'mountpoint', 'space_used', 'policy', 'date')} 378*13013Sglenn.lagasse@oracle.com 379*13013Sglenn.lagasse@oracle.comclass DatasetList(listBootEnvironment): 380*13013Sglenn.lagasse@oracle.com """ 381*13013Sglenn.lagasse@oracle.com specify header and attribute information for dataset output, 382*13013Sglenn.lagasse@oracle.com -d option 383*13013Sglenn.lagasse@oracle.com """ 384*13013Sglenn.lagasse@oracle.com def __init__(self, ddh): 385*13013Sglenn.lagasse@oracle.com """Init function for the class.""" 386*13013Sglenn.lagasse@oracle.com 387*13013Sglenn.lagasse@oracle.com self.hdr = \ 388*13013Sglenn.lagasse@oracle.com ('BE/Dataset','Active','Mountpoint','Space','Policy','Created'), \ 389*13013Sglenn.lagasse@oracle.com ('----------','------','----------','-----','------','-------') 390*13013Sglenn.lagasse@oracle.com if ddh: 391*13013Sglenn.lagasse@oracle.com self.lattrs = { \ 392*13013Sglenn.lagasse@oracle.com 'orig_be_name':('orig_be_name', 'root_ds', 'active', 393*13013Sglenn.lagasse@oracle.com 'mountpoint', 'space_used', 'policy', 'date'), \ 394*13013Sglenn.lagasse@oracle.com 'dataset':('dataset', 'dash', 'mountpoint', 'space_used', 395*13013Sglenn.lagasse@oracle.com 'policy', 'date')} 396*13013Sglenn.lagasse@oracle.com else: 397*13013Sglenn.lagasse@oracle.com self.lattrs = { \ 398*13013Sglenn.lagasse@oracle.com 'orig_be_name':('root_ds', 'active', 'mountpoint', 399*13013Sglenn.lagasse@oracle.com 'space_used', 'policy', 'date'), \ 400*13013Sglenn.lagasse@oracle.com 'dataset':('dataset', 'dash', 'mountpoint', 'space_used', 401*13013Sglenn.lagasse@oracle.com 'policy', 'date')} 402*13013Sglenn.lagasse@oracle.com 403*13013Sglenn.lagasse@oracle.comclass SnapshotList(listBootEnvironment): 404*13013Sglenn.lagasse@oracle.com """ 405*13013Sglenn.lagasse@oracle.com specify header and attribute information for snapshot output, 406*13013Sglenn.lagasse@oracle.com -s option 407*13013Sglenn.lagasse@oracle.com """ 408*13013Sglenn.lagasse@oracle.com def __init__(self, ddh): 409*13013Sglenn.lagasse@oracle.com """Init function for the class.""" 410*13013Sglenn.lagasse@oracle.com 411*13013Sglenn.lagasse@oracle.com self.hdr = \ 412*13013Sglenn.lagasse@oracle.com ('BE/Snapshot','Space','Policy','Created'), \ 413*13013Sglenn.lagasse@oracle.com ('-----------','-----','------','-------') 414*13013Sglenn.lagasse@oracle.com self.lattrs = {'snap_name':('snap_name', 'space_used', 'policy', 415*13013Sglenn.lagasse@oracle.com 'date')} 416*13013Sglenn.lagasse@oracle.com 417*13013Sglenn.lagasse@oracle.comclass CompleteList(listBootEnvironment): 418*13013Sglenn.lagasse@oracle.com """ 419*13013Sglenn.lagasse@oracle.com specify header and attribute information for BE and/or dataset and/or 420*13013Sglenn.lagasse@oracle.com snapshot output, 421*13013Sglenn.lagasse@oracle.com -a or -ds options 422*13013Sglenn.lagasse@oracle.com """ 423*13013Sglenn.lagasse@oracle.com def __init__(self, ddh): 424*13013Sglenn.lagasse@oracle.com """Init function for the class.""" 425*13013Sglenn.lagasse@oracle.com 426*13013Sglenn.lagasse@oracle.com self.hdr = \ 427*13013Sglenn.lagasse@oracle.com ('BE/Dataset/Snapshot','Active','Mountpoint','Space','Policy','Created'), \ 428*13013Sglenn.lagasse@oracle.com ('-------------------','------','----------','-----','------','-------') 429*13013Sglenn.lagasse@oracle.com if ddh: 430*13013Sglenn.lagasse@oracle.com self.lattrs = { \ 431*13013Sglenn.lagasse@oracle.com 'orig_be_name':('orig_be_name', 'root_ds', 'active', 432*13013Sglenn.lagasse@oracle.com 'mountpoint', 'space_used', 'policy', 'date'), 433*13013Sglenn.lagasse@oracle.com 'dataset':('dataset', 'dash', 'mountpoint', 'space_used', 434*13013Sglenn.lagasse@oracle.com 'policy', 'date'), 435*13013Sglenn.lagasse@oracle.com 'snap_name':('snap_name', 'dash', 'dash', 'space_used', 436*13013Sglenn.lagasse@oracle.com 'policy', 'date')} 437*13013Sglenn.lagasse@oracle.com else: 438*13013Sglenn.lagasse@oracle.com self.lattrs = { \ 439*13013Sglenn.lagasse@oracle.com 'orig_be_name':('root_ds', 'active', 'mountpoint', 440*13013Sglenn.lagasse@oracle.com 'space_used', 'policy', 'date'), \ 441*13013Sglenn.lagasse@oracle.com 'dataset':('dataset', 'dash', 'mountpoint', 'space_used', 442*13013Sglenn.lagasse@oracle.com 'policy', 'date'), 443*13013Sglenn.lagasse@oracle.com 'snap_name':('snap_name', 'dash', 'dash', 'space_used', 444*13013Sglenn.lagasse@oracle.com 'policy', 'date')} 445