#!/usr/bin/env python # # Archey [version 0.2.7] # # Archey is a system information tool written in Python. # # Maintained by Melik Manukyan # ASCII art by Brett Bohnenkamper # Changes Jerome Launay # Fedora support by YeOK # Distributed under the terms of the GNU General Public License v3. # See http://www.gnu.org/licenses/gpl.txt for the full license text. # Import libraries import os, sys, subprocess, optparse, re, linecache from subprocess import Popen, PIPE from optparse import OptionParser from getpass import getuser from time import ctime, sleep # Display [Comment/Uncomment to Enable/Disable information.] display = [ 'distro', # Display Distribution 'hostname', # Display Machine Hostname 'kernel', # Display Kernel Version 'uptime', # Display System Uptime '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 'term', # Display Current Terminal 'fs' # Display / Partition Usage ] # Array containing Values result = [] # Options if __name__=='__main__': parser = OptionParser(usage='%prog [-s, --screenshot]', description='Archey is a system information tool written in Python.', version="%prog 0.2.7") parser.add_option('-s', '--screenshot', action='store_true', dest='screenshot', help='take a screenshot') (options, args) = parser.parse_args() # Define processes for identifying Desktop Environmentss, Window Managers, Shells. de_dict = { 'gnome-session': 'GNOME', 'ksmserver': 'KDE', 'xfce4-session': 'Xfce'} wm_dict = { 'awesome': 'Awesome', 'beryl': 'Beryl', 'blackbox': 'Blackbox', 'compiz': 'Compiz', 'dwm': 'DWM', 'enlightenment': 'Enlightenment', 'fluxbox': 'Fluxbox', 'fvwm': 'FVWM', 'i3': 'i3', 'icewm': 'IceWM', 'kwin': 'KWin', 'metacity': 'Metacity', 'musca': 'Musca', 'openbox': 'Openbox', 'pekwm': 'PekWM', 'ratpoison': 'ratpoison', 'scrotwm': 'ScrotWM', 'wmaker': 'Window Maker', 'wmfs': 'Wmfs', 'wmii': 'wmii', 'xfwm4': 'Xfwm', 'xmonad': 'xmonad'} sh_dict = { 'zsh': 'Zsh', 'bash': 'Bash', 'dash': 'Dash', 'fish': 'Fish', 'ksh': 'Ksh', 'csh': 'Csh', 'jsh': 'Jsh', 'tcsh': 'Tcsh'} # Define Color Schemes. # Clear clear = '\x1b[0m' # Arch Linux. acolor = '\x1b[1;34m' acolor2 = '\x1b[0;34m' # Ubuntu. ucolor = '\x1b[1;33m' ucolor2 = '\x1b[1;31m' ucolor3 = '\x1b[0;31m' # Debian dcolor = '\x1b[1;31m' dcolor2 = '\x1b[0;31m' # Fedora fcolor = '\x1b[1;37m' fcolor2 = '\x1b[1;34m' fcolor3 = '\x1b[0;34m' # CrunchBang ccolor = '\x1b[0;37m' ccolor2 = '\x1b[1;37m' # Mint mcolor = '\x1b[1;37m' mcolor2 = '\x1b[1;32m' # 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 # Find Distro. DetectDistro = Popen(['lsb_release', '-i'], stdout=PIPE).communicate()[0].split(':')[1].lstrip('\t').rstrip('\n') # Print coloured key with normal value. def output(key, value): if DetectDistro == 'Ubuntu': output ='%s%s:%s %s' % (ucolor2, key, clear, value) if DetectDistro == 'Arch': output = '%s%s:%s %s' % (acolor, key, clear, value) if DetectDistro == 'Debian': output = '%s%s:%s %s' % (dcolor, key, clear, value) if DetectDistro == 'Fedora': output = '%s%s:%s %s' % (fcolor2, key, clear, value) if DetectDistro == 'CrunchBang': output = '%s%s:%s %s' % (ccolor, key, clear, value) if DetectDistro == 'LinuxMint': output = '%s%s:%s %s' % (mcolor2, 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 'Taking shot in', list = range(1,6) list.reverse() for x in list: print '%s..' % x, sys.stdout.flush() sleep(1) print 'Say Cheeze!' subprocess.check_call(['scrot']) # Operating System Function. def distro_display(): arch = Popen(['uname', '-m'], stdout=PIPE).communicate()[0].rstrip('\n') if DetectDistro == 'Debian': release = Popen(['lsb_release', '-r'], stdout=PIPE).communicate()[0].split(':')[1].lstrip('\t').rstrip('\n') distro = 'Debian %s %s' % (release, arch) if DetectDistro == 'Ubuntu': release = Popen(['lsb_release', '-r'], stdout=PIPE).communicate()[0].split(':')[1].lstrip('\t').rstrip('\n') distro = 'Ubuntu %s %s' % (release, arch) if DetectDistro == 'Arch': distro = 'Arch Linux %s' % arch if DetectDistro == 'Fedora': release = Popen(['lsb_release', '-r'], stdout=PIPE).communicate()[0].split(':')[1].lstrip('\t').rstrip('\n') distro = 'Fedora %s %s' % (release, arch) if DetectDistro == 'CrunchBang': release = Popen(['lsb_release', '-r'], stdout=PIPE).communicate()[0].split(':')[1].lstrip('\t').rstrip('\n') if DetectDistro == 'LinuxMint': release = Popen(['lsb_release', '-r'], stdout=PIPE).communicate()[0].split(':')[1].lstrip('\t').rstrip('\n') distro = 'Mint %s %s' % (release, arch) output('OS', distro) # 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) # Desktop Environment Function. def de_display(): de = 'None found' for key in de_dict.keys(): if key in processes: de = de_dict[key] output ('Desktop Environment', 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 ('Window Manager', wm) # Shell Function. def sh_display(): sh = os.getenv("SHELL").split('/')[-1].capitalize() output ('Shell', sh) # Terminal Function. def term_display(): term = os.getenv("TERM").split('/')[-1].capitalize() output ('Terminal', term) # Packages Function. def packages_display(): if DetectDistro == 'Ubuntu': p1 = Popen(['dpkg', '--get-selections'], stdout=PIPE) p2 = Popen(['grep', '-v', 'deinstall'], stdin=p1.stdout, stdout=PIPE) p3 = Popen(['wc', '-l'], stdin=p2.stdout, stdout=PIPE) packages = p3.communicate()[0].rstrip('\n') output ('Packages', packages) if DetectDistro == 'Arch': p1 = Popen(['pacman', '-Q'], stdout=PIPE) p2 = Popen(['wc', '-l'], stdin=p1.stdout, stdout=PIPE) packages = p2.communicate()[0].rstrip('\n') output ('Packages', packages) if DetectDistro == 'Debian': p1 = Popen(['dpkg', '--get-selections'], stdout=PIPE) p2 = Popen(['grep', '-v', 'deinstall'], stdin=p1.stdout, stdout=PIPE) p3 = Popen(['wc', '-l'], stdin=p2.stdout, stdout=PIPE) packages = p3.communicate()[0].rstrip('\n') output ('Packages', packages) if DetectDistro == 'CrunchBang': p1 = Popen(['dpkg', '--get-selections'], stdout=PIPE) p2 = Popen(['grep', '-v', 'deinstall'], stdin=p1.stdout, stdout=PIPE) p3 = Popen(['wc', '-l'], stdin=p2.stdout, stdout=PIPE) packages = p3.communicate()[0].rstrip('\n') output ('Packages', packages) if DetectDistro == 'Fedora': p1 = Popen(['rpm', '-qa'], stdout=PIPE) p2 = Popen(['wc', '-l'], stdin=p1.stdout, stdout=PIPE) packages = p2.communicate()[0].rstrip('\n') if DetectDistro == 'LinuxMint': p1 = Popen(['dpkg', '--get-selections'], stdout=PIPE) p2 = Popen(['grep', '-v', 'deinstall'], stdin=p1.stdout, stdout=PIPE) p3 = Popen(['wc', '-l'], stdin=p2.stdout, stdout=PIPE) packages = p3.communicate()[0].rstrip('\n') output ('Packages', packages) # File System Function. def fs_display(): supported = ('ext2', 'ext3', 'ext4', 'reiserfs', 'jfs', 'ntfs', 'fat32', 'btrfs', 'fuseblk') p1 = Popen(['df', '-TPh'], stdout=PIPE).communicate()[0] filesystems = p1.rstrip().split('\n') del filesystems[0] for fs in filesystems: fs_split = fs.split() used = fs_split[3] total = fs_split[2] type = fs_split[1] name = fs_split[6] part = '%s / %s (%s)' % (used, total, type) if name == '/': name = '/root' fs = name.rpartition('/')[2].title() + " FS" if type in supported: output (fs, part) # Run functions found in 'display' array. for x in display: funcname=x+'_display' func=locals()[funcname] func() # Array containing values. result.extend(['']*(20 - len(display))) # Result. if DetectDistro == 'Ubuntu': print """ %s .oyhhs: %s %s ..--.., %sshhhhhh- %s %s -+++++++++`:%syyhhyo` %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:yyyyyo %s %s ``` `%s-::::-` %s:yhhhhh: %s %s -:::::-. %s`-ohhhhhh+ %s %s .::::-` %s-o+///+oyhhyyyhy: %s %s `.-- %s/yhhhhhhhy+%s,.... %s %s /hhhhhhhhh%s-.-:::; %s %s `.:://::- %s-:::::; %s %s `.-:-' %s %s %s %s""" % ( ucolor3, result[0], ucolor2, ucolor3, result[1], ucolor2, ucolor3, result[2], ucolor, ucolor2, ucolor3, result[3], ucolor, ucolor2, result[4], ucolor, ucolor2, result[5], ucolor2, ucolor, ucolor2, result[6], ucolor2, ucolor, ucolor2, result[7], ucolor2, ucolor, result[8], ucolor2, ucolor, ucolor3, result[9], ucolor2, ucolor, ucolor3, result[10], ucolor, ucolor3, result[11], ucolor, ucolor3, result[12], ucolor, ucolor3, ucolor, result[13], ucolor3, ucolor, result[14], ucolor3, ucolor, result[15], ucolor, result[16], ucolor, result[17], clear ) if DetectDistro == 'Arch': print """%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 """ % (acolor, acolor, result[0], acolor, result[1], acolor, result[2], acolor, result[3], acolor, result[4], acolor, result[5], acolor, result[6], acolor, result[7], acolor, acolor2, acolor, result[8], acolor, acolor2, acolor, result[9], acolor, acolor2, result[10], acolor2, result[11], acolor2, result[12], acolor2, result[13], acolor2, result[14], acolor2, result[15], acolor2, result[16], acolor2, result[17], clear) if DetectDistro == 'Debian': print """%s %s %s %s _sudZUZ#Z#XZo=_ %s %s _jmZZ2!!~---~!!X##wx %s %s . -]Xb/ ~ __#2( %s %s -Zo; +!4ZwerfgnZZXY' %s %s *#[, ~-?!!!!!!-~ %s %s XUb;. %s %s )YXL,, %s %s +3#bc, %s %s -)SSL,, %s %s ~~~~~ %s %s %s %s """ % (dcolor, dcolor, result[0], dcolor, result[1], dcolor, result[2], dcolor, result[3], dcolor, result[4], dcolor, result[5], dcolor, result[6], dcolor, result[7], dcolor, result[8], dcolor2, result[9], dcolor2, result[10], dcolor2, result[11], dcolor2, result[12], dcolor2, result[13], dcolor2, result[14], dcolor2, result[15], dcolor2, result[16], dcolor2, result[17], clear) if DetectDistro == 'Fedora': print """ %s :/------------:// %s %s :------------------:// %s %s :-----------%s/shhdhyo/%s-:// %s %s /-----------%somMMMNNNMMMd/%s-:/ %s %s :-----------%ssMMMdo:/%s -:/ %s %s :-----------%s:MMMd%s------- --:/ %s %s /-----------%s:MMMy%s------- ---/ %s %s :------ --%s/+MMMh/%s-- ---: %s %s :--- %soNMMMMMMMMMNho%s -----: %s %s :-- %s+shhhMMMmhhy++%s ------: %s %s :- -----%s:MMMy%s--------------/ %s %s :- ------%s/MMMy%s-------------: %s %s :- ----%s/hMMM+%s------------: %s %s :--%s:dMMNdhhdNMMNo%s-----------: %s %s :---%s:sdNMMMMNds:%s----------: %s %s :------%s:://:%s-----------:// %s %s :--------------------:// %s %s %s %s """ % ( fcolor3, result[0], fcolor3, result[1], fcolor3, fcolor, fcolor3, result[2], fcolor3, fcolor, fcolor3, result[3], fcolor3, fcolor, fcolor3, result[4], fcolor3, fcolor, fcolor3, result[5], fcolor3, fcolor, fcolor3, result[6], fcolor3, fcolor, fcolor3, result[7], fcolor3, fcolor, fcolor3, result[8], fcolor3, fcolor, fcolor3, result[9], fcolor3, fcolor, fcolor3, result[10], fcolor3, fcolor, fcolor3, result[11], fcolor3, fcolor, fcolor3, result[12], fcolor3, fcolor, fcolor3, result[13], fcolor3, fcolor, fcolor3, result[14], fcolor3, fcolor, fcolor3, result[15], fcolor3, result[16], fcolor3, result[17], clear ) if DetectDistro == 'CrunchBang': print """ %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""" % ( ccolor, result[0], ccolor, result[1], ccolor, result[2], ccolor, result[3], ccolor, result[4], ccolor, result[5], ccolor, result[6], ccolor, result[7], ccolor, result[8], ccolor, result[9], ccolor, result[10], ccolor, result[11], ccolor, result[12], ccolor, result[13], ccolor, result[14], ccolor, result[15], ccolor, result[16], ccolor, result[17], clear ) if DetectDistro == 'LinuxMint': print """%s %s %s MMMMMMMMMMMMMMMMMMMMMMMMMmds+. %s %s MMm----::-://////////////oymNMd+` %s %s MMd %s/++ %s-sNMd: %s %s MMNso/` %sdMM `.::-. .-::.` %s.hMN: %s %s ddddMMh %sdMM :hNMNMNhNMNMNh: `%sNMm %s %s NMm %sdMM .NMN/-+MMM+-/NMN` %sdMM %s %s NMm %sdMM -MMm `MMM dMM. %sdMM %s %s NMm %sdMM -MMm `MMM dMM. %sdMM %s %s NMm %sdMM .mmd `mmm yMM. %sdMM %s %s NMm %sdMM` ..` ... ydm. %sdMM %s %s hMM- %s+MMd/-------...-:sdds %sMMM %s %s -NMm- %s:hNMNNNmdddddddddy/` %sdMM %s %s -dMNs-``%s-::::-------.`` %sdMM %s %s `/dMNmy+/:-------------:/yMMM %s %s ./ydNMMMMMMMMMMMMMMMMMMMMM %s %s %s %s %s %s""" % ( mcolor, result[0], mcolor, result[1], mcolor, result[2], mcolor, mcolor2, mcolor, result[3], mcolor, mcolor2, mcolor, result[4], mcolor, mcolor2, mcolor, result[5], mcolor, mcolor2, mcolor, result[6], mcolor, mcolor2, mcolor, result[7], mcolor, mcolor2, mcolor, result[8], mcolor, mcolor2, mcolor, result[9], mcolor, mcolor2, mcolor, result[10], mcolor, mcolor2, mcolor, result[11], mcolor, mcolor2, mcolor, result[12], mcolor, mcolor2, mcolor, result[13], mcolor, result[14], mcolor, result[15], mcolor, result[16], mcolor, result[17], clear ) if screen == 'True': screenshot()