<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">#!/usr/bin/python


# ------------------------------------------------------------------------------

import sys

# ------------------------------------------------------------------------------
import Tix
###import Tkconstants
import tkMessageBox
import ScrolledText

# ------------------------------------------------------------------------------

import mx.ODBC.unixODBC

# ------------------------------------------------------------------------------

global log_text
global query_counter


# ------------------------------------------------------------------------------
# -- OUTPUT :
# ------------------------------------------------------------------------------

def Write_Results(query_counter, results) :

    num = 0
 
    log_text.insert(Tix.END, "\n  Results : \n")

    for r in results :

        num = num + 1

        log_text.insert(Tix.END, "\n %3s Name         : " % (str(num)))
        log_text.insert(Tix.END, r[0] + ", " + r[1])
        log_text.insert(Tix.END,
                        "\n     Department   : " + r[5] \
                      + "\n     Netware acc  : " + str(r[6]) \
                      + "\n     Email addr   : " + str(r[36]) \
                      + "\n     Cosmos uname : " + str(r[37]) \
                      + "\n")

    log_text.insert(Tix.END, "\n  : End Results.\n\n")
    log_text.see(Tix.END)


# ------------------------------------------------------------------------------
# -- QUERIES :
# ------------------------------------------------------------------------------

# -- Routine to make an SQL query and output the result :

def Query_SQL_Server_2(sql_query_str  = "", name = "", field = "") :

    global query_counter
    query_counter = query_counter + 1

    ohs = "\n  == SQL query: " + str(query_counter) \
        + ": ==========================================================\n " \
        + " ...executing SQL query (" + field + ": " + name + ")...\n" \
        + "\n      " + sql_query_str + "\n"

    log_text.insert(Tix.END, ohs)
    print sql_query_str
    c.execute(sql_query_str)
    results = c.fetchall()

    Write_Results(query_counter, results)


# ------------------------------------------------------------------------------
# -- Instructed euthanasia :
# ------------------------------------------------------------------------------

# -- delightful little confirmation thingy...

def Destroy(event = None):

    global root

    if tkMessageBox.askquestion("Really?", "Really quit?") == 'yes' :
        root.destroy()


# ------------------------------------------------------------------------------
# -- Create a page :
# ------------------------------------------------------------------------------

# -- A page has some buttons down the right;  on the left there's maybe a text
#    entry box and definitely some notes : 

def Create_Page(page_name = None,
                query_lambda = None,
                buttons = [('quit', Destroy)],
                notes = "This is a default Notes string.") :

    tab = page_name

    fr_buttons = Tix.Frame(tab, background='Grey')
    fr_buttons.pack(side=Tix.RIGHT, padx=2, pady=2, fill=Tix.Y)

    for b in buttons :

        (b_b, b_c) = b

        b_b = Tix.Button(fr_buttons, name=str(b_b), text=str(b_b), width=6, 
                         command=b_c)
        b_b.bind("&lt;Return&gt;", b_c)
        b_b.pack(side=Tix.TOP, padx=2, pady=2)	


    if query_lambda == None :
        entry = 1

        fr_main   = Tix.Frame(tab)
        fr_main.pack(side=Tix.LEFT, padx=2, pady=2, fill=Tix.BOTH, expand=1)

        notes = Tix.Label(fr_main, justify=Tix.LEFT, text=notes)
        notes.pack(side=Tix.LEFT, padx=30, pady=15)

    else :
        fr_main   = Tix.Frame(tab, background='Grey')
        fr_main.pack(side=Tix.LEFT, padx=2, pady=2, fill=Tix.BOTH, expand=1)
        
        fr_notes = Tix.Frame(fr_main)
        fr_notes.pack(side=Tix.BOTTOM, fill=Tix.X)

        entry = Tix.Entry(fr_main)
        entry.bind("&lt;Return&gt;", query_lambda)
        ###entry.insert(Tkconstants.INSERT, 'm')
        entry.pack(side=Tix.TOP, padx=40, pady=40)

        notes = Tix.Label(fr_notes, justify=Tix.LEFT, text=notes)
        notes.pack(side=Tix.LEFT, padx=2, pady=2)


    return entry


# ------------------------------------------------------------------------------
# -- Make the notebook (create all the pages) :
# ------------------------------------------------------------------------------

def Make_Pages(w):

    global root
    root = w

    # -- We use these options to set the sizes of the subwidgets inside the
    #    notebook, so that they are well-aligned on the screen :
    
    prefix = Tix.OptionName(w)

    if prefix:
	prefix = '*'+prefix
    else:
	prefix = ''

    w.option_add(prefix+'*TixControl*entry.width', 10)
    w.option_add(prefix+'*TixControl*label.width', 18)
    w.option_add(prefix+'*TixControl*label.anchor', Tix.E)
    w.option_add(prefix+'*TixNoteBook*tagPadX', 8)

    # -- Create the notebook widget and set its backpagecolour to grey.
    #    Note that the -backpagecolor option belongs to the "nbframe"
    #    subwidget.

    nb = Tix.NoteBook(w, name='nb', ipadx=6, ipady=6)
    nb['bg'] = 'gray'
    nb.nbframe['backpagecolor'] = 'gray'

	
    # -- Create tabs on the notebook. The -underline option puts a
    #    underline on the first character of the labels of the tabs.  Keyboard
    #    accelerators will be defined automatically according to the
    #    underlined character.

    nb.add('tab_username', label="Username", underline=0)
    nb.add('tab_lastname', label="Last Name", underline=0)
    nb.add('tab_about', label="About", underline=0)
    nb.add('tab_help', label="Help", underline=1)
	
    nb.pack(expand=1, fill=Tix.BOTH, padx=5, pady=5 ,side=Tix.TOP)


    # --------------------------------------------------------------------------
    # Create "About" and Help pages :
    # --------------------------------------------------------------------------

    trash = Create_Page(page_name = nb.tab_help,
                        notes = 'Surely not???')

    trash = Create_Page(page_name = nb.tab_about,
                        notes = 'ABOUT:\n'
                         + '\n For information about accessing the URS (and'
                         + '\n ODBC/SQL-Server in general) from Unix/Linux'
                         + '\n boxes, please visit:'
                         + '\n\n     http://talby.csu.umist.ac.uk/~isd/_unix_urs/'
                         + '\n'
                         + '\n For information about URSpyth, visit the same'
                         + '\n place and click on the appropriate link.\n'
                         + '\n URSpy was written by Simon.'
                         + '\n This is Version 0.1.')


    # --------------------------------------------------------------------------
    # Create Query pages :
    # --------------------------------------------------------------------------

    global entry_uname_2
    global entry_lname_2

    sql_uname = "SELECT * FROM UserDetails_simon WHERE NetwareAccountName = "
    sql_lname = "SELECT * FROM UserDetails_simon WHERE LastName LIKE "

    entry_uname_2 = \
        Create_Page(
            page_name = nb.tab_username,
            query_lambda = lambda event = None: \
                Query_SQL_Server_2(
                    sql_query_str  = sql_uname + "'"+ entry_uname_2.get() + "'",
                    name = entry_uname_2.get(),
                    field = "Username"),
                    buttons = [('execute',
                                lambda event = None: \
                                    Query_SQL_Server_2(
                                        sql_query_str = sql_uname + "'" \
                                            + entry_uname_2.get() + "'",
                                        name = entry_uname_2.get(),
                                        field = "Username")),
                               ('quit', Destroy)],
                    notes = '\n 1. Enter exact username.' + '\n 2. Execute!')

    entry_lname_2 = \
        Create_Page(
            page_name = nb.tab_lastname,
            query_lambda = lambda event = None: \
                Query_SQL_Server_2(
                    sql_query_str = sql_lname + "'" + entry_lname_2.get() + "%'",
                    name = entry_uname_2.get(),
                    field = "Username"),
                    buttons = [('execute', 
                                lambda event = None: \
                                    Query_SQL_Server_2(
                                        sql_query_str = sql_lname + "'" \
                                            + entry_lname_2.get() + "%'",
                                        name = entry_uname_2.get(),
                                        field = "Username")),
                               ('quit', Destroy)],
                    notes = '\n 1. Enter (beginning of) lastname.'
                          + '\n 2. Execute!')


# ------------------------------------------------------------------------------
# -- THE AUTHENTICATION/CONNECTION BIT :
# ------------------------------------------------------------------------------

def Make_Labeled_Entry(parent, caption, l_width=None, e_width=None, passwd=0,
                       **packoptions):

    frame = Tix.Frame(parent)
    frame.pack(**packoptions)
    
    label = Tix.Label(frame, text=caption, justify=Tix.LEFT)
    entry = Tix.Entry(frame)

    if e_width:
        entry.config(width=e_width)

    if l_width:
        label.config(width=l_width)

    if passwd:
        entry.config(show="*")

    label.pack(side=Tix.LEFT)
    entry.pack(side=Tix.LEFT)

    return entry


def Auth_To_URS(event = None, username_entry = None, password_entry = None) :

    global auth_root, db

    username = username_entry.get()
    password = password_entry.get()

    try:
        db = mx.ODBC.unixODBC.DriverConnect( \
                     'DSN=vardywardy;' + 'UID=' + username + ';PWD=' + password)
        auth_root.destroy()

    except mx.ODBC.unixODBC.OperationalError :
        print "Oh fuck!"
        tkMessageBox.showerror("Failed", "No way Jose!")


def Get_URS_Auth() :

    global auth_root

    auth_root = Tix.Tk()
    auth_root.title('URSpy Login!')

    auth_frame = Tix.Frame(auth_root)
    auth_frame.pack(padx=40, pady=40)

    text = Tix.Label(auth_frame, text="Enter your URS authentication details:",
                     anchor=Tix.W)
    text.pack(side=Tix.TOP, fill=Tix.X, pady=20)
    

    username_entry = Make_Labeled_Entry(auth_frame, "Username:", 15, 20,
                                        padx=20, pady=5)
    password_entry = Make_Labeled_Entry(auth_frame, "Password:", 15, 20, passwd=1,
                                        padx=20, pady=5)


    password_entry.bind("&lt;Return&gt;", \
                        lambda event = None: \
                            Auth_To_URS(username_entry = username_entry, \
                                        password_entry = password_entry))

    auth_root.mainloop()


# ------------------------------------------------------------------------------
# -- THE MAKE QUERIES (MAIN) BIT :
# ------------------------------------------------------------------------------

def Put_URS_Main() :

    global c, db, log_text
    
    c         = db.cursor()
    root      = Tix.Tk()
    logwindow = Tix.Toplevel()

    root.title('URSpyth Control Panel')
    logwindow.title('URSpyth Output Log')

    log_frame = Tix.Frame(logwindow)
    log_frame.pack()

    log_text = ScrolledText.ScrolledText(log_frame, font="fixed", wrap='none')
    log_text.pack()
    log_text.insert(Tix.END, "\n Hello from URSpy. \n")

    Make_Pages(root)
    root.mainloop()


# ------------------------------------------------------------------------------
# -- MAIN :
# ------------------------------------------------------------------------------

if __name__ == '__main__':

    query_counter = 0

    Get_URS_Auth()
    Put_URS_Main()


# ------------------------------------------------------------------------------
# -- Time for tea.
# ------------------------------------------------------------------------------
</pre></body></html>