diff --git a/Makefile b/Makefile index b3abc24..553c552 100644 --- a/Makefile +++ b/Makefile @@ -144,7 +144,6 @@ install-vm: install -D misc/nautilus-actions.conf $(DESTDIR)/etc/xdg/nautilus-actions/nautilus-actions.conf - install misc/meminfo-writer $(DESTDIR)/usr/lib/qubes install -d $(DESTDIR)/mnt/removable install -d $(DESTDIR)/var/lib/qubes/dom0-updates diff --git a/misc/Makefile b/misc/Makefile index e6f653a..8b6ad61 100644 --- a/misc/Makefile +++ b/misc/Makefile @@ -1,12 +1,10 @@ CC=gcc CFLAGS=-Wall -g -O3 -all: meminfo-writer xenstore-watch python -meminfo-writer: meminfo-writer.o - $(CC) -g -o meminfo-writer meminfo-writer.o -lxenstore +all: xenstore-watch python xenstore-watch: xenstore-watch.o $(CC) -o xenstore-watch xenstore-watch.o -lxenstore python: python -m compileall . python -O -m compileall . clean: - rm -f meminfo-writer xenstore-watch *.o *~ *.pyc *.pyo + rm -f xenstore-watch *.o *~ *.pyc *.pyo diff --git a/misc/meminfo-writer.c b/misc/meminfo-writer.c deleted file mode 100644 index f3563b1..0000000 --- a/misc/meminfo-writer.c +++ /dev/null @@ -1,176 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include - -unsigned long prev_used_mem; -int used_mem_change_threshold; -int delay; -int usr1_received; - -char *parse(char *buf) -{ - char *ptr = buf; - char name[256]; - static char outbuf[4096]; - int val; - int len; - int MemTotal = 0, MemFree = 0, Buffers = 0, Cached = 0, SwapTotal = - 0, SwapFree = 0; - unsigned long long key; - long used_mem, used_mem_diff; - int nitems = 0; - - while (nitems != 6) { - sscanf(ptr, "%s %d kB\n%n", name, &val, &len); - key = *(unsigned long long *) ptr; - if (key == *(unsigned long long *) "MemTotal:") { - MemTotal = val; - nitems++; - } else if (key == *(unsigned long long *) "MemFree:") { - MemFree = val; - nitems++; - } else if (key == *(unsigned long long *) "Buffers:") { - Buffers = val; - nitems++; - } else if (key == *(unsigned long long *) "Cached: ") { - Cached = val; - nitems++; - } else if (key == *(unsigned long long *) "SwapTotal:") { - SwapTotal = val; - nitems++; - } else if (key == *(unsigned long long *) "SwapFree:") { - SwapFree = val; - nitems++; - } - - ptr += len; - } - - used_mem = - MemTotal - Buffers - Cached - MemFree + SwapTotal - SwapFree; - if (used_mem < 0) - return NULL; - - used_mem_diff = used_mem - prev_used_mem; - if (used_mem_diff < 0) - used_mem_diff = -used_mem_diff; - if (used_mem_diff > used_mem_change_threshold - || (used_mem > prev_used_mem && used_mem * 13 / 10 > MemTotal - && used_mem_diff > used_mem_change_threshold/2)) { - prev_used_mem = used_mem; - sprintf(outbuf, - "MemTotal: %d kB\nMemFree: %d kB\nBuffers: %d kB\nCached: %d kB\n" - "SwapTotal: %d kB\nSwapFree: %d kB\n", MemTotal, - MemFree, Buffers, Cached, SwapTotal, SwapFree); - return outbuf; - } - return NULL; -} - -void usage() -{ - fprintf(stderr, - "usage: meminfo_writer threshold_in_kb delay_in_us [pidfile]\n"); - fprintf(stderr, " When pidfile set, meminfo-writer will:\n"); - fprintf(stderr, " - fork into background\n"); - fprintf(stderr, " - wait for SIGURS1 (in background) before starting main work\n"); - exit(1); -} - -void send_to_qmemman(struct xs_handle *xs, char *data) -{ - if (!xs_write(xs, XBT_NULL, "memory/meminfo", data, strlen(data))) { - syslog(LOG_DAEMON | LOG_ERR, "error writing xenstore ?"); - exit(1); - } -} - -void usr1_handler(int sig) { - usr1_received = 1; -} - -int main(int argc, char **argv) -{ - char buf[4096]; - int n; - char *meminfo_data; - int fd; - struct xs_handle *xs; - - if (argc != 3 && argc != 4) - usage(); - used_mem_change_threshold = atoi(argv[1]); - delay = atoi(argv[2]); - if (!used_mem_change_threshold || !delay) - usage(); - - if (argc == 4) { - pid_t pid; - sigset_t mask, oldmask; - - switch (pid = fork()) { - case -1: - perror("fork"); - exit(1); - case 0: - sigemptyset (&mask); - sigaddset (&mask, SIGUSR1); - /* Wait for a signal to arrive. */ - sigprocmask (SIG_BLOCK, &mask, &oldmask); - usr1_received = 0; - signal(SIGUSR1, usr1_handler); - while (!usr1_received) - sigsuspend (&oldmask); - sigprocmask (SIG_UNBLOCK, &mask, NULL); - break; - default: - fd = open(argv[3], O_CREAT | O_TRUNC | O_WRONLY, 0666); - if (fd < 0) { - perror("open pidfile"); - exit(1); - } - n = sprintf(buf, "%d\n", pid); - if (write(fd, buf, n) != n) { - perror("write pid"); - exit(1); - } - close(fd); - exit(0); - } - } - - fd = open("/proc/meminfo", O_RDONLY); - if (fd < 0) { - perror("open meminfo"); - exit(1); - } - xs = xs_domain_open(); - if (!xs) { - perror("xs_domain_open"); - exit(1); - } - if (argc == 3) { - /* if not waiting for signal, fork after first info written to xenstore */ - n = pread(fd, buf, sizeof(buf), 0); - buf[n] = 0; - meminfo_data = parse(buf); - if (meminfo_data) - send_to_qmemman(xs, meminfo_data); - if (fork() > 0) - exit(0); - } - - for (;;) { - n = pread(fd, buf, sizeof(buf), 0); - buf[n] = 0; - meminfo_data = parse(buf); - if (meminfo_data) - send_to_qmemman(xs, meminfo_data); - usleep(delay); - } -} diff --git a/rpm_spec/core-vm.spec b/rpm_spec/core-vm.spec index a2e4aa3..b68071a 100644 --- a/rpm_spec/core-vm.spec +++ b/rpm_spec/core-vm.spec @@ -307,7 +307,6 @@ rm -f %{name}-%{version} /usr/lib/qubes/dispvm-prerun.sh /usr/lib/qubes/sync-ntp-clock /usr/lib/qubes/prepare-suspend -/usr/lib/qubes/meminfo-writer /usr/lib/qubes/network-manager-prepare-conf-dir /usr/lib/qubes/qrexec-agent /usr/lib/qubes/qrexec-client-vm @@ -432,7 +431,6 @@ The Qubes core startup configuration for SystemD init. %files systemd %defattr(-,root,root,-) /lib/systemd/system/qubes-dvm.service -/lib/systemd/system/qubes-meminfo-writer.service /lib/systemd/system/qubes-misc-post.service /lib/systemd/system/qubes-firewall.service /lib/systemd/system/qubes-netwatcher.service @@ -463,7 +461,7 @@ The Qubes core startup configuration for SystemD init. %post systemd -for srv in qubes-dvm qubes-meminfo-writer qubes-sysinit qubes-misc-post qubes-netwatcher qubes-network qubes-firewall qubes-yum-proxy qubes-qrexec-agent; do +for srv in qubes-dvm qubes-sysinit qubes-misc-post qubes-netwatcher qubes-network qubes-firewall qubes-yum-proxy qubes-qrexec-agent; do /bin/systemctl enable $srv.service 2> /dev/null done @@ -533,6 +531,6 @@ if [ "$1" != 0 ] ; then exit 0 fi -for srv in qubes-dvm qubes-meminfo-writer qubes-sysinit qubes-misc-post qubes-netwatcher qubes-network qubes-qrexec-agenT; do +for srv in qubes-dvm qubes-sysinit qubes-misc-post qubes-netwatcher qubes-network qubes-qrexec-agent; do /bin/systemctl disable $srv.service do diff --git a/vm-systemd/qubes-meminfo-writer.service b/vm-systemd/qubes-meminfo-writer.service deleted file mode 100644 index fdb504d..0000000 --- a/vm-systemd/qubes-meminfo-writer.service +++ /dev/null @@ -1,12 +0,0 @@ -[Unit] -Description=Qubes memory information reporter -ConditionPathExists=/var/run/qubes-service/meminfo-writer - -[Service] -Type=forking -ExecStart=/usr/lib/qubes/meminfo-writer 30000 100000 /var/run/meminfo-writer.pid -PIDFile=/var/run/meminfo-writer.pid -StandardOutput=syslog - -[Install] -WantedBy=multi-user.target