There is already a libosinfo reading function located in src folder to get the iso informations. Provide a similar but more generic function to be used in ocaml tools. --- mllib/Makefile.am | 12 ++++++++-- mllib/osinfo.ml | 64 +++++++++++++++++++++++++++++++++++++++++++++++++++++ mllib/osinfo.mli | 21 ++++++++++++++++++ mllib/osinfopath.ml | 1 + 4 files changed, 96 insertions(+), 2 deletions(-) create mode 100644 mllib/osinfo.ml create mode 100644 mllib/osinfo.mli create mode 100644 mllib/osinfopath.ml diff --git a/mllib/Makefile.am b/mllib/Makefile.am index 1a21f825f..eb9753e45 100644 --- a/mllib/Makefile.am +++ b/mllib/Makefile.am @@ -19,7 +19,7 @@ include $(top_srcdir)/subdir-rules.mk EXTRA_DIST = \ $(SOURCES_MLI) \ - $(filter-out guestfs_config.ml libdir.ml,$(SOURCES_ML)) \ + $(filter-out guestfs_config.ml libdir.ml osinfopath.ml,$(SOURCES_ML)) \ $(SOURCES_C) \ common_utils_tests.ml \ getopt_tests.ml \ @@ -40,6 +40,7 @@ SOURCES_MLI = \ getopt.mli \ JSON.mli \ mkdtemp.mli \ + osinfo.mli \ planner.mli \ progress.mli \ regedit.mli \ @@ -71,7 +72,9 @@ SOURCES_ML = \ exit.ml \ checksums.ml \ xml.ml \ - xpath_helpers.ml + xpath_helpers.ml \ + osinfopath.ml \ + osinfo.ml SOURCES_C = \ ../cat/visit.c \ @@ -173,6 +176,11 @@ libdir.ml: Makefile echo 'let libdir = "$(libdir)"' > $@-t mv $@-t $@ +osinfopath.ml: Makefile + echo 'let osinfopath = "$(datadir)/libosinfo/db"' > $@-t + mv $@-t $@ + + # Tests. common_utils_tests_SOURCES = dummy.c diff --git a/mllib/osinfo.ml b/mllib/osinfo.ml new file mode 100644 index 000000000..7630c4f9c --- /dev/null +++ b/mllib/osinfo.ml @@ -0,0 +1,64 @@ +(* virt-builder + * Copyright (C) 2016 - SUSE Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + *) +open Common_utils +open Osinfopath + +let osinfo_db_read_three_levels os_path filter = + let distros = Array.to_list (Sys.readdir os_path) in + remove_duplicates ( + List.concat ( + List.map ( + fun distro -> + let distro_path = os_path // distro in + let os_files = Array.to_list (Sys.readdir distro_path) in + List.map ( + fun os_file -> + let file_path = distro_path // os_file in + let xml = read_whole_file file_path in + let doc = Xml.parse_memory xml in + let xpathctx = Xml.xpath_new_context doc in + filter xpathctx + ) os_files + ) distros + ) + ) + +let osinfo_db_read_flat os_path filter = + let os_files = Array.to_list (Sys.readdir os_path) in + remove_duplicates ( + List.map ( + fun os_file -> + let file_path = os_path // os_file in + let xml = read_whole_file file_path in + let doc = Xml.parse_memory xml in + let xpathctx = Xml.xpath_new_context doc in + filter xpathctx + ) os_files + ) + +let osinfo_read_db filter = + let path = try + Sys.getenv "OSINFO_SYSTEM_DIR" + with Not_found -> "/usr/share/osinfo" in + + try osinfo_db_read_three_levels (path // "os") filter with + | _ -> + try osinfo_db_read_three_levels (osinfopath // "os") filter with + | _ -> + try osinfo_db_read_flat (osinfopath // "oses") filter with + | _ -> [] diff --git a/mllib/osinfo.mli b/mllib/osinfo.mli new file mode 100644 index 000000000..4b881408e --- /dev/null +++ b/mllib/osinfo.mli @@ -0,0 +1,21 @@ +(* virt-builder + * Copyright (C) 2016 - SUSE Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + *) + +val osinfo_read_db : (Xml.xpathctx -> 'a) -> 'a list +(** [osinfo_read_db filter] runs the [filter] function on the + XPath context of every osinfo os description XML file. *) diff --git a/mllib/osinfopath.ml b/mllib/osinfopath.ml new file mode 100644 index 000000000..a58b8d60f --- /dev/null +++ b/mllib/osinfopath.ml @@ -0,0 +1 @@ +let osinfopath = "/usr/local/share/libosinfo/db" -- 2.11.0