Files
openrc/src/tools/deptree2dot
William Hubbs 630d23283a 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.
2013-01-02 18:00:04 -06:00

45 lines
1.2 KiB
Perl

#!/usr/bin/perl -w
# -*- cperl -*-
# Copyright © 2012 Diego Elio Pettenò <flameeyes@flameeyes.eu>
# 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";