diff options
Diffstat (limited to 'misc')
38 files changed, 2892 insertions, 0 deletions
diff --git a/misc/annex-fsck b/misc/annex-fsck new file mode 100755 index 0000000..2ef8066 --- /dev/null +++ b/misc/annex-fsck @@ -0,0 +1,9 @@ +#!/bin/bash + +cd /var/cache/media + +for file in *; do + if [ -d "$file/.git" ]; then + ( echo "Checking $file..." && cd $file && git annex fsck --fast | grep -v " ok" | tee -a /tmp/annex-fsck.log ) + fi +done diff --git a/misc/convert-gitosis-conf b/misc/convert-gitosis-conf new file mode 100755 index 0000000..9b92f68 --- /dev/null +++ b/misc/convert-gitosis-conf @@ -0,0 +1,127 @@ +#!/usr/bin/perl -w +# +# migrate gitosis.conf to gitolite.conf format +# +# Based on gl-conf-convert by: Sitaram Chamarty +# Rewritten by: Behan Webster <behanw@websterwood.com> +# + +use strict; +use warnings; + +if (not @ARGV and -t or @ARGV and $ARGV[0] eq '-h') { + print "Usage:\n gl-conf-convert < gitosis.conf > gitolite.conf\n(please see the documentation for details)\n"; + exit 1; +} + +my @comments = (); +my $groupname; +my %groups; +my $reponame; +my %repos; + +while (<>) +{ + # not supported + if (/^repositories *=/ or /^map /) { + print STDERR "not supported: $_"; + s/^/NOT SUPPORTED: /; + print; + next; + } + + # normalise whitespace to help later regexes + chomp; + s/\s+/ /g; + s/ ?= ?/ = /; + s/^ //; + s/ $//; + + if (/^\s*$/ and @comments > 1) { + @{$repos{$reponame}{comments}} = @comments if $reponame; + @{$groups{$groupname}{comments}} = @comments if $groupname; + @comments = (); + } elsif (/^\s*#/) { + push @comments, $_; + } elsif (/^\[repo\s+(.*?)\]$/) { + $groupname = ''; + $reponame = $1; + $reponame =~ s/\.git$//; + } elsif (/^\[gitosis\]$/) { + $groupname = ''; + $reponame = '@all'; + } elsif (/^gitweb\s*=\s*yes/i) { + push @{$repos{$reponame}{R}}, 'gitweb'; + } elsif (/^daemon\s*=\s*yes/i) { + push @{$repos{$reponame}{R}}, 'daemon'; + } elsif (/^description\s*=\s*(.+?)$/) { + $repos{$reponame}{desc} = $1; + } elsif (/^owner\s*=\s*(.+?)$/) { + $repos{$reponame}{owner} = $1; + } elsif (/^\[group\s+(.*)\]$/) { + $reponame = ''; + $groupname = $1; + } elsif (/^members\s*=\s*(.*)/) { + push @{$groups{$groupname}{users}}, map {s/\@([^.]+)$/_$1/g; $_} split(' ', $1); + } elsif (/^write?able\s*=\s*(.*)/) { + foreach my $repo (split(' ', $1)) { + $repo =~ s/\.git$//; + push @{$repos{$repo}{RW}}, "\@$groupname"; + } + } elsif (/^readonly\s*=\s*(.*)/) { + foreach my $repo (split(' ', $1)) { + $repo =~ s/\.git$//; + push @{$repos{$repo}{R}}, "\@$groupname"; + } + } +} + +#use Data::Dumper; +#print Dumper(\%repos); +#print Dumper(\%groups); + +# Groups +print "#\n# Groups\n#\n\n"; +foreach my $grp (sort keys %groups) { + next unless @{$groups{$grp}{users}}; + printf join("\n", @{$groups{$grp}{comments}})."\n" if $groups{$grp}{comments}; + printf "\@%-19s = %s\n", $grp, join(' ', @{$groups{$grp}{users}}); +} + +# Gitweb +print "\n#\n# Gitweb\n#\n\n"; +foreach my $repo (sort keys %repos) { + if ($repos{$repo}{desc}) { + @{$repos{$repo}{R}} = grep(!/^gitweb$/, @{$repos{$repo}{R}}); + print $repo; + print " \"$repos{$repo}{owner}\"" if $repos{$repo}{owner}; + print " = \"$repos{$repo}{desc}\"\n"; + } +} + +# Repos +print "\n#\n# Repos\n#\n"; +foreach my $repo (sort keys %repos) { + print "\n"; + printf join("\n", @{$repos{$repo}{comments}})."\n" if $repos{$repo}{comments}; + #if ($repos{$repo}{desc}) { + # @{$repos{$repo}{R}} = grep(!/^gitweb$/, @{$repos{$repo}{R}}); + #} + print "repo\t$repo\n"; + foreach my $access (qw(RW+ RW R)) { + next unless $repos{$repo}{$access}; + my @keys; + foreach my $key (@{$repos{$repo}{$access}}) { + if ($key =~ /^\@(.*)/) { + next unless defined $groups{$1} and @{$groups{$1}{users}}; + } + push @keys, $key; + } + printf "\t$access\t= %s\n", join(' ', @keys) if @keys; + } + #if ($repos{$repo}{desc}) { + # print $repo; + # print " \"$repos{$repo}{owner}\"" if $repos{$repo}{owner}; + # print " = \"$repos{$repo}{desc}\"\n"; + #} +} diff --git a/misc/dupbackup b/misc/dupbackup new file mode 100755 index 0000000..f020c36 --- /dev/null +++ b/misc/dupbackup @@ -0,0 +1,51 @@ +#!/bin/bash +# +# dupbackup: duplicity wrapper +# feedback: rhatto at riseup.net +# +# dupbackup is free software; you can redistribute it and/or modify it under the +# terms of the GNU General Public License as published by the Free Software +# Foundation; either version 2 of the License, or any later version. +# +# common.sh is distributed in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +# A PARTICULAR PURPOSE. See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along with +# this program; if not, write to the Free Software Foundation, Inc., 59 Temple +# Place - Suite 330, Boston, MA 02111-1307, USA + +# Usage: dupbackup <host> [option] + +USER="`whoami`" +LOCAL_FOLDER="/mnt/crypt/home/$USER/" +REMOVE_OLDER_THAN="3M" +KEY="" +HOST="$1" +OPTION="$2" + +# Load configuration +if [ -e "$HOME/.config/scripts/dupbackup" ]; then + source $HOME/.config/scripts/dupbackup +fi + +if [ ! -z "$HOST" ]; then + DEST="/var/backups/remote/$USER/duplicity" + DEST="scp://$USER@$HOST/$DEST" +else + DEST="file:///var/backups/users/$USER/duplicity" +fi + +if [ -z "$OPTION" ]; then + OPTION="incr" +fi + +mkdir -p $LOCAL_FOLDER/tmp/duplicity + +duplicity $OPTION -v6 --full-if-older-than $REMOVE_OLDER_THAN \ + --allow-source-mismatch --encrypt-key $KEY \ + --sign-key $KEY $LOCAL_FOLDER $DEST \ + --tempdir $LOCAL_FOLDER/tmp/duplicity \ + --exclude $LOCAL_FOLDER/tmp/duplicity + +duplicity remove-older-than $REMOVE_OLDER_THAN $DEST --force diff --git a/misc/email/checkmail.sh b/misc/email/checkmail.sh new file mode 100755 index 0000000..3a21c9a --- /dev/null +++ b/misc/email/checkmail.sh @@ -0,0 +1,9 @@ +#!/bin/bash +# inspirado em http://www.vivaolinux.com.br/dicas/verDica.php?codigo=2432 +# + +FETCH=`fetchmail -c` +TOTAL=`echo $FETCH | awk '{ print $1 }'` +SEEN=`echo $FETCH | awk '{ print $3 }' | sed -e 's/(//'` +NEW=`echo "$TOTAL - $SEEN" | bc` +echo $NEW/$TOTAL diff --git a/misc/email/eml2mbox/eml2mbox.rb b/misc/email/eml2mbox/eml2mbox.rb new file mode 100755 index 0000000..1fc7bca --- /dev/null +++ b/misc/email/eml2mbox/eml2mbox.rb @@ -0,0 +1,265 @@ +#!/usr/bin/ruby +#============================================================================================# +# eml2mbox.rb v0.08 # +# Last updated: Jan 23, 2004 # +# # +# Converts a bunch of eml files into one mbox file. # +# # +# Usage: [ruby] eml2mbx.rb [-c] [-l] [-s] [-yz] [emlpath [trgtmbx]] # +# Switches: # +# -c Remove CRs (^M) appearing at end of lines (Unix) # +# -l Remove LFs appearing at beggining of lines (old Mac) - not tested # +# -s Don't use standard mbox postmark formatting (for From_ line) # +# This will force the use of original From and Date found in mail headers. # +# Not recommended, unless you really have problems importing emls. # +# -yz Use this to force the order of the year and timezone in date in the From_ # +# line from the default [timezone][year] to [year][timezone]. # +# emlpath - Path of dir with eml files. Defaults to the current dir if not specified # +# trgtmbx - Name of the target mbox file. Defaults to "archive.mbox" in 'emlpath' # +# # +# Ruby homepage: http://www.ruby-lang.org/en/ # +# Unix mailbox format: http://www.broobles.com/eml2mbox/mbox.html # +# This script : http://www.broobles.com/eml2mbox # +# # +#============================================================================================# +# Licence: # +# # +# This script is free software; you can redistribute it and/or modify it under the terms of # +# the GNU Lesser General Public License as published by the Free Software Foundation; # +# either version 2.1 of the License, or (at your option) any later version. # +# # +# You should have received a copy of the GNU Lesser General Public License along with this # +# script; if not, please visit http://www.gnu.org/copyleft/gpl.html for more information. # +#============================================================================================# + +require "parsedate" + +include ParseDate + +#=======================================================# +# Class that encapsulates the processing file in memory # +#=======================================================# + +class FileInMemory + + ZoneOffset = { + # Standard zones by RFC 2822 + 'UTC' => '0000', + 'UT' => '0000', 'GMT' => '0000', + 'EST' => '-0500', 'EDT' => '-0400', + 'CST' => '-0600', 'CDT' => '-0500', + 'MST' => '-0700', 'MDT' => '-0600', + 'PST' => '-0800', 'PDT' => '-0700', + } + + def initialize() + @lines = Array.new + @counter = 1 # keep the 0 position for the From_ line + @from = nil # from part of the From_ line + @date = nil # date part of the From_ line + end + + def addLine(line) + # If the line is a 'false' From line, add a '>' to its beggining + line = line.sub(/From/, '>From') if line =~ /^From/ and @from!=nil + + # If the line is the first valid From line, save it (without the line break) + if line =~ /^From:\s.*@/ and @from==nil + @from = line.sub(/From:/,'From') + @from = @from.chop # Remove line break(s) + @from = standardizeFrom(@from) unless $switches["noStandardFromLine"] + end + + # Get the date + if $switches["noStandardFromLine"] + # Don't parse the content of the Date header + @date = line.sub(/Date:\s/,'') if line =~ /^Date:\s/ and @date==nil + else + if line =~ /^Date:\s/ and @date==nil + # Parse content of the Date header and convert to the mbox standard for the From_ line + @date = line.sub(/Date:\s/,'') + year, month, day, hour, minute, second, timezone, wday = parsedate(@date) + # Need to convert the timezone from a string to a 4 digit offset + unless timezone =~ /[+|-]\d*/ + timezone=ZoneOffset[timezone] + end + time = Time.gm(year,month,day,hour,minute,second) + @date = formMboxDate(time,timezone) + end + end + + # Now add the line to the array + line = fixLineEndings(line) + @lines[@counter]=line + @counter+=1 + end + + # Forms the first line (from + date) and returns all the lines + # Returns all the lines in the file + def getProcessedLines() + if @from != nil + # Add from and date to the first line + if @date==nil + puts "WARN: Failed to extract date. Will use current time in the From_ line" + @date=formMboxDate(Time.now,nil) + end + @lines[0] = @from + " " + @date + + @lines[0] = fixLineEndings(@lines[0]) + @lines[@counter] = "" + return @lines + end + # else don't return anything + end + + # Fixes CR/LFs + def fixLineEndings(line) + line = removeCR(line) if $switches["removeCRs"]; + line = removeLF(line) if $switches["removeLFs"]; + return line + end + + # emls usually have CR+LF (DOS) line endings, Unix uses LF as a line break, + # so there's a hanging CR at the end of the line when viewed on Unix. + # This method will remove the next to the last character from a line + def removeCR(line) + line = line[0..-3]+line[-1..-1] if line[-2]==0xD + return line + end + + # Similar to the above. This one is for Macs that use CR as a line break. + # So, remove the last char + def removeLF(line) + line = line[0..-2] if line[-1]==0xA + return line + end + +end + +#================# +# Helper methods # +#================# + +# Converts: 'From "some one <aa@aa.aa>" <aa@aa.aa>' -> 'From aa@aa.aa' +def standardizeFrom(fromLine) + # Get indexes of last "<" and ">" in line + openIndex = fromLine.rindex('<') + closeIndex = fromLine.rindex('>') + if openIndex!=nil and closeIndex!=nil + fromLine = fromLine[0..4]+fromLine[openIndex+1..closeIndex-1] + end + # else leave as it is - it is either already well formed or is invalid + return fromLine +end + +# Returns a mbox postmark formatted date. +# If timezone is unknown, it is skipped. +# mbox date format used is described here: +# http://www.broobles.com/eml2mbox/mbox.html +def formMboxDate(time,timezone) + if timezone==nil + return time.strftime("%a %b %d %H:%M:%S %Y") + else + if $switches["zoneYearOrder"] + return time.strftime("%a %b %d %H:%M:%S "+timezone.to_s+" %Y") + else + return time.strftime("%a %b %d %H:%M:%S %Y "+timezone.to_s) + end + end +end + + +# Extracts all switches from the command line and returns +# a hashmap with valid switch names as keys and booleans as values +# Moves real params to the beggining of the ARGV array +def extractSwitches() + switches = Hash.new(false) # All switches (values) default to false + i=0 + while (ARGV[i]=~ /^-/) # while arguments are switches + if ARGV[i]=="-c" + switches["removeCRs"] = true + puts "\nWill fix lines ending with a CR" + elsif ARGV[i]=="-l" + switches["removeLFs"] = true + puts "\nWill fix lines beggining with a LF" + elsif ARGV[i]=="-s" + switches["noStandardFromLine"] = true + puts "\nWill use From and Date from mail headers in From_ line" + elsif ARGV[i]=="-yz" + switches["zoneYearOrder"] = true + puts "\nTimezone will be placed before the year in From_ line" + else + puts "\nUnknown switch: "+ARGV[i]+". Ignoring." + end + i = i+1 + end + # Move real arguments to the beggining of the array + ARGV[0] = ARGV[i] + ARGV[1] = ARGV[i+1] + return switches +end + +#===============# +# Main # +#===============# + + $switches = extractSwitches() + + # Extract specified directory with emls and the target archive (if any) + emlDir = "." # default if not specified + emlDir = ARGV[0] if ARGV[0]!=nil + mboxArchive = emlDir+"/archive.mbox" # default if not specified + mboxArchive = ARGV[1] if ARGV[1] != nil + + # Show specified settings + puts "\nSpecified dir : "+emlDir + puts "Specified file: "+mboxArchive+"\n" + + # Check that the dir exists + if FileTest.directory?(emlDir) + Dir.chdir(emlDir) + else + puts "\n["+emlDir+"] is not a directory (might not exist). Please specify a valid dir" + exit(0) + end + + # Check if destination file exists. If yes allow user to select an option. + canceled = false + if FileTest.exist?(mboxArchive) + print "\nFile ["+mboxArchive+"] exists! Please select: [A]ppend [O]verwrite [C]ancel (default) " + sel = STDIN.gets.chomp + if sel == 'A' or sel == 'a' + aFile = File.new(mboxArchive, "a"); + elsif sel == 'O' or sel == 'o' + aFile = File.new(mboxArchive, "w"); + else + canceled = true + end + else + # File doesn't exist, open for writing + aFile = File.new(mboxArchive, "w"); + end + + if not canceled + puts + files = Dir["*.eml"] + if files.size == 0 + puts "No *.eml files in this directory. mbox file not created." + aFile.close + File.delete(mboxArchive) + exit(0) + end + # For each .eml file in the specified directory do the following + files.each() do |x| + puts "Processing file: "+x + thisFile = FileInMemory.new() + File.open(x).each {|item| thisFile.addLine(item) } + lines = thisFile.getProcessedLines + if lines == nil + puts "WARN: File ["+x+"] doesn't seem to have a regular From: line. Not included in mbox" + else + lines.each {|line| aFile.puts line} + end + end + aFile.close + end diff --git a/misc/email/eml2mbox/licence.txt b/misc/email/eml2mbox/licence.txt new file mode 100644 index 0000000..3b20440 --- /dev/null +++ b/misc/email/eml2mbox/licence.txt @@ -0,0 +1,458 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS diff --git a/misc/email/estripa-emails.c b/misc/email/estripa-emails.c new file mode 100755 index 0000000..66c5473 --- /dev/null +++ b/misc/email/estripa-emails.c @@ -0,0 +1,50 @@ +/* + * Copyleft 2003: + * + * Esse software é distribuído através da licença URUBU: + * você só pode fazer um número de cópias cuja paridade + * seja a mesma do dia do mês que você se encontra; + * modificações são permitidas em qualquer dia da semana; + * + * estripa.c + * rhatto@riseup.net + * + */ + +#include <stdio.h> + +main(int argc, char *argv[]) { + + FILE *fp1, *fp2; + char letra; + short flag = 0; + + if(argc != 3) { fprintf(stderr, "sintaxe: estripa <origem> <destino>\n"); return 0; } + + fp1 = fopen(argv[1], "rb"); + fp2 = fopen(argv[2], "wb"); + + if(fp1 == (FILE *)0 || fp2 == (FILE *)0) { + + fprintf(stderr, "erro ao abrir arquivo\n"); + exit(1); + + } + + while((letra = getc(fp1)) != EOF) { + + if(letra == '<') { flag = 1; } + else if(flag && (letra == '>')) { flag = 0; fprintf(fp2, ", "); } + + if(flag && (letra != '<')) { putc(letra, fp2); } + + } + + fprintf(fp2, "\n"); + + fclose(fp1); + fclose(fp2); + + return 0; + +} diff --git a/misc/email/vcard-filter b/misc/email/vcard-filter new file mode 100644 index 0000000..363aa07 --- /dev/null +++ b/misc/email/vcard-filter @@ -0,0 +1,154 @@ +#!/usr/bin/perl -Tw + +# mutt.vcard.filter - vcard filter for use with the mutt autoview facility +# Copyright (C) 1997,1998,1999 David A Pearson +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the license, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +# This little perl script is a simple filter for text/x-vcard +# attachments. I'm pretty sure I've *not* included everything +# possible in here, but it "works for me". Feel free to improve +# in any way you see fit. +# +# Here is how I use it. In my ~/.mutt_mailcap (use your filename of +# choice) I have the following entry: +# +# text/x-vcard; mutt.vcard.filter; copiousoutput +# +# All you then need to do is add a line like: +# +# auto_view text/x-vcard +# +# to your ~/.muttrc (use your filename of choice). +# +# All comments/flames/feedback can be directed to: +# +# davep@davep.org +# +# http://www.davep.org/mutt/ +# + +use strict; + +my $in_card = 0; +my @address = (); +my @contacts = (); +my @additional = (); +my @notes = (); +my $name = ""; +my $title = ""; +my $org = ""; +my $found_note = 0; +my $len; +my $i; +my $addr_line; +my $contact_line; + +while ( <> ) +{ + if ( $in_card ) + { + if ( /^fn:\s*(.*)$/i ) + { + $name = $1; + } + elsif ( /^n:\s*(.*);\s*(.*)$/i ) + { + @additional = ( "", "Additional information:", "" ) if $#additional == -1; + + @additional = ( @additional, "Last Name:\t$1", "First Name:\t$2" ); + } + elsif ( /^title:\s*(.*)$/i ) + { + $title = $1; + } + elsif ( /^org:\s*(.*)$/i ) + { + $org = $1; + } + elsif ( /^adr:\s*(.*)$/i ) + { + my $addr = $1; + + $addr =~ s/;+/;/g; + + @address = split( /;/, $addr ); + } + elsif ( /^email;\s*(.*?):\s*(.*)$/i || /^tel;\s*(.*?):\s*(.*)$/i ) + { + my $type = $1; + my $value = $2; + + @contacts = ( @contacts, uc( substr( $type, 0, 1 ) ) . + substr( $type, 1 ) . ": $value" ); + } + elsif ( /^note:\s*(.*)$/i ) + { + @notes = ( "" ) if $#notes == -1; + @notes = ( @notes, $1 ); + + $found_note = 1; + } + elsif ( /^=.{2}=$/ && $found_note ) + { + my $line = <>; + + chomp( $line ); + + @notes = ( "" ) if $#notes == -1; + @notes = ( @notes, $line ); + } + elsif ( /^end:\s*vcard$/i ) + { + $in_card = 0; + } + } + else + { + $in_card = /^begin:\s*vcard\s*$/i; + } +} + +@address = ( $org, @address ) if $org; +@address = ( $title, @address ) if $title; +@address = ( $name, @address ) if $name; + +format STDOUT = +@<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< +$addr_line, $contact_line +. + +$len = $#address > $#contacts ? $#address : $#contacts; + +print "" . ( "=" x 76 ) . "\n"; + +for ( $i = 0; $i <= $len; $i++ ) +{ + $addr_line = $i <= $#address ? $address[ $i ] : ""; + $contact_line = $i <= $#contacts ? $contacts[ $i ] : ""; + write; +} + +for ( $i = 0; $i <= $#notes; $i++ ) +{ + print "$notes[ $i ]\n"; +} + +for ( $i = 0; $i <= $#additional; $i++ ) +{ + print "$additional[ $i ]\n"; +} + +print "" . ( "=" x 76 ) . "\n"; diff --git a/misc/eterm-trans b/misc/eterm-trans new file mode 100755 index 0000000..5003ddb --- /dev/null +++ b/misc/eterm-trans @@ -0,0 +1,6 @@ +#!/bin/bash +# +# eterm-trans: wrapper script for a transparent Eterm +# + +Eterm --trans --font1 monospace --scrollbar 0 -f white --buttonbar 0 --borderless -g 124x55+10+20 -c white -neterm diff --git a/misc/firefox-rotate b/misc/firefox-rotate new file mode 100755 index 0000000..e116e0a --- /dev/null +++ b/misc/firefox-rotate @@ -0,0 +1,21 @@ +#!/bin/bash +# +# firefox profile local backup +# + +BACKUPDIR="$HOME/backups/mozilla" + +if [ ! -d "/$BACKUPDIR" ]; then + mkdir -p $BACKUPDIR +fi + +if [ -d "/$BACKUPDIR/mozilla.2" ]; then + rm -rf /$BACKUPDIR/mozilla.2 +fi + +if [ -d "/$BACKUPDIR/mozilla.1" ]; then + mv /$BACKUPDIR/mozilla.1 /$BACKUPDIR/mozilla.2 +fi + +cp -Rp $HOME/.mozilla /$BACKUPDIR/mozilla.1 + diff --git a/misc/freeshell b/misc/freeshell new file mode 100755 index 0000000..a2f6e38 --- /dev/null +++ b/misc/freeshell @@ -0,0 +1,17 @@ +#!/usr/bin/expect +spawn telnet freeshell.org +# Not absolutely necessary, but good to keep the spawn_id for later +set telnet $spawn_id +# Case insensitive, just in case.. +expect -nocase "login:" +send "user\r" +# My telnetd insisted on an uppercase P. This works bothways +expect -nocase "password:" +send "SENHA\r" +# Match the prompt (contains a $) +expect -re {\$} +# Get the environment variables +send "env\r" +# Wait for the prompt +expect -re {\$} +exit diff --git a/misc/google b/misc/google new file mode 100755 index 0000000..b0e15ea --- /dev/null +++ b/misc/google @@ -0,0 +1,17 @@ +#!/bin/bash + +BROWSER=lynx + +if [ $# -eq 0 ] +then + echo "Usage: chkargs argument..." 1>&2 + exit 1 +fi + +search=$1 +while shift +do + search="$search+$1" +done + +$BROWSER "http://www.google.com/search?q=$search" & diff --git a/misc/mount-tablet b/misc/mount-tablet new file mode 100755 index 0000000..b73c2eb --- /dev/null +++ b/misc/mount-tablet @@ -0,0 +1,21 @@ +#!/bin/bash +# +# mount-tablet +# + +# Parameters +BASENAME="`basename $0`" +MOUNTPOINT="/media/tablet" + +# Set sudo config +if [ "`whoami`" != 'root' ]; then + sudo="sudo" +fi + +if [ "$BASENAME" == "mount-tablet" ]; then + $sudo mkdir -p $MOUNTPOINT + $sudo mtpfs -o allow_other $MOUNTPOINT +elif [ "$BASENAME" == "umount-tablet" ]; then + $sudo umount $MOUNTPOINT +fi + diff --git a/misc/noisecd b/misc/noisecd new file mode 100755 index 0000000..c83bbc1 --- /dev/null +++ b/misc/noisecd @@ -0,0 +1,59 @@ +#!/bin/bash +# +# noisecd: add noise cd to rhatto's +# noise cd txt database +# +# feedback: rhatto@riseup.net | GPL +# +# cansado(a) de nao saber onde estah aquela musica ou arquivo num +# sistema de armazenamento distribuido em dezenas de cds? +# +# aqui estah sua solucao! mantenha uma arvore completa de todos os +# seus arquivos disponiveis em midia removivel no seu proprio +# diretorio pessoal, com um truque muito simples. +# +# etiquete os seus cds de mp3, por exemplo, de noise 1, noise 2, +# noise 3, ..., noise n; em seguida, crie n pastas com os nomes iguais +# ao nome de cada cd; em seguida, monte o cd e entre em sua pasta +# especifica e de um comando do tipo +# +# cp -R -s /cdrom/* . +# +# isso criara recursivamente em sua pasta os links simbolicos que vao +# direto pros arquivos do cd, desde que este seja o cd atualmente montado. +# +# se voce fizer com todos os seus cds de musica, o resultado sera uma +# arvore completa contendo links simbolicos para arquivos dos cds. +# +# com isso voce pode procurar suas musicas mais facilmente atraves do find +# ou do locate, ou entao navegando entre as pastas; uma vez achado o +# arquivo desejado, eh soh montar o respectivo cd e ir pra galera! +# +# este script eh um exemplo de como automatizar a tarefa de criar essa arvore. +# + +NOISE_TREE=/var/data/catalogo/noise +NOISE_DATABASE=$NOISE_TREE/noise-cd.txt +NOISE_DIR=/media/cdrom +NOISE_MODE="complex" + +if [ -z "$1" ]; then + echo "usage: `basename $0` <cd-number>" + exit 1 +fi + +cd $NOISE_DIR +ls -R -A -1 | sed -e "s/^/$1 /" >> $NOISE_DATABASE + +if [ "$NOISE_MODE" != "simple" ]; then + + mkdir "$NOISE_TREE/noise-$1" + cd "$NOISE_TREE/noise-$1" + cp -R -s $NOISE_DIR/* . + + cd "$NOISE_TREE" + rm -f noise-tree.tar.gz; cd .. + tar zcvf noise-tree.tar.gz "$NOISE_TREE/" + mv noise-tree.tar.gz "$NOISE_TREE/" + +fi diff --git a/misc/parse_remind.pl b/misc/parse_remind.pl new file mode 100644 index 0000000..bdd9f23 --- /dev/null +++ b/misc/parse_remind.pl @@ -0,0 +1,41 @@ +#!/usr/bin/perl +# +# This script is designed to have an email piped to it eg. from mutt. +# It will split apart all the text/calendar attachments and enter them into +# the 'remind' calendar. +# + +use strict; +use warnings; + +use MIME::Parser; + +my $CONVERT = '~/.mutt/ical2rem.pl'; +my $REMINDERS = '~/remind/mutt.rem'; + +################################################################################ + +my $parser = new MIME::Parser; +$parser->output_under('/tmp'); +my $entity = $parser->parse(\*STDIN); + +my @parts = $entity->parts(); +my $count = 0; + +foreach my $part (@parts) { + if ($part->head->mime_type eq 'text/calendar') { + my $body = $part->bodyhandle; + my $cmd = $CONVERT.' '.$body->path.' >> '.$REMINDERS; + print STDERR `$cmd`; + last if ($? != 0); + $count++; + } +} + +$parser->filer->purge; +if ($count == 0) { + print STDERR "No calendar entries found."; + exit(1); +} + +exit(0); diff --git a/misc/ps_mem.py b/misc/ps_mem.py new file mode 100755 index 0000000..deae67f --- /dev/null +++ b/misc/ps_mem.py @@ -0,0 +1,240 @@ +#!/usr/bin/env python + +# Try to determine how much RAM is currently being used per program. +# Note per _program_, not per process. So for example this script +# will report RAM used by all httpd process together. In detail it reports: +# sum(private RAM for program processes) + sum(Shared RAM for program processes) +# The shared RAM is problematic to calculate, and this script automatically +# selects the most accurate method available for your kernel. + +# Author: P@draigBrady.com +# Source: http://www.pixelbeat.org/scripts/ps_mem.py + +# V1.0 06 Jul 2005 Initial release +# V1.1 11 Aug 2006 root permission required for accuracy +# V1.2 08 Nov 2006 Add total to output +# Use KiB,MiB,... for units rather than K,M,... +# V1.3 22 Nov 2006 Ignore shared col from /proc/$pid/statm for +# 2.6 kernels up to and including 2.6.9. +# There it represented the total file backed extent +# V1.4 23 Nov 2006 Remove total from output as it's meaningless +# (the shared values overlap with other programs). +# Display the shared column. This extra info is +# useful, especially as it overlaps between programs. +# V1.5 26 Mar 2007 Remove redundant recursion from human() +# V1.6 05 Jun 2007 Also report number of processes with a given name. +# Patch from riccardo.murri@gmail.com +# V1.7 20 Sep 2007 Use PSS from /proc/$pid/smaps if available, which +# fixes some over-estimation and allows totalling. +# Enumerate the PIDs directly rather than using ps, +# which fixes the possible race between reading +# RSS with ps, and shared memory with this program. +# Also we can show non truncated command names. +# V1.8 28 Sep 2007 More accurate matching for stats in /proc/$pid/smaps +# as otherwise could match libraries causing a crash. +# Patch from patrice.bouchand.fedora@gmail.com +# V1.9 20 Feb 2008 Fix invalid values reported when PSS is available. +# Reported by Andrey Borzenkov <arvidjaar@mail.ru> + +# Notes: +# +# All interpreted programs where the interpreter is started +# by the shell or with env, will be merged to the interpreter +# (as that's what's given to exec). For e.g. all python programs +# starting with "#!/usr/bin/env python" will be grouped under python. +# You can change this by changing comm= to args= below but that will +# have the undesirable affect of splitting up programs started with +# differing parameters (for e.g. mingetty tty[1-6]). +# +# For 2.6 kernels up to and including 2.6.13 and later 2.4 redhat kernels +# (rmap vm without smaps) it can not be accurately determined how many pages +# are shared between processes in general or within a program in our case: +# http://lkml.org/lkml/2005/7/6/250 +# A warning is printed if overestimation is possible. +# In addition for 2.6 kernels up to 2.6.9 inclusive, the shared +# value in /proc/$pid/statm is the total file-backed extent of a process. +# We ignore that, introducing more overestimation, again printing a warning. +# Since kernel 2.6.23-rc8-mm1 PSS is available in smaps, which allows +# us to calculate a more accurate value for the total RAM used by programs. +# +# I don't take account of memory allocated for a program +# by other programs. For e.g. memory used in the X server for +# a program could be determined, but is not. + +import sys, os, string + +if os.geteuid() != 0: + sys.stderr.write("Sorry, root permission required.\n"); + sys.exit(1) + +PAGESIZE=os.sysconf("SC_PAGE_SIZE")/1024 #KiB +our_pid=os.getpid() + +#(major,minor,release) +def kernel_ver(): + kv=open("/proc/sys/kernel/osrelease").readline().split(".")[:3] + for char in "-_": + kv[2]=kv[2].split(char)[0] + return (int(kv[0]), int(kv[1]), int(kv[2])) + +kv=kernel_ver() + +have_pss=0 + +#return Private,Shared +#Note shared is always a subset of rss (trs is not always) +def getMemStats(pid): + global have_pss + Private_lines=[] + Shared_lines=[] + Pss_lines=[] + Rss=int(open("/proc/"+str(pid)+"/statm").readline().split()[1])*PAGESIZE + if os.path.exists("/proc/"+str(pid)+"/smaps"): #stat + for line in open("/proc/"+str(pid)+"/smaps").readlines(): #open + if line.startswith("Shared"): + Shared_lines.append(line) + elif line.startswith("Private"): + Private_lines.append(line) + elif line.startswith("Pss"): + have_pss=1 + Pss_lines.append(line) + Shared=sum([int(line.split()[1]) for line in Shared_lines]) + Private=sum([int(line.split()[1]) for line in Private_lines]) + #Note Shared + Private = Rss above + #The Rss in smaps includes video card mem etc. + if have_pss: + pss_adjust=0.5 #add 0.5KiB as this average error due to trunctation + Pss=sum([float(line.split()[1])+pss_adjust for line in Pss_lines]) + Shared = Pss - Private + elif (2,6,1) <= kv <= (2,6,9): + Shared=0 #lots of overestimation, but what can we do? + Private = Rss + else: + Shared=int(open("/proc/"+str(pid)+"/statm").readline().split()[2]) + Shared*=PAGESIZE + Private = Rss - Shared + return (Private, Shared) + +def getCmdName(pid): + cmd = file("/proc/%d/status" % pid).readline()[6:-1] + exe = os.path.basename(os.path.realpath("/proc/%d/exe" % pid)) + if exe.startswith(cmd): + cmd=exe #show non truncated version + #Note because we show the non truncated name + #one can have separated programs as follows: + #584.0 KiB + 1.0 MiB = 1.6 MiB mozilla-thunder (exe -> bash) + # 56.0 MiB + 22.2 MiB = 78.2 MiB mozilla-thunderbird-bin + return cmd + +cmds={} +shareds={} +count={} +for pid in os.listdir("/proc/"): + try: + pid = int(pid) #note Thread IDs not listed in /proc/ which is good + if pid == our_pid: continue + except: + continue + try: + cmd = getCmdName(pid) + except: + #permission denied or + #kernel threads don't have exe links or + #process gone + continue + try: + private, shared = getMemStats(pid) + except: + continue #process gone + if shareds.get(cmd): + if have_pss: #add shared portion of PSS together + shareds[cmd]+=shared + elif shareds[cmd] < shared: #just take largest shared val + shareds[cmd]=shared + else: + shareds[cmd]=shared + cmds[cmd]=cmds.setdefault(cmd,0)+private + if count.has_key(cmd): + count[cmd] += 1 + else: + count[cmd] = 1 + +#Add shared mem for each program +total=0 +for cmd in cmds.keys(): + cmds[cmd]=cmds[cmd]+shareds[cmd] + total+=cmds[cmd] #valid if PSS available + +sort_list = cmds.items() +sort_list.sort(lambda x,y:cmp(x[1],y[1])) +sort_list=filter(lambda x:x[1],sort_list) #get rid of zero sized processes + +#The following matches "du -h" output +#see also human.py +def human(num, power="Ki"): + powers=["Ki","Mi","Gi","Ti"] + while num >= 1000: #4 digits + num /= 1024.0 + power=powers[powers.index(power)+1] + return "%.1f %s" % (num,power) + +def cmd_with_count(cmd, count): + if count>1: + return "%s (%u)" % (cmd, count) + else: + return cmd + +print " Private + Shared = RAM used\tProgram \n" +for cmd in sort_list: + print "%8sB + %8sB = %8sB\t%s" % (human(cmd[1]-shareds[cmd[0]]), + human(shareds[cmd[0]]), human(cmd[1]), + cmd_with_count(cmd[0], count[cmd[0]])) +if have_pss: + print "-" * 33 + print " " * 24 + "%8sB" % human(total) + print "=" * 33 +print "\n Private + Shared = RAM used\tProgram \n" + +#Warn of possible inaccuracies +#2 = accurate & can total +#1 = accurate only considering each process in isolation +#0 = some shared mem not reported +#-1= all shared mem not reported +def shared_val_accuracy(): + """http://wiki.apache.org/spamassassin/TopSharedMemoryBug""" + if kv[:2] == (2,4): + if open("/proc/meminfo").read().find("Inact_") == -1: + return 1 + return 0 + elif kv[:2] == (2,6): + if os.path.exists("/proc/"+str(os.getpid())+"/smaps"): + if open("/proc/"+str(os.getpid())+"/smaps").read().find("Pss:")!=-1: + return 2 + else: + return 1 + if (2,6,1) <= kv <= (2,6,9): + return -1 + return 0 + else: + return 1 + +vm_accuracy = shared_val_accuracy() +if vm_accuracy == -1: + sys.stderr.write( + "Warning: Shared memory is not reported by this system.\n" + ) + sys.stderr.write( + "Values reported will be too large, and totals are not reported\n" + ) +elif vm_accuracy == 0: + sys.stderr.write( + "Warning: Shared memory is not reported accurately by this system.\n" + ) + sys.stderr.write( + "Values reported could be too large, and totals are not reported\n" + ) +elif vm_accuracy == 1: + sys.stderr.write( + "Warning: Shared memory is slightly over-estimated by this system\n" + "for each program, so totals are not reported.\n" + ) diff --git a/misc/repo b/misc/repo new file mode 100755 index 0000000..d6b46c8 --- /dev/null +++ b/misc/repo @@ -0,0 +1,710 @@ +#!/bin/sh + +## repo default configuration +## +REPO_URL='https://gerrit.googlesource.com/git-repo' +REPO_REV='stable' + +# Copyright (C) 2008 Google Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +magic='--calling-python-from-/bin/sh--' +"""exec" python -E "$0" "$@" """#$magic" +if __name__ == '__main__': + import sys + if sys.argv[-1] == '#%s' % magic: + del sys.argv[-1] +del magic + +# increment this whenever we make important changes to this script +VERSION = (1, 17) + +# increment this if the MAINTAINER_KEYS block is modified +KEYRING_VERSION = (1,0) +MAINTAINER_KEYS = """ + + Repo Maintainer <repo@android.kernel.org> +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: GnuPG v1.4.2.2 (GNU/Linux) + +mQGiBEj3ugERBACrLJh/ZPyVSKeClMuznFIrsQ+hpNnmJGw1a9GXKYKk8qHPhAZf +WKtrBqAVMNRLhL85oSlekRz98u41H5si5zcuv+IXJDF5MJYcB8f22wAy15lUqPWi +VCkk1l8qqLiuW0fo+ZkPY5qOgrvc0HW1SmdH649uNwqCbcKb6CxaTxzhOwCgj3AP +xI1WfzLqdJjsm1Nq98L0cLcD/iNsILCuw44PRds3J75YP0pze7YF/6WFMB6QSFGu +aUX1FsTTztKNXGms8i5b2l1B8JaLRWq/jOnZzyl1zrUJhkc0JgyZW5oNLGyWGhKD +Fxp5YpHuIuMImopWEMFIRQNrvlg+YVK8t3FpdI1RY0LYqha8pPzANhEYgSfoVzOb +fbfbA/4ioOrxy8ifSoga7ITyZMA+XbW8bx33WXutO9N7SPKS/AK2JpasSEVLZcON +ae5hvAEGVXKxVPDjJBmIc2cOe7kOKSi3OxLzBqrjS2rnjiP4o0ekhZIe4+ocwVOg +e0PLlH5avCqihGRhpoqDRsmpzSHzJIxtoeb+GgGEX8KkUsVAhbQpUmVwbyBNYWlu +dGFpbmVyIDxyZXBvQGFuZHJvaWQua2VybmVsLm9yZz6IYAQTEQIAIAUCSPe6AQIb +AwYLCQgHAwIEFQIIAwQWAgMBAh4BAheAAAoJEBZTDV6SD1xl1GEAn0x/OKQpy7qI +6G73NJviU0IUMtftAKCFMUhGb/0bZvQ8Rm3QCUpWHyEIu7kEDQRI97ogEBAA2wI6 +5fs9y/rMwD6dkD/vK9v4C9mOn1IL5JCPYMJBVSci+9ED4ChzYvfq7wOcj9qIvaE0 +GwCt2ar7Q56me5J+byhSb32Rqsw/r3Vo5cZMH80N4cjesGuSXOGyEWTe4HYoxnHv +gF4EKI2LK7xfTUcxMtlyn52sUpkfKsCpUhFvdmbAiJE+jCkQZr1Z8u2KphV79Ou+ +P1N5IXY/XWOlq48Qf4MWCYlJFrB07xjUjLKMPDNDnm58L5byDrP/eHysKexpbakL +xCmYyfT6DV1SWLblpd2hie0sL3YejdtuBMYMS2rI7Yxb8kGuqkz+9l1qhwJtei94 +5MaretDy/d/JH/pRYkRf7L+ke7dpzrP+aJmcz9P1e6gq4NJsWejaALVASBiioqNf +QmtqSVzF1wkR5avZkFHuYvj6V/t1RrOZTXxkSk18KFMJRBZrdHFCWbc5qrVxUB6e +N5pja0NFIUCigLBV1c6I2DwiuboMNh18VtJJh+nwWeez/RueN4ig59gRTtkcc0PR +35tX2DR8+xCCFVW/NcJ4PSePYzCuuLvp1vEDHnj41R52Fz51hgddT4rBsp0nL+5I +socSOIIezw8T9vVzMY4ArCKFAVu2IVyBcahTfBS8q5EM63mONU6UVJEozfGljiMw +xuQ7JwKcw0AUEKTKG7aBgBaTAgT8TOevpvlw91cAAwUP/jRkyVi/0WAb0qlEaq/S +ouWxX1faR+vU3b+Y2/DGjtXQMzG0qpetaTHC/AxxHpgt/dCkWI6ljYDnxgPLwG0a +Oasm94BjZc6vZwf1opFZUKsjOAAxRxNZyjUJKe4UZVuMTk6zo27Nt3LMnc0FO47v +FcOjRyquvgNOS818irVHUf12waDx8gszKxQTTtFxU5/ePB2jZmhP6oXSe4K/LG5T ++WBRPDrHiGPhCzJRzm9BP0lTnGCAj3o9W90STZa65RK7IaYpC8TB35JTBEbrrNCp +w6lzd74LnNEp5eMlKDnXzUAgAH0yzCQeMl7t33QCdYx2hRs2wtTQSjGfAiNmj/WW +Vl5Jn+2jCDnRLenKHwVRFsBX2e0BiRWt/i9Y8fjorLCXVj4z+7yW6DawdLkJorEo +p3v5ILwfC7hVx4jHSnOgZ65L9s8EQdVr1ckN9243yta7rNgwfcqb60ILMFF1BRk/ +0V7wCL+68UwwiQDvyMOQuqkysKLSDCLb7BFcyA7j6KG+5hpsREstFX2wK1yKeraz +5xGrFy8tfAaeBMIQ17gvFSp/suc9DYO0ICK2BISzq+F+ZiAKsjMYOBNdH/h0zobQ +HTHs37+/QLMomGEGKZMWi0dShU2J5mNRQu3Hhxl3hHDVbt5CeJBb26aQcQrFz69W +zE3GNvmJosh6leayjtI9P2A6iEkEGBECAAkFAkj3uiACGwwACgkQFlMNXpIPXGWp +TACbBS+Up3RpfYVfd63c1cDdlru13pQAn3NQy/SN858MkxN+zym86UBgOad2 +=CMiZ +-----END PGP PUBLIC KEY BLOCK----- +""" + +GIT = 'git' # our git command +MIN_GIT_VERSION = (1, 5, 4) # minimum supported git version +repodir = '.repo' # name of repo's private directory +S_repo = 'repo' # special repo reposiory +S_manifests = 'manifests' # special manifest repository +REPO_MAIN = S_repo + '/main.py' # main script + + +import optparse +import os +import re +import readline +import subprocess +import sys +import urllib2 + +home_dot_repo = os.path.expanduser('~/.repoconfig') +gpg_dir = os.path.join(home_dot_repo, 'gnupg') + +extra_args = [] +init_optparse = optparse.OptionParser(usage="repo init -u url [options]") + +# Logging +group = init_optparse.add_option_group('Logging options') +group.add_option('-q', '--quiet', + dest="quiet", action="store_true", default=False, + help="be quiet") + +# Manifest +group = init_optparse.add_option_group('Manifest options') +group.add_option('-u', '--manifest-url', + dest='manifest_url', + help='manifest repository location', metavar='URL') +group.add_option('-b', '--manifest-branch', + dest='manifest_branch', + help='manifest branch or revision', metavar='REVISION') +group.add_option('-m', '--manifest-name', + dest='manifest_name', + help='initial manifest file', metavar='NAME.xml') +group.add_option('--mirror', + dest='mirror', action='store_true', + help='mirror the forrest') +group.add_option('--reference', + dest='reference', + help='location of mirror directory', metavar='DIR') +group.add_option('--depth', type='int', default=None, + dest='depth', + help='create a shallow clone with given depth; see git clone') +group.add_option('-g', '--groups', + dest='groups', default='default', + help='restrict manifest projects to ones with a specified group', + metavar='GROUP') +group.add_option('-p', '--platform', + dest='platform', default="auto", + help='restrict manifest projects to ones with a specified' + 'platform group [auto|all|none|linux|darwin|...]', + metavar='PLATFORM') + + +# Tool +group = init_optparse.add_option_group('repo Version options') +group.add_option('--repo-url', + dest='repo_url', + help='repo repository location', metavar='URL') +group.add_option('--repo-branch', + dest='repo_branch', + help='repo branch or revision', metavar='REVISION') +group.add_option('--no-repo-verify', + dest='no_repo_verify', action='store_true', + help='do not verify repo source code') + +# Other +group = init_optparse.add_option_group('Other options') +group.add_option('--config-name', + dest='config_name', action="store_true", default=False, + help='Always prompt for name/e-mail') + +class CloneFailure(Exception): + """Indicate the remote clone of repo itself failed. + """ + + +def _Init(args): + """Installs repo by cloning it over the network. + """ + opt, args = init_optparse.parse_args(args) + if args: + init_optparse.print_usage() + sys.exit(1) + + url = opt.repo_url + if not url: + url = REPO_URL + extra_args.append('--repo-url=%s' % url) + + branch = opt.repo_branch + if not branch: + branch = REPO_REV + extra_args.append('--repo-branch=%s' % branch) + + if branch.startswith('refs/heads/'): + branch = branch[len('refs/heads/'):] + if branch.startswith('refs/'): + print >>sys.stderr, "fatal: invalid branch name '%s'" % branch + raise CloneFailure() + + if not os.path.isdir(repodir): + try: + os.mkdir(repodir) + except OSError, e: + print >>sys.stderr, \ + 'fatal: cannot make %s directory: %s' % ( + repodir, e.strerror) + # Don't faise CloneFailure; that would delete the + # name. Instead exit immediately. + # + sys.exit(1) + + _CheckGitVersion() + try: + if _NeedSetupGnuPG(): + can_verify = _SetupGnuPG(opt.quiet) + else: + can_verify = True + + dst = os.path.abspath(os.path.join(repodir, S_repo)) + _Clone(url, dst, opt.quiet) + + if can_verify and not opt.no_repo_verify: + rev = _Verify(dst, branch, opt.quiet) + else: + rev = 'refs/remotes/origin/%s^0' % branch + + _Checkout(dst, branch, rev, opt.quiet) + except CloneFailure: + if opt.quiet: + print >>sys.stderr, \ + 'fatal: repo init failed; run without --quiet to see why' + raise + + +def _CheckGitVersion(): + cmd = [GIT, '--version'] + try: + proc = subprocess.Popen(cmd, stdout=subprocess.PIPE) + except OSError, e: + print >>sys.stderr + print >>sys.stderr, "fatal: '%s' is not available" % GIT + print >>sys.stderr, 'fatal: %s' % e + print >>sys.stderr + print >>sys.stderr, 'Please make sure %s is installed'\ + ' and in your path.' % GIT + raise CloneFailure() + + ver_str = proc.stdout.read().strip() + proc.stdout.close() + proc.wait() + + if not ver_str.startswith('git version '): + print >>sys.stderr, 'error: "%s" unsupported' % ver_str + raise CloneFailure() + + ver_str = ver_str[len('git version '):].strip() + ver_act = tuple(map(lambda x: int(x), ver_str.split('.')[0:3])) + if ver_act < MIN_GIT_VERSION: + need = '.'.join(map(lambda x: str(x), MIN_GIT_VERSION)) + print >>sys.stderr, 'fatal: git %s or later required' % need + raise CloneFailure() + + +def _NeedSetupGnuPG(): + if not os.path.isdir(home_dot_repo): + return True + + kv = os.path.join(home_dot_repo, 'keyring-version') + if not os.path.exists(kv): + return True + + kv = open(kv).read() + if not kv: + return True + + kv = tuple(map(lambda x: int(x), kv.split('.'))) + if kv < KEYRING_VERSION: + return True + return False + + +def _SetupGnuPG(quiet): + if not os.path.isdir(home_dot_repo): + try: + os.mkdir(home_dot_repo) + except OSError, e: + print >>sys.stderr, \ + 'fatal: cannot make %s directory: %s' % ( + home_dot_repo, e.strerror) + sys.exit(1) + + if not os.path.isdir(gpg_dir): + try: + os.mkdir(gpg_dir, 0700) + except OSError, e: + print >>sys.stderr, \ + 'fatal: cannot make %s directory: %s' % ( + gpg_dir, e.strerror) + sys.exit(1) + + env = os.environ.copy() + env['GNUPGHOME'] = gpg_dir.encode() + + cmd = ['gpg', '--import'] + try: + proc = subprocess.Popen(cmd, + env = env, + stdin = subprocess.PIPE) + except OSError, e: + if not quiet: + print >>sys.stderr, 'warning: gpg (GnuPG) is not available.' + print >>sys.stderr, 'warning: Installing it is strongly encouraged.' + print >>sys.stderr + return False + + proc.stdin.write(MAINTAINER_KEYS) + proc.stdin.close() + + if proc.wait() != 0: + print >>sys.stderr, 'fatal: registering repo maintainer keys failed' + sys.exit(1) + print + + fd = open(os.path.join(home_dot_repo, 'keyring-version'), 'w') + fd.write('.'.join(map(lambda x: str(x), KEYRING_VERSION)) + '\n') + fd.close() + return True + + +def _SetConfig(local, name, value): + """Set a git configuration option to the specified value. + """ + cmd = [GIT, 'config', name, value] + if subprocess.Popen(cmd, cwd = local).wait() != 0: + raise CloneFailure() + + +def _InitHttp(): + handlers = [] + + mgr = urllib2.HTTPPasswordMgrWithDefaultRealm() + try: + import netrc + n = netrc.netrc() + for host in n.hosts: + p = n.hosts[host] + mgr.add_password(p[1], 'http://%s/' % host, p[0], p[2]) + mgr.add_password(p[1], 'https://%s/' % host, p[0], p[2]) + except: + pass + handlers.append(urllib2.HTTPBasicAuthHandler(mgr)) + handlers.append(urllib2.HTTPDigestAuthHandler(mgr)) + + if 'http_proxy' in os.environ: + url = os.environ['http_proxy'] + handlers.append(urllib2.ProxyHandler({'http': url, 'https': url})) + if 'REPO_CURL_VERBOSE' in os.environ: + handlers.append(urllib2.HTTPHandler(debuglevel=1)) + handlers.append(urllib2.HTTPSHandler(debuglevel=1)) + urllib2.install_opener(urllib2.build_opener(*handlers)) + +def _Fetch(url, local, src, quiet): + if not quiet: + print >>sys.stderr, 'Get %s' % url + + cmd = [GIT, 'fetch'] + if quiet: + cmd.append('--quiet') + err = subprocess.PIPE + else: + err = None + cmd.append(src) + cmd.append('+refs/heads/*:refs/remotes/origin/*') + cmd.append('refs/tags/*:refs/tags/*') + + proc = subprocess.Popen(cmd, cwd = local, stderr = err) + if err: + proc.stderr.read() + proc.stderr.close() + if proc.wait() != 0: + raise CloneFailure() + +def _DownloadBundle(url, local, quiet): + if not url.endswith('/'): + url += '/' + url += 'clone.bundle' + + proc = subprocess.Popen( + [GIT, 'config', '--get-regexp', 'url.*.insteadof'], + cwd = local, + stdout = subprocess.PIPE) + for line in proc.stdout: + m = re.compile(r'^url\.(.*)\.insteadof (.*)$').match(line) + if m: + new_url = m.group(1) + old_url = m.group(2) + if url.startswith(old_url): + url = new_url + url[len(old_url):] + break + proc.stdout.close() + proc.wait() + + if not url.startswith('http:') and not url.startswith('https:'): + return False + + dest = open(os.path.join(local, '.git', 'clone.bundle'), 'w+b') + try: + try: + r = urllib2.urlopen(url) + except urllib2.HTTPError, e: + if e.code == 404: + return False + print >>sys.stderr, 'fatal: Cannot get %s' % url + print >>sys.stderr, 'fatal: HTTP error %s' % e.code + raise CloneFailure() + except urllib2.URLError, e: + print >>sys.stderr, 'fatal: Cannot get %s' % url + print >>sys.stderr, 'fatal: error %s' % e.reason + raise CloneFailure() + try: + if not quiet: + print >>sys.stderr, 'Get %s' % url + while True: + buf = r.read(8192) + if buf == '': + return True + dest.write(buf) + finally: + r.close() + finally: + dest.close() + +def _ImportBundle(local): + path = os.path.join(local, '.git', 'clone.bundle') + try: + _Fetch(local, local, path, True) + finally: + os.remove(path) + +def _Clone(url, local, quiet): + """Clones a git repository to a new subdirectory of repodir + """ + try: + os.mkdir(local) + except OSError, e: + print >>sys.stderr, \ + 'fatal: cannot make %s directory: %s' \ + % (local, e.strerror) + raise CloneFailure() + + cmd = [GIT, 'init', '--quiet'] + try: + proc = subprocess.Popen(cmd, cwd = local) + except OSError, e: + print >>sys.stderr + print >>sys.stderr, "fatal: '%s' is not available" % GIT + print >>sys.stderr, 'fatal: %s' % e + print >>sys.stderr + print >>sys.stderr, 'Please make sure %s is installed'\ + ' and in your path.' % GIT + raise CloneFailure() + if proc.wait() != 0: + print >>sys.stderr, 'fatal: could not create %s' % local + raise CloneFailure() + + _InitHttp() + _SetConfig(local, 'remote.origin.url', url) + _SetConfig(local, 'remote.origin.fetch', + '+refs/heads/*:refs/remotes/origin/*') + if _DownloadBundle(url, local, quiet): + _ImportBundle(local) + else: + _Fetch(url, local, 'origin', quiet) + + +def _Verify(cwd, branch, quiet): + """Verify the branch has been signed by a tag. + """ + cmd = [GIT, 'describe', 'origin/%s' % branch] + proc = subprocess.Popen(cmd, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + cwd = cwd) + cur = proc.stdout.read().strip() + proc.stdout.close() + + proc.stderr.read() + proc.stderr.close() + + if proc.wait() != 0 or not cur: + print >>sys.stderr + print >>sys.stderr,\ + "fatal: branch '%s' has not been signed" \ + % branch + raise CloneFailure() + + m = re.compile(r'^(.*)-[0-9]{1,}-g[0-9a-f]{1,}$').match(cur) + if m: + cur = m.group(1) + if not quiet: + print >>sys.stderr + print >>sys.stderr, \ + "info: Ignoring branch '%s'; using tagged release '%s'" \ + % (branch, cur) + print >>sys.stderr + + env = os.environ.copy() + env['GNUPGHOME'] = gpg_dir.encode() + + cmd = [GIT, 'tag', '-v', cur] + proc = subprocess.Popen(cmd, + stdout = subprocess.PIPE, + stderr = subprocess.PIPE, + cwd = cwd, + env = env) + out = proc.stdout.read() + proc.stdout.close() + + err = proc.stderr.read() + proc.stderr.close() + + if proc.wait() != 0: + print >>sys.stderr + print >>sys.stderr, out + print >>sys.stderr, err + print >>sys.stderr + raise CloneFailure() + return '%s^0' % cur + + +def _Checkout(cwd, branch, rev, quiet): + """Checkout an upstream branch into the repository and track it. + """ + cmd = [GIT, 'update-ref', 'refs/heads/default', rev] + if subprocess.Popen(cmd, cwd = cwd).wait() != 0: + raise CloneFailure() + + _SetConfig(cwd, 'branch.default.remote', 'origin') + _SetConfig(cwd, 'branch.default.merge', 'refs/heads/%s' % branch) + + cmd = [GIT, 'symbolic-ref', 'HEAD', 'refs/heads/default'] + if subprocess.Popen(cmd, cwd = cwd).wait() != 0: + raise CloneFailure() + + cmd = [GIT, 'read-tree', '--reset', '-u'] + if not quiet: + cmd.append('-v') + cmd.append('HEAD') + if subprocess.Popen(cmd, cwd = cwd).wait() != 0: + raise CloneFailure() + + +def _FindRepo(): + """Look for a repo installation, starting at the current directory. + """ + dir = os.getcwd() + repo = None + + olddir = None + while dir != '/' \ + and dir != olddir \ + and not repo: + repo = os.path.join(dir, repodir, REPO_MAIN) + if not os.path.isfile(repo): + repo = None + olddir = dir + dir = os.path.dirname(dir) + return (repo, os.path.join(dir, repodir)) + + +class _Options: + help = False + + +def _ParseArguments(args): + cmd = None + opt = _Options() + arg = [] + + for i in xrange(0, len(args)): + a = args[i] + if a == '-h' or a == '--help': + opt.help = True + + elif not a.startswith('-'): + cmd = a + arg = args[i + 1:] + break + return cmd, opt, arg + + +def _Usage(): + print >>sys.stderr,\ +"""usage: repo COMMAND [ARGS] + +repo is not yet installed. Use "repo init" to install it here. + +The most commonly used repo commands are: + + init Install repo in the current working directory + help Display detailed help on a command + +For access to the full online help, install repo ("repo init"). +""" + sys.exit(1) + + +def _Help(args): + if args: + if args[0] == 'init': + init_optparse.print_help() + sys.exit(0) + else: + print >>sys.stderr,\ + "error: '%s' is not a bootstrap command.\n"\ + ' For access to online help, install repo ("repo init").'\ + % args[0] + else: + _Usage() + sys.exit(1) + + +def _NotInstalled(): + print >>sys.stderr,\ +'error: repo is not installed. Use "repo init" to install it here.' + sys.exit(1) + + +def _NoCommands(cmd): + print >>sys.stderr,\ +"""error: command '%s' requires repo to be installed first. + Use "repo init" to install it here.""" % cmd + sys.exit(1) + + +def _RunSelf(wrapper_path): + my_dir = os.path.dirname(wrapper_path) + my_main = os.path.join(my_dir, 'main.py') + my_git = os.path.join(my_dir, '.git') + + if os.path.isfile(my_main) and os.path.isdir(my_git): + for name in ['git_config.py', + 'project.py', + 'subcmds']: + if not os.path.exists(os.path.join(my_dir, name)): + return None, None + return my_main, my_git + return None, None + + +def _SetDefaultsTo(gitdir): + global REPO_URL + global REPO_REV + + REPO_URL = gitdir + proc = subprocess.Popen([GIT, + '--git-dir=%s' % gitdir, + 'symbolic-ref', + 'HEAD'], + stdout = subprocess.PIPE, + stderr = subprocess.PIPE) + REPO_REV = proc.stdout.read().strip() + proc.stdout.close() + + proc.stderr.read() + proc.stderr.close() + + if proc.wait() != 0: + print >>sys.stderr, 'fatal: %s has no current branch' % gitdir + sys.exit(1) + + +def main(orig_args): + main, dir = _FindRepo() + cmd, opt, args = _ParseArguments(orig_args) + + wrapper_path = os.path.abspath(__file__) + my_main, my_git = _RunSelf(wrapper_path) + + if not main: + if opt.help: + _Usage() + if cmd == 'help': + _Help(args) + if not cmd: + _NotInstalled() + if cmd == 'init': + if my_git: + _SetDefaultsTo(my_git) + try: + _Init(args) + except CloneFailure: + for root, dirs, files in os.walk(repodir, topdown=False): + for name in files: + os.remove(os.path.join(root, name)) + for name in dirs: + os.rmdir(os.path.join(root, name)) + os.rmdir(repodir) + sys.exit(1) + main, dir = _FindRepo() + else: + _NoCommands(cmd) + + if my_main: + main = my_main + + ver_str = '.'.join(map(lambda x: str(x), VERSION)) + me = [main, + '--repo-dir=%s' % dir, + '--wrapper-version=%s' % ver_str, + '--wrapper-path=%s' % wrapper_path, + '--'] + me.extend(orig_args) + me.extend(extra_args) + try: + os.execv(main, me) + except OSError, e: + print >>sys.stderr, "fatal: unable to start %s" % main + print >>sys.stderr, "fatal: %s" % e + sys.exit(148) + + +if __name__ == '__main__': + main(sys.argv[1:]) diff --git a/misc/scan b/misc/scan new file mode 100755 index 0000000..0b4c9eb --- /dev/null +++ b/misc/scan @@ -0,0 +1 @@ +sudo pxscan --port=0x378 --pos=0.0x0.0 --dim=8.49554140127x11.7 --color=-30/0/1.0 --res=100 -n $HOME/scanned-image.tif diff --git a/misc/sed/entities.sed b/misc/sed/entities.sed new file mode 100644 index 0000000..b2b4929 --- /dev/null +++ b/misc/sed/entities.sed @@ -0,0 +1,24 @@ +s/á/\á/g +s/ã/\ã/g +s/â/\â/g +s/à/\à/g +s/é/\é/g +s/ê/\ê/g +s/í/\í/g +s/ó/\ó/g +s/õ/\õ/g +s/ô/\ô/g +s/ú/\ú/g +s/ç/\ç/g +s/Á/\Á/g +s/Ã/\Ã/g +s/Â/\Â/g +s/É/\É/g +s/Ê/\Ê/g +s/Í/\Í/g +s/Ó/\Ó/g +s/Õ/\Õ/g +s/Ô/\Ô/g +s/Ú/\Ú/g +s/Ç/\Ç/g +s/ñ/\ñ/g diff --git a/misc/sed/justify.sed b/misc/sed/justify.sed new file mode 100755 index 0000000..0a2e5af --- /dev/null +++ b/misc/sed/justify.sed @@ -0,0 +1,68 @@ +#!/bin/sed -f +# justify.sed - aurélio marinho jargas <verde (a) aurelio net> +# +# it gets a text already wrapped on the desired number of columns +# and add extra white spaces, from left to right, word by word, +# to justify all the lines. there is a maximum of 5 spaces to be +# inserted between the words. if this limit is reached, the line +# is not justified (come on, more than 5 is horrible). empty +# lines are ignored. btw, this comments were justified with this +# script &:) +# +# 20000715 1st release +# 20000722 code cleaned + +# cleaning extra spaces of the line +s/ \+/ /g +s/^ // +s/ $// + +# we'll only justify lines with less than 65 chars +/^.\{65\}/b + +# backup of the 'stripped' line +h + +# spaces -> pattern +# convert series of spaces to a internal pattern `n +:s2p +s/ /`5/g +s/ /`4/g +s/ /`3/g +s/ /`2/g +s/ /`1/g +t 1space +b + +# pattern -> spaces +# restore the spaces converted to the internal pattern `n +:p2s +s/`5/ /g +s/`4/ /g +s/`3/ /g +s/`2/ /g +s/`1/ /g +t check +b + +# check if we've reached our right limit +# if not, continue adding spaces +:check +/^.\{65\}/!b s2p +b + +# here's the "magic": +# add 1 space to the first and minor internal pattern found. +# this way, the extra spaces are always added from left to right, +# always balanced, one by one. +# right after the substitution, we'll restore the spaces and +# test if our limit was reached. +:1space +s/`1/`2/ ; t p2s +s/`2/`3/ ; t p2s +s/`3/`4/ ; t p2s +s/`4/`5/ ; t p2s + +# we don't want to justify with more than 5 added spaces between +# words, so let's restore the original line +/`5/x diff --git a/misc/sed/mail-iso2txt.sed b/misc/sed/mail-iso2txt.sed new file mode 100644 index 0000000..d3bf429 --- /dev/null +++ b/misc/sed/mail-iso2txt.sed @@ -0,0 +1,55 @@ +#!/bin/sed -f +# mail-iso2txt.sed - 20000906 <verde (a) aurelio net> +# convert the email encoded chars =xx to the right hexa char +# +# ps.: needs GNU sed >= 3.02.80 because the s//\xnn/ notation + +s|=09|\x09|g +s|=20|\x20|g +s|=B7|\xb7|g +s|=BA|\xba|g +s|=C1|\xc1|g +s|=C2|\xc2|g +s|=C3|\xc3|g +s|=C4|\xc4|g +s|=C5|\xc5|g +s|=C6|\xc6|g +s|=C7|\xc7|g +s|=C8|\xc8|g +s|=C9|\xc9|g +s|=CA|\xca|g +s|=CB|\xcb|g +s|=CC|\xcc|g +s|=CD|\xcd|g +s|=CE|\xce|g +s|=CF|\xcf|g +s|=D7|\xd7|g +s|=E1|\xe1|g +s|=E2|\xe2|g +s|=E3|\xe3|g +s|=E4|\xe4|g +s|=E5|\xe5|g +s|=E6|\xe6|g +s|=E7|\xe7|g +s|=E8|\xe8|g +s|=E9|\xe9|g +s|=EA|\xea|g +s|=EB|\xeb|g +s|=EC|\xec|g +s|=ED|\xed|g +s|=EE|\xee|g +s|=EF|\xef|g +s|=F1|\xf1|g +s|=F2|\xf2|g +s|=F3|\xf3|g +s|=F4|\xf4|g +s|=F5|\xf5|g +s|=F6|\xf6|g +s|=F7|\xf7|g +s|=F8|\xf8|g +s|=F9|\xf9|g +s|=FA|\xfa|g +s|=FB|\xfb|g +s|=FC|\xfc|g +s|=$||g + diff --git a/misc/sed/mini-html2latex.sed b/misc/sed/mini-html2latex.sed new file mode 100644 index 0000000..03fd2d5 --- /dev/null +++ b/misc/sed/mini-html2latex.sed @@ -0,0 +1,9 @@ +s/<strong>/\\section{/g +s/<\/strong>/}/g +s/<i>/\\emph{/g +s/<\/i>/}/g +s/<a href=\"/\\link{/g +s/\">/}{/g +s/<\/a>/}/g +s/<pre>/\\begin{verbatim}/g +s/<\/pre>/\\end{verbatim}/g diff --git a/misc/sed/syndication.sed b/misc/sed/syndication.sed new file mode 100644 index 0000000..4b6b195 --- /dev/null +++ b/misc/sed/syndication.sed @@ -0,0 +1,27 @@ +s/Â/\Â/g +s/â/\â/g +s/ã/\ã/g +s/é/\é/g +s/ô/\ô/g +s/á/\á/g +s/Ã/\Í/g +s/Ã/\í/g +s/ç/\ç/g +s/õ/\õ/g +s/ê/\ê/g +s/Ç/\Ç/g +s/Ã/\Ã/g +s/ó/\ó/g +s/ú/\ú/g +s/Ê/\Ê/g +s/É/\É/g +s/Ã/\Á/g +s/Ú/\Ú/g +s/á/\á/g +s/ê/\é/g +s/&aacute;/\á/g +s/&ecirc;/\ê/g +s/À/\À/g +s/–/\-/g +s/è/\è/g +s/Õ/\Õ/g diff --git a/misc/sed/twiki-to-tiki.sed b/misc/sed/twiki-to-tiki.sed new file mode 100755 index 0000000..d0fe2f5 --- /dev/null +++ b/misc/sed/twiki-to-tiki.sed @@ -0,0 +1,14 @@ +#!/bin/sed -f +# +# twiki-to-tiki.sed: formatting conversion +# feedback: rhatto@riseup.net +# + +s/^ \*/\*/ +s/---+++/\!\!\!/ +s/---++/\!\!\!/ +s/---+/\!/ +s/\*\([A-Za-z0-9]*\)\*/__\1__/g +s/<verbatim>/~pp\~/g +s/<\/verbatim>/~\/pp\~/g +s/%TOC%/{maketoc}/ diff --git a/misc/sed/unicode-zoado.sed b/misc/sed/unicode-zoado.sed new file mode 100644 index 0000000..c372a71 --- /dev/null +++ b/misc/sed/unicode-zoado.sed @@ -0,0 +1,11 @@ +s/á/\á/g +s/Ã/\í/g +s/ó/\ó/g +s/ç/\ç/g +s/õ/\õ/g +s/ã/\ã/g +s/â/\â/g +s/é/\é/g +s/ê/\ê/g +s/ó/\ó/g +s/â/\â/g diff --git a/misc/sed/wrap-forced.sed b/misc/sed/wrap-forced.sed new file mode 100755 index 0000000..e7f2cc9 --- /dev/null +++ b/misc/sed/wrap-forced.sed @@ -0,0 +1,46 @@ +#!/bin/sed -f +# wrap-forced.sed - wrap lines at column n +# +# acts like fmt, but ignores the 'word' context, +# wrapping the line exactly at the specified column +# +# pt_BR comments: +# funciona como o fmt, mas ignora o contexto de 'palavra' +# quebrando a linha exatamente na coluna especificada +# +# c1: na primeira linha do texto... +# c2: laço para colocar todas as linhas em 1 linha apenas +# c3: isto é para eliminar espaços em branco repetidos +# você pode comentá-lo se não quiser alterá-los +# c4: dica: tire o espaço da 2ª parte do comando s para +# apagar todos os espaços (parece arte ascii &:) ) +# c5: aqui é quem quebra a linha na coluna especificada +# mude o 25 para o número que você quiser +# o gnu-sed >= 3.02.80 é necessário por causa do \n +# +# 20000726 <verde (a) aurelio net> + +#c1: at the first line of the text... +1{ + + #c2: loop to put all the lines of the text at one single line + :a + $!N + s/\n// + ta + + #c3: + # this is to squeeze blanks + # you can comment it if you want blanks untouched + #c4: + # tip: take off the space at replacement part to have a result with + # NO spaces at all (looks like ascii art &:) ) + s/[[:blank:]]\+/ /g + + #c5: + # here is the guy who breaks the line at the specified column + # just change the 25 whatever column you like + # gnu-sed >= 3.02.80 required because the \n + s/.\{50\}/&\n/g +} + diff --git a/misc/sed/yahoogroups-kill-sig.sed b/misc/sed/yahoogroups-kill-sig.sed new file mode 100644 index 0000000..f7eb8c9 --- /dev/null +++ b/misc/sed/yahoogroups-kill-sig.sed @@ -0,0 +1,248 @@ +#!/bin/sed -f +# yahoogroups-kill-sig.sed by Aurelio Marinho Jargas +# +# Erases the Yahoo! Groups e-mail signature ad +# +# CHANGELOG: +# 20000??? v0.1 First one +# 20000725 v0.2 Now it has BEGIN/END marks, it's easier! +# 20000906 v0.3 Marks changed +# 20001107 v0.3.1 Contrib: Schlemer HTML killer +# ----- eGroups has changed to Yahoo! Groups ----- +# 20010206 v0.4 Contrib: Morcego's s/egroups/yahoo/s fix +# 20010716 v0.5 Marks changed again +# 20030428 v0.6 Policy Terms and Unsubscribe killers included +# 20030506 v0.6.1 One-char fix on the Policy killer, added SAMPLE DATA +# +# DESCRIPTION: +# Yahoogroups.com puts advertises on every sent message to the free groups. +# This file is a sed filter to erase it. It handles quoted '> ' ads also. +# If you do use procmail to filter e-mail messages, use this sed to +# automaticaly remove the Ads for every message you receive. +# +# HOW TO USE: +# Save this file on the disk and put at the begin of your ~/.procmailrc: +# :0 fhw +# * Delivered-To:.*@yahoogroups.com +# | sed -f /path/to/yahoogroups-kill-sig.sed +# +# If preferred, make this file executable (chmod +x), put it in your PATH and: +# :0 fhw +# * Delivered-To:.*@yahoogroups.com +# | yahoogroups-kill-sig.sed +# +# +# SAMPLE DATA FILE: +# You can use this sample data file to test these rules "by hand", +# before including them on the procmail file. +# Save the following fake e-mail message on a 'data.txt' file +# (remove the leading # chars!) and run: +# +# prompt$ sed -f yahoogroups-kill-sig.sed data.txt +# +# All the Ads and Yahoo! messages should be removed. +# +#---------------------------8<--------------------------- +#From: foo@foo.com +#To: foo@foo.com +#Subject: test me +# +#Here's the message body. +#And now, the evil sig. +# +#------------------------ Yahoo! Groups Sponsor ---------------------~--> +#Secure your servers with 128-bit SSL encryption! Grab your copy of +#VeriSign's FREE Guide "Securing Your Web Site for Business." Get it now! +#http://www.verisign.com/cgi-bin/go.cgi?a=n094442340008000 +#http://us.click.yahoo.com/6lIgYB/IWxCAA/yigFAA/dkFolB/TM +#---------------------------------------------------------------------~-> +# +#Your use of Yahoo! Groups is subject to +#http://docs.yahoo.com/info/terms/ +# +#To unsubscribe from this group, send an email to: +#foo-unsubscribe@yahoogroups.com +#--------------------------->8--------------------------- + + + +#------------------------------------------------------------------------- + + +# +----+ +# | Ad | +# +----+ +# +# Ad details: * a line w/ 24 hifens, 'Yahoo...Sponsor', 21 hifens and '~-->' +# * lines with yahoogroups propaganda +# * a line with 69 hifens, and '~->' at the end +# Ad Sample: +# ------------------------ Yahoo! Groups Sponsor ---------------------~--> +# Secure your servers with 128-bit SSL encryption! Grab your copy of +# VeriSign's FREE Guide "Securing Your Web Site for Business." Get it now! +# http://www.verisign.com/cgi-bin/go.cgi?a=n094442340008000 +# http://us.click.yahoo.com/6lIgYB/IWxCAA/yigFAA/dkFolB/TM +# ---------------------------------------------------------------------~-> +# +# Ad Killer: +/^\(> \)*-\{24\} Yahoo! Groups Sponsor -\{21\}~-->$/,/^\(> \)*-\{69\}~->$/d + + +#------------------------------------------------------------------------- + + +# +--------+ +# | Policy | +# +--------+ +# +# You can also remove the Policy Terms message. +# +# Policy Details: A one line message, sometimes broken into two, +# which appears at the very end of the message. +# Policy Sample: +# Your use of Yahoo! Groups is subject to http://docs.yahoo.com/info/terms/ +# +# Policy Killer: +/^\(> \)*Your use of Yahoo! Groups is subject to *$/N +/^\(> \)*Your use of Yahoo! Groups is subject to/d + + +#------------------------------------------------------------------------- + + +# +-------------+ +# | Unsubscribe | +# +-------------+ +# +# This one is to remove the *default* unsubscribe footer. +# +# Unsubscribe Details: A one line message, sometimes broken into two, +# which appears before the Ads. +# Unsubscribe Sample: +# To unsubscribe from this group, send an email to: +# foo-unsubscribe@yahoogroups.com +# +# Unsubscribe Killer: +/^\(> \)*To unsubscribe from this group, send an email to: *$/N +/^\(> \)*To unsubscribe from this group, send an email to:/d + + +#------------------------------------------------------------------------- + + +# +---------+ +# | Ad HTML | +# +---------+ +# +# For those who receive the Yahoo! messages in HTML (argh!), you may use +# this one also, because the HTML signature is way different. +# +# Ad Details: * an HTML comment with bar-star-star-bar,text,bar-star-star-bar +# * lines with egroups propaganda +# * an HTML comment with bar-star-star-bar,text,bar-star-star-bar +# Ad Sample: +# <!-- |**|begin egp html banner|**| --> +# +# <hr> +# <!-- |@|begin eGroups banner|@| runid: 8193 crid: 4101 --> +# <a target=3D"_blank" +# href=3D"http://click.egroups.com/1/8193/8/_/134812/_/9= +# 66089206/"><center> +# <img width=3D"468" height=3D"60" +# border=3D"0" +# alt=3D"" +# src=3D"http://adimg.egroups.com/img/8193/8/_/134812/_/966089206/468x60_ma= +# ze12k.gif"></center><center><font color=3D"black"></font></center></a> +# <!-- |@|end eGroups banner|@| --> +# <hr> +# +# <!-- |**|end egp html banner|**| --> +# +# Ad Killer: +#/^\(> \)*<!-- |\*\*|begin egp html banner|\*\*| -->$/,/^\(> \)*<!-- |\*\*|end egp html banner|\*\*| -->$/d + + + + + + +#------------------------------------------------------------------------- +# +-------------+ +# | OLD KILLERS | +# +-------------+ +#------------------------------------------------------------------------- +# +# +---------+ +# | Ad v0.4 | +# +---------+ +# +# Ad details: * a line w/ 24 hifens, 'Yahoo!...Sponsor', 21 hifens and '~-~>' +# * lines with yahoogroups propaganda +# * a line with 69 hifens, and '_->' at the end +# Ad Sample: +# ------------------------ Yahoo! Groups Sponsor ---------------------~-~> +# eGroups is now Yahoo! Groups +# Click here for more details +# http://click.egroups.com/1/11231/1/_/161736/_/980877852/ +# ---------------------------------------------------------------------_-> +# +# Ad Killer: +#/^\(> \)*-\{24\} Yahoo! Groups Sponsor -\{21\}~-~>$/,/^\(> \)*-\{69\}_->$/d' +# +#------------------------------------------------------------------------- +# +# +---------+ +# | Ad v0.3 | +# +---------+ +# +# Ad details: * a line w/ 26 hifens, 'eGroups Sponsor', 25 hifens and '~-~>' +# * lines with egroups propaganda +# * a line with 69 hifens, and '_->' at the end +# +# Ad Sample: +# -------------------------- eGroups Sponsor -------------------------~-~> +# GET A NEXTCARD VISA, in 30 seconds! Get rates +# of 2.9% Intro or 9.9% Ongoing APR* and no annual fee! +# Apply NOW! +# http://click.egroups.com/1/7872/14/_/_/_/967638075/ +# ---------------------------------------------------------------------_-> +# +# Ad Killer: +#/^\(> \)*-\{26\} eGroups Sponsor -\{25\}~-~>$/,/^\(> \)*-\{69\}_->$/d +# +#------------------------------------------------------------------------- +# +# +---------+ +# | Ad v0.2 | +# +---------+ +# +# Ad details: * a line with 68 hifens, an '<e|' and another hifen +# * lines with egroups propaganda +# * a line with 68 hifens, an '|e>' and another hifen +# Ad Sample: +# --------------------------------------------------------------------<e|- +# Huge Shoe Selection at Zappos.com +# (small sizes also available) +# http://click.egroups.com/1/7062/5/_/193628/_/964577029/ +# --------------------------------------------------------------------|e>- +# +# Ad Killer: +#/^\(> \)*-\{68\}<e|-$/,/^\(> \)*-\{68\}|e>-$/d +# +#------------------------------------------------------------------------- +# +# +---------+ +# | Ad v0.1 | +# +---------+ +# +# Ad Details: * a line with exactly 72 hifens before and after +# * any number of lines between +# * a line with 'http://click.egroups.com' +# Ad Sample: +# ------------------------------------------------------------------------ +# $60 in FREE Long Distance! Click Here to join beMANY! today. +# http://click.egroups.com/1/4126/10/_/_/_/958599956/ +# ------------------------------------------------------------------------ +# +# Ad Killer: +#/^\(> \)*-\{72\}$/{N;:l;/-\{72\}$/bs;N;bl;:s;s%^.*\n\(> \)*http://click\.egroups\.com.*%%;} diff --git a/misc/shell b/misc/shell new file mode 100755 index 0000000..ad86b8f --- /dev/null +++ b/misc/shell @@ -0,0 +1,6 @@ +#!/bin/bash +# +# shell: wrapper for a simple terminal console +# + +Eterm -g 110x45+320+90 +sb -f white -F smooth --borderless no --buttonbar 0 --scrollbar 0 -P None -nterminal diff --git a/misc/snownews b/misc/snownews new file mode 100755 index 0000000..3cf3a9f --- /dev/null +++ b/misc/snownews @@ -0,0 +1 @@ +Eterm --background-pixmap 0 --scrollbar 0 --buttonbar 0 -g 125x43+6-45 -F vga -n snownews -e snownews diff --git a/misc/splash.sh b/misc/splash.sh new file mode 100755 index 0000000..415f36e --- /dev/null +++ b/misc/splash.sh @@ -0,0 +1,7 @@ +#!/bin/bash + +if [ -z $2 ]; then echo "usage: $0 <kernel-version> <splash-theme>"; exit 1; fi + +cd /boot +mkinitrd -c $1 +splash -s -f /etc/bootsplash/themes/$2/config/bootsplash-1024x768.cfg >> /boot/initrd.gz diff --git a/misc/term-color b/misc/term-color new file mode 100755 index 0000000..85bf44b --- /dev/null +++ b/misc/term-color @@ -0,0 +1,43 @@ +#! /usr/bin/env python +# Copyright (C) 2006 by Johannes Zellner, <johannes@zellner.org> +# modified by mac@calmar.ws to fit my output needs +# modified by crncosta@carloscosta.org to fit my output needs +# pyroscope.project@gmail.com added a final "tput init", and changed the output format + +import os +import sys + +def echo(msg): + os.system('echo -n "' + str(msg) + '"') + +def out(n): + os.system("tput setab " + str(n) + "; echo -n " + ("\"% 4d\"" % n)) + os.system("tput setab 0") + +if os.getenv("TERM") in ("xterm", "screen"): + os.putenv("TERM", os.getenv("TERM") + "-256color") + +try: + # normal colors 1 - 16 + os.system("tput setaf 16") + for n in range(8): + out(n) + echo("\n") + for n in range(8, 16): + out(n) + + echo("\n") + echo("\n") + + y=16 + while y < 256: + for z in range(0,18): + out(y) + y += 1 + if y >= 256: break + + echo("\n") + + echo("\n") +finally: + os.system("tput init") diff --git a/misc/umount-tablet b/misc/umount-tablet new file mode 120000 index 0000000..ee40196 --- /dev/null +++ b/misc/umount-tablet @@ -0,0 +1 @@ +mount-tablet
\ No newline at end of file diff --git a/misc/wifi b/misc/wifi new file mode 100755 index 0000000..cfe6151 --- /dev/null +++ b/misc/wifi @@ -0,0 +1,16 @@ +#!/bin/bash +# +# Wifi initializer. +# + +#DEVICE="ath0" +DEVICE="wlan0" + +if [ ! -z "$1" ]; then + read -sp "Enter the WPA passphrase: " PASS + echo "" + wpa_passphrase $1 $PASS +elif [ -f "wpa_supplicant.conf" ]; then + sudo wpa_supplicant -B -Dwext -i$DEVICE -cwpa_supplicant.conf + sudo dhclient $DEVICE +fi diff --git a/misc/xbitchx b/misc/xbitchx new file mode 100755 index 0000000..e5b524e --- /dev/null +++ b/misc/xbitchx @@ -0,0 +1,20 @@ +#!/bin/bash +# +# xbitchx: execute bitchx under a X Terminal +# + +# Using rxvt +# rxvt -bg black +sb -fg white -fn vga -g 120x40+30+55 -name BitchX -e BitchX -p 994 -ssl irc.indymedia.org + +# Old version using Eterm +# Eterm --background-pixmap 0 --scrollbar 0 +sb -b black -f white -F vga --borderless no --buttonbar 0 \ +# -g 120x40+30+55 -nBitchX -e BitchX -p 994 -ssl irc.indymedia.org + +# Old version using feast and Eterm +# xfeast +# Eterm --background-pixmap 0 --scrollbar 0 +sb -b black -f white -F vga --borderless no --buttonbar 0 \ +# -g 120x40+30+55 -nBitchX -e BitchX -p 994 -ssl irc.indymedia.org + +# Current version +Eterm --background-pixmap 0 --scrollbar 0 +sb -b black -f white -F vga --borderless no --buttonbar 0 \ + -g 120x40+30+55 -nBitchX -e BitchX -p 6667 127.0.0.1 diff --git a/misc/xcamp b/misc/xcamp new file mode 100755 index 0000000..6ae9fd2 --- /dev/null +++ b/misc/xcamp @@ -0,0 +1,17 @@ +#!/bin/bash +# +# xcamp: wrapper for camp console music player +# + +# Set possible geometries +BOTTOM_LEFT="75x20+10+410" +BOTTOM_RIGHT="75x20+415+410" +TOP_LEFT="75x20+10+5" +TOP_RIGHT="75x20+415+5" +TOP_RIGHT_2="500+420" +TOP_RIGHT_3="500+385" + +# Set default geometry +GEOMETRY="$TOP_RIGHT_3" + +Eterm --trans -F VGA --scrollbar 0 --buttonbar 0 --borderless -g $GEOMETRY -e camp diff --git a/misc/xfeast b/misc/xfeast new file mode 100755 index 0000000..8a8504a --- /dev/null +++ b/misc/xfeast @@ -0,0 +1,15 @@ +#!/bin/bash +# +# xfeast: execute silc gateway +# + +pid="$HOME/tmp/silc.pid" +if [[ -f "$pid" ]]; then + if `ps $pid | grep -q $pid`; then + kill `cat $pid` + fi + rm $pid +fi +netcat -l -p 1706 -e "/usr/bin/feast .feast.conf" & +echo "$!" > $pid +trap "kill `cat $pid`" 2 15 diff --git a/misc/xgkrellm b/misc/xgkrellm new file mode 100755 index 0000000..857b85e --- /dev/null +++ b/misc/xgkrellm @@ -0,0 +1,7 @@ +#!/bin/bash +# +# xgrellm: wrapper for gkrellm +# + +#gkreallm -w +gkrellm -g +945+545 diff --git a/misc/xterm b/misc/xterm new file mode 100755 index 0000000..baebbce --- /dev/null +++ b/misc/xterm @@ -0,0 +1 @@ +xterm -bg black -fg white -font -misc-fixed-bold-*-*-*-*-*-*-*-*-*-*-* |
