1 #include <avahi-client/publish.h>
2 #include <avahi-client/lookup.h>
4 #include <avahi-common/alternative.h>
5 #include <avahi-common/simple-watch.h>
6 #include <avahi-common/malloc.h>
7 #include <avahi-common/error.h>
8 #include <avahi-common/timeval.h>
9 #include <avahi-common/strlst.h>
11 #include <libvirt/libvirt.h>
15 static AvahiStringList
* domainProperties(virDomainPtr thisDomain
) {
16 AvahiStringList
*new = avahi_string_list_new_from_array (NULL
, 0);
18 virDomainInterfaceStatsStruct stats
;
19 virDomainGetInfo(thisDomain
, &info
);
20 new = avahi_string_list_add_printf(new, "maxMem=%lu", info
.maxMem
);
21 new = avahi_string_list_add_printf(new, "memory=%lu", info
.memory
);
22 new = avahi_string_list_add_printf(new, "cpuTime=%llu", info
.cpuTime
);
24 /* TODO: multiple network interfaces :( */
26 snprintf(vifname
, 14, "vif%d.0", virDomainGetID(thisDomain
));
30 virDomainInterfaceStats(thisDomain
, vifname
, &stats
, sizeof(stats
));
32 new = avahi_string_list_add_printf(new, "interfaces=eth%d", no
);
33 new = avahi_string_list_add_printf(new, "interface_eth%d_rxbytes=%lld", no
, stats
.rx_bytes
);
34 new = avahi_string_list_add_printf(new, "interface_eth%d_rxpackets=%lld", no
, stats
.rx_packets
);
35 // new = avahi_string_list_add_printf(new, "interface_eth%d_rxerrs=%lld", no, stats.rx_errs);
36 // new = avahi_string_list_add_printf(new, "interface_eth%d_rxdrop=%lld", no, stats.rx_drop);
37 new = avahi_string_list_add_printf(new, "interface_eth%d_txbytes=%lld", no
, stats
.tx_bytes
);
38 new = avahi_string_list_add_printf(new, "interface_eth%d_txpackets=%lld", no
, stats
.tx_packets
);
39 // new = avahi_string_list_add_printf(new, "interface_eth%d_txerrs=%lld", no, stats.tx_errs);
40 // new = avahi_string_list_add_printf(new, "interface_eth%d_txdrop=%lld", no, stats.tx_drop);
46 void create_services(AvahiClient
*c
) {
47 virConnectPtr conn
= virConnectOpenReadOnly(NULL
);
50 int maxid
= virConnectNumOfDomains(conn
);
51 if (maxid
> 1) { /* ignore dom0 */
52 int *ids
= (int *) malloc(sizeof(int) * maxid
);
53 if ((maxid
= virConnectListDomains(conn
, &ids
[0], maxid
)) < 0) {
57 unsigned int domu_count_new
= (maxid
- 1);
58 domu
* domus_old
= domus
;
59 domus
= (domu
*) malloc(sizeof(domu
) * domu_count_new
);
60 const char *type
= "_domu._tcp";
61 for (i
= 0; i
< domu_count_new
; i
++) {
63 domus
[i
].group
= NULL
;
64 domus
[i
].domainid
= ids
[i
+1];
67 //fprintf(stderr, "Looking for %d\n", domus[i].domainid);
69 for (j
= 0; j
< domu_count
; j
++) {
70 //fprintf(stderr, "--> %d\n", domus_old[j].domainid);
71 if (ids
[i
+1] == domus_old
[j
].domainid
) {
72 //fprintf(stderr, "got it\n");
73 virDomainPtr thisDomain
= virDomainLookupByID(conn
, domus
[i
].domainid
);
74 domus
[i
].group
= domus_old
[j
].group
;
76 const char *name
= virDomainGetName(thisDomain
);
78 AvahiStringList
*domainProps
;
79 domainProps
= domainProperties(thisDomain
);
80 domus_old
[j
].keep
= 1;
81 avahi_entry_group_update_service_txt_strlst(domus
[i
].group
, AVAHI_IF_UNSPEC
, AVAHI_PROTO_UNSPEC
, 0, name
, type
, NULL
, domainProps
);
82 avahi_string_list_free(domainProps
);
84 // domus_old[j].keep = 0;
87 // domus_old[j].keep = 0;
89 virDomainFree(thisDomain
);
92 if (i
> domu_count
|| domus
[i
].group
== NULL
) {
94 AvahiStringList
*domainProps
;
95 virDomainPtr thisDomain
= virDomainLookupByID(conn
, ids
[i
+1]);
96 domus
[i
].group
= avahi_entry_group_new(c
, entry_group_callback
, NULL
);
97 domainProps
= domainProperties(thisDomain
);
98 name
= virDomainGetName(thisDomain
);
101 avahi_entry_group_add_service_strlst(domus
[i
].group
, AVAHI_IF_UNSPEC
, AVAHI_PROTO_UNSPEC
, 0, name
, type
, NULL
, NULL
, 651, domainProps
);
102 avahi_entry_group_commit(domus
[i
].group
);
107 avahi_string_list_free(domainProps
);
108 virDomainFree(thisDomain
);
113 for (i
= 0; i
< domu_count
; i
++) {
114 // fprintf(stderr, "id: %d, keep: %d\n", domus_old[i].domainid, domus_old[i].keep);
115 if (domus_old
[i
].keep
== 0 && domus_old
[i
].group
!= NULL
) {
116 avahi_entry_group_free(domus_old
[i
].group
);
121 domu_count
= domu_count_new
;
125 virConnectClose(conn
);
126 //fprintf(stderr, "exit: %s\n", __func__);