moving projects
This commit is contained in:
75
anduril/csc_vm_status_query
Executable file
75
anduril/csc_vm_status_query
Executable file
@@ -0,0 +1,75 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
help='CSC Virtual Machine Load Status
|
||||||
|
|
||||||
|
-s Short (default)
|
||||||
|
-l Long
|
||||||
|
-c Do not pretty print short output
|
||||||
|
-b [l|m] return the name of the node with l=least load, m=least used memory
|
||||||
|
-u [username] return a list of nodes with processes of given user
|
||||||
|
|
||||||
|
L=Load, M=used memory + cached / total, U=users with processes
|
||||||
|
'
|
||||||
|
|
||||||
|
mode="short"
|
||||||
|
postprocess=" | ncsv -c -i' ' -d' ' "
|
||||||
|
while getopts "clshu:b:" OPTS;
|
||||||
|
do case ${OPTS} in
|
||||||
|
s)
|
||||||
|
mode="short"
|
||||||
|
;;
|
||||||
|
l)
|
||||||
|
mode="long"
|
||||||
|
;;
|
||||||
|
c)
|
||||||
|
postprocess=""
|
||||||
|
;;
|
||||||
|
b)
|
||||||
|
mode="best"
|
||||||
|
[ "$OPTARG" = "l" ] && bestcol=3
|
||||||
|
[ "$OPTARG" = "m" ] && bestcol=6
|
||||||
|
if [ -z "$bestcol" ]
|
||||||
|
then echo "Argument to -b not recognized"
|
||||||
|
echo "$help"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
u)
|
||||||
|
mode="user"
|
||||||
|
username=$OPTARG
|
||||||
|
[ -z "$username" ] && exit
|
||||||
|
;;
|
||||||
|
h)
|
||||||
|
echo "$help"
|
||||||
|
exit
|
||||||
|
;;
|
||||||
|
?)
|
||||||
|
echo "$help"
|
||||||
|
exit
|
||||||
|
;;
|
||||||
|
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
if [ "$OPTIND" -gt 1 ]
|
||||||
|
then shift $(( $OPTIND-1 ))
|
||||||
|
fi
|
||||||
|
|
||||||
|
status_folder="/mnt/csc-cloud/vm_state"
|
||||||
|
if [ ! -d "$status_folder" ]
|
||||||
|
then echo $status_folder not mounted
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$mode" = "short" ]
|
||||||
|
then eval "cat $status_folder/*short $postprocess"
|
||||||
|
fi
|
||||||
|
if [ "$mode" = "long" ]
|
||||||
|
then eval "cat $status_folder/*long"
|
||||||
|
fi
|
||||||
|
if [ "$mode" = "best" ]
|
||||||
|
then eval "cat $status_folder/*short" | sed 's,[|/:\+], ,g' | sort -k $bestcol -n | cut -d" " -f2 | head -n 1
|
||||||
|
fi
|
||||||
|
if [ "$mode" = "user" ]
|
||||||
|
then eval "grep $username $status_folder/*long" | sed -e 's,.*/,,' -e 's,\..*, ,' | tr -d [:cntrl:]
|
||||||
|
echo ""
|
||||||
|
fi
|
||||||
191
anduril/exec_copy.py
Executable file
191
anduril/exec_copy.py
Executable file
@@ -0,0 +1,191 @@
|
|||||||
|
#!/usr/bin/python
|
||||||
|
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
import re
|
||||||
|
import csv
|
||||||
|
import shutil
|
||||||
|
from argparse import ArgumentParser
|
||||||
|
|
||||||
|
filesearch=re.compile('^_index$')
|
||||||
|
STATEFILE='_state'
|
||||||
|
DRYSTATEFILE='_stateDryRun'
|
||||||
|
|
||||||
|
def setup_options():
|
||||||
|
usage='''%(prog)s [options]
|
||||||
|
Use rsync to copy your execution folder to a new place.
|
||||||
|
e.g. rsync -avP -e ssh user@server:/source/path/ target/path/
|
||||||
|
Then give a replacement pair -i and -o for each expected changed absolute path.
|
||||||
|
(multiple -i and -o are often required)
|
||||||
|
|
||||||
|
Each replace pair is tried, until a file with that replaced name is found.
|
||||||
|
'''
|
||||||
|
|
||||||
|
parser=ArgumentParser(usage=usage)
|
||||||
|
parser.add_argument("-d",type=str,dest="execpath",default=".",
|
||||||
|
help="Execution folder for anduril (location for _state), default: %(default)s")
|
||||||
|
parser.add_argument("-i",type=str,dest="inabs",action="append",default=["."],
|
||||||
|
help="Input absolute path prefix. e.g. /home1/user1/project/")
|
||||||
|
parser.add_argument("-o",type=str,dest="outabs",action="append",default=["."],
|
||||||
|
help="Output absolute path prefix. e.g. /home2/user2/different_project/")
|
||||||
|
parser.add_argument("-q",action="store_true",dest="query",default=False,
|
||||||
|
help="Compare "+STATEFILE+" and "+DRYSTATEFILE+" to "+
|
||||||
|
"see which components are not up-to-date. Use the anduril command: "+
|
||||||
|
"anduril run --dry ... to create the dry state file" )
|
||||||
|
return parser.parse_args()
|
||||||
|
|
||||||
|
def check_options(opts):
|
||||||
|
if not (os.path.isfile(os.path.join(opts.execpath,STATEFILE))):
|
||||||
|
print(STATEFILE+' file not found in folder '+opts.execpath)
|
||||||
|
sys.exit(1)
|
||||||
|
if opts.query:
|
||||||
|
if not (os.path.isfile(os.path.join(opts.execpath,DRYSTATEFILE))):
|
||||||
|
print(DRYSTATEFILE+' file not found in folder '+opts.execpath)
|
||||||
|
sys.exit(1)
|
||||||
|
if len(opts.inabs) is not len(opts.outabs):
|
||||||
|
print('A matching pair must be found for each -i/-o argument')
|
||||||
|
sys.exit(1)
|
||||||
|
if not opts.execpath.endswith('/'):
|
||||||
|
opts.execpath=opts.execpath+'/'
|
||||||
|
for i in xrange(len(opts.inabs)):
|
||||||
|
if not opts.inabs[i].endswith('/'):
|
||||||
|
opts.inabs[i]=opts.inabs[i]+'/'
|
||||||
|
for i in xrange(len(opts.outabs)):
|
||||||
|
if not opts.outabs[i].endswith('/'):
|
||||||
|
opts.outabs[i]=opts.outabs[i]+'/'
|
||||||
|
|
||||||
|
return opts
|
||||||
|
|
||||||
|
def getpathlist(path):
|
||||||
|
''' Returns a list of subfolders '''
|
||||||
|
list=os.listdir(path)
|
||||||
|
paths=[]
|
||||||
|
for d in list:
|
||||||
|
if (os.path.isdir(os.path.join(path,d))):
|
||||||
|
paths.append(d+'/')
|
||||||
|
return paths
|
||||||
|
|
||||||
|
def getfilelist(path):
|
||||||
|
''' Returns a list of files that might require change '''
|
||||||
|
list=os.listdir(path)
|
||||||
|
files=[]
|
||||||
|
for f in list:
|
||||||
|
if (filesearch.match(f)) and (os.path.isfile(os.path.join(path,f))):
|
||||||
|
files.append(f)
|
||||||
|
return files
|
||||||
|
|
||||||
|
def statefile(opts,path):
|
||||||
|
print('Parsing _state file')
|
||||||
|
shutil.copy2(os.path.join(path,STATEFILE), os.path.join(path,STATEFILE+'.bkp'))
|
||||||
|
statereader=csv.reader(open(os.path.join(path,STATEFILE),'rb'),
|
||||||
|
delimiter='\t',
|
||||||
|
doublequote=False,
|
||||||
|
escapechar='\\',
|
||||||
|
quoting=csv.QUOTE_NONE)
|
||||||
|
stateout=[]
|
||||||
|
for row in statereader:
|
||||||
|
rowout=row
|
||||||
|
if row[3].startswith('INPUT '):
|
||||||
|
newinput=row[3]
|
||||||
|
rowpstart=row[3].index(' P path=')
|
||||||
|
rowtstart=row[3].index(' TS in=')
|
||||||
|
rowpath=row[3][(rowpstart+7):rowtstart]
|
||||||
|
rowtime=row[3][(rowtstart+7):-1]
|
||||||
|
# time has a space at the end (and three zeros...)
|
||||||
|
print('INPUT found: "'+row[3]+'"')
|
||||||
|
found=False
|
||||||
|
for i in xrange(len(opts.inabs)):
|
||||||
|
newpath=rowpath.replace('='+opts.inabs[i],'='+opts.outabs[i])
|
||||||
|
if os.path.exists(newpath[1:]):
|
||||||
|
found=True
|
||||||
|
newtime=str(int(os.path.getmtime(newpath[1:])))+'000'
|
||||||
|
newinput=row[3].replace(rowpath,newpath,1).replace(rowtime,newtime,1)
|
||||||
|
print('NEW INPUT : "'+newinput+'"')
|
||||||
|
rowout[3]=newinput
|
||||||
|
break
|
||||||
|
if not found:
|
||||||
|
print('WARN: Could not find new INPUT, check your -i and -o arguments')
|
||||||
|
stateout.append(rowout)
|
||||||
|
statewriter=csv.writer(open(os.path.join(path,STATEFILE),'wb'),
|
||||||
|
delimiter='\t',
|
||||||
|
doublequote=False,
|
||||||
|
escapechar='\\',
|
||||||
|
quoting=csv.QUOTE_NONE)
|
||||||
|
statewriter.writerows(stateout)
|
||||||
|
|
||||||
|
return
|
||||||
|
|
||||||
|
def arrayreplace(path,filelist,opts):
|
||||||
|
header=['Key','File']
|
||||||
|
for f in filelist:
|
||||||
|
print('Modifying array: '+os.path.join(path,f))
|
||||||
|
arrayreader=csv.DictReader(open(os.path.join(path,f),'rb'),
|
||||||
|
delimiter='\t',
|
||||||
|
quotechar='"',
|
||||||
|
quoting=csv.QUOTE_ALL)
|
||||||
|
arrayout=[]
|
||||||
|
for row in arrayreader:
|
||||||
|
rowout=row
|
||||||
|
if os.path.exists(os.path.join(path,row['File'])):
|
||||||
|
arrayout.append(rowout)
|
||||||
|
continue
|
||||||
|
# File is a relative path, and exists - next iteration.
|
||||||
|
rowpath=row['File']
|
||||||
|
found=False
|
||||||
|
for i in xrange(len(opts.inabs)):
|
||||||
|
newpath=rowpath.replace(opts.inabs[i],opts.outabs[i],1)
|
||||||
|
if os.path.exists(newpath):
|
||||||
|
found=True
|
||||||
|
rowout['File']=newpath
|
||||||
|
break
|
||||||
|
if not found:
|
||||||
|
print('WARN: Could not find File '+rowpath+' in '+os.path.join(path,f)+', check your -i and -o arguments')
|
||||||
|
arrayout.append(rowout)
|
||||||
|
|
||||||
|
writer = csv.DictWriter(open(os.path.join(path,f),'wb'),
|
||||||
|
header,
|
||||||
|
delimiter='\t',
|
||||||
|
quotechar='"',
|
||||||
|
quoting=csv.QUOTE_MINIMAL)
|
||||||
|
writer.writerow(dict(zip(header,header)))
|
||||||
|
writer.writerows(arrayout)
|
||||||
|
|
||||||
|
return
|
||||||
|
|
||||||
|
def statequery(path):
|
||||||
|
statereader=csv.reader(open(os.path.join(path,DRYSTATEFILE),'rb'),
|
||||||
|
delimiter='\t',
|
||||||
|
doublequote=False,
|
||||||
|
escapechar='\\',
|
||||||
|
quoting=csv.QUOTE_NONE)
|
||||||
|
for row in statereader:
|
||||||
|
if row[1]=='NO':
|
||||||
|
print('Instance will run: '+row[0])
|
||||||
|
else:
|
||||||
|
print('Instance wont run: '+row[0])
|
||||||
|
|
||||||
|
return
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def traverse(opts,path):
|
||||||
|
pathlist=getpathlist(path)
|
||||||
|
filelist=getfilelist(path)
|
||||||
|
arrayreplace(path,filelist,opts)
|
||||||
|
for p in pathlist:
|
||||||
|
traverse(opts,os.path.join(path,p))
|
||||||
|
return
|
||||||
|
|
||||||
|
def main():
|
||||||
|
opts=setup_options()
|
||||||
|
opts=check_options(opts)
|
||||||
|
|
||||||
|
if opts.query:
|
||||||
|
statequery(opts.execpath)
|
||||||
|
else:
|
||||||
|
traverse(opts,opts.execpath)
|
||||||
|
statefile(opts,opts.execpath)
|
||||||
|
return
|
||||||
|
|
||||||
|
|
||||||
|
main()
|
||||||
48
anduril/rownicer.py
Executable file
48
anduril/rownicer.py
Executable file
@@ -0,0 +1,48 @@
|
|||||||
|
#!/usr/bin/python
|
||||||
|
import sys
|
||||||
|
import math
|
||||||
|
|
||||||
|
if (len(sys.argv)<2):
|
||||||
|
print('''Anduril network file indentation tool:
|
||||||
|
give the filename to break...
|
||||||
|
|
||||||
|
''')
|
||||||
|
sys.exit()
|
||||||
|
|
||||||
|
|
||||||
|
f=open(sys.argv[1],'r')
|
||||||
|
orig=f.read()
|
||||||
|
size=len(orig)
|
||||||
|
f.close()
|
||||||
|
chrcount=0
|
||||||
|
brace=0
|
||||||
|
firstofrow=True
|
||||||
|
inquotes=False
|
||||||
|
space=' '
|
||||||
|
|
||||||
|
for i in range(size):
|
||||||
|
c=orig[i]
|
||||||
|
chrcount+=1
|
||||||
|
if c=="\t":
|
||||||
|
sys.stdout.write(" ")
|
||||||
|
else:
|
||||||
|
sys.stdout.write(c)
|
||||||
|
if c=='"':
|
||||||
|
inquotes = not inquotes
|
||||||
|
if ( not inquotes ):
|
||||||
|
if c=="\n":
|
||||||
|
chrcount=0
|
||||||
|
brace=0
|
||||||
|
firstofrow=True
|
||||||
|
if ( c=="(" ) & ( firstofrow ):
|
||||||
|
brace=int(min(32,math.ceil((chrcount)/4)*4))
|
||||||
|
firstofrow=False
|
||||||
|
if ( i+1<size ):
|
||||||
|
if ( c=="," ):
|
||||||
|
if ( orig[i+1] == " " ):
|
||||||
|
spacecount=1
|
||||||
|
while ( orig[i+spacecount] == " " ):
|
||||||
|
spacecount+=1
|
||||||
|
sys.stdout.write('\n' + (1+brace-spacecount)*' ')
|
||||||
|
elif ( orig[i+1] != "\n"):
|
||||||
|
sys.stdout.write('\n' + (brace)*' ')
|
||||||
33
anduril/status_query.py
Executable file
33
anduril/status_query.py
Executable file
@@ -0,0 +1,33 @@
|
|||||||
|
#!/usr/bin/python
|
||||||
|
#echo client program
|
||||||
|
import socket
|
||||||
|
import sys
|
||||||
|
|
||||||
|
if len(sys.argv)<2:
|
||||||
|
message='HELO'
|
||||||
|
else:
|
||||||
|
message=sys.argv[1]
|
||||||
|
|
||||||
|
|
||||||
|
hosts=['vm1',
|
||||||
|
'vm2',
|
||||||
|
'vm3',
|
||||||
|
'vm4',
|
||||||
|
'vm5',
|
||||||
|
'vm6',
|
||||||
|
'narsil']
|
||||||
|
|
||||||
|
PORT = 50774 # The same port as used by the server
|
||||||
|
|
||||||
|
for HOST in hosts:
|
||||||
|
try:
|
||||||
|
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||||||
|
s.connect((HOST, PORT))
|
||||||
|
s.settimeout(10)
|
||||||
|
s.send(message)
|
||||||
|
data = s.recv(1024)
|
||||||
|
sys.stdout.write(data)
|
||||||
|
s.close()
|
||||||
|
except:
|
||||||
|
sys.stdout.write('|'+HOST+' does not answer. ')
|
||||||
|
|
||||||
58
anduril/status_reporter.py
Executable file
58
anduril/status_reporter.py
Executable file
@@ -0,0 +1,58 @@
|
|||||||
|
#!/usr/bin/python
|
||||||
|
#echo server program
|
||||||
|
import socket
|
||||||
|
import subprocess
|
||||||
|
|
||||||
|
help_message="""Recognized commands:
|
||||||
|
HELO (default)
|
||||||
|
SHORT
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
HOST = '' # Symbolic name meaning all available interfaces
|
||||||
|
PORT = 50774 # Arbitrary non-privileged port
|
||||||
|
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||||||
|
s.bind((HOST, PORT))
|
||||||
|
while 1:
|
||||||
|
s.listen(1)
|
||||||
|
conn, addr = s.accept()
|
||||||
|
#print 'Connected by', addr
|
||||||
|
while 1:
|
||||||
|
data = conn.recv(1024)
|
||||||
|
if not data: break
|
||||||
|
message=""
|
||||||
|
if (data=="HELO"):
|
||||||
|
uptime=subprocess.Popen(['uptime'], stdout=subprocess.PIPE)
|
||||||
|
mem=subprocess.Popen(['free -tg | head -n 2'], stdout=subprocess.PIPE,shell=True)
|
||||||
|
users=subprocess.Popen(['who -q | head -n 1'], stdout=subprocess.PIPE,shell=True)
|
||||||
|
message='='*10+socket.gethostname()+'='*10+'\n'+uptime.stdout.read()+mem.stdout.read()+users.stdout.read()
|
||||||
|
uptime.kill()
|
||||||
|
mem.kill()
|
||||||
|
users.kill()
|
||||||
|
elif (data=="SHORT"):
|
||||||
|
load=open('/proc/loadavg','r').read()
|
||||||
|
load=load.split(" ")
|
||||||
|
cpu=open('/proc/cpuinfo','r').read()
|
||||||
|
cpucount=0
|
||||||
|
for row in cpu.split("\n"):
|
||||||
|
if row.startswith('processor'):
|
||||||
|
cpucount+=1
|
||||||
|
loadpercent=int(100*float(load[0])/float(cpucount))
|
||||||
|
|
||||||
|
mem=open('/proc/meminfo','r').read()
|
||||||
|
memory={'total':0, 'free':0, 'cache':0, 'percent':0}
|
||||||
|
for row in mem.split("\n"):
|
||||||
|
if row.startswith('MemTotal'):
|
||||||
|
memory['total']=float(''.join(c for c in row if c.isdigit()))
|
||||||
|
if row.startswith('MemFree'):
|
||||||
|
memory['free']=float(''.join(c for c in row if c.isdigit()))
|
||||||
|
if row.startswith('Cached'):
|
||||||
|
memory['cache']=float(''.join(c for c in row if c.isdigit()))
|
||||||
|
memory['percent']=int(100 - (100*(memory['free']+memory['cache'])/memory['total']))
|
||||||
|
|
||||||
|
message='|'+socket.gethostname()+' L/M:'+str(loadpercent).zfill(3)+'/'+str(memory['percent']).zfill(3)+'% '
|
||||||
|
else:
|
||||||
|
message=help_message
|
||||||
|
conn.send(message)
|
||||||
|
conn.close()
|
||||||
|
|
||||||
48
anduril/testcasecopy.sh
Executable file
48
anduril/testcasecopy.sh
Executable file
@@ -0,0 +1,48 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
if [ -z "$2" ]
|
||||||
|
then
|
||||||
|
echo "
|
||||||
|
Copies Anduril testcase results to the original source location.
|
||||||
|
Use it when testcases fail, but you know the results to be correct.
|
||||||
|
After copying you must commit the changes in the checkout.
|
||||||
|
|
||||||
|
Usage: testcasecopy executionfolder/ComponentFolder /path/to/bundle/root
|
||||||
|
|
||||||
|
example: testcasecopy results/CSVJoin ~/anduril/trunk/microarray/
|
||||||
|
|
||||||
|
Any extra arguments are given to the copy command: cp -a [args] source target
|
||||||
|
Recommended use: -i for prompt before overwrite and -v for verbose
|
||||||
|
"
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
IFS=$'\n'
|
||||||
|
component=$( basename "$1" )
|
||||||
|
execfolder=$( dirname "$1" )
|
||||||
|
source=$1
|
||||||
|
bundle=$2
|
||||||
|
shift 2
|
||||||
|
if [ ! -d "$source" ]
|
||||||
|
then echo "$source folder not found"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
if [ ! -d "$bundle" ]
|
||||||
|
then echo "$bundle folder not found"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
#echo $execfolder $component
|
||||||
|
cases=$( find "$source" -mindepth 1 -maxdepth 1 -type d )
|
||||||
|
for case in $cases
|
||||||
|
do
|
||||||
|
casebase=$( basename "$case" )
|
||||||
|
tgt="${bundle}/components/${component}/testcases/${casebase}/expected-output"
|
||||||
|
if [ -d "$tgt" ]
|
||||||
|
then
|
||||||
|
for output in $( ls "${case}/component" | grep -v ^_ )
|
||||||
|
do
|
||||||
|
cp -a $@ "${case}/component/${output}" "${tgt}/"
|
||||||
|
done
|
||||||
|
else
|
||||||
|
echo "$component $casebase does not have expected-output folder"
|
||||||
|
fi
|
||||||
|
done
|
||||||
44
anduril/vm_report_status
Executable file
44
anduril/vm_report_status
Executable file
@@ -0,0 +1,44 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
cores=$( grep -c processor /proc/cpuinfo )
|
||||||
|
|
||||||
|
# verbose mode
|
||||||
|
tgtf=/mnt/csc-cloud/vm_state/${HOSTNAME}.long
|
||||||
|
# debug
|
||||||
|
if [ -z "$1" ]
|
||||||
|
then touch "$tgtf"
|
||||||
|
fi
|
||||||
|
if [ -f "$tgtf" ]
|
||||||
|
then echo "======== $HOSTNAME =======" > "$tgtf"
|
||||||
|
TZ="Europe/Helsinki" uptime >> "$tgtf"
|
||||||
|
echo "Cores: $cores" >> "$tgtf"
|
||||||
|
free -tg | head -n 2 >> "$tgtf"
|
||||||
|
ps a --format user| grep -v -e root -e USER | sort -u | tr '\n' ' ' >> "$tgtf"
|
||||||
|
echo "" >> "$tgtf"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# concise mode
|
||||||
|
|
||||||
|
tgtf=/mnt/csc-cloud/vm_state/${HOSTNAME}.short
|
||||||
|
# debug
|
||||||
|
if [ -z "$1" ]
|
||||||
|
then touch "$tgtf"
|
||||||
|
fi
|
||||||
|
if [ -f "$tgtf" ]
|
||||||
|
then echo -n "|$HOSTNAME L:" > "$tgtf"
|
||||||
|
load=$( cat /proc/loadavg | cut -d" " -f3 | tr -d [:cntrl:] )
|
||||||
|
echo -n "$load/$cores M:" >> "$tgtf"
|
||||||
|
# used + cached = total - free
|
||||||
|
free=$(( $( grep ^MemFree /proc/meminfo | tr -d -c [:digit:] ) / 1048576 ))
|
||||||
|
cache=$(( $( grep ^Cached /proc/meminfo | tr -d -c [:digit:] ) / 1048576 ))
|
||||||
|
total=$(( $( grep ^MemTotal /proc/meminfo | tr -d -c [:digit:] ) / 1048576 ))
|
||||||
|
used=$(( $total -$free -$cache ))
|
||||||
|
echo -n "$used+$cache/$total U:" >> "$tgtf"
|
||||||
|
ps a --format user| grep -v -e root -e USER | sort -u | wc -l | tr -c -d [:digit:] >> "$tgtf"
|
||||||
|
TZ="Europe/Helsinki" date "+ @%H:%M" >> "$tgtf"
|
||||||
|
# save history
|
||||||
|
echo -e "$HOSTNAME\t$load\t$used\t"$( date +%s ) >> /mnt/csc-cloud/vm_state/history/${HOSTNAME}
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
73
highbeam
Executable file
73
highbeam
Executable file
@@ -0,0 +1,73 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
function usage {
|
||||||
|
echo ' High Beam Highlighter
|
||||||
|
- a trial to create a very generic modifyable
|
||||||
|
syntax highlighter.
|
||||||
|
|
||||||
|
Example rules: ( ~/.highbeamrc )
|
||||||
|
--------------------
|
||||||
|
RULES=(
|
||||||
|
"[0-9]" "$C" # Show numbers with Cyan color. NOTE: since the colors are represented with numbers, having this later in the rules will break coloring!
|
||||||
|
"$USER[ ]\+$USER" "$BGC$BLACK" # Use quotes to have rules with spaces. This colors the "ls -la" usernames. background cyan, black text
|
||||||
|
status "$G" # simple word matching, coloring green
|
||||||
|
"^d[^ ]*" "$H$G" # color words at the beginning of line, starting with d. color bright green
|
||||||
|
"q.\{0,3\}r" "$H$Y" # q*r with maximum 3 characters in between. color bright yellow
|
||||||
|
)
|
||||||
|
--------------------
|
||||||
|
Color variables: $R $G $B $Y $M $C $W $BLACK
|
||||||
|
Modify to bright version by prefixing with $H (e.g. $H$G)
|
||||||
|
Background colors: $BGR $BGG $BGB $BGY $BGC $BGM $BGW
|
||||||
|
'
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
[[ "$1" = "-h" ]] && usage && exit
|
||||||
|
|
||||||
|
E='\x1b['
|
||||||
|
H="${E}1m"
|
||||||
|
Z="${E}0m"
|
||||||
|
|
||||||
|
# list of text colors:
|
||||||
|
BLACK="${E}30m"
|
||||||
|
R="${E}31m"
|
||||||
|
G="${E}32m"
|
||||||
|
B="${E}34m"
|
||||||
|
Y="${E}33m"
|
||||||
|
M="${E}35m"
|
||||||
|
C="${E}36m"
|
||||||
|
W="${E}37m"
|
||||||
|
|
||||||
|
|
||||||
|
# list of BG colors:
|
||||||
|
BGR="${E}41m"
|
||||||
|
BGG="${E}42m"
|
||||||
|
BGB="${E}44m"
|
||||||
|
BGY="${E}43m"
|
||||||
|
BGM="${E}45m"
|
||||||
|
BGC="${E}46m"
|
||||||
|
BGW="${E}47m"
|
||||||
|
|
||||||
|
# user rules:
|
||||||
|
[[ -e ~/.highbeamrc ]] && . ~/.highbeamrc || echo You may have wrong construction in .highbeamrc >&2 || exit
|
||||||
|
[[ -e ~/.highbeamrc ]] || {
|
||||||
|
# list of rules
|
||||||
|
RULES=(
|
||||||
|
"[0-9]" "$C" # Show numbers with Cyan color. NOTE: since the colors are represented with numbers, having this later in the rules will break coloring!
|
||||||
|
"$USER[ ]\+$USER" "$BGC$BLACK" # Use quotes to have rules with spaces. background cyan, black text
|
||||||
|
status "$G" # simple word matching, coloring green
|
||||||
|
"^d[^ ]*" "$H$G" # color words at the beginning of line, starting with d. color bright green
|
||||||
|
"q.\{0,3\}r" "$H$Y" # q*r with maximum 3 characters in between. color bright yellow
|
||||||
|
)
|
||||||
|
}
|
||||||
|
# actual code starts here
|
||||||
|
|
||||||
|
for (( r=0; r<${#RULES[@]}; r++ ));
|
||||||
|
do REGEX="$REGEX -e 's/\(${RULES[$r]}\)/${RULES[$(( $r + 1 ))]}\1${Z}/ig'"
|
||||||
|
r=$(( $r + 1 ))
|
||||||
|
done
|
||||||
|
eval sed $REGEX || echo Maybe error in .highbeamrc >&2
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Reference in New Issue
Block a user