#!/usr/bin/env python # This program is free software. It comes without any warranty, to # the extent permitted by applicable law. You can redistribute it # and/or modify it under the terms of the Do What The Fuck You Want # To Public License, Version 2, as published by Sam Hocevar. See # http://sam.zoy.org/wtfpl/COPYING for more details. import sys, traceback error = 0 try: import os, shutil from stat import * from string import Template _PLATFORM = sys.platform if _PLATFORM in ['win32','cygwin','darwin','os2','os2emx','riscos','atheos']: print "Whoa there buddy! This installation script isn't meant to be run on your OS." exit() if os.getuid() != 0: print "This program must be run as root (sudo)." exit() _HOME = os.environ['HOME'] _USER = os.environ['SUDO_USER'] _UID = int(os.environ['SUDO_UID']) _GID = int(os.environ['SUDO_GID']) # fix home if it's root weirdness if _HOME.find("root") != -1: _HOME = "/home/"+_USER def setPermissions(path): os.chown(path, _UID, _GID) for file_ in os.listdir(path): filePath = os.path.join(path,file_) if os.path.isdir(filePath): setPermissions(filePath) else: os.chown(filePath, _UID, _GID) def findPesterchum(path): for f in os.listdir(path): filePath = os.path.join(path, f) if os.path.isdir(filePath): if os.path.exists(filePath+"/pesterchum.py"): return filePath else: a=findPesterchum(filePath) if a: return a elif f == "pesterchum.py": return path if not os.path.exists(_HOME+"/.pcInstallLoc"): print "Welcome to the Pesterchum 3.14 Easy Installer (for Linux)!\n\ Created by Kiooeht [evacipatedBox] May 28th-29th, 2011.\n\ License: WTFPL\n\ \n\ Leaving an option blank will accept it's default [in brackets]\n\ Are you ready to begin your MAGICAL JOURNEY?!\n\ Of course you are!!! ::::D" # ask user about things while 1: install = raw_input("Install location [~/.pesterchum]: ") if install == "": instLoc = _HOME+"/.pesterchum" break else: if install[0] == "~": install = _HOME+install[1:] if os.path.exists(install[:install.rfind("/")]): instLoc = install break print "No can do" if os.path.exists("/usr/share/applications"): while 1: gnome = raw_input("Create a GNOME menu item? [Y/n]: ") if gnome.lower() == "y" or gnome == "": gnome = True;break elif gnome.lower() == "n": gnome = False;break else: print "herpaderp" while 1: shortcut = raw_input("Create launcher in home directory? [Y/n]: ") if shortcut.lower() == "y" or shortcut == "": shortcut = True;break elif shortcut.lower() == "n": shortcut = False;break else: print "u jelly?" # do some shitty install try: fileLoc = findPesterchum(".") except RuntimeError: print "I'm sorry! I was unable to find the pesterchum files :(" print "Please put them where I can find them" exit() if not fileLoc: print "I'm sorry! I was unable to find the pesterchum files :(" print "Please put them where I can find them" exit() print "Copying files..." ignore = shutil.ignore_patterns('*.pyc') if not os.path.exists(instLoc): shutil.copytree(fileLoc, instLoc, ignore=ignore) if os.path.exists(instLoc+"/pesterchum.js"): f = open(instLoc+"/pesterchum.js") js = f.read() f.close() defa = js.find("\"defaultprofile\"") if defa != -1: start = js.find("\"", js.find(":", defa+1)) end = js.find("\"", start+1) party = js[start+1:end] if not os.path.exists(instLoc+"/profiles") or \ party+".js" not in os.listdir(instLoc+"/profiles"): print "Protecting you from stupidity..." print " (aka. Deleting reference to non-existant default profile)" #os.remove(instLoc+"/pesterchum.js") f = open(instLoc+"/pesterchum.js", "w") f.write(js[:defa-1]+js[js.find(",", end)+1:]) f.close() else: if not os.path.exists(instLoc+"/logs") and os.path.exists(fileLoc+"/logs"): shutil.copytree(fileLoc+"/logs", instLoc+"/logs", ignore=ignore) if not os.path.exists(instLoc+"/profiles") and os.path.exists(fileLoc+"/profiles"): shutil.copytree(fileLoc+"/profiles", instLoc+"/profiles", ignore=ignore) if not os.path.exists(instLoc+"/pesterchum.js") and os.path.exists(fileLoc+"/pesterchum.js"): shutil.copy(fileLoc+"/pesterchum.js", instLoc) shutil.copytree(fileLoc+"/oyoyo", instLoc+"/oyoyo", ignore=ignore) shutil.copytree(fileLoc+"/smilies", instLoc+"/smilies", ignore=ignore) shutil.copytree(fileLoc+"/themes", instLoc+"/themes", ignore=ignore) for f in os.listdir(fileLoc): filePath = os.path.join(fileLoc, f) if not os.path.isdir(filePath) and f != "pesterchum.js": shutil.copy(filePath, instLoc) setPermissions(instLoc) # save the install location f = open(_HOME+"/.pcInstallLoc", "w") f.write(instLoc) f.close() #create a cool executable print "Creating executable... (/usr/local/bin/pesterchum)" f = open("/usr/local/bin/pesterchum", 'w') f.write("#!/bin/sh\ncd "+instLoc+"\n./pesterchum $@") f.close() os.chmod("/usr/local/bin/pesterchum", S_IRUSR|S_IWUSR|S_IXUSR|S_IRGRP|S_IXGRP|S_IROTH|S_IXOTH) # Create a fancy menu item in gnome if gnome: print "Creating menu item..." t = Template("[Desktop Entry]\nEncoding=UTF-8\nVersion=3.14.2\nName=Pesterchum\nComment=IM client based on Homestuck Pesterchum\nCategories=Network;InstantMessaging;\nExec=/usr/local/bin/pesterchum\nIcon=$loc/pesterchum.ico\nTerminal=false\nType=Application") f = open("/usr/share/applications/pesterchum.desktop", "w") f.write(t.safe_substitute(loc=instLoc)) f.close() # create shortcut launcher if shortcut: print "Creating launcher..." t = Template("#!/usr/bin/env xdg-open\n[Desktop Entry]\nEncoding=UTF-8\nVersion=3.14.2\nName=Pesterchum\nComment=IM client based on Homestuck Pesterchum\nCategories=Network;InstantMessaging;\nExec=pesterchum\nIcon=$loc/pesterchum.ico\nTerminal=false\nType=Application") f = open(_HOME+"/Pesterchum.desktop", "w") f.write(t.safe_substitute(loc=instLoc)) f.close() os.chown(_HOME+"/Pesterchum.desktop", _UID, _GID) os.chmod(_HOME+"/Pesterchum.desktop", S_IRUSR|S_IWUSR|S_IXUSR|S_IRGRP|S_IXGRP|S_IROTH|S_IXOTH) else: print "Welcome to the Pesterchum 3.14 Easy Uninstaller (for Linux)!\n\ Created by Kiooeht [evacipatedBox] May 28th-29th, 2011.\n\ License: WTFPL\n" while 1: remove = raw_input("Would you like to uninstall Pesterchum? [y/n]: ") if remove.lower() == "y": while 1: killdata = raw_input("Purge your settings, profiles, and logs? [y/N]: ") if killdata.lower() == "n" or killdata == "": killdata = False;break elif killdata.lower() == "y": killdata = True;break else: print "Hmmmmm...?" f = open(_HOME+"/.pcInstallLoc") instLoc = f.readline() f.close() os.remove(_HOME+"/.pcInstallLoc") if killdata: print "Removing files..." shutil.rmtree(instLoc) else: print "Backing up settings, profiles, and logs..." if os.path.exists(instLoc+"/logs"): shutil.move(instLoc+"/logs", "_easyBackupLOGS") if os.path.exists(instLoc+"/profiles"): shutil.move(instLoc+"/profiles", "_easyBackupPROFILES") if os.path.exists(instLoc+"/pesterchum.js"): shutil.move(instLoc+"/pesterchum.js", "_easyBackupSETTINGS") print "Removing files..." shutil.rmtree(instLoc) print "Restoring up settings, profiles, and logs..." os.mkdir(instLoc) if os.path.exists("_easyBackupLOGS"): shutil.move("_easyBackupLOGS", instLoc+"/logs") if os.path.exists("_easyBackupPROFILES"): shutil.move("_easyBackupPROFILES", instLoc+"/profiles") if os.path.exists("_easyBackupSETTINGS"): shutil.move("_easyBackupSETTINGS", instLoc+"/pesterchum.js") setPermissions(instLoc) print "Trashing executable..." os.remove("/usr/local/bin/pesterchum") if os.path.exists("/usr/share/applications/pesterchum.desktop"): print "Maiming menu item..." os.remove("/usr/share/applications/pesterchum.desktop") if os.path.exists(_HOME+"/Pesterchum.desktop"): print "Destroying launcher..." os.remove(_HOME+"/Pesterchum.desktop") elif os.path.exists(_HOME+"/Desktop/Pesterchum.desktop"): print "Destroying launcher..." os.remove(_HOME+"/Desktop/Pesterchum.desktop") else: print "Unable to find launcher, non destroyed" break elif remove.lower() == "n": print "Aborting uninstallation process" break else: print "Invalid input, try again" except KeyboardInterrupt: print "" except Exception as e: error = -1 finally: if error == -1: print "Oh noes!! It seems an error has occurred!" lineN = traceback.extract_tb(sys.exc_info()[2])[-1][1] print "The error occurred on line %s:" % lineN formatted_lines = traceback.format_exc().splitlines() print " '" + formatted_lines[-2] + "'" print formatted_lines[-1] while 1: print "\nWould you like to (s)end a bug report," send = raw_input("view the (f)ull error message, or (n)either? [s/f/n]: ") if send.lower() == "n": act = 2;break elif send.lower() == "s": act = 0;break elif send.lower() == "f": print "!---------------BEGIN ERROR MESSAGE---------------!" for l in formatted_lines: print l print "!----------------END ERROR MESSAGE----------------!" send = raw_input("Would you like to send this error message? [y/n]: ") if send.lower() == "y": act = 0;break elif send.lower() == "n": act = 2;break else: print "What was that?" if act == 2: print "Okay" elif act == 0: print "Thank you for taking time out of your day to complete a bug report." print "Fields marked with an asterisk (*) are required." name = raw_input("Your Name: ") while 1: os = raw_input("OS (include version) (ex. Ubuntu 10.10) [*]: ") if os: break else: print "This field is required." while 1: msg = raw_input("Short description of problem [*]: ") if msg: break else: print "This field is required." import urllib, json data = urllib.urlencode({"name":name, "os":os, "msg":msg, "short":formatted_lines[-1], "long":json.dumps(formatted_lines)}) try: print "Sending..." f = urllib.urlopen("http://distantsphere.com/pc/easyInstall.php", data) text = f.read() print text if text == "success!": print "Sent!" else: print "There seems to have been a problem sending your bug report! ):" except: print "There seems to have been a problem sending your bug report! ):"