Add ~/bin
This commit is contained in:
parent
49133cc8a6
commit
ecd79740fd
199 changed files with 22598 additions and 0 deletions
BIN
bin/.make_web_videos.swp
Normal file
BIN
bin/.make_web_videos.swp
Normal file
Binary file not shown.
BIN
bin/.sketchup-reset_evaluation_period.swp
Normal file
BIN
bin/.sketchup-reset_evaluation_period.swp
Normal file
Binary file not shown.
BIN
bin/.sketchup.swo
Normal file
BIN
bin/.sketchup.swo
Normal file
Binary file not shown.
BIN
bin/.swallow_gimp.swp
Normal file
BIN
bin/.swallow_gimp.swp
Normal file
Binary file not shown.
BIN
bin/.www.unternet.org.swp
Normal file
BIN
bin/.www.unternet.org.swp
Normal file
Binary file not shown.
1
bin/1
Normal file
1
bin/1
Normal file
|
@ -0,0 +1 @@
|
||||||
|
0
|
1
bin/2
Normal file
1
bin/2
Normal file
|
@ -0,0 +1 @@
|
||||||
|
0
|
236
bin/2048.sh
Normal file
236
bin/2048.sh
Normal file
|
@ -0,0 +1,236 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
#important variables
|
||||||
|
declare -ia board # array that keeps track of game status
|
||||||
|
declare -i pieces # number of pieces present on board
|
||||||
|
declare -i flag_skip # flag that prevents doing more than one operation on
|
||||||
|
# single field in one step
|
||||||
|
declare -i moves # stores number of possible moves to determine if player lost
|
||||||
|
# the game
|
||||||
|
declare ESC=$'\e' # escape byte
|
||||||
|
declare header="Bash 2048 v1.0 RC1 (bugs: https://github.com/mydzor/bash2048/issues)"
|
||||||
|
|
||||||
|
#default config
|
||||||
|
declare -i board_size=4
|
||||||
|
declare -i target=2048
|
||||||
|
|
||||||
|
# print currect status of the game, last added pieces are marked red
|
||||||
|
function print_board {
|
||||||
|
clear
|
||||||
|
echo $header pieces=$pieces target=$target
|
||||||
|
echo
|
||||||
|
printf '/------'
|
||||||
|
for l in $(seq 1 $index_max); do
|
||||||
|
printf '|------'
|
||||||
|
done
|
||||||
|
printf '\\\n'
|
||||||
|
for l in $(seq 0 $index_max); do
|
||||||
|
printf '| '
|
||||||
|
for m in $(seq 0 $index_max); do
|
||||||
|
if let ${board[l*$board_size+m]}; then
|
||||||
|
if let '(last_added==(l*board_size+m))|(first_round==(l*board_size+m))'; then
|
||||||
|
printf '\033[1m\033[31m%4d \033[0m| ' ${board[l*$board_size+m]}
|
||||||
|
else
|
||||||
|
printf '%4d | ' ${board[l*$board_size+m]}
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
printf ' | '
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
let l==$index_max || {
|
||||||
|
printf '\n|------'
|
||||||
|
for l in $(seq 1 $index_max); do
|
||||||
|
printf '|------'
|
||||||
|
done
|
||||||
|
printf '|\n'
|
||||||
|
}
|
||||||
|
done
|
||||||
|
printf '\n\\------'
|
||||||
|
for l in $(seq 1 $index_max); do
|
||||||
|
printf '|------'
|
||||||
|
done
|
||||||
|
printf '/\n'
|
||||||
|
}
|
||||||
|
|
||||||
|
# Generate new piece on the board
|
||||||
|
# inputs:
|
||||||
|
# $board - original state of the game board
|
||||||
|
# $pieces - original number of pieces
|
||||||
|
# outputs:
|
||||||
|
# $board - new state of the game board
|
||||||
|
# $pieces - new number of pieces
|
||||||
|
function generate_piece {
|
||||||
|
while true; do
|
||||||
|
let pos=RANDOM%fields_total
|
||||||
|
let board[$pos] || {
|
||||||
|
let value=RANDOM%10?2:4
|
||||||
|
board[$pos]=$value
|
||||||
|
last_added=$pos
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
done
|
||||||
|
let pieces++
|
||||||
|
}
|
||||||
|
|
||||||
|
# perform push operation between two pieces
|
||||||
|
# inputs:
|
||||||
|
# $1 - push position, for horizontal push this is row, for vertical column
|
||||||
|
# $2 - recipient piece, this will hold result if moving or joining
|
||||||
|
# $3 - originator piece, after moving or joining this will be left empty
|
||||||
|
# $4 - direction of push, can be either "up", "down", "left" or "right"
|
||||||
|
# $5 - if anything is passed, do not perform the push, only update number
|
||||||
|
# of valid moves
|
||||||
|
# $board - original state of the game board
|
||||||
|
# outputs:
|
||||||
|
# $change - indicates if the board was changed this round
|
||||||
|
# $flag_skip - indicates that recipient piece cannot be modified further
|
||||||
|
# $board - new state of the game board
|
||||||
|
function push_pieces {
|
||||||
|
case $4 in
|
||||||
|
"up")
|
||||||
|
let "first=$2*$board_size+$1"
|
||||||
|
let "second=($2+$3)*$board_size+$1"
|
||||||
|
;;
|
||||||
|
"down")
|
||||||
|
let "first=(index_max-$2)*$board_size+$1"
|
||||||
|
let "second=(index_max-$2-$3)*$board_size+$1"
|
||||||
|
;;
|
||||||
|
"left")
|
||||||
|
let "first=$1*$board_size+$2"
|
||||||
|
let "second=$1*$board_size+($2+$3)"
|
||||||
|
;;
|
||||||
|
"right")
|
||||||
|
let "first=$1*$board_size+(index_max-$2)"
|
||||||
|
let "second=$1*$board_size+(index_max-$2-$3)"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
let ${board[$first]} || {
|
||||||
|
let ${board[$second]} && {
|
||||||
|
if test -z $5; then
|
||||||
|
board[$first]=${board[$second]}
|
||||||
|
let board[$second]=0
|
||||||
|
let change=1
|
||||||
|
else
|
||||||
|
let moves++
|
||||||
|
fi
|
||||||
|
return
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
let ${board[$second]} && let flag_skip=1
|
||||||
|
let "${board[$first]}==${board[second]}" && {
|
||||||
|
if test -z $5; then
|
||||||
|
let board[$first]*=2
|
||||||
|
let "board[$first]==$target" && end_game 1
|
||||||
|
let board[$second]=0
|
||||||
|
let pieces-=1
|
||||||
|
let change=1
|
||||||
|
else
|
||||||
|
let moves++
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function apply_push {
|
||||||
|
for i in $(seq 0 $index_max); do
|
||||||
|
for j in $(seq 0 $index_max); do
|
||||||
|
flag_skip=0
|
||||||
|
let increment_max=index_max-j
|
||||||
|
for k in $(seq 1 $increment_max); do
|
||||||
|
let flag_skip && break
|
||||||
|
push_pieces $i $j $k $1 $2
|
||||||
|
done
|
||||||
|
done
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
function check_moves {
|
||||||
|
let moves=0
|
||||||
|
apply_push up fake
|
||||||
|
apply_push down fake
|
||||||
|
apply_push left fake
|
||||||
|
apply_push right fake
|
||||||
|
}
|
||||||
|
|
||||||
|
function key_react {
|
||||||
|
let change=0
|
||||||
|
read -d '' -sn 1
|
||||||
|
test "$REPLY" = "$ESC" && {
|
||||||
|
read -d '' -sn 1 -t1
|
||||||
|
test "$REPLY" = "[" && {
|
||||||
|
read -d '' -sn 1 -t1
|
||||||
|
case $REPLY in
|
||||||
|
A) apply_push up;;
|
||||||
|
B) apply_push down;;
|
||||||
|
C) apply_push right;;
|
||||||
|
D) apply_push left;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function end_game {
|
||||||
|
print_board
|
||||||
|
echo GAME OVER
|
||||||
|
let $1 && {
|
||||||
|
echo "Congratulations you have achieved $target"
|
||||||
|
exit 0
|
||||||
|
}
|
||||||
|
echo "You have lost, better luck next time."
|
||||||
|
exit 0
|
||||||
|
}
|
||||||
|
|
||||||
|
function help {
|
||||||
|
cat <<END_HELP
|
||||||
|
Usage: $1 [-b INTEGER] [-t INTEGER] [-h]
|
||||||
|
|
||||||
|
-b specify game board size (sizes 3-9 allowed)
|
||||||
|
-t specify target score to win (needs to be power of 2)
|
||||||
|
-h this help
|
||||||
|
|
||||||
|
END_HELP
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#parse commandline options
|
||||||
|
while getopts "b:t:h" opt; do
|
||||||
|
case $opt in
|
||||||
|
b ) board_size="$OPTARG"
|
||||||
|
let '(board_size>=3)&(board_size<=9)' || {
|
||||||
|
echo "Invalid board size, please choose size between 3 and 9"
|
||||||
|
exit -1
|
||||||
|
};;
|
||||||
|
t ) target="$OPTARG"
|
||||||
|
echo "obase=2;$target" | bc | grep -e '^1[^1]*$'
|
||||||
|
let $? && {
|
||||||
|
echo "Invalid target, has to be power of two"
|
||||||
|
exit -1
|
||||||
|
};;
|
||||||
|
h ) help $0
|
||||||
|
exit 0;;
|
||||||
|
\?) echo "Invalid option: -"$OPTARG", try $0 -h" >&2
|
||||||
|
exit 1;;
|
||||||
|
: ) echo "Option -"$OPTARG" requires an argument, try $0 -h" >&2
|
||||||
|
exit 1;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
#init board
|
||||||
|
let fields_total=board_size*board_size
|
||||||
|
let index_max=board_size-1
|
||||||
|
for i in $(seq 0 $fields_total); do board[$i]="0"; done
|
||||||
|
let pieces=0
|
||||||
|
generate_piece
|
||||||
|
first_round=$last_added
|
||||||
|
generate_piece
|
||||||
|
while true; do
|
||||||
|
print_board
|
||||||
|
key_react
|
||||||
|
let change && generate_piece
|
||||||
|
first_round=-1
|
||||||
|
let pieces==fields_total && {
|
||||||
|
check_moves
|
||||||
|
let moves==0 && end_game 0 #lose the game
|
||||||
|
}
|
||||||
|
done
|
||||||
|
|
407
bin/a2dp.py
Normal file
407
bin/a2dp.py
Normal file
|
@ -0,0 +1,407 @@
|
||||||
|
#! /usr/bin/env python3
|
||||||
|
"""Fixing bluetooth stereo headphone/headset problem in debian distros.
|
||||||
|
|
||||||
|
Workaround for bug: https://bugs.launchpad.net/ubuntu/+source/indicator-sound/+bug/1577197
|
||||||
|
Run it with python3.5 or higher after pairing/connecting the bluetooth stereo headphone.
|
||||||
|
|
||||||
|
This will be only fixes the bluez5 problem mentioned above .
|
||||||
|
|
||||||
|
Licence: Freeware
|
||||||
|
|
||||||
|
Install with:
|
||||||
|
|
||||||
|
curl "https://gist.githubusercontent.com/pylover/d68be364adac5f946887b85e6ed6e7ae/raw/install.sh" | sh
|
||||||
|
|
||||||
|
|
||||||
|
Shorthands:
|
||||||
|
|
||||||
|
$ alias speakers="a2dp.py 10:08:C1:44:AE:BC"
|
||||||
|
$ alias headphones="a2dp.py 00:22:37:3D:DA:50"
|
||||||
|
$ alias headset="a2dp.py 00:22:37:F8:A0:77 -p hsp"
|
||||||
|
|
||||||
|
$ speakers
|
||||||
|
|
||||||
|
|
||||||
|
See ``a2dp.py -h`` for help.
|
||||||
|
|
||||||
|
|
||||||
|
Check here for updates: https://gist.github.com/pylover/d68be364adac5f946887b85e6ed6e7ae
|
||||||
|
|
||||||
|
|
||||||
|
Thanks to:
|
||||||
|
|
||||||
|
* https://github.com/DominicWatson, for adding the ``-p/--profile`` argument.
|
||||||
|
* https://github.com/IzzySoft, for mentioning wait before connecting again.
|
||||||
|
* https://github.com/AmploDev, for v0.4.0
|
||||||
|
* https://github.com/Mihara, for autodetect & autorun service
|
||||||
|
* https://github.com/dabrovnijk, for systemd service
|
||||||
|
|
||||||
|
Change Log
|
||||||
|
----------
|
||||||
|
- 0.6.2
|
||||||
|
* Fix program name inside the help message.
|
||||||
|
|
||||||
|
- 0.6.1
|
||||||
|
* Fix Py warning
|
||||||
|
|
||||||
|
- 0.6.0
|
||||||
|
* Install script
|
||||||
|
|
||||||
|
- 0.5.2
|
||||||
|
* Increasing the number of tries to 15.
|
||||||
|
|
||||||
|
- 0.5.2
|
||||||
|
* Optimizing waits.
|
||||||
|
|
||||||
|
- 0.5.1
|
||||||
|
* Increasing WAIT_TIME and TRIES
|
||||||
|
|
||||||
|
- 0.5.0
|
||||||
|
* Autodetect & autorun service
|
||||||
|
|
||||||
|
- 0.4.1
|
||||||
|
* Sorting device list
|
||||||
|
|
||||||
|
- 0.4.0
|
||||||
|
* Adding ignore_fail argument by @AmploDev.
|
||||||
|
* Sending all available streams into selected sink, after successfull connection by @AmploDev.
|
||||||
|
|
||||||
|
- 0.3.3
|
||||||
|
* Updating default sink before turning to ``off`` profile.
|
||||||
|
|
||||||
|
- 0.3.2
|
||||||
|
* Waiting a bit: ``-w/--wait`` before connecting again.
|
||||||
|
|
||||||
|
- 0.3.0
|
||||||
|
* Adding -p / --profile option for using the same script to switch between headset and A2DP audio profiles
|
||||||
|
|
||||||
|
- 0.2.5
|
||||||
|
* Mentioning [mac] argument.
|
||||||
|
|
||||||
|
- 0.2.4
|
||||||
|
* Removing duplicated devices in select device list.
|
||||||
|
|
||||||
|
- 0.2.3
|
||||||
|
* Matching ANSI escape characters. Tested on 16.10 & 16.04
|
||||||
|
|
||||||
|
- 0.2.2
|
||||||
|
* Some sort of code enhancements.
|
||||||
|
|
||||||
|
- 0.2.0
|
||||||
|
* Adding `-V/--version`, `-w/--wait` and `-t/--tries` CLI arguments.
|
||||||
|
|
||||||
|
- 0.1.1
|
||||||
|
* Supporting the `[NEW]` prefix for devices & controllers as advised by @wdullaer
|
||||||
|
* Drying the code.
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
import sys
|
||||||
|
import re
|
||||||
|
import asyncio
|
||||||
|
import subprocess as sb
|
||||||
|
import argparse
|
||||||
|
|
||||||
|
|
||||||
|
__version__ = '0.6.2'
|
||||||
|
|
||||||
|
|
||||||
|
HEX_DIGIT_PATTERN = '[0-9A-F]'
|
||||||
|
HEX_BYTE_PATTERN = '%s{2}' % HEX_DIGIT_PATTERN
|
||||||
|
MAC_ADDRESS_PATTERN = ':'.join((HEX_BYTE_PATTERN, ) * 6)
|
||||||
|
DEVICE_PATTERN = re.compile('^(?:.*\s)?Device\s(?P<mac>%s)\s(?P<name>.*)' % MAC_ADDRESS_PATTERN)
|
||||||
|
CONTROLLER_PATTERN = re.compile('^(?:.*\s)?Controller\s(?P<mac>%s)\s(?P<name>.*)' % MAC_ADDRESS_PATTERN)
|
||||||
|
WAIT_TIME = 2.25
|
||||||
|
TRIES = 15
|
||||||
|
PROFILE = 'a2dp'
|
||||||
|
|
||||||
|
|
||||||
|
_profiles = {
|
||||||
|
'a2dp': 'a2dp_sink',
|
||||||
|
'hsp': 'headset_head_unit',
|
||||||
|
'off': 'off'
|
||||||
|
}
|
||||||
|
|
||||||
|
# CLI Arguments
|
||||||
|
parser = argparse.ArgumentParser()
|
||||||
|
parser.add_argument('-e', '--echo', action='store_true', default=False,
|
||||||
|
help='If given, the subprocess stdout will be also printed on stdout.')
|
||||||
|
parser.add_argument('-w', '--wait', default=WAIT_TIME, type=float,
|
||||||
|
help='The seconds to wait for subprocess output, default is: %s' % WAIT_TIME)
|
||||||
|
parser.add_argument('-t', '--tries', default=TRIES, type=int,
|
||||||
|
help='The number of tries if subprocess is failed. default is: %s' % TRIES)
|
||||||
|
parser.add_argument('-p', '--profile', default=PROFILE,
|
||||||
|
help='The profile to switch to. available options are: hsp, a2dp. default is: %s' % PROFILE)
|
||||||
|
parser.add_argument('-V', '--version', action='store_true', help='Show the version.')
|
||||||
|
parser.add_argument('mac', nargs='?', default=None)
|
||||||
|
|
||||||
|
|
||||||
|
# Exceptions
|
||||||
|
class SubprocessError(Exception):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class RetryExceededError(Exception):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class BluetoothctlProtocol(asyncio.SubprocessProtocol):
|
||||||
|
def __init__(self, exit_future, echo=True):
|
||||||
|
self.exit_future = exit_future
|
||||||
|
self.transport = None
|
||||||
|
self.output = None
|
||||||
|
self.echo = echo
|
||||||
|
|
||||||
|
def listen_output(self):
|
||||||
|
self.output = ''
|
||||||
|
|
||||||
|
def not_listen_output(self):
|
||||||
|
self.output = None
|
||||||
|
|
||||||
|
def pipe_data_received(self, fd, raw):
|
||||||
|
d = raw.decode()
|
||||||
|
if self.echo:
|
||||||
|
print(d, end='')
|
||||||
|
|
||||||
|
if self.output is not None:
|
||||||
|
self.output += d
|
||||||
|
|
||||||
|
def process_exited(self):
|
||||||
|
self.exit_future.set_result(True)
|
||||||
|
|
||||||
|
def connection_made(self, transport):
|
||||||
|
self.transport = transport
|
||||||
|
print('Connection MADE')
|
||||||
|
|
||||||
|
async def send_command(self, c):
|
||||||
|
stdin_transport = self.transport.get_pipe_transport(0)
|
||||||
|
# noinspection PyProtectedMember
|
||||||
|
stdin_transport._pipe.write(('%s\n' % c).encode())
|
||||||
|
|
||||||
|
async def search_in_output(self, expression, fail_expression=None):
|
||||||
|
if self.output is None:
|
||||||
|
return None
|
||||||
|
|
||||||
|
for l in self.output.splitlines():
|
||||||
|
if fail_expression and re.search(fail_expression, l, re.IGNORECASE):
|
||||||
|
raise SubprocessError('Expression "%s" failed with fail pattern: "%s"' % (l, fail_expression))
|
||||||
|
|
||||||
|
if re.search(expression, l, re.IGNORECASE):
|
||||||
|
return True
|
||||||
|
|
||||||
|
async def send_and_wait(self, cmd, wait_expression, fail_expression='fail'):
|
||||||
|
try:
|
||||||
|
self.listen_output()
|
||||||
|
await self.send_command(cmd)
|
||||||
|
while not await self.search_in_output(wait_expression.lower(), fail_expression=fail_expression):
|
||||||
|
await wait()
|
||||||
|
finally:
|
||||||
|
self.not_listen_output()
|
||||||
|
|
||||||
|
async def disconnect(self, mac):
|
||||||
|
print('Disconnecting the device.')
|
||||||
|
await self.send_and_wait('disconnect %s' % ':'.join(mac), 'Successful disconnected')
|
||||||
|
|
||||||
|
async def connect(self, mac):
|
||||||
|
print('Connecting again.')
|
||||||
|
await self.send_and_wait('connect %s' % ':'.join(mac), 'Connection successful')
|
||||||
|
|
||||||
|
async def trust(self, mac):
|
||||||
|
await self.send_and_wait('trust %s' % ':'.join(mac), 'trust succeeded')
|
||||||
|
|
||||||
|
async def quit(self):
|
||||||
|
await self.send_command('quit')
|
||||||
|
|
||||||
|
async def get_list(self, command, pattern):
|
||||||
|
result = set()
|
||||||
|
try:
|
||||||
|
self.listen_output()
|
||||||
|
await self.send_command(command)
|
||||||
|
await wait()
|
||||||
|
for l in self.output.splitlines():
|
||||||
|
m = pattern.match(l)
|
||||||
|
if m:
|
||||||
|
result.add(m.groups())
|
||||||
|
return sorted(list(result), key=lambda i: i[1])
|
||||||
|
finally:
|
||||||
|
self.not_listen_output()
|
||||||
|
|
||||||
|
async def list_devices(self):
|
||||||
|
return await self.get_list('devices', DEVICE_PATTERN)
|
||||||
|
|
||||||
|
async def list_paired_devices(self):
|
||||||
|
return await self.get_list('paired-devices', DEVICE_PATTERN)
|
||||||
|
|
||||||
|
async def list_controllers(self):
|
||||||
|
return await self.get_list('list', CONTROLLER_PATTERN)
|
||||||
|
|
||||||
|
async def select_paired_device(self):
|
||||||
|
print('Selecting device:')
|
||||||
|
devices = await self.list_paired_devices()
|
||||||
|
count = len(devices)
|
||||||
|
|
||||||
|
if count < 1:
|
||||||
|
raise SubprocessError('There is no connected device.')
|
||||||
|
elif count == 1:
|
||||||
|
return devices[0]
|
||||||
|
|
||||||
|
for i, d in enumerate(devices):
|
||||||
|
print('%d. %s %s' % (i+1, d[0], d[1]))
|
||||||
|
print('Select device[1]:')
|
||||||
|
selected = input()
|
||||||
|
return devices[0 if not selected.strip() else (int(selected) - 1)]
|
||||||
|
|
||||||
|
|
||||||
|
async def wait(delay=None):
|
||||||
|
return await asyncio.sleep(WAIT_TIME or delay)
|
||||||
|
|
||||||
|
|
||||||
|
async def execute_command(cmd, ignore_fail=False):
|
||||||
|
p = await asyncio.create_subprocess_shell(cmd, stdout=sb.PIPE, stderr=sb.PIPE)
|
||||||
|
stdout, stderr = await p.communicate()
|
||||||
|
stdout, stderr = \
|
||||||
|
stdout.decode() if stdout is not None else '', \
|
||||||
|
stderr.decode() if stderr is not None else ''
|
||||||
|
if p.returncode != 0 or stderr.strip() != '':
|
||||||
|
message = 'Command: %s failed with status: %s\nstderr: %s' % (cmd, p.returncode, stderr)
|
||||||
|
if ignore_fail:
|
||||||
|
print('Ignoring: %s' % message)
|
||||||
|
else:
|
||||||
|
raise SubprocessError(message)
|
||||||
|
return stdout
|
||||||
|
|
||||||
|
|
||||||
|
async def execute_find(cmd, pattern, tries=0, fail_safe=False):
|
||||||
|
tries = tries or TRIES
|
||||||
|
|
||||||
|
message = 'Cannot find `%s` using `%s`.' % (pattern, cmd)
|
||||||
|
retry_message = message + ' Retrying %d more times'
|
||||||
|
while True:
|
||||||
|
stdout = await execute_command(cmd)
|
||||||
|
match = re.search(pattern, stdout)
|
||||||
|
|
||||||
|
if match:
|
||||||
|
return match.group()
|
||||||
|
elif tries > 0:
|
||||||
|
await wait()
|
||||||
|
print(retry_message % tries)
|
||||||
|
tries -= 1
|
||||||
|
continue
|
||||||
|
|
||||||
|
if fail_safe:
|
||||||
|
return None
|
||||||
|
|
||||||
|
raise RetryExceededError('Retry times exceeded: %s' % message)
|
||||||
|
|
||||||
|
|
||||||
|
async def find_dev_id(mac, **kw):
|
||||||
|
return await execute_find('pactl list cards short', 'bluez_card.%s' % '_'.join(mac), **kw)
|
||||||
|
|
||||||
|
|
||||||
|
async def find_sink(mac, **kw):
|
||||||
|
return await execute_find('pacmd list-sinks', 'bluez_sink.%s' % '_'.join(mac), **kw)
|
||||||
|
|
||||||
|
|
||||||
|
async def set_profile(device_id, profile):
|
||||||
|
print('Setting the %s profile' % profile)
|
||||||
|
try:
|
||||||
|
return await execute_command('pactl set-card-profile %s %s' % (device_id, _profiles[profile]))
|
||||||
|
except KeyError:
|
||||||
|
print('Invalid profile: %s, please select one one of a2dp or hsp.' % profile, file=sys.stderr)
|
||||||
|
raise SystemExit(1)
|
||||||
|
|
||||||
|
|
||||||
|
async def set_default_sink(sink):
|
||||||
|
print('Updating default sink to %s' % sink)
|
||||||
|
return await execute_command('pacmd set-default-sink %s' % sink)
|
||||||
|
|
||||||
|
|
||||||
|
async def move_streams_to_sink(sink):
|
||||||
|
streams = await execute_command('pacmd list-sink-inputs | grep "index:"', True)
|
||||||
|
for i in streams.split():
|
||||||
|
i = ''.join(n for n in i if n.isdigit())
|
||||||
|
if i != '':
|
||||||
|
print('Moving stream %s to sink' % i)
|
||||||
|
await execute_command('pacmd move-sink-input %s %s' % (i, sink))
|
||||||
|
return sink
|
||||||
|
|
||||||
|
|
||||||
|
async def main(args):
|
||||||
|
global WAIT_TIME, TRIES
|
||||||
|
|
||||||
|
if args.version:
|
||||||
|
print(__version__)
|
||||||
|
return 0
|
||||||
|
|
||||||
|
mac = args.mac
|
||||||
|
|
||||||
|
# Hacking, Changing the constants!
|
||||||
|
WAIT_TIME = args.wait
|
||||||
|
TRIES = args.tries
|
||||||
|
|
||||||
|
exit_future = asyncio.Future()
|
||||||
|
transport, protocol = await asyncio.get_event_loop().subprocess_exec(
|
||||||
|
lambda: BluetoothctlProtocol(exit_future, echo=args.echo), 'bluetoothctl'
|
||||||
|
)
|
||||||
|
|
||||||
|
try:
|
||||||
|
|
||||||
|
if mac is None:
|
||||||
|
mac, _ = await protocol.select_paired_device()
|
||||||
|
|
||||||
|
mac = mac.split(':' if ':' in mac else '_')
|
||||||
|
print('Device MAC: %s' % ':'.join(mac))
|
||||||
|
|
||||||
|
device_id = await find_dev_id(mac, fail_safe=True)
|
||||||
|
if device_id is None:
|
||||||
|
print('It seems device: %s is not connected yet, trying to connect.' % ':'.join(mac))
|
||||||
|
await protocol.trust(mac)
|
||||||
|
await protocol.connect(mac)
|
||||||
|
device_id = await find_dev_id(mac)
|
||||||
|
|
||||||
|
sink = await find_sink(mac, fail_safe=True)
|
||||||
|
if sink is None:
|
||||||
|
await set_profile(device_id, args.profile)
|
||||||
|
sink = await find_sink(mac)
|
||||||
|
|
||||||
|
print('Device ID: %s' % device_id)
|
||||||
|
print('Sink: %s' % sink)
|
||||||
|
|
||||||
|
await set_default_sink(sink)
|
||||||
|
await wait()
|
||||||
|
|
||||||
|
await set_profile(device_id, 'off')
|
||||||
|
|
||||||
|
if args.profile == 'a2dp':
|
||||||
|
await protocol.disconnect(mac)
|
||||||
|
await wait()
|
||||||
|
await protocol.connect(mac)
|
||||||
|
|
||||||
|
device_id = await find_dev_id(mac)
|
||||||
|
print('Device ID: %s' % device_id)
|
||||||
|
|
||||||
|
await wait(2)
|
||||||
|
await set_profile(device_id, args.profile)
|
||||||
|
await set_default_sink(sink)
|
||||||
|
await move_streams_to_sink(sink)
|
||||||
|
|
||||||
|
except (SubprocessError, RetryExceededError) as ex:
|
||||||
|
print(str(ex), file=sys.stderr)
|
||||||
|
return 1
|
||||||
|
finally:
|
||||||
|
print('Exiting bluetoothctl')
|
||||||
|
await protocol.quit()
|
||||||
|
await exit_future
|
||||||
|
|
||||||
|
# Close the stdout pipe
|
||||||
|
transport.close()
|
||||||
|
|
||||||
|
if args.profile == 'a2dp':
|
||||||
|
print('"Enjoy" the HiFi stereo music :)')
|
||||||
|
else:
|
||||||
|
print('"Enjoy" your headset audio :)')
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
sys.exit(asyncio.get_event_loop().run_until_complete(main(parser.parse_args())))
|
||||||
|
|
3
bin/abb-download
Executable file
3
bin/abb-download
Executable file
|
@ -0,0 +1,3 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
tm -a $(abb-magnet $1)
|
3
bin/abb-magnet
Executable file
3
bin/abb-magnet
Executable file
|
@ -0,0 +1,3 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
echo 'magnet:?xt=urn:btih:'$1'&tr=udp%3A%2F%2Ftracker%2Eleechers-paradise%2Eorg%3A6969%2Fannounce&tr=udp%3A%2F%2Ftracker.opentrackr.org%3A1337%2Fannounce&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969%2Fannounce&tr=udp%3A%2F%2Ftracker.torrent.eu.org%3A451%2Fannounce&tr=http%3A%2F%2Ftracker2.dler.org%3A80%2Fannounce'
|
17
bin/add-blacklist-patches
Executable file
17
bin/add-blacklist-patches
Executable file
|
@ -0,0 +1,17 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
base=/home/frank/cyanogenmod
|
||||||
|
|
||||||
|
pushd
|
||||||
|
cd $base/frameworks/base
|
||||||
|
git pull http://review.cyanogenmod.org/CyanogenMod/android_frameworks_base refs/changes/23/45523/4
|
||||||
|
cd $base/frameworks/opt/telephony
|
||||||
|
git pull http://review.cyanogenmod.org/CyanogenMod/android_frameworks_opt_telephony refs/changes/26/45526/5
|
||||||
|
cd $base/packages/apps/Settings
|
||||||
|
git pull http://review.cyanogenmod.org/CyanogenMod/android_packages_apps_Settings refs/changes/20/45520/9
|
||||||
|
cd $base/packages/apps/Mms
|
||||||
|
git pull http://review.cyanogenmod.org/CyanogenMod/android_packages_apps_Mms refs/changes/22/45522/10
|
||||||
|
|
||||||
|
cd $base/frameworks/base
|
||||||
|
patch -p1 < /var/src/PATCHES/cyanogenmod-getuuid.patch
|
||||||
|
popd
|
18
bin/any2djvu
Executable file
18
bin/any2djvu
Executable file
|
@ -0,0 +1,18 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
outfile=$1
|
||||||
|
|
||||||
|
while shift;do
|
||||||
|
echo processing $1...
|
||||||
|
infile=$1
|
||||||
|
pbmfile=$(basename $infile).pbm
|
||||||
|
djvufile=$(basename $infile).djvu
|
||||||
|
convert $infile $pbmfile
|
||||||
|
cjb2 -clean $pbmfile $djvufile
|
||||||
|
if test -f $outfile; then
|
||||||
|
djvm -i $outfile $djvufile
|
||||||
|
else
|
||||||
|
djvm -c $outfile $djvufile
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
27
bin/backlight
Executable file
27
bin/backlight
Executable file
|
@ -0,0 +1,27 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
root=/sys/class/backlight/radeon_bl0
|
||||||
|
control=$root/brightness
|
||||||
|
max=$(cat $root/max_brightness)
|
||||||
|
actual=$(cat $control)
|
||||||
|
min=8
|
||||||
|
step=8
|
||||||
|
|
||||||
|
bset () {
|
||||||
|
if [[ -n "$1" ]] && [[ $1 -ge $min ]] && [[ $1 -le $max ]]; then
|
||||||
|
echo $1 > $control
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
case "$1" in
|
||||||
|
u|U)
|
||||||
|
bset $((actual+step))
|
||||||
|
;;
|
||||||
|
d|D)
|
||||||
|
bset $((actual-step))
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
bset "$1"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
1
bin/books-all
Symbolic link
1
bin/books-all
Symbolic link
|
@ -0,0 +1 @@
|
||||||
|
/home/frank/bin/books
|
171
bin/books_functions
Normal file
171
bin/books_functions
Normal file
|
@ -0,0 +1,171 @@
|
||||||
|
# shellcheck shell=bash disable=SC2154
|
||||||
|
|
||||||
|
# UTITLITIES
|
||||||
|
|
||||||
|
# find tool, returns the first|one|found, exit with error message if none found
|
||||||
|
find_tool () {
|
||||||
|
IFS='|' read -ra tools <<< "$*"
|
||||||
|
|
||||||
|
found=0
|
||||||
|
|
||||||
|
for tool in "${tools[@]}"; do
|
||||||
|
if [[ -n $(which "$tool") ]]; then
|
||||||
|
found=1
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
if [[ "$found" -eq 0 ]]; then
|
||||||
|
if [[ ${#tools[@]} -gt 1 ]]; then
|
||||||
|
exit_with_error "missing programs: $*; install at least one of these: ${tools[*]} and try again"
|
||||||
|
else
|
||||||
|
exit_with_error "missing program: $1; please install and try again"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "$tool"
|
||||||
|
}
|
||||||
|
|
||||||
|
url_available () {
|
||||||
|
url="$1"
|
||||||
|
dl_tool=$(find_tool "curl|wget")
|
||||||
|
|
||||||
|
case "$dl_tool" in
|
||||||
|
curl)
|
||||||
|
${torsocks:-} curl --output /dev/null --silent --fail -r 0-0 "$url"
|
||||||
|
;;
|
||||||
|
wget)
|
||||||
|
${torsocks:-} wget -q --spider "$url"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
exit_with_error "unknown download tool ${dl_tool}"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
add_cron_job () {
|
||||||
|
job="$*"
|
||||||
|
|
||||||
|
(crontab -l ; echo "*/1 * * * * $job") 2>/dev/null | sort | uniq | crontab -
|
||||||
|
}
|
||||||
|
|
||||||
|
# leave <br> and <pre> to enable some simple formatting tasks
|
||||||
|
strip_html () {
|
||||||
|
#echo "$*"|sed -e 's/<br>/\n/g;s/<[^>]*>//g;s/\n/<br>/g'
|
||||||
|
echo "$*"
|
||||||
|
}
|
||||||
|
|
||||||
|
is_true () {
|
||||||
|
val="${1,,}"
|
||||||
|
if [[ "${val:0:1}" == "y" || "$val" -gt 0 ]]; then
|
||||||
|
true
|
||||||
|
else
|
||||||
|
false
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# dummmy cleanup function
|
||||||
|
cleanup () {
|
||||||
|
true
|
||||||
|
}
|
||||||
|
|
||||||
|
# echo error message to stderr and terminate main
|
||||||
|
exit_with_error () {
|
||||||
|
echo -e "$(basename "$0"): $*" >&2
|
||||||
|
|
||||||
|
kill -s TERM "$TOP_PID"
|
||||||
|
}
|
||||||
|
|
||||||
|
trap_error () {
|
||||||
|
cleanup
|
||||||
|
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
trap_clean () {
|
||||||
|
cleanup
|
||||||
|
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
_log () {
|
||||||
|
msg="$*"
|
||||||
|
logdir="${XDG_STATE_HOME:-$HOME/.state}/books"
|
||||||
|
logfile=$(basename "$0").log
|
||||||
|
mkdir -p "$logdir"
|
||||||
|
echo "$(date -Iseconds): $msg" >> "$logdir/$logfile"
|
||||||
|
}
|
||||||
|
|
||||||
|
log_err () {
|
||||||
|
_log "E: $*"
|
||||||
|
}
|
||||||
|
|
||||||
|
log_warn () {
|
||||||
|
_log "W: $*"
|
||||||
|
}
|
||||||
|
|
||||||
|
log_info () {
|
||||||
|
_log "I: $*"
|
||||||
|
}
|
||||||
|
|
||||||
|
log_debug () {
|
||||||
|
_log "D: $*"
|
||||||
|
}
|
||||||
|
|
||||||
|
# DATABASE
|
||||||
|
dbx () {
|
||||||
|
db="$1"
|
||||||
|
shift
|
||||||
|
|
||||||
|
mysql=$(find_tool "mysql")
|
||||||
|
|
||||||
|
if [ $# -gt 0 ]; then
|
||||||
|
"$mysql" -N -Bsss -h "$dbhost" -P "$dbport" -u "$dbuser" "$db" -e "$*"
|
||||||
|
else
|
||||||
|
"$mysql" -N -Bsss -h "$dbhost" -P "$dbport" -u "$dbuser" "$db"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# LOCKING
|
||||||
|
|
||||||
|
exlock () {
|
||||||
|
cmd="$1"
|
||||||
|
|
||||||
|
lockfile="/var/lock/$(basename "$0")"
|
||||||
|
lockfd=99
|
||||||
|
|
||||||
|
flock=$(find_tool "flock")
|
||||||
|
|
||||||
|
case "$cmd" in
|
||||||
|
prepare)
|
||||||
|
eval "exec $lockfd<>\"$lockfile\""
|
||||||
|
trap 'exlock nolock' EXIT
|
||||||
|
;;
|
||||||
|
|
||||||
|
now)
|
||||||
|
$flock -xn $lockfd
|
||||||
|
;;
|
||||||
|
|
||||||
|
lock)
|
||||||
|
$flock -x $lockfd
|
||||||
|
;;
|
||||||
|
|
||||||
|
shlock)
|
||||||
|
$flock -s $lockfd
|
||||||
|
;;
|
||||||
|
|
||||||
|
unlock)
|
||||||
|
$flock -u $lockfd
|
||||||
|
;;
|
||||||
|
|
||||||
|
nolock)
|
||||||
|
$flock -u $lockfd
|
||||||
|
$flock -xn $lockfd && rm -f "$lockfile"
|
||||||
|
trap_clean
|
||||||
|
;;
|
||||||
|
|
||||||
|
*)
|
||||||
|
exit_with_error "unknown lock command: $cmd"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
120
bin/build-libcairo2.sh
Executable file
120
bin/build-libcairo2.sh
Executable file
|
@ -0,0 +1,120 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# 2011/03/08 16:28:21
|
||||||
|
#
|
||||||
|
# Copyright (C) 2010-2011 Mithat Konar
|
||||||
|
#
|
||||||
|
# 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 3 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., 51 Franklin Street, Fifth Floor, Boston,
|
||||||
|
# MA 02110-1301, USA.
|
||||||
|
#
|
||||||
|
# Build patched libcairo packages for Debian Squeeze that enable Ubuntu-like
|
||||||
|
# font rendering.
|
||||||
|
#
|
||||||
|
# Assumes deb-src http://ftp.us.debian.org/debian/ squeeze main non-free contrib
|
||||||
|
# or similar is present in /etc/apt/sources.list
|
||||||
|
#
|
||||||
|
# Assumes you have already done
|
||||||
|
# apt-get install build-essential devscripts fakeroot
|
||||||
|
# apt-get build-dep cairo
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
#======================================================================#
|
||||||
|
# SET THE VERSION INFO BELOW BEFORE RUNNING SCRIPT!!!
|
||||||
|
#
|
||||||
|
UBUNTU_VERSION="1.8.10-2ubuntu1" # From http://packages.ubuntu.com/lucid/libcairo2 (e.g., "1.8.10-2ubuntu1");
|
||||||
|
# should match the version at http://packages.debian.org/squeeze/libcairo2
|
||||||
|
# You may need to look in http://archive.ubuntu.com/ubuntu/pool/main/c/cairo/
|
||||||
|
# to resolve inconsistencies.
|
||||||
|
YOUR_INITIALS="fdl" # from birth or marriage :-) no spaces allowed
|
||||||
|
#======================================================================#
|
||||||
|
|
||||||
|
###
|
||||||
|
### constanty things
|
||||||
|
###
|
||||||
|
UBUNTU_REP=http://archive.ubuntu.com/ubuntu/pool/main/c/cairo
|
||||||
|
UBUNTU_PATCH=cairo_${UBUNTU_VERSION}.debian.tar.gz
|
||||||
|
ARCH_REP=http://aur.archlinux.org/packages/cairo-ubuntu/
|
||||||
|
ARCH_PATCH=cairo-ubuntu.tar.gz
|
||||||
|
|
||||||
|
###
|
||||||
|
### GO!
|
||||||
|
###
|
||||||
|
### dir names
|
||||||
|
root_dir=`pwd`
|
||||||
|
top_dir="${root_dir}/libcairo2"
|
||||||
|
deb_sources="${top_dir}/deb-sources"
|
||||||
|
downloaded_patches="${top_dir}/downloaded-patches"
|
||||||
|
|
||||||
|
### make room
|
||||||
|
mkdir "$top_dir"
|
||||||
|
mkdir "$deb_sources"
|
||||||
|
mkdir "$downloaded_patches"
|
||||||
|
|
||||||
|
### get patches
|
||||||
|
cd "$downloaded_patches"
|
||||||
|
wget ${UBUNTU_REP}/${UBUNTU_PATCH}
|
||||||
|
wget ${ARCH_REP}/${ARCH_PATCH}
|
||||||
|
|
||||||
|
tar xzvf ${UBUNTU_PATCH}
|
||||||
|
tar xzvf ${ARCH_PATCH}
|
||||||
|
|
||||||
|
### get sources
|
||||||
|
cd "$deb_sources"
|
||||||
|
apt-get source cairo
|
||||||
|
cd ./cairo-*
|
||||||
|
|
||||||
|
### copy the patches
|
||||||
|
cp "${downloaded_patches}/cairo-ubuntu/cairo-respect-fontconfig.patch" ./debian/patches/
|
||||||
|
cp "${downloaded_patches}/debian/patches/04_lcd_filter.patch" ./debian/patches/
|
||||||
|
cp "${downloaded_patches}/debian/patches/06_Xlib-Xcb-Hand-off-EXTEND_PAD-to-XRender.patch" ./debian/patches/
|
||||||
|
|
||||||
|
### apply patches
|
||||||
|
patch -p1 -i ./debian/patches/cairo-respect-fontconfig.patch
|
||||||
|
patch -p1 -i ./debian/patches/04_lcd_filter.patch
|
||||||
|
patch -p1 -i ./debian/patches/06_Xlib-Xcb-Hand-off-EXTEND_PAD-to-XRender.patch
|
||||||
|
|
||||||
|
### modify the changelog, add version info
|
||||||
|
echo ""
|
||||||
|
echo "********************************"
|
||||||
|
echo -e "In the editor that appears next, add something like the following\n\
|
||||||
|
text after the first asterisk (*):\n\
|
||||||
|
'David Turner's ClearType-like LCD filtering patch and fix.'\n\
|
||||||
|
Then save and exit the editor."
|
||||||
|
echo ""
|
||||||
|
read -p "Press <enter> to continue..."
|
||||||
|
dch -l $YOUR_INITIALS
|
||||||
|
|
||||||
|
### build it
|
||||||
|
dpkg-buildpackage -rfakeroot -us -uc
|
||||||
|
|
||||||
|
### finito
|
||||||
|
# tell user what to do next
|
||||||
|
echo ""
|
||||||
|
echo "********************************"
|
||||||
|
echo "* DONE with compiling!"
|
||||||
|
echo "********************************"
|
||||||
|
echo -e "If all went well, you should have a bunch of new packages inside \n\
|
||||||
|
$deb_sources\n\
|
||||||
|
\n\
|
||||||
|
List of *.deb files in $deb_sources:"
|
||||||
|
|
||||||
|
cd $deb_sources
|
||||||
|
ls *.deb
|
||||||
|
|
||||||
|
echo -e "\nInstall all of them by changing into \n\
|
||||||
|
$deb_sources\n\
|
||||||
|
and do (as root):\n\
|
||||||
|
dpkg -i *.deb"
|
37
bin/camera_import
Executable file
37
bin/camera_import
Executable file
|
@ -0,0 +1,37 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
destination="/net/media/photos/import/$(date +'%Y-%m-%d')"
|
||||||
|
mountpoint="/home/frank/cam"
|
||||||
|
#camera="/dev/disk/by-label/WB2000-F"
|
||||||
|
camera="/dev/disk/by-uuid/F84E-1690"
|
||||||
|
store="DCIM"
|
||||||
|
camera_id=SAMSUNG_WB2000-frank
|
||||||
|
# volume_id=$(blkid -o value -s UUID ${camera})
|
||||||
|
seen="/net/media/photos/import/SEEN/${camera_id}"
|
||||||
|
temp=$(mktemp -d)
|
||||||
|
current="${temp}/${camera_id}"
|
||||||
|
|
||||||
|
#fusermount -u "${mountpoint}"
|
||||||
|
#fusefat -o ro "${camera}" "${mountpoint}"
|
||||||
|
sudo umount "${mountpoint}"
|
||||||
|
sudo mount -o ro,uid=1000 "${camera}" "${mountpoint}"
|
||||||
|
mkdir -p "${destination}"
|
||||||
|
mkdir -p "${temp}"
|
||||||
|
|
||||||
|
(cd ${mountpoint}/${store} && find . -type f|sed -e 's/^\.\///'|sort) > ${current}
|
||||||
|
|
||||||
|
for f in $(diff -u ${seen} ${current}|grep '^+[^+]'|sed -e 's/^+//'); do
|
||||||
|
cp "${mountpoint}"/"${store}"/"${f}" "${destination}"
|
||||||
|
echo $f >> ${seen}
|
||||||
|
echo -n "."
|
||||||
|
done
|
||||||
|
|
||||||
|
echo " "
|
||||||
|
|
||||||
|
rm -rf ${temp}
|
||||||
|
|
||||||
|
# ls "${mountpoint}"/"${store}"|while read f; do echo -n "."; cp "${mountpoint}"/"${store}"/"${f}" "${destination}"; done; echo " "
|
||||||
|
|
||||||
|
|
||||||
|
#fusermount -u "${mountpoint}"
|
||||||
|
sudo umount "${mountpoint}"
|
30
bin/camera_import-canon
Executable file
30
bin/camera_import-canon
Executable file
|
@ -0,0 +1,30 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
destination="/net/media/photos/import/$(date +'%Y-%m-%d')"
|
||||||
|
mountpoint="/home/frank/cam"
|
||||||
|
camera="/dev/sdb1"
|
||||||
|
store="store_00010001/DCIM"
|
||||||
|
camera_id=CANON-G12-frank
|
||||||
|
# volume_id=$(blkid -o value -s UUID ${camera})
|
||||||
|
seen="/net/media/photos/import/SEEN/${camera_id}"
|
||||||
|
temp=$(mktemp -d)
|
||||||
|
current="${temp}/${camera_id}"
|
||||||
|
|
||||||
|
gphotofs "${mountpoint}"
|
||||||
|
|
||||||
|
mkdir -p "${destination}"
|
||||||
|
mkdir -p "${temp}"
|
||||||
|
|
||||||
|
(cd ${mountpoint}/${store} && find . -type f|sed -e 's/^\.\///'|sort) > ${current}
|
||||||
|
|
||||||
|
for f in $(diff -u ${seen} ${current}|grep '^+[^+]'|sed -e 's/^+//'); do
|
||||||
|
cp "${mountpoint}"/"${store}"/"${f}" "${destination}"
|
||||||
|
echo $f >> ${seen}
|
||||||
|
echo -n "."
|
||||||
|
done
|
||||||
|
|
||||||
|
echo " "
|
||||||
|
|
||||||
|
rm -rf ${temp}
|
||||||
|
|
||||||
|
fusermount -u "${mountpoint}"
|
30
bin/camera_import-ellen
Executable file
30
bin/camera_import-ellen
Executable file
|
@ -0,0 +1,30 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
destination="/net/behemoth/photos/import/$(date +'%Y-%m-%d')"
|
||||||
|
mountpoint="/home/frank/cam"
|
||||||
|
camera="/dev/sdb1"
|
||||||
|
store="store_00010001/DCIM"
|
||||||
|
camera_id=CANON-A460-ellen
|
||||||
|
# volume_id=$(blkid -o value -s UUID ${camera})
|
||||||
|
seen="/net/behemoth/photos/import/SEEN/${camera_id}"
|
||||||
|
temp=$(mktemp -d)
|
||||||
|
current="${temp}/${camera_id}"
|
||||||
|
|
||||||
|
gphotofs "${mountpoint}"
|
||||||
|
|
||||||
|
mkdir -p "${destination}"
|
||||||
|
mkdir -p "${temp}"
|
||||||
|
|
||||||
|
(cd ${mountpoint}/${store} && find . -type f|sed -e 's/^\.\///'|sort) > ${current}
|
||||||
|
|
||||||
|
for f in $(diff -u ${seen} ${current}|grep '^+[^+]'|sed -e 's/^+//'); do
|
||||||
|
cp "${mountpoint}"/"${store}"/"${f}" "${destination}"
|
||||||
|
echo $f >> ${seen}
|
||||||
|
echo -n "."
|
||||||
|
done
|
||||||
|
|
||||||
|
echo " "
|
||||||
|
|
||||||
|
rm -rf ${temp}
|
||||||
|
|
||||||
|
fusermount -u "${mountpoint}"
|
23
bin/clipplayer
Executable file
23
bin/clipplayer
Executable file
|
@ -0,0 +1,23 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
clip=$(xclip -o -selection clipboard)
|
||||||
|
|
||||||
|
options=
|
||||||
|
player="-p mplayer"
|
||||||
|
|
||||||
|
case "$clip" in
|
||||||
|
*youtube*|*youtu\.be*)
|
||||||
|
link="https://youtu.be/${clip:(-11)}"
|
||||||
|
;;
|
||||||
|
*svtplay.se*)
|
||||||
|
// options += " --hls-live-edge 10 --hls-segment-threads 2"
|
||||||
|
link="$clip"
|
||||||
|
;;
|
||||||
|
*disq.us*)
|
||||||
|
link=$(urldecode "$clip")
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
if [[ -n "$link" ]]; then
|
||||||
|
streamlink "$player" --stream-sorting-excludes '>360p,>medium' $options "$link" best
|
||||||
|
fi
|
1
bin/clp
Symbolic link
1
bin/clp
Symbolic link
|
@ -0,0 +1 @@
|
||||||
|
clipplayer
|
3
bin/compositor_toggle
Executable file
3
bin/compositor_toggle
Executable file
|
@ -0,0 +1,3 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
if [ "$(gconftool -g /apps/metacity/general/compositing_manager)" = "true" ]; then gconftool --type bool -s /apps/metacity/general/compositing_manager 0; else gconftool --type bool -s /apps/metacity/general/compositing_manager 1; fi
|
5
bin/connect
Executable file
5
bin/connect
Executable file
|
@ -0,0 +1,5 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
sudo iwconfig wlan2 essid wireless.unternet.org
|
||||||
|
sudo ifconfig wlan2 up
|
||||||
|
sudo dhclient wlan2
|
11
bin/countdown
Executable file
11
bin/countdown
Executable file
|
@ -0,0 +1,11 @@
|
||||||
|
#!/bin/sh
|
||||||
|
#
|
||||||
|
# a simple countdown timer
|
||||||
|
|
||||||
|
if [ $1 -gt 0 ]; then
|
||||||
|
for n in $(seq $1 -1 1); do
|
||||||
|
espeak $n
|
||||||
|
sleep 0.35
|
||||||
|
done
|
||||||
|
espeak ${2:-"go"}
|
||||||
|
fi
|
17
bin/cpflash
Executable file
17
bin/cpflash
Executable file
|
@ -0,0 +1,17 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
|
||||||
|
if [ x"$1" == "x" ]; then
|
||||||
|
|
||||||
|
ls -l /proc/$(ps aux|grep plugin|grep flash|grep -v grep|awk '{print $2}')/fd
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
if [ x"$2" == "x" ]; then
|
||||||
|
echo "use: $0 file-descriptor destination"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
cp /proc/$(ps aux|grep plugin|grep flash|grep -v grep|awk '{print $2}')/fd/$1 $2
|
||||||
|
|
||||||
|
fi
|
2
bin/ddc-brightness
Executable file
2
bin/ddc-brightness
Executable file
|
@ -0,0 +1,2 @@
|
||||||
|
#!/bin/bash
|
||||||
|
ddcutil --model='W240D DVI' setvcp 10 "$1" &
|
29
bin/ddc-daylight
Executable file
29
bin/ddc-daylight
Executable file
|
@ -0,0 +1,29 @@
|
||||||
|
#!/bin/bash
|
||||||
|
# Usage: ddc-daylight night
|
||||||
|
case "$1" in
|
||||||
|
"day" )
|
||||||
|
BRIGHTNESS=100
|
||||||
|
TEMPERATURE=0x09
|
||||||
|
;;
|
||||||
|
"evening" | "morning" )
|
||||||
|
BRIGHTNESS=60
|
||||||
|
TEMPERATURE=0x06
|
||||||
|
;;
|
||||||
|
"night" )
|
||||||
|
BRIGHTNESS=30
|
||||||
|
TEMPERATURE=0x04
|
||||||
|
;;
|
||||||
|
"dark" )
|
||||||
|
BRIGHTNESS=0
|
||||||
|
TEMPERATURE=0x04
|
||||||
|
;;
|
||||||
|
* )
|
||||||
|
echo "Unknown time of day '$1'"
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
ddcutil --bus=1 setvcp 10 $BRIGHTNESS &
|
||||||
|
ddcutil --bus=1 setvcp 14 $TEMPERATURE &
|
||||||
|
wait
|
||||||
|
|
4
bin/disable_pa
Executable file
4
bin/disable_pa
Executable file
|
@ -0,0 +1,4 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
sudo mv /etc/pulse/default.pa /etc/pulse/default.pa.disabled
|
||||||
|
pulseaudio --kill
|
8
bin/drop_caches
Normal file
8
bin/drop_caches
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
# To free pagecache
|
||||||
|
echo 1 > /proc/sys/vm/drop_caches
|
||||||
|
|
||||||
|
# To free dentries and inodes
|
||||||
|
echo 2 > /proc/sys/vm/drop_caches
|
||||||
|
|
||||||
|
# To free pagecache, dentries and inodes
|
||||||
|
echo 3 > /proc/sys/vm/drop_caches
|
7
bin/ds
Executable file
7
bin/ds
Executable file
|
@ -0,0 +1,7 @@
|
||||||
|
#!/bin/bash
|
||||||
|
#
|
||||||
|
# ds - dirsize - show size of current dir only
|
||||||
|
|
||||||
|
if test "$1x" = "x";then dir=".";else dir="$1";fi
|
||||||
|
|
||||||
|
s=0;c=0;for x in $(ls $dir -al|awk '{print $5}');do s=$[$s + $x];c=$[$c + 1];done;echo $c $s
|
622
bin/ee.pl
Executable file
622
bin/ee.pl
Executable file
|
@ -0,0 +1,622 @@
|
||||||
|
#!/usr/bin/perl
|
||||||
|
#
|
||||||
|
# applicaton/x-external-editor
|
||||||
|
# reference implementation of the helper application
|
||||||
|
#
|
||||||
|
# written by Erik Möller - public domain
|
||||||
|
#
|
||||||
|
# User documentation: http://meta.wikimedia.org/wiki/Help:External_editors
|
||||||
|
# Technical documentation: http://meta.wikimedia.org/wiki/Help:External_editors/Tech
|
||||||
|
#
|
||||||
|
# To do: Edit conflicts
|
||||||
|
#
|
||||||
|
use Config::IniFiles; # Module for config files in .ini syntax
|
||||||
|
use LWP::UserAgent; # Web agent module for retrieving and posting HTTP data
|
||||||
|
use URI::Escape; # Urlencode functions
|
||||||
|
use Gtk2 '-init'; # Graphical user interface, requires GTK2 libraries
|
||||||
|
use Encode qw(encode); # UTF-8/iso8859-1 encoding
|
||||||
|
use HTML::Entities; # Encode or decode strings with HTML entities
|
||||||
|
|
||||||
|
# Load interface messages
|
||||||
|
initmsg();
|
||||||
|
|
||||||
|
# By default, config will be searched for in your Unix home directory
|
||||||
|
# (e.g. ~/.ee-helper/ee.ini). Change path of the configuration file if needed!
|
||||||
|
#
|
||||||
|
# Under Windows, set to something like
|
||||||
|
# $cfgfile='c:\ee\ee.ini';
|
||||||
|
# (note single quotes!)
|
||||||
|
$cfgfile=$ENV{HOME}."/.ee-helper/ee.ini";
|
||||||
|
|
||||||
|
|
||||||
|
$cfgfile=getunixpath($cfgfile);
|
||||||
|
|
||||||
|
$DEBUG=0;
|
||||||
|
$NOGUIERRORS=0;
|
||||||
|
$LANGUAGE="en";
|
||||||
|
|
||||||
|
# Read config
|
||||||
|
my $cfg = new Config::IniFiles( -file => $cfgfile ) or vdie (_("noinifile",$cfgfile));
|
||||||
|
|
||||||
|
# Treat spaces as part of input filename
|
||||||
|
my $args=join(" ",@ARGV);
|
||||||
|
|
||||||
|
# Where do we store our files?
|
||||||
|
my $tempdir=$cfg->val("Settings","Temp Path") or vdie (_("notemppath",$cfgfile));
|
||||||
|
|
||||||
|
# Remove slash at the end of the directory name, if existing
|
||||||
|
$/="/";
|
||||||
|
chomp($tempdir);
|
||||||
|
$/="\\";
|
||||||
|
chomp($tempdir);
|
||||||
|
my $unixtempdir=getunixpath($tempdir);
|
||||||
|
|
||||||
|
if($DEBUG) {
|
||||||
|
# Make a copy of the control (input) file in the log
|
||||||
|
open(DEBUGLOG,">$unixtempdir/debug.log");
|
||||||
|
open(INPUT,"<$args");
|
||||||
|
$/=undef; # slurp mode
|
||||||
|
while(<INPUT>) {
|
||||||
|
$inputfile=$_;
|
||||||
|
}
|
||||||
|
print DEBUGLOG $inputfile;
|
||||||
|
close(INPUT);
|
||||||
|
}
|
||||||
|
|
||||||
|
# Read the control file
|
||||||
|
if(-e $args) {
|
||||||
|
$input = new Config::IniFiles( -file => $args );
|
||||||
|
} else {
|
||||||
|
vdie (_("nocontrolfile"));
|
||||||
|
}
|
||||||
|
|
||||||
|
# Initialize the browser as Firefox 1.0 with new cookie jar
|
||||||
|
$browser=LWP::UserAgent->new();
|
||||||
|
$browser->cookie_jar( {} );
|
||||||
|
@ns_headers = (
|
||||||
|
'User-Agent' => 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7) Gecko/20041107 Firefox/1.0',
|
||||||
|
'Accept' => 'image/gif, image/x-xbitmap, image/jpeg,
|
||||||
|
image/pjpeg, image/png, */*',
|
||||||
|
'Accept-Charset' => 'iso-8859-1,*,utf-8',
|
||||||
|
'Accept-Language' => 'en-US',
|
||||||
|
);
|
||||||
|
|
||||||
|
# Obtain parameters from control file
|
||||||
|
$special=$input->val("Process","Special namespace");
|
||||||
|
$fileurl=$input->val("File","URL");
|
||||||
|
$type=$input->val("Process","Type");
|
||||||
|
$script=$input->val("Process","Script");
|
||||||
|
$server=$input->val("Process","Server");
|
||||||
|
$path=$input->val("Process","Path");
|
||||||
|
$login_url=$script."?title=$special:Userlogin&action=submitlogin";
|
||||||
|
$ext=$input->val("File","Extension");
|
||||||
|
if($special eq "") { $special="Special"; };
|
||||||
|
|
||||||
|
# Edit file: change an image, sound etc. in an external app
|
||||||
|
# Edit text: change a regular text file
|
||||||
|
# In both cases, we need to construct the relevant URLs
|
||||||
|
# to fetch and post the data.
|
||||||
|
if($type eq "Edit file") {
|
||||||
|
$filename=substr($fileurl,rindex($fileurl,"/")+1);
|
||||||
|
# Image: is canonical namespace name, should always work
|
||||||
|
$view_url=$script."?title=Image:$filename";
|
||||||
|
$upload_url=$script."?title=$special:Upload";
|
||||||
|
} elsif($type eq "Edit text") {
|
||||||
|
$fileurl=~m|\?title=(.*?)\&action=|i;
|
||||||
|
$pagetitle=$1;
|
||||||
|
$filename=uri_unescape($pagetitle);
|
||||||
|
# substitute illegal or special characters
|
||||||
|
$filename =~ s/:/__/g; # : - illegal on Windows
|
||||||
|
$filename =~ s|/|__|g; # / - path character under Unix and others
|
||||||
|
# potential shell metacharacters:
|
||||||
|
$filename =~ s/[\[\]\{\}\(\)~!#\$\^\&\*;'"<>\?]/__/g;
|
||||||
|
|
||||||
|
$filename=$filename.".wiki";
|
||||||
|
$edit_url=$script."?title=$pagetitle&action=submit";
|
||||||
|
$view_url=$script."?title=$pagetitle";
|
||||||
|
} elsif($type eq "Diff text") {
|
||||||
|
$secondurl=$input->val("File 2","URL");
|
||||||
|
if(!$secondurl) {
|
||||||
|
vdie (_("twofordiff"));
|
||||||
|
}
|
||||||
|
$diffcommand=$cfg->val("Settings","Diff");
|
||||||
|
if(!$diffcommand) {
|
||||||
|
vdie (_("nodifftool"));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
# Nothing we know!
|
||||||
|
vdie (_("unknownprocess"));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
# Obtain settings from config file
|
||||||
|
$previewclient=$cfg->val("Settings","Browser");
|
||||||
|
$browseaftersave=$cfg->val("Settings","Browse after save");
|
||||||
|
|
||||||
|
# The config file can contain definitions for any number
|
||||||
|
# of site. Each one of them should have an "URL match", which is
|
||||||
|
# a simple string expression that needs to be part of the
|
||||||
|
# URL in the control file in order for it to be recognized
|
||||||
|
# as that site. Using this methodology, we can define usernames
|
||||||
|
# and passwords for sites relatively easily.
|
||||||
|
#
|
||||||
|
# Here we try to match the URL in the control file against the
|
||||||
|
# URL matches in all sections to determine the username and
|
||||||
|
# password.
|
||||||
|
#
|
||||||
|
@sections=$cfg->Sections();
|
||||||
|
foreach $section(@sections) {
|
||||||
|
if($search=$cfg->val($section,"URL match")) {
|
||||||
|
if(index($fileurl,$search)>=0) {
|
||||||
|
$username=$cfg->val($section,"Username");
|
||||||
|
$password=$cfg->val($section,"Password");
|
||||||
|
$auth_server=$cfg->val("${section}:HTTPAuth","Server");
|
||||||
|
$auth_realm=$cfg->val("${section}:HTTPAuth","Realm");
|
||||||
|
$auth_username=$cfg->val("${section}:HTTPAuth","Username");
|
||||||
|
$auth_password=$cfg->val("${section}:HTTPAuth","Password");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Log into server
|
||||||
|
# Note that we also log in for diffs, as the raw text might only be available
|
||||||
|
# to logged in users (depending on the wiki security settings), and we may want
|
||||||
|
# to offer GUI-based rollback functionality later
|
||||||
|
if( $auth_username ne "" ) {
|
||||||
|
$browser->credentials(
|
||||||
|
$auth_server,
|
||||||
|
$auth_realm,
|
||||||
|
$auth_username => $auth_password
|
||||||
|
);
|
||||||
|
}
|
||||||
|
$response=$browser->post($login_url,@ns_headers,
|
||||||
|
Content=>[wpName=>$username,wpPassword=>$password,wpRemember=>"1",wpLoginAttempt=>"Log in"]);
|
||||||
|
|
||||||
|
# We expect a redirect after successful login
|
||||||
|
if($response->code!=302 && !$ignore_login_error) {
|
||||||
|
vdie (_("loginfailed",$login_url,$username,$password));
|
||||||
|
}
|
||||||
|
|
||||||
|
$response=$browser->get($fileurl,@ns_headers);
|
||||||
|
if($type eq "Edit file") {
|
||||||
|
|
||||||
|
open(OUTPUT,">$unixtempdir/".$filename);
|
||||||
|
binmode(OUTPUT);
|
||||||
|
select OUTPUT; $|=1; select STDOUT;
|
||||||
|
print OUTPUT $response->content;
|
||||||
|
close(OUTPUT);
|
||||||
|
|
||||||
|
}elsif($type eq "Edit text") {
|
||||||
|
|
||||||
|
# Do we need to convert UTF-8 into ISO 8859-1?
|
||||||
|
if($cfg->val("Settings","Transcode UTF-8") eq "true") {
|
||||||
|
$transcode=1;
|
||||||
|
}
|
||||||
|
|
||||||
|
# MediaWiki 1.4+ uses edit tokens, we need to get one
|
||||||
|
# before we can submit edits. So instead of action=raw, we use
|
||||||
|
# action=edit, and get the token as well as the text of the page
|
||||||
|
# we want to edit in one go.
|
||||||
|
$ct=$response->header('Content-Type');
|
||||||
|
$editpage=$response->content;
|
||||||
|
$editpage=~m|<input type='hidden' value="(.*?)" name="wpEditToken" />|i;
|
||||||
|
$token=$1;
|
||||||
|
$editpage=~m|<textarea.*?name="wpTextbox1".*?>(.*?)</textarea>|is;
|
||||||
|
$text=$1;
|
||||||
|
$editpage=~m|<input type='hidden' value="(.*?)" name="wpEdittime" />|i;
|
||||||
|
$time=$1;
|
||||||
|
|
||||||
|
# Do we need to convert ..?
|
||||||
|
if($ct=~m/charset=utf-8/i) {
|
||||||
|
$is_utf8=1;
|
||||||
|
}
|
||||||
|
# ..if so, do it.
|
||||||
|
if($is_utf8 && $transcode) {
|
||||||
|
Encode::from_to($text,'utf8','iso-8859-1');
|
||||||
|
}
|
||||||
|
|
||||||
|
# decode HTML entities
|
||||||
|
HTML::Entities::decode($text);
|
||||||
|
|
||||||
|
# Flush the raw text of the page to the disk
|
||||||
|
open(OUTPUT,">$unixtempdir/".$filename);
|
||||||
|
select OUTPUT; $|=1; select STDOUT;
|
||||||
|
print OUTPUT $text;
|
||||||
|
close(OUTPUT);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
# Search for extension-associated application
|
||||||
|
@extensionlists=$cfg->Parameters("Editors");
|
||||||
|
foreach $extensionlist(@extensionlists) {
|
||||||
|
@exts=split(",",$extensionlist);
|
||||||
|
foreach $extensionfromlist(@exts) {
|
||||||
|
if ($extensionfromlist eq $ext) {
|
||||||
|
$app=$cfg->val("Editors",$extensionlist);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# In most cases, we'll want to run the GUI for managing saves & previews,
|
||||||
|
# and run the external editor application.
|
||||||
|
if($type ne "Diff text") {
|
||||||
|
|
||||||
|
if($^O eq "MSWin32") {
|
||||||
|
|
||||||
|
$appstring="$app $tempdir\\$filename";
|
||||||
|
} else {
|
||||||
|
$appstring="$app $tempdir/$filename";
|
||||||
|
}
|
||||||
|
$cid=fork();
|
||||||
|
if(!$cid) {
|
||||||
|
exec($appstring);
|
||||||
|
}
|
||||||
|
makegui();
|
||||||
|
|
||||||
|
} else {
|
||||||
|
# For external diffs, we need to create two temporary files.
|
||||||
|
$response1=$browser->get($fileurl,@ns_headers);
|
||||||
|
$response2=$browser->get($secondurl,@ns_headers);
|
||||||
|
open(DIFF1, ">$unixtempdir/diff-1.txt");
|
||||||
|
select DIFF1; $|=1; select STDOUT;
|
||||||
|
open(DIFF2, ">$unixtempdir/diff-2.txt");
|
||||||
|
select DIFF2; $|=1; select STDOUT;
|
||||||
|
print DIFF1 $response1->content;
|
||||||
|
print DIFF2 $response2->content;
|
||||||
|
close(DIFF1);
|
||||||
|
close(DIFF2);
|
||||||
|
if($^O eq "MSWin32") {
|
||||||
|
$appstring="$diffcommand $tempdir\\diff-1.txt $tempdir\\diff-2.txt";
|
||||||
|
} else {
|
||||||
|
$appstring="$diffcommand $tempdir/diff-1.txt $tempdir/diff-2.txt";
|
||||||
|
}
|
||||||
|
system($appstring);
|
||||||
|
}
|
||||||
|
|
||||||
|
# Create the GTK2 graphical user interface
|
||||||
|
# It should look like this:
|
||||||
|
# _______________________________________________
|
||||||
|
# | Summary: ____________________________________ |
|
||||||
|
# | |
|
||||||
|
# | [Save] [Save & Cont.] [Preview] [Cancel] |
|
||||||
|
# |_______________________________________________|
|
||||||
|
#
|
||||||
|
# Save: Send data to the server and quit ee.pl
|
||||||
|
# Save & cont.: Send data to the server, keep GUI open for future saves
|
||||||
|
# Preview: Create local preview file and view it in the browser (for text)
|
||||||
|
# Cancel: Quit ee.pl
|
||||||
|
#
|
||||||
|
sub makegui {
|
||||||
|
$title_label = Gtk2::Label->new($filename);
|
||||||
|
|
||||||
|
$vbox = Gtk2::VBox->new;
|
||||||
|
$hbox = Gtk2::HBox->new;
|
||||||
|
$label = Gtk2::Label->new(_("summary"));
|
||||||
|
$entry = Gtk2::Entry->new;
|
||||||
|
$hbox->pack_start_defaults($label);
|
||||||
|
$hbox->pack_start_defaults($entry);
|
||||||
|
|
||||||
|
$hbox2 = Gtk2::HBox->new;
|
||||||
|
$savebutton = Gtk2::Button->new(_("save"));
|
||||||
|
$savecontbutton = Gtk2::Button->new(_("savecont"));
|
||||||
|
$previewbutton = Gtk2::Button->new(_("preview"));
|
||||||
|
$cancelbutton = Gtk2::Button->new(_("cancel"));
|
||||||
|
$hbox2->pack_start_defaults($savebutton);
|
||||||
|
$hbox2->pack_start_defaults($savecontbutton);
|
||||||
|
$hbox2->pack_start_defaults($previewbutton);
|
||||||
|
$hbox2->pack_start_defaults($cancelbutton);
|
||||||
|
$vbox->pack_start_defaults($title_label);
|
||||||
|
$vbox->pack_start_defaults($hbox);
|
||||||
|
$vbox->pack_start_defaults($hbox2);
|
||||||
|
if($type ne "Edit file") {
|
||||||
|
$hbox3 = Gtk2::HBox->new;
|
||||||
|
$minoreditcheck = Gtk2::CheckButton->new_with_label(_("minoredit"));
|
||||||
|
$watchcheck = Gtk2::CheckButton->new_with_label(_("watchpage"));
|
||||||
|
$hbox3->pack_start_defaults($minoreditcheck);
|
||||||
|
$hbox3->pack_start_defaults($watchcheck);
|
||||||
|
$vbox->pack_start_defaults($hbox3);
|
||||||
|
if ($cfg->val("Settings","Minor edit default") =~ m/^(?:true|1)$/i) {
|
||||||
|
$minoreditcheck->set_active(1);
|
||||||
|
}
|
||||||
|
if ($cfg->val("Settings","Watch default") =~ m/^(?:true|1)$/i) {
|
||||||
|
$watchcheck->set_active(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
# Set up window
|
||||||
|
$window = Gtk2::Window->new;
|
||||||
|
$window->set_title (_("entersummary"));
|
||||||
|
$window->signal_connect (delete_event => sub {Gtk2->main_quit});
|
||||||
|
$savebutton->signal_connect (clicked => \&save);
|
||||||
|
$savecontbutton->signal_connect ( clicked => \&savecont);
|
||||||
|
$previewbutton->signal_connect ( clicked => \&preview);
|
||||||
|
$cancelbutton->signal_connect (clicked => \&cancel);
|
||||||
|
if($type ne "Edit file") {
|
||||||
|
$minoreditcheck->get_active();
|
||||||
|
$watchcheck->get_active();
|
||||||
|
}
|
||||||
|
# Add vbox to window
|
||||||
|
$window->add($vbox);
|
||||||
|
$window->show_all;
|
||||||
|
Gtk2->main;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
# Just let save function know that it shouldn't quit
|
||||||
|
sub savecont {
|
||||||
|
|
||||||
|
save("continue");
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
# Just let save function know that it shouldn't save
|
||||||
|
sub preview {
|
||||||
|
$preview=1;
|
||||||
|
save("continue");
|
||||||
|
}
|
||||||
|
|
||||||
|
sub save {
|
||||||
|
|
||||||
|
my $cont=shift;
|
||||||
|
my $summary=$entry->get_text();
|
||||||
|
my ($minorvar, $watchvar);
|
||||||
|
if($type ne "Edit file") {
|
||||||
|
$minorvar=$minoreditcheck->get_active();
|
||||||
|
$watchvar=$watchcheck->get_active();
|
||||||
|
}
|
||||||
|
# Spam the summary if room is available :-)
|
||||||
|
if(length($summary)<190) {
|
||||||
|
my $tosummary=_("usingexternal");
|
||||||
|
if(length($summary)>0) {
|
||||||
|
$tosummary=" [".$tosummary."]";
|
||||||
|
}
|
||||||
|
$summary.=$tosummary;
|
||||||
|
}
|
||||||
|
if($is_utf8) {
|
||||||
|
$summary=Encode::encode('utf8',$summary);
|
||||||
|
}
|
||||||
|
# Upload file back to the server and load URL in browser
|
||||||
|
if($type eq "Edit file") {
|
||||||
|
print $upload_url;
|
||||||
|
$response=$browser->post($upload_url,
|
||||||
|
@ns_headers,Content_Type=>'form-data',Content=>
|
||||||
|
[
|
||||||
|
wpUploadFile=>["$unixtempdir/".$filename],
|
||||||
|
wpUploadDescription=>$summary,
|
||||||
|
wpUploadAffirm=>"1",
|
||||||
|
wpUpload=>"Upload file",
|
||||||
|
wpIgnoreWarning=>"1"
|
||||||
|
]);
|
||||||
|
if($browseaftersave eq "true" && $previewclient && !$preview) {
|
||||||
|
$previewclient=~s/\$url/$view_url/i;
|
||||||
|
system(qq|$previewclient|);
|
||||||
|
$previewclient=$cfg->val("Settings","Browser");
|
||||||
|
}
|
||||||
|
# Save text back to the server & load in browser
|
||||||
|
} elsif($type eq "Edit text") {
|
||||||
|
open(TEXT,"<$unixtempdir/".$filename);
|
||||||
|
$/=undef;
|
||||||
|
while(<TEXT>) {
|
||||||
|
$text=$_;
|
||||||
|
}
|
||||||
|
close(TEXT);
|
||||||
|
if($is_utf8 && $transcode) {
|
||||||
|
Encode::from_to( $text, 'iso-8859-1','utf8');
|
||||||
|
}
|
||||||
|
@content = (
|
||||||
|
Content=>[
|
||||||
|
wpTextbox1=>$text,
|
||||||
|
wpSummary=>$summary,
|
||||||
|
wpEdittime=>$time,
|
||||||
|
wpEditToken=>$token]
|
||||||
|
);
|
||||||
|
$watchvar && push @{$content[1]}, (wpWatchthis=>"1");
|
||||||
|
$minorvar && push @{$content[1]}, (wpMinoredit=>"1");
|
||||||
|
$preview && push @{$content[1]}, (wpPreview=>"true");
|
||||||
|
if($preview) {
|
||||||
|
$response=$browser->post($edit_url,@ns_headers,
|
||||||
|
@content);
|
||||||
|
open(PREVIEW,">$unixtempdir/preview.html");
|
||||||
|
$preview=$response->content;
|
||||||
|
# Replace relative URLs with absolute ones
|
||||||
|
$preview=~s|<head>|<head>\n <base href="$server$path">|gi;
|
||||||
|
print PREVIEW $preview;
|
||||||
|
close(PREVIEW);
|
||||||
|
if($previewclient) {
|
||||||
|
$previewurl="file://$unixtempdir/preview.html";
|
||||||
|
$previewclient=~s/\$url/$previewurl/i;
|
||||||
|
system(qq|$previewclient|);
|
||||||
|
$previewclient=$cfg->val("Settings","Browser");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$response=$browser->post($edit_url,@ns_headers,@content);
|
||||||
|
}
|
||||||
|
if($browseaftersave eq "true" && $previewclient && !$preview) {
|
||||||
|
$previewclient=~s/\$url/$view_url/i;
|
||||||
|
system(qq|$previewclient|);
|
||||||
|
$previewclient=$cfg->val("Settings","Browser");
|
||||||
|
}
|
||||||
|
$preview=0;
|
||||||
|
}
|
||||||
|
if($cont ne "continue") {
|
||||||
|
Gtk2->main_quit;
|
||||||
|
exit 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sub cancel {
|
||||||
|
|
||||||
|
Gtk2->main_quit;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
sub _{
|
||||||
|
my $message=shift;
|
||||||
|
@subst=@_;
|
||||||
|
my $suffix;
|
||||||
|
if($LANGUAGE ne "en") { $suffix = "_".$LANGUAGE; }
|
||||||
|
$msg=$messages{$message.$suffix};
|
||||||
|
foreach $substi(@subst) {
|
||||||
|
$msg=~s/____/$substi/s;
|
||||||
|
}
|
||||||
|
return $msg;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub vdie {
|
||||||
|
|
||||||
|
my $errortext=shift;
|
||||||
|
if(!$NOGUIERRORS) {
|
||||||
|
errorbox($errortext);
|
||||||
|
}
|
||||||
|
die($errortext);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
sub errorbox {
|
||||||
|
|
||||||
|
my $errortext=shift;
|
||||||
|
|
||||||
|
my $dialog = Gtk2::MessageDialog->new ($window,
|
||||||
|
[qw/modal destroy-with-parent/],
|
||||||
|
'error',
|
||||||
|
'ok',
|
||||||
|
$errortext);
|
||||||
|
$dialog->run;
|
||||||
|
$dialog->destroy;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
sub getunixpath {
|
||||||
|
|
||||||
|
my $getpath=shift;
|
||||||
|
if($^O eq 'MSWin32') {
|
||||||
|
$getpath=~s|\\|/|gi;
|
||||||
|
}
|
||||||
|
return $getpath;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub initmsg {
|
||||||
|
|
||||||
|
%messages=(
|
||||||
|
|
||||||
|
noinifile=>
|
||||||
|
"____ could not be found.
|
||||||
|
Please move the configuration file (ee.ini) there, or edit ee.pl
|
||||||
|
and point the variable \$cfgfile to the proper location.",
|
||||||
|
|
||||||
|
noinifile_de=>
|
||||||
|
"____ konnte nicht gefunden werden.
|
||||||
|
Bitte verschieben Sie die Konfigurations-Datei (ee.ini) dorthin,
|
||||||
|
oder bearbeiten Sie ee.pl und zeigen Sie die Variable \$cfgfile
|
||||||
|
auf die korrekte Datei.",
|
||||||
|
|
||||||
|
notemppath=>
|
||||||
|
"No path for temporary files specified. Please edit ____
|
||||||
|
and add an entry like this:
|
||||||
|
|
||||||
|
[Settings]
|
||||||
|
Temp Path=/tmp\n",
|
||||||
|
notemppath_de=>
|
||||||
|
"Kein Pfad für temporäre Dateien festgelegt.
|
||||||
|
Bitte bearbeiten Sie ____
|
||||||
|
und fügen Sie einen Eintrag wie folgt ein:
|
||||||
|
|
||||||
|
[Settings]
|
||||||
|
Temp Path=/tmp\n",
|
||||||
|
|
||||||
|
nocontrolfile=>
|
||||||
|
"No control file specified.
|
||||||
|
Syntax: perl ee.pl <control file>\n",
|
||||||
|
nocontrolfile_de=>
|
||||||
|
"Keine Kontrolldatei angegeben.
|
||||||
|
Syntax: perl ee.pl <Kontrolldatei>\n",
|
||||||
|
|
||||||
|
twofordiff=>
|
||||||
|
"Process is diff, but no second URL contained in control file\n",
|
||||||
|
twofordiff_de=>
|
||||||
|
"Dateien sollen verglichen werden, Kontrolldatei enthält aber nur eine URL.",
|
||||||
|
|
||||||
|
nodifftool=>
|
||||||
|
"Process is diff, but ee.ini does not contain a 'Diff=' definition line
|
||||||
|
in the [Settings] section where the diff tool is defined.\n",
|
||||||
|
nodifftool_de=>
|
||||||
|
"Dateien sollen verglichen werden, ee.ini enthält aber keine
|
||||||
|
'Diff='-Zeile im Abschnitt Settings, in der das Diff-Werkzeug
|
||||||
|
definiert wird.\n",
|
||||||
|
|
||||||
|
unknownprocess=>
|
||||||
|
"The process type defined in the input file (Type= in the [Process] section)
|
||||||
|
is not known to this implementation of the External Editor interface. Perhaps
|
||||||
|
you need to upgrade to a newer version?\n",
|
||||||
|
unknownprocess_de=>
|
||||||
|
"Der in der Kontrolldatei definierte Prozesstyp (Type= im Abschnitt [Process])
|
||||||
|
ist dieser Implementierung des application/x-external-editor-Interface nicht
|
||||||
|
bekannt. Vielleicht müssen Sie Ihre Version des Skripts aktualisieren.\n",
|
||||||
|
|
||||||
|
loginfailed=>
|
||||||
|
"Could not login to
|
||||||
|
____
|
||||||
|
with username '____' and password '____'.
|
||||||
|
|
||||||
|
Make sure you have a definition for this website in your ee.ini, and that
|
||||||
|
the 'URL match=' part of the site definition contains a string that is part
|
||||||
|
of the URL above.\n",
|
||||||
|
|
||||||
|
loginfailed_de=>
|
||||||
|
"Anmeldung bei
|
||||||
|
____
|
||||||
|
gescheitert. Benutzername: ____ Passwort: ____
|
||||||
|
|
||||||
|
Stellen Sie sicher, dass Ihre ee.ini eine Definition für diese Website
|
||||||
|
enthält, und in der 'URL match='-Zeile ein Text steht, der Bestandteil der
|
||||||
|
obigen URL ist.\n",
|
||||||
|
|
||||||
|
summary=>
|
||||||
|
"Summary",
|
||||||
|
summary_de=>
|
||||||
|
"Zusammenfassung",
|
||||||
|
|
||||||
|
save=>
|
||||||
|
"Save",
|
||||||
|
save_de=>
|
||||||
|
"Speichern",
|
||||||
|
|
||||||
|
savecont=>
|
||||||
|
"Save and continue",
|
||||||
|
savecont_de=>
|
||||||
|
"Speichern und weiter",
|
||||||
|
|
||||||
|
preview=>
|
||||||
|
"Preview",
|
||||||
|
preview_de=>
|
||||||
|
"Vorschau",
|
||||||
|
|
||||||
|
cancel=>
|
||||||
|
"Cancel",
|
||||||
|
cancel_de=>
|
||||||
|
"Abbruch",
|
||||||
|
|
||||||
|
entersummary=>
|
||||||
|
"Enter edit summary",
|
||||||
|
entersummary_de=>
|
||||||
|
"Zusammenfassung eingeben",
|
||||||
|
|
||||||
|
minoredit=>
|
||||||
|
"Check as minor edit",
|
||||||
|
minoredit_de=>
|
||||||
|
"Kleine Änderung",
|
||||||
|
|
||||||
|
watchpage=>
|
||||||
|
"Watch this page",
|
||||||
|
watchpage_de=>
|
||||||
|
"Seite beobachten",
|
||||||
|
|
||||||
|
usingexternal=>
|
||||||
|
"using [[Help:External editors|an external editor]]",
|
||||||
|
usingexternal_de=>
|
||||||
|
"mit [[Hilfe:Externe Editoren|externem Editor]]",
|
||||||
|
|
||||||
|
);
|
||||||
|
|
||||||
|
}
|
4
bin/enable_pa
Executable file
4
bin/enable_pa
Executable file
|
@ -0,0 +1,4 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
sudo mv /etc/pulse/default.pa.disabled /etc/pulse/default.pa
|
||||||
|
pulseaudio --start
|
8
bin/escape
Executable file
8
bin/escape
Executable file
|
@ -0,0 +1,8 @@
|
||||||
|
#!/usr/bin/perl
|
||||||
|
|
||||||
|
use URI::Escape;
|
||||||
|
|
||||||
|
while (<STDIN>) {
|
||||||
|
chomp;
|
||||||
|
print uri_escape($_, "^A-Za-z0-9\-_.!~*’()/:") . "\n";
|
||||||
|
}
|
71
bin/extract_uImage.sh
Executable file
71
bin/extract_uImage.sh
Executable file
|
@ -0,0 +1,71 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
#
|
||||||
|
# Copyright (C) 2010 Matthias Buecher (http://www.maddes.net/)
|
||||||
|
#
|
||||||
|
# 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.
|
||||||
|
# http://www.gnu.org/licenses/gpl-2.0.txt
|
||||||
|
#
|
||||||
|
# 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
#
|
||||||
|
|
||||||
|
UIMAGE=$1
|
||||||
|
|
||||||
|
# check for uImage magic word
|
||||||
|
# http://git.denx.de/cgi-bin/gitweb.cgi?p=u-boot.git;a=blob;f=include/image.h
|
||||||
|
echo 'Checking for uImage magic word...'
|
||||||
|
MAGIC=`dd if="${UIMAGE}" ibs=4 count=1 | hexdump -v -e '1/1 "%02X"'`
|
||||||
|
[ '27051956' != "${MAGIC}" ] && { echo 'Not an uImage.' ; exit 1 ; }
|
||||||
|
|
||||||
|
# extract data from uImage
|
||||||
|
echo 'uImage recognized.'
|
||||||
|
echo 'Extracting data...'
|
||||||
|
DATAFILE='uImage.data'
|
||||||
|
dd if="${UIMAGE}" of="${DATAFILE}" ibs=64 skip=1
|
||||||
|
|
||||||
|
# check for ARM mach type ( xx 1C A0 E3 xx 10 81 E3 )
|
||||||
|
# http://www.simtec.co.uk/products/SWLINUX/files/booting_article.html#d0e600
|
||||||
|
echo 'Checking for ARM mach-type...'
|
||||||
|
MAGIC=`dd if="${DATAFILE}" ibs=1 skip=1 count=3 | hexdump -v -e '1/1 "%02X"'`
|
||||||
|
[ '1CA0E3' = "${MAGIC}" ] && {
|
||||||
|
MAGIC=`dd if="${DATAFILE}" ibs=1 skip=5 count=3 | hexdump -v -e '1/1 "%02X"'`
|
||||||
|
[ '1081E3' = "${MAGIC}" ] && {
|
||||||
|
echo 'ARM mach-type header recognized.'
|
||||||
|
echo 'Extracting mach-type header...'
|
||||||
|
dd if="${DATAFILE}" of="uImage.mach-type" ibs=8 count=1
|
||||||
|
ARCH=$(hexdump -v -e '1/1 "%02X "' uImage.mach-type); echo "The mach-type is: $ARCH"
|
||||||
|
echo 'Stripping mach-type header...'
|
||||||
|
TMPFILE='uImage.tmp'
|
||||||
|
dd if="${DATAFILE}" of="${TMPFILE}" ibs=8 skip=1
|
||||||
|
rm -f "${DATAFILE}"
|
||||||
|
mv "${TMPFILE}" "${DATAFILE}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# check for zImage, otherwise assume Image
|
||||||
|
# http://www.simtec.co.uk/products/SWLINUX/files/booting_article.html#d0e309
|
||||||
|
TMPFILE='Image'
|
||||||
|
echo 'Checking for zImage...'
|
||||||
|
MAGIC=`dd if="${DATAFILE}" ibs=4 skip=9 count=1 | hexdump -v -e '1/1 "%02X"'`
|
||||||
|
[ '18286F01' = "${MAGIC}" ] && {
|
||||||
|
START=`dd if="${DATAFILE}" ibs=4 skip=10 count=1 | hexdump -v -e '1/4 "%08X"'`
|
||||||
|
END=`dd if="${DATAFILE}" ibs=4 skip=11 count=1 | hexdump -v -e '1/4 "%08X"'`
|
||||||
|
#
|
||||||
|
SIZE=$(( 0x${END} - 0x${START} ))
|
||||||
|
#
|
||||||
|
echo "zImage recognized with start 0x${START}, end 0x${END} and size ${SIZE}."
|
||||||
|
TMPFILE='zImage'
|
||||||
|
}
|
||||||
|
mv "${DATAFILE}" "${TMPFILE}"
|
||||||
|
|
||||||
|
echo ">>> ${UIMAGE} extracted to ${TMPFILE}"
|
28
bin/fanspeed
Executable file
28
bin/fanspeed
Executable file
|
@ -0,0 +1,28 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
fan=/sys/module/fan/drivers/platform\:acpi-fan
|
||||||
|
range=($(ls $fan|grep PNP|cut -d: -f2))
|
||||||
|
pnp=$(ls $fan|grep PNP|head -1|cut -d: -f1)
|
||||||
|
last=$((${#range[@]}-1))
|
||||||
|
file=thermal_cooling/cur_state
|
||||||
|
|
||||||
|
if [ -n "$1" ]; then
|
||||||
|
if [ "$1" == "off" ]; then
|
||||||
|
for n in ${range[@]}; do echo 0 > "${fan}/$pnp:$n/$file"; done
|
||||||
|
elif [ "$1" == "range" ]; then
|
||||||
|
seq -s ' ' 0 $last
|
||||||
|
elif [ "$1" == "-h" ]; then
|
||||||
|
echo "$0 "'[range|off|<speed>]'
|
||||||
|
elif [ -n ${range[$1]} ]; then
|
||||||
|
for n in ${range[@]}; do echo 0 > "${fan}/$pnp:$n/$file"; done
|
||||||
|
echo 1 > "${fan}/$pnp:${range[$1]}/$file"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
for n in $(seq 0 $last); do
|
||||||
|
s=$(cat "${fan}/$pnp:${range[$n]}/$file")
|
||||||
|
if [ $s -gt 0 ]; then
|
||||||
|
echo -n "$n "
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
echo
|
||||||
|
fi
|
1
bin/fiction
Symbolic link
1
bin/fiction
Symbolic link
|
@ -0,0 +1 @@
|
||||||
|
/home/frank/bin/books
|
7
bin/file_change_monitor
Executable file
7
bin/file_change_monitor
Executable file
|
@ -0,0 +1,7 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
[ "$1x" = "x" ] && exit 1
|
||||||
|
|
||||||
|
while : ; do mv -f /tmp/fcm-1 /tmp/fcm-2; cp $1 /tmp/fcm-1; diff -U 0 /tmp/fcm-1 /tmp/fcm-2; sleep 1; done
|
||||||
|
|
||||||
|
|
16
bin/floatube
Executable file
16
bin/floatube
Executable file
|
@ -0,0 +1,16 @@
|
||||||
|
#!/bin/bash
|
||||||
|
# This came from Greg V's dotfiles:
|
||||||
|
# https://github.com/myfreeweb/dotfiles
|
||||||
|
# Feel free to steal it, but attribution is nice
|
||||||
|
|
||||||
|
if [ "$1" == "start" ]; then
|
||||||
|
sleep 0.3
|
||||||
|
#xvkbd -text "\Cl\Cc" # For some reason this doesn't work with xdotool
|
||||||
|
sleep 0.1
|
||||||
|
#bspc rule -a mpv -o floating=on sticky=on
|
||||||
|
mpv $MPV_HWDEC_FLAGS "https://www.youtube.com/embed/`xclip -o | sed -E -e "s/.*v=([^&]+).*/\1/"`" &
|
||||||
|
sleep 1
|
||||||
|
xdotool search --class mpv windowsize 1280 720
|
||||||
|
elif [ "$1" == "toggleopacity" ]; then
|
||||||
|
transset -t -i "`xdotool search --class mpv`" 0.1
|
||||||
|
fi
|
4
bin/ftp_print
Executable file
4
bin/ftp_print
Executable file
|
@ -0,0 +1,4 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
pdftops -duplex $1 /tmp/out.ps
|
||||||
|
lftp -c "open -u frank,frank printer; cd PORT1; put /tmp/out.ps"
|
18
bin/fwdecrypt.pl
Executable file
18
bin/fwdecrypt.pl
Executable file
|
@ -0,0 +1,18 @@
|
||||||
|
#!/usr/bin/perl
|
||||||
|
|
||||||
|
my $fw;
|
||||||
|
|
||||||
|
my $b;
|
||||||
|
|
||||||
|
my @fwarray;
|
||||||
|
|
||||||
|
(my $n, my $rest) = @ARGV;
|
||||||
|
|
||||||
|
while (<STDIN>) {
|
||||||
|
$fw .= $_;
|
||||||
|
}
|
||||||
|
|
||||||
|
@_=unpack("C*", $fw);
|
||||||
|
|
||||||
|
#shift;$_ += 0; print chr(($_ + $n) % 255) for @_;
|
||||||
|
shift;$_ += 0; print pack('C', $_ + $n % 255) for @_;
|
9330
bin/get_iplayer
Executable file
9330
bin/get_iplayer
Executable file
File diff suppressed because it is too large
Load diff
10
bin/git-mkpatches
Executable file
10
bin/git-mkpatches
Executable file
|
@ -0,0 +1,10 @@
|
||||||
|
#/bin/sh
|
||||||
|
|
||||||
|
mkdir patches/
|
||||||
|
|
||||||
|
count="1"
|
||||||
|
for i in $(git-rev-list HEAD ^ORIG_HEAD | tac)
|
||||||
|
do
|
||||||
|
git-diff-tree --pretty -p ${i} > patches/$count.diff
|
||||||
|
count=$(($count + 1))
|
||||||
|
done
|
151
bin/gnome-panel-config
Executable file
151
bin/gnome-panel-config
Executable file
|
@ -0,0 +1,151 @@
|
||||||
|
#!/bin/sh
|
||||||
|
##!/bin/bash
|
||||||
|
# gnome-panel-config - add/remove panels, applets and objects
|
||||||
|
# under script control, makes handling gconf slightly less tedious...
|
||||||
|
#
|
||||||
|
# Copyright (C) 2008 Frank de Lange <gnome-f@unternet.org>
|
||||||
|
# licensed under the GNU General Public License v3 or later
|
||||||
|
|
||||||
|
# defaults and settings
|
||||||
|
tool=gconftool-2
|
||||||
|
root=/apps/panel
|
||||||
|
applets=/general/applet_id_list
|
||||||
|
panels=/general/toplevel_id_list
|
||||||
|
objects=/general/object_id_list
|
||||||
|
|
||||||
|
current_applets=$($tool --get $root$applets|sed -e 's#^\[##;s#\]$##')
|
||||||
|
current_panels=$($tool --get $root$panels|sed -e 's#^\[##;s#\]$##')
|
||||||
|
current_objects=$($tool --get $root$objects|sed -e 's#^\[##;s#\]$##')
|
||||||
|
|
||||||
|
help () {
|
||||||
|
cat<<-"END"
|
||||||
|
|
||||||
|
gnome-panel-config adds/removes panels, applets and objects
|
||||||
|
|
||||||
|
-l list panels, applets and objects
|
||||||
|
-p <name> add panel <name>
|
||||||
|
-a <name> add applet <name>
|
||||||
|
-o <name> add object <name>
|
||||||
|
-P <name> remove panel <name>
|
||||||
|
-A <name> remove applet <name>
|
||||||
|
-O <name> remove object <name>
|
||||||
|
-c <config> configure element using <config>
|
||||||
|
|
||||||
|
<config> is a comma-separated string of
|
||||||
|
gconf types,keys and values. Leave out the
|
||||||
|
leading '/apps/panel' from the key string:
|
||||||
|
[list-]type,key,value
|
||||||
|
|
||||||
|
examples:
|
||||||
|
|
||||||
|
disable animations:
|
||||||
|
gnome-panel-config -c "boolean,/global/enable_animations,false"
|
||||||
|
|
||||||
|
create a vertical panel on the left side:
|
||||||
|
gnome-panel-config -p left -c "string,/toplevels/left/orientation,left"
|
||||||
|
|
||||||
|
delete that panel:
|
||||||
|
gnome-panel-config -P left
|
||||||
|
|
||||||
|
disable some applets globally:
|
||||||
|
gnome-panel-config -c "list-string,/global/disabled_applets,\
|
||||||
|
OAFIID:GNOME_SomeApplet,OAFIID:GNOME_SomeOtherApplet"
|
||||||
|
|
||||||
|
END
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
list () {
|
||||||
|
echo "panels: $current_panels"
|
||||||
|
echo "applets: $current_applets"
|
||||||
|
echo "objects: $current_objects"
|
||||||
|
}
|
||||||
|
|
||||||
|
add () {
|
||||||
|
echo $1${1:+,}$2
|
||||||
|
}
|
||||||
|
|
||||||
|
remove () {
|
||||||
|
echo $1|sed -e "s#,*$2##g"
|
||||||
|
}
|
||||||
|
|
||||||
|
config () {
|
||||||
|
type=$(echo $1|cut -d ',' -f 1)
|
||||||
|
key=$(echo $1|cut -d ',' -f 2)
|
||||||
|
value=$(echo $*|cut -d ',' -f 3-)
|
||||||
|
IFS= list_type=$(echo $type|cut -d '-' -f 2 -s)
|
||||||
|
if [ "x$list_type" = "x" ]; then
|
||||||
|
$tool --set --type=$type $root$key $value
|
||||||
|
else
|
||||||
|
$tool --set --type=list --list-type=$list_type $root$key '['$value']'
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
add_panel () {
|
||||||
|
new_panels=$(add $current_panels $1)
|
||||||
|
current_panels=$new_panels
|
||||||
|
config list-string,$panels,$current_panels
|
||||||
|
}
|
||||||
|
|
||||||
|
remove_panel () {
|
||||||
|
new_panels=$(remove $current_panels $1)
|
||||||
|
current_panels=$new_panels
|
||||||
|
config list-string,$panels,$current_panels
|
||||||
|
}
|
||||||
|
|
||||||
|
add_applet () {
|
||||||
|
new_applets=$(add $current_applets $1)
|
||||||
|
current_applets=$new_applets
|
||||||
|
config list-string,$applets,$current_applets
|
||||||
|
}
|
||||||
|
|
||||||
|
remove_applet () {
|
||||||
|
new_applets=$(remove $current_applets $1)
|
||||||
|
current_applets=$new_applets
|
||||||
|
config list-string,$applets,$current_applets
|
||||||
|
}
|
||||||
|
|
||||||
|
add_object () {
|
||||||
|
new_objects=$(add $current_objects $1)
|
||||||
|
current_objects=$new_objects
|
||||||
|
config list-string,$objects,$current_objects
|
||||||
|
}
|
||||||
|
|
||||||
|
remove_object () {
|
||||||
|
new_objects=$(remove $current_objects $1)
|
||||||
|
current_objects=$new_objects
|
||||||
|
config list-string,$objects,$current_objects
|
||||||
|
}
|
||||||
|
|
||||||
|
while getopts "hp:a:P:A:c:l" OPTION
|
||||||
|
do
|
||||||
|
case $OPTION in
|
||||||
|
h)
|
||||||
|
help
|
||||||
|
;;
|
||||||
|
p)
|
||||||
|
add_panel $OPTARG
|
||||||
|
;;
|
||||||
|
a)
|
||||||
|
add_applet $OPTARG
|
||||||
|
;;
|
||||||
|
P)
|
||||||
|
remove_panel $OPTARG
|
||||||
|
;;
|
||||||
|
A)
|
||||||
|
remove_applet $OPTARG
|
||||||
|
;;
|
||||||
|
o)
|
||||||
|
add_object $OPTARG
|
||||||
|
;;
|
||||||
|
O)
|
||||||
|
remove_object $OPTARG
|
||||||
|
;;
|
||||||
|
c)
|
||||||
|
config $OPTARG
|
||||||
|
;;
|
||||||
|
l)
|
||||||
|
list
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
151
bin/gnome-panel-config.sh
Executable file
151
bin/gnome-panel-config.sh
Executable file
|
@ -0,0 +1,151 @@
|
||||||
|
#!/bin/sh
|
||||||
|
##!/bin/bash
|
||||||
|
# gnome-panel-config - add/remove panels, applets and objects
|
||||||
|
# under script control, makes handling gconf slightly less tedious...
|
||||||
|
#
|
||||||
|
# Copyright (C) 2008 Frank de Lange <gnome-f@unternet.org>
|
||||||
|
# licensed under the GNU General Public License v3 or later
|
||||||
|
|
||||||
|
# defaults and settings
|
||||||
|
tool=gconftool-2
|
||||||
|
root=/apps/panel
|
||||||
|
applets=/general/applet_id_list
|
||||||
|
panels=/general/toplevel_id_list
|
||||||
|
objects=/general/object_id_list
|
||||||
|
|
||||||
|
current_applets=$($tool --get $root$applets|sed -e 's#^\[##;s#\]$##')
|
||||||
|
current_panels=$($tool --get $root$panels|sed -e 's#^\[##;s#\]$##')
|
||||||
|
current_objects=$($tool --get $root$objects|sed -e 's#^\[##;s#\]$##')
|
||||||
|
|
||||||
|
help () {
|
||||||
|
cat<<-"END"
|
||||||
|
|
||||||
|
gnome-panel-config adds/removes panels, applets and objects
|
||||||
|
|
||||||
|
-l list panels, applets and objects
|
||||||
|
-p <name> add panel <name>
|
||||||
|
-a <name> add applet <name>
|
||||||
|
-o <name> add object <name>
|
||||||
|
-P <name> remove panel <name>
|
||||||
|
-A <name> remove applet <name>
|
||||||
|
-O <name> remove object <name>
|
||||||
|
-c <config> configure element using <config>
|
||||||
|
|
||||||
|
<config> is a comma-separated string of
|
||||||
|
gconf types,keys and values. Leave out the
|
||||||
|
leading '/apps/panel' from the key string:
|
||||||
|
[list-]type,key,value
|
||||||
|
|
||||||
|
examples:
|
||||||
|
|
||||||
|
disable animations:
|
||||||
|
gnome-panel-config -c "boolean,/global/enable_animations,false"
|
||||||
|
|
||||||
|
create a vertical panel on the left side:
|
||||||
|
gnome-panel-config -p left -c "string,/toplevels/left/orientation,left"
|
||||||
|
|
||||||
|
delete that panel:
|
||||||
|
gnome-panel-config -P left
|
||||||
|
|
||||||
|
disable some applets globally:
|
||||||
|
gnome-panel-config -c "list-string,/global/disabled_applets,\
|
||||||
|
OAFIID:GNOME_SomeApplet,OAFIID:GNOME_SomeOtherApplet"
|
||||||
|
|
||||||
|
END
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
list () {
|
||||||
|
echo "panels: $current_panels"
|
||||||
|
echo "applets: $current_applets"
|
||||||
|
echo "objects: $current_objects"
|
||||||
|
}
|
||||||
|
|
||||||
|
add () {
|
||||||
|
echo $1${1:+,}$2
|
||||||
|
}
|
||||||
|
|
||||||
|
remove () {
|
||||||
|
echo $1|sed -e "s#,*$2##g"
|
||||||
|
}
|
||||||
|
|
||||||
|
config () {
|
||||||
|
type=$(echo $1|cut -d ',' -f 1)
|
||||||
|
key=$(echo $1|cut -d ',' -f 2)
|
||||||
|
value=$(echo $*|cut -d ',' -f 3-)
|
||||||
|
IFS= list_type=$(echo $type|cut -d '-' -f 2 -s)
|
||||||
|
if [ "x$list_type" = "x" ]; then
|
||||||
|
$tool --set --type=$type $root$key $value
|
||||||
|
else
|
||||||
|
$tool --set --type=list --list-type=$list_type $root$key '['$value']'
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
add_panel () {
|
||||||
|
new_panels=$(add $current_panels $1)
|
||||||
|
current_panels=$new_panels
|
||||||
|
config list-string,$panels,$current_panels
|
||||||
|
}
|
||||||
|
|
||||||
|
remove_panel () {
|
||||||
|
new_panels=$(remove $current_panels $1)
|
||||||
|
current_panels=$new_panels
|
||||||
|
config list-string,$panels,$current_panels
|
||||||
|
}
|
||||||
|
|
||||||
|
add_applet () {
|
||||||
|
new_applets=$(add $current_applets $1)
|
||||||
|
current_applets=$new_applets
|
||||||
|
config list-string,$applets,$current_applets
|
||||||
|
}
|
||||||
|
|
||||||
|
remove_applet () {
|
||||||
|
new_applets=$(remove $current_applets $1)
|
||||||
|
current_applets=$new_applets
|
||||||
|
config list-string,$applets,$current_applets
|
||||||
|
}
|
||||||
|
|
||||||
|
add_object () {
|
||||||
|
new_objects=$(add $current_objects $1)
|
||||||
|
current_objects=$new_objects
|
||||||
|
config list-string,$objects,$current_objects
|
||||||
|
}
|
||||||
|
|
||||||
|
remove_object () {
|
||||||
|
new_objects=$(remove $current_objects $1)
|
||||||
|
current_objects=$new_objects
|
||||||
|
config list-string,$objects,$current_objects
|
||||||
|
}
|
||||||
|
|
||||||
|
while getopts "hp:a:P:A:c:l" OPTION
|
||||||
|
do
|
||||||
|
case $OPTION in
|
||||||
|
h)
|
||||||
|
help
|
||||||
|
;;
|
||||||
|
p)
|
||||||
|
add_panel $OPTARG
|
||||||
|
;;
|
||||||
|
a)
|
||||||
|
add_applet $OPTARG
|
||||||
|
;;
|
||||||
|
P)
|
||||||
|
remove_panel $OPTARG
|
||||||
|
;;
|
||||||
|
A)
|
||||||
|
remove_applet $OPTARG
|
||||||
|
;;
|
||||||
|
o)
|
||||||
|
add_object $OPTARG
|
||||||
|
;;
|
||||||
|
O)
|
||||||
|
remove_object $OPTARG
|
||||||
|
;;
|
||||||
|
c)
|
||||||
|
config $OPTARG
|
||||||
|
;;
|
||||||
|
l)
|
||||||
|
list
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
14
bin/import_photos
Executable file
14
bin/import_photos
Executable file
|
@ -0,0 +1,14 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
destination="/net/behemoth/photos/import/$(date +'%Y-%m-%d')"
|
||||||
|
mountpoint="/home/frank/cam"
|
||||||
|
store="store_00010001/DCIM/100CANON"
|
||||||
|
|
||||||
|
fusermount -u "${mountpoint}"
|
||||||
|
gphotofs "${mountpoint}"
|
||||||
|
mkdir -p "${destination}"
|
||||||
|
|
||||||
|
ls "${mountpoint}"/"${store}"|while read f; do echo -n "."; mv "${mountpoint}"/"${store}"/"${f}" "${destination}"; done; echo " "
|
||||||
|
|
||||||
|
|
||||||
|
fusermount -u "${mountpoint}"
|
13
bin/index.html
Normal file
13
bin/index.html
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>unterNET...</title>
|
||||||
|
<link rel="stylesheet" href="css/unternet.css">
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<DIV align="center" valign="middle">
|
||||||
|
<IMG SRC="pix/overload.jpg" ALT="unterNET/OVERload">
|
||||||
|
</DIV>
|
||||||
|
</body>
|
||||||
|
</html>
|
12
bin/info
Executable file
12
bin/info
Executable file
|
@ -0,0 +1,12 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
for file in "$@"
|
||||||
|
do
|
||||||
|
whichfile=$(which "$file")
|
||||||
|
if [ -n "$whichfile" ]; then
|
||||||
|
ls -l "$whichfile"
|
||||||
|
file "$whichfile"
|
||||||
|
else
|
||||||
|
ls -l "$file"
|
||||||
|
fi
|
||||||
|
done
|
BIN
bin/install-check
Executable file
BIN
bin/install-check
Executable file
Binary file not shown.
15
bin/ivona_download.sh
Executable file
15
bin/ivona_download.sh
Executable file
|
@ -0,0 +1,15 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Do not edit this file - it will be overwritten
|
||||||
|
# by server installer!
|
||||||
|
|
||||||
|
export WINEPREFIX=/home/frank/.winesapi
|
||||||
|
export WINEDEBUG=-all
|
||||||
|
export DISPLAY=:20
|
||||||
|
if ! xdpyinfo >/dev/null 2>/dev/null ; then
|
||||||
|
nohup Xvfb ${DISPLAY} -screen -0 800x600x16 -nolisten tcp &
|
||||||
|
sleep 2
|
||||||
|
fi
|
||||||
|
|
||||||
|
wine explorer /desktop=ividn,800x600 /usr/lib/sapi4linux/pydir/python.exe /usr/lib/sapi4linux/ivodownload.py $@
|
||||||
|
|
27
bin/jalbum_patch
Executable file
27
bin/jalbum_patch
Executable file
|
@ -0,0 +1,27 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
JALBUM_ROOT=/opt/APPjalbum
|
||||||
|
SKIN_ROOT=$JALBUM_ROOT/skins/BluPlusPlus
|
||||||
|
|
||||||
|
cd $JALBUM_ROOT
|
||||||
|
tar zxf /home/frank/Patches/jalbum_flash_movie_patch.tar.gz
|
||||||
|
|
||||||
|
cat <<EOF_videos >> $SKIN_ROOT/config/supported-videos.txt
|
||||||
|
|
||||||
|
flv
|
||||||
|
EOF_videos
|
||||||
|
|
||||||
|
cat <<EOF_header >> $SKIN_ROOT/includes/common-header.inc
|
||||||
|
|
||||||
|
<ja:if exists="originalPath">
|
||||||
|
<ja:if test="<%= originalPath.endsWith(".flv") %>">
|
||||||
|
<!-- Flash Movies -->
|
||||||
|
<script language="javascript" type="text/javascript" src="\$resPath/flv_movie/swfobject.js"></script>
|
||||||
|
<script language="javascript">
|
||||||
|
function resPath1() {return "\$resPath";}
|
||||||
|
</script>
|
||||||
|
</ja:if>
|
||||||
|
</ja:if>
|
||||||
|
|
||||||
|
EOF_header
|
||||||
|
|
31
bin/jhbuild
Executable file
31
bin/jhbuild
Executable file
|
@ -0,0 +1,31 @@
|
||||||
|
#!/usr/bin/env python
|
||||||
|
|
||||||
|
import sys
|
||||||
|
import os
|
||||||
|
import __builtin__
|
||||||
|
|
||||||
|
USE_CHECKOUT_SRC = True
|
||||||
|
|
||||||
|
if USE_CHECKOUT_SRC:
|
||||||
|
sys.path.insert(0, '/home/frank/Source/jhbuild')
|
||||||
|
pkgdatadir = None
|
||||||
|
datadir = None
|
||||||
|
import jhbuild
|
||||||
|
srcdir = os.path.abspath(os.path.join(os.path.dirname(jhbuild.__file__), '..'))
|
||||||
|
else:
|
||||||
|
pkgdatadir = "@pkgdatadir@"
|
||||||
|
datadir = "@datadir@"
|
||||||
|
srcdir = "@srcdir@"
|
||||||
|
if '@pythondir@' not in sys.path:
|
||||||
|
sys.path.insert(0, '@pythondir@')
|
||||||
|
try:
|
||||||
|
import jhbuild
|
||||||
|
except ImportError:
|
||||||
|
sys.path.insert(0, srcdir)
|
||||||
|
|
||||||
|
__builtin__.__dict__['PKGDATADIR'] = pkgdatadir
|
||||||
|
__builtin__.__dict__['DATADIR'] = datadir
|
||||||
|
__builtin__.__dict__['SRCDIR'] = srcdir
|
||||||
|
|
||||||
|
import jhbuild.main
|
||||||
|
jhbuild.main.main(sys.argv[1:])
|
4
bin/lcd
Executable file
4
bin/lcd
Executable file
|
@ -0,0 +1,4 @@
|
||||||
|
#!/bin/sh
|
||||||
|
xrandr --fb 1024x768
|
||||||
|
xrandr -s 0
|
||||||
|
s3switch lcd
|
1
bin/libgen_preview
Symbolic link
1
bin/libgen_preview
Symbolic link
|
@ -0,0 +1 @@
|
||||||
|
/home/frank/bin/books
|
21
bin/lit_to_txt.pl
Executable file
21
bin/lit_to_txt.pl
Executable file
|
@ -0,0 +1,21 @@
|
||||||
|
#!/usr/bin/perl
|
||||||
|
|
||||||
|
while (<STDIN>) {
|
||||||
|
$in .= $_;
|
||||||
|
}
|
||||||
|
# remove unwanted content
|
||||||
|
#$in =~ s/ ?file:\/\/\/.*file:\/\/\/.*\.txt ?//g;
|
||||||
|
# remove successive empty lines
|
||||||
|
#$in =~ s/\n{2,}/\n\n/g;
|
||||||
|
|
||||||
|
# translate funny characters...
|
||||||
|
$in =~ s/[]/'/g;
|
||||||
|
$in =~ s/[]/"/g;
|
||||||
|
$in =~ s//--/g;
|
||||||
|
$in =~ s//-/g;
|
||||||
|
$in =~ s/\xA0//g;
|
||||||
|
|
||||||
|
# remove successive empty lines
|
||||||
|
$in =~ s/\n{2,}/\n\n/g;
|
||||||
|
|
||||||
|
print $in;
|
5
bin/load_pcie_modules
Executable file
5
bin/load_pcie_modules
Executable file
|
@ -0,0 +1,5 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
sudo modprobe acpiphp
|
||||||
|
sudo modprobe pci_hotplug debug_acpi=1
|
||||||
|
sudo modprobe pciehp pciehp_force=0 pciehp_debug=1
|
5
bin/lsflash
Executable file
5
bin/lsflash
Executable file
|
@ -0,0 +1,5 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
ls -l /proc/$(ps aux|grep plugin|grep flash|grep -v grep|awk '{print $2}')/fd
|
||||||
|
|
||||||
|
echo "/proc/$(ps aux|grep plugin|grep flash|grep -v grep|awk '{print $2}')/fd"
|
10
bin/make_flv
Executable file
10
bin/make_flv
Executable file
|
@ -0,0 +1,10 @@
|
||||||
|
#!/bin/sh
|
||||||
|
# make_flv - make flash movie from any video file
|
||||||
|
|
||||||
|
#ffmpeg -i $1 -ar 22050 -ab 32 -f flv -s 320x240 $2
|
||||||
|
ffmpeg -i $1 -ar 11025 -ab 32k -acodec mp3 -b 200k -s 320x240 $2
|
||||||
|
# make thumbnail
|
||||||
|
ffmpeg -y -i $2 -vframes 1 -ss 00:00:05 -an -vcodec png -f rawvideo -s 640x480 $2.thumb
|
||||||
|
|
||||||
|
# or
|
||||||
|
# ffmpeg -i $1 -ar 22050 -ab 32 -f flv -s 320x240 - | flvtool2 -U stdin $2
|
108
bin/make_flv2
Executable file
108
bin/make_flv2
Executable file
|
@ -0,0 +1,108 @@
|
||||||
|
#!/bin/bash
|
||||||
|
# make_flv - make flash movie from any video file
|
||||||
|
|
||||||
|
# tools
|
||||||
|
#MENCODER=/opt/APPmplayer/bin/mencoder
|
||||||
|
MENCODER=/usr/bin/mencoder
|
||||||
|
|
||||||
|
# defaults
|
||||||
|
extension="flv"
|
||||||
|
vcodec="flv"
|
||||||
|
suffix=""
|
||||||
|
output_dir=""
|
||||||
|
filter="scale=320:240"
|
||||||
|
thumbsize="640x480"
|
||||||
|
vbitrate=200
|
||||||
|
abitrate=32
|
||||||
|
|
||||||
|
# actions
|
||||||
|
convert () {
|
||||||
|
# convert to requested format (default: flv)
|
||||||
|
#ffmpeg -i $inputfile -ar 22050 -ab ${abitrate}k -acodec libmp3lame -b ${vbitrate}k -s 320x240 ${outputfile}
|
||||||
|
# OR mencoder:
|
||||||
|
# $MENCODER -vf ${filter} -oac mp3lame -lameopts br=${abitrate} -ovc lavc -of lavf -lavfopts i_certify_that_my_video_stream_does_not_use_b_frames -lavcopts vcodec=${vcodec}:vbitrate=${vbitrate}:autoaspect:v4mv:vmax_b_frames=0:vb_strategy=1:mbd=2:mv0:trell:cbp:sc_factor=6:cmp=2:subcmp=2:predia=2:dia=2:preme=2:turbo:acodec=mp3:abitrate=56 ${inputfile} -o ${outputfile}
|
||||||
|
$MENCODER \
|
||||||
|
${nosound} -srate 22050 \
|
||||||
|
-oac lavc -ovc lavc -of lavf \
|
||||||
|
-lavcopts vcodec=${vcodec}:vbitrate=${vbitrate}:acodec=libmp3lame:abitrate=${abitrate} \
|
||||||
|
-vf ${filter} \
|
||||||
|
${inputfile} -o ${outputfile}
|
||||||
|
# add metadata for flash video
|
||||||
|
[ "$filetype" == ".flv" ] && flvtool2 -U ${outputfile}
|
||||||
|
# make thumbnail
|
||||||
|
ffmpeg -y -i $outputfile -vframes 1 -ss 00:00:02 -an -vcodec mjpeg -f rawvideo -s ${thumbsize} ${outputfile}.thumb
|
||||||
|
}
|
||||||
|
|
||||||
|
help () {
|
||||||
|
echo " "
|
||||||
|
echo "make_flv video file converter (defaults to flv - flash video)"
|
||||||
|
echo " "
|
||||||
|
echo " -i file Inputfile"
|
||||||
|
echo " -d dir [ outputDirectory (default: current directory) ]"
|
||||||
|
echo " -s suffix [ Suffix (default: none) ]"
|
||||||
|
echo " -x ext [ eXtension (default: flv) ]"
|
||||||
|
echo " -c codec [ video Codec (default: flv) ]"
|
||||||
|
echo " -L [ rotate video Left/counterclockwise ]"
|
||||||
|
echo " -R [ rotate video Right/clockwise ]"
|
||||||
|
echo " -v [ Video bitrate (default: 200) ]"
|
||||||
|
echo " -a [ Audio bitrate (default: 32) ]"
|
||||||
|
echo " -A [ no sound in output video ]"
|
||||||
|
echo " -h this Help message"
|
||||||
|
echo " "
|
||||||
|
echo "final destination file is (outputdirectory/) (basename inputfile)(-suffix).(extension)"
|
||||||
|
}
|
||||||
|
|
||||||
|
# parameters
|
||||||
|
while getopts "hi:d:s:t:LRv:a:A" OPTION
|
||||||
|
do
|
||||||
|
case $OPTION in
|
||||||
|
h)
|
||||||
|
help
|
||||||
|
exit
|
||||||
|
;;
|
||||||
|
i)
|
||||||
|
inputfile="$OPTARG"
|
||||||
|
filename=$(basename $inputfile|sed -e 's#\..*##')
|
||||||
|
;;
|
||||||
|
d)
|
||||||
|
output_dir="${OPTARG}/"
|
||||||
|
;;
|
||||||
|
s)
|
||||||
|
suffix="-${OPTARG:-}"
|
||||||
|
;;
|
||||||
|
t)
|
||||||
|
extension="${OPTARG:-flv}"
|
||||||
|
;;
|
||||||
|
c)
|
||||||
|
vcodec="${OPTARG:-flv}"
|
||||||
|
;;
|
||||||
|
L)
|
||||||
|
filter=${filter:-}${filter:+,}rotate=2
|
||||||
|
thumbsize="480x640"
|
||||||
|
;;
|
||||||
|
R)
|
||||||
|
filter=${filter:-}${filter:+,}rotate=1
|
||||||
|
thumbsize="480x640"
|
||||||
|
;;
|
||||||
|
v)
|
||||||
|
vbitrate="${OPTARG:-200}"
|
||||||
|
;;
|
||||||
|
a)
|
||||||
|
abitrate="${OPTARG:-32}"
|
||||||
|
;;
|
||||||
|
A)
|
||||||
|
nosound="-nosound "
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
# show help if called without options
|
||||||
|
[ $OPTIND = 1 ] && help && exit
|
||||||
|
|
||||||
|
outputfile=${output_dir}${filename}${suffix}.${extension}
|
||||||
|
|
||||||
|
echo filename: $filename
|
||||||
|
echo outputfile: $outputfile
|
||||||
|
convert
|
||||||
|
|
||||||
|
exit
|
21
bin/make_flv2.org
Executable file
21
bin/make_flv2.org
Executable file
|
@ -0,0 +1,21 @@
|
||||||
|
#!/bin/bash
|
||||||
|
# make_flv - make flash movie from any video file
|
||||||
|
|
||||||
|
[ $# -lt 2 ] && echo use: $0 inputfile output_dir [ suffix ] [ filetype ] && exit
|
||||||
|
|
||||||
|
inputfile=$1
|
||||||
|
output_dir=${2:-}${2:+/}
|
||||||
|
filename=$(basename $1|sed -e 's#\..*##')
|
||||||
|
suffix=${3:+-}${3:-}
|
||||||
|
filetype=.${4:-flv}
|
||||||
|
outputfile=${output_dir}${filename}${suffix}${filetype}
|
||||||
|
|
||||||
|
# convert to requested format (default: flv)
|
||||||
|
ffmpeg -i $inputfile -ar 11025 -ab 32k -acodec mp3 -b 200k -s 320x240 ${outputfile}
|
||||||
|
# OR mencoder:
|
||||||
|
# mencoder -vf dsize=-1:-1:3/4,rotate=1 -oac mp3lame -lameopts br=32 -ovc lavc -lavcopts vcodec=flv
|
||||||
|
# add metadata for flash video
|
||||||
|
[ "$filetype" == ".flv" ] && echo flvtool2 -U ${outputfile}
|
||||||
|
# make thumbnail
|
||||||
|
ffmpeg -y -i $inputfile -vframes 1 -ss 00:00:02 -an -vcodec png -f rawvideo -s 640x480 ${outputfile}.thumb
|
||||||
|
|
108
bin/make_flv3
Executable file
108
bin/make_flv3
Executable file
|
@ -0,0 +1,108 @@
|
||||||
|
#!/bin/bash
|
||||||
|
# make_flv - make flash movie from any video file
|
||||||
|
|
||||||
|
# tools
|
||||||
|
#MENCODER=/opt/APPmplayer/bin/mencoder
|
||||||
|
MENCODER=/usr/bin/mencoder
|
||||||
|
|
||||||
|
# defaults
|
||||||
|
extension="flv"
|
||||||
|
vcodec="flv"
|
||||||
|
suffix=""
|
||||||
|
output_dir=""
|
||||||
|
filter="scale=320:180"
|
||||||
|
thumbsize="640x360"
|
||||||
|
vbitrate=200
|
||||||
|
abitrate=32
|
||||||
|
|
||||||
|
# actions
|
||||||
|
convert () {
|
||||||
|
# convert to requested format (default: flv)
|
||||||
|
#ffmpeg -i $inputfile -ar 22050 -ab ${abitrate}k -acodec libmp3lame -b ${vbitrate}k -s 320x240 ${outputfile}
|
||||||
|
# OR mencoder:
|
||||||
|
# $MENCODER -vf ${filter} -oac mp3lame -lameopts br=${abitrate} -ovc lavc -of lavf -lavfopts i_certify_that_my_video_stream_does_not_use_b_frames -lavcopts vcodec=${vcodec}:vbitrate=${vbitrate}:autoaspect:v4mv:vmax_b_frames=0:vb_strategy=1:mbd=2:mv0:trell:cbp:sc_factor=6:cmp=2:subcmp=2:predia=2:dia=2:preme=2:turbo:acodec=mp3:abitrate=56 ${inputfile} -o ${outputfile}
|
||||||
|
$MENCODER \
|
||||||
|
${nosound} -srate 22050 \
|
||||||
|
-oac lavc -ovc lavc -of lavf \
|
||||||
|
-lavcopts vcodec=${vcodec}:vbitrate=${vbitrate}:acodec=libmp3lame:abitrate=${abitrate} \
|
||||||
|
-vf ${filter} \
|
||||||
|
${inputfile} -o ${outputfile}
|
||||||
|
# add metadata for flash video
|
||||||
|
[ "$filetype" == ".flv" ] && flvtool2 -U ${outputfile}
|
||||||
|
# make thumbnail
|
||||||
|
ffmpeg -y -i $outputfile -vframes 1 -ss 00:00:02 -an -vcodec mjpeg -f rawvideo -s ${thumbsize} ${outputfile}.thumb
|
||||||
|
}
|
||||||
|
|
||||||
|
help () {
|
||||||
|
echo " "
|
||||||
|
echo "make_flv video file converter (defaults to flv - flash video)"
|
||||||
|
echo " "
|
||||||
|
echo " -i file Inputfile"
|
||||||
|
echo " -d dir [ outputDirectory (default: current directory) ]"
|
||||||
|
echo " -s suffix [ Suffix (default: none) ]"
|
||||||
|
echo " -x ext [ eXtension (default: flv) ]"
|
||||||
|
echo " -c codec [ video Codec (default: flv) ]"
|
||||||
|
echo " -L [ rotate video Left/counterclockwise ]"
|
||||||
|
echo " -R [ rotate video Right/clockwise ]"
|
||||||
|
echo " -v [ Video bitrate (default: 200) ]"
|
||||||
|
echo " -a [ Audio bitrate (default: 32) ]"
|
||||||
|
echo " -A [ no sound in output video ]"
|
||||||
|
echo " -h this Help message"
|
||||||
|
echo " "
|
||||||
|
echo "final destination file is (outputdirectory/) (basename inputfile)(-suffix).(extension)"
|
||||||
|
}
|
||||||
|
|
||||||
|
# parameters
|
||||||
|
while getopts "hi:d:s:t:LRv:a:A" OPTION
|
||||||
|
do
|
||||||
|
case $OPTION in
|
||||||
|
h)
|
||||||
|
help
|
||||||
|
exit
|
||||||
|
;;
|
||||||
|
i)
|
||||||
|
inputfile="$OPTARG"
|
||||||
|
filename=$(basename $inputfile|sed -e 's#\..*##')
|
||||||
|
;;
|
||||||
|
d)
|
||||||
|
output_dir="${OPTARG}/"
|
||||||
|
;;
|
||||||
|
s)
|
||||||
|
suffix="-${OPTARG:-}"
|
||||||
|
;;
|
||||||
|
t)
|
||||||
|
extension="${OPTARG:-flv}"
|
||||||
|
;;
|
||||||
|
c)
|
||||||
|
vcodec="${OPTARG:-flv}"
|
||||||
|
;;
|
||||||
|
L)
|
||||||
|
filter=${filter:-}${filter:+,}rotate=2
|
||||||
|
thumbsize="480x640"
|
||||||
|
;;
|
||||||
|
R)
|
||||||
|
filter=${filter:-}${filter:+,}rotate=1
|
||||||
|
thumbsize="480x640"
|
||||||
|
;;
|
||||||
|
v)
|
||||||
|
vbitrate="${OPTARG:-200}"
|
||||||
|
;;
|
||||||
|
a)
|
||||||
|
abitrate="${OPTARG:-32}"
|
||||||
|
;;
|
||||||
|
A)
|
||||||
|
nosound="-nosound "
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
# show help if called without options
|
||||||
|
[ $OPTIND = 1 ] && help && exit
|
||||||
|
|
||||||
|
outputfile=${output_dir}${filename}${suffix}.${extension}
|
||||||
|
|
||||||
|
echo filename: $filename
|
||||||
|
echo outputfile: $outputfile
|
||||||
|
convert
|
||||||
|
|
||||||
|
exit
|
3
bin/make_flv_thumbnail
Executable file
3
bin/make_flv_thumbnail
Executable file
|
@ -0,0 +1,3 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
ffmpeg -y -i $1 -vframes 1 -ss 00:00:05 -an -vcodec png -f rawvideo -s 640x480 $1.thumb
|
101
bin/make_mp4
Executable file
101
bin/make_mp4
Executable file
|
@ -0,0 +1,101 @@
|
||||||
|
#!/bin/bash
|
||||||
|
# make_flv - make flash movie from any video file
|
||||||
|
|
||||||
|
# tools
|
||||||
|
MENCODER=/opt/APPmplayer/bin/mencoder
|
||||||
|
|
||||||
|
# defaults
|
||||||
|
extension="mp4"
|
||||||
|
vcodec="mpeg4"
|
||||||
|
suffix=""
|
||||||
|
output_dir=""
|
||||||
|
filter="dsize=320:240:0,scale=320:-2"
|
||||||
|
vbitrate=500
|
||||||
|
abitrate=32
|
||||||
|
asrate=22050
|
||||||
|
|
||||||
|
# actions
|
||||||
|
convert () {
|
||||||
|
# convert to requested format (default: flv)
|
||||||
|
ffmpeg -i $inputfile -ar ${asrate} -ab ${abitrate}k -acodec libvorbis -b ${vbitrate}k -s 320x240 ${outputfile}
|
||||||
|
#$MENCODER \
|
||||||
|
# -oac mp3lame -lameopts br=${abitrate} -srate ${asrate} \
|
||||||
|
# -ovc lavc -of lavf \
|
||||||
|
# -lavcopts vcodec=${vcodec}:vbitrate=${vbitrate} \
|
||||||
|
# -vf ${filter} \
|
||||||
|
# ${inputfile} -o ${outputfile}
|
||||||
|
# add metadata for flash video
|
||||||
|
[ "$filetype" == ".flv" ] && flvtool2 -U ${outputfile}
|
||||||
|
# make thumbnail
|
||||||
|
# ffmpeg -y -i $outputfile -vframes 1 -ss 00:00:02 -an -vcodec mjpeg -f rawvideo -s ${thumbsize} ${outputfile}.thumb
|
||||||
|
}
|
||||||
|
|
||||||
|
help () {
|
||||||
|
echo " "
|
||||||
|
echo "make_mp4 video file converter (defaults to ${vcodec})"
|
||||||
|
echo " "
|
||||||
|
echo " -i file Inputfile"
|
||||||
|
echo " -d dir [ outputDirectory (default: current directory) ]"
|
||||||
|
echo " -s suffix [ Suffix (default: none) ]"
|
||||||
|
echo " -x ext [ eXtension (default: ${extension}) ]"
|
||||||
|
echo " -c codec [ video Codec (default: ${vcodec}) ]"
|
||||||
|
echo " -L [ rotate video Left/counterclockwise ]"
|
||||||
|
echo " -R [ rotate video Right/clockwise ]"
|
||||||
|
echo " -v [ Video bitrate (default: ${vbitrate}) ]"
|
||||||
|
echo " -a [ Audio bitrate (default: ${abitrate}) ]"
|
||||||
|
echo " -h this Help message"
|
||||||
|
echo " "
|
||||||
|
echo "final destination file is (outputdirectory/) (basename inputfile)(-suffix).(extension)"
|
||||||
|
}
|
||||||
|
|
||||||
|
# parameters
|
||||||
|
while getopts "hi:d:s:t:LRv:a:" OPTION
|
||||||
|
do
|
||||||
|
case $OPTION in
|
||||||
|
h)
|
||||||
|
help
|
||||||
|
exit
|
||||||
|
;;
|
||||||
|
i)
|
||||||
|
inputfile="$OPTARG"
|
||||||
|
filename=$(basename $inputfile|sed -e 's#\..*##')
|
||||||
|
;;
|
||||||
|
d)
|
||||||
|
output_dir="${OPTARG}/"
|
||||||
|
;;
|
||||||
|
s)
|
||||||
|
suffix="-${OPTARG:-}"
|
||||||
|
;;
|
||||||
|
t)
|
||||||
|
extension="${OPTARG:-flv}"
|
||||||
|
;;
|
||||||
|
c)
|
||||||
|
vcodec="${OPTARG:-flv}"
|
||||||
|
;;
|
||||||
|
L)
|
||||||
|
filter=${filter:-}${filter:+,}rotate=2
|
||||||
|
thumbsize="480x640"
|
||||||
|
;;
|
||||||
|
R)
|
||||||
|
filter=${filter:-}${filter:+,}rotate=1
|
||||||
|
thumbsize="480x640"
|
||||||
|
;;
|
||||||
|
v)
|
||||||
|
vbitrate="${OPTARG:-200}"
|
||||||
|
;;
|
||||||
|
a)
|
||||||
|
abitrate="${OPTARG:-32}"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
# show help if called without options
|
||||||
|
[ $OPTIND = 1 ] && help && exit
|
||||||
|
|
||||||
|
outputfile=${output_dir}${filename}${suffix}.${extension}
|
||||||
|
|
||||||
|
echo filename: $filename
|
||||||
|
echo outputfile: $outputfile
|
||||||
|
convert
|
||||||
|
|
||||||
|
exit
|
99
bin/make_ogg
Executable file
99
bin/make_ogg
Executable file
|
@ -0,0 +1,99 @@
|
||||||
|
#!/bin/bash
|
||||||
|
# make_ogg - make ogg movie from any video file
|
||||||
|
|
||||||
|
# tools
|
||||||
|
MENCODER=/usr/bin/mencoder
|
||||||
|
|
||||||
|
# defaults
|
||||||
|
extension="ogg"
|
||||||
|
vcodec="libtheora"
|
||||||
|
acodec="vorbis"
|
||||||
|
suffix=""
|
||||||
|
output_dir=""
|
||||||
|
vfilter="scale=320:240"
|
||||||
|
afilter="channels=2"
|
||||||
|
thumbsize="640x480"
|
||||||
|
vbitrate=200
|
||||||
|
abitrate=32
|
||||||
|
|
||||||
|
# actions
|
||||||
|
convert () {
|
||||||
|
# convert to requested format (default: ogg)
|
||||||
|
ffmpeg -i ${inputfile} -b ${vbitrate}k -ab ${abitrate}k -s qvga -vcodec libtheora -acodec libvorbis ${outputfile}
|
||||||
|
# make thumbnail
|
||||||
|
ffmpeg -y -i $outputfile -vframes 1 -ss 00:00:02 -an -vcodec mjpeg -f rawvideo -s ${thumbsize} ${outputfile}.thumb
|
||||||
|
}
|
||||||
|
|
||||||
|
help () {
|
||||||
|
echo " "
|
||||||
|
echo "make_ogg video file converter (defaults to ogg - theora video)"
|
||||||
|
echo " "
|
||||||
|
echo " -i file Inputfile"
|
||||||
|
echo " -d dir [ outputDirectory (default: current directory) ]"
|
||||||
|
echo " -s suffix [ Suffix (default: none) ]"
|
||||||
|
echo " -x ext [ eXtension (default: ogg) ]"
|
||||||
|
echo " -c codec [ video Codec (default: vorbis) ]"
|
||||||
|
echo " -L [ rotate video Left/counterclockwise ]"
|
||||||
|
echo " -R [ rotate video Right/clockwise ]"
|
||||||
|
echo " -v [ Video bitrate (default: 200) ]"
|
||||||
|
echo " -a [ Audio bitrate (default: 32) ]"
|
||||||
|
echo " -A [ no sound in output video ]"
|
||||||
|
echo " -h this Help message"
|
||||||
|
echo " "
|
||||||
|
echo "final destination file is (outputdirectory/) (basename inputfile)(-suffix).(extension)"
|
||||||
|
}
|
||||||
|
|
||||||
|
# parameters
|
||||||
|
while getopts "hi:d:s:t:LRv:a:A" OPTION
|
||||||
|
do
|
||||||
|
case $OPTION in
|
||||||
|
h)
|
||||||
|
help
|
||||||
|
exit
|
||||||
|
;;
|
||||||
|
i)
|
||||||
|
inputfile="$OPTARG"
|
||||||
|
filename=$(basename $inputfile|sed -e 's#\..*##')
|
||||||
|
;;
|
||||||
|
d)
|
||||||
|
output_dir="${OPTARG}/"
|
||||||
|
;;
|
||||||
|
s)
|
||||||
|
suffix="-${OPTARG:-}"
|
||||||
|
;;
|
||||||
|
t)
|
||||||
|
extension="${OPTARG:-flv}"
|
||||||
|
;;
|
||||||
|
c)
|
||||||
|
vcodec="${OPTARG:-flv}"
|
||||||
|
;;
|
||||||
|
L)
|
||||||
|
filter=${filter:-}${filter:+,}rotate=2
|
||||||
|
thumbsize="480x640"
|
||||||
|
;;
|
||||||
|
R)
|
||||||
|
filter=${filter:-}${filter:+,}rotate=1
|
||||||
|
thumbsize="480x640"
|
||||||
|
;;
|
||||||
|
v)
|
||||||
|
vbitrate="${OPTARG:-200}"
|
||||||
|
;;
|
||||||
|
a)
|
||||||
|
abitrate="${OPTARG:-32}"
|
||||||
|
;;
|
||||||
|
A)
|
||||||
|
nosound="-nosound "
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
# show help if called without options
|
||||||
|
[ $OPTIND = 1 ] && help && exit
|
||||||
|
|
||||||
|
outputfile=${output_dir}${filename}${suffix}.${extension}
|
||||||
|
|
||||||
|
echo filename: $filename
|
||||||
|
echo outputfile: $outputfile
|
||||||
|
convert
|
||||||
|
|
||||||
|
exit
|
131
bin/make_web_video
Executable file
131
bin/make_web_video
Executable file
|
@ -0,0 +1,131 @@
|
||||||
|
#!/bin/bash
|
||||||
|
# make_flv - make flash movie from any video file
|
||||||
|
|
||||||
|
# tools
|
||||||
|
#MENCODER=/opt/APPmplayer/bin/mencoder
|
||||||
|
MENCODER=/usr/bin/mencoder
|
||||||
|
#MENCODER=/usr/bin/avconv
|
||||||
|
#FFMPEG=$(which ffmpeg)
|
||||||
|
FFMPEG=$(which avconv)
|
||||||
|
|
||||||
|
# defaults
|
||||||
|
extension="mp4"
|
||||||
|
vcodec="libx264"
|
||||||
|
acodec="aac"
|
||||||
|
suffix=""
|
||||||
|
output_dir=""
|
||||||
|
geometry="1280x720"
|
||||||
|
filter="scale=1280:720"
|
||||||
|
thumbsize="640x480"
|
||||||
|
vbitrate=800k
|
||||||
|
abitrate=64k
|
||||||
|
|
||||||
|
# actions
|
||||||
|
convert () {
|
||||||
|
# convert to requested format (default: flv)
|
||||||
|
#ffmpeg -i $inputfile -ar 22050 -ab ${abitrate}k -acodec libmp3lame -b ${vbitrate}k -s 320x240 ${outputfile}
|
||||||
|
# OR mencoder:
|
||||||
|
# $MENCODER -vf ${filter} -oac mp3lame -lameopts br=${abitrate} -ovc lavc -of lavf -lavfopts i_certify_that_my_video_stream_does_not_use_b_frames -lavcopts vcodec=${vcodec}:vbitrate=${vbitrate}:autoaspect:v4mv:vmax_b_frames=0:vb_strategy=1:mbd=2:mv0:trell:cbp:sc_factor=6:cmp=2:subcmp=2:predia=2:dia=2:preme=2:turbo:acodec=mp3:abitrate=56 ${inputfile} -o ${outputfile}
|
||||||
|
|
||||||
|
$FFMPEG \
|
||||||
|
-i ${inputfile} \
|
||||||
|
${nosound} -ar 44100 \
|
||||||
|
-b:v ${vbitrate} \
|
||||||
|
-b:a ${abitrate} \
|
||||||
|
-codec:v ${vcodec} \
|
||||||
|
-codec:a ${acodec} \
|
||||||
|
${extra_options} ${outputfile}
|
||||||
|
# -s ${geometry} \
|
||||||
|
# -r ${framerate} \
|
||||||
|
|
||||||
|
# $MENCODER \
|
||||||
|
# ${nosound} -srate 22050 \
|
||||||
|
# -oac lavc -ovc lavc -of lavf \
|
||||||
|
# -lavcopts vcodec=${vcodec}:vbitrate=${vbitrate}:acodec=libmp3lame:abitrate=${abitrate} \
|
||||||
|
# -vf ${filter} \
|
||||||
|
# ${inputfile} -o ${outputfile}
|
||||||
|
# add metadata for flash video
|
||||||
|
[ "$filetype" == ".flv" ] && flvtool2 -U ${outputfile}
|
||||||
|
# make thumbnail
|
||||||
|
ffmpeg -y -i $outputfile -vframes 1 -ss 00:00:02 -an -vcodec mjpeg -f rawvideo -s ${thumbsize} ${outputfile}.thumb
|
||||||
|
}
|
||||||
|
|
||||||
|
help () {
|
||||||
|
echo " "
|
||||||
|
echo "make_flv video file converter (defaults to flv - flash video)"
|
||||||
|
echo " "
|
||||||
|
echo " -i file Inputfile"
|
||||||
|
echo " -d dir [ outputDirectory (default: current directory) ]"
|
||||||
|
echo " -s suffix [ Suffix (default: none) ]"
|
||||||
|
echo " -x ext [ eXtension (default: ${extension}) ]"
|
||||||
|
echo " -c codec [ video Codec (default: ${vcodec}) ]"
|
||||||
|
echo " -L [ rotate video Left/counterclockwise ]"
|
||||||
|
echo " -R [ rotate video Right/clockwise ]"
|
||||||
|
echo " -v [ Video bitrate (default: ${vbitrate}) ]"
|
||||||
|
echo " -a [ Audio bitrate (default: ${abitrate}) ]"
|
||||||
|
echo " -A [ no sound in output video ]"
|
||||||
|
echo " -h this Help message"
|
||||||
|
echo " "
|
||||||
|
echo "final destination file is (outputdirectory/) (basename inputfile)(-suffix).(extension)"
|
||||||
|
}
|
||||||
|
|
||||||
|
# parameters
|
||||||
|
while getopts "hi:d:s:t:LRv:a:A" OPTION
|
||||||
|
do
|
||||||
|
case $OPTION in
|
||||||
|
h)
|
||||||
|
help
|
||||||
|
exit
|
||||||
|
;;
|
||||||
|
i)
|
||||||
|
inputfile="$OPTARG"
|
||||||
|
filename=$(basename $inputfile|sed -e 's#\..*##')
|
||||||
|
;;
|
||||||
|
d)
|
||||||
|
output_dir="${OPTARG}/"
|
||||||
|
;;
|
||||||
|
s)
|
||||||
|
suffix="-${OPTARG:-}"
|
||||||
|
;;
|
||||||
|
t)
|
||||||
|
extension="${OPTARG:-mp4}"
|
||||||
|
;;
|
||||||
|
c)
|
||||||
|
vcodec="${OPTARG:-libx264}"
|
||||||
|
;;
|
||||||
|
L)
|
||||||
|
filter=${filter:-}${filter:+,}transpose=2
|
||||||
|
thumbsize="480x640"
|
||||||
|
;;
|
||||||
|
R)
|
||||||
|
filter=${filter:-}${filter:+,}transpose=1
|
||||||
|
thumbsize="480x640"
|
||||||
|
;;
|
||||||
|
v)
|
||||||
|
vbitrate="${OPTARG:-$vbitrate}"
|
||||||
|
;;
|
||||||
|
a)
|
||||||
|
abitrate="${OPTARG:-$abitrate}"
|
||||||
|
;;
|
||||||
|
A)
|
||||||
|
nosound="-an "
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
# show help if called without options
|
||||||
|
[ $OPTIND = 1 ] && help && exit
|
||||||
|
|
||||||
|
outputfile=${output_dir}${filename}${suffix}.${extension}
|
||||||
|
|
||||||
|
if [ "${vcodec}" == "libx264" ]; then
|
||||||
|
extra_options="-strict -2 "
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo $extra_options
|
||||||
|
|
||||||
|
echo filename: $filename
|
||||||
|
echo outputfile: $outputfile
|
||||||
|
convert
|
||||||
|
|
||||||
|
exit
|
131
bin/make_web_video2
Executable file
131
bin/make_web_video2
Executable file
|
@ -0,0 +1,131 @@
|
||||||
|
#!/bin/bash
|
||||||
|
# make_flv - make flash movie from any video file
|
||||||
|
|
||||||
|
# tools
|
||||||
|
#MENCODER=/opt/APPmplayer/bin/mencoder
|
||||||
|
MENCODER=/usr/bin/mencoder
|
||||||
|
#MENCODER=/usr/bin/avconv
|
||||||
|
#FFMPEG=$(which ffmpeg)
|
||||||
|
FFMPEG=$(which avconv)
|
||||||
|
|
||||||
|
# defaults
|
||||||
|
extension="mp4"
|
||||||
|
vcodec="libx264"
|
||||||
|
acodec="aac"
|
||||||
|
suffix=""
|
||||||
|
output_dir=""
|
||||||
|
geometry="1280x720"
|
||||||
|
filter="scale=1280:720"
|
||||||
|
thumbsize="640x480"
|
||||||
|
vbitrate=800k
|
||||||
|
abitrate=64k
|
||||||
|
|
||||||
|
# actions
|
||||||
|
convert () {
|
||||||
|
# convert to requested format (default: flv)
|
||||||
|
#ffmpeg -i $inputfile -ar 22050 -ab ${abitrate}k -acodec libmp3lame -b ${vbitrate}k -s 320x240 ${outputfile}
|
||||||
|
# OR mencoder:
|
||||||
|
# $MENCODER -vf ${filter} -oac mp3lame -lameopts br=${abitrate} -ovc lavc -of lavf -lavfopts i_certify_that_my_video_stream_does_not_use_b_frames -lavcopts vcodec=${vcodec}:vbitrate=${vbitrate}:autoaspect:v4mv:vmax_b_frames=0:vb_strategy=1:mbd=2:mv0:trell:cbp:sc_factor=6:cmp=2:subcmp=2:predia=2:dia=2:preme=2:turbo:acodec=mp3:abitrate=56 ${inputfile} -o ${outputfile}
|
||||||
|
|
||||||
|
$FFMPEG \
|
||||||
|
-i ${inputfile} \
|
||||||
|
${nosound} -ar 44100 \
|
||||||
|
-vf ${filter} \
|
||||||
|
-b:v ${vbitrate} \
|
||||||
|
-b:a ${abitrate} \
|
||||||
|
-codec:v ${vcodec} \
|
||||||
|
-codec:a ${acodec} \
|
||||||
|
${extra_options} ${outputfile}
|
||||||
|
# -r ${framerate} \
|
||||||
|
|
||||||
|
# $MENCODER \
|
||||||
|
# ${nosound} -srate 22050 \
|
||||||
|
# -oac lavc -ovc lavc -of lavf \
|
||||||
|
# -lavcopts vcodec=${vcodec}:vbitrate=${vbitrate}:acodec=libmp3lame:abitrate=${abitrate} \
|
||||||
|
# -vf ${filter} \
|
||||||
|
# ${inputfile} -o ${outputfile}
|
||||||
|
# add metadata for flash video
|
||||||
|
[ "$filetype" == ".flv" ] && flvtool2 -U ${outputfile}
|
||||||
|
# make thumbnail
|
||||||
|
ffmpeg -y -i $outputfile -vframes 1 -ss 00:00:02 -an -vcodec mjpeg -f rawvideo -s ${thumbsize} ${outputfile}.thumb
|
||||||
|
}
|
||||||
|
|
||||||
|
help () {
|
||||||
|
echo " "
|
||||||
|
echo "make_flv video file converter (defaults to flv - flash video)"
|
||||||
|
echo " "
|
||||||
|
echo " -i file Inputfile"
|
||||||
|
echo " -d dir [ outputDirectory (default: current directory) ]"
|
||||||
|
echo " -s suffix [ Suffix (default: none) ]"
|
||||||
|
echo " -x ext [ eXtension (default: ${extension}) ]"
|
||||||
|
echo " -c codec [ video Codec (default: ${vcodec}) ]"
|
||||||
|
echo " -L [ rotate video Left/counterclockwise ]"
|
||||||
|
echo " -R [ rotate video Right/clockwise ]"
|
||||||
|
echo " -v [ Video bitrate (default: ${vbitrate}) ]"
|
||||||
|
echo " -a [ Audio bitrate (default: ${abitrate}) ]"
|
||||||
|
echo " -A [ no sound in output video ]"
|
||||||
|
echo " -h this Help message"
|
||||||
|
echo " "
|
||||||
|
echo "final destination file is (outputdirectory/) (basename inputfile)(-suffix).(extension)"
|
||||||
|
}
|
||||||
|
|
||||||
|
# parameters
|
||||||
|
while getopts "hi:d:s:t:LRv:a:A" OPTION
|
||||||
|
do
|
||||||
|
case $OPTION in
|
||||||
|
h)
|
||||||
|
help
|
||||||
|
exit
|
||||||
|
;;
|
||||||
|
i)
|
||||||
|
inputfile="$OPTARG"
|
||||||
|
filename=$(basename $inputfile|sed -e 's#\..*##')
|
||||||
|
;;
|
||||||
|
d)
|
||||||
|
output_dir="${OPTARG}/"
|
||||||
|
;;
|
||||||
|
s)
|
||||||
|
suffix="-${OPTARG:-}"
|
||||||
|
;;
|
||||||
|
t)
|
||||||
|
extension="${OPTARG:-mp4}"
|
||||||
|
;;
|
||||||
|
c)
|
||||||
|
vcodec="${OPTARG:-libx264}"
|
||||||
|
;;
|
||||||
|
L)
|
||||||
|
filter=${filter:-}${filter:+,}transpose=2
|
||||||
|
thumbsize="480x640"
|
||||||
|
;;
|
||||||
|
R)
|
||||||
|
filter=${filter:-}${filter:+,}transpose=1
|
||||||
|
thumbsize="480x640"
|
||||||
|
;;
|
||||||
|
v)
|
||||||
|
vbitrate="${OPTARG:-$vbitrate}"
|
||||||
|
;;
|
||||||
|
a)
|
||||||
|
abitrate="${OPTARG:-$abitrate}"
|
||||||
|
;;
|
||||||
|
A)
|
||||||
|
nosound="-an "
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
# show help if called without options
|
||||||
|
[ $OPTIND = 1 ] && help && exit
|
||||||
|
|
||||||
|
outputfile=${output_dir}${filename}${suffix}.${extension}
|
||||||
|
|
||||||
|
if [ "${vcodec}" == "libx264" ]; then
|
||||||
|
extra_options="-strict -2 "
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo $extra_options
|
||||||
|
|
||||||
|
echo filename: $filename
|
||||||
|
echo outputfile: $outputfile
|
||||||
|
convert
|
||||||
|
|
||||||
|
exit
|
142
bin/make_web_videos
Executable file
142
bin/make_web_videos
Executable file
|
@ -0,0 +1,142 @@
|
||||||
|
#!/bin/bash
|
||||||
|
# make_web_videos - make mp4/flash movies from any video file
|
||||||
|
|
||||||
|
# tools
|
||||||
|
#MENCODER=/opt/APPmplayer/bin/mencoder
|
||||||
|
MENCODER=/usr/bin/mencoder
|
||||||
|
FFMPEG=$(which ffmpeg)
|
||||||
|
|
||||||
|
# defaults
|
||||||
|
extension="mp4"
|
||||||
|
vcodec="libx264"
|
||||||
|
acodec="aac"
|
||||||
|
suffix=""
|
||||||
|
output_dir=""
|
||||||
|
geometry="1280x720"
|
||||||
|
filter="scale=1280:720"
|
||||||
|
thumbsize="640x480"
|
||||||
|
vbitrate=1000k
|
||||||
|
abitrate=64k
|
||||||
|
|
||||||
|
# profiles
|
||||||
|
declare -A profiles
|
||||||
|
profiles[low][geometry] ="320:240"
|
||||||
|
profiles[low][vcodec] ="flv"
|
||||||
|
profiles[low][acodec] ="mp3"
|
||||||
|
profiles[low][vbitrate] ="200"
|
||||||
|
profiles[low][abitrate] ="32"
|
||||||
|
|
||||||
|
echo ${profiles[low][*]}
|
||||||
|
exit
|
||||||
|
|
||||||
|
|
||||||
|
# actions
|
||||||
|
convert () {
|
||||||
|
# convert to requested format (default: flv)
|
||||||
|
#ffmpeg -i $inputfile -ar 22050 -ab ${abitrate}k -acodec libmp3lame -b ${vbitrate}k -s 320x240 ${outputfile}
|
||||||
|
# OR mencoder:
|
||||||
|
# $MENCODER -vf ${filter} -oac mp3lame -lameopts br=${abitrate} -ovc lavc -of lavf -lavfopts i_certify_that_my_video_stream_does_not_use_b_frames -lavcopts vcodec=${vcodec}:vbitrate=${vbitrate}:autoaspect:v4mv:vmax_b_frames=0:vb_strategy=1:mbd=2:mv0:trell:cbp:sc_factor=6:cmp=2:subcmp=2:predia=2:dia=2:preme=2:turbo:acodec=mp3:abitrate=56 ${inputfile} -o ${outputfile}
|
||||||
|
|
||||||
|
$FFMPEG \
|
||||||
|
-i ${inputfile} \
|
||||||
|
${nosound} -ar 44100 \
|
||||||
|
-b:v ${vbitrate} \
|
||||||
|
-b:a ${abitrate} \
|
||||||
|
-codec:v ${vcodec} \
|
||||||
|
-codec:a ${acodec} \
|
||||||
|
${extra_options} ${outputfile}
|
||||||
|
# -s ${geometry} \
|
||||||
|
# -r ${framerate} \
|
||||||
|
|
||||||
|
# $MENCODER \
|
||||||
|
# ${nosound} -srate 22050 \
|
||||||
|
# -oac lavc -ovc lavc -of lavf \
|
||||||
|
# -lavcopts vcodec=${vcodec}:vbitrate=${vbitrate}:acodec=libmp3lame:abitrate=${abitrate} \
|
||||||
|
# -vf ${filter} \
|
||||||
|
# ${inputfile} -o ${outputfile}
|
||||||
|
# add metadata for flash video
|
||||||
|
[ "$filetype" == ".flv" ] && flvtool2 -U ${outputfile}
|
||||||
|
# make thumbnail
|
||||||
|
ffmpeg -y -i $outputfile -vframes 1 -ss 00:00:02 -an -vcodec mjpeg -f rawvideo -s ${thumbsize} ${outputfile}.thumb
|
||||||
|
}
|
||||||
|
|
||||||
|
help () {
|
||||||
|
echo " "
|
||||||
|
echo "make_flv video file converter (defaults to flv - flash video)"
|
||||||
|
echo " "
|
||||||
|
echo " -i file Inputfile"
|
||||||
|
echo " -l/m/h [ create Low (${lowres-geometry}, Medium (${medres-geometry} and/or High (${highres-geometry}) versions ]"
|
||||||
|
echo " -d dir [ outputDirectory (default: current directory) ]"
|
||||||
|
echo " -s suffix [ Suffix (default: none) ]"
|
||||||
|
echo " -x ext [ eXtension (default: ${extension}) ]"
|
||||||
|
echo " -c codec [ video Codec (default: ${vcodec}) ]"
|
||||||
|
echo " -L [ rotate video Left/counterclockwise ]"
|
||||||
|
echo " -R [ rotate video Right/clockwise ]"
|
||||||
|
echo " -v [ Video bitrate (default: ${vbitrate}) ]"
|
||||||
|
echo " -a [ Audio bitrate (default: ${abitrate}) ]"
|
||||||
|
echo " -A [ no sound in output video ]"
|
||||||
|
echo " -h this Help message"
|
||||||
|
echo " "
|
||||||
|
echo "final destination file is (outputdirectory/) (basename inputfile)(-suffix).(extension)"
|
||||||
|
}
|
||||||
|
|
||||||
|
# parameters
|
||||||
|
while getopts "hi:d:s:t:LRv:a:A" OPTION
|
||||||
|
do
|
||||||
|
case $OPTION in
|
||||||
|
h)
|
||||||
|
help
|
||||||
|
exit
|
||||||
|
;;
|
||||||
|
i)
|
||||||
|
inputfile="$OPTARG"
|
||||||
|
filename=$(basename $inputfile|sed -e 's#\..*##')
|
||||||
|
;;
|
||||||
|
d)
|
||||||
|
output_dir="${OPTARG}/"
|
||||||
|
;;
|
||||||
|
s)
|
||||||
|
suffix="-${OPTARG:-}"
|
||||||
|
;;
|
||||||
|
t)
|
||||||
|
extension="${OPTARG:-mp4}"
|
||||||
|
;;
|
||||||
|
c)
|
||||||
|
vcodec="${OPTARG:-libx264}"
|
||||||
|
;;
|
||||||
|
L)
|
||||||
|
filter=${filter:-}${filter:+,}transpose=2
|
||||||
|
thumbsize="480x640"
|
||||||
|
;;
|
||||||
|
R)
|
||||||
|
filter=${filter:-}${filter:+,}transpose=1
|
||||||
|
thumbsize="480x640"
|
||||||
|
;;
|
||||||
|
v)
|
||||||
|
vbitrate="${OPTARG:-$vbitrate}"
|
||||||
|
;;
|
||||||
|
a)
|
||||||
|
abitrate="${OPTARG:-$abitrate}"
|
||||||
|
;;
|
||||||
|
A)
|
||||||
|
nosound="-an "
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
# show help if called without options
|
||||||
|
[ $OPTIND = 1 ] && help && exit
|
||||||
|
|
||||||
|
outputfile=${output_dir}${filename}${suffix}.${extension}
|
||||||
|
|
||||||
|
if [ "${vcodec}" == "libx264" ]; then
|
||||||
|
extra_options="-strict -2 "
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo $extra_options
|
||||||
|
|
||||||
|
echo filename: $filename
|
||||||
|
echo outputfile: $outputfile
|
||||||
|
convert
|
||||||
|
|
||||||
|
exit
|
180
bin/mate-term-save-colors
Executable file
180
bin/mate-term-save-colors
Executable file
|
@ -0,0 +1,180 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
# Copyright (C) 2013, Giorgos Keramidas <gkeramidas@gmail.com>
|
||||||
|
# All rights reserved.
|
||||||
|
#
|
||||||
|
# Redistribution and use in source and binary forms, with or without
|
||||||
|
# modification, are permitted provided that the following conditions
|
||||||
|
# are met:
|
||||||
|
# 1. Redistributions of source code must retain the above copyright
|
||||||
|
# notice, this list of conditions and the following disclaimer.
|
||||||
|
# 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
# notice, this list of conditions and the following disclaimer in the
|
||||||
|
# documentation and/or other materials provided with the distribution.
|
||||||
|
#
|
||||||
|
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||||
|
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||||
|
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
|
# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
|
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
# SUCH DAMAGE.
|
||||||
|
|
||||||
|
# Dump an executable form of all the mate-terminal keys associated with
|
||||||
|
# colors. Running the resulting script should restore all color-related
|
||||||
|
# state of the terminal to whatever it was at the time the script was
|
||||||
|
# created.
|
||||||
|
#
|
||||||
|
# Inspired by:
|
||||||
|
# The setup scripts of solarized theme for gnome-terminal from:
|
||||||
|
# https://github.com/sigurdga/gnome-terminal-colors-solarized
|
||||||
|
|
||||||
|
# ----- startup code ---------------------------------------------------
|
||||||
|
|
||||||
|
# Save the original program invocation name, and the real path of the
|
||||||
|
# startup directory, for later use.
|
||||||
|
progdir=$( cd $(dirname "$0") ; /bin/pwd -P )
|
||||||
|
progname=$( basename "$0" )
|
||||||
|
|
||||||
|
# ----- misc functions -------------------------------------------------
|
||||||
|
|
||||||
|
#
|
||||||
|
# err exitval message
|
||||||
|
# Display message to stderr and to the logfile, if any, and then
|
||||||
|
# exit with exitval as the return code of the script.
|
||||||
|
#
|
||||||
|
err()
|
||||||
|
{
|
||||||
|
exitval=$1
|
||||||
|
shift
|
||||||
|
|
||||||
|
log "$0: ERROR: $*"
|
||||||
|
exit $exitval
|
||||||
|
}
|
||||||
|
|
||||||
|
#
|
||||||
|
# warn message
|
||||||
|
# Display message to stderr and the log file.
|
||||||
|
#
|
||||||
|
warn()
|
||||||
|
{
|
||||||
|
log "$0: WARNING: $*"
|
||||||
|
}
|
||||||
|
|
||||||
|
#
|
||||||
|
# info message
|
||||||
|
# Display informational message to stderr and to the logfile.
|
||||||
|
#
|
||||||
|
info()
|
||||||
|
{
|
||||||
|
log "$0: INFO: $*"
|
||||||
|
}
|
||||||
|
|
||||||
|
#
|
||||||
|
# debug message
|
||||||
|
# Output message to stderr if debug_output_enabled is set to
|
||||||
|
# 'yes', 'true' or '1'. Please AVOID calling any shell subroutine
|
||||||
|
# that may recursively call debug().
|
||||||
|
#
|
||||||
|
debug()
|
||||||
|
{
|
||||||
|
case ${debug_enabled} in
|
||||||
|
[Yy][Ee][Ss]|[Tt][Rr][Uu][Ee]|[Oo][Nn]|1)
|
||||||
|
log "$0: DEBUG: $*"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
#
|
||||||
|
# log message
|
||||||
|
# Print a log message to standard error. If ${LOGFILE} is set
|
||||||
|
# Output message to "${LOGFILE}" if it is set and is writable.
|
||||||
|
#
|
||||||
|
log()
|
||||||
|
{
|
||||||
|
__timestamp="`date -u '+%Y-%m-%d %H:%M:%S'`"
|
||||||
|
__msg="${__timestamp} [${progname}] -- $*"
|
||||||
|
echo >&2 "${__msg}" 2>&1
|
||||||
|
if [ -n "${LOGFILE}" ]; then
|
||||||
|
echo "${__msg}" >> "${LOGFILE}"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# ----- main script body ------------------------------------------------
|
||||||
|
|
||||||
|
# The gconf-compatible tool to use for reading and writing gconf keys
|
||||||
|
# for the MATE desktop, and the application name under /apps/ to
|
||||||
|
# configure. These are provisionaly set to work for the MATE desktop,
|
||||||
|
# but they can also be tweaked to work for GNOME 2.X by setting:
|
||||||
|
#
|
||||||
|
# conftool='gconftool-2'
|
||||||
|
# appname='gnome-terminal'
|
||||||
|
|
||||||
|
conftool='gconftool-2'
|
||||||
|
appname='mate-terminal'
|
||||||
|
|
||||||
|
# Basic command-line sanity checking.
|
||||||
|
if test $# -ne 0 && test $# -ne 1 ; then
|
||||||
|
echo >&2 "usage: ${progname} [ PROFILE ]"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# The name of the profile we are dumping can be passed as a command line
|
||||||
|
# argument, or auto-detected by peeking at:
|
||||||
|
# '/apps/${appname}/global/default_profile'
|
||||||
|
if test $# -eq 1 ; then
|
||||||
|
profile="$1"
|
||||||
|
else
|
||||||
|
key="/apps/${appname}/global/default_profile"
|
||||||
|
profile=$( ${conftool} --get "${key}" 2>/dev/null )
|
||||||
|
if test $? -ne 0 ; then
|
||||||
|
debug "Cannot read configuration key: ${key}"
|
||||||
|
err 1 "Cannot detect default profile name."
|
||||||
|
fi
|
||||||
|
unset key
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Verify that the profile we are looking for really exists, by trying to
|
||||||
|
# read at least one key from it:
|
||||||
|
# '/apps/${appname}/profiles/${profile}/foreground_color'
|
||||||
|
key="/apps/${appname}/profiles/${profile}/foreground_color"
|
||||||
|
${conftool} --get "${key}" > /dev/null 2>&1
|
||||||
|
if test $? -ne 0 ; then
|
||||||
|
debug "Cannot read configuration key: ${key}"
|
||||||
|
err 1 "Profile ${profile} cannot be found."
|
||||||
|
fi
|
||||||
|
unset key
|
||||||
|
|
||||||
|
# dumpkey TYPE KEY
|
||||||
|
# Dump a configuration key to standard output, as a shell command that
|
||||||
|
# will _set_ it to its current value, using the associated type.
|
||||||
|
dumpkey()
|
||||||
|
{
|
||||||
|
if test $# -ne 2 || test -z "$1" || test -z "$2" ; then
|
||||||
|
debug "dumpkey() requires exactly 2 non-empty arguments,"
|
||||||
|
debug "but it was invoked with:"
|
||||||
|
debug " \"$1\""
|
||||||
|
debug " \"$2\""
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
__type="$1"
|
||||||
|
__key="$2"
|
||||||
|
|
||||||
|
__value=$( ${conftool} --get "${__key}" )
|
||||||
|
if test $? -ne 0 ; then
|
||||||
|
err 1 "Cannot read key \"${__key}\""
|
||||||
|
fi
|
||||||
|
echo "${conftool} --set --type \"${__type}\"" \
|
||||||
|
"\"${__key}\" \"${__value}\""
|
||||||
|
}
|
||||||
|
|
||||||
|
dumpkey "string" "/apps/${appname}/profiles/${profile}/background_color"
|
||||||
|
dumpkey "string" "/apps/${appname}/profiles/${profile}/bold_color"
|
||||||
|
dumpkey "bool" "/apps/${appname}/profiles/${profile}/bold_color_same_as_fg"
|
||||||
|
dumpkey "string" "/apps/${appname}/profiles/${profile}/foreground_color"
|
||||||
|
dumpkey "string" "/apps/${appname}/profiles/${profile}/palette"
|
||||||
|
|
30
bin/mdb-sqlite.py
Executable file
30
bin/mdb-sqlite.py
Executable file
|
@ -0,0 +1,30 @@
|
||||||
|
#!/usr/bin/env python
|
||||||
|
#
|
||||||
|
# AccessDump.py
|
||||||
|
# A simple script to dump the contents of a Microsoft Access Database.
|
||||||
|
# It depends upon the mdbtools suite:
|
||||||
|
# http://sourceforge.net/projects/mdbtools/
|
||||||
|
|
||||||
|
import sys, subprocess, os
|
||||||
|
|
||||||
|
DATABASE = sys.argv[1]
|
||||||
|
|
||||||
|
# Dump the schema for the DB
|
||||||
|
subprocess.call(["mdb-schema", DATABASE, "mysql"])
|
||||||
|
|
||||||
|
# Get the list of table names with "mdb-tables"
|
||||||
|
table_names = subprocess.Popen(["mdb-tables", "-1", DATABASE],
|
||||||
|
stdout=subprocess.PIPE).communicate()[0]
|
||||||
|
tables = table_names.splitlines()
|
||||||
|
|
||||||
|
print "BEGIN;" # start a transaction, speeds things up when importing
|
||||||
|
sys.stdout.flush()
|
||||||
|
|
||||||
|
# Dump each table as a CSV file using "mdb-export",
|
||||||
|
# converting " " in table names to "_" for the CSV filenames.
|
||||||
|
for table in tables:
|
||||||
|
if table != '':
|
||||||
|
subprocess.call(["mdb-export", "-I", "mysql", DATABASE, table])
|
||||||
|
|
||||||
|
print "COMMIT;" # end the transaction
|
||||||
|
sys.stdout.flush()
|
10
bin/memuse
Executable file
10
bin/memuse
Executable file
|
@ -0,0 +1,10 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
total=0
|
||||||
|
|
||||||
|
ps aux|egrep -v 'RSS|0 0'|sort -k6 -n|while read line;do
|
||||||
|
rss=$(echo "$line"|awk '{print $6}')
|
||||||
|
cmd=$(echo "$line"|awk '{print $11}')
|
||||||
|
total=$(($total+$rss));echo $total - $rss - $cmd
|
||||||
|
done
|
||||||
|
|
245
bin/menumaker
Executable file
245
bin/menumaker
Executable file
|
@ -0,0 +1,245 @@
|
||||||
|
#!/usr/bin/perl -w
|
||||||
|
#
|
||||||
|
# sitemaker - create html files and nested menu based on templates and content
|
||||||
|
#
|
||||||
|
# Copyright (C) 2008 Frank de Lange
|
||||||
|
#
|
||||||
|
# This program is free software: you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU Affero General Public License as
|
||||||
|
# published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU Affero General Public License
|
||||||
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# This program assumes that filenames are formatted as follows:
|
||||||
|
#
|
||||||
|
# category _ subcategory _ subsubcategory _ ... _ filename
|
||||||
|
#
|
||||||
|
# It then creates html in the 'site' directory based on the content
|
||||||
|
# of those files. It also creates a 'menu.html' file in this directory
|
||||||
|
# which contains a nested unordered list reflecting the hierarchy of
|
||||||
|
# the site.
|
||||||
|
#
|
||||||
|
# Currently the script handles these special tags in the input files:
|
||||||
|
#
|
||||||
|
# <title>menu title</title>
|
||||||
|
# set menu title to 'menu title'
|
||||||
|
#
|
||||||
|
# <content>.....</content>
|
||||||
|
# set page content to whatever is between these tags
|
||||||
|
#
|
||||||
|
# <extra>.....</extra>
|
||||||
|
# set extra page content to whatever is between these tags
|
||||||
|
# extra content is generally rendered in the left column but that
|
||||||
|
# can be changed by editing the site CSS.
|
||||||
|
#
|
||||||
|
# Output files get the name of the input file with the .shtml extension.
|
||||||
|
#
|
||||||
|
# Templates are stored in the 'template' directory
|
||||||
|
#
|
||||||
|
# The program orders the menu lexicografically depth-first so menus
|
||||||
|
# can be put in any order by prepending the part name with a sequence
|
||||||
|
# numbner. Like so:
|
||||||
|
#
|
||||||
|
# 1-a
|
||||||
|
# 1-a_a
|
||||||
|
# 1-a_c
|
||||||
|
# 2-c
|
||||||
|
# 3-b
|
||||||
|
# 3-b_1-f
|
||||||
|
# 3-b_2-a
|
||||||
|
# 3-b_3-g
|
||||||
|
# 3-b_4-j_a_c
|
||||||
|
# 3-b_4-j_a_f
|
||||||
|
# ...etc.
|
||||||
|
|
||||||
|
my $DEBUG=0;
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
use HTML::Template;
|
||||||
|
use Getopt::Long;
|
||||||
|
use Data::Dumper;
|
||||||
|
|
||||||
|
my %hash;
|
||||||
|
my %OPT = ( build_menu => 0,
|
||||||
|
append_menu => 0,
|
||||||
|
build_html => 0,
|
||||||
|
target_dir => "site",
|
||||||
|
source_dir => "",
|
||||||
|
extension => ".shtml",
|
||||||
|
menu_template => "menu.tmpl",
|
||||||
|
html_template => "page.tmpl",
|
||||||
|
debug => 0
|
||||||
|
);
|
||||||
|
|
||||||
|
# subs ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
# walk_tree - recursively walk over the input, creating parsed output in $aref
|
||||||
|
#
|
||||||
|
sub walk_tree {
|
||||||
|
my ($parent, $aref, $file, $name, @kids) = @_;
|
||||||
|
|
||||||
|
unless( @$aref and $aref->[-1]{name} eq $name ) {
|
||||||
|
push @{$aref}, { name => $name, title => $name, parent => $parent };
|
||||||
|
}
|
||||||
|
if( @kids ) {
|
||||||
|
if( not exists $aref->[ -1 ]{ children } ) {
|
||||||
|
$aref->[-1]{children} = [];
|
||||||
|
# copy href and title to current for orphaned parent link, then remove orphan
|
||||||
|
if (exists $aref->[-2] and exists $aref->[-2]{href} and $aref->[-2]{href} =~ /$name$OPT{extension}/) {
|
||||||
|
$aref->[-1]{href} = $aref->[-2]{href};
|
||||||
|
$aref->[-1]{title} = $aref->[-2]{title};
|
||||||
|
splice(@$aref,-2,1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
walk_tree($aref->[-1], $aref->[-1]{children}, $file, @kids );
|
||||||
|
} elsif (-f $file) {
|
||||||
|
# leaf node with accessible file: set href...
|
||||||
|
$aref->[-1]{href}="$file" . $OPT{extension};
|
||||||
|
$aref->[-1]{file}="$file";
|
||||||
|
parse_content($aref->[-1]) if ($OPT{build_html} or $OPT{build_menu});
|
||||||
|
build_html($aref->[-1]) if $OPT{build_html};
|
||||||
|
} elsif (-d $file) {
|
||||||
|
print "[warning] invalid input: $file (is a directory)\n";
|
||||||
|
} else {
|
||||||
|
print "[error] invalid input: name: $name ($file): leaf node without file?\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# parse_content - insert tagged content into $href, create clicktrail
|
||||||
|
#
|
||||||
|
sub parse_content {
|
||||||
|
my $href = shift;
|
||||||
|
my $input;
|
||||||
|
|
||||||
|
open(INFILE, "<$$href{file}") or die "can not open $$href{file}: $!\n";
|
||||||
|
while(<INFILE>) {
|
||||||
|
$input .= $_;
|
||||||
|
}
|
||||||
|
close INFILE;
|
||||||
|
|
||||||
|
# create clicktrail
|
||||||
|
my $ancestor = $$href{parent};
|
||||||
|
while (exists ${$ancestor}{parent}) {
|
||||||
|
if (exists ${$ancestor}{href}) {
|
||||||
|
$$href{clicktrail} = [] if not exists $$href{clicktrail};
|
||||||
|
unshift(@{$$href{clicktrail}}, { href => ${$ancestor}{href}, title => ${$ancestor}{title} });
|
||||||
|
}
|
||||||
|
$ancestor = ${$ancestor}{parent};
|
||||||
|
}
|
||||||
|
|
||||||
|
# parse input
|
||||||
|
if ($input =~ /<title>\s*(.*?)\s*<\/title>/is) {
|
||||||
|
# ... found title, replace placeholder (filename) with it
|
||||||
|
$$href{title} = $1;
|
||||||
|
}
|
||||||
|
if ($input =~ /<content>(.*)<\/content>/is) {
|
||||||
|
# ... found content...
|
||||||
|
$$href{content} = $1;
|
||||||
|
}
|
||||||
|
if ($input =~ /<extra>(.*)<\/extra>/is) {
|
||||||
|
# ... found extra content
|
||||||
|
$$href{extra} = $1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# build_html - create the (s)html files for the content
|
||||||
|
#
|
||||||
|
sub build_html {
|
||||||
|
my $href = shift;
|
||||||
|
|
||||||
|
system("mkdir $OPT{target_dir}") if not -d $OPT{target_dir};
|
||||||
|
open(OUTFILE, ">$OPT{target_dir}$$href{href}") or die "can not open $OPT{target_dir}$$href{href}: $!\n";
|
||||||
|
my $t = HTML::Template->new (filename => "template/$OPT{html_template}", die_on_bad_params => 0);
|
||||||
|
$t->param (content => $$href{content});
|
||||||
|
$t->param (title => $$href{title});
|
||||||
|
$t->param (extra => $$href{extra}) if (exists $$href{extra});
|
||||||
|
$t->param (clicktrail => $$href{clicktrail}) if (exists $$href{clicktrail});
|
||||||
|
print OUTFILE $t->output ();
|
||||||
|
close OUTFILE;
|
||||||
|
}
|
||||||
|
|
||||||
|
# build_menu - create the menu.html file for the content
|
||||||
|
#
|
||||||
|
sub build_menu {
|
||||||
|
my ($aref, $menu_file, $menu_template) = @_;
|
||||||
|
|
||||||
|
system("mkdir -p $OPT{target_dir}include") if not -d "$OPT{target_dir}include";
|
||||||
|
open(OUTFILE, ($OPT{append_menu}) ? ">>" : ">", "$OPT{target_dir}include/$menu_file") or die "can not open $OPT{target_dir}include/$menu_file: $!\n";
|
||||||
|
my $t = HTML::Template->new (filename => "template/$menu_template", die_on_bad_params => 0);
|
||||||
|
$t->param (Parents => $aref);
|
||||||
|
# the template produces a lot of empty lines, remove these from the output...
|
||||||
|
my $clean_output = $t->output ();
|
||||||
|
$clean_output =~ s/\n\s*\n/\n/g;
|
||||||
|
print OUTFILE $clean_output;
|
||||||
|
close OUTFILE;
|
||||||
|
}
|
||||||
|
|
||||||
|
# main ---------------------------------------------------------------------
|
||||||
|
#
|
||||||
|
my @input;
|
||||||
|
my @sorted_input;
|
||||||
|
my @tree;
|
||||||
|
|
||||||
|
GetOptions("menu!" => \$OPT{build_menu},
|
||||||
|
"append_menu!" => \$OPT{append_menu},
|
||||||
|
"html!" => \$OPT{build_html},
|
||||||
|
"debug!" => \$OPT{debug},
|
||||||
|
"extension=s" => \$OPT{extension},
|
||||||
|
"target_dir=s" => \$OPT{target_dir},
|
||||||
|
"source_dir=s" => \$OPT{source_dir},
|
||||||
|
"menu_template=s" => \$OPT{menu_template},
|
||||||
|
"html_template=s" => \$OPT{html_template});
|
||||||
|
|
||||||
|
# append slash to end of source/target if needed
|
||||||
|
$OPT{target_dir} =~ s/(\S+[^\/])/$1\//;
|
||||||
|
$OPT{source_dir} =~ s/(\S+[^\/])/$1\//;
|
||||||
|
|
||||||
|
# prepend dot to extension if needed
|
||||||
|
$OPT{extension} =~ s/(^[^.]\S+)/.$1/;
|
||||||
|
|
||||||
|
# allow DEBUG to be set at runtime
|
||||||
|
$DEBUG=1 if $OPT{debug};
|
||||||
|
|
||||||
|
# append_menu sets build_menu
|
||||||
|
$OPT{build_menu}=1 if $OPT{append_menu};
|
||||||
|
|
||||||
|
if ($DEBUG) {
|
||||||
|
print "build_menu: $OPT{build_menu}\n";
|
||||||
|
print "append_menu: $OPT{append_menu}\n";
|
||||||
|
print "build_html: $OPT{build_html}\n";
|
||||||
|
print "target_dir: $OPT{target_dir}\n";
|
||||||
|
print "source_dir: $OPT{source_dir}\n";
|
||||||
|
print "menu_template: $OPT{menu_template}\n";
|
||||||
|
print "html_template: $OPT{html_template}\n";
|
||||||
|
print "extension: $OPT{extension}\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
while(<STDIN>) {
|
||||||
|
chomp;
|
||||||
|
push @input,$_;
|
||||||
|
}
|
||||||
|
|
||||||
|
# depth-first sort, uses underscore as divider
|
||||||
|
#
|
||||||
|
@sorted_input = sort {
|
||||||
|
my $aa=$a;
|
||||||
|
my $bb=$b;
|
||||||
|
(($aa =~ tr/_/_/) <= ($bb =~ tr/_/_/) && lc($a) cmp lc($b)) ||
|
||||||
|
lc($a) cmp lc($b);
|
||||||
|
} @input;
|
||||||
|
|
||||||
|
foreach (@sorted_input) {
|
||||||
|
walk_tree( {}, \@tree, $_, split '_', $_ );
|
||||||
|
}
|
||||||
|
|
||||||
|
$DEBUG && print Dumper @tree;
|
||||||
|
|
||||||
|
build_menu(\@tree, "menu.html", $OPT{menu_template}) if $OPT{build_menu};
|
183
bin/menumaker.OK
Executable file
183
bin/menumaker.OK
Executable file
|
@ -0,0 +1,183 @@
|
||||||
|
#!/usr/bin/perl -w
|
||||||
|
#
|
||||||
|
# menumaker - create nested menu file from list of filenames
|
||||||
|
# This program assumes that filenames are formatted as follows:
|
||||||
|
#
|
||||||
|
# category _ subcategory _ subsubcategory _ ... _ filename.extension
|
||||||
|
#
|
||||||
|
# It then writes a nested menu structure for these files to stdout
|
||||||
|
# The program tries to get the menu title from the files by searching
|
||||||
|
# for <!-- menu_title this is the menu title -->
|
||||||
|
# If there is no such comment in the file it uses the last part
|
||||||
|
# of the filename (after the last _, full filename if no _) as title.
|
||||||
|
#
|
||||||
|
# The program orders the menu lexicografically depth-first so menus
|
||||||
|
# can be put in any order by prepending the part name with a sequence
|
||||||
|
# numbner. Like so:
|
||||||
|
#
|
||||||
|
# 1-a.shtml
|
||||||
|
# 1-a_a.shtml
|
||||||
|
# 1-a_c.shtml
|
||||||
|
# 2-c.shtml
|
||||||
|
# 3-b.shtml
|
||||||
|
# 3-b_1-f.shtml
|
||||||
|
# 3-b_2-a.shtml
|
||||||
|
# 3-b_3-g.shtml
|
||||||
|
# 3-b_4-j_a_c.shtml
|
||||||
|
# 3-b_4-j_a_f.shtml
|
||||||
|
# ...etc.
|
||||||
|
|
||||||
|
my $DEBUG=0;
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
use HTML::Template;
|
||||||
|
if ($DEBUG) {
|
||||||
|
use Data::Dumper;
|
||||||
|
}
|
||||||
|
|
||||||
|
my %hash;
|
||||||
|
|
||||||
|
sub x {
|
||||||
|
my $parent = shift;
|
||||||
|
my $aref = shift;
|
||||||
|
my( $name, @kids ) = @_;
|
||||||
|
my $clicktrail = "";
|
||||||
|
unless( @$aref and $aref->[-1]{ name } eq $name ) {
|
||||||
|
push @{ $aref }, { name => $name, title => $name, parent => $parent };
|
||||||
|
}
|
||||||
|
if( @kids ) {
|
||||||
|
if( not exists $aref->[ -1 ]{ children } ) {
|
||||||
|
$aref->[ -1 ]{ children } = [];
|
||||||
|
# copy href and title to current for orphaned parent link, then remove orphan
|
||||||
|
if (exists $aref->[-2] and $aref->[-2]{ href } =~ /$name\.\S+/) {
|
||||||
|
$aref->[-1]{href} = $aref->[-2]{href};
|
||||||
|
$aref->[-1]{title} = $aref->[-2]{title};
|
||||||
|
splice(@$aref,-2,1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
x( $aref->[ -1 ], $aref->[ -1 ]{ children }, @kids );
|
||||||
|
} elsif (-f $_) {
|
||||||
|
# leaf node with accessible file: set href...
|
||||||
|
$aref->[-1]{href}=$_;
|
||||||
|
# create clicktrail...
|
||||||
|
my $ancestor = $parent;
|
||||||
|
while (exists ${$ancestor}{parent}) {
|
||||||
|
if (exists ${$ancestor}{href}) {
|
||||||
|
$clicktrail = " > <a href=\"${$ancestor}{href}\">${$ancestor}{title}</a>" . $clicktrail;
|
||||||
|
}
|
||||||
|
$ancestor = ${$ancestor}{parent};
|
||||||
|
}
|
||||||
|
if ($clicktrail ne "") {
|
||||||
|
open(FILE,">$_.clicktrail") or die "can not open $_.clicktrail:$!\n";
|
||||||
|
print FILE $clicktrail;
|
||||||
|
close FILE;
|
||||||
|
}
|
||||||
|
# ... and try to find menu title in file ...
|
||||||
|
open(FILE, "<$_") or die "can not open $_:$!\n";
|
||||||
|
while(<FILE>) {
|
||||||
|
chomp;
|
||||||
|
if (/\s*?<!--\s*menu_title\s*(.*?)\s*-->/i) {
|
||||||
|
# ... found title, replace placeholder (filename) with it
|
||||||
|
$aref->[-1]{title} = $1;
|
||||||
|
last;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
close FILE;
|
||||||
|
} else {
|
||||||
|
print "leaf node without file?\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
my @input;
|
||||||
|
my @sorted_input;
|
||||||
|
my @tree;
|
||||||
|
|
||||||
|
chomp() and push @input,$_ while <STDIN>;
|
||||||
|
|
||||||
|
@sorted_input = sort {
|
||||||
|
my $aa=$a;
|
||||||
|
my $bb=$b;
|
||||||
|
(($aa =~ tr/_/_/) <= ($bb =~ tr/_/_/) && lc($a) cmp lc($b)) ||
|
||||||
|
lc($a) cmp lc($b);
|
||||||
|
} @input;
|
||||||
|
|
||||||
|
|
||||||
|
foreach (@sorted_input) {
|
||||||
|
x( {}, \@tree, split '_', $_ );
|
||||||
|
}
|
||||||
|
|
||||||
|
$DEBUG && print Dumper @tree;
|
||||||
|
|
||||||
|
my $template = <<'HTML';
|
||||||
|
<TMPL_LOOP NAME="Parents">
|
||||||
|
|
||||||
|
<TMPL_UNLESS children>
|
||||||
|
<li><a<TMPL_IF href> href="<TMPL_VAR href>"</TMPL_IF>><TMPL_VAR title></a></li>
|
||||||
|
<TMPL_ELSE>
|
||||||
|
<li><a class="qmparent"<TMPL_IF href> href="<TMPL_VAR href>"</TMPL_IF>><TMPL_VAR title></a>
|
||||||
|
<ul>
|
||||||
|
<TMPL_LOOP children>
|
||||||
|
|
||||||
|
<TMPL_UNLESS children>
|
||||||
|
<li><a<TMPL_IF href> href="<TMPL_VAR href>"</TMPL_IF>><TMPL_VAR title></a></li>
|
||||||
|
<TMPL_ELSE>
|
||||||
|
<li><span class="qmdivider qmdividery" ></span></li>
|
||||||
|
<li><a class="qmparent"<TMPL_IF href> href="<TMPL_VAR href>"</TMPL_IF>><TMPL_VAR title></a>
|
||||||
|
<ul>
|
||||||
|
<TMPL_LOOP children>
|
||||||
|
|
||||||
|
<TMPL_UNLESS children>
|
||||||
|
<li><a<TMPL_IF href> href="<TMPL_VAR href>"</TMPL_IF>><TMPL_VAR title></a></li>
|
||||||
|
<TMPL_ELSE>
|
||||||
|
<li><span class="qmdivider qmdividery" ></span></li>
|
||||||
|
<li><a class="qmparent"<TMPL_IF href> href="<TMPL_VAR href>"</TMPL_IF>><TMPL_VAR title></a>
|
||||||
|
<ul>
|
||||||
|
<TMPL_LOOP children>
|
||||||
|
|
||||||
|
<TMPL_UNLESS children>
|
||||||
|
<li><a<TMPL_IF href> href="<TMPL_VAR href>"</TMPL_IF>><TMPL_VAR title></a></li>
|
||||||
|
<TMPL_ELSE>
|
||||||
|
<li><span class="qmdivider qmdividery" ></span></li>
|
||||||
|
<li><a class="qmparent"<TMPL_IF href> href="<TMPL_VAR href>"</TMPL_IF>><TMPL_VAR title></a>
|
||||||
|
<ul>
|
||||||
|
<TMPL_LOOP children>
|
||||||
|
|
||||||
|
<TMPL_UNLESS children>
|
||||||
|
<li><a<TMPL_IF href> href="<TMPL_VAR href>"</TMPL_IF>><TMPL_VAR title></a></li>
|
||||||
|
<TMPL_ELSE>
|
||||||
|
<li><span class="qmdivider qmdividery" ></span></li>
|
||||||
|
<li><a class="qmparent"<TMPL_IF href> href="<TMPL_VAR href>"</TMPL_IF>><TMPL_VAR title></a>
|
||||||
|
<ul>
|
||||||
|
<TMPL_LOOP children>
|
||||||
|
<li><a<TMPL_IF href> href="<TMPL_VAR href>"</TMPL_IF>><TMPL_VAR title></a></li>
|
||||||
|
</TMPL_LOOP>
|
||||||
|
</ul></li>
|
||||||
|
</TMPL_UNLESS>
|
||||||
|
|
||||||
|
</TMPL_LOOP>
|
||||||
|
</ul></li>
|
||||||
|
</TMPL_UNLESS>
|
||||||
|
|
||||||
|
</TMPL_LOOP>
|
||||||
|
</ul></li>
|
||||||
|
</TMPL_UNLESS>
|
||||||
|
|
||||||
|
</TMPL_LOOP>
|
||||||
|
</ul></li>
|
||||||
|
</TMPL_UNLESS>
|
||||||
|
|
||||||
|
</TMPL_LOOP>
|
||||||
|
</ul></li>
|
||||||
|
</TMPL_UNLESS>
|
||||||
|
</TMPL_LOOP>
|
||||||
|
HTML
|
||||||
|
|
||||||
|
my $t = HTML::Template->new (scalarref => \$template, die_on_bad_params => 0);
|
||||||
|
|
||||||
|
$t->param (Parents => \@tree);
|
||||||
|
# the template produces a lot of empty lines, remove these from the output...
|
||||||
|
my $clean_output = $t->output ();
|
||||||
|
$clean_output =~ s/\n\s*\n/\n/g;
|
||||||
|
print $clean_output;
|
||||||
|
|
||||||
|
|
183
bin/menumaker_works_but_messy
Executable file
183
bin/menumaker_works_but_messy
Executable file
|
@ -0,0 +1,183 @@
|
||||||
|
#!/usr/bin/perl -w
|
||||||
|
#
|
||||||
|
# sitemaker - create html files and nested menu based on templates and content
|
||||||
|
#
|
||||||
|
# Copyright (C) 2008 Frank de Lange
|
||||||
|
#
|
||||||
|
# This program is free software: you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU Affero General Public License as
|
||||||
|
# published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU Affero General Public License
|
||||||
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# This program assumes that filenames are formatted as follows:
|
||||||
|
#
|
||||||
|
# category _ subcategory _ subsubcategory _ ... _ filename
|
||||||
|
#
|
||||||
|
# It then creates html in the 'site' directory based on the content
|
||||||
|
# of those files. It also creates a 'menu.html' file in this directory
|
||||||
|
# which contains a nested unordered list reflecting the hierarchy of
|
||||||
|
# the site.
|
||||||
|
#
|
||||||
|
# Currently the script handles these special tags in the input files:
|
||||||
|
#
|
||||||
|
# <title>menu title</title>
|
||||||
|
# set menu title to 'menu title'
|
||||||
|
#
|
||||||
|
# <content>.....</content>
|
||||||
|
# set page content to whatever is between these tags
|
||||||
|
#
|
||||||
|
# <extra>.....</extra>
|
||||||
|
# set extra page content to whatever is between these tags
|
||||||
|
# extra content is generally rendered in the left column but that
|
||||||
|
# can be changed by editing the site CSS.
|
||||||
|
#
|
||||||
|
# Output files get the name of the input file with the .shtml extension.
|
||||||
|
#
|
||||||
|
# Templates are stored in the 'template' directory
|
||||||
|
#
|
||||||
|
# The program orders the menu lexicografically depth-first so menus
|
||||||
|
# can be put in any order by prepending the part name with a sequence
|
||||||
|
# numbner. Like so:
|
||||||
|
#
|
||||||
|
# 1-a
|
||||||
|
# 1-a_a
|
||||||
|
# 1-a_c
|
||||||
|
# 2-c
|
||||||
|
# 3-b
|
||||||
|
# 3-b_1-f
|
||||||
|
# 3-b_2-a
|
||||||
|
# 3-b_3-g
|
||||||
|
# 3-b_4-j_a_c
|
||||||
|
# 3-b_4-j_a_f
|
||||||
|
# ...etc.
|
||||||
|
|
||||||
|
my $DEBUG=0;
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
use HTML::Template;
|
||||||
|
use Getopt::Long;
|
||||||
|
if ($DEBUG) {
|
||||||
|
use Data::Dumper;
|
||||||
|
}
|
||||||
|
|
||||||
|
my %hash;
|
||||||
|
my %OPT = ( make_menu => 0,
|
||||||
|
make_html => 0,
|
||||||
|
debug => 0 );
|
||||||
|
|
||||||
|
sub x {
|
||||||
|
my $parent = shift;
|
||||||
|
my $aref = shift;
|
||||||
|
my( $name, @kids ) = @_;
|
||||||
|
unless( @$aref and $aref->[-1]{ name } eq $name ) {
|
||||||
|
push @{ $aref }, { name => $name, title => $name, parent => $parent };
|
||||||
|
}
|
||||||
|
if( @kids ) {
|
||||||
|
if( not exists $aref->[ -1 ]{ children } ) {
|
||||||
|
$aref->[ -1 ]{ children } = [];
|
||||||
|
# copy href and title to current for orphaned parent link, then remove orphan
|
||||||
|
if (exists $aref->[-2] and $aref->[-2]{ href } =~ /$name\.\S+/) {
|
||||||
|
$aref->[-1]{href} = $aref->[-2]{href};
|
||||||
|
$aref->[-1]{title} = $aref->[-2]{title};
|
||||||
|
splice(@$aref,-2,1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
x( $aref->[ -1 ], $aref->[ -1 ]{ children }, @kids );
|
||||||
|
} elsif (-f $_) {
|
||||||
|
# leaf node with accessible file: set href...
|
||||||
|
$aref->[-1]{href}="$_.shtml";
|
||||||
|
# create clicktrail...
|
||||||
|
my $ancestor = $parent;
|
||||||
|
while (exists ${$ancestor}{parent}) {
|
||||||
|
if (exists ${$ancestor}{href}) {
|
||||||
|
$aref->[-1]{clicktrail} = [] if not exists $aref->[-1]{clicktrail};
|
||||||
|
unshift(@{$aref->[-1]{clicktrail}}, { href => ${$ancestor}{href}, title => ${$ancestor}{title} });
|
||||||
|
}
|
||||||
|
$ancestor = ${$ancestor}{parent};
|
||||||
|
}
|
||||||
|
# ... and try to find menu title in file ...
|
||||||
|
system("mkdir site") if not -d "site";
|
||||||
|
open(INFILE, "<$_") or die "can not open $_:$!\n";
|
||||||
|
open(OUTFILE, ">site/$_.shtml") or die "can not open site/$_.shtml: $!\n";
|
||||||
|
my $input;
|
||||||
|
while(<INFILE>) {
|
||||||
|
$input .= $_;
|
||||||
|
}
|
||||||
|
close INFILE;
|
||||||
|
# parse input file
|
||||||
|
if ($input =~ /<title>\s*(.*?)\s*<\/title>/is) {
|
||||||
|
# ... found title, replace placeholder (filename) with it
|
||||||
|
$aref->[-1]{title} = $1;
|
||||||
|
}
|
||||||
|
if ($input =~ /<content>(.*)<\/content>/is) {
|
||||||
|
# ... found content...
|
||||||
|
$aref->[-1]{content} = $1;
|
||||||
|
}
|
||||||
|
if ($input =~ /<extra>(.*)<\/extra>/is) {
|
||||||
|
# ... found extra content
|
||||||
|
$aref->[-1]{extra} = $1;
|
||||||
|
}
|
||||||
|
# create output file
|
||||||
|
my $t = HTML::Template->new (filename => "template/adk.tmpl", die_on_bad_params => 0);
|
||||||
|
$t->param (content => $aref->[-1]{content});
|
||||||
|
$t->param (title => $aref->[-1]{title});
|
||||||
|
$t->param (extra => $aref->[-1]{extra}) if (exists $aref->[-1]{extra});
|
||||||
|
$t->param (clicktrail => $aref->[-1]{clicktrail}) if (exists $aref->[-1]{clicktrail});
|
||||||
|
print OUTFILE $t->output ();
|
||||||
|
close OUTFILE;
|
||||||
|
} else {
|
||||||
|
print "leaf node without file?\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
my @input;
|
||||||
|
my @sorted_input;
|
||||||
|
my @tree;
|
||||||
|
|
||||||
|
|
||||||
|
GetOptions("m!"=>\$OPT{make_menu},
|
||||||
|
"h!"=>\$OPT{make_html},
|
||||||
|
"d!"=>\$OPT{debug});
|
||||||
|
|
||||||
|
print "make_menu: $OPT{make_menu}\n";
|
||||||
|
print "make_html: $OPT{make_html}\n";
|
||||||
|
print "debug: $OPT{debug}\n";
|
||||||
|
|
||||||
|
foreach (@ARGV) {
|
||||||
|
print "$_\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
chomp() and push @input,$_ while <STDIN>;
|
||||||
|
|
||||||
|
@sorted_input = sort {
|
||||||
|
my $aa=$a;
|
||||||
|
my $bb=$b;
|
||||||
|
(($aa =~ tr/_/_/) <= ($bb =~ tr/_/_/) && lc($a) cmp lc($b)) ||
|
||||||
|
lc($a) cmp lc($b);
|
||||||
|
} @input;
|
||||||
|
|
||||||
|
|
||||||
|
foreach (@sorted_input) {
|
||||||
|
x( {}, \@tree, split '_', $_ );
|
||||||
|
}
|
||||||
|
|
||||||
|
$DEBUG && print Dumper @tree;
|
||||||
|
|
||||||
|
system("mkdir -p site/include") if not -d "site/include";
|
||||||
|
open(OUTFILE, ">site/include/menu.html") or die "can not open site/include/menu.html: $!\n";
|
||||||
|
my $t = HTML::Template->new (filename => "template/menu.tmpl", die_on_bad_params => 0);
|
||||||
|
$t->param (Parents => \@tree);
|
||||||
|
# the template produces a lot of empty lines, remove these from the output...
|
||||||
|
my $clean_output = $t->output ();
|
||||||
|
$clean_output =~ s/\n\s*\n/\n/g;
|
||||||
|
print OUTFILE $clean_output;
|
||||||
|
close OUTFILE;
|
9
bin/mirrortowindows
Executable file
9
bin/mirrortowindows
Executable file
|
@ -0,0 +1,9 @@
|
||||||
|
#!/usr/bin/perl
|
||||||
|
#
|
||||||
|
|
||||||
|
while (<STDIN>) {
|
||||||
|
chomp;
|
||||||
|
my $input = $_;
|
||||||
|
my $output = sprintf("%s",`iconv -f UTF-8 -t WINDOWS-1251 $_`);
|
||||||
|
print "in: $input\nout:$output\n";
|
||||||
|
}
|
15
bin/mmsdl
Executable file
15
bin/mmsdl
Executable file
|
@ -0,0 +1,15 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
prefix=mms://publicims.groovygecko.net/publicims/council/beva/
|
||||||
|
status=130
|
||||||
|
|
||||||
|
until [ $status == 0 ]; do
|
||||||
|
mimms -r ${prefix}${1}
|
||||||
|
status=$?
|
||||||
|
echo download terminated with status $status...
|
||||||
|
sleep 5
|
||||||
|
done
|
||||||
|
|
||||||
|
echo download should be complete...
|
||||||
|
|
||||||
|
|
16
bin/mmsdl-part
Executable file
16
bin/mmsdl-part
Executable file
|
@ -0,0 +1,16 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
prefix=mms://publicims.groovygecko.net/publicims/council/beva/
|
||||||
|
status=130
|
||||||
|
limit=1
|
||||||
|
|
||||||
|
until [ $status == 0 ]; do
|
||||||
|
mimms -t ${limit} -r ${prefix}${1}
|
||||||
|
status=$?
|
||||||
|
echo download terminated with status $status...
|
||||||
|
sleep 5
|
||||||
|
done
|
||||||
|
|
||||||
|
echo download should be complete...
|
||||||
|
|
||||||
|
|
16
bin/mmsdl-part2
Executable file
16
bin/mmsdl-part2
Executable file
|
@ -0,0 +1,16 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
prefix=mms://publicims.groovygecko.net/publicims/council/beva/
|
||||||
|
status=130
|
||||||
|
limit=2
|
||||||
|
|
||||||
|
until [ $status == 0 ]; do
|
||||||
|
mimms -t ${limit} -r ${prefix}${1}
|
||||||
|
status=$?
|
||||||
|
echo download terminated with status $status...
|
||||||
|
sleep 5
|
||||||
|
done
|
||||||
|
|
||||||
|
echo download should be complete...
|
||||||
|
|
||||||
|
|
21
bin/monitor
Executable file
21
bin/monitor
Executable file
|
@ -0,0 +1,21 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
monitor=DVI-0
|
||||||
|
bright=1
|
||||||
|
dim=0.5
|
||||||
|
|
||||||
|
case $0 in
|
||||||
|
monitor-bright)
|
||||||
|
xrandr --output $monitor --brightness $bright
|
||||||
|
exit
|
||||||
|
;;
|
||||||
|
monitor-dim)
|
||||||
|
xrandr --output $monitor --brightness $dim
|
||||||
|
exit
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
xrandr --output $monitor --brightness $1
|
||||||
|
exit
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
83
bin/mp3l
Executable file
83
bin/mp3l
Executable file
|
@ -0,0 +1,83 @@
|
||||||
|
#!/bin/sh
|
||||||
|
# mp3l - lookup songs in music database
|
||||||
|
|
||||||
|
host=behemoth.unternet.org
|
||||||
|
database=george
|
||||||
|
dba="mysql -h $host $database"
|
||||||
|
|
||||||
|
query () {
|
||||||
|
[ -n "$artist" ] && what=artist.artist
|
||||||
|
[ -n "$album" ] && what=${what:-}${what:+,}album.title
|
||||||
|
[ -n "$song" ] && what=${what:-}${what:+,}song.title
|
||||||
|
[ -n "$carrier" ] && what=${what:-}${what:+,}carrier.carriername
|
||||||
|
|
||||||
|
[ -n "$artist" ] && from=artist
|
||||||
|
[ -n "$album" ] && from=${from:-}${from:+,}album
|
||||||
|
[ -n "$song" ] && from=${from:-}${from:+,}song
|
||||||
|
[ -n "$carrier" ] && from=${from:-}${from:+,}carrier
|
||||||
|
|
||||||
|
[ -n "$artist" ] && where=${artist:+artist.artist like \"%}${artist}${artist:+%\"}${album:+ and artist.id=album.artistid}${song:+ and artist.id=song.artistid}
|
||||||
|
[ -n "$album" ] && where=${where:-}${where:+ and }${album:+album.title like \"%}${album}${album:+%\"}${carrier:+ and album.carrierid=carrier.id}
|
||||||
|
[ -n "$song" ] && where=${where:-}${where:+ and }${song:+song.title like \"%}${song}${song:+%\"}${album:+ and song.albumid=album.id}
|
||||||
|
[ -n "$carrier" ] && where=${where:-}${where:+ and }${carrier:+carrier.carriername like \"%}${carrier}${carrier:+%\"}
|
||||||
|
|
||||||
|
querystring="select $what from $from where $where"
|
||||||
|
echo $querystring|$dba $format
|
||||||
|
}
|
||||||
|
|
||||||
|
help () {
|
||||||
|
cat<<-"END"
|
||||||
|
|
||||||
|
mp3l (mp3locate) queries the music database for artists/albums/songs/carriers
|
||||||
|
|
||||||
|
-a <name> artist <name>
|
||||||
|
-b <name> album <name>
|
||||||
|
-s <name> song <name>
|
||||||
|
-c <name> carrier (CD/DVD/etc) name
|
||||||
|
-h this help message
|
||||||
|
|
||||||
|
END
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
# parameters
|
||||||
|
while getopts "ABSCa:b:s:c:ith" OPTION
|
||||||
|
do
|
||||||
|
case $OPTION in
|
||||||
|
h)
|
||||||
|
help
|
||||||
|
;;
|
||||||
|
A)
|
||||||
|
artist=%
|
||||||
|
;;
|
||||||
|
B)
|
||||||
|
album=%
|
||||||
|
;;
|
||||||
|
S)
|
||||||
|
song=%
|
||||||
|
;;
|
||||||
|
C)
|
||||||
|
carrier=%
|
||||||
|
;;
|
||||||
|
a)
|
||||||
|
artist=$OPTARG
|
||||||
|
;;
|
||||||
|
b)
|
||||||
|
album=$OPTARG
|
||||||
|
;;
|
||||||
|
s)
|
||||||
|
song=$OPTARG
|
||||||
|
;;
|
||||||
|
c)
|
||||||
|
carrier=$OPTARG
|
||||||
|
;;
|
||||||
|
t)
|
||||||
|
format="--table"
|
||||||
|
;;
|
||||||
|
[?]:)
|
||||||
|
help
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
query
|
4
bin/mskill
Executable file
4
bin/mskill
Executable file
|
@ -0,0 +1,4 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
kill $(ps aux|grep -i exe|grep -v gvfs|grep -v grep|awk '{print $2}')
|
||||||
|
|
1
bin/nbook
Symbolic link
1
bin/nbook
Symbolic link
|
@ -0,0 +1 @@
|
||||||
|
/home/frank/bin/books
|
1
bin/nfiction
Symbolic link
1
bin/nfiction
Symbolic link
|
@ -0,0 +1 @@
|
||||||
|
/home/frank/bin/books
|
2
bin/nm-applet-loop
Executable file
2
bin/nm-applet-loop
Executable file
|
@ -0,0 +1,2 @@
|
||||||
|
#!/bin/bash
|
||||||
|
while :;do nm-applet;done
|
220
bin/nxsession
Executable file
220
bin/nxsession
Executable file
|
@ -0,0 +1,220 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
#
|
||||||
|
# Simple script to create/resume a remote NX session and connect to it.
|
||||||
|
#
|
||||||
|
# NX can be used without specific client software. All that is needed is nxagent and nxproxy.
|
||||||
|
# The reason that this is more than 5 lines is the suspend/resume logic built in nxagent.
|
||||||
|
#
|
||||||
|
# This is replacement for freeNX and any NX client software.
|
||||||
|
#
|
||||||
|
# In order to use this you need:
|
||||||
|
# 1. NX base installed (nxagent, nxproxy, nxcomp) on the (remote) client, and (nxproxy, nxcomp) on the (local) server
|
||||||
|
# 2. bash, fuser, awk, xauth, hexdump on the (remote) client, bash on the (local) server
|
||||||
|
#
|
||||||
|
# freeNX or any NX client is NOT needed.
|
||||||
|
#
|
||||||
|
# In the simplest case just run (on the local server):
|
||||||
|
# nxsession :<x port> -h <host>
|
||||||
|
# (if -h is omitted a local session is created/resumed, you later connect to that session through another server)
|
||||||
|
#
|
||||||
|
# If -h is present, you'll be requested to log in the remote (client) machine via SSH.
|
||||||
|
# An NX session is automatically created/resumed on the client. When the session is created .nxstartup is execute
|
||||||
|
# to start default X applications. When the last X application has ended the remote NX session ends automatically.
|
||||||
|
# All traffic is tunelled through the SSH connection.
|
||||||
|
#
|
||||||
|
# If the requested session is currently used from another machine add -f to force suspension of that other server connection.
|
||||||
|
#
|
||||||
|
# An MIT-MAGIC-COOKIE is generated when the session is created and used to secure the remote session.
|
||||||
|
# In addition that cookie is passed to the (local) server to also secure the nxproxy connection.
|
||||||
|
#
|
||||||
|
# To suspend a session from the (local) server use:
|
||||||
|
# nxsession :<x port> -s
|
||||||
|
#
|
||||||
|
# nxsession can also be used standalone on the remote client to terminate the session (-t)
|
||||||
|
#
|
||||||
|
# Author: Lars Hofhansl
|
||||||
|
#
|
||||||
|
|
||||||
|
# settings
|
||||||
|
bandwidth="adsl"
|
||||||
|
timeout="86400"
|
||||||
|
dpi="72"
|
||||||
|
|
||||||
|
function usage() {
|
||||||
|
echo "$0 port [-h host] [-ssh ssh-options] [-s] [-f] | $0 port -C [-f] [-t]"
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
umask 0077 # make sure created files are not world/group read/writeable
|
||||||
|
|
||||||
|
SCRIPT=${HOME}/bin/$(basename $0)
|
||||||
|
|
||||||
|
while [ "${1+defined}" ]; do
|
||||||
|
case $1 in
|
||||||
|
-h)
|
||||||
|
HOST=$2
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-ssh)
|
||||||
|
SSH_OPTS=$2
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-s)
|
||||||
|
SUSPEND="1"
|
||||||
|
;;
|
||||||
|
-C)
|
||||||
|
CLIENT="1"
|
||||||
|
;;
|
||||||
|
-o)
|
||||||
|
NX_OPTS=$2
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-f)
|
||||||
|
FORCE=$1
|
||||||
|
;;
|
||||||
|
-t)
|
||||||
|
TERMINATE=$1
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
if [ -n "$X_DISPLAY" ]; then
|
||||||
|
usage
|
||||||
|
fi
|
||||||
|
X_DISPLAY=$1
|
||||||
|
NX_PORT=$(($X_DISPLAY+4000))
|
||||||
|
X_PORT=$(($X_DISPLAY+6000))
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
shift
|
||||||
|
done
|
||||||
|
if [ -z $X_DISPLAY ]; then
|
||||||
|
usage
|
||||||
|
fi
|
||||||
|
|
||||||
|
## CLIENT(REMOTE) ##
|
||||||
|
if [ -n "$CLIENT" ]; then
|
||||||
|
|
||||||
|
if [ -n "$SUSPEND" -o -n "$SSH" -o -n "$HOST" ]; then
|
||||||
|
usage
|
||||||
|
fi
|
||||||
|
|
||||||
|
NX_BASE=$HOME/.nx/C-$X_DISPLAY
|
||||||
|
unset DISPLAY
|
||||||
|
|
||||||
|
pid=`cat $NX_BASE/pid 2>/dev/null`
|
||||||
|
if grep -q '^nxagent' /proc/$pid/cmdline 2>/dev/null; then
|
||||||
|
# Agent is running
|
||||||
|
if /bin/fuser -s $NX_PORT/tcp; then
|
||||||
|
# and is active
|
||||||
|
if [ -z $FORCE ]; then
|
||||||
|
echo "Another session is active, use -f to force suspension of that session"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
# kill existing session if necessary
|
||||||
|
kill -HUP $pid # suspend agent
|
||||||
|
sleep 1
|
||||||
|
# kill the watchdog - if necessary
|
||||||
|
kill -HUP `ps --ppid $pid -o pid h` 2>/dev/null
|
||||||
|
sleep 1
|
||||||
|
fi
|
||||||
|
if [ -z $TERMINATE ]; then
|
||||||
|
# Agent is inactive... Resume
|
||||||
|
COOKIE=`xauth nextract - :$X_DISPLAY | awk '{print $9}'`
|
||||||
|
echo "nodelay=1,cleanup=0,accept=127.0.0.1,taint=1,cookie=$COOKIE,$NX_OPTS" > $NX_BASE/options
|
||||||
|
kill -HUP $pid
|
||||||
|
else
|
||||||
|
# we guaranteed that the session is suspended, it is save to kill it
|
||||||
|
# TERM should do it.. use -9 just in case
|
||||||
|
kill -TERM $pid || kill -9 $pid
|
||||||
|
xauth remove ":$X_DISPLAY"
|
||||||
|
echo "Terminated :$X_DISPLAY"
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
# Start Agent
|
||||||
|
|
||||||
|
if [ -n "$TERMINATE" ]; then
|
||||||
|
echo "No Agent running?"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if /bin/fuser -s $NX_PORT/tcp; then
|
||||||
|
echo "Port $NX_PORT is in use"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if /bin/fuser -s $X_PORT/tcp; then
|
||||||
|
echo "Display :$X_DISPLAY is in use"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# clear out existing Dir
|
||||||
|
rm -rf $NX_BASE
|
||||||
|
mkdir $NX_BASE
|
||||||
|
|
||||||
|
# secure the remote X session (generate MIT-MAGIC-COOKIE)
|
||||||
|
COOKIE=`head -c 16 /dev/urandom | hexdump -e '1/1 "%02x"'`
|
||||||
|
xauth add :$X_DISPLAY . $COOKIE
|
||||||
|
|
||||||
|
# run agent
|
||||||
|
echo "nodelay=1,cleanup=0,accept=127.0.0.1,taint=1,cookie=$COOKIE,$NX_OPTS" > $NX_BASE/options
|
||||||
|
nxagent -display nx/nx,options=$NX_BASE/options:$X_DISPLAY :$X_DISPLAY -R -timeout ${timeout} -nolisten tcp -persistent -noreset -dpi ${dpi} -forcenx -class TrueColor -auth $HOME/.Xauthority &> $NX_BASE/session &
|
||||||
|
echo $! > $NX_BASE/pid
|
||||||
|
# wait until nxagent is ready
|
||||||
|
while ! /bin/fuser -s $NX_PORT/tcp; do
|
||||||
|
sleep 1
|
||||||
|
done
|
||||||
|
# run startup script
|
||||||
|
env DISPLAY=:$X_DISPLAY $HOME/.nxstartup &> $NX_BASE/x_session &
|
||||||
|
fi
|
||||||
|
# send $COOKIE
|
||||||
|
echo "Cookie:$COOKIE" # write a line (the client will wait for this)
|
||||||
|
sleep 1
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
## LOCAL ##
|
||||||
|
|
||||||
|
if [ -n "$TERMINATE" ]; then
|
||||||
|
usage
|
||||||
|
fi
|
||||||
|
|
||||||
|
NX_BASE=$HOME/.nx/S-$X_DISPLAY
|
||||||
|
|
||||||
|
pid=`cat $NX_BASE/pid 2>/dev/null`
|
||||||
|
if [ -n "$SUSPEND" ]; then
|
||||||
|
if kill -HUP $pid 2>/dev/null; then
|
||||||
|
echo "Suspending Session"
|
||||||
|
else
|
||||||
|
echo "Already Suspended?"
|
||||||
|
fi
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -z "$HOST" ]; then
|
||||||
|
echo "Starting/Resuming LOCAL session"
|
||||||
|
RESULT=$($SCRIPT $X_DISPLAY -o link=100k -C $FORCE | head -n1)
|
||||||
|
else
|
||||||
|
echo "Starting/Resuming session on $HOST"
|
||||||
|
# | head -n1 waits for the first line from the remote machine
|
||||||
|
RESULT=$(ssh -T -f -o ExitOnForwardFailure=yes -L$NX_PORT:localhost:$NX_PORT $HOST $SSH_OPTS $SCRIPT $X_DISPLAY -o link=$bandwidth -C $FORCE | head -n1)
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "${RESULT:0:6}" != "Cookie" ]; then
|
||||||
|
echo "Client: $RESULT"
|
||||||
|
exit 1;
|
||||||
|
fi
|
||||||
|
|
||||||
|
COOKIE=${RESULT:7}
|
||||||
|
|
||||||
|
# clear existing dir
|
||||||
|
rm -rf $NX_BASE
|
||||||
|
mkdir $NX_BASE
|
||||||
|
|
||||||
|
echo "Running nxproxy... Establishing connection may take a few seconds"
|
||||||
|
echo "cookie=$COOKIE" > $NX_BASE/options
|
||||||
|
nxproxy options=$NX_BASE/options -S localhost:$X_DISPLAY &> $NX_BASE/session &
|
||||||
|
echo $! > $NX_BASE/pid
|
||||||
|
|
||||||
|
fi
|
||||||
|
|
174
bin/open_with_linux.py
Executable file
174
bin/open_with_linux.py
Executable file
|
@ -0,0 +1,174 @@
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
from __future__ import print_function
|
||||||
|
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
import json
|
||||||
|
import struct
|
||||||
|
import subprocess
|
||||||
|
|
||||||
|
VERSION = '7.2.6'
|
||||||
|
|
||||||
|
try:
|
||||||
|
sys.stdin.buffer
|
||||||
|
|
||||||
|
# Python 3.x version
|
||||||
|
# Read a message from stdin and decode it.
|
||||||
|
def getMessage():
|
||||||
|
rawLength = sys.stdin.buffer.read(4)
|
||||||
|
if len(rawLength) == 0:
|
||||||
|
sys.exit(0)
|
||||||
|
messageLength = struct.unpack('@I', rawLength)[0]
|
||||||
|
message = sys.stdin.buffer.read(messageLength).decode('utf-8')
|
||||||
|
return json.loads(message)
|
||||||
|
|
||||||
|
# Send an encoded message to stdout
|
||||||
|
def sendMessage(messageContent):
|
||||||
|
encodedContent = json.dumps(messageContent).encode('utf-8')
|
||||||
|
encodedLength = struct.pack('@I', len(encodedContent))
|
||||||
|
|
||||||
|
sys.stdout.buffer.write(encodedLength)
|
||||||
|
sys.stdout.buffer.write(encodedContent)
|
||||||
|
sys.stdout.buffer.flush()
|
||||||
|
|
||||||
|
except AttributeError:
|
||||||
|
# Python 2.x version (if sys.stdin.buffer is not defined)
|
||||||
|
print('Python 3.2 or newer is required.')
|
||||||
|
sys.exit(-1)
|
||||||
|
|
||||||
|
|
||||||
|
def install():
|
||||||
|
home_path = os.getenv('HOME')
|
||||||
|
|
||||||
|
manifest = {
|
||||||
|
'name': 'open_with',
|
||||||
|
'description': 'Open With native host',
|
||||||
|
'path': os.path.realpath(__file__),
|
||||||
|
'type': 'stdio',
|
||||||
|
}
|
||||||
|
locations = {
|
||||||
|
'chrome': os.path.join(home_path, '.config', 'google-chrome', 'NativeMessagingHosts'),
|
||||||
|
'chrome-beta': os.path.join(home_path, '.config', 'google-chrome-beta', 'NativeMessagingHosts'),
|
||||||
|
'chrome-unstable': os.path.join(home_path, '.config', 'google-chrome-unstable', 'NativeMessagingHosts'),
|
||||||
|
'chromium': os.path.join(home_path, '.config', 'chromium', 'NativeMessagingHosts'),
|
||||||
|
'firefox': os.path.join(home_path, '.mozilla', 'native-messaging-hosts'),
|
||||||
|
'thunderbird': os.path.join(home_path, '.thunderbird', 'native-messaging-hosts'),
|
||||||
|
}
|
||||||
|
filename = 'open_with.json'
|
||||||
|
|
||||||
|
for browser, location in locations.items():
|
||||||
|
if os.path.exists(os.path.dirname(location)):
|
||||||
|
if not os.path.exists(location):
|
||||||
|
os.mkdir(location)
|
||||||
|
|
||||||
|
browser_manifest = manifest.copy()
|
||||||
|
if browser in ['firefox', 'thunderbird']:
|
||||||
|
browser_manifest['allowed_extensions'] = ['openwith@darktrojan.net']
|
||||||
|
else:
|
||||||
|
browser_manifest['allowed_origins'] = [
|
||||||
|
'chrome-extension://cogjlncmljjnjpbgppagklanlcbchlno/', # Chrome
|
||||||
|
'chrome-extension://fbmcaggceafhobjkhnaakhgfmdaadhhg/', # Opera
|
||||||
|
]
|
||||||
|
|
||||||
|
with open(os.path.join(location, filename), 'w') as file:
|
||||||
|
file.write(
|
||||||
|
json.dumps(browser_manifest, indent=2, separators=(',', ': '), sort_keys=True).replace(' ', '\t') + '\n'
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def _read_desktop_file(path):
|
||||||
|
with open(path, 'r') as desktop_file:
|
||||||
|
current_section = None
|
||||||
|
name = None
|
||||||
|
command = None
|
||||||
|
for line in desktop_file:
|
||||||
|
if line[0] == '[':
|
||||||
|
current_section = line[1:-2]
|
||||||
|
if current_section != 'Desktop Entry':
|
||||||
|
continue
|
||||||
|
|
||||||
|
if line.startswith('Name='):
|
||||||
|
name = line[5:].strip()
|
||||||
|
elif line.startswith('Exec='):
|
||||||
|
command = line[5:].strip()
|
||||||
|
|
||||||
|
return {
|
||||||
|
'name': name,
|
||||||
|
'command': command
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def find_browsers():
|
||||||
|
apps = [
|
||||||
|
'Chrome',
|
||||||
|
'Chromium',
|
||||||
|
'chromium',
|
||||||
|
'chromium-browser',
|
||||||
|
'firefox',
|
||||||
|
'Firefox',
|
||||||
|
'Google Chrome',
|
||||||
|
'google-chrome',
|
||||||
|
'opera',
|
||||||
|
'Opera',
|
||||||
|
'SeaMonkey',
|
||||||
|
'seamonkey',
|
||||||
|
]
|
||||||
|
paths = [
|
||||||
|
os.path.join(os.getenv('HOME'), '.local/share/applications'),
|
||||||
|
'/usr/local/share/applications',
|
||||||
|
'/usr/share/applications'
|
||||||
|
]
|
||||||
|
suffix = '.desktop'
|
||||||
|
|
||||||
|
results = []
|
||||||
|
for p in paths:
|
||||||
|
for a in apps:
|
||||||
|
fp = os.path.join(p, a) + suffix
|
||||||
|
if os.path.exists(fp):
|
||||||
|
results.append(_read_desktop_file(fp))
|
||||||
|
return results
|
||||||
|
|
||||||
|
|
||||||
|
def listen():
|
||||||
|
receivedMessage = getMessage()
|
||||||
|
if receivedMessage == 'ping':
|
||||||
|
sendMessage({
|
||||||
|
'version': VERSION,
|
||||||
|
'file': os.path.realpath(__file__)
|
||||||
|
})
|
||||||
|
elif receivedMessage == 'find':
|
||||||
|
sendMessage(find_browsers())
|
||||||
|
else:
|
||||||
|
for k, v in os.environ.items():
|
||||||
|
if k.startswith('MOZ_'):
|
||||||
|
try:
|
||||||
|
os.unsetenv(k)
|
||||||
|
except:
|
||||||
|
os.environ[k] = ''
|
||||||
|
|
||||||
|
devnull = open(os.devnull, 'w')
|
||||||
|
subprocess.Popen(receivedMessage, stdout=devnull, stderr=devnull)
|
||||||
|
sendMessage(None)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
if len(sys.argv) == 2:
|
||||||
|
if sys.argv[1] == 'install':
|
||||||
|
install()
|
||||||
|
sys.exit(0)
|
||||||
|
elif sys.argv[1] == 'find_browsers':
|
||||||
|
print(find_browsers())
|
||||||
|
sys.exit(0)
|
||||||
|
|
||||||
|
allowed_extensions = [
|
||||||
|
'openwith@darktrojan.net',
|
||||||
|
'chrome-extension://cogjlncmljjnjpbgppagklanlcbchlno/',
|
||||||
|
'chrome-extension://fbmcaggceafhobjkhnaakhgfmdaadhhg/',
|
||||||
|
]
|
||||||
|
for ae in allowed_extensions:
|
||||||
|
if ae in sys.argv:
|
||||||
|
listen()
|
||||||
|
sys.exit(0)
|
||||||
|
|
||||||
|
print('This is the Open With native helper, version %s.' % VERSION)
|
||||||
|
print('Run this script again with the word "install" after the file name to install.')
|
115
bin/osdmixer
Executable file
115
bin/osdmixer
Executable file
|
@ -0,0 +1,115 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Name and description
|
||||||
|
name="mixer-osd"
|
||||||
|
description="Provides an OSD (On Screen Display) for basic mixer operations."
|
||||||
|
|
||||||
|
# Some variables
|
||||||
|
default_color="green"
|
||||||
|
acolor=$default_color
|
||||||
|
|
||||||
|
# This program depends on aosd_cat and amixer (alsa-utils in Debian)
|
||||||
|
deps="aosd_cat amixer"
|
||||||
|
|
||||||
|
function usage()
|
||||||
|
{
|
||||||
|
show_name=$1
|
||||||
|
error=$2
|
||||||
|
|
||||||
|
# Show name and description only if explicitly stated
|
||||||
|
if [[ $show_name == 1 ]] ; then
|
||||||
|
echo -e " $name - $description\n"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Show an error message, if present
|
||||||
|
if [[ $error != '' ]] ; then
|
||||||
|
echo -e "\033[1m$error\033[0m\n"
|
||||||
|
fi
|
||||||
|
|
||||||
|
cat << EOF
|
||||||
|
Usage:
|
||||||
|
$name -u|-d|-m
|
||||||
|
$name -h
|
||||||
|
|
||||||
|
Options:
|
||||||
|
-u Volume up
|
||||||
|
-d Volume down
|
||||||
|
-m Mute/Unmute
|
||||||
|
|
||||||
|
-h Shows this help.
|
||||||
|
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
|
||||||
|
# Check for dependencies
|
||||||
|
for dep in $deps ; do
|
||||||
|
if [[ `which $dep` == '' ]] ; then
|
||||||
|
echo "Please, install $dep for $name to work!"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
# Managing options
|
||||||
|
while getopts "hudm" option ; do
|
||||||
|
case $option in
|
||||||
|
h )
|
||||||
|
usage 1
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
u )
|
||||||
|
aarg="Volume ↑ $(amixer -c 0 sset Master 2+ unmute | tail -1 | awk '{print $4}' | tr -d '[]')"
|
||||||
|
acolor="royalblue"
|
||||||
|
;;
|
||||||
|
d )
|
||||||
|
aarg="Volume ↓ $(amixer -c 0 sset Master 2- unmute | tail -1 | awk '{print $4}' | tr -d '[]')"
|
||||||
|
acolor="gray50"
|
||||||
|
;;
|
||||||
|
m )
|
||||||
|
case $(amixer -c 0 sset Master toggle | tail -1 | awk '{print $6}' | tr -d '[]') in
|
||||||
|
on )
|
||||||
|
aarg="UNMUTED"
|
||||||
|
acolor="green"
|
||||||
|
;;
|
||||||
|
off )
|
||||||
|
aarg="MUTED"
|
||||||
|
acolor="red"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
;;
|
||||||
|
\? )
|
||||||
|
echo -e "Please type ${name} -h for help on usage."
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
shift $(($OPTIND - 1))
|
||||||
|
|
||||||
|
# This program doesn't accept any other argument than flag-options
|
||||||
|
if [[ $# -gt 0 ]] ; then
|
||||||
|
usage 0 "Invalid argument (\`$1')."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# One have to either mute/unmute or change the volume,
|
||||||
|
# otherwise program will exit with error code 1
|
||||||
|
if [[ -z $aarg ]] ; then
|
||||||
|
usage 0 "Please, mute/unmute or change the volume!"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Kills any instance of aosd_cat
|
||||||
|
pkill aosd_cat >/dev/null 2>&1
|
||||||
|
|
||||||
|
# Performs osd-ized volume changes
|
||||||
|
echo "$aarg" | aosd_cat \
|
||||||
|
--fore-color=$acolor \
|
||||||
|
--position 4 \
|
||||||
|
--font="Droid Sans Bold 32" \
|
||||||
|
--y-offset=300 \
|
||||||
|
--transparency=2 \
|
||||||
|
--back-color="gray10" \
|
||||||
|
--back-opacity=50 \
|
||||||
|
--padding=20 \
|
||||||
|
--fade-full=1500 >/dev/null 2>&1 &
|
||||||
|
|
||||||
|
exit $?
|
11
bin/pdfreduce
Executable file
11
bin/pdfreduce
Executable file
|
@ -0,0 +1,11 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
if [ "$2"x = "x" ]; then
|
||||||
|
echo use: $0 input.pdf output.pdf
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
#gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/ebook -dNOPAUSE -dQUIET -dBATCH -sOutputFile=$2 $1
|
||||||
|
#gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/printer -dNOPAUSE -dQUIET -dBATCH -sOutputFile=$2 $1
|
||||||
|
#gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dUseCIEColor -dPDFSETTINGS=/ebook -dNOPAUSE -dQUIET -dBATCH -sOutputFile=$2 $1
|
||||||
|
gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dUseCIEColor -dPDFSETTINGS=/ebook -dNOPAUSE -dQUIET -dBATCH -sOutputFile="$2" "$1"
|
8
bin/pharo
Executable file
8
bin/pharo
Executable file
|
@ -0,0 +1,8 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
export PHARO_DIR=/opt/pharo5.0
|
||||||
|
export PHARO_IMAGE=${PHARO_DIR}/shared/Pharo5.0.image
|
||||||
|
export PATH=${PHARO_DIR}/bin:${PATH}
|
||||||
|
|
||||||
|
pharo
|
||||||
|
|
34
bin/phone_import
Executable file
34
bin/phone_import
Executable file
|
@ -0,0 +1,34 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
destination="/net/media/photos/import/$(date +'%Y-%m-%d')"
|
||||||
|
devices=$(adb devices|grep -v 'List of devices attached'|grep device|cut -f 1)
|
||||||
|
|
||||||
|
for device in $devices; do
|
||||||
|
storages=$(adb -s "$device" shell ls /storage|grep '....-....')
|
||||||
|
for storage in $storages "self/primary"; do
|
||||||
|
label=${storage/\//-}
|
||||||
|
dcim=$(adb shell "ls /storage/$storage"|grep -i dcim)
|
||||||
|
if [ -n $dcim ]; then
|
||||||
|
store="/storage/$storage/$dcim"
|
||||||
|
seen="/net/media/photos/import/SEEN/${device}-${label}"
|
||||||
|
[ -f ${seen} ] || touch ${seen}
|
||||||
|
temp=$(mktemp -d)
|
||||||
|
current="${temp}/${device}"
|
||||||
|
|
||||||
|
mkdir -p "${destination}"
|
||||||
|
mkdir -p "${temp}"
|
||||||
|
|
||||||
|
(adb -s ${device} shell "cd ${store} && find . -type f \! -path '*/.*'"|sed -e 's/^\.\///'|sort) > ${current}
|
||||||
|
|
||||||
|
for f in $(comm -13 <(sort ${seen}) ${current}); do
|
||||||
|
adb -s ${device} pull ${store}/${f} ${destination} >& /dev/null
|
||||||
|
echo "${f}" >> ${seen}
|
||||||
|
echo -n "."
|
||||||
|
done
|
||||||
|
|
||||||
|
echo " "
|
||||||
|
|
||||||
|
rm -rf ${temp}
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
done
|
34
bin/phone_import-emma
Executable file
34
bin/phone_import-emma
Executable file
|
@ -0,0 +1,34 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
destination="/net/media/photos/import/$(date +'%Y-%m-%d')"
|
||||||
|
devices=$(adb devices|grep -v 'List of devices attached'|grep device|cut -f 1)
|
||||||
|
|
||||||
|
for device in $devices; do
|
||||||
|
storages=$(adb -s "$device" shell ls /storage|grep '....-....')
|
||||||
|
for storage in $storages "self/primary"; do
|
||||||
|
label=${storage/\//-}
|
||||||
|
dcim=$(adb shell "ls /storage/$storage"|grep -i dcim)
|
||||||
|
if [ -n $dcim ]; then
|
||||||
|
store="/storage/$storage/$dcim"
|
||||||
|
seen="/net/media/photos/import/SEEN/${device}-${label}"
|
||||||
|
[ -f ${seen} ] || touch ${seen}
|
||||||
|
temp=$(mktemp -d)
|
||||||
|
current="${temp}/${device}"
|
||||||
|
|
||||||
|
mkdir -p "${destination}"
|
||||||
|
mkdir -p "${temp}"
|
||||||
|
|
||||||
|
(adb -s ${device} shell "cd ${store} && find . -type f \! -path '*/.*'"|sed -e 's/^\.\///'|sort) > ${current}
|
||||||
|
|
||||||
|
for f in $(comm -13 <(sort ${seen}) ${current}); do
|
||||||
|
adb -s ${device} pull ${store}/${f} ${destination} >& /dev/null
|
||||||
|
echo "${f}" >> ${seen}
|
||||||
|
echo -n "."
|
||||||
|
done
|
||||||
|
|
||||||
|
echo " "
|
||||||
|
|
||||||
|
rm -rf ${temp}
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
done
|
37
bin/phone_import-emma.old
Executable file
37
bin/phone_import-emma.old
Executable file
|
@ -0,0 +1,37 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
destination="/net/behemoth/photos/import/$(date +'%Y-%m-%d')"
|
||||||
|
mountpoint="/home/frank/cam"
|
||||||
|
camera="/dev/disk/by-label/MB526-E"
|
||||||
|
store="dcim/Camera"
|
||||||
|
camera_id=MOTOROLA_DEFY-emma
|
||||||
|
# volume_id=$(blkid -o value -s UUID ${camera})
|
||||||
|
seen="/net/behemoth/photos/import/SEEN/${camera_id}"
|
||||||
|
temp=$(mktemp -d)
|
||||||
|
current="${temp}/${camera_id}"
|
||||||
|
|
||||||
|
#fusermount -u "${mountpoint}"
|
||||||
|
#fusefat -o ro "${camera}" "${mountpoint}"
|
||||||
|
sudo umount "${mountpoint}"
|
||||||
|
sudo mount -o ro,uid=1000,check=r,shortname=lower "${camera}" "${mountpoint}"
|
||||||
|
mkdir -p "${destination}"
|
||||||
|
mkdir -p "${temp}"
|
||||||
|
|
||||||
|
(cd ${mountpoint}/${store} && find . -type f|sed -e 's/^\.\///'|sort) > ${current}
|
||||||
|
|
||||||
|
for f in $(diff -u ${seen} ${current}|grep '^+[^+]'|sed -e 's/^+//'); do
|
||||||
|
cp "${mountpoint}"/"${store}"/"${f}" "${destination}"
|
||||||
|
echo $f >> ${seen}
|
||||||
|
echo -n "."
|
||||||
|
done
|
||||||
|
|
||||||
|
echo " "
|
||||||
|
|
||||||
|
rm -rf ${temp}
|
||||||
|
|
||||||
|
# ls "${mountpoint}"/"${store}"|while read f; do echo -n "."; cp "${mountpoint}"/"${store}"/"${f}" "${destination}"; done; echo " "
|
||||||
|
|
||||||
|
|
||||||
|
#fusermount -u "${mountpoint}"
|
||||||
|
sudo umount "${mountpoint}"
|
||||||
|
|
30
bin/phone_import-emma2
Executable file
30
bin/phone_import-emma2
Executable file
|
@ -0,0 +1,30 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
destination="/net/behemoth/photos/import/$(date +'%Y-%m-%d')"
|
||||||
|
devices=$(adb devices|grep -v 'List of devices attached'|grep device|cut -f 1)
|
||||||
|
|
||||||
|
for device in $devices; do
|
||||||
|
dcim=$(adb shell "ls /storage/3731-3236"|grep -i dcim)
|
||||||
|
if [ -n $dcim ]; then
|
||||||
|
store="/storage/3731-3236/DCIM"
|
||||||
|
seen="/net/behemoth/photos/import/SEEN/${device}"
|
||||||
|
[ -f ${seen} ] || touch ${seen}
|
||||||
|
temp=$(mktemp -d)
|
||||||
|
current="${temp}/${device}"
|
||||||
|
|
||||||
|
mkdir -p "${destination}"
|
||||||
|
mkdir -p "${temp}"
|
||||||
|
|
||||||
|
(adb -s ${device} shell "cd ${store} && find . -type f \! -path '*/.*'"|sed -e 's/^\.\///'|sort) > ${current}
|
||||||
|
|
||||||
|
for f in $(comm -13 <(sort ${seen}) ${current}); do
|
||||||
|
adb -s ${device} pull ${store}/${f} ${destination} >& /dev/null
|
||||||
|
echo "${f}" >> ${seen}
|
||||||
|
echo -n "."
|
||||||
|
done
|
||||||
|
|
||||||
|
echo " "
|
||||||
|
|
||||||
|
rm -rf ${temp}
|
||||||
|
fi
|
||||||
|
done
|
4
bin/pirateplayer
Executable file
4
bin/pirateplayer
Executable file
|
@ -0,0 +1,4 @@
|
||||||
|
#!/bin/sh
|
||||||
|
#ssh behemoth xpra start :100 --start-child=pirateplayer --exit-with-children
|
||||||
|
#xpra attach ssh:behemoth:100
|
||||||
|
ssh -X behemoth pirateplayer
|
22
bin/plsparse.pl
Executable file
22
bin/plsparse.pl
Executable file
|
@ -0,0 +1,22 @@
|
||||||
|
#!/usr/bin/perl -w
|
||||||
|
|
||||||
|
while (<STDIN>) {
|
||||||
|
chomp;
|
||||||
|
s/\ //g;
|
||||||
|
if (/(\d{1,2} - ).*mp3=(.*\.mp3).*<b>(.*)<\/b>.*/i) {
|
||||||
|
my $url='http://hoorspelweb.com/stream/index.php?cmd=stream&mp3=' . $2 . '&dir_id=0';
|
||||||
|
my $name=$1 . $3;
|
||||||
|
$name =~ s/\s/_/g;
|
||||||
|
system("wget -O '" . $name . ".mp3' '" . $url . "'");
|
||||||
|
} elsif (/.*mp3=(.*\.mp3).*<b>(.*)<\/b>.*/i) {
|
||||||
|
my $url='http://hoorspelweb.com/stream/index.php?cmd=stream&mp3=' . $1 . '&dir_id=0';
|
||||||
|
my $name=$2;
|
||||||
|
$name =~ s/\s/_/g;
|
||||||
|
system("wget -O '" . $name . ".mp3' '" . $url . "'");
|
||||||
|
} elsif (/a href=".*mp3=(.*\.mp3).*">(.*)<\/a>.*/i) {
|
||||||
|
my $url='http://hoorspelweb.com/stream/index.php?cmd=stream&mp3=' . $1 . '&dir_id=0';
|
||||||
|
my $name=$2;
|
||||||
|
$name =~ s/\s/_/g;
|
||||||
|
system("wget -O '" . $name . ".mp3' '" . $url . "'");
|
||||||
|
}
|
||||||
|
}
|
8
bin/plsparse2.pl
Executable file
8
bin/plsparse2.pl
Executable file
|
@ -0,0 +1,8 @@
|
||||||
|
#!/usr/bin/perl -w
|
||||||
|
|
||||||
|
#use Mojo::DOM;
|
||||||
|
use Mojo::UserAgent;
|
||||||
|
|
||||||
|
my $ua = Mojo::UserAgent->new;
|
||||||
|
|
||||||
|
print $ua->max_redirects(5)->get($ARGV[0])->res->dom('p.title > a.title')->pluck('text')->shuffle;
|
16
bin/pop_clean_all
Executable file
16
bin/pop_clean_all
Executable file
|
@ -0,0 +1,16 @@
|
||||||
|
#!/bin/sh
|
||||||
|
username=$1
|
||||||
|
password=$2
|
||||||
|
MAX_MESS=$3
|
||||||
|
[ $# -eq 0 ] && exit 1 || :
|
||||||
|
sleep 2
|
||||||
|
echo USER $username
|
||||||
|
sleep 1
|
||||||
|
echo PASS $password
|
||||||
|
sleep 2
|
||||||
|
for (( j = 1 ; j <= $MAX_MESS; j++ ))
|
||||||
|
do
|
||||||
|
echo DELE $j
|
||||||
|
sleep 1
|
||||||
|
done
|
||||||
|
echo QUIT
|
38
bin/psduplex
Executable file
38
bin/psduplex
Executable file
|
@ -0,0 +1,38 @@
|
||||||
|
#!/usr/bin/perl -s
|
||||||
|
|
||||||
|
# psduplex - filter to insert PostScript code to set/unset duplex mode
|
||||||
|
# Steve Kinzler, kinzler@cs.indiana.edu, Oct 91
|
||||||
|
# http://www.cs.indiana.edu/~kinzler/home.html#unix
|
||||||
|
|
||||||
|
# Note: This was found not to be effective with the "Generic postscript
|
||||||
|
# printer" PPD (vs "Generic PostScript Printer") from the foomatic
|
||||||
|
# printer database on RHEL5 2008-07-08.
|
||||||
|
|
||||||
|
$usage = "usage: $0 [ -e | -t ] [ file ... ]
|
||||||
|
-e use edge orientation (default)
|
||||||
|
-t use tumble orientation\n";
|
||||||
|
die $usage if $h;
|
||||||
|
|
||||||
|
$_ = <>;
|
||||||
|
print;
|
||||||
|
unless (/^%!/) { # not PostScript, pass through as is
|
||||||
|
while (<>) { print }
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (<>) {
|
||||||
|
last unless /^\s*%/;
|
||||||
|
print;
|
||||||
|
}
|
||||||
|
|
||||||
|
print "statusdict begin\n\ttrue setduplexmode\n";
|
||||||
|
print "\ttrue settumble\n" if $t;
|
||||||
|
print "end\n";
|
||||||
|
|
||||||
|
print;
|
||||||
|
while (<>) { print }
|
||||||
|
|
||||||
|
print "statusdict begin\n\tfalse setduplexmode\n";
|
||||||
|
print "\tfalse settumble\n" if $t;
|
||||||
|
print "end\n";
|
||||||
|
|
5
bin/qjackctl_poststartup
Executable file
5
bin/qjackctl_poststartup
Executable file
|
@ -0,0 +1,5 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
# create Headphone channel on internal hardware
|
||||||
|
alsa_out -j Headphone -d hw:0 -q 0 & 2>1 > .jack_log
|
||||||
|
|
5
bin/qjackctl_prestartup
Executable file
5
bin/qjackctl_prestartup
Executable file
|
@ -0,0 +1,5 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
# kill pulseaudio if it happens to be running
|
||||||
|
killall pulseaudio
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue