Hello community,
here is the log from the commit of package netcf for openSUSE:Factory
checked in at Fri Jun 10 09:33:42 CEST 2011.
--------
--- netcf/netcf.changes 2011-03-31 14:44:43.000000000 +0200
+++ /mounts/work_src_done/STABLE/netcf/netcf.changes 2011-06-07 22:48:41.000000000 +0200
@@ -1,0 +2,18 @@
+Tue Jun 7 20:38:19 UTC 2011 - pmullaney@novell.com
+
+- added fix such that netcf will be more liberal in
+ what it accepts for syntax from udev - 11.3 update
+ to 11.4 would cause a problem if old version of
+ persistent-net.rules was preserved on an upgrade
+ (related to bug 689282)
+- added fix so that netcf will ignore augeas parse
+ errors that it does not care about - the upgrade
+ of augeas, which contained lens parse errors, caused
+ netcf to assume the loading of its own lenses failed,
+ this fixes the log spamming in bug 689282
+- added fix such that netcf will be more liberal in
+ what it accepts for syntax from persistent-net.rules
+ and will only change it in very limited cases(user
+ actually specifies a mac address change)
+
+-------------------------------------------------------------------
calling whatdependson for head-i586
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ netcf.spec ++++++
--- /var/tmp/diff_new_pack.Ybsz8f/_old 2011-06-10 09:32:52.000000000 +0200
+++ /var/tmp/diff_new_pack.Ybsz8f/_new 2011-06-10 09:32:52.000000000 +0200
@@ -19,7 +19,7 @@
Name: netcf
Version: 0.1.6
-Release: 5
+Release: 7
Summary: Cross-platform network configuration library
Group: Productivity/Networking/System
@@ -85,12 +85,7 @@
%build
%configure --disable-static
-%if 0%{?suse_version} >= 1130
-make CFLAGS="-DOS113" %{?_smp_mflags}
-%else
-cp data/lenses/persist_net_rules-pre-os113.aug data/lenses/persist_net_rules.aug
make %{?_smp_mflags}
-%endif
%install
rm -rf $RPM_BUILD_ROOT
++++++ netcf-suse.patch ++++++
--- /var/tmp/diff_new_pack.Ybsz8f/_old 2011-06-10 09:32:52.000000000 +0200
+++ /var/tmp/diff_new_pack.Ybsz8f/_new 2011-06-10 09:32:52.000000000 +0200
@@ -1,7 +1,5 @@
From:Patrick Mullaney
-From: root
-
netcf: Suse backend for netcf
These changes address basic ethernet physical interface configuration.
@@ -10,14 +8,11 @@
Signed-off-by: Patrick Mullaney
---
- Makefile.am | 2
- data/xml/initscripts-get.xsl | 51 +++-
- data/xml/initscripts-put.xsl | 7 -
- src/Makefile.am | 1
- src/drv_initscripts.c | 570 ++++++++++++++++++++++++++----------------
- src/dutil.c | 32 ++
- src/dutil.h | 3
- 7 files changed, 432 insertions(+), 234 deletions(-)
+ src/Makefile.am | 1
+ src/drv_initscripts.c | 537 ++++++++++++++++++++++++++++++-------------------
+ src/dutil.c | 44 +++-
+ src/dutil.h | 3
+ 4 files changed, 361 insertions(+), 224 deletions(-)
diff --git a/Makefile.am b/Makefile.am
@@ -171,7 +166,7 @@
diff --git a/data/xml/initscripts-put.xsl b/data/xml/initscripts-put.xsl
-index 267d9cd..1b5145a 100644
+index 267d9cd..b117d02 100644
--- a/data/xml/initscripts-put.xsl
+++ b/data/xml/initscripts-put.xsl
@@ -140,12 +140,15 @@
@@ -192,6 +187,15 @@
xsl:otherwise
<start mode='none'/>
+@@ -159,7 +162,7 @@
+
+
+
+-
++
+ <mtu size="{node[@label='MTU']/@value}"/>
+
+
diff --git a/src/Makefile.am b/src/Makefile.am
index 9d8a3d7..daa54d9 100644
--- a/src/Makefile.am
@@ -205,7 +209,7 @@
ncftool_SOURCES = ncftool.c
ncftool_LDADD = libnetcf.la $(READLINE_LIBS) $(GNULIB)
diff --git a/src/drv_initscripts.c b/src/drv_initscripts.c
-index d5bbd44..1878875 100644
+index d5bbd44..2759f9f 100644
--- a/src/drv_initscripts.c
+++ b/src/drv_initscripts.c
@@ -1,6 +1,7 @@
@@ -229,17 +233,18 @@
*/
#include
-@@ -30,6 +34,9 @@
+@@ -30,6 +34,10 @@
#include
#include
#include
++#include
+#include
+#include
+
#include "safe-alloc.h"
#include "ref.h"
-@@ -47,18 +54,44 @@
+@@ -47,18 +55,44 @@
#include
@@ -288,7 +293,7 @@
{ "/augeas/load/Ifcfg/excl[1]", "*~" },
{ "/augeas/load/Ifcfg/excl[2]", "*.bak" },
{ "/augeas/load/Ifcfg/excl[3]", "*.orig" },
-@@ -108,13 +141,14 @@ static const char *const prog_rc_d_iptables = "/etc/init.d/iptables";
+@@ -108,13 +142,14 @@ static const char *const prog_rc_d_iptables = "/etc/init.d/iptables";
* is not a toplevel interface
*/
static const char *const subif_paths[] = {
@@ -305,7 +310,7 @@
if (r != 0)
return r;
}
-@@ -122,14 +156,23 @@ static int is_slave(struct netcf *ncf, const char *intf) {
+@@ -122,14 +157,23 @@ static int is_slave(struct netcf *ncf, const char *intf) {
}
static bool has_ifcfg_file(struct netcf *ncf, const char *name) {
@@ -336,7 +341,7 @@
return nmatches > 0;
}
-@@ -139,76 +182,114 @@ static int cmpstrp(const void *p1, const void *p2) {
+@@ -139,76 +183,114 @@ static int cmpstrp(const void *p1, const void *p2) {
return strcmp(s1, s2);
}
@@ -476,12 +481,12 @@
-
- if (ndevs == 0)
- return NULL;
+-
+- qsort(devs, ndevs, sizeof(*devs), cmpstrp);
+ nmatches = aug_fmt_match(ncf, &matches, "%s/%s/*[ NAME = '%s']",
+ aug_files, udev_netrule_path, name);
+ ERR_COND_BAIL(nmatches < 0 , ncf, EOTHER);
-- qsort(devs, ndevs, sizeof(*devs), cmpstrp);
--
- char *path = devs[ndevs - 1];
- devs[ndevs - 1] = NULL;
-
@@ -506,7 +511,7 @@
}
/* Find the path to the ifcfg file that has the configuration for
-@@ -218,14 +299,13 @@ static char *find_ifcfg_path_by_device(struct netcf *ncf, const char *name) {
+@@ -218,14 +300,13 @@ static char *find_ifcfg_path_by_device(struct netcf *ncf, const char *name) {
static char *find_ifcfg_path(struct netcf *ncf, const char *name) {
struct augeas *aug = NULL;
char *path = NULL;
@@ -522,7 +527,7 @@
ERR_NOMEM(r < 0, ncf);
nmatches = aug_match(aug, path, NULL);
-@@ -234,98 +314,10 @@ static char *find_ifcfg_path(struct netcf *ncf, const char *name) {
+@@ -234,98 +315,10 @@ static char *find_ifcfg_path(struct netcf *ncf, const char *name) {
if (nmatches == 1)
return path;
@@ -558,7 +563,7 @@
- int r;
- int ndevnames = 0;
- const char **devnames = NULL;
-
+-
- aug = get_augeas(ncf);
- ERR_BAIL(ncf);
-
@@ -591,7 +596,7 @@
-
- FREE(devnames);
- return ndevnames;
--
+
- error:
- FREE(devnames);
- free_matches(ndevnames, intf);
@@ -622,7 +627,7 @@
}
static int list_interfaces(struct netcf *ncf, char ***intf) {
-@@ -335,8 +327,8 @@ static int list_interfaces(struct netcf *ncf, char ***intf) {
+@@ -335,8 +328,8 @@ static int list_interfaces(struct netcf *ncf, char ***intf) {
aug = get_augeas(ncf);
ERR_BAIL(ncf);
@@ -633,14 +638,6 @@
ERR_BAIL(ncf);
result = nint;
-@@ -491,6 +483,7 @@ int drv_init(struct netcf *ncf) {
- goto error;
-
- // FIXME: Check for errors
-+
- xsltInit();
- exsltStrRegister();
- ncf->driver->get = parse_stylesheet(ncf, "initscripts-get.xsl");
@@ -498,8 +491,10 @@ int drv_init(struct netcf *ncf) {
ncf->driver->rng = rng_parse(ncf, "interface.rng");
ERR_BAIL(ncf);
@@ -782,10 +779,10 @@
xmlNodePtr forest;
char *path = NULL, *lpath = NULL, *label = NULL, *value = NULL;
+ char *device = NULL, *mac = NULL, *gateway = NULL;
-+ char **rules = NULL;
++ const char *val = NULL;
struct augeas *aug = NULL;
- int result = -1;
-+ int result = -1, nrules = 0, ethphysical = 0;
++ int result = -1, ethphysical = 0;
+ int toplevel = 1;
int r;
@@ -799,7 +796,7 @@
/* This is a little drastic, since it clears out the file entirely */
r = aug_rm(aug, path);
ERR_THROW(r < 0, ncf, EINTERNAL, "aug_rm of '%s' failed", path);
-@@ -697,23 +706,154 @@ static int aug_put_xml(struct netcf *ncf, xmlDocPtr xml) {
+@@ -697,23 +706,137 @@ static int aug_put_xml(struct netcf *ncf, xmlDocPtr xml) {
label = xml_prop(node, "label");
value = xml_prop(node, "value");
/* We should mark the toplevel interface from the XSLT */
@@ -808,14 +805,6 @@
toplevel = 0;
}
- r = xasprintf(&lpath, "%s/%s", path, label);
-- ERR_NOMEM(r < 0, ncf);
--
-- r = aug_set(aug, lpath, value);
-- ERR_THROW(r < 0, ncf, EOTHER,
-- "aug_set of '%s' failed", lpath);
-- FREE(lpath);
-- xmlFree(label);
-- xmlFree(value);
+ if (STREQ(label, "DEVICE")) {
+ device = value;
+ if(!strchr(value, '.') && !strncmp("eth", value, strlen("eth")))
@@ -824,11 +813,9 @@
+ } else if(STREQ(label, "HWADDR")) {
+ mac = value;
+ xmlFree(label);
-+ //continue;
+ } else if(STREQ(label, "GATEWAY")) {
+ gateway = value;
+ xmlFree(label);
-+ //continue;
+ } else {
+ r = xasprintf(&lpath, "%s/%s", path, label);
+ ERR_NOMEM(r < 0, ncf);
@@ -840,14 +827,14 @@
+ xmlFree(label);
+ xmlFree(value);
+ }
- label = value = NULL;
- }
- xmlFree(path);
- path = NULL;
- }
++ label = value = NULL;
++ }
++ xmlFree(path);
++ path = NULL;
++ }
+ if( device && !mac && ethphysical && toplevel ){
+ mac = malloc(20);
-+ if( if_hwaddr(ncf, device, mac, 20) ){
++ if( if_hwaddr(ncf, device, (unsigned char *)mac, 20) ){
+ free(mac);
+ mac = NULL;
+ }
@@ -885,86 +872,77 @@
+ FREE(lpath);
+ }
+ if( device && mac && ethphysical && toplevel ) {
++ char *pmac=NULL;
+
+ r = xasprintf(&lpath, "%s%s/%s/%s", aug_files,
-+ udev_netrule_path, device, "SUBSYSTEM");
-+ ERR_NOMEM(r < 0, ncf);
-+
-+ r = aug_set(aug, lpath, "net");
-+ ERR_THROW(r < 0, ncf, EOTHER,
-+ "aug_set of '%s' failed", lpath);
-+
-+ FREE(lpath);
-+
-+ r = xasprintf(&lpath, "%s%s/%s/%s", aug_files,
-+ udev_netrule_path, device, "ACTION");
++ udev_netrule_path, device, "ATTR{address}");
+ ERR_NOMEM(r < 0, ncf);
+
-+ r = aug_set(aug, lpath, "add");
-+ ERR_THROW(r < 0, ncf, EOTHER,
-+ "aug_set of '%s' failed", lpath);
++ r = aug_get(aug, lpath, &val);
+
+ FREE(lpath);
+
-+ r = xasprintf(&lpath, "%s%s/%s/%s", aug_files,
-+ udev_netrule_path, device, "DRIVERS");
-+ ERR_NOMEM(r < 0, ncf);
++ for(pmac = mac;*pmac!= '\0';++pmac)
++ *pmac = tolower(*pmac);
+
-+ r = aug_set(aug, lpath, "?*");
-+ ERR_THROW(r < 0, ncf, EOTHER,
-+ "aug_set of '%s' failed", lpath);
++ if ( strncmp(val, mac, strlen(mac)) ) {
+
-+ FREE(lpath);
++ val = NULL; /* don't free val returned from aug_get */
+
-+ r = xasprintf(&lpath, "%s%s/%s/%s", aug_files,
-+ udev_netrule_path, device, "ATTR{address}");
-+ ERR_NOMEM(r < 0, ncf);
-+
-+ r = aug_set(aug, lpath, mac);
-+ ERR_THROW(r < 0, ncf, EOTHER,
-+ "aug_set of '%s' failed", lpath);
-+
-+ FREE(lpath);
-+
-+#ifdef OS113
-+ r = xasprintf(&lpath, "%s%s/%s/%s", aug_files,
-+ udev_netrule_path, device, "ATTR{dev_id}");
-+ ERR_NOMEM(r < 0, ncf);
++ r = xasprintf(&lpath, "%s%s/%s/%s", aug_files,
++ udev_netrule_path, device, "SUBSYSTEM");
++ ERR_NOMEM(r < 0, ncf);
+
-+ r = aug_set(aug, lpath, "0x0");
-+ ERR_THROW(r < 0, ncf, EOTHER,
++ r = aug_set(aug, lpath, "net");
++ ERR_THROW(r < 0, ncf, EOTHER,
+ "aug_set of '%s' failed", lpath);
+
-+ FREE(lpath);
-+#endif
++ FREE(lpath);
+
+ r = xasprintf(&lpath, "%s%s/%s/%s", aug_files,
-+ udev_netrule_path, device, "ATTR{type}");
++ udev_netrule_path, device, "ACTION");
+ ERR_NOMEM(r < 0, ncf);
+
-+ r = aug_set(aug, lpath, "1");
++ r = aug_set(aug, lpath, "add");
+ ERR_THROW(r < 0, ncf, EOTHER,
+ "aug_set of '%s' failed", lpath);
+
+ FREE(lpath);
+
+ r = xasprintf(&lpath, "%s%s/%s/%s", aug_files,
-+ udev_netrule_path, device, "KERNEL");
++ udev_netrule_path, device, "DRIVERS");
+ ERR_NOMEM(r < 0, ncf);
+
-+ r = aug_set(aug, lpath, "eth*");
++ r = aug_set(aug, lpath, "?*");
+ ERR_THROW(r < 0, ncf, EOTHER,
+ "aug_set of '%s' failed", lpath);
+
+ FREE(lpath);
-+ }
++
++ r = xasprintf(&lpath, "%s%s/%s/%s", aug_files,
++ udev_netrule_path, device, "ATTR{address}");
+ ERR_NOMEM(r < 0, ncf);
+
+- r = aug_set(aug, lpath, value);
++ r = aug_set(aug, lpath, mac);
+ ERR_THROW(r < 0, ncf, EOTHER,
+ "aug_set of '%s' failed", lpath);
++
+ FREE(lpath);
+- xmlFree(label);
+- xmlFree(value);
+- label = value = NULL;
+ }
+- xmlFree(path);
+- path = NULL;
+ }
+ xmlFree(device);
+ xmlFree(mac);
+ xmlFree(gateway);
result = 0;
error:
xmlFree(label);
-@@ -728,24 +868,17 @@ static int aug_put_xml(struct netcf *ncf, xmlDocPtr xml) {
+@@ -728,24 +851,17 @@ static int aug_put_xml(struct netcf *ncf, xmlDocPtr xml) {
*/
static xmlDocPtr aug_get_xml_for_nif(struct netcf_if *nif) {
struct netcf *ncf;
@@ -979,12 +957,12 @@
- "%s[ DEVICE = '%s' or BRIDGE = '%s' or MASTER = '%s'"
- " or MASTER = ../*[BRIDGE = '%s']/DEVICE ]/DEVICE",
- ifcfg_path, nif->name, nif->name, nif->name, nif->name);
-- ERR_BAIL(ncf);
--
-- nint = uniq_ifcfg_paths(ncf, ndevs, devs, &intf);
+ nint = find_ifcfg_file_by_name(ncf, nif->name, &intf);
ERR_BAIL(ncf);
+- nint = uniq_ifcfg_paths(ncf, ndevs, devs, &intf);
+- ERR_BAIL(ncf);
+-
- aug_xml = aug_get_xml(ncf, nint, intf);
+ aug_xml = aug_get_xml(nif, nint, intf);
@@ -993,7 +971,7 @@
free_matches(nint, &intf);
return aug_xml;
}
-@@ -871,7 +1004,7 @@ static bool is_bond(struct netcf *ncf, const char *name) {
+@@ -871,7 +987,7 @@ static bool is_bond(struct netcf *ncf, const char *name) {
int nmatches = 0;
nmatches = aug_fmt_match(ncf, NULL,
@@ -1002,7 +980,7 @@
return nmatches > 0;
}
-@@ -880,8 +1013,8 @@ static bool is_bridge(struct netcf *ncf, const char *name) {
+@@ -880,8 +996,8 @@ static bool is_bridge(struct netcf *ncf, const char *name) {
int nmatches = 0;
nmatches = aug_fmt_match(ncf, NULL,
@@ -1013,16 +991,7 @@
return nmatches > 0;
}
-@@ -917,21 +1050,32 @@ static int bridge_slaves(struct netcf *ncf, const char *name, char ***slaves) {
- static void rm_interface(struct netcf *ncf, const char *name) {
- int r;
- char *path = NULL;
-+ char **rules = NULL;
- struct augeas *aug = NULL;
-+ int nrules = 0;
-
- aug = get_augeas(ncf);
- ERR_BAIL(ncf);
+@@ -924,14 +1040,13 @@ static void rm_interface(struct netcf *ncf, const char *name) {
/* The last or clause catches slaves of a bond that are enslaved to
* a bridge NAME */
@@ -1037,24 +1006,33 @@
r = aug_rm(aug, path);
ERR_COND_BAIL(r < 0, ncf, EOTHER);
+
-+ nrules = aug_fmt_match(ncf, &rules, "%s/%s/%s",
-+ aug_files, udev_netrule_path, name);
-+ ERR_COND_BAIL(nrules < 0, ncf, EINTERNAL);
-+
-+ while(nrules > 0) {
-+ nrules--;
-+ r = aug_rm(aug, rules[nrules]);
-+ }
-+ free_matches(nrules, &rules);
-+
error:
FREE(path);
}
diff --git a/src/dutil.c b/src/dutil.c
-index 2a6eaa0..05ec95a 100644
+index 2a6eaa0..e52ca3a 100644
--- a/src/dutil.c
+++ b/src/dutil.c
-@@ -547,6 +547,38 @@ int netlink_close(struct netcf *ncf) {
+@@ -175,18 +175,6 @@ struct augeas *get_augeas(struct netcf *ncf) {
+ r = aug_load(aug);
+ ERR_THROW(r < 0, ncf, EOTHER, "failed to load config files");
+
+- /* FIXME: we need to produce _much_ better diagnostics here - need
+- * to analyze what came back in /augeas//error; ultimately, we need
+- * to understand whether this is harmless or a real error. For real
+- * errors, we need to return an error.
+- */
+- r = aug_match(aug, "/augeas//error", NULL);
+- if (r > 0 && NCF_DEBUG(ncf)) {
+- fprintf(stderr, "warning: augeas initialization had errors\n");
+- fprintf(stderr, "please file a bug with the following lines in the bug report:\n");
+- aug_print(aug, stderr, "/augeas//error");
+- }
+- ERR_THROW(r > 0, ncf, EOTHER, "errors in loading some config files");
+ ncf->driver->load_augeas = 0;
+ }
+ return ncf->driver->augeas;
+@@ -547,6 +535,38 @@ int netlink_close(struct netcf *ncf) {
return 0;
}
++++++ persist_net_rules.patch ++++++
--- /var/tmp/diff_new_pack.Ybsz8f/_old 2011-06-10 09:32:52.000000000 +0200
+++ /var/tmp/diff_new_pack.Ybsz8f/_new 2011-06-10 09:32:52.000000000 +0200
@@ -1,73 +1,16 @@
From:Patrick Mullaney
-From: <>
-
netcf: augeas lens for persistent net rules
Signed-off-by: Patrick Mullaney
---
- data/lenses/persist_net_rules-pre-os113.aug | 45 ++++++++++++++++++++++++++
- data/lenses/persist_net_rules.aug | 46 +++++++++++++++++++++++++++
- 2 files changed, 91 insertions(+), 0 deletions(-)
- create mode 100644 data/lenses/persist_net_rules-pre-os113.aug
- create mode 100644 data/lenses/persist_net_rules.aug
+ 0 files changed, 0 insertions(+), 0 deletions(-)
-diff --git a/data/lenses/persist_net_rules-pre-os113.aug b/data/lenses/persist_net_rules-pre-os113.aug
-new file mode 100644
-index 0000000..0acb3b1
---- /dev/null
-+++ b/data/lenses/persist_net_rules-pre-os113.aug
-@@ -0,0 +1,45 @@
-+(*
-+Module: Persist_Net_Rules
-+ Parses /etc/udev/rules.d/70-persistent-net.rules
-+*)
-+module Persist_Net_Rules =
-+autoload xfm
-+
-+let comment = Util.comment
-+let empty = Util.empty
-+let eol = Util.eol | Util.comment
-+
-+(* A separator is either whitespace or \ followed by newline *)
-+let sep_ch = /[ \t]|\\\\\n/
-+(* Anything that's not a separator is part of a token *)
-+let tok_ch = /[^ \t\n#\\",]|\\\\[^ \t\n]/
-+let optok_ch = /==/
-+let optok = del optok_ch "=="
-+let eq_optok_ch = /=/
-+let eq_optok = del eq_optok_ch "="
-+let indent = Util.del_opt_ws ""
-+let comma_ch = /,/
-+let commatok (n:string) = indent . del n n . indent
-+
-+let token = store tok_ch+
-+let key_token = key /[a-z0-9]/+
-+let quote_ch = /"/
-+let quote = del quote_ch "\""
-+
-+let name_arg (n:string) = Util.del_str n . indent . eq_optok . indent . quote . key_token . quote
-+let arg (n:string) = [ label n . Util.del_str n . indent . optok . indent . quote . token . quote ]
-+
-+let entry = [ arg "SUBSYSTEM" . commatok "," .
-+ arg "ACTION" . commatok "," .
-+ arg "DRIVERS" . commatok "," .
-+ arg "ATTR{address}" . commatok "," .
-+ arg "ATTR{type}" . commatok "," .
-+ arg "KERNEL" . commatok "," .
-+ name_arg "NAME" . eol ]
-+
-+let lns = (comment|empty|entry)*
-+
-+let filter = incl "/etc/udev/rules.d/70-persistent-net.rules" .
-+ Util.stdexcl
-+
-+let xfm = transform lns filter
diff --git a/data/lenses/persist_net_rules.aug b/data/lenses/persist_net_rules.aug
new file mode 100644
-index 0000000..d875904
+index 0000000..6ff1080
--- /dev/null
+++ b/data/lenses/persist_net_rules.aug
@@ -0,0 +1,46 @@
@@ -106,9 +49,9 @@
+ arg "ACTION" . commatok "," .
+ arg "DRIVERS" . commatok "," .
+ arg "ATTR{address}" . commatok "," .
-+ arg "ATTR{dev_id}" . commatok "," .
-+ arg "ATTR{type}" . commatok "," .
-+ arg "KERNEL" . commatok "," .
++ ( arg "ATTR{dev_id}" . commatok "," |
++ arg "ATTR{type}" . commatok "," |
++ arg "KERNEL" . commatok "," )* .
+ name_arg "NAME" . eol ]
+
+let lns = (comment|empty|entry)*
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Remember to have fun...
--
To unsubscribe, e-mail: opensuse-commit+unsubscribe@opensuse.org
For additional commands, e-mail: opensuse-commit+help@opensuse.org