Quoth John Nielsen <lists at jnielsen.net>:>
> I have a script that builds virtual FreeBSD disk images. After it
> populates the base system it runs "freebsd-update -b ${MOUNTPOINT}
..."
> to update the image with the latest security patch release.
>
> If I run the script from a terminal it works fine. However if I try to
> run it from our user-friendly web interface (which spawns the script in
> the background with no tty) the freebsd-update step fails:
>
> # UNAME_r=10.0-RELEASE freebsd-update -b /mnt/chroot fetch
> freebsd-update fetch should not be run non-interactively.
> Run freebsd-update cron instead.
>
> I understand and appreciate the use case for 'freebsd-update cron'
but
> in this case my script is running because a user requested and is
> waiting for it, and a delay of up to an hour won't really fly.
>
> Can anyone suggest a workaround?
The obvious answer would be to run it on a pty. If you can't easily do
this from your script directly, something like this might do:
#!/usr/bin/perl
use IO::Pty;
use IO::Select;
my $pt = IO::Pty->new;
my $sl = $pt->slave;
unless (my $kid = fork) {
close $pt;
open STDIN, "<&", $sl;
open STDOUT, ">&", $sl;
open STDERR, ">&", $sl;
close $sl;
exec @ARGV;
}
close $sl;
my $sel = IO::Select->new($pt);
$pt->blocking(0);
$/ = \4096; $| = 1;
while (1) {
$sel->can_read;
$_ = <$pt>;
defined or last;
print;
}
waitpid $kid, 0;
exit $?>>8 ? $?>>8 : $? ? 1 : 0;
Add proper error checking / signal handling / etc. to taste.
Ben