#!/usr/bin/env python # # archey [version 0.1-7] # # Maintained by Melik Manukyan # Distributed under the terms of the GNU General Public License v3. # See http://www.gnu.org/licenses/gpl.txt for the full license text. # # Simple python script to display an Archlinux logo in ASCII art # Along with basic system information. # Import libraries import subprocess, optparse, re, sys from subprocess import Popen, PIPE from optparse import OptionParser from getpass import getuser from time import ctime, sleep if sys.version_info[1] < 6: from future import with_statement # Display [Comment/Uncomment to Enable/Disable information.] display = [ 'os', # Display Operating System 'hostname', # Display Machine Hostname 'kernel', # Display Kernel Version # 'battery', # Display Battery Usage [Requires 'acpi'] 'uptime', # Display System Uptime 'coretemp', # Display System Core tempature 'wm', # Display Window Manager 'de', # Display Desktop Environment 'packages', # Display Number of Packages Installed 'ram', # Display RAM Usage 'cpu', # Display CPU Model 'sh', # Display Current Shell # 'fs:/boot', # Display /boot Partition Usage # 'fs:/home', # Display /home Partition Usage # 'fs:/MOUNT/POINT', # Display * Partition, Edit To Your Needs 'fs:/' # Display / Partition Usage ] # Array containing Values result = [] # Options if __name__=='__main__': parser = OptionParser(usage='%prog [-c COLOR] [-s, --screenshot]', description='To customize the info displayed on archey, edit "/usr/bin/archey" directly and look for the display array. Note: Archey can only allow up to 15 fields.') parser.add_option('-c', action='store', default='blue', type='choice', dest='color', choices=('black', 'red', 'green', 'yellow', 'blue', 'magenta', 'cyan', 'white'), help='choose a color: black, red, green, yellow, blue, magenta, cyan, white [Default: blue]') parser.add_option('-s', '--screenshot', action='store_true', dest='screenshot', help='take a screenshot') (options, args) = parser.parse_args() # Define colors colorscheme = '%s' % options.color colors = {'black': '0', 'red': '1', 'green': '2', 'yellow': '3', 'blue': '4', 'magenta': '5', 'cyan': '6', 'white': '7'} for key in colors.keys(): if key in colorscheme: colorcode = colors[key] color = '\x1b[1;3%sm' % colorcode color2 = '\x1b[0;3%sm' % colorcode clear = '\x1b[0m' # Define processes for identifying Desktop Environmentss, Window Managers, Shells. de_dict = {'gnome-session': 'GNOME', 'ksmserver': 'KDE', 'xfce-mcs-manager': 'Xfce 4', 'xfconfd': 'Xfce 4.6'} wm_dict = {'awesome': 'Awesome', 'beryl': 'Beryl', 'blackbox': 'Blackbox', 'compiz': 'Compiz', 'dwm': 'DWM', 'enlightenment': 'Enlightenment', 'fluxbox': 'Fluxbox', 'fvwm': 'FVWM', 'icewm': 'IceWM', 'kwin': 'KWin', 'metacity': 'Metacity', 'musca': 'Musca', 'openbox': 'Openbox', 'pekwm': 'PekWM', 'wmaker': 'Window Maker', 'wmii': 'wmii', 'xfwm4': 'Xfwm', 'xmonad': 'xmonad', 'scrotwm': 'ScrotWM'} sh_dict = {'zsh': 'Z-Shell', 'bash': 'Bash', 'dash': 'Dash', 'fish': 'Fish', 'ksh': 'Korn Shell', 'jsh': 'Job control shell', 'tcsh': 'The C Shell'} os_dict = {'arch': 'Arch Linux', 'ubuntu': 'Ubuntu', 'debian': 'Debian'} # Find running processes. def xmonadfix(str): if re.compile("xmonad").match(str): return "xmonad" return str p1 = Popen(['ps', '-u', getuser()], stdout=PIPE).communicate()[0].split('\n') processes = map(xmonadfix, [process.split()[3] for process in p1 if process]) p1 = None # Architecture arch = Popen(['uname', '-m'], stdout=PIPE).communicate()[0].rstrip('\n') # Print coloured key with normal value. def output(key, value): output = '%s%s:%s %s' % (color, key, clear, value) result.append(output) # RAM Function def ram_display(): raminfo = Popen(['free', '-m'], stdout=PIPE).communicate()[0].split('\n') ram = ''.join(filter(re.compile('M').search, raminfo)).split() used = int(ram[2]) - int(ram[5]) - int(ram[6]) output ('RAM', '%s MB / %s MB' % (used, ram[1])) # Screenshot Function screen = '%s' % options.screenshot def screenshot(): print 'Screenshotting in' list = range(1,6) list.reverse() for x in list: print '%s...' % x, sys.stdout.flush() sleep(1) subprocess.check_call(['import', '-window', 'root', ctime().replace(' ','_')+'.jpg']) print 'Say Cheese!' # Core Temp Function def coretemp_display(): tempinfo = Popen(['sensors', 'coretemp-*'], stdout=PIPE).communicate()[0].split('\n')[2::4] temps = '' orange = '\x1b[1;33m' red = '\x1b[1;31m' blue = '\x1b[1;34m' for line in tempinfo: value = line.split(':')[1].replace(' ','').split('(')[0] if int(value[1:3]) > 40: temps = temps + red + line.split(':')[1].replace(' ','').split('(')[0] + clear + ',' elif int(value[1:3]) in range(31,41): temps = temps + orange + line.split(':')[1].replace(' ','').split('(')[0] + clear + ',' elif int(value[1:3]) < 30: temps = temps + blue + line.split(':')[1].replace(' ','').split('(')[0] + clear + ',' temps = temps[:-1] output ('Core Temp', temps) # Operating System Function def os_display(): global os for key in os_dict: try: if eval('os_' + key)(): os = os_dict[key] except NameError: if os_lsb(key): os = os_dict[key] output('OS', os + ' ' + arch) # Arch finding function def os_arch(): try: file = open('/etc/pacman.conf') except IOError: return False else: file.close() return True # OS finding using lsb def os_lsb(key): try: file = open('/etc/lsb-release') if not os[key] in file.readlines()[0]: raise IOError except IOError: return False else: file.close() return True # Kernel Function def kernel_display(): kernel = Popen(['uname', '-r'], stdout=PIPE).communicate()[0].rstrip('\n') output ('Kernel', kernel) # Hostname Function def hostname_display(): hostname = Popen(['uname', '-n'], stdout=PIPE).communicate()[0].rstrip('\n') output ('Hostname', hostname) # CPU Function def cpu_display(): file = open('/proc/cpuinfo').readlines() cpuinfo = re.sub(' +', ' ', file[4].replace('model name\t: ', '').rstrip('\n')) output ('CPU', cpuinfo) # Uptime Function def uptime_display(): fuptime = int(open('/proc/uptime').read().split('.')[0]) day = int(fuptime / 86400) fuptime = fuptime % 86400 hour = int(fuptime / 3600) fuptime = fuptime % 3600 minute = int(fuptime / 60) uptime = '' if day == 1: uptime += '%d day, ' % day if day > 1: uptime += '%d days, ' % day uptime += '%d:%02d' % (hour, minute) output('Uptime', uptime) # Battery Function [Requires: acpi] def battery_display(): p1 = Popen(['acpi'], stdout=PIPE).communicate()[0].lstrip() battery = p1.split(' ')[3].rstrip('\n') output ('Battery', battery) # Desktop Environment Function def de_display(): de = 'None found' for key in de_dict.keys(): if key in processes: de = de_dict[key] output ('DE', de) # Window Manager Function def wm_display(): wm = 'None found' for key in wm_dict.keys(): if key in processes: wm = wm_dict[key] output ('WM', wm) # Shell Function def sh_display(): sh = 'None found' for key in processes: if key in sh_dict.keys(): sh = sh_dict[key] output ('Shell', sh) # Packages Function def packages_display(): p1 = Popen(['pacman', '-Q'], stdout=PIPE) p2 = Popen(['wc', '-l'], stdin=p1.stdout, stdout=PIPE) packages = p2.communicate()[0].rstrip('\n') output ('Packages', packages) # File System Function def fs_display(mount=''): p1 = Popen(['df', '-TPh', mount], stdout=PIPE).communicate()[0] used = [line for line in p1.split('\n') if line][1] used = used.split()[3] total = [line for line in p1.split('\n') if line][1] total = total.split()[2] type = [line for line in p1.split('\n') if line][1] type = type.split()[1] if mount == '/': mount = '/root' fs = mount.rpartition('/')[2].title() + " FS" part = '%s / %s (%s)' % (used, total, type) output (fs, part) # Run functions found in 'display' array. for x in display: call = [arg for arg in x.split(':') if arg] funcname=call[0] + '_display' func=locals()[funcname] if len(call) > 1: func(arg) else: func() # Array containing values. result.extend(['']*(15 - len(display))) colors = {'Arch Linux': (color, color, color, result[0], color, result[1], color, result[2], color, result[3], color, result[4], color, result[5], color, result[6], color, color2, color, result[7], color, color2, color, result[8], color, color2, result[9], color2, result[10], color2, result[11], color2, result[12], color2, result[13], color2, result[14], color2, color2, clear), 'Ubuntu': 'color3, color3, color2, color3, color2, color3, result[0], color, color2, color3, result[1], color, color2, color3, result[2], color, color2, result[3], color, color2, result[4], color, color2, result[5], color, color2, result[6], color2, color, color2, result[7], color2, color, color2, result[8], color2, color, result[9], color2, color, color3, result[10], color2, color, color3, result[11], color, color3, result[12], color, color3, result[13], color, color3, result[14], color, color3, color, color3, color, color, color3, color, color3, color, color3, color, color, color, clear'} ###### Result ####### logos = {'Arch Linux': '''%s %s + %s # %s %s ### %s %s ##### %s %s ###### %s %s ; #####; %s %s +##.##### %s %s +########## %s %s ######%s#####%s##; %s %s ###%s############%s+ %s %s #%s###### ####### %s %s .######; ;###;`\". %s %s .#######; ;#####. %s %s #########. .########` %s %s ######' '###### %s %s ;#### ####; %s %s ##' '## %s #' `# %s ''', 'Ubuntu': ''' %s ++++++ %s ++++++++ %s ++++++++++ %s++++++++ %s ++++++++++++ %s++++++++ %s %s ++ %s++++++++++++ %s++++++ %s %s +++++ %s++++++++++++ %s^^^^ %s %s +++++++ %s+++++++++++++++++++ %s %s +++++++++ %s+++++++++++ %s %s ++++++++++ %s++++++++++ %s %s ++++++++ %s++++++++++ %s %s ++++++ %s++++++ %s++++++++++ %s %s ++++++++ %s+++++ %s+++++++++ %s %s +++++++++ %s++++ %s %s ++++++++ %s+++++ %s+++++++++ %s %s ++++++ %s++++++ %s++++++++++ %s %s ++++++++ %s++++++++++ %s %s +++++++++ %s++++++++++ %s %s +++++++++ %s++++++++++++ %s %s +++++++ %s+++++++++++++++++++ %s +++++ %s++++++++++++ %s,,,, %s ++ %s++++++++++++ %s++++++ %s ++++++++++++ %s++++++++ %s ++++++++++ %s++++++++ %s ++++++++ %s ++++++ %s '''} print logos[os] % colors[os] if screen == 'True': screenshot()