diff --git a/lib/perl/OVH/Bastion/log.inc b/lib/perl/OVH/Bastion/log.inc index cf836ab..b7c9d67 100644 --- a/lib/perl/OVH/Bastion/log.inc +++ b/lib/perl/OVH/Bastion/log.inc @@ -223,23 +223,25 @@ EOS # endof version==0 if ($user_version == 1) { - # add proxy columns for proxyjump feature + # add proxy columns for the proxyjump feature. Use a transaction so that if we're interrupted, + # the rollback leaves the db untouched at version 1 and the next run retries cleanly. my $table = ($sqltype eq 'local' ? "connections" : "connections_summary"); - $dbh->do("ALTER TABLE $table ADD COLUMN proxyuser TEXT") - or return R('KO', msg => "adding proxyuser column to $table"); + $dbh->begin_work or return R('KO', msg => "starting transaction to upgrade $table to v2"); - $dbh->do("ALTER TABLE $table ADD COLUMN proxyip TEXT") - or return R('KO', msg => "adding proxyip column to $table"); + my $ok = + $dbh->do("ALTER TABLE $table ADD COLUMN proxyuser TEXT") + && $dbh->do("ALTER TABLE $table ADD COLUMN proxyip TEXT") + && $dbh->do("ALTER TABLE $table ADD COLUMN proxyhost TEXT") + && $dbh->do("ALTER TABLE $table ADD COLUMN proxyport INTEGER") + && $dbh->do("PRAGMA user_version=2"); - $dbh->do("ALTER TABLE $table ADD COLUMN proxyhost TEXT") - or return R('KO', msg => "adding proxyhost column to $table"); - - $dbh->do("ALTER TABLE $table ADD COLUMN proxyport INTEGER") - or return R('KO', msg => "adding proxyport column to $table"); + if (!$ok) { + $dbh->rollback; + return R('KO', msg => "adding proxy columns to $table"); + } - $dbh->do("PRAGMA user_version=2") - or return R('KO', msg => "setting user_version to 2"); + $dbh->commit or return R('KO', msg => "committing v2 upgrade of $table"); $user_version = 2; }