+# last time this thing was connected
+sub last_connect
+{
+ my $call = uc shift;
+ return $main::systime if DXChannel::get($call);
+ my $user = DXUser::get($call);
+ return $user ? $user->lastin : 0;
+}
+
+# disconnect a locally connected thing
+sub disconnect
+{
+ my $call = shift;
+ run_cmd("disconnect $call");
+}
+
+# start a connect process off
+sub start_connect
+{
+ my $call = shift;
+ # connecting is now done in one place - Yeah!
+ run_cmd("connect $call");
+}
+
+# spawn any old job off
+sub spawn
+{
+ my $line = shift;
+
+ my $fc = Mojo::IOLoop::ForkCall->new;
+ $fc->run(
+ sub {my @res = `$line`; return @res},
+ [],
+ sub {
+ my ($fc, $err, @res) = @_;
+ if (defined $err) {
+ my $s = "DXCron::spawn: error $err";
+ dbg($s);
+ return;
+ }
+ for (@res) {
+ chomp;
+ dbg("DXCron::spawn: $_") if isdbg("cron");
+ }
+ }
+ );
+}
+
+sub spawn_cmd
+{
+ my $line = shift;
+
+ dbg("spawn_cmd run: $line") if isdbg('cron');
+ my $fc = Mojo::IOLoop::ForkCall->new;
+ $fc->run(
+ sub {my @res = DXCommandmode::run_cmd($main::me, $line); return @res},
+ [],
+ sub {
+ my ($fc, $err, @res) = @_;
+ if (defined $err) {
+ my $s = "spawn_cmd: error $err";
+ dbg($s);
+ }
+ for (@res) {
+ chomp;
+ dbg("spawn_cmd: $_") if isdbg("cron");
+ }
+ }
+ );
+}
+
+# do an rcmd to another cluster from the crontab
+sub rcmd
+{
+ my $call = uc shift;
+ my $line = shift;
+
+ # can we see it? Is it a node?
+ my $noderef = Route::Node::get($call);
+ return unless $noderef && $noderef->version;
+
+ # send it
+ DXProt::addrcmd($main::me, $call, $line);
+}
+
+sub run_cmd
+{
+ my $line = shift;
+ my @in = DXCommandmode::run_cmd($main::me, $line);
+ dbg("cmd run: $line") if isdbg('cron');
+ for (@in) {
+ s/\s*$//og;
+ dbg("cmd out: $_") if isdbg('cron');
+ }
+}