Sei sulla pagina 1di 24

//#################################################################################

###########################
//# Reference :
//# ZFSSA Scripting -
http://docs.oracle.com/cd/E27998_01/html/E48433/user_interface__cli__scripting.html
#scrolltoc
//# ZFSSA Analytics Guide -
http://docs.oracle.com/cd/E27998_01/html/E48490/index.html
//# ECMA Script Doc - http://www.ecmascript.org/docs.php
//# ECMA Script Reference - http://qt-project.org/doc/qt-4.8/ecmascript.html
//# ECMA Script Reference - http://qt-project.org/doc/qt-4.8/ecmascript.html
//#################################################################################
############################

//#######################################
//# ZFS Storage Appliance Scriptlets
//#######################################

//this is a single-line comment


/* this is a multiline
comment */

//##################
//# Sample Run
//##################
ssh -T ipaddress < inputscript.txt > output.txt

or
ssh -T ipaddress <<EOF
...
...
EOF

//#######################################
//# Custom Function Library
//#######################################
script
function BytesToString(bytes)
{
if (bytes>=Math.pow(1024,5))
{bytes=(bytes/Math.pow(1024,5)).toFixed(2)+'PB';}
else if (bytes>=Math.pow(1024,4))
{bytes=(bytes/Math.pow(1024,4)).toFixed(2)+'TB';}
else if (bytes>=Math.pow(1024,3))
{bytes=(bytes/Math.pow(1024,3)).toFixed(2)+'GB';}
else if (bytes>=Math.pow(1024,2))
{bytes=(bytes/Math.pow(1024,2)).toFixed(2)+'MB';}
else if (bytes>=Math.pow(1024,1))
{bytes=(bytes/Math.pow(1024,1)).toFixed(2)+'KB';}
else if (bytes>1) {bytes=bytes+' bytes';}
else if (bytes==1) {bytes=bytes+' byte';}
else {bytes='0 byte';}
return bytes;
}

function SuffixToMultiplier(suffix)
{
switch (suffix)
{
case('K'): return Math.pow(1024,1); break;
case('M'): return Math.pow(1024,2); break;
case('G'): return Math.pow(1024,3); break;
case('T'): return Math.pow(1024,4); break;
case('P'): return Math.pow(1024,5); break;
default: return 1; break;
}
}

function lpad(str, len, pad) {


if (typeof(len) == "undefined") { var len = 0; }
if (typeof(pad) == "undefined") { var pad = ' '; }
if (len + 1 >= str.length) {
str = Array(len + 1 - str.length).join(pad) + str;
}
return str;
}
function rpad(str, len, pad) {
if (typeof(len) == "undefined") { var len = 0; }
if (typeof(pad) == "undefined") { var pad = ' '; }
if (len + 1 >= str.length) {
str = str + Array(len + 1 - str.length).join(pad);
}
return str;
}

function pad(str, len, pad, dir) {


if (typeof(len) == "undefined") { var len = 0; }
if (typeof(pad) == "undefined") { var pad = ' '; }
if (typeof(dir) == "undefined") { var dir = STR_PAD_RIGHT; }
if (len + 1 >= str.length) {
switch (dir){
case STR_PAD_LEFT: str = Array(len + 1 - str.length).join(pad) + str;
break;
case STR_PAD_BOTH:
var right = Math.ceil((padlen = len - str.length) / 2);
var left = padlen - right;
str = Array(left+1).join(pad) + str + Array(right+1).join(pad);
break;
default: str = str + Array(len + 1 - str.length).join(pad);
break;

} // switch
}
return str;
}

//#######################################
//# Dashboard View
//#######################################
cd /
status dashboard
//#######################################
//# Show Status
//#######################################
cd /
status storage show
status memory show
status hardware show
status alerts show
status services show

//#######################################
//# Show Resilver progress
//#######################################
cd /
configuration storage get scrub

//#######################################
//# Show Configuration
//#######################################
cd /
configuration version show
configuration storage show
configuration cluster show
configuration cluster resources show
script
run('cd /');
var ZFSSA_NODENAME = run('configuration version get nodename').split(/\s+/)[3]
run('configuration net datalinks');
datalinks = list();
var FORMAT='%-10s %-8s %-15s %-20s %-20s %-20s %-5s %-6s %-9s %-5s %-5s %-5s
%-5s %-5s %-8s \n';

printf(FORMAT,'ZFSSANode','Datalink','Class','Label','MAC','Links','MTU','policy','
Mode','Timer','Key','Speed','Duplex','pkey','linkmode');

printf(FORMAT,'=========','========','=====','=====','===','=====','===','======','
====','=====','===','=====','======','====','========')';
for (i = 0; i < datalinks.length; i++)
{
run('select ' + datalinks[i]);
var class = run('get class').split(/=/)[1].split(/\n/)[0].substr(1) ;
var label = run('get label').split(/=/)[1].split(/\n/)[0].substr(1) ;
var mac = run('get mac').split(/=/)[1].split(/\n/)[0].substr(1) ;
var links = run('get links').split(/=/)[1].split(/\n/)[0].substr(1) ;
var mtu = run('get mtu').split(/=/)[1].split(/\n/)[0].substr(1) ;
var policy = '';
var mode = '';
var timer = '';
var key = '';
var speed = '';
var duplex = '';
var pkey = '';
var linkmode = '';
if class = 'aggregation'
{
policy = run('get policy').split(/=/)[1].split(/\n/)[0].substr(1);
mode = run('get mode').split(/=/)[1].split(/\n/)[0].substr(1) ;
timer = run('get timer').split(/=/)[1].split(/\n/)[0].substr(1);
key = run('get key').split(/=/)[1].split(/\n/)[0].substr(1);
}
if class = 'device'
{
speed = run('get speed').split(/=/)[1].split(/\n/)[0].substr(1) ;
duplex = run('get duplex').split(/=/)[1].split(/\n/)[0].substr(1) ;
}
if class = 'partition'
{
pkey = run('get pkey').split(/=/)[1].split(/\n/)[0].substr(1) ;
linkmode = run('get linkmode').split(/=/)[1].split(/\n/)[0].substr(1) ;
}
printf(FORMAT, ZFSSA_NODENAME, datalinks[i], class, label, mac,
links,mtu,policy,mode,timer,key,speed,duplex,pkey,linkmode);
run('cd ..');
}
.
configuration net datalinks show
configuration net devices show
configuration net interfaces show
configuration net routing show

//#######################################
//# Show Configuration
//#######################################
cd /
configuration version show
configuration storage show
configuration cluster show
configuration cluster resources show

script
var timestampformat='%Y-%m-%d %H:%M:%S (%Z)';
run('cd /');
var ZFSSA_NODENAME = run('configuration version get nodename').split(/\s+/)[3]
run('configuration net datalinks');
datalinks = list();
var FORMAT='%-10s %-8s %-15s %-20s %-20s %-20s %-5s %-6s %-9s %-5s %-5s %-5s
%-5s %-5s %-8s \n';

printf(FORMAT,'ZFSSANode','Datalink','Class','Label','MAC','Links','MTU','policy','
Mode','Timer','Key','Speed','Duplex','pkey','linkmode');

printf(FORMAT,'=========','========','=====','=====','===','=====','===','======','
====','=====','===','=====','======','====','========');
for (i = 0; i < datalinks.length; i++)
{
run('select ' + datalinks[i]);
class = get('class');
label = get('label');
mac = get('mac');
links = get('links');
mtu = '';
policy = '';
mode = '';
timer = '';
pkey = '';
speed = '';
duplex = '';
pkey = '';
linkmode = '';
if ( class == 'aggregation' )
{
mtu = get('mtu');
policy = get('policy') ;
mode = get('mode') ;
timer = get('timer') ;
key = get('key') ;
}
if ( class == 'device' )
{
mtu = get('mtu');
speed = get('speed') ;
duplex = get('duplex') ;
}
if ( class == 'partition' )
{
pkey = get('pkey') ;
linkmode = get('linkmode') ;
}
printf(FORMAT
, ZFSSA_NODENAME
, datalinks[i]
, class
, label
, mac
, links
, mtu
, policy
, mode
, timer
, key
, speed
, duplex
, pkey
, linkmode
);
run('cd ..');
}
.

configuration net datalinks show


configuration net devices show
configuration net interfaces show
configuration net routing show

//#######################################
//# Show Alerts
//#######################################
script
var timestampformat='%Y-%m-%d %H:%M:%S (%Z)';
run('cd /');
var ZFSSA_NODENAME = run('configuration version get nodename').split(/\s+/)[3]
run('maintenance logs select alert');
alerts = list();
var FORMAT='%-10s %-12s %-26s %-100s\n';
printf(FORMAT,'ZFSSA Node','Type' ,'Time' ,
'Description');

printf(FORMAT,'==========','===========' ,'=========================' ,'===========


==========');
for (i = 0; i < alerts.length; i++)
{
run('select ' + alerts[i]);
var type = get('type');
var timestamp =
get('timestamp').toLocaleFormat(timestampformat).toUpperCase();
var description = get('description');
var type_searchstring = '.*'
/* var timestamp_searchstring = '2014-6-1[1,2]' */
var timestamp_searchstring = '.*'
var description_searchstring = '.*';
if ( description.search( description_searchstring ) > -1
&& timestamp.search(timestamp_searchstring) > -1
&& type.search( type_searchstring ) > -1
)
{
printf(FORMAT
, ZFSSA_NODENAME
, type
, timestamp
, description
);
}
run('cd ..');
}
.

//#######################################
//# Show NDMP Backups
//#######################################
script
var timestampformat='%Y-%m-%d %H:%M:%S (%Z)';
print('############################################################' );
print('NDMP Backups [' + new Date() + ']\n')
print('############################################################' );
run('cd /');
var ZFSSA_NODENAME = run('configuration version get nodename').split(/\s+/)[3]
run('maintenance logs select alert');
alerts = list();
var FORMAT='%-10s %-20s %-15s %-25s %-25s %-20s\n';
printf(FORMAT,'ZFSSA Node', 'Project' ,'Share' ,'StartTime'
,'EndTime' , 'DMA' );
printf(FORMAT,'==========',
'================' ,'===============' ,'========================' ,'===============
==========','====================' );
var project='';
var share='';
var DMA='';
var starttime='';
var endtime='';
for (i = 0; i < alerts.length; i++)
{
run('select ' + alerts[i]);
var msg=get('description');
if ( msg.search(/An NDMP backup.*started/) > -1 )
{
project = msg.split(/'/)[3];
share = msg.split(/'/)[1];
DMA = msg.split(/'/)[5];
starttime =
get('timestamp').toLocaleFormat(timestampformat).toUpperCase();
endtime=''
}
if ( msg.search(/An NDMP backup has finished/) > -1 )
{
var msg_search_string = "share '" + share + "' in project '" + project +
"'"
if (msg.search(msg_search_string) > -1 )
{
endtime =
get('timestamp').toLocaleFormat(timestampformat).toUpperCase();
}
printf(FORMAT, ZFSSA_NODENAME, project, share, starttime, endtime, DMA);
}
run('cd ..');
}
.

//#######################################
//# Show Audit Log
//#######################################
script
var timestampformat='%Y-%m-%d %H:%M:%S (%Z)';
run('cd /');
run('maintenance logs select audit');
alerts = list();
var FORMAT='%-28s %-15s %-15s %-30s %-20s \n';
printf(FORMAT,'Time' ,'User' ,'Address' ,
'Summary' , 'Annotation');
printf(FORMAT,'========================' ,'================' ,'================',
'======================','================');
for (i = 0; i < alerts.length; i++)
{
run('select ' + alerts[i]);
printf(FORMAT
, get(' timestamp').toLocaleFormat(timestampformat).toUpperCase()
, get('user')
, get('address')
, get('summary')
, get('annotation')
);
run('cd ..');
}
.

//#######################################
//# Storage Space Usage
//#######################################
script
function BytesToString(bytes)
{
if (bytes>=Math.pow(1024,5))
{bytes=(bytes/Math.pow(1024,5)).toFixed(2)+'PB';}
else if (bytes>=Math.pow(1024,4))
{bytes=(bytes/Math.pow(1024,4)).toFixed(2)+'TB';}
else if (bytes>=Math.pow(1024,3))
{bytes=(bytes/Math.pow(1024,3)).toFixed(2)+'GB';}
else if (bytes>=Math.pow(1024,2))
{bytes=(bytes/Math.pow(1024,2)).toFixed(2)+'MB';}
else if (bytes>=Math.pow(1024,1))
{bytes=(bytes/Math.pow(1024,1)).toFixed(2)+'KB';}
else if (bytes>1) {bytes=bytes+' bytes';}
else if (bytes==1) {bytes=bytes+' byte';}
else {bytes='0 byte';}
return bytes;
}
print('' );
print('#############################' );
print('# ZFS Appliance Space Usage #' );
print('#############################' );
print('' );
run('cd /');
var ZFSSA_NODENAME = run('configuration version get nodename').split(/\s+/)
[3];
run('status');
run('storage');
pools = list();
for (i = 0; i < pools.length; i++)
{
run('select ' + pools[i]);
FORMAT1 = '%-15s: %10s\n';
printf(FORMAT1,'ZFSSA NodeName',ZFSSA_NODENAME) ;
printf(FORMAT1,'Pool',pools[i]) ;
printf(FORMAT1,'State',get('state')) ;
printf(FORMAT1,'Total',BytesToString(get('used') + get('avail'))) ;
printf(FORMAT1,'Used',BytesToString(get('used'))) ;
printf(FORMAT1,'Avail',BytesToString(get('avail'))) ;
printf(FORMAT1,'Used%',(get('used')* 100 / (get('used') +
get('avail')) ).toFixed(2) + '%') ;
printf(FORMAT1,'Avail%',(get('avail')* 100 / (get('used') + get('avail'))
).toFixed(2) + '%') ;
printf(FORMAT1,'Compression',get('compression') + 'x') ;
printf(FORMAT1,'Dedup',get('dedup') + 'x') ;
print('' );
run('cd ..');
}
.

//#######################################
//# List Projects
//#######################################
script
function BytesToString(bytes)
{
if (bytes>=Math.pow(1024,5))
{bytes=(bytes/Math.pow(1024,5)).toFixed(2)+'PB';}
else if (bytes>=Math.pow(1024,4))
{bytes=(bytes/Math.pow(1024,4)).toFixed(2)+'TB';}
else if (bytes>=Math.pow(1024,3))
{bytes=(bytes/Math.pow(1024,3)).toFixed(2)+'GB';}
else if (bytes>=Math.pow(1024,2))
{bytes=(bytes/Math.pow(1024,2)).toFixed(2)+'MB';}
else if (bytes>=Math.pow(1024,1))
{bytes=(bytes/Math.pow(1024,1)).toFixed(2)+'KB';}
else if (bytes>1) {bytes=bytes+'B';}
else if (bytes==1) {bytes=bytes+'B';}
else {bytes='0';}
return bytes;
}
function lpad(str, len, pad) {
if (typeof(len) == "undefined") { var len = 0; }
if (typeof(pad) == "undefined") { var pad = ' '; }
if (len + 1 >= str.length) {
str = Array(len + 1 - str.length).join(pad) + str;
}
return str;
}
function rpad(str, len, pad) {
if (typeof(len) == "undefined") { var len = 0; }
if (typeof(pad) == "undefined") { var pad = ' '; }
if (len + 1 >= str.length) {
str = str + Array(len + 1 - str.length).join(pad);
}
return str;
}
var timestampformat='%Y-%m-%d %H:%M:%S (%Z)';
run('cd /');
var ZFSSA_NODENAME = run('configuration version get nodename').split(/\s+/)[3];
run('cd /');
run('shares');
projects = list();
print('##################################' );
print('PROJECTS ' );
print('##################################' );
print('' );
var FORMAT='%-10s %-30s %-5s %-6s %-5s %-5s %-5s %-10s %-8s %-8s %-8s %-6s %-
5s %-6s %-19s\n';

printf(FORMAT,'' ,'' ,'' ,'Record' ,'' ,'Comp' ,''


, '' ,'' ,'' ,'' ,'' ,'' ,
'' ,'Creation' );
printf(FORMAT,'ZFSSA
Node','PROJECT' ,'ATIME','Size' ,'Comp' ,'Ratio' ,'Cache',
'LOGBIAS' ,'TOTAL' ,'DATA' ,'SNAP' ,'Shares','Snaps',
'Copies' ,'YYYY-MM-DD HH:MI:SS' );

printf(FORMAT,'==========','=============' ,'=====','======' ,'====' ,'=====' ,'==


===', '==========' ,'========' ,'========' ,'========' ,'======','=====',
'======' ,'=====================');
for (i = 0; i < projects.length; i++)
{
run('select ' + projects[i]);
run('snapshots');
snapshots = list();
var noof_snapshots = 0;
noof_snapshots = snapshots.length;
run('cd ..');
shares = list();
var noof_shares = 0;
noof_shares = shares.length;
printf(FORMAT
, ZFSSA_NODENAME
, projects[i]
, get('atime')
, get('recordsize')
, get('compression')
, get('compressratio')
, get('secondarycache')
, get('logbias')
, lpad(BytesToString(get('space_total')),8)
, lpad(BytesToString(get('space_data')),8)
, lpad(BytesToString(get('space_snapshots')),8)
, noof_shares
, noof_snapshots
, get('copies')
, get('creation').toLocaleFormat(timestampformat).toUpperCase()
);
run('cd ..');
}
.

//#######################################
//# Projects Cleanup
//#######################################

script
run('cd /');
var ZFSSA_NODENAME = run('configuration version get nodename').split(/\s+/)
[3];
run('cd /');
run('shares');
projects = list();
print('##################################' );
print('PROJECTS ' );
print('##################################' );
print('' );
var FORMAT='%-10s %-30s %-7s %-7s %-7s %-6s %-5s %-6s %-20s %-30s\n';
printf(FORMAT,'ZFSSA
Node','PROJECT' ,'TOTAL' ,'DATA' ,'SNAP' ,'Shares','Snaps',
'Copies' ,'Creation' , 'Command' );

printf(FORMAT,'==========','=============' ,'=====' ,'====' ,'====' ,'======','===


==', '======' ,'========' , '=======');
for (i = 0; i < projects.length; i++)
{
if ( projects[i].search('CLONE_') > -1 )
{
run('select ' + projects[i]);
run('snapshots');
snapshots = list();
var noof_snapshots = 0;
if ( snapshots.length > 0 ) {
noof_snapshots = snapshots.length;
}
run('cd ..');
shares = list();
var noof_shares = 0;
if ( shares.length > 0 ) {
noof_shares = shares.length;
}
creation=run('get creation').split(/=/)[1].split(/\n/)[0].substr(1);
creation=creation.split(/\s+/)[2] + '-' + creation.split(/\s+/)[1] +
'-' + creation.split(/\s+/)[3] + ' ' + creation.split(/\s+/)[4] + ' ' +
creation.split(/\s+/)[5];
printf(FORMAT
, ZFSSA_NODENAME
, projects[i]
, run('get space_total').split(/\s+/)[3]
, run('get space_data').split(/\s+/)[3]
, run('get space_snapshots').split(/\s+/)[3]
, noof_shares
, noof_snapshots
, run('get copies').split(/\s+/)[3]
, creation
, 'confirm shares destroy ' + projects[i]
);
run('cd ..');
}
}
.

//#######################################
//# List Automatic Snapshot Schedules
//#######################################
script
run('cd /');
var ZFSSA_NODENAME = run('configuration version get nodename').split(/\s+/)
[3];
run('shares');
var pool = run('get pool').split(/\s+/)[3];
projects = list();
print ('################################');
print ('# Automatic Snapshot Schedules #');
print ('################################');
print('' );
var FORMAT='%-10s %-10s %-30s %-30s %-9s %-9s %-5s %-5s\n';
printf(FORMAT, 'ZFSSA Node' , 'POOL' , 'PROJECT' ,
'AutoSchedule' , 'FREQUENCY', 'DAY' , 'HH:MM' ,'KEEP');
printf(FORMAT, '==========' , '=======', '==============',
'===============', '=========', '=========', '=====' ,'====');
for (i = 0; i < projects.length; i++)
{
run('select ' + projects[i]);
run('snapshots automatic');
autoschedule = list();
if (autoschedule.length > 0 )
{
for (j = 0; j < autoschedule.length; j++)
{
run('select ' + autoschedule[j]);
printf(FORMAT
, ZFSSA_NODENAME
, pool
, projects[i]
, autoschedule[j]
, run('get frequency').split(/\s+/)[3]
, run('get day').split(/\s+/)[3]
, run('get hour').split(/\s+/)[3] + ':' + run('get
minute').split(/\s+/)[3]
, run('get keep').split(/\s+/)[3]
);
run('cd ..');
}
}
run('cd ..');
run('cd ..');
run('cd ..');
}
.

//#######################################
//# List Snapshot Info (Project Level)
//#######################################
script
print ('#################################');
print ('# Snapshot Info (Project Level) #');
print ('#################################');
print('' );
run('cd /');
var ZFSSA_NODENAME = run('configuration version get nodename').split(/\s+/)
[3];
run('shares');
projects = list();
var FORMAT='%-10s %-10s %-30s %-30s %-6s %-6s %-12s %-19s\n';
printf(FORMAT, 'ZFSSA Node' , 'POOL' , 'PROJECT' ,
'SNAPSHOT' , 'ISAUTO', 'Clones', 'UniqueSpace', 'Creation');
printf(FORMAT, '==========' , '=======', '==============',
'===============', '======', '======', '===========', '=====================');
for (i = 0; i < projects.length; i++)
{
run('select ' + projects[i]);
run('snapshots');
snapshots = list();
if (snapshots.length > 0 )
{
for (j = 0; j < snapshots.length; j++)
{
run('select ' + snapshots[j]);
creation=run('get creation').split(/=/)[1].split(/\n/)
[0].substr(1);
creation=creation.split(/\s+/)[2] + '-' +
creation.split(/\s+/)[1] + '-' + creation.split(/\s+/)[3] + ' ' +
creation.split(/\s+/)[4] + ' ' + creation.split(/\s+/)[5];
printf(FORMAT
, ZFSSA_NODENAME
, run('get pool').split(/\s+/)[3]
, projects[i]
, snapshots[j]
, run('get isauto').split(/\s+/)[3]
, run('get numclones').split(/\s+/)[3]
, run('get space_unique').split(/\s+/)[3]
, creation
);
run('cd ..');
}
}
run('cd ..');
run('cd ..');
}
.

//#######################################
//# Project Snapshot Cleanup
//#######################################
script
run('cd /');
var ZFSSA_NODENAME = run('configuration version get nodename').split(/\s+/)
[3];
run('shares');
projects = list();
print ('############################');
print ('# Project Snapshot Cleanup #');
print ('############################');
print('' );
var FORMAT='%-10s %-10s %-30s %-60s\n';
printf(FORMAT, 'ZFSSA Node' , 'POOL' , 'Creation' ,'Command');
printf(FORMAT, '==========' , '=======',
'==================' ,'========================================');
for (i = 0; i < projects.length; i++)
{
run('select ' + projects[i]);
run('snapshots');
snapshots = list();
if (snapshots.length > 0 )
{
for (j = 0; j < snapshots.length; j++)
{
//if ( )
if ( snapshots[j].search('SNAP_') > -1 ||
snapshots[j].search('AL06') > -1 )
{
run('select ' + snapshots[j]);
creation=run('get creation').split(/=/)[1].split(/\n/)
[0].substr(1);
creation=creation.split(/\s+/)[2] + '-' +
creation.split(/\s+/)[1] + '-' + creation.split(/\s+/)[3] + ' ' +
creation.split(/\s+/)[4] + ' ' + creation.split(/\s+/)[5];
printf(FORMAT
, ZFSSA_NODENAME
, run('get pool').split(/\s+/)[3]
, creation
, 'confirm shares select ' + projects[i] + '
snapshots destroy ' + snapshots[j]
);
run('cd ..');
}
}
}
run('cd ..');
run('cd ..');
}
.

//#######################################
//# Shares Info
//#######################################
script
print('##################################' );
print('Shares Info ' );
print('##################################' );
print('' );
run('cd /');
run('shares');
projects = list();
var FORMAT='%-40s %-30s %-5s %-5s %-9s %-10s %-7s %-7s %-7s %-5s %-7s %-
19s\n';
printf(FORMAT ,'SHARE' , 'MOUNTPOINT', 'ATIME', 'Comp', 'CompRatio',
'LOGBIAS', 'TOTAL', 'DATA', 'SNAP', 'Snaps', 'COPIES', 'Creation');
printf(FORMAT, '============', '==========', '=====', '====', '=========',
'=======', '=====', '====', '====', '=====', '======',
'=========================');
for (i = 0; i < projects.length; i++)
{
run('select ' + projects[i]);
shares = list();
if ( shares.length > 0 )
{
for (j = 0; j < shares.length; j++)
{
run('select ' + shares[j]);
run('snapshots');
snapshots = list();
var noof_snapshots = 0;
if ( snapshots.length > 0 ) {
noof_snapshots = snapshots.length;
}
run('cd ..');
creation=run('get creation').split(/=/)[1].split(/\n/)
[0].substr(1);
creation=creation.split(/\s+/)[3] + '-' + creation.split(/\s+/)[2]
+ '-' + creation.split(/\s+/)[4] + ' ' + creation.split(/\s+/)[5] ;
printf(FORMAT
, projects[i] + '/' + shares[j]
, run('get mountpoint').split(/\s+/)[3]
, run('get atime').split(/\s+/)[3]
, run('get compression').split(/\s+/)[3]
, run('get compressratio').split(/\s+/)[3]
, run('get logbias').split(/\s+/)[3]
, run('get space_total').split(/\s+/)[3]
, run('get space_data').split(/\s+/)[3]
, run('get space_snapshots').split(/\s+/)[3]
, noof_snapshots
, run('get copies').split(/\s+/)[3]
, creation
);
run('cd ..');
}
}
run('cd ..');
}
.

//#######################################
//# List Snapshot Info (Share Level)
//#######################################
script
print ('#################################');
print ('# Snapshot Info (Share Level) #');
print ('#################################');
print('' );
run('cd /');
run('shares');
projects = list();
var FORMAT='%-10s %-30s %-15s %-7s %-25s %-6s %-6s %-6s %-19s\n';
printf(FORMAT, '' , '' , '' , 'Snap' , ''
, '' , '' , 'Unique' , '' );
printf(FORMAT, 'POOL' , 'PROJECT' , 'SHARE' , 'Level' ,
'SNAPSHOT' , 'ISAUTO', 'Clones' , 'Space' , 'Creation');
printf(FORMAT, '=======', '==============', '==============', '=====' ,
'===============', '======', '======' , '======' , '=====================');
for (i = 0; i < projects.length; i++)
{
run('select ' + projects[i]);
shares = list();
if (shares.length > 0 )
{
for (j = 0; j < shares.length; j++)
{
run('select ' + shares[j]);
run('snapshots');
snapshots = list();
if (snapshots.length > 0 )
{
for (k = 0; k < snapshots.length; k++)
{
var snaplevel = '';
run('select ' + snapshots[k]);
run('cd ..');
run('cd ..');
run('cd ..');
run('snapshots');
try {
run('select ' + snapshots[k] );
run('cd ..');
snaplevel = 'Project';
} catch (err) {
snaplevel = 'Share';
}
run('cd ..');
run('select ' + shares[j]);
run('snapshots');
run('select ' + snapshots[k]);
creation=run('get creation').split(/=/)[1].split(/\n/)
[0].substr(1);
creation=creation.split(/\s+/)[3] + '-' +
creation.split(/\s+/)[2] + '-' + creation.split(/\s+/)[4] + ' ' +
creation.split(/\s+/)[5] ;
if ( snaplevel != 'Project' ) {
printf(FORMAT
, run('get pool').split(/\s+/)[3]
, projects[i]
, shares[j]
, snaplevel
, snapshots[k]
, run('get isauto').split(/\s+/)[3]
, run('get numclones').split(/\s+/)[3]
, run('get space_unique').split(/\s+/)[3]
, creation
);
}
run('cd ..');
}
}
run('cd ..');
run('cd ..');
}
}
run('cd ..');
}
.

//#######################################
//# List Analytic Worksheets
//#######################################
script
print ('#########################');
print ('# Analytic Worksheets #');
print ('#########################');
print('' );
var WORKSHEET_FORMAT='%-10s %-35s %-7s %-20s %-20s %-20s\n';
printf(WORKSHEET_FORMAT, 'ZFSSA Node' , 'Worksheet
Name' ,'Seconds','Owner','Modified','Created');
printf(WORKSHEET_FORMAT, '==========' ,
'==============' ,'=======','=====','========','=======');
run('cd /');
var ZFSSA_NODENAME = run('configuration version get nodename').split(/\s+/)
[3];
run('analytics worksheets');
worksheets = list();
for (i = 0; i < worksheets.length; i++)
{
run('select ' + worksheets[i]);
name = run('get name').split(/=/)[1].split(/\n/)[0].substr(1);
owner = run('get owner').split(/=/)[1].split(/\n/)[0].substr(1);
ctime = run('get ctime').split(/=/)[1].split(/\n/)[0].substr(1);
mtime = run('get mtime').split(/=/)[1].split(/\n/)[0].substr(1);
printf(WORKSHEET_FORMAT
, ZFSSA_NODENAME
, name
, ' '
, owner
, mtime
, ctime
);
datasets = list();
var DATASET_FORMAT='%-15s %-30s %-20s\n';
for (j = 0; j < datasets.length; j++)
{
run('select ' + datasets[j]);
printf(DATASET_FORMAT
, ' '
, run('get name').split(/=/)[1].split(/\n/)[0].substr(1)
, run('get seconds').split(/=/)[1].split(/\n/)[0].substr(1)
);
run('done');
}
print('');
run('done');
}
.

//#######################################
//# List Analytic Datasets
//#######################################
script
print ('#########################');
print ('# Analytic Datasets #');
print ('#########################');
print('' );
run('cd /');
var ZFSSA_NODENAME = run('configuration version get nodename').split(/\s+/)
[3];
run('analytics settings');
print('Settings:' );
print(run('get retain_second_data'));
print(run('get retain_minute_data'));
print(run('get retain_hour_data'));
print('' );
var FORMAT='%-10s %-11s %-10s %-10s %-6s %-6s %-10s %-40s %-40s \n';
printf(FORMAT, 'ZFSSA Node' , 'Dataset
ID' ,'Grouping','State' ,'InCore' ,'OnDisk','Activity' ,'Dataset Name'
,'Description');
printf(FORMAT, '==========' ,
'==========' ,'========','========','======','======','==========','===============
========','=============================');
run('cd /');
run('analytics datasets');
datasets = list();
for (i = 0; i < datasets.length; i++)
{
run('select ' + datasets[i]);
var state;
if ( run('get suspended').split(/\s+/)[3] == 'true') { state =
'Suspended';}
else { state = 'Active';}
//if ( state = 'Active' )
//{
printf(FORMAT
, ZFSSA_NODENAME
, datasets[i]
, run('get grouping').split(/\s+/)[3]
, state
, run('get incore').split(/\s+/)[3]
, run('get size').split(/\s+/)[3]
, run('get activity').split(/\s+/)[3]
, run('get name').split(/\s+/)[3]
, run('get explanation').split(/=/)[1].split(/\n/)[0].substr(1)
);
//}
run('cd ..');
}
.

//#######################################
//# Display ZFS Statistics
//#######################################

script
print ('#########################');
print ('# Analytic Datasets #');
print ('#########################');
print('' );
var dataset_name = 'ip.bytes[hostname]';
var seconds_to_read = 10;
var datetime;
var ZFSSA_NODENAME;
var value;
var breakdown;
run('cd /');
ZFSSA_NODENAME = run('configuration version get nodename').split(/\s+/)
[3].toLowerCase();
run('cd /');
run('analytics datasets');
datasets = list();
for (f = 0; f < datasets.length; f++)
{
run('select ' + datasets[f]);
name = run('get name').split(/\s+/)[3];
//print (name);
if ( name == dataset_name )
{
// Get last N seconds data including breakdown and iterate through line
line = run('read ' + seconds_to_read).split(/\n/);
for (i = 0; i<line.length; i++)
{
value = '';
breakdown = '';
// Iterate through words in each line
column = line[i].split(/\s+/);
// Ignore head line
if ( column[0] != 'DATE/TIME' || column[0] == '' )
{
//New time line
if ( column[0] =~ '2014' && column[0] != '')
{
datetime = line[i].split(/\s+/)[0] + ' ' + column[1];
value = column[3];
breakdown = column[4];
//dump(line[i]);
//print(datetime + ' '+ value + ' ' + breakdown);
}
else
{
value = column[1];
breakdown = column[2];
//dump(line[i]);
//print(value + ' ' + breakdown);
}
// Only print values if variables are defined
if ( datetime && value && breakdown)
{
print(datetime + ' ' + value + ' ' + breakdown);
}
}
}
}
run('cd ..');
}
.

//#######################################
//# List Hardware info
//#######################################
script
run('cd /');
var ZFSSA_NODENAME = run('configuration version get nodename').split(/\s+/)
[3];
print ('#########################');
print ('# Project Snapshot Info #');
print ('#########################');
print('' );
run('maintenance hardware');
run('select chassis-000' );
print('Name : ' + run('get name').split(/=/)[1].split(/\n/)
[0].substr(1) );
print('Manufacturer : ' + run('get manufacturer').split(/=/)[1].split(/\n/)
[0].substr(1) );
print('Model : ' + run('get model').split(/=/)[1].split(/\n/)
[0].substr(1) );
print('Serial : ' + run('get serial').split(/=/)[1].split(/\n/)
[0].substr(1) );
run('select cpu');
cpu = list();
run('select ' + cpu[0]);
print('Processors : ' + (cpu.length)
+ 'x '
+ run('get speed').split(/=/)[1].split(/\n/)
[0].substr(1)
+ ' '
//+ run('get model').split(/=/)
[1].split(/\n/)[0].substr(1)
);
run('done');
run('done');

run('select memory');
cpu = list();
run('select ' + cpu[0]);
print('Processors : ' + (cpu.length)
+ 'x '
+ run('get speed').split(/=/)[1].split(/\n/)
[0].substr(1)
+ ' '
+ run('get model').split(/=/)[1].split(/\n/)
[0].substr(1) );
run('done');
run('done');
run('done');
print(' ');
print(' ');
/*
var FORMAT='%-10s %-11s %-10s %-10s %-7s %-25s %-25s %-10s %-10s\n';
printf(FORMAT, 'ZFSSA Node' ,o 'Chassis', 'Type' , 'Name' , 'State' ,
'Manufacturer' , 'Model' , 'Serial' , 'Locate' );
printf(FORMAT, '==========' , '=======', '=====' , '=====' , '=====' ,
'============' , '=========', '======' , '=====' );
chassis = list();
for (i = 1; i < chassis.length; i++)
{
run('select ' + chassis[i]);
faulted = run('get faulted').split(/\s+/)[3];
if ( faulted == 'false' ) { state = 'ok' }
else { state = 'faulted' }
printf(FORMAT
, ZFSSA_NODENAME
, chassis[i]
, run('get type').split(/=/)[1].split(/\n/)[0].substr(1)
, run('get name').split(/=/)[1].split(/\n/)[0].substr(1)
, state
, run('get manufacturer').split(/=/)[1].split(/\n/)[0].substr(1)
, run('get model').split(/=/)[1].split(/\n/)[0].substr(1)
, run('get serial').split(/=/)[1].split(/\n/)[0].substr(1)
, run('get locate').split(/=/)[1].split(/\n/)[0].substr(1)
);
run('done');
}
*/
.
creation=run('get creation').split(/=/)[1].split(/\n/)[0].substr(1);
creation=creation.split(/\s+/)[2] + '-' + creation.split(/\s+/)[1] + '-' +
creation.split(/\s+/)[3] + ' ' + creation.split(/\s+/)[4] + ' ' +
creation.split(/\s+/)[5];

//########################################################
//# Delete snapshots and clone older than a date
//########################################################
script
var threshold_date='20140922';
var SNAPNAME_PREFIX1='SNAP_';
var SNAPNAME_PREFIX2='AL06PIMI_';
var CLONENAME_PREFIX='CLONE_';
run('cd /');
ZFSSA_NODENAME = run('configuration version get nodename').split(/\s+/)[3];
run('shares');
projects = list();
print ('##################################');
print ('# Older Clone/Snapshost Clean-up #');
print ('##################################');
print('' );
function dateToString(inDate)
{
year = inDate.getUTCFullYear().toString();
// Month returned is from 0 - 11, so need to add 1
month = inDate.getUTCMonth() + 1;
month = month.toString();
date = inDate.getUTCDate().toString();

outDate = year;

if ( month.length == 1 )
{ outDate = outDate + '0' + month; }
else { outDate = outDate + month; }

if ( date.length == 1 )
{ outDate = outDate + '0' + date; }
else { outDate = outDate + date; }
return outDate;
}
var FORMAT='%-10s %-10s %-40s %-60s\n';
printf(FORMAT, 'ZFSSA Node' , 'POOL' , 'Creation' ,'Command');
printf(FORMAT, '==========' , '=======',
'==================' ,'========================================');
for (i = 0; i < projects.length; i++)
{
run('cd /');
run('shares');
run('select ' + projects[i]);
if ( projects[i].search(CLONENAME_PREFIX) > -1 )
{
creation = dateToString(get('creation'));
if ( creation < threshold_date )
{
printf(FORMAT
, ZFSSA_NODENAME
, run('get pool').split(/\s+/)[3]
, get('creation')
, 'confirm shares destroy ' + projects[i]
);
}
}
run('snapshots');
snapshots = list();
if (snapshots.length > 0 )
{
for (j = 0; j < snapshots.length; j++)
{
if ( snapshots[j].search(SNAPNAME_PREFIX1) > -1 ||
snapshots[j].search(SNAPNAME_PREFIX2) > -1 )
{
run('select ' + snapshots[j] );
creation = dateToString(get('creation'));
if ( creation < threshold_date )
{
printf(FORMAT
, ZFSSA_NODENAME
, run('get pool').split(/\s+/)[3]
, get('creation')
, 'confirm shares select ' + projects[i] + ' snapshots
destroy ' + snapshots[j]
);
}
run('cd ..');
}
}
}
}
.

//########################################################
//# Scratchpad
//########################################################
script
print(get('creation').getUTCDate().toString() );
print(get('creation').toDateString() );
.

script
creation = get('creation').getUTCFullYear().valueOf();
if ( get('creation').getUTCMonth().toString().length == 1 )
{ creation = creation + '0' + get('creation').getUTCMonth(); }
else { creation = creation + get('creation').getUTCMonth(); }

if ( get('creation').getUTCDate().toString().length == 1 )
{ creation = creation + '0' + get('creation').getUTCDate(); }
else { creation = creation + get('creation').getUTCDate(); }

if ( creation > '20140910')


{ print(creation + ' date is older');}
else
{ print(creation +' date is new');}
.

script
var mydate= new Date();
var mydate2= new Date();
print(mydate.toString());
print(mydate2.toString());
mydate2 = mydate2.toString() - 10;
print(mydate2.toString());
.

script
function SuffixToMultiplier(suffix)
{
switch (suffix)
{
case('K'): return Math.pow(1024,1); break;
case('M'): return Math.pow(1024,2); break;
case('G'): return Math.pow(1024,3); break;
case('T'): return Math.pow(1024,4); break;
case('P'): return Math.pow(1024,5); break;
default: return 1; break;
}
}

function StringtoBytes(value)
{
if ( value.charAt(value.length-1). )
{
return value.substr(0,value.length - 1) *
SuffixToMultiplier(value.charAt(value.length-1));
}
}

script
function BytesToString(bytes)
{
if (bytes>=Math.pow(1024,5))
{bytes=(bytes/Math.pow(1024,5)).toFixed(2)+' PB';}
else if (bytes>=Math.pow(1024,4))
{bytes=(bytes/Math.pow(1024,4)).toFixed(2)+' TB';}
else if (bytes>=Math.pow(1024,3))
{bytes=(bytes/Math.pow(1024,3)).toFixed(2)+' GB';}
else if (bytes>=Math.pow(1024,2))
{bytes=(bytes/Math.pow(1024,2)).toFixed(2)+' MB';}
else if (bytes>=Math.pow(1024,1))
{bytes=(bytes/Math.pow(1024,1)).toFixed(2)+' KB';}
else if (bytes>1) {bytes=bytes+' bytes';}
else if (bytes==1) {bytes=bytes+' byte';}
else {bytes='0 byte';}
return bytes;
}
print (BytesToString(102345000000000667));
print (BytesToString(10125));
.

Potrebbero piacerti anche