Move meminfo-writer to linux-utils repo
It is common for both dom0 and VM. So move to linux-specific repo (not VM-specific).
This commit is contained in:
parent
0daaefb47f
commit
fd55d48126
1
Makefile
1
Makefile
@ -144,7 +144,6 @@ install-vm:
|
|||||||
|
|
||||||
install -D misc/nautilus-actions.conf $(DESTDIR)/etc/xdg/nautilus-actions/nautilus-actions.conf
|
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)/mnt/removable
|
||||||
install -d $(DESTDIR)/var/lib/qubes/dom0-updates
|
install -d $(DESTDIR)/var/lib/qubes/dom0-updates
|
||||||
|
|
||||||
|
@ -1,12 +1,10 @@
|
|||||||
CC=gcc
|
CC=gcc
|
||||||
CFLAGS=-Wall -g -O3
|
CFLAGS=-Wall -g -O3
|
||||||
all: meminfo-writer xenstore-watch python
|
all: xenstore-watch python
|
||||||
meminfo-writer: meminfo-writer.o
|
|
||||||
$(CC) -g -o meminfo-writer meminfo-writer.o -lxenstore
|
|
||||||
xenstore-watch: xenstore-watch.o
|
xenstore-watch: xenstore-watch.o
|
||||||
$(CC) -o xenstore-watch xenstore-watch.o -lxenstore
|
$(CC) -o xenstore-watch xenstore-watch.o -lxenstore
|
||||||
python:
|
python:
|
||||||
python -m compileall .
|
python -m compileall .
|
||||||
python -O -m compileall .
|
python -O -m compileall .
|
||||||
clean:
|
clean:
|
||||||
rm -f meminfo-writer xenstore-watch *.o *~ *.pyc *.pyo
|
rm -f xenstore-watch *.o *~ *.pyc *.pyo
|
||||||
|
@ -1,176 +0,0 @@
|
|||||||
#include <fcntl.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <xs.h>
|
|
||||||
#include <syslog.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <signal.h>
|
|
||||||
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
|
@ -307,7 +307,6 @@ rm -f %{name}-%{version}
|
|||||||
/usr/lib/qubes/dispvm-prerun.sh
|
/usr/lib/qubes/dispvm-prerun.sh
|
||||||
/usr/lib/qubes/sync-ntp-clock
|
/usr/lib/qubes/sync-ntp-clock
|
||||||
/usr/lib/qubes/prepare-suspend
|
/usr/lib/qubes/prepare-suspend
|
||||||
/usr/lib/qubes/meminfo-writer
|
|
||||||
/usr/lib/qubes/network-manager-prepare-conf-dir
|
/usr/lib/qubes/network-manager-prepare-conf-dir
|
||||||
/usr/lib/qubes/qrexec-agent
|
/usr/lib/qubes/qrexec-agent
|
||||||
/usr/lib/qubes/qrexec-client-vm
|
/usr/lib/qubes/qrexec-client-vm
|
||||||
@ -432,7 +431,6 @@ The Qubes core startup configuration for SystemD init.
|
|||||||
%files systemd
|
%files systemd
|
||||||
%defattr(-,root,root,-)
|
%defattr(-,root,root,-)
|
||||||
/lib/systemd/system/qubes-dvm.service
|
/lib/systemd/system/qubes-dvm.service
|
||||||
/lib/systemd/system/qubes-meminfo-writer.service
|
|
||||||
/lib/systemd/system/qubes-misc-post.service
|
/lib/systemd/system/qubes-misc-post.service
|
||||||
/lib/systemd/system/qubes-firewall.service
|
/lib/systemd/system/qubes-firewall.service
|
||||||
/lib/systemd/system/qubes-netwatcher.service
|
/lib/systemd/system/qubes-netwatcher.service
|
||||||
@ -463,7 +461,7 @@ The Qubes core startup configuration for SystemD init.
|
|||||||
|
|
||||||
%post systemd
|
%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
|
/bin/systemctl enable $srv.service 2> /dev/null
|
||||||
done
|
done
|
||||||
|
|
||||||
@ -533,6 +531,6 @@ if [ "$1" != 0 ] ; then
|
|||||||
exit 0
|
exit 0
|
||||||
fi
|
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
|
/bin/systemctl disable $srv.service
|
||||||
do
|
do
|
||||||
|
@ -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
|
|
Loading…
Reference in New Issue
Block a user