From ff09b1ff474333d8f7e51a8f4ef84a2f9cd9e395 Mon Sep 17 00:00:00 2001 From: Tzafrir Cohen Date: Tue, 2 Mar 2010 14:55:22 +0000 Subject: dump_sys_state: dump procfs / sysfs data to a subdirectory git-svn-id: http://svn.asterisk.org/svn/dahdi/tools/trunk@8211 a0bf4364-ded3-4de4-8d8a-66a801d63aff --- build_tools/dump_sys_state | 147 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 147 insertions(+) create mode 100755 build_tools/dump_sys_state diff --git a/build_tools/dump_sys_state b/build_tools/dump_sys_state new file mode 100755 index 0000000..97456d5 --- /dev/null +++ b/build_tools/dump_sys_state @@ -0,0 +1,147 @@ +#!/bin/sh + +# dump_sys_state: dump some /sys and /proc files to a directory. +# $Id$ +# +# Written by Tzafrir Cohen +# Copyright (C) 2009, Xorcom +# +# All rights reserved. +# +# 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 + +# The DAHDI-perl modules will use such a dump instead of the files from +# the real system if DAHDI_VIRT_TOP is set to the root. +# +# ./build_tools/dump_sys_state my_sys_state +# +# # And then later: +# DAHDI_VIRT_TOP="$PWD/my_sys_state" dahdi_genconf + +name=dahdi_sys_state_dump + +usage() { + echo "$0: dump system data for Dahdi-Perl" + echo "Usage: $0 []]" + echo "" + echo ": name of directory/tarball to create. Default: $name" +} + +output_tar() { + gzip -9 >$name.tar.gz +} + +output_cpio() { + gzip -9 >$name.cpio.gz +} + +output_dir() { + rm -rf $name + mkdir -p $name + cd $name + #tar xf - + cpio -id +} + +# Give usage message on expected texts +case $1 in + help | -* ) usage; exit 1;; +esac + +if [ "$1" != '' ]; then + name="$1" +fi + +# funky permissions on procfs. Sadly rm -f does not kill them. +if [ -d "$name" ]; then + chmod -R u+w "$name" +fi +rm -rf "$name" +mkdir -p "$name" + +# delete a (potentially empty) list of files +rm_files() { + xargs rm -f rm_files_non_existing_file +} + +if [ -r /proc/bus/usb/devices ]; then + mkdir -p "$name/proc/bus/usb" + cp -a /proc/bus/usb/devices "$name/proc/bus/usb/" +fi + +if [ -d /proc/dahdi ]; then + mkdir -p "$name/proc/dahdi" + if find /proc/dahdi -type f >/dev/null; then + cp -a /proc/dahdi/* "$name/proc/dahdi/" + fi +fi + +if [ -d /proc/xpp ]; then + mkdir -p "$name/proc/xpp" + if find /proc/xpp -type f >/dev/null; then + cp -a /proc/xpp/* "$name/proc/xpp/" + find "$name/proc/xpp" -type f -name command | rm_files + fi +fi + +# FIXME: the following grab tons of files from sysfs. Any way to do with +# less information? +pci_dev_pat='/sys/devices/pci*' +mkdir -p "$name/sys/devices" +cp -a $pci_dev_pat "$name/sys/devices/" 2>/dev/null + +for bus in astribanks xpds pci pci_express usb; do + if [ -d /sys/bus/$bus ]; then + mkdir -p "$name/sys/bus/" + cp -a /sys/bus/$bus "$name/sys/bus/" 2>/dev/null + fi +done + +# Remove PCI devices of irelevan classes: +irrelevant_devs() { + grep . "$name"/$pci_dev_pat/0*/class "$name"/$pci_dev_pat/0*/0*/class \ + | perl -n -e '# Perl provides commented regexes: + next unless m{/class:( # The following is a list of device classes + # that can be safely removed: + 0x060000 | # Host bridge + 0x030000 | # VGA compatible controller + 0x038000 | # Display controller + 0x040300 | # Audio device + 0x060401 | # PCI bridge + 0x060100 | # ISA bridge + 0x01018a | # IDE interface + 0x01018f | # IDE interface + 0x0c0500 | # SMBus + 0x060700 | # CardBus bridge + 0x0c0010 | # FireWire (IEEE 1394) + # The following are not to be removed: + #0x0c0300 | # USB Controller (UHCI?) + #0x060400 | # PCI bridge + #0x0c0320 | # USB Controller (EHCI?) + #0x020000 | # Ethernet controller + #0x0c0010 | # Network controller: (Wifi?) + )$}x; + # Leave out just the name of the node: + s{/[^/]*$}{}; + print; + print "\n" + ' +} + +# FIXME: deleting those seems to remove common 'vendor' directories +# and mess things up. Skip it for now. +#rm -rf `irrelevant_devs` + -- cgit v1.2.3