Compare commits
10 commits
d69b385526
...
30a09ff809
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
30a09ff809 | ||
|
|
10e3e1f745 | ||
|
|
12dce591bb | ||
|
|
c7b5feb111 | ||
|
|
5fe9b6b02b | ||
|
|
f4df252683 | ||
|
|
a5ab4366ae | ||
|
|
7781fedfd0 | ||
|
|
327abea47e | ||
|
|
4d3bf41473 |
36 changed files with 425 additions and 768 deletions
13
.gitignore
vendored
13
.gitignore
vendored
|
|
@ -3,3 +3,16 @@
|
||||||
.vstags
|
.vstags
|
||||||
*.tdy
|
*.tdy
|
||||||
*.bak
|
*.bak
|
||||||
|
**/.vscode
|
||||||
|
.vscode/*
|
||||||
|
!.vscode/settings.json
|
||||||
|
!.vscode/tasks.json
|
||||||
|
!.vscode/launch.json
|
||||||
|
!.vscode/extensions.json
|
||||||
|
!.vscode/*.code-snippets
|
||||||
|
|
||||||
|
# Local History for Visual Studio Code
|
||||||
|
.history/
|
||||||
|
|
||||||
|
# Built Visual Studio Code Extensions
|
||||||
|
*.vsix
|
||||||
4
05_fuse
4
05_fuse
|
|
@ -1,4 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
#Copy this to /etc/pm/sleep.d
|
|
||||||
#Unmount all sshfs mounts before system goes to sleep so tasks do not refuse to sleep
|
|
||||||
mount -l -t fuse.sshfs | awk -F " " '{print "fusermount -u " $3}' | bash
|
|
||||||
22
README.md
22
README.md
|
|
@ -1,4 +1,18 @@
|
||||||
# ZSH Bash and other config files for personal use
|
# Various shell utility scripts
|
||||||
# File processing scripts to archive financial files from previous year
|
|
||||||
## TODO
|
## File processing
|
||||||
None
|
Archive financial files from previous year and set up directory structure for current year
|
||||||
|
|
||||||
|
## gnome
|
||||||
|
Old customizer scripts for gnome
|
||||||
|
|
||||||
|
## nextcloud
|
||||||
|
WIP - Install all missing needed modules for Nextcloud on a server
|
||||||
|
|
||||||
|
## utility
|
||||||
|
Miscellaneous scripts, e.g. set screen brightness from command line (bug workaround)
|
||||||
|
|
||||||
|
## Other
|
||||||
|
* Backup and restore scripts for packages installed on Solus OS
|
||||||
|
* Set up a Solus OS development environment (update needed)
|
||||||
|
* Backup and restore scripts for Linux systems
|
||||||
|
|
|
||||||
5
file_processing/README.md
Normal file
5
file_processing/README.md
Normal file
|
|
@ -0,0 +1,5 @@
|
||||||
|
# archive_statements.pl and archive_taxes.pl
|
||||||
|
|
||||||
|
## Requirements
|
||||||
|
|
||||||
|
cpanm -S File::Find::Rule File::Copy::Recursive File::DirCompare Time::Piece Test2::V0 Test2::Plugin::NoWarnings Modern::Perl
|
||||||
|
|
@ -1,87 +1,35 @@
|
||||||
#!/usr/bin/perl
|
#!/usr/bin/perl
|
||||||
use strict;
|
use Modern::Perl;
|
||||||
use warnings;
|
use ProcessDirectories;
|
||||||
|
|
||||||
# Script to archive the financial data from the previous year
|
# Script to archive the financial data from the previous year
|
||||||
use Time::Piece;
|
|
||||||
use File::Basename;
|
|
||||||
use File::Find::Rule;
|
|
||||||
use File::Copy::Recursive qw(dircopy);
|
|
||||||
use File::DirCompare;
|
|
||||||
use Carp qw( croak );
|
use Carp qw( croak );
|
||||||
|
# use File::Basename;
|
||||||
|
# use File::Find::Rule;
|
||||||
|
# use File::Copy::Recursive qw(dircopy);
|
||||||
|
# use File::DirCompare;
|
||||||
|
# use Getopt::Long qw(GetOptionsFromArray);
|
||||||
|
use Time::Piece qw/localtime/;
|
||||||
|
|
||||||
my $now = localtime;
|
my $now = localtime;
|
||||||
my $year = $now->year;
|
my $year = $now->year;
|
||||||
print "Current year: $year\n";
|
|
||||||
|
|
||||||
# Get year to archive from current year
|
|
||||||
my $lastyear = $now->add_years(-1)->year;
|
my $lastyear = $now->add_years(-1)->year;
|
||||||
print("Last year: $lastyear\n");
|
print("Current year: $year Last year: $lastyear\n");
|
||||||
|
|
||||||
# Define and create folders
|
# Define and create folders
|
||||||
my $financial_folder = '/home/tracey/Documents/financial/current_year/';
|
my $financial_folder = '/home/tracey/Documents/financial/current_year/';
|
||||||
my $financial_archive_folder =
|
my $financial_archive_folder = '/home/tracey/Documents/financial/1_financial_archives/';
|
||||||
'/home/tracey/Documents/financial/1_financial_archives/';
|
my $lastyear_folder = $financial_archive_folder . $lastyear . '_FinancialArchives';
|
||||||
my $lastyear_folder =
|
|
||||||
$financial_archive_folder . $lastyear . 'FinancialArchives';
|
|
||||||
my @folders =
|
|
||||||
( $financial_folder, $financial_archive_folder, $lastyear_folder );
|
|
||||||
|
|
||||||
print("Copying current directories to archive folder\n");
|
|
||||||
print("From: $financial_folder\n");
|
|
||||||
print("To: $lastyear_folder\n");
|
|
||||||
dircopy( $financial_folder, $lastyear_folder )
|
|
||||||
or croak "Could not copy directories $!";
|
|
||||||
|
|
||||||
# Make sure contents match before we do any Deleting
|
create_archive_dirs ( $financial_folder, $lastyear_folder );
|
||||||
# croak on errors to guard against data losss
|
|
||||||
my $same_result = compare_dirs( $financial_folder, $lastyear_folder );
|
# Make sure contents match before we do any deleting
|
||||||
croak "Error: The folders are not the same!" unless ( $same_result == 1 );
|
# croak on errors to guard against data loss
|
||||||
|
# my $same_result = compare_dirs( $financial_folder, $lastyear_folder );
|
||||||
|
croak "Error: The source and destintion folder contents are not the same!" unless ( compare_dirs( $financial_folder, $lastyear_folder ) );
|
||||||
|
|
||||||
# Delete all files from current year from archive folders
|
# Delete all files from current year from archive folders
|
||||||
# Also delete files from last year in current year folder
|
# Also delete files from last year in current year folder
|
||||||
delete_dirs( $financial_folder, $lastyear_folder, $year, $lastyear );
|
clean_dirs( $financial_folder, $lastyear_folder, $year, $lastyear );
|
||||||
|
|
||||||
sub compare_dirs {
|
|
||||||
my ( $dir1, $dir2 ) = @_;
|
|
||||||
my $same = 1;
|
|
||||||
print("Making sure the copy was complete and all files match\n");
|
|
||||||
File::DirCompare->compare(
|
|
||||||
$dir1, $dir2,
|
|
||||||
sub {
|
|
||||||
my ( $a, $b ) = @_;
|
|
||||||
if ( !$b ) {
|
|
||||||
printf "Only in %s: %s\n", dirname($a), basename($a);
|
|
||||||
$same = 0;
|
|
||||||
}
|
|
||||||
elsif ( !$a ) {
|
|
||||||
printf "Only in %s: %s\n", dirname($b), basename($b);
|
|
||||||
$same = 0;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
print "Files $a and $b differ\n";
|
|
||||||
$same = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
);
|
|
||||||
print("Diff of directories done\n");
|
|
||||||
return $same;
|
|
||||||
}
|
|
||||||
|
|
||||||
sub delete_dirs {
|
|
||||||
my ( $new_dir, $old_dir, $curr_year, $last_year ) = @_;
|
|
||||||
print("Deleting files from current year $curr_year in archives\n");
|
|
||||||
print("and files from last year $last_year from current folder\n");
|
|
||||||
|
|
||||||
my @this_year_files =
|
|
||||||
File::Find::Rule->file()->name("*$curr_year*")->in($old_dir);
|
|
||||||
my @last_year_files =
|
|
||||||
File::Find::Rule->file()->name("*$last_year*")->in($new_dir);
|
|
||||||
|
|
||||||
unlink @this_year_files;
|
|
||||||
print("Deleted all $curr_year files from the folder for $last_year\n");
|
|
||||||
unlink @last_year_files;
|
|
||||||
print("Deleted all $last_year files from the folder for $curr_year\n");
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,5 @@
|
||||||
#!/usr/bin/perl
|
#!/usr/bin/perl
|
||||||
use strict;
|
use Modern::Perl;
|
||||||
use warnings;
|
|
||||||
|
|
||||||
use Time::Piece;
|
use Time::Piece;
|
||||||
use File::Find::Rule; # find all the subdirectories of a given directory
|
use File::Find::Rule; # find all the subdirectories of a given directory
|
||||||
|
|
@ -21,7 +20,7 @@ print("Last year was $lastyear and tax year was $lasttaxyear\n");
|
||||||
# Define and create folders
|
# Define and create folders
|
||||||
my ( $financial_folder, $financial_archive_folder, $lastyear_folder, $lasttaxyear_folder );
|
my ( $financial_folder, $financial_archive_folder, $lastyear_folder, $lasttaxyear_folder );
|
||||||
$financial_folder = '/home/tracey/Documents/financial/current_year/';
|
$financial_folder = '/home/tracey/Documents/financial/current_year/';
|
||||||
$financial_archive_folder = '~/Documents/financial/1_financial_archives/';
|
$financial_archive_folder = '/home//Documents/financial/1_financial_archives/';
|
||||||
$lastyear_folder = $financial_archive_folder . $lastyear . 'FinancialArchives';
|
$lastyear_folder = $financial_archive_folder . $lastyear . 'FinancialArchives';
|
||||||
$lasttaxyear_folder = $financial_archive_folder . $lasttaxyear . 'TaxArchives';
|
$lasttaxyear_folder = $financial_archive_folder . $lasttaxyear . 'TaxArchives';
|
||||||
my @folders = ( $financial_folder, $financial_archive_folder, $lastyear_folder, $lasttaxyear_folder );
|
my @folders = ( $financial_folder, $financial_archive_folder, $lastyear_folder, $lasttaxyear_folder );
|
||||||
|
|
|
||||||
0
file_processing/lib/FinancialFileArchiver.pm
Normal file
0
file_processing/lib/FinancialFileArchiver.pm
Normal file
125
file_processing/lib/ProcessDirectories.pm
Normal file
125
file_processing/lib/ProcessDirectories.pm
Normal file
|
|
@ -0,0 +1,125 @@
|
||||||
|
package ProcessDirectories;
|
||||||
|
use Modern::Perl;
|
||||||
|
# VERSION
|
||||||
|
# AUTHORITY
|
||||||
|
# ABSTRACT: Get current subdirectories in current year directory and copy to archive directory
|
||||||
|
use Carp qw( croak );
|
||||||
|
use File::Basename;
|
||||||
|
use File::Find::Rule;
|
||||||
|
use File::Copy::Recursive qw(dircopy);
|
||||||
|
use File::DirCompare;
|
||||||
|
use Pod::Usage;
|
||||||
|
# use Time::Piece qw/localtime/;
|
||||||
|
|
||||||
|
sub create_archive_dirs {
|
||||||
|
my ( $source_dir, $dest_dir ) = @_;
|
||||||
|
unless ( -d $source_dir ) {
|
||||||
|
die "Source directory '$source_dir' does not exist, please create it";
|
||||||
|
}
|
||||||
|
|
||||||
|
print("Copying current directories to archive folder\n");
|
||||||
|
print("From: $source_dir\n");
|
||||||
|
print("To: $dest_dir\n");
|
||||||
|
dircopy( $source_dir, $dest_dir )
|
||||||
|
or croak "Could not copy directories $!";
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub compare_dirs {
|
||||||
|
my ( $dir1, $dir2 ) = @_;
|
||||||
|
my $same = 1;
|
||||||
|
print("Making sure all directories and files match between source and destination\n");
|
||||||
|
File::DirCompare->compare(
|
||||||
|
$dir1, $dir2,
|
||||||
|
sub {
|
||||||
|
my ( $a, $b ) = @_;
|
||||||
|
if ( !$b ) {
|
||||||
|
printf "Only in %s: %s\n", dirname($a), basename($a);
|
||||||
|
$same = 0;
|
||||||
|
}
|
||||||
|
elsif ( !$a ) {
|
||||||
|
printf "Only in %s: %s\n", dirname($b), basename($b);
|
||||||
|
$same = 0;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
print "Files $a and $b differ\n";
|
||||||
|
$same = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
return $same;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub clean_dirs {
|
||||||
|
my ( $new_dir, $old_dir, $curr_year, $last_year ) = @_;
|
||||||
|
|
||||||
|
my @this_year_files =
|
||||||
|
File::Find::Rule->file()->name("*$curr_year*")->in($old_dir);
|
||||||
|
my @last_year_files =
|
||||||
|
File::Find::Rule->file()->name("*$last_year*")->in($new_dir);
|
||||||
|
|
||||||
|
unlink @this_year_files;
|
||||||
|
print("Deleted all files for $curr_year from the folder for $last_year\n");
|
||||||
|
unlink @last_year_files;
|
||||||
|
print("Deleted all files for $last_year from the folder for $curr_year\n");
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
1;
|
||||||
|
|
||||||
|
=pod
|
||||||
|
|
||||||
|
=head1 NAME
|
||||||
|
|
||||||
|
ProcessDirectories
|
||||||
|
|
||||||
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
|
Methods for copying and processing a directory of files for the past year and this year
|
||||||
|
|
||||||
|
=head1 SYNOPSIS
|
||||||
|
|
||||||
|
use ProcessDirectories
|
||||||
|
|
||||||
|
create_archive_dirs ( $source_dir, $dest_dir );
|
||||||
|
compare_dirs( $source_dir, $dest_dir );
|
||||||
|
clean_dirs( $source_dir, $dest_dir, $year, $lastyear );
|
||||||
|
|
||||||
|
=head1 METHODS
|
||||||
|
|
||||||
|
=head2
|
||||||
|
C<create_archive_dirs>: Copies the directory structure and contents of a source file to the archive / destination directory.
|
||||||
|
|
||||||
|
=head3
|
||||||
|
Usage:
|
||||||
|
create_archive_dirs( $source_dir, $destination_dir );
|
||||||
|
|
||||||
|
=head2
|
||||||
|
C<compare_dirs>: Compares the content of two specified directories. Provides feedback on the results. Returns 1 if the source and destination match, 0 otherwise.
|
||||||
|
|
||||||
|
=head3
|
||||||
|
Usage:
|
||||||
|
compare_dirs( $source_dir, $destination_dir );
|
||||||
|
|
||||||
|
=head2
|
||||||
|
C<clean_dirs>: This method accepts the following parameters:
|
||||||
|
|
||||||
|
=over 4
|
||||||
|
|
||||||
|
=item source_dir
|
||||||
|
|
||||||
|
=item destination_dir
|
||||||
|
|
||||||
|
=item this_year
|
||||||
|
|
||||||
|
=item last_year
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
=head3
|
||||||
|
Usage:
|
||||||
|
clean_dirs( $source_dir, $destination_dir, 2023, 2022 );
|
||||||
|
|
||||||
|
=cut
|
||||||
14
file_processing/t/00-load.t
Normal file
14
file_processing/t/00-load.t
Normal file
|
|
@ -0,0 +1,14 @@
|
||||||
|
use Test2::V0;
|
||||||
|
use Test2::Plugin::Times;
|
||||||
|
use Test2::Plugin::ExitSummary;
|
||||||
|
use Test2::Plugin::NoWarnings;
|
||||||
|
use FindBin qw($Bin);
|
||||||
|
use lib "$Bin/../lib";
|
||||||
|
|
||||||
|
|
||||||
|
plan(1);
|
||||||
|
BEGIN {
|
||||||
|
use ProcessDirectories;
|
||||||
|
|
||||||
|
pass('Module loads correctly.');
|
||||||
|
}
|
||||||
79
file_processing/t/01-subroutines.t
Normal file
79
file_processing/t/01-subroutines.t
Normal file
|
|
@ -0,0 +1,79 @@
|
||||||
|
use Test2::V0;
|
||||||
|
use Test2::Plugin::Times;
|
||||||
|
use Test2::Plugin::ExitSummary;
|
||||||
|
use Test2::Plugin::NoWarnings;
|
||||||
|
use FindBin qw($Bin);
|
||||||
|
use File::Path::Tiny;
|
||||||
|
use Time::Piece qw/localtime/;
|
||||||
|
|
||||||
|
use lib "$Bin/../lib";
|
||||||
|
use ProcessDirectories;
|
||||||
|
|
||||||
|
|
||||||
|
plan(2);
|
||||||
|
|
||||||
|
# Preconditions
|
||||||
|
my $now = localtime;
|
||||||
|
my $year = $now->year;
|
||||||
|
my $lastyear = $now->add_years(-1)->year;
|
||||||
|
diag("Current year: $year Last year: $lastyear\n");
|
||||||
|
|
||||||
|
## Define and create test source folder
|
||||||
|
my $current_year_dir = 't/current_year/';
|
||||||
|
my $archive_folder = 't/1_archives/';
|
||||||
|
my $prev_year_dir = $archive_folder . $lastyear . '_Archives';
|
||||||
|
diag("Source test dir $current_year_dir Dest test dir $prev_year_dir");
|
||||||
|
|
||||||
|
if(!File::Path::Tiny::mk($current_year_dir)) {
|
||||||
|
die "Could not create test source directory: '$current_year_dir': $!";
|
||||||
|
}
|
||||||
|
|
||||||
|
my @test_files = qw( 2003_file-1 2003_file-2 2002_file-1 2002_file-2 2002_file-3 );
|
||||||
|
for my $file (@test_files) {
|
||||||
|
create_file($current_year_dir . '/' . $file);
|
||||||
|
}
|
||||||
|
|
||||||
|
# Begin testing
|
||||||
|
ProcessDirectories::create_archive_dirs( $current_year_dir, $prev_year_dir );
|
||||||
|
ok( ( -d $prev_year_dir ), "Previous year archive directory was created" );
|
||||||
|
|
||||||
|
|
||||||
|
ok( ProcessDirectories::compare_dirs( $current_year_dir, $prev_year_dir ), "Previous year archive directory contents matches current directory contents" );
|
||||||
|
|
||||||
|
|
||||||
|
# clean_dirs
|
||||||
|
|
||||||
|
# End Testing
|
||||||
|
|
||||||
|
# Cleanup
|
||||||
|
# if(!File::Path::Tiny::rm($current_year_dir)) {
|
||||||
|
# die "Could not remove test source directory: '$current_year_dir': $!";
|
||||||
|
# }
|
||||||
|
# if(!File::Path::Tiny::rm($archive_folder)) {
|
||||||
|
# die "Could not remove test archive directory: '$archive_folder': $!";
|
||||||
|
# }
|
||||||
|
|
||||||
|
sub create_file {
|
||||||
|
my $filepath = shift;
|
||||||
|
open (my $fh, ">", $filepath) or die "Can't open file '$filepath' for writing: $!";
|
||||||
|
|
||||||
|
# you can control the range of characters here
|
||||||
|
my $minimum = 4;
|
||||||
|
my $range = 16;
|
||||||
|
my $num_bytes = '100';
|
||||||
|
|
||||||
|
for (my $bytes = 0; $bytes < $num_bytes; $bytes += 4) {
|
||||||
|
my $rand = int(rand($range ** 4));
|
||||||
|
my $string = '';
|
||||||
|
for (1..4) {
|
||||||
|
$string .= chr($rand % $range + $minimum);
|
||||||
|
$rand = int($rand / $range);
|
||||||
|
}
|
||||||
|
print $fh $string;
|
||||||
|
}
|
||||||
|
|
||||||
|
close($fh) or warn "Can't close file '$filepath': $!";
|
||||||
|
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
19
file_processing/t/02-archive-files.t
Normal file
19
file_processing/t/02-archive-files.t
Normal file
|
|
@ -0,0 +1,19 @@
|
||||||
|
use Modern::Perl;
|
||||||
|
use Carp qw/carp croak/;
|
||||||
|
|
||||||
|
use Test2::V0;
|
||||||
|
use Test2::Tools::Subtest qw/subtest_streamed/;
|
||||||
|
use Test2::Plugin::ExitSummary;
|
||||||
|
# use Test2::Tools::Exception qw/dies lives/;
|
||||||
|
use Test2::Plugin::NoWarnings;
|
||||||
|
# use Cwd qw(cwd);
|
||||||
|
use File::Path qw(remove_tree make_path);
|
||||||
|
use Time::Piece qw/localtime/;
|
||||||
|
|
||||||
|
# Order is important
|
||||||
|
use FindBin qw($Bin);
|
||||||
|
use lib "$Bin/../lib";
|
||||||
|
use ProcessDirectories;
|
||||||
|
|
||||||
|
use File::Temp qw/ tempfile tempdir /;
|
||||||
|
|
||||||
7
file_processing/t/1_archives/2022_Archives/2002_file-1
Normal file
7
file_processing/t/1_archives/2022_Archives/2002_file-1
Normal file
|
|
@ -0,0 +1,7 @@
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
5
file_processing/t/1_archives/2022_Archives/2002_file-2
Normal file
5
file_processing/t/1_archives/2022_Archives/2002_file-2
Normal file
|
|
@ -0,0 +1,5 @@
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
9
file_processing/t/1_archives/2022_Archives/2002_file-3
Normal file
9
file_processing/t/1_archives/2022_Archives/2002_file-3
Normal file
|
|
@ -0,0 +1,9 @@
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
7
file_processing/t/1_archives/2022_Archives/2003_file-1
Normal file
7
file_processing/t/1_archives/2022_Archives/2003_file-1
Normal file
|
|
@ -0,0 +1,7 @@
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
8
file_processing/t/1_archives/2022_Archives/2003_file-2
Normal file
8
file_processing/t/1_archives/2022_Archives/2003_file-2
Normal file
|
|
@ -0,0 +1,8 @@
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
7
file_processing/t/current_year/2002_file-1
Normal file
7
file_processing/t/current_year/2002_file-1
Normal file
|
|
@ -0,0 +1,7 @@
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
5
file_processing/t/current_year/2002_file-2
Normal file
5
file_processing/t/current_year/2002_file-2
Normal file
|
|
@ -0,0 +1,5 @@
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
9
file_processing/t/current_year/2002_file-3
Normal file
9
file_processing/t/current_year/2002_file-3
Normal file
|
|
@ -0,0 +1,9 @@
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
7
file_processing/t/current_year/2003_file-1
Normal file
7
file_processing/t/current_year/2003_file-1
Normal file
|
|
@ -0,0 +1,7 @@
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
8
file_processing/t/current_year/2003_file-2
Normal file
8
file_processing/t/current_year/2003_file-2
Normal file
|
|
@ -0,0 +1,8 @@
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
13
gitea/.gitignore
vendored
13
gitea/.gitignore
vendored
|
|
@ -1,13 +0,0 @@
|
||||||
|
|
||||||
.vscode/*
|
|
||||||
!.vscode/settings.json
|
|
||||||
!.vscode/tasks.json
|
|
||||||
!.vscode/launch.json
|
|
||||||
!.vscode/extensions.json
|
|
||||||
!.vscode/*.code-snippets
|
|
||||||
|
|
||||||
# Local History for Visual Studio Code
|
|
||||||
.history/
|
|
||||||
|
|
||||||
# Built Visual Studio Code Extensions
|
|
||||||
*.vsix
|
|
||||||
|
|
@ -1,44 +0,0 @@
|
||||||
#!/usr/bin/perl
|
|
||||||
|
|
||||||
# backup_gitea_bin.pl
|
|
||||||
# Author: Tracey Clark
|
|
||||||
# Created: 2019-06-20
|
|
||||||
# You must have a mail transport agent installed to run this script
|
|
||||||
|
|
||||||
use strict;
|
|
||||||
use warnings;
|
|
||||||
|
|
||||||
### TEST CODE ###
|
|
||||||
my $gitea_bin='/home/tracey/tmp/testbin';
|
|
||||||
my $gitea_current_version='1';
|
|
||||||
my %binary_file = (
|
|
||||||
input => $gitea_bin,
|
|
||||||
version => $gitea_current_version,
|
|
||||||
);
|
|
||||||
my ( %opts ) = %binary_file;
|
|
||||||
my $input = $opts{input};
|
|
||||||
my $version = $opts{version};
|
|
||||||
my $gitea_bin_backup = '/home/tracey/tmp/testbin.' . $gitea_current_version . '.bz2';
|
|
||||||
|
|
||||||
### TEST CODE ###
|
|
||||||
# my ( %opts ) = %{shift()};
|
|
||||||
# my $input = $opts{input};
|
|
||||||
# my $version = $opts{version};
|
|
||||||
printf("Backing up the current binary\n");
|
|
||||||
printf("Input in backup_bin script is $input\n and version is $version\n");
|
|
||||||
|
|
||||||
|
|
||||||
# my $gitea_bin_backup = '/home/gitea/bin/gitea.' . $gitea_current_version . '.bz2';
|
|
||||||
printf("Gitea bin backup will be $gitea_bin_backup\n");
|
|
||||||
# Do this with a system call to make a compressed copy of the current binary
|
|
||||||
# bzip2 -k file.txt
|
|
||||||
# my $status = system("vi", "fred.txt");
|
|
||||||
# if (($status >>=8) != 0) {
|
|
||||||
# die "Failed to run vi";
|
|
||||||
# }
|
|
||||||
|
|
||||||
# HEREHERE how to specify output file??
|
|
||||||
my $bzip_status = system("/bin/bzip2 -k $input");
|
|
||||||
if (($bzip_status >>=8) != 0) {
|
|
||||||
die "Failed to run bzip2";
|
|
||||||
}
|
|
||||||
|
|
@ -1,355 +0,0 @@
|
||||||
#!/usr/bin/perl
|
|
||||||
|
|
||||||
# Update gitea based on version provided
|
|
||||||
# Author: Tracey Clark
|
|
||||||
# Created: 2019-03-04
|
|
||||||
# You must have a mail transport agent installed to run this script
|
|
||||||
|
|
||||||
# Note: Daily backups are also being run from cron
|
|
||||||
# /home/gitea/gitea_backup.sh
|
|
||||||
|
|
||||||
# Re-write to use this dir according to gitea docs
|
|
||||||
# https://docs.gitea.io/en-us/install-from-binary/
|
|
||||||
# Get binary from system rather than hard code
|
|
||||||
# Stop gitea with systemctl before file copy
|
|
||||||
# Set right mod & perms?
|
|
||||||
|
|
||||||
use strict;
|
|
||||||
use warnings;
|
|
||||||
use LWP::UserAgent;
|
|
||||||
use IO::Compress::Bzip2 qw(bzip2 $Bzip2Error);
|
|
||||||
use File::Basename;
|
|
||||||
use JSON;
|
|
||||||
use Sort::Versions;
|
|
||||||
use Getopt::Long qw(GetOptions);
|
|
||||||
use Term::ANSIColor qw(:constants);
|
|
||||||
use feature qw(say);
|
|
||||||
use MIME::Lite;
|
|
||||||
use utf8;
|
|
||||||
use open ':std', ':encoding(UTF-8)';
|
|
||||||
use Encode qw(encode encode_utf8 );
|
|
||||||
|
|
||||||
my ( $verbose, $info );
|
|
||||||
|
|
||||||
GetOptions(
|
|
||||||
'info!' => \$info,
|
|
||||||
'verbose!' => \$verbose,
|
|
||||||
);
|
|
||||||
|
|
||||||
##########################################
|
|
||||||
### The user must set these variables ###
|
|
||||||
my $email = 'gitea-update@tlcnet.info';
|
|
||||||
my $filetype = '-linux-amd64';
|
|
||||||
##########################################
|
|
||||||
|
|
||||||
# https://api.github.com/repos/go-gitea/gitea/releases/latest
|
|
||||||
# This URL will only have one version listed
|
|
||||||
my $gitea_bin_dir = '/usr/local/bin/';
|
|
||||||
my $gitea_bin = $gitea_bin_dir . '/gitea';
|
|
||||||
my $gitea_current_version_string = `$gitea_bin --version`;
|
|
||||||
my $alphanum_ver = 0;
|
|
||||||
|
|
||||||
chomp $gitea_current_version_string;
|
|
||||||
unless ( defined $gitea_current_version_string ) {
|
|
||||||
my $status = "❌ [DIE]: Unable to get the version of the gitea binary on the system: $!";
|
|
||||||
notification('failed ❌', $status);
|
|
||||||
die RED "$status", RESET;
|
|
||||||
}
|
|
||||||
|
|
||||||
my %binary_file = get_current_binary($gitea_current_version_string);
|
|
||||||
my $gitea_current_version = $binary_file{'version'};
|
|
||||||
my $baseURL = q{https://github.com/go-gitea/gitea/};
|
|
||||||
my $latestURL = q{https://api.github.com/repos/go-gitea/gitea/releases/latest};
|
|
||||||
|
|
||||||
# https://hubpages.com/technology/Use-Perl-to-access-REST-API
|
|
||||||
# Spin up the browser object
|
|
||||||
my $ua = LWP::UserAgent->new(
|
|
||||||
cookie_jar => {}, # keep cookies in RAM but not persistent between sessions
|
|
||||||
);
|
|
||||||
|
|
||||||
my $resp = $ua->get($latestURL);
|
|
||||||
my $latest_release_hash = decode_json( $resp->content )
|
|
||||||
or die "[DIE]: Unable to parse the version data! Output is:\n $resp";
|
|
||||||
|
|
||||||
my $orig_tag = $latest_release_hash->{tag_name};
|
|
||||||
# print "[TLC DEBUG]: ORIG TAG is $orig_tag\n";
|
|
||||||
my $tag = $orig_tag;
|
|
||||||
substr( $tag, 0, 1, '' );
|
|
||||||
my $release_id = $latest_release_hash->{id}; # Works
|
|
||||||
printf( YELLOW
|
|
||||||
"[INFO] Latest upstream version: $tag\n Release ID $release_id\n", RESET);
|
|
||||||
my $unz_filename = 'gitea-' . $tag . $filetype;
|
|
||||||
#ex: gitea-1.7.6-linux-amd64
|
|
||||||
my $download_dir = '/home/gitea/bin/';
|
|
||||||
my $download_filename = $unz_filename . '.xz';
|
|
||||||
|
|
||||||
if ( defined $verbose ) {
|
|
||||||
printf( YELLOW
|
|
||||||
"[INFO]\nRelease id: $release_id\nUncompressed filename: $unz_filename\nDownload file target: $download_filename\n"
|
|
||||||
);
|
|
||||||
}
|
|
||||||
if ( versioncmp( $gitea_current_version, $tag ) == -1 ) {
|
|
||||||
printf(
|
|
||||||
"[INFO] Version tag is greater than the system version, proceeding with update\n"
|
|
||||||
);
|
|
||||||
backup_bin( \%binary_file );
|
|
||||||
|
|
||||||
my $download_url = get_download_url( $download_filename, $release_id );
|
|
||||||
print("Downloading the compressed binary\n");
|
|
||||||
print("[INFO] Download URL we got from the sub is $download_url\n");
|
|
||||||
`wget -P $download_dir $download_url`;
|
|
||||||
my $xz_file = $download_dir . $download_filename;
|
|
||||||
|
|
||||||
if ( defined $info ) {
|
|
||||||
print YELLOW "[INFO] xz file is $xz_file\n", RESET;
|
|
||||||
}
|
|
||||||
install_bin($download_filename);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
my $status = '✅ Version tag upstream matches the system version, no update needed';
|
|
||||||
print "[TLC DEBUG] TAG is $tag\n";
|
|
||||||
print( YELLOW "[INFO] $status\n", RESET );
|
|
||||||
notification('not needed ✅', $status, $gitea_current_version, $tag);
|
|
||||||
exit 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
my $gitea_status = check_gitea_status();
|
|
||||||
if ( $gitea_status =~ /active/ ) {
|
|
||||||
print( GREEN "[INFO] Gitea service is active\n", RESET );
|
|
||||||
}
|
|
||||||
unless ( $gitea_status =~ /active/ ) {
|
|
||||||
my $status = '❌ [DIE] Status of gitea service is no good!';
|
|
||||||
print( RED "[INFO] $status\n", RESET );
|
|
||||||
notification('failed ❌', $status, $gitea_current_version, $tag);
|
|
||||||
die $status;
|
|
||||||
}
|
|
||||||
$gitea_current_version_string = `$gitea_bin --version`;
|
|
||||||
chomp $gitea_current_version_string;
|
|
||||||
%binary_file = get_current_binary($gitea_current_version_string);
|
|
||||||
$gitea_current_version = $binary_file{'version'};
|
|
||||||
|
|
||||||
if ( versioncmp( $gitea_current_version, $tag ) == -1 ) {
|
|
||||||
my $status = RED "Upstream version tag is STILL greater than the current system version, something went wrong\n", RESET;
|
|
||||||
notification('failed ❌', $status, $gitea_current_version, $tag);
|
|
||||||
printf( $status );
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
my $status = '✅ [INFO] Gitea successfuly update. Installed version is current and service is running';
|
|
||||||
print( GREEN "[INFO] $status\n", RESET );
|
|
||||||
say "Removing the downloaded xz file and uncompressed file";
|
|
||||||
system("rm -vf " . $download_dir . $unz_filename);
|
|
||||||
system("rm -vf " . $download_dir . $download_filename);
|
|
||||||
notification('succeeded ✅', $status, $gitea_current_version, $tag);
|
|
||||||
# Intentionally *not* removing the 'gitea' binary in case something goes wrong running the current binary.
|
|
||||||
}
|
|
||||||
|
|
||||||
# ##### Subroutines #####
|
|
||||||
|
|
||||||
# sub check_deps {
|
|
||||||
# # Check to make sure dependencies installed on system - unit test??
|
|
||||||
# # bzip2 perl mods
|
|
||||||
# }
|
|
||||||
|
|
||||||
sub get_current_binary {
|
|
||||||
my $current_version_string = shift;
|
|
||||||
my $current_version;
|
|
||||||
if ( $current_version_string =~ m/ion\ (\d+\.\d+\.\d*)\s+b/ ) {
|
|
||||||
$current_version = $1;
|
|
||||||
printf("Version number of the installed gitea binary: $1\n");
|
|
||||||
}
|
|
||||||
elsif ( $current_version_string =~ m/ion\ (\d+\d+\w*)\s/ ) {
|
|
||||||
$current_version = $1;
|
|
||||||
printf("Current version number the installed gitea binary: $1\n");
|
|
||||||
$alphanum_ver = 1;
|
|
||||||
}
|
|
||||||
my %binary_file = (
|
|
||||||
input => $gitea_bin,
|
|
||||||
version => $current_version,
|
|
||||||
);
|
|
||||||
unless ( defined $current_version ) {
|
|
||||||
die RED
|
|
||||||
"[DIE]: Unable to get the current gitea version! Value is $current_version",
|
|
||||||
RESET;
|
|
||||||
}
|
|
||||||
return %binary_file;
|
|
||||||
}
|
|
||||||
|
|
||||||
sub get_binary_file {
|
|
||||||
my $version = shift;
|
|
||||||
}
|
|
||||||
|
|
||||||
sub backup_bin {
|
|
||||||
|
|
||||||
# Ghetto to get it working for now
|
|
||||||
|
|
||||||
my (%opts) = %{ shift() };
|
|
||||||
my $input = $opts{input};
|
|
||||||
my $version = $opts{version};
|
|
||||||
print GREEN "Backing up the current binary\n", RESET;
|
|
||||||
if ( defined $info ) {
|
|
||||||
print YELLOW
|
|
||||||
"[INFO] Input in backup_bin sub is:\n Directory $input\n Version $version\n",
|
|
||||||
RESET;
|
|
||||||
}
|
|
||||||
my $gitea_bin_backup =
|
|
||||||
'/home/gitea/bin/gitea.' . $gitea_current_version . '.bz2';
|
|
||||||
print GREEN "Gitea bin backup will be $gitea_bin_backup\n", RESET;
|
|
||||||
system("cp $input $input.bak");
|
|
||||||
|
|
||||||
# TODO
|
|
||||||
# # Do this with a system call to make a compressed copy of the current binary
|
|
||||||
# # bzip2 -k file.txt
|
|
||||||
# # my $status = system("vi", "fred.txt");
|
|
||||||
# # if (($status >>=8) != 0) {
|
|
||||||
# # die "[DIE] Failed to run vi";
|
|
||||||
# # }
|
|
||||||
# my $bzip_status = system("bzip2 -k", "$input");
|
|
||||||
# if (($status >>=8) != 0) {
|
|
||||||
# die "[DIE] Failed to run bzip2";
|
|
||||||
# }
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
sub get_download_url {
|
|
||||||
my ( $dl_filename, $rel_id ) = @_;
|
|
||||||
my $dl_url;
|
|
||||||
|
|
||||||
# Get the download_url from the array
|
|
||||||
my $assetsURL =
|
|
||||||
'https://api.github.com/repos/go-gitea/gitea/releases/'
|
|
||||||
. $release_id
|
|
||||||
. '/assets';
|
|
||||||
if ( defined $info ) {
|
|
||||||
print YELLOW "[INFO] Assets URL\n";
|
|
||||||
print "$assetsURL\n", RESET;
|
|
||||||
}
|
|
||||||
|
|
||||||
my $asset_resp = $ua->get($assetsURL);
|
|
||||||
my $asset_resp_array_ref = decode_json( $asset_resp->content );
|
|
||||||
|
|
||||||
if ( defined $verbose ) {
|
|
||||||
printf( RED
|
|
||||||
"[DEBUG] Array of hashes of the json response for the assets:\n"
|
|
||||||
);
|
|
||||||
printf Dumper $asset_resp_array_ref, RESET;
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach my $asset_ref ( @{$asset_resp_array_ref} ) {
|
|
||||||
if ( defined $verbose ) {
|
|
||||||
print( RED
|
|
||||||
"[DEBUG] The asset ref in get_download_url is $asset_ref\n" );
|
|
||||||
print(
|
|
||||||
"The asset ref name in get_download_url is $asset_ref->{name}\n",
|
|
||||||
RESET
|
|
||||||
);
|
|
||||||
}
|
|
||||||
if ( $asset_ref->{name} eq $dl_filename ) {
|
|
||||||
print("Yay we have a match for our desired file :D and it is \n");
|
|
||||||
print $asset_ref->{name} . "\n";
|
|
||||||
$dl_url = $asset_ref->{browser_download_url};
|
|
||||||
if ( defined $info ) {
|
|
||||||
print YELLOW
|
|
||||||
"[INFO] The download url from the response array is $dl_url\n",
|
|
||||||
RESET;
|
|
||||||
}
|
|
||||||
return $dl_url;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
unless ( defined $dl_url ) {
|
|
||||||
print( RED
|
|
||||||
"ONOES we have no download URL from the github API! Trying to build one manually\n",
|
|
||||||
RESET
|
|
||||||
);
|
|
||||||
my $dl_url = build_download_url( $orig_tag, $download_filename );
|
|
||||||
return $dl_url;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
sub build_download_url {
|
|
||||||
my ( $url_tag, $url_file ) = @_;
|
|
||||||
print "Building the URL based on the version\n";
|
|
||||||
|
|
||||||
# If getting the download URL fails through the API, use this to build it manually
|
|
||||||
# URL is in the form of
|
|
||||||
# https://github.com/go-gitea/gitea/releases/download/v1.15.2/gitea-1.15.2-linux-amd64.xz
|
|
||||||
my $built_url =
|
|
||||||
'https://github.com/go-gitea/gitea/releases/download/'
|
|
||||||
. $url_tag . '/'
|
|
||||||
. $url_file;
|
|
||||||
if ( defined $info ) {
|
|
||||||
print YELLOW "The URL built for the download is $built_url\n", RESET;
|
|
||||||
}
|
|
||||||
return $built_url;
|
|
||||||
}
|
|
||||||
|
|
||||||
sub install_bin {
|
|
||||||
my $filename = shift;
|
|
||||||
print("Unpacking the downloaded file \"$download_dir$filename\", setting owner and permissions\n");
|
|
||||||
my $unpacked_filename = basename($filename, ".xz");
|
|
||||||
print "Unpacked filename is $unpacked_filename\n";
|
|
||||||
|
|
||||||
# Copy the downloaded binary to gitea and chmod it 750
|
|
||||||
# Doing this with a filthy system call because the perl library
|
|
||||||
# for xz manipulation is a memory hog and buggy besides
|
|
||||||
system("xz -d --keep $download_dir" . "/" . "$filename");
|
|
||||||
system("systemctl stop gitea");
|
|
||||||
system("cp $download_dir$unpacked_filename $gitea_bin");
|
|
||||||
system("chown gitea.gitea $gitea_bin");
|
|
||||||
system("chmod 750 $gitea_bin");
|
|
||||||
|
|
||||||
# Restart service
|
|
||||||
print("[INFO] Restarting the gitea service\n");
|
|
||||||
return system("systemctl restart gitea");
|
|
||||||
}
|
|
||||||
|
|
||||||
sub check_gitea_status {
|
|
||||||
my $gitea_status = `systemctl is-active gitea`;
|
|
||||||
return $gitea_status;
|
|
||||||
}
|
|
||||||
|
|
||||||
sub notification {
|
|
||||||
my ($result, $body, $running_version, $upstream_version) = @_;
|
|
||||||
my $subject = "Gitea update check: update " . $result;
|
|
||||||
my $from = 'system@host.tlcnet.info';
|
|
||||||
my $ver_body;
|
|
||||||
|
|
||||||
# print "[TLC DEBUG] Body received is\n$body\n";
|
|
||||||
|
|
||||||
if ( defined $running_version ) {
|
|
||||||
$ver_body = q{
|
|
||||||
<table>
|
|
||||||
<tbody>
|
|
||||||
<tr>
|
|
||||||
<td>Running version:</td>
|
|
||||||
<td>} . $running_version . q{</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>Upstream version:</td>
|
|
||||||
<td>} . $upstream_version . q{</td>
|
|
||||||
</tr>
|
|
||||||
</tbody>
|
|
||||||
</table>}
|
|
||||||
}
|
|
||||||
|
|
||||||
my $msg = MIME::Lite->new(
|
|
||||||
Subject => encode( 'MIME-Header', $subject ),
|
|
||||||
From => $from,
|
|
||||||
To => $email,
|
|
||||||
Type => 'text/html',
|
|
||||||
Data => encode_utf8(
|
|
||||||
'<body>
|
|
||||||
<H1>Gitea update result</H1>
|
|
||||||
<p>' . $body . '</p>' . $ver_body .
|
|
||||||
'<br>
|
|
||||||
<p>⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯</p>
|
|
||||||
<p>Sincerely, <br>Your Linode VM</p>
|
|
||||||
</body>'
|
|
||||||
)
|
|
||||||
);
|
|
||||||
|
|
||||||
$msg->send();
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
@ -1,9 +0,0 @@
|
||||||
|
|
||||||
filetype plugin indent on
|
|
||||||
" show existing tab with 4 spaces width
|
|
||||||
set tabstop=4
|
|
||||||
" when indenting with '>', use 4 spaces width
|
|
||||||
set shiftwidth=4
|
|
||||||
" On pressing tab, insert 4 spaces
|
|
||||||
set expandtab
|
|
||||||
set pastetoggle=<F3> #To switch between paste and nopaste modes
|
|
||||||
|
|
@ -1,3 +0,0 @@
|
||||||
# Konsole tabs for colo session
|
|
||||||
title: Local;; command: /usr/bin/zsh ;; profile: Breeze
|
|
||||||
title: Colo;; command: ssh cp ;; profile: Mikado
|
|
||||||
|
|
@ -1,19 +0,0 @@
|
||||||
Host cp
|
|
||||||
HostName cp.tlcnet.info
|
|
||||||
User root
|
|
||||||
Port 227
|
|
||||||
IdentityFile ~/.ssh/tlc_server
|
|
||||||
Host pi3root
|
|
||||||
HostName pi3
|
|
||||||
User root
|
|
||||||
IdentityFile ~/.ssh/tlc_pi3
|
|
||||||
Host pi3
|
|
||||||
HostName pi3
|
|
||||||
User pi
|
|
||||||
IdentityFile ~/.ssh/tlc_pi3_pi
|
|
||||||
Host gittea
|
|
||||||
HostName gitea.tlcnet.info
|
|
||||||
RSAAuthentication yes
|
|
||||||
# User git
|
|
||||||
Port 227
|
|
||||||
IdentityFile ~/.ssh/id_tlc_gitea
|
|
||||||
13
perl_scratch.pl
Executable file
13
perl_scratch.pl
Executable file
|
|
@ -0,0 +1,13 @@
|
||||||
|
#!/usr/bin/env perl
|
||||||
|
|
||||||
|
use Modern::Perl;
|
||||||
|
use DateTime;
|
||||||
|
|
||||||
|
say "Date Time formatting tests";
|
||||||
|
|
||||||
|
my $dt_now = DateTime->now( time_zone => 'local' );
|
||||||
|
say "Datetime now is $dt_now";
|
||||||
|
my $date = $dt_now->ymd('');
|
||||||
|
# yymmdd_hhmmss
|
||||||
|
my $dt = $date . '_' . $dt_now->hms('');
|
||||||
|
say "Datetime is $dt";
|
||||||
|
|
@ -1,120 +0,0 @@
|
||||||
# ~/.bashrc: executed by bash(1) for non-login shells.
|
|
||||||
# see /usr/share/doc/bash/examples/startup-files (in the package bash-doc)
|
|
||||||
# for examples
|
|
||||||
|
|
||||||
# If not running interactively, don't do anything
|
|
||||||
case $- in
|
|
||||||
*i*) ;;
|
|
||||||
*) return;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
# don't put duplicate lines or lines starting with space in the history.
|
|
||||||
# See bash(1) for more options
|
|
||||||
HISTCONTROL=ignoreboth
|
|
||||||
|
|
||||||
# append to the history file, don't overwrite it
|
|
||||||
shopt -s histappend
|
|
||||||
|
|
||||||
# for setting history length see HISTSIZE and HISTFILESIZE in bash(1)
|
|
||||||
HISTSIZE=1000
|
|
||||||
HISTFILESIZE=2000
|
|
||||||
|
|
||||||
# check the window size after each command and, if necessary,
|
|
||||||
# update the values of LINES and COLUMNS.
|
|
||||||
shopt -s checkwinsize
|
|
||||||
|
|
||||||
# If set, the pattern "**" used in a pathname expansion context will
|
|
||||||
# match all files and zero or more directories and subdirectories.
|
|
||||||
#shopt -s globstar
|
|
||||||
|
|
||||||
# make less more friendly for non-text input files, see lesspipe(1)
|
|
||||||
[ -x /usr/bin/lesspipe ] && eval "$(SHELL=/bin/sh lesspipe)"
|
|
||||||
|
|
||||||
# set variable identifying the chroot you work in (used in the prompt below)
|
|
||||||
if [ -z "${debian_chroot:-}" ] && [ -r /etc/debian_chroot ]; then
|
|
||||||
debian_chroot=$(cat /etc/debian_chroot)
|
|
||||||
fi
|
|
||||||
|
|
||||||
# set a fancy prompt (non-color, unless we know we "want" color)
|
|
||||||
case "$TERM" in
|
|
||||||
xterm-color|*-256color) color_prompt=yes;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
# uncomment for a colored prompt, if the terminal has the capability; turned
|
|
||||||
# off by default to not distract the user: the focus in a terminal window
|
|
||||||
# should be on the output of commands, not on the prompt
|
|
||||||
#force_color_prompt=yes
|
|
||||||
|
|
||||||
if [ -n "$force_color_prompt" ]; then
|
|
||||||
if [ -x /usr/bin/tput ] && tput setaf 1 >&/dev/null; then
|
|
||||||
# We have color support; assume it's compliant with Ecma-48
|
|
||||||
# (ISO/IEC-6429). (Lack of such support is extremely rare, and such
|
|
||||||
# a case would tend to support setf rather than setaf.)
|
|
||||||
color_prompt=yes
|
|
||||||
else
|
|
||||||
color_prompt=
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ "$color_prompt" = yes ]; then
|
|
||||||
PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
|
|
||||||
else
|
|
||||||
PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
|
|
||||||
fi
|
|
||||||
unset color_prompt force_color_prompt
|
|
||||||
|
|
||||||
# If this is an xterm set the title to user@host:dir
|
|
||||||
case "$TERM" in
|
|
||||||
xterm*|rxvt*)
|
|
||||||
PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@\h: \w\a\]$PS1"
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
# enable color support of ls and also add handy aliases
|
|
||||||
if [ -x /usr/bin/dircolors ]; then
|
|
||||||
test -r ~/.dircolors && eval "$(dircolors -b ~/.dircolors)" || eval "$(dircolors -b)"
|
|
||||||
alias ls='ls --color=auto'
|
|
||||||
#alias dir='dir --color=auto'
|
|
||||||
#alias vdir='vdir --color=auto'
|
|
||||||
|
|
||||||
alias grep='grep --color=auto'
|
|
||||||
alias fgrep='fgrep --color=auto'
|
|
||||||
alias egrep='egrep --color=auto'
|
|
||||||
fi
|
|
||||||
|
|
||||||
# colored GCC warnings and errors
|
|
||||||
#export GCC_COLORS='error=01;31:warning=01;35:note=01;36:caret=01;32:locus=01:quote=01'
|
|
||||||
|
|
||||||
# some more ls aliases
|
|
||||||
alias ll='ls -alF'
|
|
||||||
alias la='ls -A'
|
|
||||||
alias l='ls -CF'
|
|
||||||
|
|
||||||
# Add an "alert" alias for long running commands. Use like so:
|
|
||||||
# sleep 10; alert
|
|
||||||
alias alert='notify-send --urgency=low -i "$([ $? = 0 ] && echo terminal || echo error)" "$(history|tail -n1|sed -e '\''s/^\s*[0-9]\+\s*//;s/[;&|]\s*alert$//'\'')"'
|
|
||||||
|
|
||||||
# Alias definitions.
|
|
||||||
# You may want to put all your additions into a separate file like
|
|
||||||
# ~/.bash_aliases, instead of adding them here directly.
|
|
||||||
# See /usr/share/doc/bash-doc/examples in the bash-doc package.
|
|
||||||
|
|
||||||
if [ -f ~/.bash_aliases ]; then
|
|
||||||
. ~/.bash_aliases
|
|
||||||
fi
|
|
||||||
|
|
||||||
# enable programmable completion features (you don't need to enable
|
|
||||||
# this, if it's already enabled in /etc/bash.bashrc and /etc/profile
|
|
||||||
# sources /etc/bash.bashrc).
|
|
||||||
if ! shopt -oq posix; then
|
|
||||||
if [ -f /usr/share/bash-completion/bash_completion ]; then
|
|
||||||
. /usr/share/bash-completion/bash_completion
|
|
||||||
elif [ -f /etc/bash_completion ]; then
|
|
||||||
. /etc/bash_completion
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
#List upgradeable packages
|
|
||||||
apt list --upgradeable
|
|
||||||
|
|
@ -1,22 +0,0 @@
|
||||||
# ~/.profile: executed by the command interpreter for login shells.
|
|
||||||
# This file is not read by bash(1), if ~/.bash_profile or ~/.bash_login
|
|
||||||
# exists.
|
|
||||||
# see /usr/share/doc/bash/examples/startup-files for examples.
|
|
||||||
# the files are located in the bash-doc package.
|
|
||||||
|
|
||||||
# the default umask is set in /etc/profile; for setting the umask
|
|
||||||
# for ssh logins, install and configure the libpam-umask package.
|
|
||||||
#umask 022
|
|
||||||
|
|
||||||
# if running bash
|
|
||||||
if [ -n "$BASH_VERSION" ]; then
|
|
||||||
# include .bashrc if it exists
|
|
||||||
if [ -f "$HOME/.bashrc" ]; then
|
|
||||||
. "$HOME/.bashrc"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
# set PATH so it includes user's private bin if it exists
|
|
||||||
if [ -d "$HOME/bin" ] ; then
|
|
||||||
PATH="$HOME/bin:$PATH"
|
|
||||||
fi
|
|
||||||
|
|
@ -1,99 +0,0 @@
|
||||||
# ~/.bashrc: executed by bash(1) for non-login shells.
|
|
||||||
# see /usr/share/doc/bash/examples/startup-files (in the package bash-doc)
|
|
||||||
# for examples
|
|
||||||
|
|
||||||
# If not running interactively, don't do anything
|
|
||||||
[ -z "$PS1" ] && return
|
|
||||||
|
|
||||||
# don't put duplicate lines in the history. See bash(1) for more options
|
|
||||||
# ... or force ignoredups and ignorespace
|
|
||||||
HISTCONTROL=ignoredups:ignorespace
|
|
||||||
|
|
||||||
# append to the history file, don't overwrite it
|
|
||||||
shopt -s histappend
|
|
||||||
|
|
||||||
# for setting history length see HISTSIZE and HISTFILESIZE in bash(1)
|
|
||||||
HISTSIZE=1000
|
|
||||||
HISTFILESIZE=2000
|
|
||||||
|
|
||||||
# check the window size after each command and, if necessary,
|
|
||||||
# update the values of LINES and COLUMNS.
|
|
||||||
shopt -s checkwinsize
|
|
||||||
|
|
||||||
# make less more friendly for non-text input files, see lesspipe(1)
|
|
||||||
[ -x /usr/bin/lesspipe ] && eval "$(SHELL=/bin/sh lesspipe)"
|
|
||||||
|
|
||||||
# set variable identifying the chroot you work in (used in the prompt below)
|
|
||||||
if [ -z "$debian_chroot" ] && [ -r /etc/debian_chroot ]; then
|
|
||||||
debian_chroot=$(cat /etc/debian_chroot)
|
|
||||||
fi
|
|
||||||
|
|
||||||
# set a fancy prompt (non-color, unless we know we "want" color)
|
|
||||||
case "$TERM" in
|
|
||||||
xterm-color) color_prompt=yes;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
# uncomment for a colored prompt, if the terminal has the capability; turned
|
|
||||||
# off by default to not distract the user: the focus in a terminal window
|
|
||||||
# should be on the output of commands, not on the prompt
|
|
||||||
#force_color_prompt=yes
|
|
||||||
|
|
||||||
if [ -n "$force_color_prompt" ]; then
|
|
||||||
if [ -x /usr/bin/tput ] && tput setaf 1 >&/dev/null; then
|
|
||||||
# We have color support; assume it's compliant with Ecma-48
|
|
||||||
# (ISO/IEC-6429). (Lack of such support is extremely rare, and such
|
|
||||||
# a case would tend to support setf rather than setaf.)
|
|
||||||
color_prompt=yes
|
|
||||||
else
|
|
||||||
color_prompt=
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ "$color_prompt" = yes ]; then
|
|
||||||
PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
|
|
||||||
else
|
|
||||||
PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
|
|
||||||
fi
|
|
||||||
unset color_prompt force_color_prompt
|
|
||||||
|
|
||||||
# If this is an xterm set the title to user@host:dir
|
|
||||||
case "$TERM" in
|
|
||||||
xterm*|rxvt*)
|
|
||||||
PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@\h: \w\a\]$PS1"
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
# enable color support of ls and also add handy aliases
|
|
||||||
if [ -x /usr/bin/dircolors ]; then
|
|
||||||
test -r ~/.dircolors && eval "$(dircolors -b ~/.dircolors)" || eval "$(dircolors -b)"
|
|
||||||
alias ls='ls --color=auto'
|
|
||||||
#alias dir='dir --color=auto'
|
|
||||||
#alias vdir='vdir --color=auto'
|
|
||||||
|
|
||||||
alias grep='grep --color=auto'
|
|
||||||
alias fgrep='fgrep --color=auto'
|
|
||||||
alias egrep='egrep --color=auto'
|
|
||||||
fi
|
|
||||||
|
|
||||||
# some more ls aliases
|
|
||||||
alias ll='ls -alF'
|
|
||||||
alias la='ls -A'
|
|
||||||
alias l='ls -CF'
|
|
||||||
|
|
||||||
# Alias definitions.
|
|
||||||
# You may want to put all your additions into a separate file like
|
|
||||||
# ~/.bash_aliases, instead of adding them here directly.
|
|
||||||
# See /usr/share/doc/bash-doc/examples in the bash-doc package.
|
|
||||||
|
|
||||||
if [ -f ~/.bash_aliases ]; then
|
|
||||||
. ~/.bash_aliases
|
|
||||||
fi
|
|
||||||
|
|
||||||
# enable programmable completion features (you don't need to enable
|
|
||||||
# this, if it's already enabled in /etc/bash.bashrc and /etc/profile
|
|
||||||
# sources /etc/bash.bashrc).
|
|
||||||
#if [ -f /etc/bash_completion ] && ! shopt -oq posix; then
|
|
||||||
# . /etc/bash_completion
|
|
||||||
#fi
|
|
||||||
29
utility/reset_kde.fish
Executable file
29
utility/reset_kde.fish
Executable file
|
|
@ -0,0 +1,29 @@
|
||||||
|
#!/usr/bin/fish
|
||||||
|
# Initial folder list from https://tuxtrix.com/reset-kde5-user-config-default/
|
||||||
|
|
||||||
|
if string length -q $HOME
|
||||||
|
echo "Backup up $HOME/.config"
|
||||||
|
cp -a $HOME/.config $HOME/.config.bak
|
||||||
|
cd $HOME/.config
|
||||||
|
|
||||||
|
echo "Deleting KDE config files"
|
||||||
|
set fileList Trolltech.conf akregatorrc baloofilerc bluedevilglobalrc kactivitymanagerd-statsrc
|
||||||
|
set -a fileList kactivitymanagerdrc kactivitymanagerd-pluginsrc kateschemarc kcmfonts kcminputrc kconf_updaterc kded5rc
|
||||||
|
set -a fileList kdeglobals kfontinstuirc kglobalshortcutsrc khotkeysrc kmixctrlrc kmixrc
|
||||||
|
set -a fileList kscreenlockerrc ksmserverrc ksplashrc ktimezonedrc kwinrc kwinrulesrc plasma-localerc
|
||||||
|
set -a fileList plasma-nm plasma-org.kde.plasma.desktop-appletsrc plasmarc plasmashellrc
|
||||||
|
set -a fileList powermanagementprofilesrc startupconfig startupconfigfiles startupconfigkeys
|
||||||
|
set -a fileList krunnerrc touchpadxlibinputrc systemsettingsrc kxkbrc PlasmaUserFeedback
|
||||||
|
set -a fileList kde.org/* kiorc klipperrc knfsshare kuriikwsfilterrc kwalletmanager5rc kwalletrc
|
||||||
|
set -a fileList plasma.emojierrc plasmanotifyrc PlasmaUserFeedback powerdevilrc kgammarc
|
||||||
|
set -a fileList kded_device_automounterrc device_automounter_kcmrc klaunchrc
|
||||||
|
set -a fileList trashrc kactivitymanagerd-switcher gtkrc-2.0 gtkrc baloofileinformationrc
|
||||||
|
set -a fileList plasmaparc plasmawindowed-appletsrc plasmawindowedrc
|
||||||
|
|
||||||
|
set -a fileList breezerc
|
||||||
|
|
||||||
|
rm $fileList
|
||||||
|
else
|
||||||
|
echo "HOME variable not defined"
|
||||||
|
exit
|
||||||
|
end
|
||||||
15
utility/tx_session.sh
Executable file
15
utility/tx_session.sh
Executable file
|
|
@ -0,0 +1,15 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
go() {
|
||||||
|
session="$1"
|
||||||
|
sessions_dir="$HOME/tilix_profiles"
|
||||||
|
tilix_opts=''
|
||||||
|
|
||||||
|
for session in "$sessions_dir/$session/"*; do
|
||||||
|
tilix_opts="$tilix_opts -s $session"
|
||||||
|
done
|
||||||
|
|
||||||
|
tilix $tilix_opts
|
||||||
|
}
|
||||||
|
|
||||||
|
go $@
|
||||||
Loading…
Add table
Add a link
Reference in a new issue