archey4/archey

551 lines
22 KiB
Python
Executable File

#!/usr/bin/env python3
#
# Archey4
#
# -- Archey is a simple system information tool written in Python.
#
# Copyright 2010 Melik Manukyan <melik@archlinux.us>
# Copyright 2010 David Vazgenovich Shakaryan <dvshakaryan@gmail.com>
#
# ASCII art by Brett Bohnenkamper <kittykatt@silverirc.com>
# Changes Jerome Launay <jerome@projet-libre.org>
# Fedora support by YeOK <yeok@henpen.org>
#
# Currently maintained by Samuel FORESTIER <https://horlogeskynet.github.io/>
#
# This program IS A FORK of the original Archey project <https://github.com/djmelik/archey>
#
# 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 re
from math import floor
from os import getenv, getuid
from subprocess import Popen, PIPE
from collections import OrderedDict
# -------------- Dictionaries -------------- #
colorDict = {
'Arch Linux': ['\x1b[0;34m', '\x1b[1;34m'],
'BunsenLabs': ['\x1b[1;37m', '\x1b[1;33m', '\x1b[0;33m'],
'CrunchBang': ['\x1b[1;37m', '\x1b[1;37m'],
'Debian': ['\x1b[0;31m', '\x1b[1;31m'],
'Fedora': ['\x1b[1;37m', '\x1b[0;34m'],
'Gentoo': ['\x1b[1;37m', '\x1b[1;35m'],
'Kali': ['\x1b[1;37m', '\x1b[1;34m'],
'ManjaroLinux': ['\x1b[0;32m', '\x1b[1;32m'],
'Linux': ['\x1b[1;33m', '\x1b[1;37m'],
'LinuxMint': ['\x1b[1;37m', '\x1b[1;32m'],
'openSUSE': ['\x1b[1;37m', '\x1b[1;32m'],
'Red Hat': ['\x1b[1;37m', '\x1b[1;31m', '\x1b[0;31m'],
'Ubuntu': ['\x1b[0;31m', '\x1b[1;31m', '\x1b[0;33m'],
'sensors': ['\x1b[0;31m', '\x1b[0;32m', '\x1b[0;33m'],
'clear': '\x1b[0m'
}
deDict = {
'cinnamon': 'Cinnamon',
'gnome-session': 'GNOME',
'gnome-shell': 'GNOME',
'mate-session': 'MATE',
'ksmserver': 'KDE',
'xfce4-session': 'Xfce',
'fur-box-session': 'Fur Box',
'lxsession': 'LXDE',
'lxqt-session': 'LXQt'
}
wmDict = {
'awesome': 'Awesome',
'beryl': 'Beryl',
'blackbox': 'Blackbox',
'bspwm': 'bspwm',
'cinnamon': 'Cinnamon',
'compiz': 'Compiz',
'dwm': 'DWM',
'enlightenment': 'Enlightenment',
'herbstluftwm': 'herbstluftwm',
'fluxbox': 'Fluxbox',
'fvwm': 'FVWM',
'i3': 'i3',
'icewm': 'IceWM',
'kwin': 'KWin',
'metacity': 'Metacity',
'musca': 'Musca',
'nemo': 'Nemo',
'openbox': 'Openbox',
'pekwm': 'PekWM',
'qtile': 'QTile',
'ratpoison': 'ratpoison',
'scrotwm': 'ScrotWM',
'stumpwm': 'StumpWM',
'subtle': 'Subtle',
'monsterwm': 'MonsterWM',
'wingo': 'Wingo',
'wmaker': 'Window Maker',
'wmfs': 'Wmfs',
'wmii': 'wmii',
'xfwm4': 'Xfwm',
'xmonad': 'xmonad'
}
logosDict = {
'Arch Linux': """
{c[1]} + {r[0]}
{c[1]} # {r[1]}
{c[1]} ### {r[2]}
{c[1]} ##### {r[3]}
{c[1]} ###### {r[4]}
{c[1]} ; #####; {r[5]}
{c[1]} +##.##### {r[6]}
{c[1]} +########## {r[7]}
{c[1]} ######{c[0]}#####{c[1]}##; {r[8]}
{c[1]} ###{c[0]}############{c[1]}+ {r[9]}
{c[1]} #{c[0]}###### ####### {r[10]}
{c[0]} .######; ;###;`\". {r[11]}
{c[0]} .#######; ;#####. {r[12]}
{c[0]} #########. .########` {r[13]}
{c[0]} ######' '###### {r[14]}
{c[0]} ;#### ####; {r[15]}
{c[0]} ##' '## {r[16]}
{c[0]} #' `# {r[17]}\n""",
'Debian': """
{c[1]} {r[0]}
{c[1]} _sudZUZ#Z#XZo=_ {r[1]}
{c[1]} _jmZZ2!!~---~!!X##wx {r[2]}
{c[1]} .<wdP~~ -!YZL, {r[3]}
{c[1]} .mX2' _xaaa__ XZ[. {r[4]}
{c[1]} oZ[ _jdXY!~?S#wa ]Xb; {r[5]}
{c[1]} _#e' .]X2( ~Xw| )XXc {r[6]}
{c[1]} .2Z` ]X[. xY| ]oZ( {r[7]}
{c[1]} .2#; )3k; _s!~ jXf` {r[8]}
{c[1]} {c[0]}1Z>{c[1]} {c[0]}-]Xb/{c[1]} {c[0]}~{c[1]} {c[0]}__#2({c[1]} {r[9]}
{c[1]} {c[0]}-Zo;{c[1]} {c[0]}+!4ZwerfgnZZXY'{c[1]} {r[10]}
{c[1]} {c[0]}*#[,{c[1]} {c[0]}~-?!!!!!!-~{c[1]} {r[11]}
{c[1]} {c[0]}XUb;.{c[1]} {r[12]}
{c[1]} {c[0]})YXL,,{c[1]} {r[13]}
{c[1]} {c[0]}+3#bc,{c[1]} {r[14]}
{c[1]} {c[0]}-)SSL,,{c[1]} {r[15]}
{c[1]} {c[0]}~~~~~{c[1]} {r[16]}
{c[1]} {r[17]}\n""",
'Ubuntu': """
{c[0]} .oyhhs: {r[0]}
{c[1]} ..--.., {c[0]}shhhhhh- {r[1]}
{c[1]} -+++++++++`:{c[0]}yyhhyo` {r[2]}
{c[2]} .-- {c[1]}-++++++++/-.-{c[0]}::-` {r[3]}
{c[2]} .::::- {c[1]}:-----:/+++/++/. {r[4]}
{c[2]} -:::::-. {c[1]}.:++++++: {r[5]}
{c[1]} ,,, {c[2]}.:::::-` {c[1]}.++++++- {r[6]}
{c[1]} ./+++/-{c[2]}`-::- {c[1]}./////: {r[7]}
{c[1]} +++++++ {c[2]}.::- {r[8]}
{c[1]} ./+++/-`{c[2]}-::- {c[0]}:yyyyyo {r[9]}
{c[1]} ``` `{c[2]}-::::-` {c[0]}:yhhhhh: {r[10]}
{c[2]} -:::::-. {c[0]}`-ohhhhhh+ {r[11]}
{c[2]} .::::-` {c[0]}-o+///+oyhhyyyhy: {r[12]}
{c[2]} `.-- {c[0]}/yhhhhhhhy+{c[2]},.... {r[13]}
{c[0]} /hhhhhhhhh{c[2]}-.-:::; {r[14]}
{c[0]} `.:://::- {c[2]}-:::::; {r[15]}
{c[2]} `.-:-' {r[16]}
{c[2]} {r[17]}\n""",
'CrunchBang': """
{c[0]} ___ ___ _ {r[0]}
{c[0]} / / / / | | {r[1]}
{c[0]} / / / / | | {r[2]}
{c[0]} / / / / | | {r[3]}
{c[0]} _______/ /______/ /______ | | {r[4]}
{c[0]} /______ _______ _______/ | | {r[5]}
{c[0]} / / / / | | {r[6]}
{c[0]} / / / / | | {r[7]}
{c[0]} / / / / | | {r[8]}
{c[0]} ______/ /______/ /______ | | {r[9]}
{c[0]} /_____ _______ _______/ | | {r[10]}
{c[0]} / / / / | | {r[11]}
{c[0]} / / / / |_| {r[12]}
{c[0]} / / / / _ {r[13]}
{c[0]} / / / / | | {r[14]}
{c[0]} /__/ /__/ |_| {r[15]}
{c[0]} {r[16]}
{c[0]} {r[17]}\n""",
'Fedora': """
{c[1]} :/------------:// {r[0]}
{c[1]} :------------------:// {r[1]}
{c[1]} :-----------{c[0]}/shhdhyo/{c[1]}-:// {r[2]}
{c[1]} /-----------{c[0]}omMMMNNNMMMd/{c[1]}-:/ {r[3]}
{c[1]} :-----------{c[0]}sMMMdo:/{c[1]} -:/ {r[4]}
{c[1]} :-----------{c[0]}:MMMd{c[1]}------- --:/ {r[5]}
{c[1]} /-----------{c[0]}:MMMy{c[1]}------- ---/ {r[6]}
{c[1]} :------ --{c[0]}/+MMMh/{c[1]}-- ---: {r[7]}
{c[1]} :--- {c[0]}oNMMMMMMMMMNho{c[1]} -----: {r[8]}
{c[1]} :-- {c[0]}+shhhMMMmhhy++{c[1]} ------: {r[9]}
{c[1]} :- -----{c[0]}:MMMy{c[1]}--------------/ {r[10]}
{c[1]} :- ------{c[0]}/MMMy{c[1]}-------------: {r[11]}
{c[1]} :- ----{c[0]}/hMMM+{c[1]}------------: {r[12]}
{c[1]} :--{c[0]}:dMMNdhhdNMMNo{c[1]}-----------: {r[13]}
{c[1]} :---{c[0]}:sdNMMMMNds:{c[1]}----------: {r[14]}
{c[1]} :------{c[0]}:://:{c[1]}-----------:// {r[15]}
{c[1]} :--------------------:// {r[16]}
{c[1]} {r[17]}\n""",
'Gentoo': """
{c[1]} -/oyddmdhs+:. {r[0]}
{c[1]} -o{c[0]}dNMMMMMMMMNNmhy+{c[1]}-` {r[1]}
{c[1]} -y{c[0]}NMMMMMMMMMMMNNNmmdhy{c[1]}+- {r[2]}
{c[1]} `o{c[0]}mMMMMMMMMMMMMNmdmmmmddhhy{c[1]}/` {r[3]}
{c[1]} om{c[0]}MMMMMMMMMMMN{c[1]}hhyyyo{c[0]}hmdddhhhd{c[1]}o` {r[4]}
{c[1]} .y{c[0]}dMMMMMMMMMMd{c[1]}hs++so/s{c[0]}mdddhhhhdm{c[1]}+` {r[5]}
{c[1]} oy{c[0]}hdmNMMMMMMMN{c[1]}dyooy{c[0]}dmddddhhhhyhN{c[1]}d. {r[6]}
{c[1]} :o{c[0]}yhhdNNMMMMMMMNNNmmdddhhhhhyym{c[1]}Mh {r[7]}
{c[1]} .:{c[0]}+sydNMMMMMNNNmmmdddhhhhhhmM{c[1]}my {r[8]}
{c[1]} /m{c[0]}MMMMMMNNNmmmdddhhhhhmMNh{c[1]}s: {r[9]}
{c[1]} `o{c[0]}NMMMMMMMNNNmmmddddhhdmMNhs{c[1]}+` {r[10]}
{c[1]} `s{c[0]}NMMMMMMMMNNNmmmdddddmNMmhs{c[1]}/. {r[11]}
{c[1]} /N{c[0]}MMMMMMMMNNNNmmmdddmNMNdso{c[1]}:` {r[12]}
{c[1]} +M{c[0]}MMMMMMNNNNNmmmmdmNMNdso{c[1]}/- {r[13]}
{c[1]} yM{c[0]}MNNNNNNNmmmmmNNMmhs+/{c[1]}-` {r[14]}
{c[1]} /h{c[0]}MMNNNNNNNNMNdhs++/{c[1]}-` {r[15]}
{c[1]} `/{c[0]}ohdmmddhys+++/:{c[1]}.` {r[16]}
{c[1]} `-//////:--. {r[17]}\n""",
'BunsenLabs': """
{c[0]} .{c[1]}..{c[0]}+hhy+-` \0
{c[0]} `+hd{c[1]}-{c[0]}+dddd{c[2]}hyso{c[0]}+//: \0
{c[0]} `+dddd{c[1]}:-{c[0]}sdh/. {r[0]}
{c[0]} -hdddddh{c[1]}-.{c[2]}/:{c[0]} {r[1]}
{c[0]} /ddddddddd{c[1]}:```{c[0]} {r[2]}
{c[0]} :ddddddddddd/ {r[3]}
{c[0]} `hdddddddddddd+ {r[4]}
{c[0]} /dddddddddddddd: {r[5]}
{c[0]} odddds..sddddddh {r[6]}
{c[0]} oddd/ /dddddd: {r[7]}
{c[0]} +dd+ +ddddd+ {r[8]}
{c[0]} .dd` `ddddd+ {r[9]}
{c[0]} oh ydddd: {r[10]}
{c[0]} `o sdddh` {r[11]}
{c[0]} yddd: {r[12]}
{c[0]} `dddo {r[13]}
{c[0]} :s :dds {r[14]}
{c[0]} yd/ yd+ {r[15]}
{c[0]} `sddy :h- {r[16]}
{c[0]} `sddys` :` {r[17]}
{c[0]} -hdy+`y+yo./+/:- \0
{c[0]} ... .o++oso+/ \n""",
'Kali': """
{c[0]} ,..... \0
{c[0]} ----` `..,;:ccc,. \0
{c[0]} ......''';lxO. {r[0]}
{c[0]} .....''''..........,:ld; {r[1]}
{c[0]} .';;;:::;,,.x, {r[2]}
{c[0]} ..'''. 0Xxoc:,. ... {r[3]}
{c[0]} .... ,ONkc;,;cokOdc',. {r[4]}
{c[0]} . OMo ':{c[1]}d{c[0]}o. {r[5]}
{c[0]} dMc :OO; {r[6]}
{c[0]} 0M. .:o. {r[7]}
{c[0]} ;Wd {r[8]}
{c[0]} ;XO, {r[9]}
{c[0]} ,d0Odlc;,.. {r[10]}
{c[0]} ..',;:cdOOd::,. {r[11]}
{c[0]} .:d;.':;. {r[12]}
{c[0]} 'd, .' {r[13]}
{c[0]} ;l .. {r[14]}
{c[0]} .o {r[15]}
{c[0]} c {r[16]}
{c[0]} .' {r[17]}
{c[0]} . \n""",
'ManjaroLinux': """
{c[0]} $$$$$$$$$$$$$$$$ $$$$$$$ {r[0]}
{c[0]} M77777777777777M M77777M {r[1]}
{c[0]} M77777777777777M M77777M {r[2]}
{c[0]} M77777MMMMMMMMMM M77777M {r[3]}
{c[0]} M77777M M77777M {r[4]}
{c[0]} M77777M $$$$$$$ M77777M {r[5]}
{c[0]} MMMMMMM M77777M M77777M {r[6]}
{c[0]} M77777M M77777M {r[7]}
{c[0]} $$$$$$$ M77777M M77777M {r[8]}
{c[0]} M77777M M77777M M77777M {r[9]}
{c[0]} M77777M M77777M M77777M {r[10]}
{c[0]} M77777M M77777M M77777M {r[11]}
{c[0]} M77777M M77777M M77777M {r[12]}
{c[0]} M77777M M77777M M77777M {r[13]}
{c[0]} M77777M M77777M M77777M {r[14]}
{c[0]} M77777M M77777M M77777M {r[15]}
{c[0]} M77777M M77777M M77777M {r[16]}
{c[0]} MMMMMMM MMMMMMM MMMMMMM {r[17]}\n""",
'openSUSE': """
{c[0]} .;ldkO0000Okdl;. {r[0]}
{c[0]} .;d00xl:^''''''^:ok00d;. {r[1]}
{c[0]} .d00l' 'o00d. {r[2]}
{c[0]} .d0Kd' {c[1]}Okxol:;,.{c[0]} :O0d. {r[3]}
{c[0]} .OK{c[1]}KKK0kOKKKKKKKKKKOxo:,{c[0]} lKO. {r[4]}
{c[0]} ,0K{c[1]}KKKKKKKKKKKKKKK0P^{c[0]},,,{c[1]}^dx:{c[0]} ;00, {r[5]}
{c[0]} .OK{c[1]}KKKKKKKKKKKKKKKk'{c[0]}.oOPPb.{c[1]}'0k.{c[0]} cKO. {r[6]}
{c[0]} :KK{c[1]}KKKKKKKKKKKKKKK: {c[0]}kKx..dd{c[1]} lKd{c[0]} 'OK: {r[7]}
{c[0]} dKK{c[1]}KKKKKKKKKOx0KKKd {c[0]}^0KKKO'{c[1]} kKKc{c[0]} dKd {r[8]}
{c[0]} dKK{c[1]}KKKKKKKKKK;.;oOKx,..{c[0]}^{c[1]}..;kKKK0.{c[0]} dKd {r[9]}
{c[0]} :KK{c[1]}KKKKKKKKKK0o;...^cdxxOK0O/^^'{c[0]} .0K: {r[10]}
{c[0]} kKK{c[1]}KKKKKKKKKKKKK0x;,,......,;od{c[0]} lKk {r[11]}
{c[0]} '0K{c[1]}KKKKKKKKKKKKKKKKKKKK00KKOo^{c[0]} c00' {r[12]}
{c[0]} 'kK{c[1]}KKOxddxkOO00000Okxoc;''{c[0]} .dKk' {r[13]}
{c[0]} l0Ko. .c00l' {r[14]}
{c[0]} 'l0Kk:. .;xK0l' {r[15]}
{c[0]} 'lkK0xl:;,,,,;:ldO0kl' {r[16]}
{c[0]} '^:ldxkkkkxdl:^' {r[17]}\n""",
'LinuxMint': """
{c[1]} {r[0]}
{c[1]} MMMMMMMMMMMMMMMMMMMMMMMMMmds+. {r[1]}
{c[1]} MMm----::-://////////////oymNMd+` {r[2]}
{c[1]} MMd {c[0]}/++{c[1]} -sNMd: {r[3]}
{c[1]} MMNso/` {c[0]}dMM{c[1]} {c[0]}`.::-. .-::.`{c[1]} .hMN: {r[4]}
{c[1]} ddddMMh {c[0]}dMM{c[1]} {c[0]}:hNMNMNhNMNMNh:`{c[1]} NMm {r[5]}
{c[1]} NMm {c[0]}dMM{c[1]} {c[0]}.NMN/-+MMM+-/NMN`{c[1]} dMM {r[6]}
{c[1]} NMm {c[0]}dMM{c[1]} {c[0]}-MMm{c[1]} {c[0]}`MMM{c[1]} {c[0]}dMM.{c[1]} dMM {r[7]}
{c[1]} NMm {c[0]}dMM{c[1]} {c[0]}-MMm{c[1]} {c[0]}`MMM{c[1]} {c[0]}dMM.{c[1]} dMM {r[8]}
{c[1]} NMm {c[0]}dMM{c[1]} {c[0]}.mmd{c[1]} {c[0]}`mmm{c[1]} {c[0]}yMM.{c[1]} dMM {r[9]}
{c[1]} NMm {c[0]}dMM`{c[1]} {c[0]}..`{c[1]} {c[0]}`...{c[1]} {c[0]}ydm.{c[1]} dMM {r[10]}
{c[1]} hMM- {c[0]}+MMd/-------...-:sdds{c[1]} MMM {r[11]}
{c[1]} -NMm- {c[0]}:hNMNNNmdddddddddy/`{c[1]} dMM {r[12]}
{c[1]} -dMNs-``{c[0]}-::::-------.``{c[1]} dMM {r[13]}
{c[1]} `/dMNmy+/:-------------:/yMMM {r[14]}
{c[1]} ./ydNMMMMMMMMMMMMMMMMMMMMM {r[15]}
{c[1]} {r[16]}
{c[1]} {r[17]}\n""",
'Red Hat': """
{c[2]} {r[0]}
{c[2]} \`.-..........\` {r[1]}
{c[2]} \`////////::.\`-/. {r[2]}
{c[2]} -: ....-////////. {r[3]}
{c[2]} //:-::///////////\` {r[4]}
{c[2]} \`--::: \`-://////////////: {r[5]}
{c[2]} //////- \`\`.-:///////// .\` {r[6]}
{c[2]} \`://////:-.\` :///////::///:\` {r[7]}
{c[2]} .-/////////:---/////////////: {r[8]}
{c[2]} .-://////////////////////. {r[9]}
{c[0]} yMN+\`.-${c[2]}::///////////////-\` {r[10]}
{c[0]} .-\`:NMMNMs\` \`..-------..\` {r[11]}
{c[0]} MN+/mMMMMMhoooyysshsss {r[12]}
{c[0]} MMM MMMMMMMMMMMMMMyyddMMM+ {r[13]}
{c[0]} MMMM MMMMMMMMMMMMMNdyNMMh\` hyhMMM {r[14]}
{c[0]} MMMMMMMMMMMMMMMMyoNNNMMM+. MMMMMMMM {r[15]}
{c[0]} MMNMMMNNMMMMMNM+ mhsMNyyyyMNMMMMsMM {r[16]}
{c[0]} {r[17]}\n""",
'Linux': """
{c[1]} {r[0]}
{c[1]} a8888b. {r[1]}
{c[1]} d888888b. {r[2]}
{c[1]} 8P"YP"Y88 {r[3]}
{c[1]} 8|o||o|88 {r[4]}
{c[1]} 8{c[0]}\\vvvv/{c[1]}88 {r[5]}
{c[1]} 8{c[0]} \\vv/ {c[1]}Y8. {r[6]}
{c[1]} d/ {c[0]}`'{c[1]} \8b. {r[7]}
{c[1]} .dP . Y8b. {r[8]}
{c[1]} d8:' " `::88b. {r[9]}
{c[1]} d8" `Y88b {r[10]}
{c[1]} :8P ' :888 {r[11]}
{c[1]} 8a. : _a88P {r[12]}
{c[1]} {c[0]}._/"{c[1]}Yaa_ : .{c[0]}| {c[1]}88P{c[0]}|{c[1]} {r[13]}
{c[1]} {c[0]}\++++{c[1]}YP" `{c[0]}| {c[1]}8P{c[0]}++\.{c[1]} {r[14]}
{c[1]} {c[0]}/+++++\.{c[1]}_____.d{c[0]}|+++++/{c[1]} {r[15]}
{c[1]} {c[0]}\++++++){c[1]}888888P{c[0]}\+++/{c[1]} {r[16]}
{c[1]} {r[17]}\n"""
}
processes = Popen(['ps', ('-u' + str(getuid()) if getuid() != 0 else '-ax'), '-o', 'comm', '--no-headers'], stdout=PIPE).communicate()[0].decode().rstrip('\n').split('\n')
# -------------- Classes -------------- #
class Output:
def __init__(self):
self.results = []
self.distribution = Popen(['lsb_release', '-i', '-s'], stdout=PIPE).communicate()[0].decode().rstrip('\n')
if self.distribution not in logosDict.keys():
self.distribution = 'Linux'
def append(self, key, value):
self.results.append('{0}{1}:{2} {3}'.format(colorDict[self.distribution][1], key, colorDict['clear'], value))
def output(self):
results = []
results.extend([''] * floor((18 - len(self.results)) / 2))
results.extend(self.results[:])
if len(results) < 18:
results.extend([''] * (18 - len(results)))
print(logosDict[self.distribution].format(c=colorDict[self.distribution], r=results) + colorDict['clear'])
class User:
def __init__(self):
self.value = getenv('USER')
class Hostname:
def __init__(self):
self.value = Popen(['uname', '-n'], stdout=PIPE).communicate()[0].decode().rstrip('\n')
class Model:
def __init__(self):
with open('/sys/devices/virtual/dmi/id/product_name') as file:
model = file.read().rstrip('\n')
self.value = model
class Distro:
def __init__(self):
self.value = Popen(['lsb_release', '-d', '-s'], stdout=PIPE).communicate()[0].decode().rstrip('\n') + ' ' + Popen(['uname', '-m'], stdout=PIPE).communicate()[0].decode().rstrip('\n')
class Kernel:
def __init__(self):
self.value = Popen(['uname', '-r'], stdout=PIPE).communicate()[0].decode().rstrip('\n')
class Uptime:
def __init__(self):
with open('/proc/uptime') as file:
fuptime = int(file.read().split('.')[0])
day = int(fuptime / 86400)
fuptime = fuptime % 86400
hour = int(fuptime / 3600)
fuptime = fuptime % 3600
minute = int(fuptime / 60)
uptime = ''
uptime += ((str(day) + ' day' + ('s' if day > 1 else '') + ('' if minute == 0 and hour == 0 else (' and ' if (minute != 0 and hour == 0) or (minute == 0 and hour != 0) else ', '))) if day >= 1 else '')
uptime += ((str(hour) + ' hour' + ('s' if hour > 1 else '') + (' and ' if minute != 0 else '')) if hour >= 1 else '')
uptime += ((str(minute) + ' minute' + ('s' if minute > 1 else '')) if minute >= 1 else ('< 1 minute' if day == 0 and hour == 0 else ''))
self.value = uptime
class WindowManager:
def __init__(self):
wm = ''
try:
wm = re.search('(?<=Name: ).*', Popen(['wmctrl', '-m'], stdout=PIPE).communicate()[0].decode()).group(0)
except FileNotFoundError:
for key in wmDict.keys():
if key in processes:
wm = wmDict[key]
break
self.value = wm
class DesktopEnvironment:
def __init__(self):
de = ''
for key in deDict.keys():
if key in processes:
de = deDict[key]
break
self.value = (de if de != '' else getenv('XDG_CURRENT_DESKTOP'))
class Shell:
def __init__(self):
self.value = getenv('SHELL')
class Terminal:
def __init__(self):
self.value = getenv('TERM')
class Packages:
def __init__(self):
for packagesTool in [['pacman', '-Q'], ['dnf', 'list', 'installed'], ['dpkg', '--get-selections'], ['zypper', 'search', '--installed-only'], ['emerge', '-ep', 'world'], ['rpm', '-qa']]:
try:
results = Popen(packagesTool, stdout=PIPE).communicate()[0].decode()
packages = len(results.rstrip('\n').split('\n'))
if 'dpkg' in packagesTool:
packages -= results.count('deinstall')
break
except:
packages = ''
self.value = packages
class CPU:
def __init__(self):
with open('/proc/cpuinfo') as file:
cpuinfo = re.sub(' +', ' ', file.readlines()[4].replace('model name\t: ', '').rstrip('\n'))
self.value = cpuinfo
class GPU:
def __init__(self):
gpuinfo = Popen(['grep', '-E', '3D|VGA|Display'], stdout=PIPE, stdin=Popen(['lspci'], stdout=PIPE).stdout).communicate()[0].decode().split(': ')[1].rstrip('\n')
self.value = (re.findall('.{1,45}(?:\W|$)', gpuinfo)[0] + '[...]' if len(gpuinfo) > 48 else gpuinfo)
class RAM:
def __init__(self):
try:
ram = ''.join(filter(re.compile('M').search, Popen(['free', '-m'], stdout=PIPE, env={'LANG': 'C'}).communicate()[0].decode().split('\n'))).split()
used = ram[2]
total = ram[1]
usedpercent = (float(used) / float(total)) * 100
except IndexError:
with open('/proc/meminfo') as file:
ram = file.read().split('\n')
total = float(ram[0].split(':')[1].strip(' ').rstrip(' kB')) / 1024
used = total - ((float(ram[1].split(':')[1].strip(' ').rstrip(' kB')) + float(ram[3].split(':')[1].strip(' ').rstrip(' kB')) + float(ram[4].split(':')[1].strip(' ').rstrip(' kB')) + float(ram[22].split(':')[1].strip(' ').rstrip(' kB'))) / 1024)
usedpercent = (float(used) / float(total)) * 100
self.value = '{0}{1} MB{2} / {3} MB'.format(colorDict['sensors'][1 if usedpercent <= 33 else (0 if usedpercent >= 67 else 2)], int(used), colorDict['clear'], int(total))
class Disk:
def __init__(self):
total = re.sub(',', '.', Popen(['df', '-Tlh', '-B', 'GB', '--total', '-t', 'ext4', '-t', 'ext3', '-t', 'ext2', '-t', 'reiserfs', '-t', 'jfs', '-t', 'ntfs', '-t', 'fat32', '-t', 'btrfs', '-t', 'fuseblk', '-t', 'xfs', '-t', 'simfs', '-t', 'tmpfs', '-t', 'zfs'], stdout=PIPE).communicate()[0].decode().splitlines()[-1]).split()
usedpercent = float(total[5][:-1])
self.value = '{0}{1}{2} / {3}'.format(colorDict['sensors'][1 if usedpercent <= 33 else (0 if usedpercent >= 67 else 2)], re.sub('GB', ' GB', total[3]), colorDict['clear'], re.sub('GB', ' GB', total[2]))
classes = OrderedDict([
('User', User),
('Hostname', Hostname),
('Model', Model),
('Distro', Distro),
('Kernel', Kernel),
('Uptime', Uptime),
('WindowManager', WindowManager),
('DesktopEnvironment', DesktopEnvironment),
('Shell', Shell),
('Terminal', Terminal),
('Packages', Packages),
('CPU', CPU),
('GPU', GPU),
('RAM', RAM),
('Disk', Disk)
])
# -------------- Main -------------- #
if __name__ == '__main__':
output = Output()
for key in classes.keys():
output.append(key, classes[key]().value)
output.output()