#!/usr/bin/env perl # # sboconfig # script to handle sbotools configuration # # author: Jacob Pipkin # date: Pungenday, the 40th day of Discord in the YOLD 3178 # license: WTFPL 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 Fcntl; 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 %changes; while (my ($key,$value) = each %valid_confs) { $changes{$value} = $options{$key} if exists $options{$key}; } my $conf_dir = $SBO::Lib::conf_dir;; my $conf_file = $SBO::Lib::conf_file; sub make_temp_file { make_path ('/tmp/sbotools') unless -d '/tmp/sbotools'; my $temp_dir = -d '/tmp/sbotools' ? '/tmp/sbotools' : $ENV{TMPDIR} || $ENV{TEMP}; my $filename = sprintf "%s/%d-%d-0000", $temp_dir, $$, time; sysopen my ($fh), $filename, O_WRONLY|O_EXCL|O_CREAT; return ($fh,$filename); } sub config_write { script_error ('config_write requires two arguments.') unless exists $_[1]; my ($key,$val) = @_; if (! -d $conf_dir) { mkdir($conf_dir) or print "Unable to create $conf_dir. Exiting.\n" and exit (1); } if (-f $conf_file) { my ($fh,$filename) = make_temp_file(); open my $reader, '<', $conf_file; print {$fh} <$reader>; close ($fh); tie my @temp, 'Tie::File', $filename; my $has = 'FALSE'; my $regex = qr/\A\Q$key\E=/; FIRST: for my $tmpline (@temp) { if ($tmpline =~ $regex) { $has = 'TRUE'; $tmpline = "$key=$val"; last FIRST; } } untie @temp; if ($has eq 'FALSE') { open (my $writer, '>>', $filename); print {$writer} "$key=$val\n"; close ($writer); } move ($filename,$conf_file); } else { open my $writer, '>', $conf_file; print {$writer} "$key=$val\n"; close ($writer); } } while (my ($key,$value) = each %changes) { print "Setting $key to $value...\n"; config_write ($key,$value); } exit 0;