From 630d23283aea2304396069c6a9c305913ccb02aa Mon Sep 17 00:00:00 2001 From: William Hubbs Date: Wed, 2 Jan 2013 12:40:03 -0600 Subject: Add tools directory This directory will contain tools which are not necessary for OpenRC to run, but which some users have found useful. The first of these is deptree2dot, which converts /run/openrc/deptree to a .dot file for use with graphviz. This can assist in finding circular dependencies. --- src/Makefile | 4 ++++ src/tools/Makefile | 5 +++++ src/tools/deptree2dot | 44 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 53 insertions(+) create mode 100644 src/tools/Makefile create mode 100644 src/tools/deptree2dot (limited to 'src') diff --git a/src/Makefile b/src/Makefile index e375034..ffbf8d6 100644 --- a/src/Makefile +++ b/src/Makefile @@ -3,5 +3,9 @@ SUBDIR= test libeinfo librc rc +ifeq (${MKTOOLS},yes) +SUBDIR+= tools +endif + MK= ../mk include ${MK}/subdir.mk diff --git a/src/tools/Makefile b/src/tools/Makefile new file mode 100644 index 0000000..92ff506 --- /dev/null +++ b/src/tools/Makefile @@ -0,0 +1,5 @@ +DIR= ${UPREFIX}/bin +BIN= deptree2dot + +MK= ../../mk +include ${MK}/scripts.mk diff --git a/src/tools/deptree2dot b/src/tools/deptree2dot new file mode 100644 index 0000000..07ba17a --- /dev/null +++ b/src/tools/deptree2dot @@ -0,0 +1,44 @@ +#!/usr/bin/perl -w +# -*- cperl -*- +# Copyright © 2012 Diego Elio Pettenò +# Released under the 2-clause BSD license. +# +#Example usage: +#deptree2dot > deptree.dot +#deptree2dot | dot -Tpng -o deptree.png + +my $deptree = defined($ARGV[0]) ? $ARGV[0] : "/run/openrc/deptree"; + +open DEPTREE, $deptree or exit 1; + +print "digraph deptree {\n"; + +my @deptree; + +while(my $line = readline(DEPTREE)) { + $line =~ /^depinfo_([0-9]+)_([a-z]+)(?:_[0-9]+)?='(.*)'\n$/; + my $index = $1; + my $prop = $2; + my $value = $3; $value =~ s/[-\.:~]/_/g; + + if ( $prop eq "service" ) { + $deptree[$index] = $value; + printf "%s [shape=box];\n", $value; + } else { + my $service = $deptree[$index]; + + if ( $prop eq "ineed" ) { + printf "%s -> %s;\n", $service, $value; + } elsif ( $prop eq "iuse" ) { + printf "%s -> %s [color=blue];\n", $service, $value; + } elsif ( $prop eq "ibefore" ) { + printf "%s -> %s [style=dotted];\n", $service, $value; + } elsif ( $prop eq "iafter" ) { + printf "%s -> %s [style=dotted color=purple];\n", $value, $service; + } elsif ( $prop eq "iprovide" ) { + printf "%s -> %s [color=red];\n", $value, $service; + } + } +} + +print "}\n"; -- cgit v1.2.3