annotate main.cpp @ 3:f7c837561bfa default tip

color CPU by load
author Yasuri <yasuri@charliesmp.net>
date Sun, 04 Oct 2026 14:59:57 -0500
parents 841975e638f2
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
1 // topfetch++ - live system monitor + fetch tool
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
2 // ISC licensed, see LICENSE.
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
3 // Logos adapted from pfetch (MIT), see THIRD-PARTY-NOTICES._
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
4 #include <algorithm>
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
5 #include <chrono>
0
bb144f2c5a3b initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
6 #include <fstream>
bb144f2c5a3b initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
7 #include <iomanip>
1
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
8 #include <iostream>
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
9 #include <map>
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
10 #include <sstream>
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
11 #include <string>
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
12 #include <thread>
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
13 #include <vector>
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
14
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
15 // ---------- simple readers ----------
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
16
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
17 std::string readHostname() {
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
18 std::ifstream f("/proc/sys/kernel/hostname");
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
19 if (!f.is_open()) return "(none)";
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
20 std::string s;
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
21 std::getline(f, s);
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
22 return s.empty() ? "(none)" : s;
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
23 }
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
24
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
25 std::string readVersion() {
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
26 std::ifstream f("/proc/version");
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
27 if (!f.is_open()) return "unknown";
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
28 std::string w1, w2, version;
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
29 f >> w1 >> w2 >> version; // "Linux version 6.x.y ..."
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
30 return version.empty() ? "unknown" : version;
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
31 }
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
32
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
33 long readUptime() {
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
34 std::ifstream f("/proc/uptime");
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
35 if (!f.is_open()) return -1;
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
36 double seconds = 0;
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
37 f >> seconds;
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
38 return static_cast<long>(seconds);
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
39 }
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
40
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
41 struct Mem {
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
42 long total = 0; // kB
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
43 long available = 0; // kB
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
44 };
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
45
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
46 Mem readMeminfo() {
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
47 Mem m;
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
48 std::ifstream f("/proc/meminfo");
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
49 if (!f.is_open()) return m;
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
50 std::string line;
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
51 while (std::getline(f, line)) {
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
52 std::istringstream ss(line);
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
53 std::string name;
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
54 long value = 0;
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
55 ss >> name >> value;
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
56 if (name == "MemTotal:") m.total = value;
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
57 else if (name == "MemAvailable:") m.available = value;
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
58 }
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
59 return m;
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
60 }
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
61
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
62 struct CpuTimes {
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
63 long busy = 0;
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
64 long total = 0;
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
65 };
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
66
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
67 CpuTimes readCpuTimes() {
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
68 CpuTimes t;
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
69 std::ifstream f("/proc/stat");
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
70 if (!f.is_open()) return t;
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
71
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
72 std::string label;
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
73 f >> label; // "cpu"
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
74
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
75 long values[8] = {0}; // user nice system idle iowait irq softirq steal
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
76 for (int i = 0; i < 8; i++) f >> values[i];
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
77
0
bb144f2c5a3b initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
78 long total = 0;
1
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
79 for (int i = 0; i < 8; i++) total += values[i];
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
80
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
81 long idle = values[3] + values[4];
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
82 t.total = total;
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
83 t.busy = total - idle;
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
84 return t;
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
85 }
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
86
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
87 // ---------- distro ----------
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
88
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
89 struct Distro {
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
90 std::string pretty = "Linux";
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
91 std::string id;
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
92 std::string idLike;
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
93 };
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
94
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
95 std::string unquote(const std::string& v) {
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
96 if (v.size() >= 2 && (v.front() == '"' || v.front() == '\'') &&
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
97 v.back() == v.front()) {
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
98 return v.substr(1, v.size() - 2);
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
99 }
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
100 return v;
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
101 }
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
102
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
103 Distro readDistro() {
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
104 Distro d;
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
105 std::ifstream f("/etc/os-release");
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
106 if (!f.is_open()) return d;
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
107
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
108 std::string line;
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
109 while (std::getline(f, line)) {
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
110 size_t pos = line.find('=');
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
111 if (pos == std::string::npos) continue;
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
112 std::string key = line.substr(0, pos);
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
113 std::string val = unquote(line.substr(pos + 1));
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
114 if (key == "PRETTY_NAME" && !val.empty()) d.pretty = val;
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
115 else if (key == "ID") d.id = val;
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
116 else if (key == "ID_LIKE") d.idLike = val;
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
117 }
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
118 return d;
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
119 }
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
120
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
121 // ---------- logos ----------
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
122
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
123 struct Logo {
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
124 std::vector<std::string> lines;
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
125 std::string color; // ANSI escape
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
126 };
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
127
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
128 // Logos adapted from pfetch (MIT)
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
129 // Copyright (c) 2016-2021 Dylan Araps
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
130 // Copyright (c) 2024-2025 Joey Reinhart
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
131 Logo pickLogo(const Distro& d, const std::string& override = "") {
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
132 static const std::map<std::string, Logo> logos = {
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
133 {"nixos", {{
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
134 R"art( \\ \\ //)art",
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
135 R"art( ==\\__\\/ //)art",
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
136 R"art( // \\//)art",
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
137 R"art(==// //==)art",
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
138 R"art( //\\___//)art",
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
139 R"art(// /\\ \\==)art",
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
140 R"art( // \\ \\)art",
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
141 }, "\033[34m"}},
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
142 {"arch", {{
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
143 R"art( /\)art",
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
144 R"art( / \)art",
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
145 R"art( /\ \)art",
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
146 R"art( / \)art",
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
147 R"art( / ,, \)art",
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
148 R"art( / | | -\)art",
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
149 R"art(/_-'' ''-_\)art",
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
150 }, "\033[36m"}},
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
151 {"gentoo", {{
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
152 R"art( _-----_)art",
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
153 R"art(( \)art",
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
154 R"art(\ 0 \)art",
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
155 R"art( \ ))art",
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
156 R"art( / _/)art",
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
157 R"art(( _-)art",
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
158 R"art(\____-)art",
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
159 }, "\033[35m"}},
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
160 };
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
161
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
162 static const Logo fallback = {{
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
163 R"art( .--.)art",
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
164 R"art( |o_o |)art",
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
165 R"art( |:_/ |)art",
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
166 R"art( // \ \)art",
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
167 R"art( (| | ))art",
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
168 R"art(/'\_ _/`\)art",
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
169 R"art(\___)=(___/)art",
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
170 }, "\033[33m"};
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
171
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
172 std::string id = override.empty() ? d.id : override;
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
173 auto it = logos.find(id);
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
174 if (it != logos.end()) return it->second;
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
175
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
176 // ID_LIKE fallback (Manjaro -> arch, etc.)
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
177 std::istringstream ss(d.idLike);
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
178 std::string word;
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
179 while (ss >> word) {
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
180 it = logos.find(word);
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
181 if (it != logos.end()) return it->second;
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
182 }
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
183 return fallback;
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
184 }
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
185
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
186 // ---------- main ----------
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
187
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
188 int main(int argc, char** argv) {
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
189 std::string override;
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
190 if (argc >= 3 && std::string(argv[1]) == "--logo") override = argv[2];
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
191
3
f7c837561bfa color CPU by load
Yasuri <yasuri@charliesmp.net>
parents: 1
diff changeset
192
1
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
193 const Distro distro = readDistro();
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
194 const Logo logo = pickLogo(distro, override);
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
195 const std::string hostname = readHostname();
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
196 const std::string kernver = readVersion();
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
197
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
198 size_t logoWidth = 0;
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
199 for (const auto& line : logo.lines) logoWidth = std::max(logoWidth, line.size());
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
200
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
201 CpuTimes prev = readCpuTimes();
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
202 const double kbToGb = 1024.0 * 1024.0;
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
203
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
204 while (true) {
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
205 std::this_thread::sleep_for(std::chrono::seconds(1));
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
206
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
207 Mem m = readMeminfo();
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
208 long up = readUptime();
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
209 CpuTimes now = readCpuTimes();
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
210
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
211 long totalChange = now.total - prev.total;
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
212 double cpuPercent = 0.0;
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
213 if (totalChange > 0) cpuPercent = 100.0 * (now.busy - prev.busy) / totalChange;
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
214 prev = now;
3
f7c837561bfa color CPU by load
Yasuri <yasuri@charliesmp.net>
parents: 1
diff changeset
215 std::string cpuColor;
f7c837561bfa color CPU by load
Yasuri <yasuri@charliesmp.net>
parents: 1
diff changeset
216 if (cpuPercent >= 80) {
f7c837561bfa color CPU by load
Yasuri <yasuri@charliesmp.net>
parents: 1
diff changeset
217 cpuColor = "\033[31m";
f7c837561bfa color CPU by load
Yasuri <yasuri@charliesmp.net>
parents: 1
diff changeset
218 }
f7c837561bfa color CPU by load
Yasuri <yasuri@charliesmp.net>
parents: 1
diff changeset
219 else if (cpuPercent >= 50) {
f7c837561bfa color CPU by load
Yasuri <yasuri@charliesmp.net>
parents: 1
diff changeset
220 cpuColor = "\033[33m";
f7c837561bfa color CPU by load
Yasuri <yasuri@charliesmp.net>
parents: 1
diff changeset
221 }
f7c837561bfa color CPU by load
Yasuri <yasuri@charliesmp.net>
parents: 1
diff changeset
222 else {
f7c837561bfa color CPU by load
Yasuri <yasuri@charliesmp.net>
parents: 1
diff changeset
223 cpuColor = "\033[32m";
f7c837561bfa color CPU by load
Yasuri <yasuri@charliesmp.net>
parents: 1
diff changeset
224 }
f7c837561bfa color CPU by load
Yasuri <yasuri@charliesmp.net>
parents: 1
diff changeset
225
f7c837561bfa color CPU by load
Yasuri <yasuri@charliesmp.net>
parents: 1
diff changeset
226
1
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
227
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
228 std::ostringstream uptimeLine, memLine, cpuLine;
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
229 uptimeLine << "Uptime: ";
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
230 if (up < 0) {
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
231 uptimeLine << "Unknown";
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
232 } else {
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
233 uptimeLine << up / 86400 << "d " << (up % 86400) / 3600 << "h "
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
234 << (up % 3600) / 60 << "m";
0
bb144f2c5a3b initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
235 }
1
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
236
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
237 memLine << std::fixed << std::setprecision(2) << "Memory: ";
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
238 if (m.total == 0) {
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
239 memLine << "Unknown";
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
240 } else {
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
241 memLine << (m.total - m.available) / kbToGb << " GB / "
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
242 << m.total / kbToGb << " GB";
0
bb144f2c5a3b initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
243 }
1
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
244
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
245 cpuLine << std::fixed << std::setprecision(1)
3
f7c837561bfa color CPU by load
Yasuri <yasuri@charliesmp.net>
parents: 1
diff changeset
246 << "CPU: " << cpuColor << cpuPercent << " %";
1
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
247
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
248 std::vector<std::string> info = {
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
249 "OS: " + distro.pretty,
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
250 "Hostname: " + hostname,
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
251 "Kernel: " + kernver,
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
252 uptimeLine.str(),
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
253 memLine.str(),
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
254 cpuLine.str(),
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
255 };
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
256
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
257 size_t rows = std::max(logo.lines.size(), info.size());
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
258
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
259 std::cout << "\033[H\033[2J";
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
260 for (size_t i = 0; i < rows; i++) {
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
261 std::string art = i < logo.lines.size() ? logo.lines[i] : "";
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
262 std::string text = i < info.size() ? info[i] : "";
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
263 std::cout << logo.color << std::left << std::setw(logoWidth) << art
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
264 << "\033[0m" << " " << text << '\n';
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
265 }
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
266 std::cout << std::flush;
0
bb144f2c5a3b initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
267 }
bb144f2c5a3b initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
268 }