Florian Forster [Sat, 13 Jul 2013 09:41:35 +0000 (11:41 +0200)]
Bump version to 5.3.1; Update ChangeLog.
Florian Forster [Sat, 13 Jul 2013 09:23:32 +0000 (11:23 +0200)]
Merge branch 'collectd-5.2' into collectd-5.3
Florian Forster [Sat, 13 Jul 2013 06:20:28 +0000 (08:20 +0200)]
src/plugin.c: Free the "data_sets" AVL tree.
This pops up every time I investigate memory leaks and it's annoying me.
Florian Forster [Sat, 13 Jul 2013 05:46:20 +0000 (07:46 +0200)]
write_graphite plugin: Don't call close() on invalid file descriptors.
Florian Forster [Sat, 13 Jul 2013 05:42:18 +0000 (07:42 +0200)]
write_graphite plugin: Don't call close() on invalid file descriptors.
Florian Forster [Sat, 13 Jul 2013 05:38:05 +0000 (07:38 +0200)]
write_graphite plugin: Actually check the return value of wg_send_message().
Assignment to "status" was missing.
Florian Forster [Fri, 12 Jul 2013 16:21:31 +0000 (18:21 +0200)]
Merge branch 'collectd-5.2' into collectd-5.3
Florian Forster [Fri, 12 Jul 2013 16:19:29 +0000 (18:19 +0200)]
rrdtool, rrdcached plugins: Re-implement value_list_to_filename().
Faster version without snprintf().
Florian Forster [Fri, 12 Jul 2013 16:17:19 +0000 (18:17 +0200)]
csv plugin: Re-implement value_list_to_filename().
The new implementation is faster, because it doesn't use snprintf().
Florian Forster [Thu, 11 Jul 2013 15:58:37 +0000 (17:58 +0200)]
src/common.c: Reimplement format_name for performance.
This is used from uc_update(), i.e. for every value list dispatched, and was
one of the most expensive functions thanks to snprintf().
This reduces total time spent in the format_name() function from 7.78% to 1.89%
during a network stress test.
Pierre-Yves Ritschard [Mon, 8 Jul 2013 07:06:35 +0000 (09:06 +0200)]
Test for end of oid tree without breaking collection loop.
Florian Forster [Tue, 18 Jun 2013 15:25:46 +0000 (17:25 +0200)]
collectd-threshold(5): Correct the description of the "Interesting" config option.
Björn [Tue, 18 Jun 2013 14:43:46 +0000 (16:43 +0200)]
threshold plugin: Fix the "Interesting" configuration option.
Signed-off-by: Florian Forster <octo@collectd.org>
Bernd Ahlers [Mon, 10 Jun 2013 13:48:14 +0000 (15:48 +0200)]
Unbreak type_inst value in collectd psql view.
Signed-off-by: Florian Forster <octo@collectd.org>
Florian Forster [Thu, 30 May 2013 07:00:09 +0000 (09:00 +0200)]
Merge branch 'collectd-5.2' into collectd-5.3
Florian Forster [Thu, 30 May 2013 06:58:06 +0000 (08:58 +0200)]
src/configfile.c: Let errors in included files propagate up to cf_read().
cf_read_generic() returned NULL in two cases: Unable to read file and
file was empty. Since we wanted to allow empty includes, the "include
file with errors" case was not handled properly.
Github: #323
Florian Forster [Thu, 30 May 2013 06:10:42 +0000 (08:10 +0200)]
Merge branch 'collectd-4.10' into collectd-5.2
Joaquín Cuenca Abela [Wed, 29 May 2013 14:22:09 +0000 (16:22 +0200)]
Don't notify continuously when MySQL slave SQL thread is running
Signed-off-by: Florian Forster <octo@collectd.org>
Florian Forster [Wed, 29 May 2013 07:26:28 +0000 (09:26 +0200)]
Add "=encoding" header to all manual pages.
http://bugs.debian.org/708718
Dan Fandrich [Tue, 14 May 2013 21:58:40 +0000 (23:58 +0200)]
exec plugin: Document that defaulting to PUTVAL is no longer done
Signed-off-by: Florian Forster <octo@collectd.org>
Florian Forster [Sat, 25 May 2013 18:15:59 +0000 (20:15 +0200)]
Merge branch 'document-varnish-instance-block' into collectd-5.2
Florian Forster [Sat, 25 May 2013 09:15:29 +0000 (11:15 +0200)]
modbus plugin: Refactor the new reconnection code.
Avoid the goto() and switch() statements.
Github: #294
Fabien Wernli [Tue, 15 May 2012 11:59:10 +0000 (13:59 +0200)]
Cleanup modbus connection if wrong result
Change-Id: I1b7520442d7663d5bc2529369e27e3e858fe2168
Signed-off-by: Florian Forster <octo@collectd.org>
Stefan Nickl [Sat, 28 Jan 2012 18:21:10 +0000 (19:21 +0100)]
Fix modbus segfault / New strategy for connecting
The previous implementation had a reconnection loop which should not
really be necessary. Idea tried here is to check if connection is alive,
and establish it if not. Change was begun because previously connection
would only be attempted as a retry, so on first pass a NULL was handed to
libmodbus which caused segmentation faults reproducibly.
Signed-off-by: Florian Forster <octo@collectd.org>
Marc Fournier [Fri, 17 May 2013 11:13:43 +0000 (13:13 +0200)]
varnish: hint about missing <Instance> block
The warning when the Collect* configuration options where used outside
of an <Instance> block was confusing. This patch warns the user the same
way the apache plugin does.
Marc Fournier [Fri, 17 May 2013 10:54:16 +0000 (12:54 +0200)]
Improve varnish section in manpage.
There previously was no mention of the mandatory <Instance> block.
Sebastian Harl [Thu, 2 May 2013 20:41:35 +0000 (22:41 +0200)]
collectd.conf(5): Fixed documentation for include filter patterns.
The syntax has been changed from a positional argument to using an <Include>
block with additional arguments.
Florian Forster [Fri, 26 Apr 2013 12:16:38 +0000 (14:16 +0200)]
dns plugin: Sleep for an interval before re-trying to read from interface.
Otherwise we'd just have the CPU hogging behavior shifted from libpcap
to collectd …
Github: #308
Florian Forster [Wed, 24 Apr 2013 19:55:06 +0000 (21:55 +0200)]
dns plugin: Resume after receiving a PCAP_ERROR from pcap_loop().
If an interface goes down while capturing, libpcap returns PCAP_ERROR.
Handle this case gracefully.
Github: #308
Florian Forster [Tue, 23 Apr 2013 05:15:44 +0000 (07:15 +0200)]
write_riemann plugin: Really fix a memory leak.
Github: #307
Florian Forster [Sun, 21 Apr 2013 16:28:01 +0000 (18:28 +0200)]
write_riemann plugin: Fix a memory leak.
Attributes were allocated and added to the event but not freed. D'oh!
Thanks to @dch for reporting this!
Github: #307
Florian Forster [Thu, 18 Apr 2013 04:25:58 +0000 (06:25 +0200)]
src/utils_mount.h: Add <stdio.h>.
This is required on Solaris 10. Thanks to dannypoo@ for reporting this
problem.
Github: #306
Aman Gupta [Mon, 15 Apr 2013 09:30:02 +0000 (02:30 -0700)]
Record load averages over 100
Signed-off-by: Florian Forster <octo@collectd.org>
Florian Forster [Thu, 11 Apr 2013 15:09:11 +0000 (08:09 -0700)]
snmp plugin: Removed "mixed delaration".
This should fix this warning Fabien Wernli reported:
snmp.c:1381: warning: ISO C90 forbids mixed declarations and code
Florian Forster [Wed, 10 Apr 2013 15:38:48 +0000 (17:38 +0200)]
src/Makefile.am: Really don't distribute *.pb-c.[ch].
Florian Forster [Wed, 10 Apr 2013 14:54:27 +0000 (16:54 +0200)]
src/Makefile.am: Add *.proto to EXTRA_DIST. D'oh!
Florian Forster [Wed, 10 Apr 2013 14:46:14 +0000 (16:46 +0200)]
Build system: Don't ship the generated *.pb-c.[ch] files.
They depend on specific versions of the protobuf-c.h header file, so
shipping this will cause problems for people having a different version
of protoc-c installed. This reverts some of the work done in #269, but
distcheck should still work. Meh.
Marc Fournier [Wed, 10 Apr 2013 12:39:13 +0000 (14:39 +0200)]
RedHat RPM spec: updated for 5.3.0
Signed-off-by: Florian Forster <octo@collectd.org>
Florian Forster [Wed, 10 Apr 2013 02:33:23 +0000 (04:33 +0200)]
configure.in: Fix libgcrypt flags on FreeBSD.
On FreeBSD, AM_PATH_LIBGCRYPT sets LIBGCRYPT_CFLAGS but not
LIBGCRYPT_CPPFLAGS. Use both variables to be on the save side.
Florian Forster [Wed, 10 Apr 2013 02:08:59 +0000 (19:08 -0700)]
Bump version to 5.3.0; Update ChangeLog.
Florian Forster [Wed, 10 Apr 2013 01:44:29 +0000 (18:44 -0700)]
Merge branch 'collectd-5.2'
Florian Forster [Tue, 9 Apr 2013 00:59:28 +0000 (17:59 -0700)]
Bump version to 5.2.2; Update ChangeLog.
Florian Forster [Tue, 9 Apr 2013 00:55:06 +0000 (17:55 -0700)]
Merge branch 'collectd-5.1' into collectd-5.2
Conflicts:
ChangeLog
version-gen.sh
Florian Forster [Tue, 9 Apr 2013 00:54:19 +0000 (17:54 -0700)]
Bump version to 5.1.3; Update ChangeLog.
Florian Forster [Tue, 9 Apr 2013 00:44:55 +0000 (17:44 -0700)]
Merge remote-tracking branch 'origin/collectd-4.10' into collectd-5.1
Conflicts:
ChangeLog
version-gen.sh
Florian Forster [Sun, 7 Apr 2013 18:45:10 +0000 (20:45 +0200)]
Bump version to 4.10.9; Update ChangeLog.
Florian Forster [Sun, 7 Apr 2013 17:26:13 +0000 (19:26 +0200)]
netapp plugin: Fix the interval used by the SnapVault and quota metrics.
Additional fix for Github issue #288.
Florian Forster [Sun, 7 Apr 2013 17:23:40 +0000 (19:23 +0200)]
Merge branch 'collectd-5.2'
Florian Forster [Sun, 7 Apr 2013 17:23:27 +0000 (19:23 +0200)]
Merge branch 'collectd-5.1' into collectd-5.2
Florian Forster [Sun, 7 Apr 2013 17:20:14 +0000 (19:20 +0200)]
Merge branch 'jk/snmp' into collectd-5.1
Florian Forster [Sun, 7 Apr 2013 15:45:47 +0000 (17:45 +0200)]
write_riemann plugin: Reorder the functions to get rid or prototypes.
Florian Forster [Sun, 7 Apr 2013 05:10:20 +0000 (07:10 +0200)]
write_riemann plugin: Use the "Attributes" of an Event rather than abuse the "Tags".
Riemann 0.2.0 provides "Attributes", which are key-value pairs. Since
the plugin previously basically abused the tag system for adding this
kind of data, switch to the new and shiny thing :)
Florian Forster [Sun, 7 Apr 2013 05:08:47 +0000 (07:08 +0200)]
src/riemann.proto: Import the protocol buffer for Riemann 0.2.0.
Florian Forster [Sun, 7 Apr 2013 04:21:42 +0000 (06:21 +0200)]
Merge remote-tracking branch 'github-octo/ff/netapp' into collectd-5.1
Florian Forster [Sun, 7 Apr 2013 04:17:49 +0000 (06:17 +0200)]
Merge branch 'collectd-5.2'
Florian Forster [Sun, 7 Apr 2013 03:54:24 +0000 (05:54 +0200)]
Merge branch 'collectd-5.1' into collectd-5.2
Conflicts:
configure.in
Florian Forster [Sun, 7 Apr 2013 03:44:38 +0000 (05:44 +0200)]
Merge branch 'collectd-4.10' into collectd-5.1
Conflicts:
configure.in
src/mysql.c
src/network.c
src/thermal.c
Florian Forster [Sat, 6 Apr 2013 19:29:07 +0000 (12:29 -0700)]
.gitignore: Add src/*.pb-c.[ch]
Florian Forster [Sat, 6 Apr 2013 19:26:50 +0000 (12:26 -0700)]
configure.in: Fix dependency of the pinba and write_riemann plugins.
Since the generated *.pb-c.[ch] files are now included in the
distribution, they only depend on the <google/protobuf-c/protobuf-c.h>
header file, not the protobuf compiler.
Florian Forster [Sat, 6 Apr 2013 19:25:26 +0000 (12:25 -0700)]
src/Makefile.am: Move *.pb-c.[ch] to MAINTAINERCLEANFILES.
Only generate build rules for these files if protoc-c is available and
use the provided files from the distribution if it is not.
Yves Mettier [Sat, 6 Apr 2013 18:14:27 +0000 (11:14 -0700)]
src/Makefile.am: Include .c and .h files generated from Protocol Buffers in the distribution.
Fixes Github issue #269.
Signed-off-by: Florian Forster <octo@collectd.org>
Sebastian Harl [Tue, 20 Nov 2012 13:56:45 +0000 (14:56 +0100)]
bindings/Makefile: Hint the user at --with-perl-bindings.
… in case 'perl Makefile.PL' fails.
Fixes Github issue #290.
Signed-off-by: Florian Forster <octo@collectd.org>
Sebastian Harl [Tue, 20 Nov 2012 13:44:43 +0000 (14:44 +0100)]
build system (Perl bindings): Make Makefile.PL's PREFIX/INSTALL_BASE optional.
Both options may cause problems:
- PREFIX might clash with INSTALL_BASE being set in $PERL_MM_OPT.
- INSTALL_BASE without any further options set will install into non-standard
directories in many cases.
Rather, use PREFIX=${prefix} as default but overwrite that if
--with-perl-bindings=... has been used.
Thanks to faxm0dem for reporting the INSTALL_BASE problems on IRC and
bvarner and nirik for reporting this in GH #177 and #196.
This is a follow-up / fix for
97e8f346a88eccf4d1608c21d5cc6ee9620c1c41.
Fixes Github issue #290.
Signed-off-by: Florian Forster <octo@collectd.org>
Florian Forster [Sat, 6 Apr 2013 16:23:16 +0000 (18:23 +0200)]
network plugin: Make sure gcrypt is initialized before using any of its functions.
@marekbecka found that sockent_open() is called during the configuration
phase, but gcrypt is initialized later, during the initialization phase.
This patch will initialize gcrypt in sockent_open() if any sockets with
security are configured.
Fixes Github issue #273.
Dave Cottlehuber [Thu, 7 Feb 2013 00:38:07 +0000 (01:38 +0100)]
Don't clobber TMPDIR during Java detection
- Java detection used TMPDIR as var to parse command output
- TMPDIR is used in libltdl later on in ./configure
- alternative fix is local var or subshell
- fixes issue introduced via #
33163ee
Conflicts:
configure.in
Signed-off-by: Florian Forster <octo@collectd.org>
Manuel CISSÉ [Fri, 15 Feb 2013 10:03:00 +0000 (11:03 +0100)]
notify_email: Add charset in Content-Type header (seems required by some picky spam filters)
Signed-off-by: Florian Forster <octo@collectd.org>
Florian Forster [Fri, 5 Apr 2013 05:31:35 +0000 (07:31 +0200)]
configure.in: Check for protobuf-c.h.
Thanks to Yves Mettier pointing this out in #269 and for providing an
initial patch.
Florian Forster [Fri, 5 Apr 2013 00:32:36 +0000 (17:32 -0700)]
netapp plugin: Fix intervals used when dispatching values.
It used to use the interval of the <Host /> block when in fact it should
have used the interval of the data blocks.
Fixes Github issue #288.
Florian Forster [Wed, 3 Apr 2013 02:20:17 +0000 (19:20 -0700)]
snmp plugin: Fix compilation issue.
Thanks to Magnus for pointing this out.
Florian Forster [Mon, 1 Apr 2013 14:54:45 +0000 (16:54 +0200)]
nfs plugin: Copy the name before calling the non-const lookup function.
Fixes Github issue #70. Thanks to Jeff for reporting this issue.
Florian Forster [Mon, 1 Apr 2013 14:38:08 +0000 (16:38 +0200)]
rrdcached plugin: Connect to the daemon in the read() callback.
Fixes Github issue #275. Thanks to Yves Mettier for reporting this bug!
Florian Forster [Fri, 29 Mar 2013 20:30:21 +0000 (13:30 -0700)]
Merge branch 'collectd-5.1' into collectd-5.2
gkos [Wed, 13 Mar 2013 16:19:04 +0000 (13:19 -0300)]
src/libcollectdclient/network_buffer.c check for htonll exitence
before defining it. I have to to this to get it compiled on AIX6
Signed-off-by: Florian Forster <octo@collectd.org>
Florian Forster [Fri, 29 Mar 2013 19:50:23 +0000 (12:50 -0700)]
snmp plugin: Allocate "oid_list" on the stack.
Florian Forster [Fri, 29 Mar 2013 19:49:28 +0000 (12:49 -0700)]
snmp plugin: Some coding style fixes.
* Rename "oid_todo_list" to "oid_list_todo".
* Rename "j" to "oid_list_todo_num".
* Fix indentation.
* Declare variables at beginning of block.
jkrabbe [Tue, 26 Mar 2013 14:25:02 +0000 (15:25 +0100)]
csnmp_read_table: Change GETNEXT request behaviour (+ bugfix 235)
This patch changes the snmp GETNEXT request behaviour implemented in snmp.c.
The old implementation requested all OIDs using GETNEXT requests until all OIDs
left their own subtree. In cases were trees in a Data template are much longer
than other trees the shorter subtrees were re-requested over and over again.
The new implementation will only request OIDs that did not already leave their
subtrees (see the oid_todo_list implementation for details). This renders the
function csnmp_check_res_left_subtree useless as the oid_todo_list keeps track
if all OIDs have finished.
During tests against Cat6500 (CatOS/IOS) as well as Nexus5k (NX-OS) it looks as
though GETNEXT requests (when requesting multiple OIDs like all 14 dot3Stats
errors from Etherlike-MIB) can take about 5-10ms (CatOS 30ms) longer if they wrap
to the next OID.
This does not sound much but when collecting data for the Etherlike-MIB (that only
has entries for physical interfaces) with a collectd "Instance" variable in IF-MIB
(that has entries for all physical as well as pseudo [SVIs, VLANs, ...] interfaces)
this can make a notable difference (e.g. for core routers that have all SVIs and
VLANs but only some switches attached):
IOS-Core-Router ifName 550 entries
dot3StatsFCSErrors 70 entries
------------
480 entries * 10ms = 4.8s overhead
CatOS-Access-Sw. ifName 840 entries
dot3StatsFCSErrors 490 entries
------------
350 entries * 30ms = 10.5s overhead
After refactoring csnmp_read_table "Instance" and "Value" OIDs are now handled
consistently (so no pointer-forward foo needed). It doesn't change any logic
and data structures, though - so there should not be any impact to other
functions.
The refactored code also fixes GitHub bugs #235 and #258. This bug is due to
reusing the status variable in following code section which might lead to errors
if the subtrees are of different length:
1436 /* Calculate the current suffix. This is later used to check that the
1437 * suffix is increasing. This also checks if we left the subtree */
1438 status = csnmp_oid_suffix (&suffix, &vb_name, data->values + i);
Signed-off-by: Florian Forster <octo@collectd.org>
Florian Forster [Fri, 29 Mar 2013 13:43:39 +0000 (06:43 -0700)]
configure.in: Yet another attempt at fixing the mess that is AC_LANG_PROGRAM().
Markus Knetschke [Sun, 23 Dec 2012 10:50:22 +0000 (11:50 +0100)]
thermal plugin: set the hostname
Signed-off-by: Markus Knetschke <markus.knetschke@gmail.com>
Signed-off-by: Florian Forster <octo@collectd.org>
Markus Knetschke [Sun, 23 Dec 2012 10:02:42 +0000 (11:02 +0100)]
thermal plugin: fixed value submitting
Signed-off-by: Markus Knetschke <markus.knetschke@gmail.com>
Signed-off-by: Florian Forster <octo@collectd.org>
Tommie Gannert [Thu, 7 Mar 2013 08:10:03 +0000 (09:10 +0100)]
Allow parsing plugin_instance in parse_option().
isalnum() is not enough to catch the underscore.
Signed-off-by: Florian Forster <octo@collectd.org>
Florian Forster [Mon, 25 Mar 2013 06:28:36 +0000 (07:28 +0100)]
mysql plugin: Call mysql_init() only once.
Apparently, if you call it with a structure allocated by mysql_init()
itself, it leaks memory. Thanks to Yves Mettier for pointing this out!
Fixes Github issue #274.
Florian Forster [Thu, 21 Feb 2013 10:18:53 +0000 (11:18 +0100)]
configure.in: Fix quoting of AC_LANG_PROGRAM().
Autoconf 2.68 complains about that and aborts building the configure
script. *sigh*
Florian Forster [Sun, 24 Mar 2013 13:21:27 +0000 (14:21 +0100)]
rrdtool plugin: Use cdrand_range() for the random variation.
Florian Forster [Sun, 24 Mar 2013 13:15:16 +0000 (14:15 +0100)]
src/utils_random.[ch]: Provide thread-safe random numbers.
Florian Forster [Sat, 23 Mar 2013 17:07:03 +0000 (18:07 +0100)]
write_mongodb plugin: Add authentication options.
Fixes Github issue #282.
Greg Mason [Thu, 14 Mar 2013 19:21:33 +0000 (15:21 -0400)]
Increase MAX_NUMDISKS
On large systems (particularly ZFS systems using large JBODs), it's
quite possible to have more than 256 disks.
Signed-off-by: Florian Forster <octo@collectd.org>
Pierre-Yves Ritschard [Thu, 7 Mar 2013 08:18:04 +0000 (09:18 +0100)]
respect riemann's terminology
Signed-off-by: Florian Forster <octo@collectd.org>
Dan Fandrich [Mon, 18 Mar 2013 22:17:16 +0000 (23:17 +0100)]
Get rid of a compiler warning with gcc 4.6.3
...a futile warning that nevertheless kills the build thanks
to -Werror: "variable 'status' set but not used"
Signed-off-by: Florian Forster <octo@collectd.org>
Dan Fandrich [Thu, 21 Mar 2013 21:19:48 +0000 (22:19 +0100)]
curl_xml plugin: Fixed typo in documentation
Signed-off-by: Florian Forster <octo@collectd.org>
Florian Forster [Sat, 23 Mar 2013 09:13:02 +0000 (10:13 +0100)]
Merge branch 'collectd-5.2'
Conflicts:
configure.in
Florian Forster [Sat, 23 Mar 2013 09:01:19 +0000 (10:01 +0100)]
Merge branch 'collectd-5.1' into collectd-5.2
Florian Forster [Sat, 23 Mar 2013 08:54:39 +0000 (09:54 +0100)]
Merge branch 'kn/snort'
Florian Forster [Sat, 23 Mar 2013 08:53:28 +0000 (09:53 +0100)]
src/plugin.c: Assert that "data_sets" is non-NULL.
Otherwise we might run into an assertion in the AVL tree. This can be
triggered e.g. when calling plugin_get_ds() from within a config
callback.
Florian Forster [Sat, 23 Mar 2013 08:27:24 +0000 (09:27 +0100)]
tail_csv plugin: Implement the "TimeFrom" option.
Florian Forster [Sat, 23 Mar 2013 07:57:43 +0000 (08:57 +0100)]
tail_csv plugin: Rename the "Index" option to "ValueFrom".
Florian Forster [Sat, 23 Mar 2013 07:47:02 +0000 (08:47 +0100)]
tail_csv plugin: Some bug fixes.
* Query types in the init-phase rather than the config-phase. The
types.db is not guaranteed to be available at that time.
* Make sure the "Instance" option in the <File /> blocks is optional.
Florian Forster [Fri, 22 Mar 2013 22:05:08 +0000 (23:05 +0100)]
Merge branch 'jw/libvirt'
Florian Forster [Fri, 22 Mar 2013 21:57:43 +0000 (22:57 +0100)]
tail_csv plugin: Rename "Instance" blocks to "File".
This way the syntax of tail_csv's configuration is closer to that of the
csv plugin.
Florian Forster [Fri, 22 Mar 2013 21:21:57 +0000 (22:21 +0100)]
tail_csv plugin: Rename the "snort" plugin to "tail_csv".
It's actually much more generic than just Snort, so give it an
appropriately generic name.
Florian Forster [Fri, 22 Mar 2013 20:55:02 +0000 (21:55 +0100)]
configure.in: Quote AC_LANG_PROGRAM and remove AC_INCLUDES_DEFAULT.
The latter isn't expanded anymore when quoted. There's no easy way
around this :\