#!/usr/bin/env python3
# This script aims to help to run locktests with several clients.
#
# Report bugs to Vincent ROQUETA : vincent.roqueta@ext.bull.net

import encodings
import shutil
import os, sys
import getopt, sys
import string
import socket
from stat import *
from sys import *
from os import *

NFS4_PATH="/mnt/nfsv4"
NFS4_SERVER=""
TEST_HOME="/home/vincent/locks/"
testfile=NFS4_PATH+"/testfile"

app="locktests"
SRC="locktests.tar.gz"
SRC_PATH="deploy"
install="'tar xzf "+SRC+"; cd locks;  make `"
user="root"





class Machine:

    def mkdir(self,dir):
        self.command="mkdir -p "+dir
        self.do()
    def rmdir(self,dir):
        self.command="rm -rf "+dir
        self.do()

    def printc(self):
        print("->"+self.command)
        print("\n")

class Client(Machine):

    def __init__(self, machine):
        self.command=""
        self.machine=machine
        self.mountPath=NFS4_PATH

    def do(self):
        self.command="ssh "+user+"@"+self.machine+" "+self.command
        os.system(self.command)

    def isomount(self, dir):
        export=NFS4_SERVER
        mntpoint=NFS4_PATH
        self.command="'mkdir -p "+mntpoint+"; mount -t nfs4 "+export+" "+mntpoint+"'"
        self.do()

    def umount(self, dir):
        mntpoint=self.mountPath+"/"+dir
        self.command="umount "+mntpoint
        self.do()
    def install(self, path):
        self.command="'cd "+path+"; tar xzf "+SRC+"; cd locks;  make'"
        self.do()

    def run(self, appli):
        self.command=appli
        self.do()
    def cp(self, fichier, path):
        command="scp "+fichier+" "+user+"@"+self.machine+":"+path
        os.system(command)


class Serveur(Machine):

    def __init__(self, ip, exportPath):
        self.SERVEUR=ip
        self.exportPath=exportPath

    def do(self):
        self.command="ssh "+self.SERVEUR+" "+self.command
        os.system(self.command)

    def configure(self, dir):
        exportDir=self.exportPath+'/'+dir
        self. mkdir(exportDir)
#self.printc()
        self.export(exportDir)
#self.printc()
    def clean(self, dir):
        unexportDir=self.exportPath+'/'+dir
        self.unexport(unexportDir)
        self.rmdir(unexportDir)
def usage():
		print("\n")
		print("usage:")
		print("locktests.py <-n process -f testfile ><--setup -s fs_server> -c host1, host2, host3 ... ")
		print("--setup : setup the configuration, deploy test on other test machines; This option also requires -c and -s")
		print("-c <machine>     : host list to deploy/run/clean the test")
		print("-s <machine>     : NFS server to use to setup the test")
		print("-n <num>         : number of processes each test machine will lauch to perform the test")
		print("-f <file>        : test file. This must be the same on each machine")
		print(" ")
		print("Example :")
		print("=========")
		print("*Setup machines for testing")
		print("./locktests.py --setup -c testmachine1 testmachine2 testmachine3 -s my_nfs_server:/")
		print("\n")
		print("*Run test on testmachine1,testmachine2 with 50 process on each machine using /mnt/nfsv4/testfile")
		print("./locktests.py -n 50 -f /mnt/nfsv4/testfile -c testmachine1 testmachine2")
		print("\n")
		print("_________________________________")
		print("Vincent ROQUETA - Bull SA - 2005\n")

		return 0



def setup():
    path=os.path.abspath(".")
    fichier=SRC_PATH+"/"+SRC
    commande=""
    for i in clients:
        print("Setting up machine "+i)
        c=Client(i)
        c.mkdir(path)
        c.cp(fichier, path)
        c.install(path)
        c.isomount(NFS4_PATH)
    #Setup localhost
    print("Setting up localhost")
    commande="make; mkdir -p "+NFS4_PATH+" ; mount -t nfs4 "+NFS4_SERVER+" "+NFS4_PATH+" &"
    os.system(commande)


def run():
    path=os.path.abspath(".")
    nbreClients=len(clients)
    hostname=socket.gethostname()
    # Lancement du serveur en local
    # Launch the server locally
    commande=path+"/"+app+" -n "+nbreProcess+" -f "+filename+" -c "+str(nbreClients)+" &"
    os.system(commande)
    commande=path+"/locks/"+app+" --server "+hostname
    for i in clients:
        c=Client(i)
        c.run(commande)

def clean():
   for i in clients:
    client.umount(NFS4_PATH)






args=sys.argv[1:]
rge=list(range(len(args)))
a=""
r=True
s=False
nfsServer=False
c=False
f=False
n=False
clients=[]
for i in rge:
    if args[i] in ("--install", "-i", "--setup"):
        r=False
        s=True
        continue
    if args[i] in ("-s", "--server"):
        a="nfsServer"
        nfsServer=True
        continue
    if args[i] in ("-h", "--help"):
        usage()
        sys.exit(1)
    if args[i] in ("--clients", "-c"):
        a="clients"
        c=True
        continue
    if args[i] == "-n":
        a="nbre"
        n=True
        continue
    if args[i] == "-f":
        a="file"
        f=True
        continue

    if a=="clients":
       clients.append(args[i])
       continue
    if a=="file":
       filename=args[i]
       continue
    if a=="nbre":
       nbreProcess=args[i]
       continue
    if a=="nfsServer":
        NFS4_SERVER=args[i]
        continue


    usage()
# For ...
if s:
    if (not c) or (not nfsServer):
        usage()
        sys.exit(1)
    print("Setup")
    print(NFS4_SERVER)
    setup()
    print("Setup complete")

if r:
    if (not c) or (not f) or (not n):
        usage()
        sys.exit(1)

    print("Running test")
    run()