openpkg/rpmlua

Thu, 04 Oct 2012 20:30:05 +0200

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Thu, 04 Oct 2012 20:30:05 +0200
changeset 715
c10fb90893b9
permissions
-rw-r--r--

Correct out of date build configuration, porting to Solaris 11 network
link infrastructure and new libpcap logic. This additionally allows for
device drivers in subdirectories of /dev. Correct packaged nmap
personalities and signatures to work out of the box. Finally, hack
arpd logic to properly close sockets and quit on TERM by repeating
signaling in the run command script. Sadly, all this fails to correct
the run time behaviour of honeyd which fails to bind to the IP layer.

     1 --
     2 --  rpmlua -- OpenPKG RPM Lua Script
     3 --  Copyright (c) 2000-2012 OpenPKG GmbH <http://openpkg.com/>
     4 --
     5 --  This software is property of the OpenPKG GmbH, DE MUC HRB 160208.
     6 --  All rights reserved. Licenses which grant limited permission to use,
     7 --  copy, modify and distribute this software are available from the
     8 --  OpenPKG GmbH.
     9 --
    10 --  THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED
    11 --  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
    12 --  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
    13 --  IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR
    14 --  CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
    15 --  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
    16 --  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
    17 --  USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
    18 --  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
    19 --  OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
    20 --  OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    21 --  SUCH DAMAGE.
    22 --
    24 --
    25 --  The purpose of this Lua script is to extend the default Lua functions
    26 --  in the OpenPKG RPM installation for the @l_prefix@ hierarchy.
    27 --
    29 --  provide namespace
    30 openpkg = {}
    32 --  small wrapper around the realpath(3) call provided by RPM
    33 function openpkg.realpath(path)
    34     if posix.stat(path) ~= nil then
    35         --  path exists, so resolve as a whole
    36         path = rpm.realpath(path)
    37     else
    38         --  path not exists, so recursively resolve only prefix
    39         local s, _, m = util.rmatch(path, "^(.+?)/([^/]+)/?$")
    40         if s ~= nil then
    41             local prefix = openpkg.realpath(m[1])
    42             if util.rmatch(prefix, "/$") == nil then
    43                 prefix = prefix .. "/"
    44             end
    45             path = prefix .. m[2]
    46         end
    47     end
    48     return path
    49 end
    51 --  try to reduce real path to symbolic one (if posssible)
    52 function openpkg.unrealpath(path, prefix_unreal)
    53     local prefix_real = openpkg.realpath(prefix_unreal)
    54     if prefix_real ~= prefix_unreal then
    55         if string.sub(path, 1, string.len(prefix_real)) == prefix_real then
    56             path = prefix_unreal .. string.sub(path, string.len(prefix_real)+1)
    57         end
    58     end
    59     return path
    60 end
    62 --  canonicalize filesystem path as good as possible
    63 function openpkg.canonicalize(path)
    64     path = openpkg.unrealpath(path, os.getenv("PWD"))
    65     path = openpkg.unrealpath(path, rpm.expand("%{l_prefix}"))
    66     return path
    67 end
    69 --  temporary directory determination
    70 function openpkg.tmpdir()
    71     local tmpdir = os.getenv("TMPDIR")
    72     if tmpdir ~= nil then
    73         tmpdir = openpkg.canonicalize(openpkg.realpath(tmpdir))
    74     else
    75         tmpdir = "/tmp"
    76     end
    77     tmpdir = tmpdir .. "/openpkg"
    78     return tmpdir
    79 end
    81 --  layout determination: RPM Lua based implementation
    82 function openpkg.layout(args)
    83     local dir = ""
    85     --   parse arguments
    86     local arg = {
    87         variable   = "",
    88         layout     = "",
    89         macrosfile = "",
    90         basedir    = "",
    91         shared     = "no",
    92         debug      = "no",
    93         specdir    = "",
    94         sourcedir  = "",
    95         builddir   = "",
    96         tmppath    = "",
    97         rpmdir     = "",
    98         srcrpmdir  = ""
    99     }
   100     local arg_map_fwd = {
   101         binrpmdir = "rpmdir",
   102         tmpdir    = "tmppath"
   103     }
   104     local arg_map_rev = {
   105         rpmdir    = "binrpmdir",
   106         tmppath   = "tmpdir"
   107     }
   108     if rpm.debug() then
   109         arg.debug = "yes"
   110     end
   111     util.rsubst(args, "(?s)\\s*([a-z_][a-zA-Z0-9_-]*)=(?:\"((?:\\\\.|[^\"])*)\"|(\\S*))",
   112         function (key, _, value1, value2)
   113             if arg_map_fwd[key] ~= nil then
   114                 key = arg_map_fwd[key]
   115             end
   116             if arg[key] == nil then
   117                 io.stderr:write("rpm: invalid parameter \"" .. key .. "\" on call to \"openpkg.layout()\"\n")
   118             else
   119                 if value1 ~= nil then arg[key] = value1 else arg[key] = value2 end
   120             end
   121             return false
   122         end
   123     )
   124     if arg.variable == "" then
   125         io.stderr:write("rpm: missing \"variable\" parameter on call to \"openpkg.layout()\"\n")
   126         return ""
   127     end
   128     if arg.layout == "" then
   129         io.stderr:write("rpm: missing \"layout\" parameter on call to \"openpkg.layout()\"\n")
   130         return ""
   131     end
   132     if arg.macrosfile == "" and arg.basedir == "" then
   133         io.stderr:write("rpm: missing \"macrosfile\" or \"basedir\" parameter on call to \"openpkg.layout()\"\n")
   134         return ""
   135     end
   137     --   determine base directory
   138     if arg.basedir == "" then
   139         if util.rmatch(arg.macrosfile, "^.*/\.openpkg/rpmmacros$") ~= nil then
   140             arg.basedir = openpkg.canonicalize(openpkg.realpath(
   141                 util.rsubst(
   142                     openpkg.realpath(arg.macrosfile),
   143                     "/[^/]+$", "/.."
   144                 )
   145             ))
   146         else
   147             arg.basedir = rpm.expand("%{l_prefix}")
   148         end
   149     end
   151     --  temporarily define "__openpkg_basedir" macro
   152     rpm.define("__openpkg_basedir " .. arg.basedir)
   154     --  temporarily define "__openpkg_shared" macro
   155     if arg.shared == "yes" then
   156         rpm.define("__openpkg_shared yes")
   157     end
   159     --  determine layout directory list
   160     local list = ""
   161     if arg[arg.variable] ~= nil and arg[arg.variable] ~= "" then
   162         list = arg[arg.variable]
   163     else
   164         list = rpm.expand(
   165             "%{?__openpkg_layout_" .. arg.layout .. "_" .. arg.variable .. "}" ..
   166             "%{!?__openpkg_layout_" .. arg.layout .. "_" .. arg.variable .. ":" ..
   167             "%{__openpkg_layout_global_" .. arg.variable .. "}}"
   168         )
   169     end
   171     --  remove temporarily defined "__openpkg_basedir" macro
   172     rpm.undefine("__openpkg_basedir")
   174     --  remove temporarily defined "__openpkg_shared" macro
   175     if arg.shared == "yes" then
   176         rpm.undefine("__openpkg_shared")
   177     end
   179     --  iterate over all directory specifications
   180     local dirs = util.rsplit(list, "(?s)\\s+")
   181     local k = table.maxn(dirs)
   182     for i, _ in ipairs(dirs) do
   183         --  parse specification into path to check and optionally path to make
   184         local path_check  = dirs[i]
   185         local path_append = false
   186         local path_make   = path_check
   187         local s, _, m = util.rmatch(path_check, "^(.+):(\\+?)(.*)$")
   188         if s ~= nil then
   189             path_check  = m[1]
   190             path_append = (m[2] == "+")
   191             path_make   = m[3]
   192         end
   193         --  check whether path should be taken (last path is always taken)
   194         if posix.stat(path_check) ~= nil or i == k then
   195             if path_append then
   196                 --  special case: simply append a suffix
   197                 dir = path_check .. path_make
   198             else
   199                 --  regular case: use full path to make
   200                 dir = path_make
   201             end
   202             break
   203         end
   204     end
   205     if dir ~= "" then
   206         --  make sure path really exists and resolve to absolute path
   207         if posix.stat(dir) == nil then
   208             io.stderr:write("rpm: creating \"" .. arg.variable .. "\" directory \"" .. dir .. "\"\n")
   209             if posix.mkdir(dir) ~= 0 then
   210                 io.stderr:write("rpm: failed to create directory \"" .. dir .. "\"\n")
   211             end
   212         end
   213         dir = openpkg.canonicalize(openpkg.realpath(dir))
   214     end
   216     --  debugging
   217     if arg.debug == "yes" then
   218         local variable = arg.variable
   219         if arg_map_rev[variable] ~= nil then
   220             variable = arg_map_rev[variable]
   221         end
   222         io.stderr:write(string.format("rpm: openpkg: layout: [%s] %s = \"%s\"\n", arg.layout, variable, dir))
   223     end
   225     --  provide result directory
   226     return dir
   227 end

mercurial