#!/usr/local/twc/bin/python

##=============================================================================
##
## Program :   wxscan_rpt.py     
##
## Author  :   Chris Hill      
##
## Date    :   02/28/2003
##
## Purpose :   Generate Weatherscan Inventory Report for Intellistar
##
##=============================================================================

import sys
import os
import string
import twc.dsmarshal
from time import gmtime, strftime
import twc.DataStoreInterface
from omniORB import CORBA
from ftplib import FTP

#-----------------------------------------------------------------------------
# Global Definitions                      
#-----------------------------------------------------------------------------

ds = twc.DataStoreInterface
dsmarshal = twc.dsmarshal

reportDirectory   = "/tmp"
reportFileName    = "wxscan_istar.dat"

deliveryHost      = "scmt-qapp.atl.weather.com"
deliveryBaseDir   = "/scmt-qapp/configs/deploy"
deliveryLogin     = "scmt"
deliveryPass      = "scmt"

packages = ['Core1', 'Core2', 'Core3', 'Core4', 'Airport', 'BoatAndBeach',
            'Garden', 'Golf', 'Health', 'International', 'Ski',
            'Travel', 'Core2Spanish', 'Core4Spanish' ]


#-----------------------------------------------------------------------------
# Main Program Logic                      
#-----------------------------------------------------------------------------

def main():


   ds.init()

   ##
   ## Get report time/date
   ##

   reportTime = strftime("%a, %d %b %Y %H:%M:%S GMT", gmtime())


   ##
   ## Open the output file and print the header
   ##

   try:
       fp = open(reportDirectory + "/" + reportFileName, "w")
   except:
       print "Error opening file <" + reportFileName + ">" 
       return 1
   
   fp.write('Intellistar/Weatherscan Inventory Report   ')
   fp.write(reportTime)
   fp.write('\n\n\n')
  
   
   ##
   ## Print the Identification Section of the report
   ##

   fp.write('[Identification]\n')

   headendId = ''
   headendId = getKey('headendId')

   starId = ''
   starId = getKey('starId')

   expRev = ''
   expRev = getKey('expRev')

   mystruct = ''
   rc, mystruct = getStructKey('Core1.0.NetworkIntro.0')
   locName = mystruct.locName
   affName = mystruct.affiliateName

   mystruct = ''
   rc, mystruct = getStructKey('Core1.0.NetworkIntro.0')
   locName = mystruct.locName

   fp.write('Primary Location Name..: ' + locName + '\n')
   fp.write('Affiliate Name.........: ' + affName + '\n')
   fp.write('Headend ID.............: ' + headendId + '\n')
   fp.write('Star ID................: ' + starId + '\n')
   fp.write('Experience Revision....: ' + expRev + '\n\n\n')
   

   ##
   ## Print the Network Configuration Section         
   ##

   fp.write('[Network/BC Configuration]\n')

   bcConnectMethod = ''
   bcConnectMethod = getKey('bcConnectMethod')

   bcIpAddress = ''
   bcIpAddress = getKey('bcIpAddress')

   bcGateWay = ''
   bcGateWay = getKey('bcGateWay')

   bcNetMask = ''
   bcNetMask = getKey('bcNetMask')

   bcDnsSvr1 = ''
   bcDnsSvr1 = getKey('bcDnsSvr1')

   bcDnsSvr2 = ''
   bcDnsSvr2 = getKey('bcDnsSvr2')

   bcDialInNumber = ''
   bcDialInNumber = getKey('bcDialInNumber')

   bcIspDialupLogin = ''
   bcIspDialupLogin = getKey('bcIspDialupLogin')

   bcIspDialupNumber = ''
   bcIspDialupNumber = getKey('bcIspDialupNumber')

   bcIspDialupPassword = ''
   bcIspDialupPassword = getKey('bcIspDialupPassword')


   if bcConnectMethod == 'E':
       connectType = 'EtherNet' 
   else:
       connectType = 'Dialup' 

   fp.write('Network Type...........: ' + connectType + '\n')
   fp.write('IP Address.............: ' + bcIpAddress + '\n')
   fp.write('GateWay................: ' + bcGateWay + '\n')
   fp.write('Netmask................: ' + bcNetMask + '\n')
   fp.write('DNS 1..................: ' + bcDnsSvr1 + '\n')
   fp.write('DNS 1..................: ' + bcDnsSvr2 + '\n')
   fp.write('Local Dial In Number...: ' + bcDialInNumber + '\n')
   fp.write('ISP Dialup Number......: ' + bcIspDialupNumber + '\n')
   fp.write('ISP Dialup Login.......: ' + bcIspDialupLogin + '\n')
   fp.write('ISP Dialup Password....: ' + bcIspDialupPassword + '\n\n\n')


   ##
   ## Print the Primary met configuration stuff       
   ##

   fp.write('[Primary Met Configuration]\n')

   primZone = ''
   primZone = getKey('primaryZone')

   mystruct = ''
   rc, mystruct = getStructKey('Core1.0.CurrentConditions.0')
   primObs  = mystruct.obsStation[0] 
   secObs   = mystruct.obsStation[1] 
   primObsName  = mystruct.locName[0] 
   secObsName   = mystruct.locName[1] 

   mystruct = ''
   rc, mystruct = getStructKey('Core1.0.ExtendedForecast.0')
   fcstPt   = mystruct.coopId 
   fcstName = mystruct.locName 

   mystruct = ''
   rc, mystruct = getStructKey('interestlist.county')
   primCounty = mystruct[0]      

   fp.write('Primary County.........: ' + primCounty + '\n')
   fp.write('Primary NWS Zone.......: ' + primZone + '\n')
   fp.write('Primary Obs Stations...: ' + primObs + ' (' + primObsName + ')\n')
   fp.write('Secondary Obs Stations.: ' + secObs + ' (' + secObsName + ')\n')
   fp.write('Forecast Point.........: ' + fcstPt + ' (' + fcstName + ')\n\n\n')


   ##
   ## Print the Package Configurarion stuff           
   ##

   
   fp.write('[Configured Packages]\n')
   fp.write('Package           Instance  Package Menu Title\n')
   fp.write('----------------- --------  ------------------\n')

   for pkgCd in packages:
      for i in [0, 1, 2]:
         mystruct = ''
         useKey = "%s.%d" % (pkgCd, i)

         rc, mystruct = getStructKey(useKey)

         if rc == 0:
           menuTitle = mystruct.packageTitle
           printLine = ("%-17s    %d      %s") % (pkgCd, i, menuTitle)
           fp.write(printLine + '\n')
 
           
   fp.write("\n\n\nReport Complete");


   ##
   ## Close the file
   ##

   ds.uninit()
   fp.close()


   ##
   ## Send the File to the production Host
   ##

   sendReport(headendId)

   print 'Process completed successfully'

   return 0


#-----------------------------------------------------------------------------
# Generic key retrieval - Returns 'n/a' if error or key not found.
#-----------------------------------------------------------------------------

def getKey(key):

    try:
        rc, dsval = ds.get([key])
    except:
        value = 'n/a'
    else:
        if dsval.has_key(key):
           value = dsval[key]
        else:
           value = 'n/a'

    return value

#-----------------------------------------------------------------------------
# Generic structure key retrieval. returns n/a' if error or key not found.
#-----------------------------------------------------------------------------

def getStructKey(key):

    rc = 0;

    try:
        dsval = dsmarshal.get(key)
    except:
        rc = 1
        dsval = ''    

    return rc, dsval


#-----------------------------------------------------------------------------
# Perform FTP of Report to Production Host
#-----------------------------------------------------------------------------

def sendReport(useHeadendId):

   fileToSend = reportDirectory + "/" + reportFileName
   destDirectory = deliveryBaseDir + "/" + useHeadendId
   storCommand = "STOR " + destDirectory + '/' + reportFileName

   os.chdir(reportDirectory)

   try:
       f = open(fileToSend, "r")
   except:
       print 'Error opening file <' + fileToSend + '>'
   else:
       try:
           ftp = FTP(deliveryHost)
           ftp.login(deliveryLogin,deliveryPass)
           ftp.cwd(reportDirectory)
           ftp.storlines(storCommand, f) 
           ftp.quit()
           f.close
       except:
           print 'Error executing FTP <' + storCommand + '>'

   return 0


#-----------------------------------------------------------------------------
# Entry Point....
#-----------------------------------------------------------------------------

main()
