use Digest::SHA;
use Text::ParseWords;
use String::ShellQuote;
+use Time::HiRes qw(usleep gettimeofday tv_interval);
our @EXPORT_OK = qw(
$IPV6RE
return $res;
}
-# Note: we use this to wait until vncterm is ready
+# Note: we use this to wait until vncterm/spiceterm is ready
sub wait_for_vnc_port {
my ($port, $timeout) = @_;
$timeout = 5 if !$timeout;
+ my $sleeptime = 0;
+ my $starttime = [gettimeofday];
+ my $elapsed;
- for (my $i = 0; $i < $timeout; $i++) {
+ while (($elapsed = tv_interval($starttime)) < $timeout) {
if (my $fh = IO::File->new ("/proc/net/tcp", "r")) {
while (defined (my $line = <$fh>)) {
if ($line =~ m/^\s*\d+:\s+([0-9A-Fa-f]{8}):([0-9A-Fa-f]{4})\s/) {
}
close($fh);
}
- sleep(1);
+ $sleeptime += 100000 if $sleeptime < 1000000;
+ usleep($sleeptime);
}
return undef;
return next_unused_port(5900, 6000);
}
+sub next_spice_port {
+ return next_unused_port(61000, 61099);
+}
+
# NOTE: NFS syscall can't be interrupted, so alarm does
# not work to provide timeouts.
# from 'man nfs': "Only SIGKILL can interrupt a pending NFS operation"
sub upid_encode {
my $d = shift;
+ # Note: pstart can be > 32bit if uptime > 497 days, so this can result in
+ # more that 8 characters for pstart
return sprintf("UPID:%s:%08X:%08X:%08X:%s:%s:%s:", $d->{node}, $d->{pid},
$d->{pstart}, $d->{starttime}, $d->{type}, $d->{id},
$d->{user});
my $filename;
# "UPID:$node:$pid:$pstart:$startime:$dtype:$id:$user"
- if ($upid =~ m/^UPID:([a-zA-Z0-9]([a-zA-Z0-9\-]*[a-zA-Z0-9])?):([0-9A-Fa-f]{8}):([0-9A-Fa-f]{8}):([0-9A-Fa-f]{8}):([^:\s]+):([^:\s]*):([^:\s]+):$/) {
+ # Note: allow up to 9 characters for pstart (work until 20 years uptime)
+ if ($upid =~ m/^UPID:([a-zA-Z0-9]([a-zA-Z0-9\-]*[a-zA-Z0-9])?):([0-9A-Fa-f]{8}):([0-9A-Fa-f]{8,9}):([0-9A-Fa-f]{8}):([^:\s]+):([^:\s]*):([^:\s]+):$/) {
$res->{node} = $1;
$res->{pid} = hex($3);
$res->{pstart} = hex($4);
sub random_ether_addr {
- my $rand = Digest::SHA::sha1_hex(rand(), time());
+ my ($seconds, $microseconds) = gettimeofday;
+
+ my $rand = Digest::SHA::sha1_hex($$, rand(), $seconds, $microseconds);
my $mac = '';
for (my $i = 0; $i < 6; $i++) {