Commit message (Expand) | Author | Age | Files | Lines | ||
---|---|---|---|---|---|---|
... | ||||||
* | | 5129 | Kartik Agaram | 2019-04-27 | 1 | -29/+32 | |
* | | 5128 | Kartik Agaram | 2019-04-26 | 1 | -9/+48 | |
* | | 5127 | Kartik Agaram | 2019-04-26 | 1 | -1/+1 | |
|/ | ||||||
* | 5126 - add a message to a silent CI failure mode | Kartik Agaram | 2019-04-26 | 1 | -19/+19 | |
* | 5125 | Kartik Agaram | 2019-04-25 | 2 | -8/+9 | |
* | 5124 | Kartik Agaram | 2019-04-23 | 4 | -4/+4 | |
* | 5123 | Kartik Agaram | 2019-04-23 | 2 | -967/+959 | |
* | 5122 | Kartik Agaram | 2019-04-23 | 2 | -7/+7 | |
* | 5121 | Kartik Agaram | 2019-04-23 | 2 | -2/+2 | |
* | 5120 | Kartik Agaram | 2019-04-23 | 1 | -1/+1 | |
* | 5119 | Kartik Agaram | 2019-04-23 | 15 | -10307/+11549 | |
* | 5118 - convert int to string | Kartik Agaram | 2019-04-23 | 9 | -0/+285 | |
* | 5117 | Kartik Agaram | 2019-04-23 | 1 | -0/+1 | |
* | 5116 | Kartik Agaram | 2019-04-23 | 1 | -0/+1 | |
* | 5115 | Kartik Agaram | 2019-04-22 | 2 | -1/+1 | |
* | 5114 - helper for idiv instruction | Kartik Agaram | 2019-04-21 | 2 | -0/+40 | |
* | 5113 - x86's integer division (idiv) instruction | Kartik Agaram | 2019-04-21 | 2 | -2/+94 | |
* | 5112 | Kartik Agaram | 2019-04-19 | 2 | -1/+63 | |
* | 5111 | Kartik Agaram | 2019-04-18 | 1 | -3/+3 | |
* | 5110 | Kartik Agaram | 2019-04-18 | 1 | -2/+3 | |
* | Merge pull request #19 from akkartik/label-imm32-arg | Kartik Agaram | 2019-04-18 | 1 | -0/+13 | |
|\ | ||||||
| * | Add functionality to support labels as imm32 arguments to opcodes | nc | 2019-04-18 | 1 | -0/+13 | |
pre { line-height: 125%; }
td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
.highlight .hll { background-color: #ffffcc }
.highlight .c { color: #888888 } /* Comment */
.highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */
.highlight .k { color: #008800; font-weight: bold } /* Keyword */
.highlight .ch { color: #888888 } /* Comment.Hashbang */
.highlight .cm { color: #888888 } /* Comment.Multiline */
.highlight .cp { color: #cc0000; font-weight: bold } /* Comment.Preproc */
.highlight .cpf { color: #888888 } /* Comment.PreprocFile */
.highlight .c1 { color: #888888 } /* Comment.Single */
.highlight .cs { color: #cc0000; font-weight: bold; background-color: #fff0f0 } /* Comment.Special */
.highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */
.highlight .ge { font-style: italic } /* Generic.Emph */
.highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */
.highlight .gr { color: #aa0000 } /* Generic.Error */
.highlight .gh { color: #333333 } /* Generic.Heading */
.highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */
.highlight .go { color: #888888 } /* Generic.Output */
.highlight .gp { color: #555555 } /* Generic.Prompt */
.highlight .gs { font-weight: bold } /* Generic.Strong */
.highlight .gu { color: #666666 } /* Generic.Subheading */
.highlight .gt { color: #aa0000 } /* Generic.Traceback */
.highlight .kc { color: #008800; font-weight: bold } /* Keyword.Constant */
.highlight .kd { color: #008800; font-weight: bold } /* Keyword.Declaration */
.highlight .kn { color: #008800; font-weight: bold } /* Keyword.Namespace */
.highlight .kp { color: #008800 } /* Keyword.Pseudo */
.highlight .kr { color: #008800; font-weight: bold } /* Keyword.Reserved */
.highlight .kt { color: #888888; font-weight: bold } /* Keyword.Type */
.highlight .m { color: #0000DD; font-weight: bold } /* Literal.Number */
.highlight .s { color: #dd2200; background-color: #fff0f0 } /* Literal.String */
.highlight .na { color: #336699 } /* Name.Attribute */
.highlight .nb { color: #003388 } /* Name.Builtin */
.highlight .nc { color: #bb0066; font-weight: bold } /* Name.Class */
.highlight .no { color: #003366; font-weight: bold } /* Name.Constant */
.highlight .nd { color: #555555 } /* Name.Decorator */
.highlight .ne { color: #bb0066; font-weight: bold } /* Name.Exception */
.highlight .nf { color: #0066bb; font-weight: bold } /* Name.Function */
.highlight .nl { color: #336699; font-style: italic } /* Name.Label */
.highlight .nn { color: #bb0066; font-weight: bold } /* Name.Namespace */
.highlight .py { color: #336699; font-weight: bold } /* Name.Property */
.highlight .nt { color: #bb0066; font-weight: bold } /* Name.Tag */
.highlight .nv { color: #336699 } /* Name.Variable */
.highlight .ow { color: #008800 } /* Operator.Word */
.highlight .w { color: #bbbbbb } /* Text.Whitespace */
.highlight .mb { color: #0000DD; font-weight: bold } /* Literal.Number.Bin */
.highlight .mf { color: #0000DD; font-weight: bold } /* Literal.Number.Float */
.highlight .mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */
.highlight .mi { color: #0000DD; font-weight: bold } /* Literal.Number.Integer */
.highlight .mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */
.highlight .sa { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Affix */
.highlight .sb { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Backtick */
.highlight .sc { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Char */
.highlight .dl { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Delimiter */
.highlight .sd { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Doc */
.highlight .s2 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Double */
.highlight .se { color: #0044dd; background-color: #fff0f0 } /* Literal.String.Escape */
.highlight .sh { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Heredoc */
.highlight .si { color: #3333bb; background-color: #fff0f0 } /* Literal.String.Interpol */
.highlight .sx { color: #22bb22; background-color: #f0fff0 } /* Literal.String.Other */
.highlight .sr { color: #008800; background-color: #fff0ff } /* Literal.String.Regex */
.highlight .s1 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Single */
.highlight .ss { color: #aa6600; background-color: #fff0f0 } /* Literal.String.Symbol */
.highlight .bp { color: #003388 } /* Name.Builtin.Pseudo */
.highlight .fm { color: #0066bb; font-weight: bold } /* Name.Function.Magic */
.highlight .vc { color: #336699 } /* Name.Variable.Class */
.highlight .vg { color: #dd7700 } /* Name.Variable.Global */
.highlight .vi { color: #3333bb } /* Name.Variable.Instance */
.highlight .vm { color: #336699 } /* Name.Variable.Magic */
.highlight .il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */#!/usr/bin/perl
use strict;
use warnings;
use feature 'say';
use IPC::Run3;
use Path::Tiny;
use Config::Tiny;
use Getopt::Long qw/ GetOptions /;
# Options.
my %options = (
encrypt => $ENV{LEO_ENCRYPT},
sign => $ENV{LEO_SIGN},
sign => $ENV{LEO_SIGNIFY},
);
GetOptions(
\%options,
qw{ verbose encrypt sign signify delete help }
) or die "Error in command line arguments\n";
# Configuration.
my $config_file = $ENV{XDG_CONFIG_HOME} || "$ENV{HOME}/.config";
$config_file .= "/leo.conf";
my $config = Config::Tiny->new;
$config = Config::Tiny->read( $config_file )
or die "Cannot read config file: `$config_file'\n";
# Reading config file.
foreach my $key (sort keys $config->{_}->%*) {
$options{$key} = $config->{_}->{$key};
}
my %profile;
foreach my $section (sort keys $config->%*) {
next if $section eq "_";
# Set global values to local profiles.
foreach (qw( encrypt sign signify )) {
$profile{$section}{$_} = $options{$_};
}
foreach my $key (sort keys $config->{$section}->%*) {
# Override encrypt & sign options with local values.
if ($key eq "encrypt"
or $key eq "sign"
or $key eq "signify") {
$profile{$section}{$key} = $config->{$section}->{$key};
next;
}
push @{ $profile{$section}{exclude} }, $key and next
if $config->{$section}->{$key} eq "exclude";
push @{ $profile{$section}{backup} }, $key;
}
}
my $ymd = ymd(); # YYYY-MM-DD.
my $backup_dir = $options{backup_dir} || "/tmp/backups";
$backup_dir .= "/$ymd";
path($backup_dir)->mkpath; # Create backup directory.
my $gpg_fingerprint = $options{gpg_fingerprint} || "`nil'";
my $gpg_bin = $options{gpg_bin} || "gpg";
# Print help.
HelpMessage() and exit 0 if scalar @ARGV == 0 or $options{help};
# Parsing the arguments.
foreach my $prof ( @ARGV ) {
if ( $profile{ $prof } ) {
say "++++++++********++++++++";
backup($prof);
# It will fail because signify will look for "${prof}.tar" but
# delete option would've deleted it. I can make signify look
# for "${prof}.tar.gpg" but this is fine for now.
warn "[WARN] signify might fail if used with gpg\n"
if ($profile{$prof}{signify}
and ($profile{$prof}{encrypt} or $profile{$prof}{sign}));
signify($prof) if $profile{$prof}{signify};
encrypt_sign($prof) if $profile{$prof}{sign} or $profile{$prof}{encrypt};
} else {
warn "[WARN] leo: no such profile :: `$prof' \n";
}
}
sub backup {
my $prof = shift @_;
my $tar_file = "$backup_dir/${prof}.tar";
# Make @backup_paths relative to '/'.
my @backup_paths;
my @tmp_exclude;
@tmp_exclude = $profile{$prof}{exclude}->@*
if $profile{$prof}{exclude};
my %exclude_paths = map { $_ => 1 } @tmp_exclude;
my @tmp_paths = $profile{$prof}{backup}->@*;
while (my $path = shift @tmp_paths) {
if (-d $path) {
my $iter = path($path)->iterator();
while ( my $path = $iter->() ) {
push @backup_paths, path( $path )->relative('/')
unless $exclude_paths{$path};
}
} else {
push @backup_paths, path( $path )->relative('/');
}
}
say "Backup: $tar_file";
warn "[WARN] $tar_file exists, might overwrite.\n" if -e $tar_file;
print "\n";
# All paths should be relative to '/'.
tar_create($tar_file, "-C", '/', @backup_paths);
$? # tar returns 1 on errors.
? die "Backup creation failed :: $?\n"
# Print absolute paths for all backup files/directories.
: say path($_)->absolute('/'), " backed up." foreach @backup_paths;
print "\n" and tar_list($tar_file) if $options{verbose};
}
# Encrypt, Sign backups.
sub encrypt_sign {
my $prof = shift @_;
my $file = "$backup_dir/${prof}.tar";
my @options = ();
push @options, "--recipient", $gpg_fingerprint, "--encrypt"
if $profile{$prof}{encrypt};
push @options, "--sign" if $profile{$prof}{sign};
push @options, "--verbose" if $options{verbose};
say "\nEncrypt/Sign: $file";
warn "[WARN] $file.gpg exists, might overwrite.\n" if -e "$file.gpg";
run3 [$gpg_bin, "--yes", "-o", "$file.gpg", @options, $file];
$? # We assume non-zero is an error.
? die "Encrypt/Sign failed :: $?\n"
: print "\nOutput: $file.gpg";
print " [Encrypted]" if $profile{$prof}{encrypt};
print " [Signed]" if $profile{$prof}{sign};
print "\n";
unlink $file and say "$file deleted."
or warn "[WARN] Could not delete $file: $!\n";
}
sub signify {
my $prof = shift @_;
my $file = "$backup_dir/${prof}.tar";
die "\nSignify: seckey doesn't exist\n"
unless $options{signify_seckey} and -e $options{signify_seckey};
my @options = ("-S");
push @options, "-s", $options{signify_seckey};
push @options, "-m", $file;
push @options, "-x", "$file.sig";
say "\nSignify: $file";
warn "[WARN] $file.sig exists, might overwrite.\n" if -e "$file.sig";
run3 ["signify", @options];
$? # We assume non-zero is an error.
? die "Signify failed :: $?\n"
: print "\nOutput: $file.sig";
print " [Signify]";
print "\n";
}
sub HelpMessage {
say qq{Backup files to $backup_dir.
Profile:};
foreach my $prof (sort keys %profile) {
print " $prof";
print " [Encrypt]" if $profile{$prof}{encrypt};
print " [Sign]" if $profile{$prof}{sign};
print " [Signify]" if $profile{$prof}{signify};
print "\n";
print " $_\n" foreach $profile{$prof}{backup}->@*;
print "\n";
}
print qq{Options:
--encrypt };
print "[Enabled]" if $options{encrypt};
print qq{
Encrypt files with $gpg_fingerprint\n
--sign };
print "[Enabled]" if $options{sign};
print qq{
Sign files with $gpg_fingerprint\n
--delete };
print "[Enabled]" if $options{delete};
print qq{
Delete the tar file after running $gpg_bin\n
--verbose
--help
};
}
sub tar_create { run3 ["/bin/tar", "cf", @_]; }
sub tar_list { run3 ["/bin/tar", "tvf", @_]; }
sub ymd {
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) =
localtime(time);
$year += 1900; # $year contains the number of years since 1900.
# $mon the month in the range 0..11 , with 0 indicating January
# and 11 indicating December.
my @months = qw( 01 02 03 04 05 06 07 08 09 10 11 12 );
my $month = $months[$mon];
$mday = sprintf "%02d", $mday;
return "$year-$month-$mday";
}
|