#!/usr/bin/python2
# -*- coding: utf-8 -*-
# import MySQL module

import MySQLdb
import sys
import getopt
import socket
import os


def create_dot_file():

    try:
        import  ignoreclient
        ignorehostlist=ignoreclient.ignorehosts
    except:
        print "could not find the ignore list"
        ignorehostlist="'ignoreme'"



    db = MySQLdb.connect(host="localhost", user="mythtv", passwd="mythtv", db="mythconverg")
    cursor = db.cursor()

    SQL="SELECT DISTINCT(hostname) from settings where hostname not in(%s)"
    cursor.execute(SQL %ignorehostlist)
    result = cursor.fetchall()
    frontonly="_FRONTEND_"
    masterbackend="_MASTERBACKEND_"
    masterbacked_w_fe="_MASTERFRONTEND_"
    slave_w_fe="_SLAVEFE_"
    slave="_SLAVEBACKEND_"
    stand_alone="_STANDALONE_"
    dotMBE=""
    dotfrontend=list()
    dotslave=list()
    dotslavefe=list()
    tunerdict = {}
    for row in result:
       hostname = row[0]
       dot_hostname = hostname.replace('.','_')
       dot_hostname = dot_hostname.replace('-','__')
       #Find the system type
       cursor.execute("select value,data  from settings where hostname=%s and value in ('HostSystemType','HostRunFrontend');",(row))
       hostvalues=cursor.fetchall()
       if  len(hostvalues) == 2:
          if hostvalues[1][1] == 'Frontend_only':
             frontonly+=","+dot_hostname
             dotfrontend.append(dot_hostname)

          elif hostvalues[1][1] == 'Standalone':
             stand_alone+=","+dot_hostname
             dotMBE="MBE" + " [ label=\"" + dot_hostname  + "  \\n Standalone  \" shapefile=\"/data/srv/httpd/htdocs/xymon/gifs/be.png\"  fontcolor=\"white\"  color=blue4 style=filled   ] "
             dotfrontend.append(dot_hostname)
             cursor.execute("select cardtype,defaultinput  from capturecard  where hostname=%s;",(row))
             tuners=cursor.fetchall()
             tstring=""

             if len(tuners) == 0:
                 tunerdict["MBE"]="no tuners \\n"
             else:
                for t in tuners:
                    tstring+=t[0]
                    tstring+=t[1]
                    tstring+='\\n'
                    tunerdict["MBE"]=tstring

          elif hostvalues[1][1] == 'Master_backend':

              if hostvalues[0][1]=='0':
                  masterbackend+=","+dot_hostname
                  dotMBE="MBE" + " [ label=\"" + dot_hostname  + "  \\n Master Backend \" shapefile=\"/data/srv/httpd/htdocs/xymon/gifs/be.png\"  fontcolor=\"white\"  color=blue4 style=filled   ] "
              else:
                  masterbacked_w_fe+=","+dot_hostname
                  dotMBE="MBE" + " [ label=\"" + dot_hostname  + "  \\n Master Backend with frontend  \" shapefile=\"/data/srv/httpd/htdocs/xymon/gifs/be.png\"  fontcolor=\"white\"  color=blue4 style=filled   ] "
                  dotfrontend.append(dot_hostname)
              cursor.execute("select cardtype,defaultinput  from capturecard  where hostname=%s;",(row))
              tuners=cursor.fetchall()
              tstring=""

              if len(tuners) <= 0:
                tunerdict["MBE"]="no tuners \\n"
              else:
                #print tuners
                for t in tuners:
                        tstring+=t[0]
                        tstring+=t[1]
                        tstring+='\\n'
                        tunerdict["MBE"]=tstring

          elif hostvalues[1][1] == 'Slave_backend':
              cursor.execute("select cardtype,defaultinput  from capturecard  where hostname=%s;",(row))
              tuners=cursor.fetchall()
              #slave withoutfe
              if hostvalues[0][1]=='0':
                  slave+=","+dot_hostname
                  dotslave.append(dot_hostname)
                  tstring=""
                  if len(tuners) <= 0:
                      tunerdict["STUNER"+dot_hostname]="No Tuners"
                  else:
                      for t in tuners:
                            tstring+=t[0]
                            tstring+=t[1]
                            tstring+='\\n'
                            tunerdict["STUNER"+dot_hostname]=tstring
              else:
                  #slave with fe
                  tstring=""
                  if len(tuners) <= 0:
                     tunerdict["STUNER"+dot_hostname]="No Tuners"
                  else:
                      for t in tuners:
                            tstring+=t[0]
                            tstring+=t[1]
                            tstring+='\\n'
                            tunerdict["STUNER"+dot_hostname]=tstring
                  slave_w_fe+=","+dot_hostname
                  dotslave.append(dot_hostname)
                  dotfrontend.append(dot_hostname)


#----------------------------------Create graphviz dot files
    dotfilename="/home/xymon/server/etc/mythdot"
    try:
        dotfile=open(dotfilename,'w')
        dotfile.write("digraph G {   " + "\n" )
        dotfile.write("graph [bgcolor=transparent]" + "\n" )
        #print tunerdict

        #define the nodes
        dotfile.write( dotMBE + "  \n" )

        dotfile.write("tunermbe"+   " [ label= \"" + tunerdict["MBE"] +     "\" , shapefile=\"/data/srv/httpd/htdocs/xymon/gifs/tuner.png\"   fontcolor=\"white\"  color=red ]  \n" )

        for fe in dotfrontend:
            dotfile.write("FEND"+fe + "[ label=\"frontend \\n " + fe +     "\" ,shapefile=\"/data/srv/httpd/htdocs/xymon/gifs/tv.png\" , fontcolor=\"white\" , imagescale=\"true\"  color=\"gold2\" ]   \n" )

        for fe in dotslave:
            cslave="STUNER"+fe
            #adding tuners to dot file
            if tunerdict[cslave] != "" :
                dotfile.write(cslave+   " [ label= \"" + tunerdict[cslave] +     "\" , shapefile=\"/data/srv/httpd/htdocs/xymon/gifs/tuner.png\"   fontcolor=\"white\"  color=red ]  \n" )
            #adding slave to dot file
            dotfile.write("SLAVE"+fe + "[ label=\"slave backend \\n " + fe +     "\" shapefile=\"/data/srv/httpd/htdocs/xymon/gifs/be.png\"  fontcolor=\"white\"  color=green ]   \n" )

        #connect up the nodes!
        dotfile.write("tunermbe -> MBE  [color=\"red\"] \n  "  )

        for fe in dotfrontend:
            dotfile.write("MBE  -> FEND" + fe + "[color=\"gold2\"]   \n  "  )

        for fe in dotslave:
            cslave="STUNER"+fe
            dotfile.write("SLAVE" + fe + "-> MBE [color=\"green\"]  \n  "  )
            if tunerdict[cslave] != "" :
                dotfile.write(cslave + "-> SLAVE"+fe +  "[color=\"red\"]"  "\n"  )



        dotfile.write("}  " + "\n"   )
        dotfile.close()
    except:
        print "Problem writing %s" %dotfilename


    cmd="/usr/bin/unflatten -l1 -c3 -f " + dotfilename + " |/usr/bin/dot -Tpng  -o/data/srv/httpd/htdocs/xymon/gifs/network.png "
 #   cmd="/usr/bin/circo -Tpng  -o/data/srv/httpd/htdocs/xymon/gifs/network.png " + dotfilename

    results=os.popen(cmd,'r')
    return frontonly,masterbackend,masterbacked_w_fe,slave_w_fe,slave,stand_alone





def createdropdown(currenthostype):
    dir = "/data/storage/disk0/backup/system_backups"
    dropdown='''
    </br>
     <input name="param2" type="radio"  value="Restore" />Restore Database: </>
     <select name="param1">\n'''
    os.chdir(dir)
    if os.path.exists(dir):
        files = os.listdir(dir)
        files.sort(key=lambda x: os.path.getmtime(x) , reverse=True)
        #for file in os.listdir(dir):
        if len(files) > 20:
            del files[20:]

        for file in files:
            if (file.endswith(".tgz")):
                dropdown+='        <option value="' + file + '">' + file + '</option> \n'
    dropdown+='''
    </select>
    </br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp
    <input type="checkbox" name="param8" >Partial Restore<br>

    <br>
    <input name="param2" type="radio" value="Upload"  />Upload File to Restore: </>
    <input name="uFile"  type="file" size="40">

    <br><br>
    <input name="param2" type="radio" value="Backup" checked="checked" />Backup System<br />
    '''

    #This is for the d/l backup option
    dropdown+='''

    </br>
    <input name="param2" type="radio"  value="Dbackup" />Download Backup: </>
    <select name="param7">\n\n </br>'''

    for file in files:
        if (file.endswith(".tgz")):
            dropdown+='        <option value="' + file + '">' + file + '</option> \n'

    dropdown+='''
    </select>

    </br>
    </br>
    <input name="param2" type="radio" value="Optimize"  />Optimize Database<br />
    '''

    if currenthostype == "Master_backend":
        dropdown+='</br><input name="param2" type="radio" value="ShutdownAll"  />Shutdown All Systems (except master backend)<br /> \n'

    #Add option to restart MBE
    dropdown+='</br> <input name="param2" type="radio" value="RestartMBE"  />Restart MBE service<br /> \n'

    dropdown+='''    </br></br>\n'''
    return dropdown


def create_notes():
    db = MySQLdb.connect(host="localhost", user="mythtv", passwd="mythtv", db="mythconverg")
    # create a cursor
    cursor = db.cursor()
    cursor.execute("SELECT DISTINCT(hostname) from settings")
    result = cursor.fetchall()
    for row in result:
       #cursor.execute("select value,data  from settings where hostname=%s and value in ('HostSystemType','HostHwuuid');",(row))
       cursor.execute("select value,data  from settings where hostname=%s and value in ('HostSystemType','HardwareProfilePublicUUID');",(row))
       hostvalues=cursor.fetchall()
       #This is here to ignore non LinHES hosts, or those that don't have a HostSystemType
       if len(hostvalues) == 0:
           continue
       found_uuid="false"
       filename="/home/xymon/server/www/notes/"
       filename+=str(row[0])
       filename+=(".html")
       try:
            file = open(filename,'w')
       except:
            print "problem opening %s" %filename
            continue

       string='''
<html>
<head>  <style type="text/css">@import "/frame.css";</style>
<SCRIPT>

function do_submission()
{
  document.form.submit();
}


function Do_it ()
{
    chosen = ""
    len = document.form.param2.length
    for (i = 0; i <len; i++)
    {
        if (document.form.param2[i].checked)
        {
            chosen = document.form.param2[i].value
        }
    }


    if (chosen == "Restore")
    {
        if (confirm('Continue with database restore?'))
        {
            do_submission();
            }
        else
        {
            alert("The database was not restored.");
        }
    }
    else if (chosen == "Backup")
    {
        if (confirm('Continue with database backup?'))
        {
            do_submission();
        }
        else
        {
            alert("Backup cancelled.");
        }
    }
    else if (chosen == "Upload")
    {
        if (confirm('Upload the backup file to the server?'))
        {
            do_submission();
        }
    }
    else if (chosen == "Optimize")
    {
        if (confirm('Continue with database maintenance?'))
        {
            do_submission();
        }
        else
        {
            alert("Optimization cancelled.");
        }
    }



    else if (chosen == "Shutdown")
    {
        if (confirm('Continue with server shutdown?'))
        {
            do_submission();
            alert("The system is powering off.");
        }
    }

    else if (chosen == "Reboot")
    {
        if (confirm('Continue with server restart?'))
        {
            do_submission();
            alert("The system is restarting.");
        }
    }

    else if (chosen == "ShutdownAll")
    {
        if (confirm('Continue with powering off all servers except master backend?'))
        {
            do_submission();
            alert("Systems are powering off.");
        }

    }

    else if (chosen == "Update")
    {
        if (confirm('Continue with applying updates?'))
        {
            do_submission();
        }

    }

    else
    {
        //alert("not restore")
        do_submission();
    }
}

</SCRIPT>
</head>

'''
       file.write(string)

       for i in range( 0 , len(hostvalues)):
            value=hostvalues[i][0]
            data=hostvalues[i][1]
            currenthostype=''
            currenthostname=''
            #if  value == "HostHwuuid" :
            if  value == "HardwareProfilePublicUUID" :
                if data != "blank" :
                    found_uuid="true"
                    uuid=data
            if value == "HostSystemType" :
                currenthostname= str(row[0]).strip()
                currenthostype=str(data).strip()
                header="<h1>" + currenthostname + " (" + currenthostype + ") </h1>"
                file.write(header + '\n')


       if found_uuid == "true" :
            string=str("http://smolt.mythtv.org/client/show?uuid=")
            string+=str(uuid)
            file.write("<A href=\""  )
            file.write(string)
            file.write("\" >" +  str(uuid)   + "</A>")
       else:
            file.write( "uuid  not found, please submit a hardware profile" )
       buttonform_top='''
    <div id="resultbox" >
        <form name="form" action="/process.py"  enctype="multipart/form-data" method="POST" >
    '''


       buttonform_bottom='''
       </br>
        <input name="param2" type="radio"  value="Update" />Update System: </>
            <select name="param3">
                <option value="Myth_only">Myth only</option>
                <option value="All"> Full System</option>
            </select>
        </br>
        </br>
        <input name="param2" type="radio"  value="Kill" />Restart Interface: </>
            <select name="param6">
                <option value="killmyth">MythFrontend</option>
                <option value="killX">Full UI</option>
            </select>
        </br>
        </br>
        <input name="param2" type="radio"  value="Shutdown" />Shutdown System<br />
        </br>
        <input name="param2" type="radio"  value="Reboot" />Reboot System<br />
        </br>
        <input name="param2" type="radio"  value="WOL" />Wake on LAN<br />
        </br>
        <input name="hiddenparam" type="hidden" value="
    '''

       oldurlform=''' "/>
        <input name="param4" type="hidden" value="
    '''
       closetag='''
           "/>
        </br>
    </div>
    </br>
    <div id="center_button" >
        <!--<input id="submitbutton" type="submit" />-->
        <a href="Javascript:Do_it();">
        <img src="/go.png"></a>
    </form>
    </div>
'''

       if currenthostype == "Master_backend" or currenthostype == "Standalone":
            mbeoptions=createdropdown(currenthostype)

       else:
            mbeoptions=''
       returnurl="/xymon/notes/"
       returnurl+=str(row[0])
       returnurl+=(".html")
       file.write('</br> </br>  ')
       file.write(buttonform_top)
       file.write(mbeoptions)
       file.write(buttonform_bottom)
       file.write(str(row[0]))
       file.write(oldurlform)
       file.write(returnurl)
       file.write(closetag)

       string=('</html>')
       file.write(string)


def create_hobbit_analysis(frontonly,
                           masterbackend,
                           masterbacked_w_fe,
                           slave_w_fe,
                           slave,
                           stand_alone):

    hobbitfile="/home/xymon/server/etc/analysis.cfg"
    hobbitf=open(hobbitfile,'r')
    hobbitconfig=hobbitf.readlines()
    hobbitf.close()
    try:
        hobbitf=open(hobbitfile,'w')
        print "FE",frontonly
        print "MBE",masterbackend
        print "MBEwFW",masterbacked_w_fe
        print "SLAVEwFW",slave_w_fe
        print "SLAVE",slave
        print "STD",stand_alone

        for line in hobbitconfig:
            if line.startswith("HOST"):
                cline=line.split("=")
                if cline[1].startswith("_FRONTEND_"):
                    pline="HOST="
                    pline+=frontonly.strip()
                    hobbitf.write(pline + "\n")
                elif cline[1].startswith("_MASTERBACKEND_"):
                    pline="HOST="
                    pline+=masterbackend.strip()
                    #print pline
                    hobbitf.write(pline+ "\n")
                elif cline[1].startswith("_MASTERFRONTEND_"):
                    pline="HOST="
                    pline+=masterbacked_w_fe.strip()
                    #print pline
                    hobbitf.write(pline+ "\n")
                elif cline[1].startswith("_SLAVEBACKEND_"):
                    pline="HOST="
                    pline+=slave.strip()
                    #print pline
                    hobbitf.write(pline+ "\n")
                elif cline[1].startswith("_SLAVEFE_"):
                    pline="HOST="
                    pline+=slave_w_fe.strip()
                    #print pline
                    hobbitf.write(pline+ "\n")
                else:
                    #print line
                    hobbitf.write(line)
            else:
                #print line
                hobbitf.write(line)
        hobbitf.close()
    except:
        print "problem writing analysis.cfg"

def main(argv):
    frontonly,masterbackend,masterbacked_w_fe,slave_w_fe,slave,stand_alone = create_dot_file()
    create_notes()
    create_hobbit_analysis(frontonly,
                           masterbackend,
                           masterbacked_w_fe,
                           slave_w_fe,
                           slave,
                           stand_alone)


if __name__ == "__main__":
    main(sys.argv[1:])
