annotate main.cpp @ 2:4034cee64a58

add stuff
author Yasuri <yasuri@charliesmp.net>
date Sun, 04 Oct 2026 14:33:37 -0500
parents 841975e638f2
children f7c837561bfa
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
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
192 const Distro distro = readDistro();
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
193 const Logo logo = pickLogo(distro, override);
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
194 const std::string hostname = readHostname();
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
195 const std::string kernver = readVersion();
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
196
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
197 size_t logoWidth = 0;
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
198 for (const auto& line : logo.lines) logoWidth = std::max(logoWidth, line.size());
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
199
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
200 CpuTimes prev = readCpuTimes();
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
201 const double kbToGb = 1024.0 * 1024.0;
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
202
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
203 while (true) {
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
204 std::this_thread::sleep_for(std::chrono::seconds(1));
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
205
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
206 Mem m = readMeminfo();
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
207 long up = readUptime();
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
208 CpuTimes now = readCpuTimes();
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
209
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
210 long totalChange = now.total - prev.total;
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
211 double cpuPercent = 0.0;
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
212 if (totalChange > 0) cpuPercent = 100.0 * (now.busy - prev.busy) / totalChange;
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
213 prev = now;
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
214
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
215 std::ostringstream uptimeLine, memLine, cpuLine;
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
216 uptimeLine << "Uptime: ";
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
217 if (up < 0) {
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
218 uptimeLine << "Unknown";
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
219 } else {
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
220 uptimeLine << up / 86400 << "d " << (up % 86400) / 3600 << "h "
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
221 << (up % 3600) / 60 << "m";
0
bb144f2c5a3b initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
222 }
1
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
223
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
224 memLine << std::fixed << std::setprecision(2) << "Memory: ";
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
225 if (m.total == 0) {
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
226 memLine << "Unknown";
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
227 } else {
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
228 memLine << (m.total - m.available) / kbToGb << " GB / "
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
229 << m.total / kbToGb << " GB";
0
bb144f2c5a3b initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
230 }
1
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
231
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
232 cpuLine << std::fixed << std::setprecision(1)
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
233 << "CPU: " << cpuPercent << " %";
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
234
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
235 std::vector<std::string> info = {
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
236 "OS: " + distro.pretty,
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
237 "Hostname: " + hostname,
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
238 "Kernel: " + kernver,
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
239 uptimeLine.str(),
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
240 memLine.str(),
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
241 cpuLine.str(),
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
242 };
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
243
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
244 size_t rows = std::max(logo.lines.size(), info.size());
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
245
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
246 std::cout << "\033[H\033[2J";
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
247 for (size_t i = 0; i < rows; i++) {
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
248 std::string art = i < logo.lines.size() ? logo.lines[i] : "";
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
249 std::string text = i < info.size() ? info[i] : "";
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
250 std::cout << logo.color << std::left << std::setw(logoWidth) << art
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
251 << "\033[0m" << " " << text << '\n';
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
252 }
841975e638f2 add stuff
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
253 std::cout << std::flush;
0
bb144f2c5a3b initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
254 }
bb144f2c5a3b initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
255 }