#!/usr/bin/env perl # # vim: set ts=4:noet # # sboconfig # script to handle sbotools configuration # # author: Jacob Pipkin # date: Pungenday, the 40th day of Discord in the YOLD 3178 # license: WTFPL use 5.16.0; use strict; use warnings FATAL => 'all'; use SBO::Lib; use File::Basename; use Getopt::Std; use File::Copy; use File::Path qw(make_path); use File::Temp qw(tempfile);; my %config = %SBO::Lib::config; my $self = basename ($0); sub show_usage () { print < 'NOCLEAN', d => 'DISTCLEAN', j => 'JOBS', p => 'PKG_DIR', s => 'SBO_HOME', ); my %params = reverse %valid_confs; if (exists $options{l}) { my @keys = sort {$a cmp $b} keys %config; say "sboconfig -$params{$_}:\n $_=$config{$_}" for @keys; exit 0; } show_usage and exit 0 unless %options; # setup what's being changed. my %changes; while (my ($key, $value) = each %valid_confs) { $changes{$value} = $options{$key} if exists $options{$key}; } if (exists $changes{JOBS}) { die "You have provided an invalid parameter for -j\n" unless ($changes{JOBS} =~ /^\d+$/ || $changes{JOBS} eq 'FALSE'); } my $conf_dir = $SBO::Lib::conf_dir; my $conf_file = $SBO::Lib::conf_file; # safely modify our conf file; copy to a temp location, edit the temp file, # move the edited file into place sub config_write ($$) { exists $_[1] or script_error 'config_write requires two arguments.'; my ($key, $val) = @_; if (! -d $conf_dir) { mkdir $conf_dir or die "Unable to create $conf_dir. Exiting.\n"; } if (-f $conf_file) { my $tempfh = tempfile (DIR => $SBO::Lib::tempdir); my $tempfn = get_tmp_perlfn $tempfh; copy ($conf_file, $tempfn); # tie the file so that if $key is already there, we just change that # line and untie it tie my @temp, 'Tie::File', $tempfn; my $has = 0; my $regex = qr/\A\Q$key\E=/; FIRST: for my $tmpline (@temp) { $has++, $tmpline = "$key=$val", last FIRST if $tmpline =~ $regex; } untie @temp; # otherwise, append our new $key=$value pair unless ($has) { my $fh = open_fh ($tempfn, '>>'); print {$fh} "$key=$val\n"; close $fh; } move ($tempfn, $conf_file); } else { # no config file, easiest case of all. my $fh = open_fh $conf_file, '>'; say {$fh} "$key=$val"; close $fh; } } while (my ($key, $value) = each %changes) { print "Setting $key to $value...\n"; config_write $key, $value; } exit 0;