tn5250j/scripts Chat400.py,NONE,1.1
Patrick Bielen <[email protected]> Wed, 07 Jul 2004 06:51:05 +0000
| Newsgroups | gmane.comp.java.tn5250j.cvs |
|---|---|
| Message-ID | <[email protected]> |
Update of /cvsroot/tn5250j/tn5250j/scripts In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv29418/scripts Added Files: Chat400.py Log Message: Update scripts-related, added new version of chat400. To use chat400 you need to create a chat400-profile at your iSeries. Make it a logon and emediately logoff account, so no interactive user. All users use the chat400 account to store/receive messages. This is done due of security and misuse of a iSeries-profile. --- NEW FILE: Chat400.py --- ###################################################################### # chat400 # #====================================================================# # Code : Peter Moore ([email protected]) # # Patrick Bielen ([email protected]) # # ================================================================== # # Functionality : Script to send/receive messages to AS/400 users # # Discussions : [email protected] # ###################################################################### import sys import time from java.lang import * import com.ibm.as400.access as acc import com.ibm.as400.resource as rsc from javax import swing import java.awt as awt import java global server, curUsr, name, passw #************************************************************************** server = '' curUsr = '' name = 'CHAT400' passw = 'AS400' CHATQ = "/QSYS.LIB/QGPL.LIB/chat400.DTAQ" KEYLEN = 10 #========================================================================== class Poller(Runnable): #========================================================================== def __init__(self, parent): self.parent = parent def run(self): done = 0 dq = acc.KeyedDataQueue(self.parent.as400, CHATQ) #curUsr = self.parent.as400.getUserId() # Current User ID. if not dq.exists(): dq.create(KEYLEN, 512) while not done: try: entry = dq.read(curUsr,-1,"EQ") mail = entry.getString() sndUsr = mail.split(':')[0] if not self.parent.jobDct.has_key(sndUsr): self.parent.rtvIntJobs() # Split only once do avoid problems text containing more :'s msg = mail.split(':', 1)[1] if msg == 'Logged and ready': continue elif msg == 'Logged Out': # wait for refreshing and give the sessions some time to close. time.sleep(5) self.parent.rtvIntJobs() continue self.parent.rpyTxt.append("--== Received from " + sndUsr \ + " ==--\n" + msg + "\n") self.parent.rpyTxt.setCaretPosition(len(self.parent.rpyTxt.getText())) except: done=1 exc=sys.exc_info() print "Thread interrupted at line ", exc[2].tb_lineno print exc[0] print "type = %s"%type(exc[0]) self.statusTxt.text='There was an error, contact the System-Administrator' if self.parent.chkActive.isSelected(): item = sndUsr + ': ' + self.parent.usrDct[sndUsr] else: if self.parent.jobDct.has_key(sndUsr): item = sndUsr + ': ' + self.parent.usrDct[sndUsr] + ' *' else: item = sndUsr + ': ' + self.parent.usrDct[sndUsr] try: self.parent.users.setSelectedItem(item) except: None if self.parent.getState() == swing.JFrame.ICONIFIED: self.parent.state=(swing.JFrame.NORMAL) self.parent.chatTxt.requestFocus() self.parent.show() #========================================================================== class Chat400(swing.JFrame, awt.event.WindowListener): #========================================================================== def __init__(self): swing.JFrame.__init__(self, title=curUsr + " - CHAT400", resizable=0) try: self.setDefaultCloseOperation(swing.WindowConstants.EXIT_ON_CLOSE) # JDK1.4? self.setLocation(275, 150) except: None def run(self, server, name, *passw): self.as400 = acc.AS400(server, name, *passw) # Get user profile descriptions==> usrDct rUsrLst = rsc.RUserList(self.as400) rUsrLst.open() rUsrLst.waitForComplete() self.usrDct = {} for idx in range(rUsrLst.getListLength()): tmp_rUsr = rUsrLst.resourceAt(idx) key_usr = tmp_rUsr.getAttributeValue(rsc.RUser.USER_PROFILE_NAME) if key_usr.startswith('Q') or key_usr == 'FAXSTAR': continue tmp_usrText = tmp_rUsr.getAttributeValue(rsc.RUser.TEXT_DESCRIPTION) self.usrDct[key_usr] = tmp_usrText rUsrLst.close() # Interactive job list self.jobLst = rsc.RJobList(self.as400) self.jobLst.setSelectionValue(rsc.RJobList.PRIMARY_JOB_STATUSES, \ rsc.RJob.JOB_STATUS_ACTIVE) self.jobLst.setSelectionValue(rsc.RJobList.JOB_TYPE, \ rsc.RJob.JOB_TYPE_INTERACTIVE) self.jobLst.setSortValue([rsc.RJob.USER_NAME, rsc.RJob.JOB_NAME]) # Thread of execution to receive instant messages self.polchat = Thread(Poller(self)) # Form GUI self.contentPane.setLayout(awt.GridBagLayout()) self.addWindowListener(self) self.chkActive = swing.JCheckBox("Show only Active Users", 1) self.chatTxt = swing.JTextArea(5, 30, lineWrap=1, wrapStyleWord=1) self.rpyTxt = swing.JTextArea(10, 30, lineWrap=1, wrapStyleWord=1) self.users = swing.JComboBox(preferredSize=(250, 25), minimumSize=(250, 25)) self.showGui() def windowClosed(self, event): self.polchat.interrupt() self.dispose() def windowClosing(self, event): System.setProperty("chat400", "None") keys = self.jobDct.keys() keys.sort() dq = acc.KeyedDataQueue(self.as400, CHATQ) for key_usr in keys: user = key_usr if user == curUsr: continue if not dq.exists(): dq.create(KEYLEN, 512) try: dq.write(user, "%s:%s"%(curUsr, 'Logged Out')) except: None self.sessionManager = _session.getSessionManager() self.sessions = self.sessionManager.getSessions() self.sessList = self.sessions.getSessionsList() for x in self.sessList: self.sessionManager.closeSession(x) # _session.closeSession() def windowActivated(self, event): None def windowDeactivated(self, event): None def windowOpened(self, event): keys = self.jobDct.keys() keys.sort() dq = acc.KeyedDataQueue(self.as400, CHATQ) for key_usr in keys: user = key_usr if not dq.exists(): dq.create(KEYLEN, 512) try: dq.write(user, "%s:%s"%(curUsr, 'Logged and ready')) except: None def windowIconified(self, event): None def windowDeiconified(self, event): None #************************** # Retrieve send-user list #************************** def rtvIntJobs(self): try: self.users.removeAllItems() except: None # Get interactive job list self.jobLst.open() self.jobLst.waitForComplete() self.jobDct = {} for idx in range(self.jobLst.getListLength()): tmp_job = self.jobLst.resourceAt(idx) key_usr = tmp_job.getAttributeValue(rsc.RJob.USER_NAME) if not self.jobDct.has_key(key_usr): self.jobDct[key_usr] = tmp_job self.jobLst.close() keys = self.usrDct.keys() keys.sort() self.users.addItem("ALL TRASH: Vuilnisbak") for key_usr in keys: menuItem = key_usr sts = '' if self.jobDct.has_key(key_usr): if not self.chkActive.isSelected(): sts = ' *' try: fullName = self.usrDct[key_usr] except: fullName = "Not Defined" menuItem += ': %s' %fullName if self.chkActive.isSelected() and not self.jobDct.has_key(key_usr): # Active jobs only continue menuItem += sts # N.B. * means profile is running an interactive job self.users.addItem(menuItem) #************************** # Send message #************************** def btnActSnd(self, event): cmd = acc.CommandCall(self.as400) #curUsr = self.as400.getUserId() selected = self.users.getSelectedItem() sndUsr =selected.split(':')[0] chatTxt = self.chatTxt.getText() dq = acc.KeyedDataQueue(self.as400, CHATQ) if not dq.exists(): dq.create(KEYLEN, 512) try: if not sndUsr == "ALL TRASH": dq.write(sndUsr, "%s:%s"%(curUsr, chatTxt) ) if not curUsr == sndUsr: self.rpyTxt.append("%s -->> %s\n%s\n"%(curUsr, sndUsr, chatTxt)) self.rpyTxt.setCaretPosition( len(self.rpyTxt.getText()) ) if not sndUsr == "AFVAL": self.statusTxt.text='Message Sended.' else: self.rpyTxt.append("MESSAGE IS SENDED TO TRASHCAN !!!") self.rpyTxt.append("\nALWAYS PAY ATTENTION WHO YOU'RE SENDING TO !!!!\n") self.rpyTxt.setCaretPosition( len(self.rpyTxt.getText()) ) self.statusTxt.text='Message sended to trashcan - Pay Attention Please !' self.chatTxt.selectAll() self.chatTxt.cut() except: self.statusTxt.text='Message send Failed - Contact your system-operator.' self.chatTxt.requestFocus() #************************** def btnActRef(self, event): self.rtvIntJobs() #************************** def showGui(self): self.rtvIntJobs() self.btnRef = swing.JButton("Refresh List", \ actionPerformed = self.btnActRef, \ minimumSize=(100,25), \ preferredSize=(100, 25)) self.btnRef.setMnemonic('R') self.btnSnd = swing.JButton("Send Message", \ actionPerformed = self.btnActSnd) self.btnSnd.setMnemonic('S') self.label1 = swing.JLabel("Send To:", minimumSize=(50, 25), \ preferredSize=(50, 25)) self.rootPane.setDefaultButton(self.btnSnd) self.rpyTxt.setEditable(0) # <Scrollable message reply text area> self.statusTxt = swing.JTextField(text='Welcome to CHAT400 - An AS/400 Instant Messenger',\ editable=0, horizontalAlignment=swing.JTextField.CENTER) gbc = awt.GridBagConstraints() # Build the screen # Label 'send to' gbc.insets = awt.Insets(10, 10, 5, 5) self.contentPane.add(self.label1, gbc) # Combobox list of users gbc.insets = awt.Insets(10, 5, 5, 5) self.contentPane.add(self.users, gbc) # Refresh User-List Button gbc.insets = awt.Insets(10, 5, 5, 10) self.contentPane.add(self.btnRef, gbc) # Active Users checkbox gbc.gridx = 0 gbc.gridwidth = 3 gbc.insets = awt.Insets(0, 0, 5, 0) self.contentPane.add(self.chkActive, gbc) # Send Message Button gbc.gridx = 0 gbc.gridwidth = 3 gbc.insets = awt.Insets(5, 0, 5, 0) self.contentPane.add(self.btnSnd, gbc) # Build the SplitPane (2 scrollpanes) scrollPane1 = swing.JScrollPane(self.chatTxt, swing.JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, \ swing.JScrollPane.HORIZONTAL_SCROLLBAR_NEVER) scrollPane1.setViewportView(self.chatTxt) scrollPane2 = swing.JScrollPane(self.rpyTxt, swing.JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, \ swing.JScrollPane.HORIZONTAL_SCROLLBAR_NEVER) scrollPane2.setViewportView(self.rpyTxt) splitPane = swing.JSplitPane(swing.JSplitPane.VERTICAL_SPLIT, scrollPane1, scrollPane2) # Add the SplitPane gbc.gridx = 0 gbc.gridwidth = 3 gbc.fill = awt.GridBagConstraints.HORIZONTAL gbc.insets = awt.Insets(5, 10, 10, 10) self.contentPane.add(splitPane, gbc) # Add a status-textfield on the bottom, to display status or errors gbc.gridx = 0 gbc.gridwidth = 3 gbc.fill = awt.GridBagConstraints.HORIZONTAL gbc.insets = awt.Insets(0, 10, 10, 10) self.contentPane.add(self.statusTxt, gbc) self.pack() self.polchat.start() self.show() def fillWithValues(row,col,width,sb): sPos = ((row - 1) * screen.getCols()) + (col - 1) while width > 0: sb.append(screenChars[sPos]) sPos += 1 width -= 1 try: server = _session.getHostName() curUsr = _session.getConfigurationResource().upper() except: None ready = 0 while not ready: screen = _session.getScreen() logon = java.lang.StringBuffer() screenChars = screen.getScreenAsChars() logon.setLength(0) fillWithValues(24, 41, 35, logon) if logon.toString() == "(C) COPYRIGHT IBM CORP. 1980, 2000.": time.sleep(2) else: ready = 1 isRunning = System.getProperty("chat400") if not isRunning == curUsr: System.setProperty("chat400", curUsr) chatter=Chat400() chatter.run(server, name, passw) try: _session.requestFocus() except: None ------------------------------------------------------- This SF.Net email sponsored by Black Hat Briefings & Training. Attend Black Hat Briefings & Training, Las Vegas July 24-29 - digital self defense, top technical experts, no vendor pitches, unmatched networking opportunities. Visit www.blackhat.com