initial commit, added everything old from my scripts repo
This commit is contained in:
commit
5e60ee959c
|
@ -0,0 +1,41 @@
|
|||
this is my little mobot project.
|
||||
|
||||
the concept is not to spend hundreds of hours to implement some massive
|
||||
monitoring tool like nagios or something like this.
|
||||
instead i want to use some simple message/notification scripts
|
||||
which exactly tell me what i need to know.
|
||||
|
||||
the first thing i have here is the df bot. it sends me a short jabber message
|
||||
when one or more disks on the serving machine reaching a preconfigured threshold
|
||||
(example: 90% disk usage).
|
||||
|
||||
another tool i find really useful is the pingbot (ping.sh)
|
||||
it works pretty much the same as the dfbot.
|
||||
|
||||
feel free to use or improve this handy tools!
|
||||
|
||||
|
||||
=== install notes ===
|
||||
|
||||
1. copy the scrip somewhere on your machine
|
||||
you get the df.sh on gitorious.org
|
||||
http://gitorious.org/sn/scripts/trees/master/mobots/df.sh
|
||||
|
||||
2. create the configfile
|
||||
use the df.conf.sample to create a config and put this file anywhere on the same machine
|
||||
http://gitorious.org/sn/scripts/trees/master/mobots/df.conf.sample
|
||||
|
||||
3. create a cronjob for it
|
||||
add a line like this to your /etc/crontab
|
||||
*/2 * * * * root /bin/bash --login /path/to/the/script/df.sh /path/to/configfile/df.conf >> /path/to/logfile/df.log
|
||||
or (if you use the default configpath /etc/mobots)
|
||||
*/5 * * * * root /bin/bash --login /path/to/script/df.sh >> /var/log/mobots/df.log
|
||||
|
||||
the logdirectory must exist
|
||||
|
||||
after this you have to restart your cron with something like
|
||||
service cron restart
|
||||
|
||||
of course there are several ways to create a cronjob but this is probably the easiest way
|
||||
|
||||
any questions? mail me! (david@socialnerds.org)
|
|
@ -0,0 +1,144 @@
|
|||
#!/bin/bash
|
||||
|
||||
# script to test bandwidth to ssh server
|
||||
|
||||
# it copies a 10MB file to the server and
|
||||
# loads it back down again.
|
||||
|
||||
# usage: bandwidth user@server
|
||||
# if no server is applied a default server is used
|
||||
|
||||
# defaults
|
||||
sshserver=birdofprey
|
||||
sshuser=david
|
||||
sshpath="/tmp"
|
||||
localpath="/tmp"
|
||||
file=$RANDOM
|
||||
size=10 #MB
|
||||
silent=1
|
||||
|
||||
# config
|
||||
if [ $# -ne 0 ]; then
|
||||
sshuser=$(echo $1 | sed 's/@.*//')
|
||||
sshserver=$(echo $1 | sed 's/.*@//')
|
||||
if [ $# -gt 1 ]; then
|
||||
echo "too much arguments. exiting."
|
||||
exit 1
|
||||
fi
|
||||
if [ $silent -ne 1 ]; then
|
||||
echo "using custom server. ($sshuser@$sshserver)"
|
||||
fi
|
||||
else
|
||||
if [ $silent -ne 1 ]; then
|
||||
echo "using default server. ($sshuser@$sshserver)"
|
||||
fi
|
||||
fi
|
||||
|
||||
# preflight
|
||||
command -v scp &> /dev/null
|
||||
if [[ $? -ne 0 ]]; then
|
||||
echo "scp must be installed first. exiting."
|
||||
exit 1
|
||||
fi
|
||||
command -v ssh &> /dev/null
|
||||
if [[ $? -ne 0 ]]; then
|
||||
echo "ssh must be installed first. exiting."
|
||||
exit 1
|
||||
fi
|
||||
command -v python &> /dev/null
|
||||
if [[ $? -ne 0 ]]; then
|
||||
echo "python must be installed first. exiting."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# create file
|
||||
if [ $silent -ne 1 ]; then
|
||||
echo "creating $size MB file."
|
||||
fi
|
||||
dd if=/dev/zero of=$localpath/$file bs=$(($size*1024*1024)) count=1 &> /dev/null
|
||||
|
||||
if [[ $? -ne 0 ]]; then
|
||||
echo "cannot create file. ($localpath/$file)"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# upload file
|
||||
if [ $silent -ne 1 ]; then
|
||||
echo "uploading file to $sshserver"
|
||||
fi
|
||||
scp -v $localpath/$file $sshuser@$sshserver:$sshpath/$file &> $localpath/bandwidth_scplogup
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "error while uploading file. exiting."
|
||||
echo "there might be information in the scp log. ($localpath/bandwidth_scplogup)"
|
||||
|
||||
# remove local file
|
||||
rm $localpath/$file
|
||||
if [[ $? -ne 0 ]]; then
|
||||
echo "cannot delete local file. exiting. ($localpath/$file) - you must fix this!!"
|
||||
else
|
||||
if [ $silent -ne 1 ]; then
|
||||
echo "local file has been deleted."
|
||||
fi
|
||||
fi
|
||||
exit 1
|
||||
|
||||
fi
|
||||
result=$(cat $localpath/bandwidth_scplogup | grep "Bytes per second" | awk '{print $5}' | sed 's/\,//')
|
||||
result=$(echo $result | sed 's/\..*//')
|
||||
echo "UPLOAD: $(($result * 8 / 1024)) kbit/s"
|
||||
rm $localpath/bandwidth_scplogup
|
||||
|
||||
# download file
|
||||
if [ $silent -ne 1 ]; then
|
||||
echo "downloading file from $sshserver."
|
||||
fi
|
||||
scp -v $sshuser@$sshserver:$sshpath/$file $localpath/$file &> $localpath/bandwidth_scplogdown
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "error while downloading file. exiting."
|
||||
echo "there might be information in the scp log. ($localpath/bandwidth_scplogdown)"
|
||||
|
||||
# remove remote file
|
||||
ssh $sshuser@$sshserver rm $sshpath/$file &> /dev/null
|
||||
if [[ $? -ne 0 ]]; then
|
||||
echo "cannot remove remote file. ($sshpath/$file) - you must fix this!!"
|
||||
sleep 5
|
||||
else
|
||||
if [ $silent -ne 1 ]; then
|
||||
echo "remote file removed."
|
||||
fi
|
||||
fi
|
||||
exit 1
|
||||
|
||||
fi
|
||||
result=$(cat $localpath/bandwidth_scplogdown | grep "Bytes per second" | awk '{print $7}' | sed 's/\,//')
|
||||
result=$(echo $result | sed 's/\..*//')
|
||||
echo "DOWNLOAD: $(($result * 8 / 1024)) kbit/s"
|
||||
rm $localpath/bandwidth_scplogdown
|
||||
|
||||
# remove remote file
|
||||
ssh $sshuser@$sshserver rm $sshpath/$file &> /dev/null
|
||||
if [[ $? -ne 0 ]]; then
|
||||
echo "cannot remove remote file. ($sshpath/$file) - you must fix this!!"
|
||||
sleep 5
|
||||
else
|
||||
if [ $silent -ne 1 ]; then
|
||||
echo "remote file removed."
|
||||
fi
|
||||
fi
|
||||
|
||||
# remove local file
|
||||
rm $localpath/$file
|
||||
if [[ $? -ne 0 ]]; then
|
||||
echo "cannot delete local file. exiting. ($localpath/$file) - you must fix this!!"
|
||||
exit 1
|
||||
else
|
||||
if [ $silent -ne 1 ]; then
|
||||
echo "local file has been deleted."
|
||||
fi
|
||||
exit 0
|
||||
fi
|
||||
|
||||
if [ $silent -ne 1 ]; then
|
||||
echo "all done. exiting."
|
||||
fi
|
||||
exit 0
|
|
@ -0,0 +1,264 @@
|
|||
# bashlib
|
||||
# frequently used shell/bash functions
|
||||
|
||||
|
||||
# **** check for root privileges ****
|
||||
amiroot()
|
||||
{
|
||||
local user=$(whoami)
|
||||
case $1 in
|
||||
not) #not needed
|
||||
log debug "amiroot - checking for unnecessary root privileges" #debug log
|
||||
if [ "$(whoami)" = "root" ]; then
|
||||
log error "amiroot - you probably should not run this as root. it could mess up your karma."
|
||||
exit 1
|
||||
fi
|
||||
;;
|
||||
|
||||
*) #required
|
||||
log debug "amiroot - checking for necessary root privileges" #debug log
|
||||
if [ "$(whoami)" != "root" ]; then
|
||||
log error "amiroot - $USER, you need to gain root privileges to do this."
|
||||
exit 1;
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
# **** generate timestamp ****
|
||||
gettimestamp()
|
||||
{
|
||||
if [ -z $1 ]; then
|
||||
date '+%Y%m%d%H%M'
|
||||
elif [ $1 = "nice" ]; then
|
||||
date '+%d.%m.%Y %H:%M'
|
||||
elif [ $1 = "short" ]; then
|
||||
date '+%Y%m%d'
|
||||
fi
|
||||
}
|
||||
|
||||
# **** bashtrap ****
|
||||
bashtrap()
|
||||
{
|
||||
log debug "bashtrap - triggered"
|
||||
clear
|
||||
echo "CTRL+C detected.. exiting!"
|
||||
exit 1
|
||||
}
|
||||
|
||||
|
||||
# this gives your bash scripts the ability to get updated
|
||||
# basically it does a simple git pull
|
||||
|
||||
# **** help ****
|
||||
# global vars needed: $repopath, $bashlibpath
|
||||
# it depends on bashlib
|
||||
|
||||
|
||||
# **** update (git pull) ****
|
||||
update()
|
||||
{
|
||||
|
||||
# checking for root privileges
|
||||
amiroot
|
||||
|
||||
# update start message
|
||||
log info "update - starting update of $logwhat and bashlib"
|
||||
|
||||
# bashlib update
|
||||
cd $bashlibpath
|
||||
git pull origin master | grep "files changed"
|
||||
local returncode=$?
|
||||
if [ $returncode = "0" ]; then
|
||||
log info "update - bashlib has been updated"
|
||||
else
|
||||
log info "update - bashlib is already up-to-date"
|
||||
fi
|
||||
|
||||
# update
|
||||
cd $repopath
|
||||
git pull origin master | grep "files changed"
|
||||
local returncode=$?
|
||||
if [ $returncode = "0" ]; then
|
||||
log info "update - $logwhat has been updated"
|
||||
else
|
||||
log info "update - $logwhat is already up-to-date"
|
||||
fi
|
||||
|
||||
}
|
||||
|
||||
|
||||
# **** dialog helper ****
|
||||
graph()
|
||||
{
|
||||
local bgtitle="kvm-tools $version | $1"
|
||||
|
||||
if [ $2 = "--inputbox" ]; then
|
||||
local size="7 80"
|
||||
elif [ $2 = "--yesno" ]; then
|
||||
local size="20 80"
|
||||
elif [ $2 = "--fselect" ]; then
|
||||
local size="12 80"
|
||||
else
|
||||
local size="20 80 14"
|
||||
fi
|
||||
|
||||
dialog --backtitle "$bgtitle" --no-cancel "$2" "$3" $size $4 2> /tmp/dialog
|
||||
local returncode=$?
|
||||
clear
|
||||
dialogresult=$(cat /tmp/dialog)
|
||||
rm /tmp/dialog
|
||||
return $returncode
|
||||
|
||||
}
|
||||
|
||||
|
||||
# log engine
|
||||
|
||||
# **** help ****
|
||||
# this is basically a collection of bash functions
|
||||
# for making a decent logging in a bash script
|
||||
# amazingly easy.
|
||||
#
|
||||
# in order to use this little logging script
|
||||
# you need to have some global variables defined
|
||||
# loglevel=<0-4>
|
||||
# 0 -- no logging
|
||||
# 1 -- just errors
|
||||
# 2 -- errors & warnings
|
||||
# 3 -- even infos (something like "user was created")
|
||||
# 4 -- debug (more than everything)
|
||||
#
|
||||
# logfile="/path/to/logfile.log"
|
||||
# well.. should be understandable..
|
||||
#
|
||||
# logwhat="kvm-tools"
|
||||
# tells the engine what is actually been logged (example: name of calling script)
|
||||
# just used for syslog
|
||||
#
|
||||
# log2syslog="0|1"
|
||||
# (de)activates logging to the syslog deamen
|
||||
#
|
||||
# log2stdout="0|1"
|
||||
# (de)activates logging to stdout
|
||||
# useful if you don't want to deal with output in your script
|
||||
#
|
||||
# log2file="0|1"
|
||||
# (de)activates logging to logfile
|
||||
#
|
||||
#
|
||||
# usage:
|
||||
# log error|warning|info|debug "log message"
|
||||
|
||||
# **** log function ****
|
||||
log()
|
||||
{
|
||||
# getting local hostname
|
||||
local hostname=$(cat /etc/hostname)
|
||||
|
||||
# if no loglevel is defined the script will end
|
||||
if [ -z $loglevel ]; then
|
||||
echo "logengine[error]: no loglevel defined"
|
||||
exit 1
|
||||
|
||||
# if loglevel is 0, skip logging
|
||||
elif [ $loglevel = "0" ]; then
|
||||
# logging is disabled
|
||||
return 0
|
||||
|
||||
# loglevel has to be something between 0 and 5
|
||||
elif [ ! $loglevel -gt "0" -o ! $loglevel -lt "5" ]; then
|
||||
# loglevel unknown
|
||||
echo "logengine[error]: unknown loglevel"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
|
||||
# stdout routine
|
||||
if [ -z $log2stdout ]; then
|
||||
log2stdout="0"
|
||||
elif [ $log2stdout = "0" ]; then
|
||||
# stdout is disabled
|
||||
:
|
||||
elif [ $log2stdout = "1" ]; then
|
||||
# here goes the actual logging process (stdout)
|
||||
if [ $1 = "error" -a $loglevel -gt "0" ]; then
|
||||
# errors
|
||||
echo "[$1]: $2"
|
||||
elif [ $1 = "warning" -a $loglevel -gt "1" ]; then
|
||||
# warnings
|
||||
echo "[$1]: $2"
|
||||
elif [ $1 = "info" -a $loglevel -gt "2" ]; then
|
||||
# informational
|
||||
echo "[$1]: $2"
|
||||
elif [ $1 = "debug" -a $loglevel -gt "3" ]; then
|
||||
# debug messages
|
||||
echo "[$1]: $2"
|
||||
fi
|
||||
fi
|
||||
|
||||
# syslog routine
|
||||
if [ -z $log2syslog ]; then
|
||||
log2syslog="0"
|
||||
elif [ $log2syslog = "0" ]; then
|
||||
# syslog is disabled
|
||||
:
|
||||
elif [ -z $logwhat ]; then
|
||||
# for syslogging logwhat has to be defined
|
||||
echo "logengine[error]: logwhat not defined"
|
||||
elif [ $log2syslog = "1" ]; then
|
||||
# here goes the actual logging process (syslog)
|
||||
if [ $1 = "error" -a $loglevel -gt "0" ]; then
|
||||
# errors
|
||||
logger -t "$logwhat[$1]" "$2"
|
||||
elif [ $1 = "warning" -a $loglevel -gt "1" ]; then
|
||||
# warnings
|
||||
logger -t "$logwhat[$1]" "$2"
|
||||
elif [ $1 = "info" -a $loglevel -gt "2" ]; then
|
||||
# informational
|
||||
logger -t "$logwhat[$1]" "$2"
|
||||
elif [ $1 = "debug" -a $loglevel -gt "3" ]; then
|
||||
# debug messages
|
||||
logger -t "$logwhat[$1]" "$2"
|
||||
fi
|
||||
fi
|
||||
|
||||
# logfile routine
|
||||
if [ -z $log2file ]; then
|
||||
log2file="0"
|
||||
elif [ $log2file = "0" ]; then
|
||||
# file is disabled
|
||||
:
|
||||
elif [ $log2file = "1" ]; then
|
||||
if [ -z $logfile ]; then
|
||||
# if no logfile is defined the script will end
|
||||
echo "logengine[error]: no logfile defined"
|
||||
exit 1
|
||||
elif ! [ -a $logfile ]; then
|
||||
echo "logengine[warning]: logfile not found"
|
||||
echo "logengine[info]: creating new logfile"
|
||||
touch $logfile
|
||||
if [ $? != 0 ]; then
|
||||
# probably a permission denied error
|
||||
echo "logengine[error]: could not create logfile."
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
# here goes the actual logging process (logfile)
|
||||
if [ $1 = "error" -a $loglevel -gt "0" ]; then
|
||||
# errors
|
||||
echo "$(gettimestamp nice) [$1]: $2" >> $logfile
|
||||
elif [ $1 = "warning" -a $loglevel -gt "1" ]; then
|
||||
# warnings
|
||||
echo "$(gettimestamp nice) [$1]: $2" >> $logfile
|
||||
elif [ $1 = "info" -a $loglevel -gt "2" ]; then
|
||||
# informational
|
||||
echo "$(gettimestamp nice) [$1]: $2" >> $logfile
|
||||
elif [ $1 = "debug" -a $loglevel -gt "3" ]; then
|
||||
# debug messages
|
||||
echo "$(gettimestamp nice) [$1]: $2" >> $logfile
|
||||
fi
|
||||
fi
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,14 @@
|
|||
#!/bin/sh
|
||||
S=${IFS}
|
||||
IFS=.
|
||||
for P in $1; do
|
||||
TLD=${P}
|
||||
done
|
||||
IFS=${S}
|
||||
|
||||
echo "TLD: ${TLD}"
|
||||
DNSLIST=$(dig +short ${TLD}. NS)
|
||||
for DNS in ${DNSLIST}; do
|
||||
echo "Checking ${DNS}"
|
||||
dig +norec +nocomments +noquestion +nostats +nocmd @${DNS} $1 NS
|
||||
done
|
|
@ -0,0 +1 @@
|
|||
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA9Kk/PiaCOR4D5wNv+0NI1tnYl81pdR9zEK4E997cGyWwDUhBFnlbbHJdBsH55xMDZV59pyVp4drFmt+QKplIPijSh5uJavjYENVtrPJHTrHOOd6B05rdruyaGxLBxOMLmwA/+e/U/Q0Nj17wHs4LCxr4oe+LlzaeSKLb2ZrSDhgrYc0CAQg58ISDRVUDXDXwaHlsJUAm1f3jHb4l6gVX8qhdJRT1aqjNtERG+uWJsZZIOIuHLrSqOhJvKif4xdc5fenVH0nkeAyrVZJJLrq33Bk/8i8z/ZiyM4/uUOfPwymI7aVNREXrEKTWG4GmgLugFDOyk563qqhljx97TmUJzQ== root@karlmoik
|
|
@ -0,0 +1,43 @@
|
|||
#!/bin/bash
|
||||
|
||||
# get mac address
|
||||
net=192.168.19.
|
||||
ifs="eth0 eth1 eth2 eth3 eth4"
|
||||
|
||||
# get the configuration with ip
|
||||
string=$(ip addr | grep "inet $net")
|
||||
|
||||
set -- $ifs
|
||||
|
||||
for var in "$@"; do
|
||||
if [[ $string == "" ]]; then
|
||||
echo "error: no interface configured to $net, exiting"
|
||||
exit 1
|
||||
else
|
||||
if [[ $string == *$var* ]]; then
|
||||
macstring=$(ip addr show eth0 | grep ether)
|
||||
fi
|
||||
fi
|
||||
done
|
||||
|
||||
# get mac address
|
||||
mac=${macstring:15:17}
|
||||
#echo "MAC Address: $mac"
|
||||
|
||||
# get the hostname from the list
|
||||
hostnamestring=$(cat mac2hostname.lst | grep $mac)
|
||||
hostname=${hostnamestring:18}
|
||||
#echo "Hostname: $hostname"
|
||||
|
||||
# generate imagename
|
||||
imagename=$hostname"_$(echo $(date "+%d_%m_%C%y"))"
|
||||
#echo "Imagename: $imagename"
|
||||
echo $imagename
|
||||
|
||||
|
||||
# starting clonezilla imaging process
|
||||
/opt/drbl/sbin/ocs-sr -q2 -j2 -gs -z1 -i 0 -p reboot savedisk "$imagename" "sda"
|
||||
# also possible "sda sdb"
|
||||
|
||||
# end of script
|
||||
exit 0
|
|
@ -0,0 +1,9 @@
|
|||
# shares to mount
|
||||
# example: user@host:/smbshare/directory;password
|
||||
# no symbols allowed in sharenames
|
||||
|
||||
Administrator@192.168.19.20:/vrpack/VRProjects/;pentium4711
|
||||
#Administrator@192.168.19.20:/ssd\ \(s\)/Gigapixel/;pentium4711
|
||||
Administrator@192.168.19.20:/vrprojects/;pentium4711
|
||||
Administrator@192.168.19.100:/software/;pentium4711
|
||||
|
|
@ -0,0 +1,98 @@
|
|||
#!/bin/bash
|
||||
|
||||
# # # # # # # # # # # # # # # #
|
||||
# #
|
||||
# DeepSpace File Backup #
|
||||
# v0.1 #
|
||||
# david@socialnerds.org #
|
||||
# #
|
||||
# # # # # # # # # # # # # # # #
|
||||
|
||||
## README SECTION
|
||||
##
|
||||
## nothing to read yet :-)
|
||||
##
|
||||
##
|
||||
|
||||
# definitions
|
||||
configfile="/srv/scripts/filebackup.conf" # use absolut path
|
||||
mountpath="/mnt"
|
||||
backuppath="/srv/filebackup"
|
||||
|
||||
# gen timestamp
|
||||
timestamp=$(echo $(date "+%d_%m_%C%y"))
|
||||
|
||||
# am i root
|
||||
if [ "$(whoami)" != "root" ]; then
|
||||
echo "error: only root can do this"
|
||||
exit 1;
|
||||
fi
|
||||
|
||||
# starting message with timestamp
|
||||
echo
|
||||
echo "info: starting deepspace filebackup on $timestamp"
|
||||
echo
|
||||
|
||||
# check if configfile is there and readable
|
||||
if [ -r $configfile ]; then
|
||||
# read configfile
|
||||
i=1
|
||||
while read line; do
|
||||
# check if first letter is a #
|
||||
fletter=${line:0:1}
|
||||
if [ -z "$line" ]; then
|
||||
:
|
||||
#echo "line $i is empty"
|
||||
else
|
||||
if [ $fletter == "#" ]; then
|
||||
:
|
||||
#echo "line $i a comment"
|
||||
else
|
||||
if [[ $line != *"@"*":"*";"* ]]; then
|
||||
echo "error: line $i is not correct formated"
|
||||
else
|
||||
echo "info: reading config (line $i)"
|
||||
userindex=`expr index "$line" @`
|
||||
let userindex--
|
||||
user=${line:0:$userindex}
|
||||
#echo "user: $user"
|
||||
hostindex=`expr index "$line" :`
|
||||
let hostindex--
|
||||
let userindex++
|
||||
host=${line:$userindex:$(($hostindex-$userindex))}
|
||||
#echo "host: $host"
|
||||
passindex=`expr index "$line" ";"`
|
||||
share=${line:$(($hostindex+1)):$(($passindex-$hostindex-2))}
|
||||
#echo "share: $share"
|
||||
pass=${line:$passindex}
|
||||
#echo "password: $pass"
|
||||
|
||||
# check for mountpoint
|
||||
if [ -d $mountpath/$i ]; then
|
||||
echo "info: $mountpath/$i already exists"
|
||||
else
|
||||
mkdir -p $mountpath/$i
|
||||
fi
|
||||
echo "info: mounting $host$share to $mountpath/$i"
|
||||
mount -t cifs -o username=$user,password=$pass //$host$share $mountpath/$i
|
||||
# do backup
|
||||
echo "info: creating destination folders"
|
||||
mkdir -p $backuppath/$timestamp/$host$share/
|
||||
echo "info: starting rsync job"
|
||||
rsync -r $mountpath/$i/* $backuppath/$timestamp/$host$share/
|
||||
# unmounting share
|
||||
echo "info: unmounting $host$share"
|
||||
umount $mountpath/$i
|
||||
echo "info: backup done, please check if it's really there"
|
||||
echo
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
let i++
|
||||
done < $configfile
|
||||
else
|
||||
echo "error: no configfile found"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
exit 0
|
|
@ -0,0 +1,15 @@
|
|||
b8:ac:6f:86:7d:49 dooku
|
||||
00:22:19:2f:a6:fb loadingapp
|
||||
00:22:19:14:69:ea cluster1
|
||||
00:22:19:14:6a:00 cluster2
|
||||
00:22:19:14:37:cf cluster3
|
||||
00:22:19:14:5f:bc cluster4
|
||||
00:22:19:14:6a:2f lic
|
||||
#devicecontrol
|
||||
#mosaik1
|
||||
00:22:19:14:6c:b5 mosaik2
|
||||
00:22:19:14:69:52 sanchoplan
|
||||
00:22:19:14:5f:77 stereovideowall
|
||||
00:22:19:14:6a:d2 stereovideofloor
|
||||
00:22:19:11:e3:08 video
|
||||
00:14:c2:5a:28:3e testmachine
|
|
@ -0,0 +1,62 @@
|
|||
#!/bin/bash
|
||||
|
||||
#hosts="cluster1 cluster2 cluster3 cluster4 lic sanchoplan stereovideowall stereovideofloor video loadingapp"
|
||||
hosts="testmachine"
|
||||
pxeconfdir="/var/lib/tftpboot/pxelinux.cfg"
|
||||
scriptpath="/srv/scripts"
|
||||
|
||||
|
||||
# check for configfile
|
||||
if [ -d $pxeconfdir ]; then
|
||||
if [ -r $pxeconfdir/default ]; then
|
||||
echo "default pxe config exists and is readable"
|
||||
else
|
||||
echo "default pxe config does not exist"
|
||||
|
||||
# create default pxe config
|
||||
echo "creating config"
|
||||
cp $scriptpath/tftpboot_default $pxeconfdir/default
|
||||
fi
|
||||
else
|
||||
echo "there is no $pxeconfdir"
|
||||
echo "are you sure you're running this script on your pxe server"
|
||||
echo "exiting"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# cleaning up any previous mac address config files in pxeconfdir
|
||||
echo "cleaning up previous mac address configurations in $pxeconfdir"
|
||||
rm $pxeconfdir/00-* &> /dev/null
|
||||
|
||||
# starting actual backup process
|
||||
set -- $hosts
|
||||
|
||||
for var in "$@"; do
|
||||
|
||||
echo "starting backup of $var"
|
||||
|
||||
# get mac for pxe config
|
||||
macstring=$(cat $scriptpath/mac2hostname.lst | grep $var)
|
||||
mac=${macstring:0:17}
|
||||
correctmac="${mac//:/-}"
|
||||
echo "mac of $var is $correctmac"
|
||||
|
||||
# create pxc config for $var
|
||||
cp $scriptpath/tftpboot_mac $pxeconfdir/01-$correctmac
|
||||
|
||||
# remote reboot
|
||||
echo "making the actual reboot of $var"
|
||||
ssh -l Administrator $var shutdown -f -r -t 05
|
||||
|
||||
# sleep for 15 minutes
|
||||
echo "sleeping for 10 minutes"
|
||||
sleep 600
|
||||
|
||||
# remove temp pxe config for $var
|
||||
echo "removing mac address configurations in $pxeconfdir"
|
||||
rm $pxeconfdir/01-$correctmac
|
||||
done
|
||||
|
||||
# end of script
|
||||
echo "end of script, exiting"
|
||||
exit 0
|
|
@ -0,0 +1,5 @@
|
|||
DEFAULT local
|
||||
|
||||
LABEL local
|
||||
MENU LABEL Local ^HDD
|
||||
LOCALBOOT 0
|
|
@ -0,0 +1,27 @@
|
|||
#!/bin/bash
|
||||
|
||||
bakpath="/srv/backup"
|
||||
count="5"
|
||||
num=$count
|
||||
|
||||
cd $bakpath
|
||||
|
||||
while [ -a daily0.dump ]; do
|
||||
if [ -a daily$num.dump ]; then
|
||||
echo "moving daily$num.dump to daily$((num+1)).dump"
|
||||
mv daily$num.dump daily$((num+1)).dump
|
||||
fi
|
||||
num=$((num-1))
|
||||
done
|
||||
|
||||
echo "dumping postgresql dbs to a new daily0.dump"
|
||||
sudo -u postgres pg_dumpall > daily0.dump
|
||||
|
||||
if [ -a daily$((count+1)).dump ]; then
|
||||
rm daily$((count+1)).dump
|
||||
echo "removing daily$((count+1)).dump"
|
||||
fi
|
||||
|
||||
echo "done"
|
||||
|
||||
exit 0
|
|
@ -0,0 +1,10 @@
|
|||
#!/bin/bash
|
||||
|
||||
user=root
|
||||
pass=xxxx
|
||||
db=database
|
||||
file=$1
|
||||
|
||||
mysql -u$user -p$pass -f $db < $file
|
||||
|
||||
|
|
@ -0,0 +1,16 @@
|
|||
## df monitoring jabber bot configfile
|
||||
|
||||
## here i suggest you put the name of the machine you running this script on
|
||||
hostname="somemachine.example.com"
|
||||
|
||||
## jabber config
|
||||
watchdogs="max@muster.com moriz@jabber.anotherdomain.com"
|
||||
user="jabber-username"
|
||||
pass="jabber-password"
|
||||
server="jabber-server"
|
||||
#port="5222" # uncomment if you want to use a specific port
|
||||
|
||||
## define disks you wanna check? (whitespace seperated)
|
||||
disks="hda1 hda2 hdd1"
|
||||
## here the disks thresholds
|
||||
thresholds="80 90 95"
|
|
@ -0,0 +1,85 @@
|
|||
#!/bin/bash
|
||||
|
||||
###################################################
|
||||
## ##
|
||||
## disk_free jabber monitoring bot ##
|
||||
## Author: david@socialnerds.org ##
|
||||
## v0.2 ##
|
||||
## ##
|
||||
###################################################
|
||||
|
||||
## timestamp for logfile
|
||||
timestamp=$(date '+%d %B %Y %H:%M')
|
||||
echo "info: starting df bot $timestamp"
|
||||
|
||||
## check if sendxmpp is installed
|
||||
if [ $(aptitude search sendxmpp | awk '{print $1}') = "i" ]; then
|
||||
echo "info: sendxmpp found"
|
||||
else
|
||||
if [ $(whoami) = "root" ]; then
|
||||
apt-get install sendxmpp
|
||||
else
|
||||
echo "error: permission denied"
|
||||
echo "info: install sendxmpp or run this scrip as superuser"
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
|
||||
## set and load configfile
|
||||
if [ -z $1 ]; then
|
||||
configfile="/etc/mobots/df.conf"
|
||||
if [ -f $configfile ]; then
|
||||
source $configfile
|
||||
else
|
||||
echo "error: no config file $configfile"
|
||||
exit 1
|
||||
fi
|
||||
else
|
||||
configfile=$1
|
||||
if [ -f $configfile ]; then
|
||||
source $configfile
|
||||
else
|
||||
echo "error: no config file $configfile"
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
|
||||
## check sendxmpp config
|
||||
if [ -f ~/.sendxmpprc ]; then
|
||||
echo "info: jabber config found in ~/.sendxmpprc"
|
||||
else
|
||||
|
||||
if [ -z $port ]; then
|
||||
port="5222"
|
||||
else
|
||||
echo "info: using port $port"
|
||||
fi
|
||||
|
||||
echo "$user@$server:$port $pass" > ~/.sendxmpprc
|
||||
chmod 600 ~/.sendxmpprc
|
||||
echo "info: created sendxmpp config in ~/.sendxmpprc"
|
||||
fi
|
||||
|
||||
|
||||
## check disks
|
||||
set -- $disks
|
||||
i="1"
|
||||
|
||||
for var in "$@"
|
||||
do
|
||||
data=$(df -Ph | grep $var | sed -e 's/%//g' | awk '{print $5}')
|
||||
datathreshold=$(echo $thresholds | awk '{print $'$i'}')
|
||||
|
||||
if [ $data -gt $datathreshold ]; then
|
||||
echo "info: $var reached threshold with $data%, sending notification to $watchdogs"
|
||||
echo "$hostname: $var is running out of space: $data%" | sendxmpp -r dfbot $watchdogs
|
||||
fi
|
||||
let i++
|
||||
done
|
||||
|
||||
|
||||
## exiting
|
||||
echo "info: done"
|
||||
exit 0
|
|
@ -0,0 +1,9 @@
|
|||
# **** df_bot configfile ****
|
||||
|
||||
# here i suggest you put the name of the machine you running this script on
|
||||
hostname="somemachine.example.com"
|
||||
|
||||
## define disks you wanna check? (whitespace seperated)
|
||||
disks="hda1 hda2 hdd1"
|
||||
## here the disks thresholds
|
||||
thresholds="80 90 95"
|
|
@ -0,0 +1,120 @@
|
|||
#!/bin/bash
|
||||
|
||||
|
||||
###################################################
|
||||
## ##
|
||||
## disk_free monitoring bot ##
|
||||
## ##
|
||||
###################################################
|
||||
|
||||
|
||||
# **** in script config section ****
|
||||
version="0.3_alpha"
|
||||
author="david@socialnerds.org"
|
||||
logwhat="df_bot"
|
||||
|
||||
# **** configfile section ****
|
||||
disks="sda1"
|
||||
thresholds="90"
|
||||
bashlibpath="/home/david/Documents/code/bashlib"
|
||||
# logging
|
||||
loglevel="4"
|
||||
log2syslog="1"
|
||||
log2file="0"
|
||||
#logfile="/var/log/mbots.log"
|
||||
log2stdout="1"
|
||||
|
||||
|
||||
# **** bash trap initialisation ****
|
||||
trap bashtrap INT
|
||||
|
||||
# **** load bashlib ****
|
||||
if [ -d $bashlibpath ]; then
|
||||
source $bashlibpath/main
|
||||
#source $bashlibpath/update
|
||||
source $bashlibpath/logengine
|
||||
log debug "preflight - bashlib loaded"
|
||||
else
|
||||
echo "ERROR: bashlib not found"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
exit 0
|
||||
## timestamp for logfile
|
||||
#timestamp=$(date '+%d %B %Y %H:%M')
|
||||
#echo "info: starting df bot $timestamp"
|
||||
|
||||
## check if sendxmpp is installed
|
||||
#if [ $(aptitude search sendxmpp | awk '{print $1}') = "i" ]; then
|
||||
# echo "info: sendxmpp found"
|
||||
#else
|
||||
# if [ $(whoami) = "root" ]; then
|
||||
# apt-get install sendxmpp
|
||||
# else
|
||||
# echo "error: permission denied"
|
||||
# echo "info: install sendxmpp or run this scrip as superuser"
|
||||
# exit 1
|
||||
# fi
|
||||
#fi
|
||||
|
||||
|
||||
## set and load configfile
|
||||
#if [ -z $1 ]; then
|
||||
# configfile="/etc/mobots/df.conf"
|
||||
# if [ -f $configfile ]; then
|
||||
# source $configfile
|
||||
# else
|
||||
# echo "error: no config file $configfile"
|
||||
# exit 1
|
||||
# fi
|
||||
#else
|
||||
# configfile=$1
|
||||
# if [ -f $configfile ]; then
|
||||
# source $configfile
|
||||
# else
|
||||
# echo "error: no config file $configfile"
|
||||
# exit 1
|
||||
# fi
|
||||
#fi
|
||||
|
||||
|
||||
## check sendxmpp config
|
||||
#if [ -f ~/.sendxmpprc ]; then
|
||||
# echo "info: jabber config found in ~/.sendxmpprc"
|
||||
#else
|
||||
#
|
||||
# if [ -z $port ]; then
|
||||
# port="5222"
|
||||
# else
|
||||
# echo "info: using port $port"
|
||||
# fi
|
||||
#
|
||||
# echo "$user@$server:$port $pass" > ~/.sendxmpprc
|
||||
# chmod 600 ~/.sendxmpprc
|
||||
# echo "info: created sendxmpp config in ~/.sendxmpprc"
|
||||
#fi
|
||||
|
||||
|
||||
## check disks
|
||||
set -- $disks
|
||||
i="1"
|
||||
|
||||
for var in "$@"
|
||||
do
|
||||
data=$(df -Ph | grep $var | sed -e 's/%//g' | awk '{print $5}')
|
||||
datathreshold=$(echo $thresholds | awk '{print $'$i'}')
|
||||
|
||||
if [ $data -gt $datathreshold ]; then
|
||||
echo "info: $var reached threshold with $data%, sending notification to $watchdogs"
|
||||
echo "$hostname: $var is running out of space: $data%" | sendxmpp -r dfbot $watchdogs
|
||||
fi
|
||||
let i++
|
||||
done
|
||||
|
||||
|
||||
## exiting
|
||||
#echo "info: done"
|
||||
|
||||
|
||||
exit 0
|
||||
# **** end of script ****
|
|
@ -0,0 +1,10 @@
|
|||
#!/bin/bash
|
||||
|
||||
# Flash the Scroll Lock LED
|
||||
|
||||
while [ true ]; do
|
||||
xset led named 'Scroll Lock'
|
||||
sleep 0.3
|
||||
xset -led named 'Scroll Lock'
|
||||
sleep 0.3
|
||||
done
|
|
@ -0,0 +1,33 @@
|
|||
attention: the install procedure is broke at the moment..
|
||||
|
||||
## why are some variables defined in the configfile and some directly in the script?
|
||||
the vars in the configfile are specific to your installation and can or should be changed. everything defined directly in the script should remain the same for every installation.
|
||||
|
||||
## features wanted
|
||||
|
||||
info option (or some sort of stats)
|
||||
|
||||
-- ftp user count
|
||||
-- sftp user count
|
||||
-- used disk space
|
||||
-- used disk space by user
|
||||
-- free disk space
|
||||
-- free quota
|
||||
-- quotamountpoint
|
||||
|
||||
|
||||
|
||||
## functions
|
||||
quotacalc ... gives back the free megabytes on the storage
|
||||
quotaconf ... sets the quota for existing user
|
||||
isuserthere ... checks if user exists or asks to create it
|
||||
amiroot ... checks if there are root privileges (ends scripts if not)
|
||||
update ... pulls updates from ftpsftp git repository
|
||||
version ... prints version information
|
||||
usage ... prints usage message
|
||||
add ... adding a new user
|
||||
delete ... delete an existing user
|
||||
|
||||
|
||||
|
||||
contact me if you have any questions: david@socialnerds.org
|
|
@ -0,0 +1,173 @@
|
|||
#!/bin/bash
|
||||
|
||||
############################################
|
||||
## ##
|
||||
## FTP/sFTP Account Creation Script ##
|
||||
## v0.2 ##
|
||||
## Author: david@socialnerds.org ##
|
||||
## ##
|
||||
############################################
|
||||
|
||||
## script configuration section ##
|
||||
accpath="/media/storage"
|
||||
acchost="some.domain.org" # the dns name where your sever is reachable
|
||||
sftpgroup="sftpusers" # this group must exist
|
||||
trackrequester="yes" # switch to "no" if you do not want to track the requester
|
||||
logging=1 # set this to 0 if you don't want any logging
|
||||
logpath="/media/storage/logs" # there you want to create your logfile
|
||||
logfile="accounts.log" # choose the logfile name here
|
||||
jabberlog=1 # set this to 0 if you don't want jabber notifications
|
||||
## following ist not necessary if jabberlog=0
|
||||
jabberwatchdogs="admin@somedomain.org admin@someotherdomain.org"
|
||||
jabberuser="jabber-account"
|
||||
jabberserver="jabber-server"
|
||||
jabberpass="jabber-account-password"
|
||||
|
||||
|
||||
## am i root? ##
|
||||
if [ "$(whoami)" != "root" ]; then
|
||||
echo "only root can do this"
|
||||
exit 1;
|
||||
fi
|
||||
|
||||
|
||||
## check for dependencys ##
|
||||
# not yet implemented (sendxmpp, ssh, vsftpd, ..)
|
||||
|
||||
|
||||
#clear
|
||||
echo "" # just an empty line
|
||||
echo "Welcome to the FTP/sFTP Account Creation Script (v0.2)"
|
||||
## choose ftp or sftp
|
||||
echo ""
|
||||
echo "Which type of account you want to create? [sftp|ftp]"
|
||||
read acctype
|
||||
|
||||
if [ $acctype = "sftp" ]; then
|
||||
echo ""
|
||||
else
|
||||
if [ $acctype = "ftp" ]; then
|
||||
echo ""
|
||||
else
|
||||
#clear
|
||||
echo "I'm sorry, i need to break this up right now."
|
||||
echo "It seams you can't understand some simple instructions.."
|
||||
exit 1;
|
||||
fi
|
||||
fi
|
||||
|
||||
|
||||
if [ -z $1 ]; then
|
||||
needaccname="yes"
|
||||
while [ $needaccname = "yes" ]; do
|
||||
echo ""
|
||||
echo "Enter Accountname:"
|
||||
read accname
|
||||
if [ -z $accname ]; then
|
||||
echo "This field is mandatory."
|
||||
else
|
||||
needaccname="notanymore"
|
||||
fi
|
||||
done
|
||||
else
|
||||
accname=$1
|
||||
fi
|
||||
|
||||
|
||||
## quota
|
||||
accquota="quota not yet implemented"
|
||||
|
||||
|
||||
## requester
|
||||
while [ $trackrequester = "yes" ]; do
|
||||
echo ""
|
||||
echo "Who orderd this account? (I'm tracking this for a greater good.)"
|
||||
read accrequester
|
||||
if [ -z "$accrequester" ]; then
|
||||
echo "This field is mandatory."
|
||||
else
|
||||
trackrequester="notanymore"
|
||||
fi
|
||||
done
|
||||
|
||||
## set $accport
|
||||
if [ $acctype = "sftp" ]; then
|
||||
accport="22"
|
||||
else
|
||||
accport="21"
|
||||
fi
|
||||
|
||||
|
||||
## get timestamp
|
||||
acctimestamp=$(date '+%dr%B %Y %H:%M')
|
||||
|
||||
|
||||
## gen password (acpass)
|
||||
accpass=$(pwgen -snc 10 1)
|
||||
echo $accpass > pass.txt
|
||||
accencpass=$(makepasswd --clearfrom=pass.txt --crypt-md5 |awk '{print $2}')
|
||||
rm pass.txt
|
||||
|
||||
## create home, set its permissions and add the user to sftp/ftpgroup
|
||||
if [ $acctype = "sftp" ]; then
|
||||
mkdir -p $accpath/$acctype"_accounts"/$accname/data
|
||||
# create the actual user (sftp)
|
||||
useradd -d /data -M -U -s /usr/lib/sftp-server -p $accencpass $accname
|
||||
chown -R $accname\: $accpath/$acctype"_accounts"/$accname/data
|
||||
adduser $accname $sftpgroup
|
||||
else
|
||||
mkdir -p $accpath/$acctype"_accounts"/$accname
|
||||
# create the actual user (ftp)
|
||||
useradd -d $accpath/$acctype"_accounts"/$accname -M -U -s /bin/false -p $accencpass $accname
|
||||
chown -R $accname\: $accpath/$acctype"_accounts"/$accname
|
||||
echo $accname >> /etc/vsftpd.user_list
|
||||
fi
|
||||
|
||||
|
||||
## logging (log type, name, pass, quota, requester and timestamp)
|
||||
if [ $logging = 1 ]; then
|
||||
if [ -e $logpath/$logfile ]; then
|
||||
cd $logpath
|
||||
echo $acctype $accname $accpass $accquota $accrequester $acctimestamp >> $logfile
|
||||
else
|
||||
mkdir -p $logpath
|
||||
cd $logpath
|
||||
touch $logfile
|
||||
echo "type name pass quota reguester timestamp" >> $logfile
|
||||
echo $acctype $accname $accpass $accquota $accrequester $acctimestamp >> $logfile
|
||||
fi
|
||||
else
|
||||
echo ""
|
||||
fi
|
||||
|
||||
|
||||
## jabber notification
|
||||
if [ $jabberlog = 1 ]; then
|
||||
echo "
|
||||
This is your FTP/sFTP Server,
|
||||
a "$acctype" account was just created.
|
||||
Accountname:" $accname "
|
||||
Quota:" $accquota "
|
||||
Requester:" $accrequester | sendxmpp -r ftpcreation -u $jabberuser -j $jabberserver -p $jabberpass $jabberwatchdogs
|
||||
else
|
||||
echo ""
|
||||
fi
|
||||
|
||||
|
||||
## account data output
|
||||
#clear
|
||||
echo ""
|
||||
echo "Account data"
|
||||
echo ""
|
||||
echo "Host:" $acchost
|
||||
echo "Port:" $accport
|
||||
echo "Username:" $accname
|
||||
echo "Password:" $accpass
|
||||
echo "Quota:" $accquota
|
||||
echo "Directory:" $accpath/$acctype"_accounts"/$accname
|
||||
echo "Requester:" $accrequester
|
||||
echo ""
|
||||
echo "Everything is done"
|
||||
|
||||
exit 0
|
||||
|
|
@ -0,0 +1,215 @@
|
|||
#!/bin/bash
|
||||
|
||||
############################################
|
||||
## ##
|
||||
## FTP/sFTP Account Creation Script ##
|
||||
## v0.3 ##
|
||||
## Author: david@socialnerds.org ##
|
||||
## ##
|
||||
############################################
|
||||
|
||||
## script configuration section ##
|
||||
accpath="/srv/storage"
|
||||
quotamountpoint="/srv/storage"
|
||||
acchost="some.domain.org" # the dns name where your sever is reachable
|
||||
sftpgroup="sftpusers" # this group must exist
|
||||
trackrequester="yes" # switch to "no" if you do not want to track the requester
|
||||
logging=1 # set this to 0 if you don't want any logging
|
||||
logpath="/media/storage/logs" # there you want to create your logfile
|
||||
logfile="accounts.log" # choose the logfile name here
|
||||
jabberlog=0 # set this to 0 if you don't want jabber notifications
|
||||
maillog=0
|
||||
|
||||
## following ist not necessary if jabberlog=0
|
||||
jabberwatchdogs="admin@somedomain.org admin@someotherdomain.org"
|
||||
jabberuser="jabber-account"
|
||||
jabberserver="jabber-server"
|
||||
jabberpass="jabber-account-password"
|
||||
|
||||
## do not touch
|
||||
version="v0.3"
|
||||
|
||||
## am i root? ##
|
||||
if [ "$(whoami)" != "root" ]; then
|
||||
echo "only root can do this"
|
||||
exit 1;
|
||||
fi
|
||||
|
||||
|
||||
## check for dependencys ##
|
||||
# not yet implemented (sendxmpp, ssh, vsftpd, ..)
|
||||
|
||||
|
||||
#clear
|
||||
echo "" # just an empty line
|
||||
echo "Welcome to the FTP/sFTP Account Creation Script ($version)"
|
||||
## choose ftp or sftp
|
||||
echo ""
|
||||
echo "Which type of account you want to create? [sftp|ftp]"
|
||||
read acctype
|
||||
|
||||
if [ $acctype = "sftp" ]; then
|
||||
:
|
||||
else
|
||||
if [ $acctype = "ftp" ]; then
|
||||
:
|
||||
else
|
||||
#clear
|
||||
echo "I'm sorry, i need to break this up right now."
|
||||
echo "It seams you can't understand some simple instructions.."
|
||||
exit 1;
|
||||
fi
|
||||
fi
|
||||
|
||||
|
||||
if [ -z $1 ]; then
|
||||
needaccname="yes"
|
||||
while [ $needaccname = "yes" ]; do
|
||||
echo ""
|
||||
echo "Enter Accountname:"
|
||||
read accname
|
||||
if [ -z $accname ]; then
|
||||
echo "This field is mandatory."
|
||||
else
|
||||
needaccname="notanymore"
|
||||
fi
|
||||
done
|
||||
else
|
||||
accname=$1
|
||||
fi
|
||||
|
||||
|
||||
## quota
|
||||
ablocks=$(df | grep $quotamountpoint | awk '{print $2}')
|
||||
gblocks=$(repquota $quotamountpoint | grep 000 | awk '{print $4}')
|
||||
set -- $gblocks
|
||||
quotacount=0
|
||||
for var in "$@"
|
||||
do
|
||||
quotacount=$(($quotacount+$var))
|
||||
|
||||
done
|
||||
|
||||
gblocks=$quotacount
|
||||
fblocks=$(($ablocks-$gblocks))
|
||||
fsize=${fblocks:0:$((${#fblocks}-3))}
|
||||
|
||||
|
||||
needaccquota="yes"
|
||||
while [ $needaccquota = "yes" ]; do
|
||||
echo ""
|
||||
echo "Please specify how much diskspace this account should provide. (in Megabytes)"
|
||||
echo "Maximum: $fsize"
|
||||
read accquota
|
||||
if [ -z "$accquota" ]; then
|
||||
echo "This field is mandatory."
|
||||
else
|
||||
if [ $accquota -lt $fsize ]; then
|
||||
needaccquota="notanymore"
|
||||
else
|
||||
echo ""
|
||||
echo "Specified size too big or not a number. Try again."
|
||||
fi
|
||||
fi
|
||||
done
|
||||
|
||||
|
||||
## requester
|
||||
while [ $trackrequester = "yes" ]; do
|
||||
echo ""
|
||||
echo "Who orderd this account? (I'm tracking this for a greater good.)"
|
||||
read accrequester
|
||||
if [ -z "$accrequester" ]; then
|
||||
echo "This field is mandatory."
|
||||
else
|
||||
trackrequester="notanymore"
|
||||
fi
|
||||
done
|
||||
|
||||
## set $accport
|
||||
if [ $acctype = "sftp" ]; then
|
||||
accport="22"
|
||||
else
|
||||
accport="21"
|
||||
fi
|
||||
|
||||
|
||||
## get timestamp
|
||||
acctimestamp=$(date '+%d.%m.%Y %H:%M')
|
||||
|
||||
|
||||
## gen password (acpass)
|
||||
accpass=$(pwgen -snc 10 1)
|
||||
echo $accpass > pass.txt
|
||||
accencpass=$(makepasswd --clearfrom=pass.txt --crypt-md5 |awk '{print $2}')
|
||||
rm pass.txt
|
||||
|
||||
## create home, set its permissions and add the user to sftp/ftpgroup
|
||||
if [ $acctype = "sftp" ]; then
|
||||
mkdir -p $accpath/$acctype"_accounts"/$accname/data
|
||||
# create the actual user (sftp)
|
||||
useradd -d /data -M -U -s /usr/lib/sftp-server -p $accencpass $accname
|
||||
chown -R $accname\: $accpath/$acctype"_accounts"/$accname/data
|
||||
usermod -G $sftpgroup $accname
|
||||
else
|
||||
mkdir -p $accpath/$acctype"_accounts"/$accname
|
||||
# create the actual user (ftp)
|
||||
useradd -d $accpath/$acctype"_accounts"/$accname -M -U -s /bin/false -p $accencpass $accname
|
||||
chown -R $accname\: $accpath/$acctype"_accounts"/$accname
|
||||
echo $accname >> /etc/vsftpd.user_list
|
||||
fi
|
||||
|
||||
## configure quota
|
||||
setquota --all -u $accname $accquota"000" $accquota"000" 0 0
|
||||
|
||||
|
||||
## logging (log type, name, pass, quota, requester and timestamp)
|
||||
if [ $logging = 1 ]; then
|
||||
if [ -e $logpath/$logfile ]; then
|
||||
cd $logpath
|
||||
echo $acctype $accname $accpass $accquota $accrequester $acctimestamp >> $logfile
|
||||
else
|
||||
mkdir -p $logpath
|
||||
cd $logpath
|
||||
touch $logfile
|
||||
echo "type name pass quota reguester timestamp" >> $logfile
|
||||
echo $acctype $accname $accpass $accquota $accrequester $acctimestamp >> $logfile
|
||||
fi
|
||||
else
|
||||
echo ""
|
||||
fi
|
||||
|
||||
|
||||
## jabber notification
|
||||
if [ $jabberlog = 1 ]; then
|
||||
echo "
|
||||
This is your FTP/sFTP Server,
|
||||
a "$acctype" account was just created.
|
||||
Accountname:" $accname "
|
||||
Quota:" $accquota"MB" "
|
||||
Requester:" $accrequester | sendxmpp -r ftpcreation -u $jabberuser -j $jabberserver -p $jabberpass $jabberwatchdogs
|
||||
fi
|
||||
|
||||
## mail notification
|
||||
if [ $maillog = 1 ]; then
|
||||
echo "mail notification is not yet implemented"
|
||||
fi
|
||||
|
||||
|
||||
## account data output
|
||||
#clear
|
||||
echo ""
|
||||
echo "Account data"
|
||||
echo ""
|
||||
echo "Host:" $acchost
|
||||
echo "Port:" $accport
|
||||
echo "Username:" $accname
|
||||
echo "Password:" $accpass
|
||||
echo "Quota:" $accquota"MB"
|
||||
echo "Directory:" $accpath/$acctype"_accounts"/$accname
|
||||
echo "Requester:" $accrequester
|
||||
echo ""
|
||||
echo "Everything is done"
|
||||
|
||||
exit 0
|
||||
|
|
@ -0,0 +1,510 @@
|
|||
#!/bin/bash
|
||||
|
||||
#################################################
|
||||
## ##
|
||||
## FTPsFTP ##
|
||||
## standalone ftp/sftp server solution ##
|
||||
## ##
|
||||
#################################################
|
||||
|
||||
|
||||
|
||||
# **** do not touch as long as you are not me ****
|
||||
version="v0.4.1b"
|
||||
author="david@socialnerds.org"
|
||||
giturl="http://git.gitorious.org/aec/ftpsftp.git"
|
||||
|
||||
|
||||
# **** usage message ****
|
||||
usage()
|
||||
{
|
||||
cat << EOF
|
||||
usage: ftpsftp options
|
||||
|
||||
OPTIONS:
|
||||
-h show this message
|
||||
-i install ftpsftp on this ubuntu box
|
||||
-a <username> add a user
|
||||
-d <username> delete a user (not yet implemented)
|
||||
-r <username> reset password for user (not yet implemented)
|
||||
-q <username> (re)set the quota for user ****new feature****
|
||||
-u update ftpsftp (pull from git)
|
||||
-v version information
|
||||
|
||||
EOF
|
||||
}
|
||||
|
||||
|
||||
# **** version message ****
|
||||
version()
|
||||
{
|
||||
echo
|
||||
echo "FTPsFTP - standalone ftp/sftp server solution"
|
||||
echo
|
||||
echo "vesion: $version"
|
||||
echo "author: $author"
|
||||
echo
|
||||
}
|
||||
|
||||
|
||||
# **** am i root? ****
|
||||
amiroot()
|
||||
{
|
||||
if [ "$(whoami)" != "root" ]; then
|
||||
echo
|
||||
echo "sorry $USER, you need to gain root privileges to do this."
|
||||
echo
|
||||
exit 1;
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
|
||||
# **** installation routine ****
|
||||
installation()
|
||||
{
|
||||
|
||||
## am i root?
|
||||
amiroot
|
||||
|
||||
|
||||
## installing dependencies
|
||||
echo "info: trying to install dependencies via apt"
|
||||
apt-get update
|
||||
apt-get install -y vsftpd ssh quota quotatool makepasswd pwgen git-core vim
|
||||
|
||||
|
||||
## reading configuration from user (stdin)
|
||||
echo "specify under which path the account home dirs should be stored (no tailing slash)"
|
||||
read accpath
|
||||
echo "specify the mointpoint of the device where your accounts are stored (needed for quota config)"
|
||||
read quotamountpoint
|
||||
echo "specify the fqdn of your host"
|
||||
read acchost
|
||||
echo "specify a system group for your sftp users [default: sftpusers]"
|
||||
read sftpgroup
|
||||
if [ -z $sftpgroup ]; then
|
||||
sftpgroup="sftpusers"
|
||||
fi
|
||||
|
||||
|
||||
## creating needed directorys
|
||||
echo "info: creating directorys"
|
||||
mkdir -p /etc/ftpsftp
|
||||
mkdir -p /var/log/ftpsftp
|
||||
mkdir -p /opt
|
||||
|
||||
|
||||
## creating configfiles and logfiles
|
||||
echo "info: creating configuration and log files"
|
||||
echo "$USER" > /etc/vsftpd.chroot_list
|
||||
touch /etc/vsftpd.user_list
|
||||
echo "type name pass quota reguester timestamp" > /var/log/ftpsftp/accounts.log
|
||||
#touch /var/log/ftpsftp/system.log #not yet in use
|
||||
echo '## ftpsftp configuration file ##
|
||||
|
||||
accpath="'$accpath'" # this should point to where your accounts should be located
|
||||
quotamountpoint="'$quotamountpoint'" # mount point for quota configuration
|
||||
acchost="'$acchost'" # the dns name where your sever is reachable
|
||||
sftpgroup="'$sftpgroup'" # system group
|
||||
trackrequester="1" # switch to 0 if you do not want to track the account requester
|
||||
logging="1" # set this to 0 if you do not want any logging
|
||||
mailnotification="0" # set this to 0 if you do not want any mail notifications (not yet implemented)
|
||||
|
||||
' > /etc/ftpsftp/ftpsftp.conf
|
||||
|
||||
|
||||
## cloning master of ftpsftp git repo
|
||||
echo "info: cloning files from git repository to /opt/ftpsftp"
|
||||
cd /opt
|
||||
git clone $giturl
|
||||
|
||||
|
||||
## set symlink for script in /usr/local/bin
|
||||
echo "info: creating symlink for script in /usr/local/bin"
|
||||
cd /usr/local/bin
|
||||
ln -s /opt/ftpsftp/ftpsftp.sh ftpsftp
|
||||
|
||||
|
||||
## configure quota
|
||||
echo "info: configuring quota in fstab for $quotamountpoint"
|
||||
storageopt=$(cat /etc/fstab | grep $quotamountpoint | awk '{print $4}')
|
||||
sed -i 's/'$storageopt'/'$storageopt',usrquota/' /etc/fstab
|
||||
umount $quotamountpoint
|
||||
mount -a
|
||||
/etc/init.d/quota restart
|
||||
|
||||
|
||||
## configure vsftp
|
||||
cp /etc/vsftpd.conf /etc/vsftpd.conf_orig
|
||||
#sed -i 's/#listen_ipv6=YES/listen_ipv6=YES/' /etc/vsftpd.conf
|
||||
sed -i 's/#write_enable=YES/write_enable=YES/' /etc/vsftpd.conf
|
||||
sed -i 's/#local_umask=022/local_umask=0007\nfile_open_mode=0770/' /etc/vsftpd.conf
|
||||
sed -i 's/#chroot_local_user=YES/chroot_local_user=YES/' /etc/vsftpd.conf
|
||||
sed -i 's/#chroot_list_enable=YES/chroot_list_enable=YES/' /etc/vsftpd.conf
|
||||
sed -i 's/#chroot_list_file=\/etc\/vsftpd.chroot_list/chroot_list_file=\/etc\/vsftpd.chroot_list/' /etc/vsftpd.conf
|
||||
sed -i 's/#ftpd_banner=Welcome to blah FTP service./ftpd_banner=Welcome to '$acchost'./' /etc/vsftpd.conf
|
||||
|
||||
echo "
|
||||
## added by ftpsftp
|
||||
userlist_enable=YES
|
||||
userlist_deny=NO
|
||||
userlist_file=/etc/vsftpd.user_list
|
||||
" >> /etc/vsftpd.conf
|
||||
/etc/init.d/vsftpd restart
|
||||
|
||||
|
||||
## configure sshd
|
||||
echo "info: configuring ssh server"
|
||||
addgroup $sftpgroup
|
||||
cp /etc/ssh/sshd_config /etc/ssh/sshd_config_orig
|
||||
sed -i 's/Subsystem sftp \/usr\/lib\/openssh\/sftp-server/Subsystem sftp internal-sftp/' /etc/ssh/sshd_config
|
||||
|
||||
echo "
|
||||
|
||||
##### ssh configuration done by ftpsftp ############
|
||||
|
||||
AllowGroups admin $sftpgroup
|
||||
|
||||
Match group sftpusers
|
||||
ChrootDirectory $accpath/sftp_accounts/%u
|
||||
X11Forwarding no
|
||||
AllowTcpForwarding no
|
||||
ForceCommand internal-sftp
|
||||
|
||||
####################################################
|
||||
|
||||
" >> /etc/ssh/sshd_config
|
||||
|
||||
/etc/init.d/ssh restart
|
||||
|
||||
## adding shells
|
||||
echo "
|
||||
/bin/false
|
||||
/usr/lib/sftp-server
|
||||
" >> /etc/shells
|
||||
|
||||
|
||||
echo "you can now delete this script."
|
||||
echo "all you need is in /opt/ftpsftp, /etc/ftpsftp and /var/log/ftpsftp."
|
||||
echo 'everything is set to create your first user. try "ftpsftp -a <username>"'
|
||||
}
|
||||
|
||||
|
||||
|
||||
##### ftpsftp update #####
|
||||
update()
|
||||
{
|
||||
|
||||
## am i root?
|
||||
amiroot
|
||||
|
||||
cd /opt/ftpsftp
|
||||
git pull origin master
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
##### user creation #####
|
||||
add()
|
||||
{
|
||||
|
||||
## am i root?
|
||||
amiroot
|
||||
|
||||
|
||||
## set accname
|
||||
accname=$1
|
||||
|
||||
|
||||
## check if installed
|
||||
|
||||
|
||||
## reading configfile
|
||||
source /etc/ftpsftp/ftpsftp.conf
|
||||
|
||||
|
||||
## choose ftp or sftp
|
||||
echo "specify account type [sftp|ftp]"
|
||||
read acctype
|
||||
|
||||
if [ $acctype = "sftp" ]; then
|
||||
:
|
||||
else
|
||||
if [ $acctype = "ftp" ]; then
|
||||
:
|
||||
else
|
||||
echo "i'm sorry, i need to break this up right now."
|
||||
echo "it seams you can not understand some simple instructions."
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
|
||||
## quota
|
||||
ablocks=$(df | grep $quotamountpoint | awk '{print $2}')
|
||||
gblocks=$(repquota $quotamountpoint | grep 000 | awk '{print $4}')
|
||||
set -- $gblocks
|
||||
quotacount=0
|
||||
for var in "$@"
|
||||
do
|
||||
quotacount=$(($quotacount+$var))
|
||||
done
|
||||
|
||||
gblocks=$quotacount
|
||||
fblocks=$(($ablocks-$gblocks))
|
||||
fsize=${fblocks:0:$((${#fblocks}-3))}
|
||||
|
||||
needaccquota="yes"
|
||||
while [ $needaccquota = "yes" ]; do
|
||||
echo "please specify how much diskspace this account should provide. (in megabytes)"
|
||||
echo "maximum: $fsize"
|
||||
read accquota
|
||||
if [ -z "$accquota" ]; then
|
||||
echo "this field is mandatory."
|
||||
else
|
||||
if [ $accquota -lt $fsize ]; then
|
||||
needaccquota="notanymore"
|
||||
else
|
||||
echo "specified size too big or not a number. try again."
|
||||
fi
|
||||
fi
|
||||
done
|
||||
|
||||
|
||||
## requester
|
||||
while [ $trackrequester = "1" ]; do
|
||||
echo "who orderd this account? (i'm tracking this for a greater good.)"
|
||||
read accrequester
|
||||
if [ -z "$accrequester" ]; then
|
||||
echo "this field is mandatory."
|
||||
else
|
||||
trackrequester="notanymore"
|
||||
fi
|
||||
done
|
||||
|
||||
|
||||
## set $accport
|
||||
if [ $acctype = "sftp" ]; then
|
||||
accport="22"
|
||||
else
|
||||
accport="21"
|
||||
fi
|
||||
|
||||
|
||||
## get timestamp
|
||||
acctimestamp=$(date '+%d.%m.%Y %H:%M')
|
||||
|
||||
|
||||
## gen password (accpass)
|
||||
accpass=$(pwgen -snc 10 1)
|
||||
echo $accpass > pass.txt
|
||||
accencpass=$(makepasswd --clearfrom=pass.txt --crypt-md5 | awk '{print $2}')
|
||||
rm pass.txt
|
||||
|
||||
|
||||
## create home, set its permissions and add the user to sftp/ftpgroup
|
||||
if [ $acctype = "sftp" ]; then
|
||||
mkdir -p $accpath/$acctype"_accounts"/$accname/data
|
||||
# create the actual user (sftp)
|
||||
useradd -d /data -M -U -s /usr/lib/sftp-server -p $accencpass $accname
|
||||
chown -R $accname\: $accpath/$acctype"_accounts"/$accname/data
|
||||
usermod -G $sftpgroup $accname
|
||||
else
|
||||
mkdir -p $accpath/$acctype"_accounts"/$accname
|
||||
# create the actual user (ftp)
|
||||
useradd -d $accpath/$acctype"_accounts"/$accname -M -U -s /bin/false -p $accencpass $accname
|
||||
chown -R $accname\: $accpath/$acctype"_accounts"/$accname
|
||||
echo $accname >> /etc/vsftpd.user_list
|
||||
fi
|
||||
|
||||
|
||||
## configure quota
|
||||
accquota=$((accquota/1000*1024))
|
||||
setquota --all -u $accname $accquota"000" $accquota"000" 0 0
|
||||
|
||||
|
||||
## trigger log
|
||||
logging
|
||||
|
||||
|
||||
## account data output
|
||||
echo
|
||||
echo "account data"
|
||||
echo
|
||||
echo "host:" $acchost
|
||||
echo "port:" $accport
|
||||
echo "username:" $accname
|
||||
echo "password:" $accpass
|
||||
echo "quota:" $accquota"mb"
|
||||
echo "directory:" $accpath/$acctype"_accounts"/$accname
|
||||
echo "requester:" $accrequester
|
||||
echo
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
##### user deletion #####
|
||||
delete()
|
||||
{
|
||||
|
||||
## am i root?
|
||||
amiroot
|
||||
|
||||
accname=$1
|
||||
echo "feature not yet implemented"
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
##### password reset #####
|
||||
reset()
|
||||
{
|
||||
|
||||
## am i root?
|
||||
amiroot
|
||||
|
||||
accname=$1
|
||||
echo "feature not yet implemented"
|
||||
|
||||
}
|
||||
|
||||
resetquota()
|
||||
{
|
||||
|
||||
accname=$1
|
||||
|
||||
## reading configfile
|
||||
source /etc/ftpsftp/ftpsftp.conf
|
||||
|
||||
## quota calc
|
||||
ablocks=$(df | grep $quotamountpoint | awk '{print $2}')
|
||||
gblocks=$(repquota $quotamountpoint | grep 000 | awk '{print $4}')
|
||||
set -- $gblocks
|
||||
quotacount=0
|
||||
for var in "$@"
|
||||
do
|
||||
quotacount=$(($quotacount+$var))
|
||||
done
|
||||
|
||||
gblocks=$quotacount
|
||||
fblocks=$(($ablocks-$gblocks))
|
||||
fsize=${fblocks:0:$((${#fblocks}-3))}
|
||||
|
||||
needaccquota="yes"
|
||||
while [ $needaccquota = "yes" ]; do
|
||||
echo "please specify how much diskspace this account should provide. (in megabytes)"
|
||||
echo "maximum: $fsize"
|
||||
read accquota
|
||||
if [ -z "$accquota" ]; then
|
||||
echo "this field is mandatory."
|
||||
else
|
||||
if [ $accquota -lt $fsize ]; then
|
||||
needaccquota="notanymore"
|
||||
else
|
||||
echo "specified size too big or not a number. try again."
|
||||
fi
|
||||
fi
|
||||
done
|
||||
|
||||
## set quota
|
||||
accquota=$((accquota/1000*1024))
|
||||
setquota --all -u $accname $accquota"000" $accquota"000" 0 0
|
||||
|
||||
}
|
||||
|
||||
|
||||
##### logging #####
|
||||
logging()
|
||||
{
|
||||
|
||||
if [ $logging = 1 ]; then
|
||||
echo $acctype $accname $accpass $accquota $accrequester $acctimestamp >> /var/log/ftpsftp/accounts.log
|
||||
fi
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
##### mail notification #####
|
||||
#mailnotification()
|
||||
#{
|
||||
#
|
||||
#if [ $maillog = 1 ]; then
|
||||
# echo "mail notification is not yet implemented"
|
||||
#fi
|
||||
#
|
||||
#}
|
||||
|
||||
|
||||
|
||||
##### processing options #####
|
||||
while getopts "h,i,a:,d:,r:,q:,u,v" OPTION; do
|
||||
case $OPTION in
|
||||
h)
|
||||
usage
|
||||
exit 0
|
||||
;;
|
||||
i)
|
||||
installation
|
||||
exit 0
|
||||
;;
|
||||
a)
|
||||
name=$OPTARG
|
||||
run="yes"
|
||||
while [ $run = "yes" ]; do
|
||||
add $name
|
||||
echo "do you want to create another user? (yes/no)"
|
||||
read run
|
||||
if [[ $run = "yes" ]] || [[ $run = "y" ]]; then
|
||||
echo "specify account name"
|
||||
read name
|
||||
run="yes"
|
||||
fi
|
||||
done
|
||||
exit 0
|
||||
;;
|
||||
d)
|
||||
rmuser=$OPTARG
|
||||
delete $rmuser
|
||||
exit 0
|
||||
;;
|
||||
r)
|
||||
rpuser=$OPTARG
|
||||
reset $rpuser
|
||||
exit 0
|
||||
;;
|
||||
q)
|
||||
squser=$OPTARG
|
||||
resetquota $squser
|
||||
exit 0
|
||||
;;
|
||||
u)
|
||||
update
|
||||
exit 0
|
||||
;;
|
||||
v)
|
||||
version
|
||||
exit 0
|
||||
;;
|
||||
?)
|
||||
usage
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
|
||||
## print usage message if no option is given
|
||||
if [ -z $1 ]; then
|
||||
usage
|
||||
exit 1
|
||||
fi
|
||||
|
||||
|
||||
|
||||
## end of script
|
||||
exit 0
|
|
@ -0,0 +1,314 @@
|
|||
#!/bin/bash
|
||||
|
||||
|
||||
#################################################
|
||||
## ##
|
||||
## FTPsFTP ##
|
||||
## function definitions ##
|
||||
## ##
|
||||
#################################################
|
||||
|
||||
|
||||
# **** usage message ****
|
||||
usage()
|
||||
{
|
||||
echo "usage: ftpsftp options
|
||||
|
||||
OPTIONS:
|
||||
-h show this message
|
||||
-s show stats (not yet implemented)
|
||||
-a <username> add a user
|
||||
-d <username> delete a user
|
||||
-r <username> reset password for user
|
||||
-q <username> (re)set the quota for user
|
||||
-u update ftpsftp (pull from git)
|
||||
-v show version information
|
||||
|
||||
"
|
||||
}
|
||||
|
||||
|
||||
# **** version message ****
|
||||
version()
|
||||
{
|
||||
|
||||
echo "FTPsFTP - standalone ftp/sftp server solution"
|
||||
echo
|
||||
echo "vesion: $version"
|
||||
echo "author: $author"
|
||||
echo
|
||||
|
||||
}
|
||||
|
||||
|
||||
# **** am i root? ****
|
||||
# this is now in bashlib
|
||||
#amiroot()
|
||||
#{
|
||||
#if [ "$(whoami)" != "root" ]; then
|
||||
# echo
|
||||
# echo "sorry $USER, you need to gain root privileges to do this."
|
||||
# echo
|
||||
# exit 1;
|
||||
#fi
|
||||
#}
|
||||
|
||||
|
||||
# **** ftpsftp update ****
|
||||
update()
|
||||
{
|
||||
|
||||
# checking for root privileges
|
||||
amiroot
|
||||
|
||||
# pull updates from ftpsftp git repository
|
||||
cd /opt/ftpsftp
|
||||
git pull origin master
|
||||
log info "update - ftpsftp was updated (maybe)"
|
||||
|
||||
}
|
||||
|
||||
|
||||
# ***** calculating free quota *****
|
||||
quotacalc()
|
||||
{
|
||||
|
||||
local ablocks=$(df | grep $quotamountpoint | awk '{print $2}')
|
||||
local gblocks=$(repquota $quotamountpoint | grep 0 | awk '{print $4}')
|
||||
set -- $gblocks
|
||||
local quotacount=0
|
||||
for var in "$@"; do
|
||||
local quotacount=$(($quotacount+$var))
|
||||
done
|
||||
|
||||
local gblocks=$quotacount
|
||||
local fblocks=$(($ablocks-$gblocks))
|
||||
local fsize=$((fblocks*1000/1024))
|
||||
local fsize=${fsize:0:$((${#fsize}-3))}
|
||||
|
||||
# return result
|
||||
echo $fsize
|
||||
|
||||
}
|
||||
|
||||
|
||||
# **** set quota ****
|
||||
quotaconf()
|
||||
{
|
||||
|
||||
# checking for root privileges
|
||||
amiroot
|
||||
|
||||
# checking if user exists
|
||||
isuserthere $accname
|
||||
|
||||
# breaking up if user does not exist
|
||||
if [ $? -eq "1" ]; then
|
||||
echo "error: user does not exist."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# calculate free quota
|
||||
local fsize=$(quotacalc)
|
||||
|
||||
local run="yes"
|
||||
while [ $run = "yes" ]; do
|
||||
echo "please specify quota for user $accname. (in megabytes)"
|
||||
echo "maximum: $fsize"
|
||||
read accquota
|
||||
if [ -z "$accquota" ]; then
|
||||
echo "this field is mandatory."
|
||||
else
|
||||
if [ $accquota -lt $fsize ]; then
|
||||
local run="no"
|
||||
else
|
||||
echo "specified size too big or not a number. try again."
|
||||
fi
|
||||
fi
|
||||
done
|
||||
|
||||
# set quota
|
||||
accblockquota=$((accquota*1024))
|
||||
setquota --all -u $accname $accblockquota $accblockquota 0 0
|
||||
|
||||
}
|
||||
|
||||
|
||||
# **** check if user is already there or needs to be created ****
|
||||
isuserthere()
|
||||
{
|
||||
|
||||
id $accname &> /dev/null
|
||||
if [ $? -eq "0" ]; then
|
||||
return 0
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
|
||||
}
|
||||
|
||||
##### user creation #####
|
||||
add()
|
||||
{
|
||||
|
||||
# am i root?
|
||||
amiroot
|
||||
|
||||
# checking if user already exists
|
||||
isuserthere
|
||||
|
||||
# breaking up if user already exists
|
||||
if [ $? -eq "0" ]; then
|
||||
echo "error: user already exists."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# choose ftp or sftp
|
||||
echo "specify account type [sftp|ftp]"
|
||||
read acctype
|
||||
|
||||
if [ $acctype = "sftp" ]; then
|
||||
:
|
||||
else
|
||||
if [ $acctype = "ftp" ]; then
|
||||
:
|
||||
else
|
||||
echo "i'm sorry, i need to break this up right now."
|
||||
echo "it seams you can not understand some simple instructions."
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
# read requester if configfile option is 1
|
||||
while [ $trackrequester = "1" ]; do
|
||||
echo "who orderd this account? (i'm tracking this for a greater good.)"
|
||||
read accrequester
|
||||
if [ -z "$accrequester" ]; then
|
||||
echo "this field is mandatory."
|
||||
else
|
||||
trackrequester="notanymore"
|
||||
fi
|
||||
done
|
||||
|
||||
# set accport
|
||||
if [ $acctype = "sftp" ]; then
|
||||
local accport="22"
|
||||
else
|
||||
local accport="21"
|
||||
fi
|
||||
|
||||
# get timestamp
|
||||
local acctimestamp=$(date '+%d.%m.%Y %H:%M')
|
||||
|
||||
# create home, set its permissions and add the user to sftp/ftpgroup
|
||||
if [ $acctype = "sftp" ]; then
|
||||
mkdir -p $accpath/$acctype"_accounts"/$accname/data
|
||||
# create the actual user (sftp)
|
||||
useradd -d /data -M -U -s /usr/lib/sftp-server $accname
|
||||
chown -R $accname\: $accpath/$acctype"_accounts"/$accname/data
|
||||
usermod -G $sftpgroup $accname
|
||||
else
|
||||
mkdir -p $accpath/$acctype"_accounts"/$accname
|
||||
# create the actual user (ftp)
|
||||
useradd -d $accpath/$acctype"_accounts"/$accname -M -U -s /bin/false $accname
|
||||
chown -R $accname\: $accpath/$acctype"_accounts"/$accname
|
||||
usermod -G $ftpgroup $accname
|
||||
fi
|
||||
|
||||
# set password
|
||||
local accpass=$(setpasswd)
|
||||
|
||||
# configure quota
|
||||
quotaconf
|
||||
|
||||
# trigger logging
|
||||
logging $acctype $accname $accpass $accquota $accrequester $acctimestamp
|
||||
|
||||
# print account data
|
||||
echo
|
||||
echo "account data"
|
||||
echo
|
||||
echo "host:" $acchost
|
||||
echo "port:" $accport
|
||||
echo "username:" $accname
|
||||
echo "password:" $accpass
|
||||
echo "quota:" $accquota"MB"
|
||||
echo "directory:" $accpath/$acctype"_accounts"/$accname
|
||||
echo "requester:" $accrequester
|
||||
echo
|
||||
|
||||
}
|
||||
|
||||
# **** user deletion ****
|
||||
delete()
|
||||
{
|
||||
|
||||
# am i root?
|
||||
amiroot
|
||||
|
||||
# checking if user exists
|
||||
isuserthere
|
||||
|
||||
# breaking up if user does not exist
|
||||
if [ $? -eq "1" ]; then
|
||||
echo "error: user does not exist"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
id -nG $accname | grep $sftpgroup &> /dev/null
|
||||
if [ $? -eq "0" ]; then
|
||||
deluser $accname &> /dev/null
|
||||
rm -r $accpath/sftp_accounts/$accname
|
||||
else
|
||||
deluser $accname &> /dev/null
|
||||
rm -r $accpath/ftp_accounts/$accname
|
||||
fi
|
||||
|
||||
}
|
||||
|
||||
# **** generate password ****
|
||||
setpasswd()
|
||||
{
|
||||
|
||||
# checking if user exists
|
||||
isuserthere
|
||||
|
||||
# breaking up if user does not exist
|
||||
if [ $? -eq "1" ]; then
|
||||
echo "error: user does not exist"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
|
||||
# generating password
|
||||
local accpass=$(pwgen -snc 10 1)
|
||||
echo $accpass > pass.txt
|
||||
local accencpass=$(makepasswd --clearfrom=pass.txt --crypt-md5 | awk '{print $2}')
|
||||
rm pass.txt
|
||||
|
||||
# setting the password
|
||||
usermod -p $accencpass $accname
|
||||
|
||||
# returning unencrypded password
|
||||
echo $accpass
|
||||
|
||||
}
|
||||
|
||||
# **** logging ****
|
||||
logging()
|
||||
{
|
||||
|
||||
if [ $logging -eq "1" ]; then
|
||||
echo $@ >> $acclogfile
|
||||
fi
|
||||
|
||||
}
|
||||
|
||||
# **** statistics ****
|
||||
stats()
|
||||
{
|
||||
|
||||
echo "feature not yet implemented"
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,116 @@
|
|||
#!/bin/bash
|
||||
|
||||
|
||||
#################################################
|
||||
## ##
|
||||
## FTPsFTP ##
|
||||
## standalone ftp/sftp server solution ##
|
||||
## ##
|
||||
#################################################
|
||||
|
||||
|
||||
# **** do not touch as long as you are not me ****
|
||||
version="v0.5_beta"
|
||||
author="david@socialnerds.org"
|
||||
giturl="git://git.socialnerds.org/ftpsftp.git"
|
||||
logwhat="ftpsftp"
|
||||
log2stdout="1"
|
||||
|
||||
functionfile="/opt/ftpsftp/ftpsftp.func"
|
||||
configfile="/etc/ftpsftp.conf"
|
||||
|
||||
|
||||
# **** read function definitions and config file ****
|
||||
if [ -r $functionfile ]; then
|
||||
source $functionfile
|
||||
else
|
||||
echo "error: functionfile not found."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ -r $configfile ]; then
|
||||
source $configfile
|
||||
else
|
||||
echo "error: configuration file not found."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# **** load bashlib ****
|
||||
# need for some better routine to include bashlib
|
||||
if [ -d $bashlibpath ]; then
|
||||
source $bashlibpath/main
|
||||
source $bashlibpath/logengine
|
||||
log debug "preflight - logengine loaded"
|
||||
else
|
||||
echo "ERROR: bashlib not found"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
|
||||
# **** processing options ****
|
||||
while getopts "h,s,a:,d:,r:,q:,u,v" OPTION; do
|
||||
case $OPTION in
|
||||
h)
|
||||
usage
|
||||
exit 0
|
||||
;;
|
||||
s)
|
||||
stats
|
||||
exit 0
|
||||
;;
|
||||
a)
|
||||
accname=$OPTARG
|
||||
run="yes"
|
||||
while [ $run = "yes" ]; do
|
||||
add
|
||||
echo "do you want to create another user? (yes/no)"
|
||||
read run
|
||||
if [[ $run = "yes" ]] || [[ $run = "y" ]]; then
|
||||
echo "specify account name"
|
||||
read accname
|
||||
run="yes"
|
||||
fi
|
||||
done
|
||||
exit 0
|
||||
;;
|
||||
d)
|
||||
accname=$OPTARG
|
||||
delete
|
||||
exit 0
|
||||
;;
|
||||
r)
|
||||
accname=$OPTARG
|
||||
accpass=$(setpasswd)
|
||||
echo "the new password for user $accname is: $accpass"
|
||||
exit 0
|
||||
;;
|
||||
q)
|
||||
accname=$OPTARG
|
||||
quotaconf
|
||||
exit 0
|
||||
;;
|
||||
u)
|
||||
update
|
||||
exit 0
|
||||
;;
|
||||
v)
|
||||
version
|
||||
exit 0
|
||||
;;
|
||||
?)
|
||||
usage
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
|
||||
# **** print usage message if no option is given ****
|
||||
if [ -z $1 ]; then
|
||||
usage
|
||||
exit 1
|
||||
fi
|
||||
|
||||
|
||||
# **** end of script ****
|
||||
exit 0
|
|
@ -0,0 +1,207 @@
|
|||
#!/bin/bash
|
||||
|
||||
|
||||
#################################################
|
||||
## ##
|
||||
## FTPsFTP ##
|
||||
## installation script ##
|
||||
## ##
|
||||
#################################################
|
||||
|
||||
|
||||
# **** ftpsftp installation routine ****
|
||||
|
||||
# **** configuration section ****
|
||||
giturl="http://git.gitorious.org/aec/ftpsftp.git"
|
||||
acclogfile="/var/log/ftpsftp_accounts.log" #changed
|
||||
logfile="/var/log/ftpsftp.log" #new
|
||||
configfile="/etc/ftpsftp.conf" #changed
|
||||
reporoot="/opt" #new
|
||||
|
||||
|
||||
# **** am i root? ****
|
||||
if [ "$(whoami)" != "root" ]; then
|
||||
echo
|
||||
echo "$USER, in order to do this you need to gain root privileges."
|
||||
echo
|
||||
exit 1;
|
||||
fi
|
||||
|
||||
|
||||
# **** uninstall ****
|
||||
if [ -z $1 ]; then
|
||||
:
|
||||
elif [ $1 = "--uninstall" ]; then
|
||||
# **** removing files ****
|
||||
rm -r $reporoot/ftpsftp
|
||||
rm $logfile
|
||||
rm $acclogfile
|
||||
rm $configfile
|
||||
rm /etc/vsftpd.chroot_list
|
||||
rm /usr/local/bin/ftpsftp
|
||||
rm /etc/fstab
|
||||
mv /etc/fstab_orig /etc/fstab
|
||||
rm cp /etc/vsftpd.conf
|
||||
mv /etc/vsftpd.conf_orig /etc/vsftpd.conf
|
||||
rm /etc/vsftpd.group_list
|
||||
rm cp /etc/pam.d/vsftpd
|
||||
mv /etc/pam.d/vsftpd_orig /etc/pam.d/vsftpd
|
||||
rm /etc/ssh/sshd_config
|
||||
mv /etc/ssh/sshd_config_orig /etc/ssh/sshd_config
|
||||
rm /etc/shells
|
||||
mv /etc/shells_orig /etc/shells
|
||||
|
||||
# **** removing groups ****
|
||||
#delgroup $sftpgroup
|
||||
#delgroup $ftpgroup
|
||||
echo "info: everything except the system groups and the packages installed with apt successfully removed"
|
||||
fi
|
||||
|
||||
|
||||
# **** installing dependencies ****
|
||||
echo "info: trying to install dependencies via apt"
|
||||
apt-get update
|
||||
apt-get install -y vsftpd ssh quota quotatool makepasswd pwgen git-core vim
|
||||
|
||||
|
||||
# **** reading configuration from user ****
|
||||
echo "specify under which path the account home dirs should be stored (no tailing slash)"
|
||||
read accpath
|
||||
|
||||
echo "specify the mointpoint of the device where your accounts are stored (needed for quota config)"
|
||||
read quotamountpoint
|
||||
|
||||
echo "specify the fqdn of your host"
|
||||
read acchost
|
||||
|
||||
echo "specify a system group for your sftp users [default: sftpusers]"
|
||||
read sftpgroup
|
||||
if [ -z $sftpgroup ]; then
|
||||
sftpgroup="sftpusers"
|
||||
fi
|
||||
|
||||
echo "specify a system group for your ftp users [default: ftpusers]"
|
||||
read ftpgroup
|
||||
if [ -z $ftpgroup ]; then
|
||||
ftpgroup="ftpusers"
|
||||
fi
|
||||
|
||||
|
||||
# **** creating needed directorys ****
|
||||
# just in case, they should be already there
|
||||
echo "info: creating directorys"
|
||||
mkdir -p /var/log
|
||||
mkdir -p $reporoot
|
||||
|
||||
|
||||
# **** creating configfiles and logfiles ****
|
||||
echo "info: creating configuration and log files"
|
||||
|
||||
# creating chroot_list
|
||||
echo "$USER" > /etc/vsftpd.chroot_list
|
||||
|
||||
# creating log files
|
||||
echo "type name pass quota reguester timestamp" > $acclogfile
|
||||
touch $logfile
|
||||
|
||||
# create ftpsftp configuration file (default: /etc/ftpsftp/ftpsftp.conf)
|
||||
echo '## ftpsftp configuration file ##
|
||||
|
||||
accpath="'$accpath'" # this should point to where your accounts should be located
|
||||
quotamountpoint="'$quotamountpoint'" # mount point for quota configuration
|
||||
acchost="'$acchost'" # the dns name where your sever is reachable
|
||||
sftpgroup="'$sftpgroup'" # system group
|
||||
ftpgroup="'$ftpgroup'" # system group
|
||||
trackrequester="1" # switch to 0 if you do not want to track the account requester
|
||||
logging="1" # set this to 0 if you do not want any logging
|
||||
|
||||
' > $configfile
|
||||
|
||||
|
||||
# **** cloning master branch of ftpsftp git repo ****
|
||||
echo "info: cloning files from git repository to /opt/ftpsftp"
|
||||
cd $reporoot
|
||||
git clone $giturl
|
||||
|
||||
|
||||
# **** set symlink for script in /usr/local/bin ****
|
||||
echo "info: creating symlink for script in /usr/local/bin"
|
||||
cd /usr/local/bin
|
||||
ln -s $reporoot/ftpsftp/ftpsftp.sh ftpsftp
|
||||
|
||||
|
||||
# **** configure quota ****
|
||||
echo "info: configuring quota in fstab for $quotamountpoint"
|
||||
cp /etc/fstab /etc/fstab_orig
|
||||
cat /etc/fstab | grep -v $quotamountpoint > /etc/~fstab
|
||||
storageopt=$(cat /etc/fstab | grep $quotamountpoint | awk '{print $4}')
|
||||
sed -i 's/'$storageopt'/'$storageopt',usrquota/' /etc/fstab
|
||||
cat /etc/fstab | grep $quotamountpoint >> /etc/~fstab
|
||||
rm /etc/fstab && mv /etc/~fstab /etc/fstab
|
||||
umount $quotamountpoint
|
||||
mount -a
|
||||
/etc/init.d/quota restart
|
||||
|
||||
|
||||
# **** configure vsftp ****
|
||||
cp /etc/vsftpd.conf /etc/vsftpd.conf_orig
|
||||
#sed -i 's/#listen_ipv6=YES/listen_ipv6=YES/' /etc/vsftpd.conf
|
||||
sed -i 's/#write_enable=YES/write_enable=YES/' /etc/vsftpd.conf
|
||||
sed -i 's/#local_umask=022/local_umask=0007\nfile_open_mode=0770/' /etc/vsftpd.conf
|
||||
sed -i 's/#chroot_local_user=YES/chroot_local_user=YES/' /etc/vsftpd.conf
|
||||
sed -i 's/#chroot_list_enable=YES/chroot_list_enable=YES/' /etc/vsftpd.conf
|
||||
sed -i 's/#chroot_list_file=\/etc\/vsftpd.chroot_list/chroot_list_file=\/etc\/vsftpd.chroot_list/' /etc/vsftpd.conf
|
||||
sed -i 's/#ftpd_banner=Welcome to blah FTP service./ftpd_banner=Welcome to '$acchost'./' /etc/vsftpd.conf
|
||||
|
||||
|
||||
# creating vsftpd.group_list (used by pam)
|
||||
addgroup $ftpgroup
|
||||
echo "
|
||||
$ftpgroup
|
||||
admin
|
||||
" > /etc/vsftpd.group_list
|
||||
|
||||
# adding group list to pam.d
|
||||
cp /etc/pam.d/vsftpd /etc/pam.d/vsftpd_orig
|
||||
sed '2 a auth required pam_listfile.so item=group sense=allow file=/etc/vsftpd.group_list onerr=fail' /etc/pam.d/vsftpd > /etc/pam.d/vsftpd_new
|
||||
rm /etc/pam.d/vsftpd && mv /etc/pam.d/vsftpd_new /etc/pam.d/vsftpd
|
||||
|
||||
# restarting ftp service
|
||||
/etc/init.d/vsftpd restart
|
||||
|
||||
|
||||
# **** configure sshd ****
|
||||
echo "info: configuring ssh server"
|
||||
addgroup $sftpgroup
|
||||
cp /etc/ssh/sshd_config /etc/ssh/sshd_config_orig
|
||||
sed -i 's/Subsystem sftp \/usr\/lib\/openssh\/sftp-server/Subsystem sftp internal-sftp/' /etc/ssh/sshd_config
|
||||
|
||||
echo "
|
||||
|
||||
##### ssh configuration done by ftpsftp ############
|
||||
AllowGroups admin $sftpgroup
|
||||
|
||||
Match group sftpusers
|
||||
ChrootDirectory $accpath/sftp_accounts/%u
|
||||
X11Forwarding no
|
||||
AllowTcpForwarding no
|
||||
ForceCommand internal-sftp
|
||||
|
||||
" >> /etc/ssh/sshd_config
|
||||
|
||||
/etc/init.d/ssh restart
|
||||
|
||||
## adding shells
|
||||
cp /etc/shells /etc/shells_orig
|
||||
echo "
|
||||
/bin/false
|
||||
/usr/lib/sftp-server
|
||||
" >> /etc/shells
|
||||
|
||||
|
||||
echo "you can now delete this script."
|
||||
echo "all you need is in $reporoot/ftpsftp, $configfile, $acclogfile and $logfile"
|
||||
echo 'everything should be set to create your first user. try "ftpsftp -a <username>"'
|
||||
echo
|
||||
|
||||
exit 0
|
|
@ -0,0 +1,53 @@
|
|||
#!/bin/bash
|
||||
|
||||
#\
|
||||
# \
|
||||
# \_ _ _ _ _ _ _ _ _ _ _ _ _
|
||||
# #\
|
||||
# # \
|
||||
# heartbeat monitoring # \
|
||||
# script # /
|
||||
# # /
|
||||
# _ _ _ _ _ _ _ _ _ _ _ _ _#/
|
||||
# /
|
||||
# /
|
||||
#/
|
||||
|
||||
# **** config section ****
|
||||
author="david@socialnerds.org"
|
||||
version="0.2"
|
||||
giturl="git://git.aec.at/mbots.git"
|
||||
hostsfile="/etc/hosts"
|
||||
log2stdout="1"
|
||||
log2file="0"
|
||||
#logfile=/var/log/mbots.log
|
||||
log2syslog="1"
|
||||
logwhat="mbots_hb"
|
||||
|
||||
|
||||
# **** preflight ****
|
||||
|
||||
#searching for bashlib
|
||||
if [ -z $BASHLIB ]; then
|
||||
echo "ERROR: bashlib environment variable not set. terminating."
|
||||
exit 1
|
||||
else
|
||||
$bashlibpath=$BASHLIB
|
||||
fi
|
||||
|
||||
#load bashlib
|
||||
if [ -d $bashlibpath ]; then
|
||||
source $bashlibpath/main
|
||||
source $bashlibpath/logengine
|
||||
log debug "preflight - logengine loaded."
|
||||
else
|
||||
echo "ERROR: bashlib not found. terminating."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
# **** end of script ****
|
|
@ -0,0 +1 @@
|
|||
# list of hostnames to monitor
|
|
@ -0,0 +1,147 @@
|
|||
#!/bin/bash
|
||||
|
||||
#\
|
||||
# \
|
||||
# \_ _ _ _ _ _ _ _ _ _ _ _ _
|
||||
# #\
|
||||
# # \
|
||||
# heartbeat monitoring # \
|
||||
# script # /
|
||||
# # /
|
||||
# _ _ _ _ _ _ _ _ _ _ _ _ _#/
|
||||
# /
|
||||
# /
|
||||
#/
|
||||
|
||||
# **** config section ****
|
||||
#do not touch as long as you're not me
|
||||
author="david@socialnerds.org"
|
||||
version="0.1"
|
||||
giturl="git://git.aec.at/mbots.git"
|
||||
configfile="/etc/mbots/mbots.conf"
|
||||
log2stdout="1"
|
||||
logwhat="mbots_heartbeat"
|
||||
file="/etc/mbots/heartbeat.lst"
|
||||
|
||||
|
||||
# **** preflight ****
|
||||
#read configfile
|
||||
if [ -r $configfile ]; then
|
||||
source $configfile
|
||||
else
|
||||
echo "ERROR: configfile not found. terminating."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
#load bashlib
|
||||
if [ -d $bashlibpath ]; then
|
||||
source $bashlibpath/main
|
||||
source $bashlibpath/logengine
|
||||
log debug "preflight - logengine loaded"
|
||||
else
|
||||
echo "ERROR: bashlib not found. terminating."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
#check environment
|
||||
|
||||
|
||||
log info "**** starting heartbeat bot ****"
|
||||
|
||||
#set linecount to 1
|
||||
linecount="1"
|
||||
|
||||
#read one line at a time
|
||||
while read line; do
|
||||
#find first letter to determine if line is empty or a comment
|
||||
fletter=${line:0:1}
|
||||
|
||||
#check for first letter
|
||||
if [ -z $fletter ]; then
|
||||
#skip line it's empty
|
||||
log debug "config - skipping line $linecount in $file: it's empty"
|
||||
elif [ $fletter = "#" ]; then
|
||||
#skip line it's a comment
|
||||
log debug "config - skipping line $linecount in $file: it's a comment"
|
||||
else
|
||||
# getting hostname from heartbeat.lst
|
||||
hostname=$(echo $line | awk '{print $1}')
|
||||
|
||||
log debug "checking $hostname"
|
||||
|
||||
#check ipv6
|
||||
ipv6=$(dig $hostname AAAA +short | grep ":")
|
||||
if [ -z "$ipv6" ]; then
|
||||
log warning "no ipv6 record for $hostname"
|
||||
log debug "checking /etc/hosts"
|
||||
hosts=$(cat /etc/hosts | grep -iw $hostname | awk '{print $1}' | grep ":")
|
||||
if [ -z $hosts ]; then
|
||||
log warning "no ipv6 hosts entry found"
|
||||
else
|
||||
for var in $hosts; do
|
||||
log info "pinging $hostname($var)"
|
||||
ping6 -c 1 $var &> /dev/null
|
||||
err=$?
|
||||
if [ $err = "0" ]; then
|
||||
log info "$hostname($var) is reachable"
|
||||
else
|
||||
log error "$hostname($var) is not reachable"
|
||||
fi
|
||||
done
|
||||
fi
|
||||
else
|
||||
for var in $ipv6; do
|
||||
log info "pinging $hostname($var)"
|
||||
ping6 -c 1 $var &> /dev/null
|
||||
err=$?
|
||||
if [ $err = "0" ]; then
|
||||
log info "$hostname($var) is reachable"
|
||||
else
|
||||
log error "$hostname($var) is not reachable"
|
||||
fi
|
||||
done
|
||||
fi
|
||||
|
||||
#check ipv4
|
||||
ipv4=$(dig $hostname A +noall +answer | grep -v ";" | grep -v "CNAME" | awk '{print $5}' | grep -v "^$")
|
||||
if [ -z "$ipv4" ]; then
|
||||
log warning "no ipv4 record for $hostname"
|
||||
log debug "checking /etc/hosts"
|
||||
hosts=$(cat /etc/hosts | grep -iw $hostname | awk '{print $1}' | grep ".")
|
||||
if [ -z $hosts ]; then
|
||||
log warning "no ipv4 hosts entry found"
|
||||
else
|
||||
for var in $hosts; do
|
||||
log info "pinging $hostname($var)"
|
||||
ping -c 1 $var &> /dev/null
|
||||
err=$?
|
||||
if [ $err = "0" ]; then
|
||||
log info "$hostname($var) is reachable"
|
||||
else
|
||||
log error "$hostname($var) is not reachable"
|
||||
fi
|
||||
done
|
||||
fi
|
||||
else
|
||||
for var in $ipv4; do
|
||||
log info "pinging $hostname($var)"
|
||||
ping -c 1 $var &> /dev/null
|
||||
err=$?
|
||||
if [ $err = "0" ]; then
|
||||
log info "$hostname($var) is reachable"
|
||||
else
|
||||
log error "$hostname($var) is not reachable"
|
||||
fi
|
||||
done
|
||||
fi
|
||||
|
||||
fi
|
||||
|
||||
let linecount++
|
||||
|
||||
done < $file
|
||||
|
||||
log debug "**** all checks done ****"
|
||||
|
||||
|
||||
# **** end of script ****
|
|
@ -0,0 +1,123 @@
|
|||
#!/usr/bin/python
|
||||
"""Replacement for htpasswd"""
|
||||
# Original author: Eli Carter
|
||||
|
||||
import os
|
||||
import sys
|
||||
import random
|
||||
from optparse import OptionParser
|
||||
|
||||
# We need a crypt module, but Windows doesn't have one by default. Try to find
|
||||
# one, and tell the user if we can't.
|
||||
try:
|
||||
import crypt
|
||||
except ImportError:
|
||||
try:
|
||||
import fcrypt as crypt
|
||||
except ImportError:
|
||||
sys.stderr.write("Cannot find a crypt module. "
|
||||
"Possibly http://carey.geek.nz/code/python-fcrypt/\n")
|
||||
sys.exit(1)
|
||||
|
||||
|
||||
def salt():
|
||||
"""Returns a string of 2 randome letters"""
|
||||
letters = 'abcdefghijklmnopqrstuvwxyz' \
|
||||
'ABCDEFGHIJKLMNOPQRSTUVWXYZ' \
|
||||
'0123456789/.'
|
||||
return random.choice(letters) + random.choice(letters)
|
||||
|
||||
|
||||
class HtpasswdFile:
|
||||
"""A class for manipulating htpasswd files."""
|
||||
|
||||
def __init__(self, filename, create=False):
|
||||
self.entries = []
|
||||
self.filename = filename
|
||||
if not create:
|
||||
if os.path.exists(self.filename):
|
||||
self.load()
|
||||
else:
|
||||
raise Exception("%s does not exist" % self.filename)
|
||||
|
||||
def load(self):
|
||||
"""Read the htpasswd file into memory."""
|
||||
lines = open(self.filename, 'r').readlines()
|
||||
self.entries = []
|
||||
for line in lines:
|
||||
username, pwhash = line.split(':')
|
||||
entry = [username, pwhash.rstrip()]
|
||||
self.entries.append(entry)
|
||||
|
||||
def save(self):
|
||||
"""Write the htpasswd file to disk"""
|
||||
open(self.filename, 'w').writelines(["%s:%s\n" % (entry[0], entry[1])
|
||||
for entry in self.entries])
|
||||
|
||||
def update(self, username, password):
|
||||
"""Replace the entry for the given user, or add it if new."""
|
||||
pwhash = crypt.crypt(password, salt())
|
||||
matching_entries = [entry for entry in self.entries
|
||||
if entry[0] == username]
|
||||
if matching_entries:
|
||||
matching_entries[0][1] = pwhash
|
||||
else:
|
||||
self.entries.append([username, pwhash])
|
||||
|
||||
def delete(self, username):
|
||||
"""Remove the entry for the given user."""
|
||||
self.entries = [entry for entry in self.entries
|
||||
if entry[0] != username]
|
||||
|
||||
|
||||
def main():
|
||||
"""%prog [-c] -b filename username password
|
||||
Create or update an htpasswd file"""
|
||||
# For now, we only care about the use cases that affect tests/functional.py
|
||||
parser = OptionParser(usage=main.__doc__)
|
||||
parser.add_option('-b', action='store_true', dest='batch', default=False,
|
||||
help='Batch mode; password is passed on the command line IN THE CLEAR.'
|
||||
)
|
||||
parser.add_option('-c', action='store_true', dest='create', default=False,
|
||||
help='Create a new htpasswd file, overwriting any existing file.')
|
||||
parser.add_option('-D', action='store_true', dest='delete_user',
|
||||
default=False, help='Remove the given user from the password file.')
|
||||
|
||||
options, args = parser.parse_args()
|
||||
|
||||
def syntax_error(msg):
|
||||
"""Utility function for displaying fatal error messages with usage
|
||||
help.
|
||||
"""
|
||||
sys.stderr.write("Syntax error: " + msg)
|
||||
sys.stderr.write(parser.get_usage())
|
||||
sys.exit(1)
|
||||
|
||||
if not options.batch:
|
||||
syntax_error("Only batch mode is supported\n")
|
||||
|
||||
# Non-option arguments
|
||||
if len(args) < 2:
|
||||
syntax_error("Insufficient number of arguments.\n")
|
||||
filename, username = args[:2]
|
||||
if options.delete_user:
|
||||
if len(args) != 2:
|
||||
syntax_error("Incorrect number of arguments.\n")
|
||||
password = None
|
||||
else:
|
||||
if len(args) != 3:
|
||||
syntax_error("Incorrect number of arguments.\n")
|
||||
password = args[2]
|
||||
|
||||
passwdfile = HtpasswdFile(filename, create=options.create)
|
||||
|
||||
if options.delete_user:
|
||||
passwdfile.delete(username)
|
||||
else:
|
||||
passwdfile.update(username, password)
|
||||
|
||||
passwdfile.save()
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
|
@ -0,0 +1,30 @@
|
|||
#!/bin/bash
|
||||
|
||||
function usage {
|
||||
echo "./htpasswd.sh <username> <file>"
|
||||
}
|
||||
|
||||
if [ $1 ]; then
|
||||
USER=$1
|
||||
else
|
||||
USER=$(whoami)
|
||||
fi
|
||||
|
||||
SUCCESS=1
|
||||
while [ $SUCCESS -ne 0 ]; do
|
||||
PASSWD=$(openssl passwd -apr1)
|
||||
if [ $? -eq 0 ]; then
|
||||
SUCCESS=0
|
||||
fi
|
||||
done
|
||||
|
||||
if [ $2 ]; then
|
||||
FILE=$2
|
||||
if [ $FILE ]; then
|
||||
echo "$USER:$PASSWD" >> $FILE
|
||||
fi
|
||||
else
|
||||
echo "$USER:$PASSWD"
|
||||
fi
|
||||
|
||||
exit 0
|
|
@ -0,0 +1,53 @@
|
|||
#!/bin/bash
|
||||
|
||||
# moka icon theme install script
|
||||
|
||||
tempdir="/tmp/moka"
|
||||
baseurl="https://github.com/snwh"
|
||||
repolist="moka-icon-theme
|
||||
moka-icon-theme-extras
|
||||
moka-icon-theme-symbolic
|
||||
moka-icon-theme-dark
|
||||
moka-icon-theme-blue"
|
||||
|
||||
if [ $(whoami) != "root" ]; then
|
||||
echo "you are not running this script with root privileges."
|
||||
echo -e "installing moka-icon-theme only for $(whoami). continue? (y/n) \c"
|
||||
read choice
|
||||
if [ $choice != "y" ] && [ $choice != "Y" ]; then
|
||||
exit 1
|
||||
fi
|
||||
else
|
||||
echo "you are running this script with root privileges."
|
||||
echo -e "installing moka-icon-theme systemwide. continue? (y/n) \c"
|
||||
read choice
|
||||
if [ $choice != "y" ] && [ $choice != "Y" ]; then
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ -d $tempdir ]; then
|
||||
rm -r $tempdir
|
||||
fi
|
||||
|
||||
echo "cloning repositories to $tempdir"
|
||||
for theme in $repolist; do
|
||||
mkdir $tempdir; cd $tempdir
|
||||
git clone $baseurl/$theme".git"
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "you might not have git installed."
|
||||
exit 1
|
||||
fi
|
||||
if [ $(whoami) != "root" ]; then
|
||||
cp -r $tempdir/$theme/Mok* $HOME/.icons
|
||||
else
|
||||
cp -r $tempdir/$theme/Mok* /usr/share/icons
|
||||
fi
|
||||
cd -
|
||||
done
|
||||
|
||||
echo "cleaning up"
|
||||
rm -r $tempdir
|
||||
echo "everything done"
|
||||
|
||||
exit 0
|
|
@ -0,0 +1,43 @@
|
|||
#!/bin/bash
|
||||
|
||||
# archlinux yaourt installer
|
||||
|
||||
baselink="https://aur.archlinux.org/packages"
|
||||
packages="package-query yaourt"
|
||||
#uncomment following for passing the packages as option
|
||||
#if [ -z $1 ]; then
|
||||
# echo "usage: ./install_yaourt.sh <list of packages>"
|
||||
# exit 1
|
||||
#fi
|
||||
#packages="$*"
|
||||
tmpfolder="getyaourt"
|
||||
|
||||
sudo pacman -Syu
|
||||
sudo pacman -S fakeroot binutils gcc make patch pkg-config wget git autoconf
|
||||
|
||||
for package in $packages; do
|
||||
|
||||
if [ -d /tmp/$tmpfolder ]; then
|
||||
rm -rf /tmp/$tmpfolder #use sudo on a multiuser system
|
||||
fi
|
||||
|
||||
mkdir /tmp/$tmpfolder
|
||||
|
||||
|
||||
link=$(curl -s "$baselink/$package" | grep "Download tarball" | sed 's/"/\ /g' | awk '{print $3}')
|
||||
cd /tmp/$tmpfolder
|
||||
wget "https://aur.archlinux.org$link" && tar xzf *
|
||||
|
||||
cd $package; makepkg -s
|
||||
if [ $? -eq 0 ]; then
|
||||
sudo pacman -U *.xz
|
||||
else
|
||||
echo "error: could not source PKGBUILD"
|
||||
fi
|
||||
cd - > /dev/null
|
||||
rm -rf /tmp/$tmpfolder
|
||||
|
||||
done
|
||||
|
||||
echo "info: everything done"
|
||||
|
|
@ -0,0 +1,9 @@
|
|||
#!/bin/bash
|
||||
|
||||
export JEKYLL_VERSION=4.2.0
|
||||
docker run --rm \
|
||||
--volume="$PWD:/srv/jekyll" \
|
||||
--volume="$HOME/Public/docs:/srv/docs" \
|
||||
-p 127.0.0.1:4000:4000/tcp \
|
||||
-it jekyll/jekyll:$JEKYLL_VERSION \
|
||||
jekyll $@
|
|
@ -0,0 +1,49 @@
|
|||
#!/bin/bash
|
||||
|
||||
#
|
||||
# journal script for keeping
|
||||
# track of what i do and think
|
||||
#
|
||||
|
||||
|
||||
# it makes sence you add a bash alias like this to your ~/.bashrc
|
||||
# alias='/path/to/journal.sh /path/to/outputfile.txt'
|
||||
# do that and you can use journal as follows:
|
||||
# usage: journal
|
||||
# journal read
|
||||
# journal edit
|
||||
|
||||
|
||||
|
||||
#check if output file is given as first option
|
||||
if [ -z $1 ]; then
|
||||
outputfile=journal.txt
|
||||
else
|
||||
outputfile=$1
|
||||
fi
|
||||
|
||||
if [ -z $2 ]; then
|
||||
:
|
||||
else
|
||||
if [ $2 = "read" ]; then
|
||||
less $outputfile
|
||||
exit $?
|
||||
elif [ $2 = "edit" ]; then
|
||||
vim $outputfile
|
||||
exit $?
|
||||
fi
|
||||
fi
|
||||
|
||||
|
||||
#generating timestamp
|
||||
timestamp=$(date '+%d.%m.%Y %H:%M')
|
||||
|
||||
#read journal entry from stdin
|
||||
echo "enter oneliner into journal:"; read input
|
||||
|
||||
#writing to outputfile
|
||||
echo "**** $timestamp ****" >> $outputfile
|
||||
echo $input >> $outputfile
|
||||
echo "" >> $outputfile
|
||||
|
||||
# **** end of script ****
|
|
@ -0,0 +1 @@
|
|||
#this repository is discontinued.
|
|
@ -0,0 +1,41 @@
|
|||
# **** kvm-tools readme file ****
|
||||
|
||||
what we have here is a litte tool to backup your kvm/libvirt virtual machines really convenient! check it out!
|
||||
|
||||
this readme was first released with kvm-tools.sh v0.1rc on the 21st of april 2011, that's why i call it judgementday release.
|
||||
|
||||
|
||||
# **** installation ****
|
||||
# here on a ubuntu machine, but kvm-tools should
|
||||
# run perfectly on all unix based operating systems
|
||||
# as long as there is a bash and libvirt
|
||||
run:
|
||||
sudo apt-get install git-core (if you do not have git installed already)
|
||||
cd /opt
|
||||
sudo git clone git://git.socialnerds.org/kvm-tools.git
|
||||
sudo git clone git://git.socialnerds.org/bashlib.git
|
||||
|
||||
rename the configfile sample to kvm-tools.conf
|
||||
move it to /etc/kvm-tools.conf
|
||||
and change its content to meet your needs
|
||||
|
||||
after configuration run:
|
||||
cd /opt/kvm-tools
|
||||
sudo ./kvm-tools.sh -f
|
||||
|
||||
finished!
|
||||
|
||||
for usage help type:
|
||||
"kvm-tools -h" or just "kvm-tools"
|
||||
|
||||
|
||||
# **** in progress ****
|
||||
future features
|
||||
- browsevdisk (mounting a virtual disk (img, qcow2) in the hosts filesystem)
|
||||
|
||||
|
||||
hints
|
||||
- a domain uuid should just exist once in the configuration folder
|
||||
- only files with .xml will be read in the configpath
|
||||
|
||||
|
|
@ -0,0 +1,44 @@
|
|||
#!/bin/bash
|
||||
|
||||
#
|
||||
# mount script for qcow2 images
|
||||
# v0.1
|
||||
#
|
||||
|
||||
# read imagename
|
||||
if [ -z $1 ]; then
|
||||
echo 'usage: "browseqcow2 <image.qcow2>"'
|
||||
exit 1
|
||||
fi
|
||||
|
||||
imagename=$1
|
||||
|
||||
|
||||
# im i root
|
||||
if [ $(whoami) != "root" ]; then
|
||||
echo "only root can do this"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# run unmount
|
||||
if [[ $1 = "--unmount" || $1 = "-u" || $1 = "--umount" ]]; then
|
||||
umount /mnt/
|
||||
qemu-nbd --disconnect /dev/nbd0
|
||||
echo "image unmounted"
|
||||
echo
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# load kernel module
|
||||
modprobe nbd max_part=8
|
||||
|
||||
# gen blockdevice
|
||||
qemu-nbd --connect=/dev/nbd0 $imagename
|
||||
|
||||
# make the actual mount
|
||||
sleep 2
|
||||
mount /dev/nbd0p1 /mnt/
|
||||
|
||||
echo "$imagename is mounted in /mnt"
|
||||
echo 'run "browseqcow2.sh --unmount" when ready'
|
||||
echo
|
|
@ -0,0 +1,58 @@
|
|||
#!/bin/bash
|
||||
|
||||
if [ $(whoami) = "root" ]; then
|
||||
:
|
||||
else
|
||||
echo "only root can do this"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "hostname?"
|
||||
read hostname
|
||||
echo "username?"
|
||||
read username
|
||||
echo "architecture? [amd64]"
|
||||
read arch
|
||||
echo "disksize? [8]"
|
||||
read disksize
|
||||
|
||||
if [ -z $disksize ]; then
|
||||
disksize=8192
|
||||
else
|
||||
disksize=$((disksize*1024))
|
||||
fi
|
||||
|
||||
if [ -z $arch ]; then
|
||||
arch="amd64"
|
||||
fi
|
||||
|
||||
clear
|
||||
echo
|
||||
echo "a virtual machine with following details will be created in $(pwd)"
|
||||
echo
|
||||
echo "hostname: $hostname"
|
||||
echo "os: lucid lynx"
|
||||
echo "architecture: $arch"
|
||||
echo "disksize: $disksize"
|
||||
echo "password: password"
|
||||
echo "proceed? [yes]"
|
||||
read proceed
|
||||
|
||||
if [ -z $proceed ]; then
|
||||
proceed="yes"
|
||||
fi
|
||||
|
||||
if [ $proceed = "yes" ]; then
|
||||
:
|
||||
else
|
||||
exit 1
|
||||
fi
|
||||
|
||||
|
||||
ubuntu-vm-builder kvm lucid --arch "$arch" --mem '512' --rootsize "$disksize" --swapsize '1024' --kernel-flavour 'virtual' --hostname "$hostname" --domain 'socialnerds.org' --mirror 'http://roxy.socialnerds.org/ubuntu' --components 'main,restricted,universe,multiverse' --addpkg "ssh" --name 'creator' --user "$username" --pass 'password'
|
||||
|
||||
echo
|
||||
echo "creation finished"
|
||||
exit 0
|
||||
|
||||
|
|
@ -0,0 +1,16 @@
|
|||
#!/bin/bash
|
||||
|
||||
|
||||
if [ -z $1 ]; then
|
||||
# reading the imagename
|
||||
echo "what name should it have?"
|
||||
read name
|
||||
else
|
||||
name=$1
|
||||
fi
|
||||
|
||||
|
||||
# generating the actual image
|
||||
qemu-img create -f qcow2 $name.qcow2 16G
|
||||
|
||||
exit 0
|
|
@ -0,0 +1,14 @@
|
|||
#!/bin/bash
|
||||
|
||||
# generating new ids for a vm
|
||||
newuuid=$(uuidgen)
|
||||
newmac=$(MACADDR="52:54:$(dd if=/dev/urandom count=1 2>/dev/null | md5sum | sed 's/^\(..\)\(..\)\(..\)\(..\).*$/\1:\2:\3:\4/')"; echo $MACADDR)
|
||||
|
||||
# printing new ids
|
||||
#clear
|
||||
echo
|
||||
echo "UUID: $newuuid"
|
||||
echo "MAC: $newmac"
|
||||
echo
|
||||
|
||||
exit 0
|
|
@ -0,0 +1,66 @@
|
|||
#!/bin/bash
|
||||
|
||||
#######################################
|
||||
## ##
|
||||
## firstboot script ##
|
||||
## kvm-tools ##
|
||||
## ##
|
||||
#######################################
|
||||
|
||||
|
||||
# **** configuration section ****
|
||||
sshgroup="sshusers"
|
||||
user=$(cat /etc/passwd | grep 1000)
|
||||
user=${user:0:$(($(echo `expr index "$user" :`)-1))}
|
||||
|
||||
# **** installing fortunes-ubuntu-server ****
|
||||
apt-get update
|
||||
apt-get install -y fortunes-ubuntu-server
|
||||
|
||||
|
||||
# **** motd ****
|
||||
echo 'if you want to have here something like this:
|
||||
___.
|
||||
\_ |__ _______ ___
|
||||
| __ \ / _ \ \/ /
|
||||
| \_\ ( <_> > <
|
||||
|___ /\____/__/\_ \
|
||||
\/ \/.socialnerds.org
|
||||
|
||||
socialnerds mail server
|
||||
|
||||
go to http://www.network-science.de/ascii/ and modify /etc/motd.tail
|
||||
' > /etc/motd.tail
|
||||
|
||||
rm /etc/update-motd.d/10-help-text
|
||||
rm /etc/update-motd.d/00-header
|
||||
echo '#!/bin/bash' > /etc/update-motd.d/00-header
|
||||
echo 'echo "Running Kernel: $(uname -r)"' >> /etc/update-motd.d/00-header
|
||||
chmod +x /etc/update-motd.d/00-header
|
||||
|
||||
|
||||
# **** ssh server config ****
|
||||
echo "
|
||||
__.-._
|
||||
'-._'7'
|
||||
/'.-c
|
||||
| /T
|
||||
_)_/LI
|
||||
|
||||
this machine is
|
||||
protected by a
|
||||
master of the force!
|
||||
" > /etc/issue.net
|
||||
|
||||
sed -i 's/#Banner/Banner/' /etc/ssh/sshd_config
|
||||
echo "" >> /etc/ssh/sshd_config
|
||||
echo "# Restrictions added by firstboot.sh" >> /etc/ssh/sshd_config
|
||||
echo "AllowGroups $sshgroup" >> /etc/ssh/sshd_config
|
||||
echo "" >> /etc/ssh/sshd_config
|
||||
|
||||
addgroup $sshgroup
|
||||
adduser $user $sshgroup
|
||||
|
||||
|
||||
# **** end of script ****
|
||||
exit 0
|
|
@ -0,0 +1,24 @@
|
|||
# **** kvm-tools sample config file ****
|
||||
# this file should be renamed to kvm-tools.conf and moved to /etc
|
||||
|
||||
# locations (do not use tailing slashes)
|
||||
repopath="/opt/kvm-tools" # path to the local kvm-tools git repo
|
||||
configpath="/etc/libvirt/qemu" # path to the xml config files
|
||||
imagepath="/path/to/images" # virtual disks location (just for vm creation)
|
||||
backuppath="/path/to/backup" # backup destination
|
||||
|
||||
# bashlib
|
||||
bashlibpath="/opt/bashlib" # bashlib location
|
||||
|
||||
# logging
|
||||
loglevel="4"
|
||||
log2stdout="1"
|
||||
log2syslog="1"
|
||||
log2file="1"
|
||||
logfile="/var/log/kvm-tools.log"
|
||||
|
||||
# server deployment (ubuntu)
|
||||
defaultdomain="aec.at"
|
||||
defaultmirror="http://updater.aec.at/ubuntu"
|
||||
recpackages="ssh bash-completion acpid unattended-upgrades nload htop tshark nmap aptitude ncdu parted vim logrotate apparmor-profiles apparmor-utils"
|
||||
optpackages="screen nano dnsutils locate dialog pwgen git-core iftop mtr lft zsh"
|
|
@ -0,0 +1,638 @@
|
|||
#!/bin/bash
|
||||
|
||||
|
||||
#######################################
|
||||
## ##
|
||||
## function definitions ##
|
||||
## kvm-tools ##
|
||||
## ##
|
||||
#######################################
|
||||
|
||||
|
||||
# **** usage message ****
|
||||
# this will print the usage message
|
||||
usage()
|
||||
{
|
||||
|
||||
echo "usage: kvm-tools options <args>
|
||||
|
||||
OPTIONS:
|
||||
-c <vmname> create guest
|
||||
-e <vmname> edit guest
|
||||
-a <vmname> add virtual disk to guest
|
||||
-b <vmname|all> backup guest(s)
|
||||
|
||||
-h show this message
|
||||
-v show version information
|
||||
-i generate new id's
|
||||
-f run environment check/fix
|
||||
-u update kvm-tools (pull from git)
|
||||
|
||||
"
|
||||
|
||||
}
|
||||
|
||||
|
||||
# **** version message ****
|
||||
# this will print the version message
|
||||
version()
|
||||
{
|
||||
|
||||
echo
|
||||
echo "kvm-tools"
|
||||
echo
|
||||
echo "vesion: $version"
|
||||
echo "author: $author"
|
||||
echo
|
||||
|
||||
log debug "version - version information printed"
|
||||
|
||||
}
|
||||
|
||||
|
||||
# **** get image path(s) ****
|
||||
# with parse the image path(s) from xml
|
||||
getimgpath()
|
||||
{
|
||||
|
||||
local raw=$(virsh dumpxml $1 | grep "file=" | grep -v "/dev/" | tr -d "<'>")
|
||||
for item in $raw; do
|
||||
if [ $item = "source" ]; then
|
||||
:
|
||||
else
|
||||
echo ${item:5:$(($(echo `expr length "$item"`)-6))}
|
||||
fi
|
||||
done
|
||||
|
||||
}
|
||||
|
||||
# **** get xml path ****
|
||||
# will search for matching uuid in $configpath and defines global variable $xmlpath
|
||||
getxmlpath()
|
||||
{
|
||||
|
||||
local list=$(ls $configpath | grep xml | grep -v "~")
|
||||
local uuid=$(virsh domuuid $1)
|
||||
local i=0
|
||||
for var in $list; do
|
||||
if [ -w $configpath/$var ]; then
|
||||
local raw=$(cat $configpath/$var | grep uuid)
|
||||
local uuidfromfile=${raw:8:36}
|
||||
if [ $uuidfromfile = $uuid ]; then
|
||||
xmlpath="$configpath/$var"
|
||||
let i++
|
||||
fi
|
||||
else
|
||||
log error 'getxmlpath - some of the xml configuration files are not writeable, run "kvm-tools -f" to fix this'
|
||||
exit 1
|
||||
fi
|
||||
done
|
||||
if [ $i = "1" ]; then
|
||||
:
|
||||
return 0
|
||||
elif [ $i = "0" ]; then
|
||||
log error "getxmlpath - xml file for $1 could not be determined in $configpath"
|
||||
exit 1
|
||||
elif [ $i -gt "1" ]; then
|
||||
log error "getxmlpath - there is more than one file with matching uuid in $configpath"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
}
|
||||
|
||||
|
||||
# **** dialog window creation ****
|
||||
# creates the dialog windows
|
||||
graph()
|
||||
{
|
||||
|
||||
local bgtitle="kvm-tools $version | $1"
|
||||
|
||||
if [ $2 = "--inputbox" ]; then
|
||||
local size="7 80"
|
||||
elif [ $2 = "--yesno" ]; then
|
||||
local size="20 80"
|
||||
elif [ $2 = "--fselect" ]; then
|
||||
local size="12 80"
|
||||
else
|
||||
local size="20 80 14"
|
||||
fi
|
||||
|
||||
dialog --backtitle "$bgtitle" --no-cancel "$2" "$3" $size $4 2> /tmp/dialog
|
||||
local returncode=$?
|
||||
clear
|
||||
dialogresult=$(cat /tmp/dialog)
|
||||
rm /tmp/dialog
|
||||
return $returncode
|
||||
|
||||
}
|
||||
|
||||
|
||||
# **** backup ****
|
||||
# the virtual disk image and the xml config file
|
||||
# will be saved to the backuppath
|
||||
backup()
|
||||
{
|
||||
|
||||
# am i root?
|
||||
amiroot
|
||||
|
||||
# creat local variable with given machines (comma seperated list)
|
||||
local list=$1
|
||||
|
||||
# creat local variables with all running/all shutoff machines (whitespace seperated)
|
||||
local running=$(virsh list --all | grep "running" | awk '{print $2}')
|
||||
local shutoff=$(virsh list --all | grep "shut off" | awk '{print $2}')
|
||||
|
||||
# check for given option "all"
|
||||
if [ $list = "all" ]; then
|
||||
# if "all" was given fill the list with all machines
|
||||
list="$running $shutoff"
|
||||
else
|
||||
# otherwise just change the commas to whitespaces in the list
|
||||
local list=${list//,/ }
|
||||
fi
|
||||
|
||||
# getting a short timestamp like this 20110423
|
||||
#local timestamp=$(gettimestamp short)
|
||||
|
||||
# $var will be the machine name
|
||||
for var in $list; do
|
||||
log info "backup - starting backup of $var"
|
||||
|
||||
# BACKUP XML file to backuppath
|
||||
virsh dumpxml $var > $backuppath/$var.xml
|
||||
log debug "backup - backing up xml file for $var"
|
||||
|
||||
# SUSPEND machine if running
|
||||
local run=0
|
||||
if [ $(echo $shutoff | grep -c $var) = "0" ]; then
|
||||
log debug "backup - suspending $var"
|
||||
virsh suspend $var &> /dev/null
|
||||
local run=$?
|
||||
fi
|
||||
|
||||
# check if suspend was successfull (if not.. skip)
|
||||
if [ $run = 0 ]; then
|
||||
|
||||
# check for more than one image file
|
||||
for item in $(getimgpath $var); do
|
||||
|
||||
# CEATE HASH for image diff
|
||||
log debug "backup - creating sha1 hash of $item"
|
||||
local sum=$(sha1sum $item | awk '{print $1}')
|
||||
|
||||
# get new filename
|
||||
local newfile=${item##/*/}
|
||||
#local ending=${item:$(echo `expr index "$item" .`)}
|
||||
|
||||
# BACKUP IMAGE file to backuppath
|
||||
log debug "backup - backing up $item"
|
||||
cp $item $backuppath/$newfile
|
||||
|
||||
# RESUME machine if paused
|
||||
if [ $(echo $shutoff | grep -c $var) = "0" ]; then
|
||||
log debug "backup - resuming $var"
|
||||
virsh resume $var &> /dev/null
|
||||
fi
|
||||
|
||||
# CHECK if HASH matches
|
||||
log debug "backup - creating sha1 hash of $backuppath/$newfile"
|
||||
if [ $sum = $(sha1sum $backuppath/$newfile | awk '{print $1}') ]; then
|
||||
log debug "backup - hash for $newfile was successfully checked"
|
||||
log info "backup - $var successfully backuped"
|
||||
else
|
||||
log error "backup - hash for $newfile does not match"
|
||||
fi
|
||||
done
|
||||
|
||||
else
|
||||
log error "backup - could not suspend $var, skipping backup of $var"
|
||||
fi
|
||||
done
|
||||
|
||||
}
|
||||
|
||||
|
||||
# **** edit vm config (xml) ****
|
||||
# opens vim with xml file for given guest
|
||||
edit()
|
||||
{
|
||||
|
||||
# i shouldn't be root
|
||||
amiroot not
|
||||
# get the xml filepath for $1
|
||||
getxmlpath $1
|
||||
# create sum for diff
|
||||
sha1sum $xmlpath > /tmp/checksum
|
||||
vi $xmlpath
|
||||
sha1sum -c --status /tmp/checksum
|
||||
if [ "$?" = "0" ]; then
|
||||
log debug "edit - $USER did not change xml configuration for $1"
|
||||
else
|
||||
virsh define $xmlpath &> /dev/null
|
||||
log info "edit - $USER changed xml configuration for $1"
|
||||
fi
|
||||
rm /tmp/checksum
|
||||
|
||||
}
|
||||
|
||||
|
||||
# **** fix stuff :) ****
|
||||
# environment check, fixes stuff :)
|
||||
fix()
|
||||
{
|
||||
|
||||
# am i root?
|
||||
amiroot
|
||||
|
||||
# install missing dependencies
|
||||
log debug "fix - installing missing dependencies"
|
||||
apt-get update
|
||||
apt-get install -y dialog pwgen libvirt-bin python-vm-builder libxml-xpath-perl
|
||||
|
||||
# reseting file permissions in $configpath
|
||||
chgrp -R libvirtd $configpath
|
||||
chmod -R 775 $configpath
|
||||
log debug "fix - reseted permissions in $configpath"
|
||||
|
||||
# fixing perms in $imagepath
|
||||
chmod -R 775 $imagepath
|
||||
chgrp -R libvirtd $imagepath
|
||||
log debug "fix - reseted permission in $imagepath"
|
||||
|
||||
if [ -r $logfile ]; then
|
||||
chmod 775 $logfile
|
||||
chgrp libvirtd $logfile
|
||||
log debug "fix - reseted permission for $logfile"
|
||||
else
|
||||
touch $logfile
|
||||
chmod 775 $logfile
|
||||
chgrp libvirtd $logfile
|
||||
log debug "fix - created $logfile and set permissions"
|
||||
fi
|
||||
|
||||
# adding kvm-tools to /usr/bin (symlink)
|
||||
if [ -r /usr/bin/kvm-tools ]; then
|
||||
:
|
||||
else
|
||||
ln -s $repopath/kvm-tools.sh /usr/bin/kvm-tools
|
||||
log debug "fix - created a symlink for kvm-tools in /usr/bin"
|
||||
fi
|
||||
log info "fix - environment fix for kvm-tools successfully ran"
|
||||
return 0
|
||||
|
||||
}
|
||||
|
||||
|
||||
#browseqcow()
|
||||
#{
|
||||
# # read imagename
|
||||
# if [ -z $1 ]; then
|
||||
# echo 'usage: "browseqcow2 </path/to/image.qcow2>"'
|
||||
# exit 1
|
||||
# fi
|
||||
#
|
||||
# imagename=$1
|
||||
#
|
||||
#
|
||||
# # im i root
|
||||
# amiroot
|
||||
#
|
||||
# # run unmount
|
||||
# if [[ $1 = "--unmount" || $1 = "-u" || $1 = "--umount" ]]; then
|
||||
# umount /mnt/
|
||||
# qemu-nbd --disconnect /dev/nbd0
|
||||
# echo "image unmounted"
|
||||
# echo
|
||||
# exit 0
|
||||
# fi
|
||||
#
|
||||
# # load kernel module
|
||||
# modprobe nbd max_part=8
|
||||
#
|
||||
# # gen blockdevice
|
||||
# qemu-nbd --connect=/dev/nbd0 $imagename
|
||||
#
|
||||
# # make the actual mount
|
||||
# sleep 2
|
||||
# mount /dev/nbd0p1 /mnt/
|
||||
#
|
||||
# echo "$imagename is mounted in /mnt"
|
||||
# echo 'run "browseqcow2.sh --unmount" when ready'
|
||||
# echo
|
||||
#}
|
||||
|
||||
|
||||
# **** add image ****
|
||||
# attaches new created virtual disk to given guest
|
||||
addimage()
|
||||
{
|
||||
|
||||
# no need for root privileges
|
||||
amiroot not
|
||||
|
||||
# virtual machine name (passed)
|
||||
local hostname=$1
|
||||
|
||||
# genqcow2
|
||||
genqcow $hostname
|
||||
|
||||
# xmlpath for $hostname
|
||||
getxmlpath $hostname
|
||||
|
||||
local targets="vdb vdc vdd vde vdf vdg vdh vdi vdj"
|
||||
for var in $targets; do
|
||||
virsh dumpxml $hostname | grep $var
|
||||
if [ $? = 1 ]; then
|
||||
local where=$(sed -n '/\/disk/=' $xmlpath)
|
||||
for item in $where; do
|
||||
local nr=$item
|
||||
done
|
||||
sed ''$nr' a <disk type="file" device="disk"> <driver name="qemu" type="qcow2" /> <source file="'$imagepath/$imagename'" /> <target dev="'$var'" bus="virtio" /> </disk>' $xmlpath > $xmlpath"_new"
|
||||
rm $xmlpath && mv $xmlpath"_new" $xmlpath
|
||||
virsh define $xmlpath
|
||||
log info "addimage - $var was added to $hostname"
|
||||
chmod 775 $xmlpath
|
||||
chgrp libvirtd $xmlpath
|
||||
exit 0
|
||||
else
|
||||
log error "addimage - $var already exists for $hostname"
|
||||
fi
|
||||
done
|
||||
|
||||
}
|
||||
|
||||
|
||||
# **** does image exist? ****
|
||||
# checks if images exists and gives back errorcode(0 if its there, 1 of not)
|
||||
imgexisting()
|
||||
{
|
||||
|
||||
# imgexisting needs global vars: $imagepath
|
||||
# usage: imgexisting hostname imagename
|
||||
|
||||
# passed args
|
||||
local hostname=$1
|
||||
local imagename=$2
|
||||
|
||||
virsh dumpxml $hostname | grep $imagename
|
||||
local inxml=$?
|
||||
ls $imagepath | grep $imagename
|
||||
local inpath=$?
|
||||
if [ $inpath = 0 ]; then
|
||||
log info "imgexisting - $imagename exists in $imagepath"
|
||||
return 0
|
||||
elif [ $inxml = 0 ]; then
|
||||
log info "imgexisting - $imagename exists in the xml of $hostname"
|
||||
return 0
|
||||
else
|
||||
log info "imgexisting - $imagename is not existing"
|
||||
return 1
|
||||
fi
|
||||
|
||||
}
|
||||
|
||||
|
||||
# **** generate qcow2 image ****
|
||||
# creates a qcow2 image in the $imagepath
|
||||
genqcow()
|
||||
{
|
||||
|
||||
local bgmessage="virtual disk creation"
|
||||
local hostname=$1
|
||||
|
||||
# imagename
|
||||
local exists=0
|
||||
while [ $exists = 0 ]; do
|
||||
graph "$bgmessage" --inputbox "imagename?" $hostname"_storage.qcow2"
|
||||
imagename="$dialogresult" #global var
|
||||
imgexisting $hostname $imagename
|
||||
local exists=$?
|
||||
done
|
||||
|
||||
# imagesize
|
||||
graph "$bgmessage" --menu "imagesize?" "4 GB 8 GB 16 GB 32 GB 64 GB 128 GB"
|
||||
local imagesize="$dialogresult"
|
||||
|
||||
# generating the actual image
|
||||
qemu-img create -f qcow2 $imagepath/$imagename $imagesize"G"
|
||||
log info "genqcow - image with $imagesize"GB" created: $imagepath/$imagename"
|
||||
chgrp libvirtd $imagepath/$imagename
|
||||
chmod 775 $imagepath/$imagename
|
||||
|
||||
}
|
||||
|
||||
|
||||
# **** generates new id's ****
|
||||
# prints new ids to the logengine
|
||||
newids()
|
||||
{
|
||||
|
||||
# you shouldn't be root
|
||||
amiroot not
|
||||
|
||||
# generating new ids for a vm
|
||||
local newuuid=$(uuidgen)
|
||||
local newmac=$(MACADDR="52:54:$(dd if=/dev/urandom count=1 2>/dev/null | md5sum | sed 's/^\(..\)\(..\)\(..\)\(..\).*$/\1:\2:\3:\4/')"; echo $MACADDR)
|
||||
|
||||
# printing new ids
|
||||
log info "newids - $USER generated new id's"
|
||||
echo
|
||||
echo "UUID: $newuuid"
|
||||
echo "MAC: $newmac"
|
||||
echo
|
||||
|
||||
}
|
||||
|
||||
|
||||
# **** create virtual ubuntu server ****
|
||||
# this will start the wizard for creating a new virtual machine
|
||||
mkjeos()
|
||||
{
|
||||
|
||||
# config section
|
||||
local bgmessage="server deployment"
|
||||
local hostname=$1
|
||||
|
||||
# am i root?
|
||||
amiroot
|
||||
|
||||
# configuration wizard
|
||||
proceed=1
|
||||
while [ $proceed != "0" ]; do
|
||||
|
||||
# hosname
|
||||
graph "$bgmessage" --inputbox "hostname?" $hostname
|
||||
local hostname="$dialogresult"
|
||||
|
||||
# domain
|
||||
graph "$bgmessage" --inputbox "domain?" $defaultdomain
|
||||
local domain="$dialogresult"
|
||||
|
||||
# username
|
||||
graph "$bgmessage" --inputbox "username?"
|
||||
local username="$dialogresult"
|
||||
|
||||
# architecture
|
||||
graph "$bgmessage" --menu "architecture?" "amd64 64bit_kernel i386 32bit_kernel"
|
||||
local arch="$dialogresult"
|
||||
|
||||
# memory
|
||||
graph "$bgmessage" --menu "memory?" "256 MB 512 MB 1024 MB 2048 MB 4096 MB 8192 MB"
|
||||
local mem="$dialogresult"
|
||||
|
||||
# rootsize
|
||||
graph "$bgmessage" --menu "rootsize?" "4 GB 8 GB 16 GB 32 GB 64 GB 128 GB"
|
||||
local rootsize="$dialogresult"
|
||||
|
||||
# swapsize
|
||||
graph "$bgmessage" --menu "swapsize?" "512 MB 1024 MB 2048 MB 4096 MB 8192 MB"
|
||||
local swapsize="$dialogresult"
|
||||
|
||||
# ubuntu release
|
||||
graph "$bgmessage" --menu "ubuntu release?" "lucid 10.04_long_term hardy 8.04_long_term maverick 10.10"
|
||||
local release="$dialogresult"
|
||||
|
||||
# network configuration
|
||||
graph "$bgmessage" --inputbox "ip address?"
|
||||
local ip="$dialogresult"
|
||||
graph "$bgmessage" --inputbox "netmask?"
|
||||
local netmask="$dialogresult"
|
||||
graph "$bgmessage" --inputbox "gateway?"
|
||||
local gateway="$dialogresult"
|
||||
graph "$bgmessage" --inputbox "dns server(s)?"
|
||||
local dns="$dialogresult"
|
||||
|
||||
# mirrors
|
||||
local mirrorlist="$defaultmirror default_mirror http://at.archive.ubuntu.com/ubuntu official_austria_mirror http://ftp.halifax.rwth-aachen.de/ubuntu uni_aachen"
|
||||
graph "$bgmessage" --menu "mirror?" "$mirrorlist"
|
||||
local mirror="$dialogresult"
|
||||
|
||||
# cpus
|
||||
graph "$bgmessage" --menu "cpus?" "1 singlecore 2 dualcore 4 quadcore 8 insane"
|
||||
local cpus="$dialogresult"
|
||||
|
||||
# local network bridges
|
||||
local bridgelist=$(ifconfig | grep HWaddr | awk '{print $1}' | grep br)
|
||||
local localbridges=""
|
||||
for var in $bridgelist; do
|
||||
local localbridges="$localbridges $var local_network_bridge"
|
||||
done
|
||||
graph "$bgmessage" --menu "network?" "$localbridges"
|
||||
local bridge="$dialogresult"
|
||||
|
||||
# timezone
|
||||
#local timezonelist="Europe/Vienna GMT+1"
|
||||
#graph "$bgmessage" --menu "timezone?" "$timezonelist"
|
||||
#local timezone="$dialogresult"
|
||||
local timezone="Europe/Vienna"
|
||||
|
||||
# additional software
|
||||
for var in $recpackages; do
|
||||
local packagegraph="$packagegraph $var recommended on"
|
||||
done
|
||||
for var in $optpackages; do
|
||||
local packagegraph="$packagegraph $var optional off"
|
||||
done
|
||||
graph "$bgmessage" --checklist "additional software?" "$packagegraph"
|
||||
local packagelist="${dialogresult//\"/ }"
|
||||
for var in $packagelist; do
|
||||
local addpkg="$addpkg --addpkg $var"
|
||||
done
|
||||
|
||||
# select firstboot script
|
||||
#graph "$bgmessage" --fselect ~/
|
||||
graph "$bgmessage" --fselect $repopath/firstboot.sh
|
||||
local firstboot="$dialogresult"
|
||||
|
||||
|
||||
#calculate rootsize
|
||||
local rootsize=$((rootsize*1024))
|
||||
#gen password
|
||||
local password=$(pwgen -snc 10 1)
|
||||
|
||||
|
||||
local text=$(echo "hostname: $hostname
|
||||
domain: $domain
|
||||
user: $username
|
||||
cpus: $cpus
|
||||
memory: $mem
|
||||
ip: $ip
|
||||
release: $release
|
||||
architecture: $arch
|
||||
rootsize: $rootsize
|
||||
swapsize: $swapsize
|
||||
network: $bridge
|
||||
mirror: $mirror
|
||||
firstboot: $firstboot
|
||||
|
||||
continue?
|
||||
(CTRL+C will kill the creation process)
|
||||
")
|
||||
|
||||
graph "$bgmessage" --yesno "$text"
|
||||
local proceed=$?
|
||||
|
||||
done
|
||||
|
||||
clear
|
||||
log debug "mkjeos - creation of $hostname started. this can take a while, so please be patient."
|
||||
|
||||
|
||||
vmbuilder kvm ubuntu --verbose --mem="$mem" --cpus="$cpus" --rootsize="$rootsize" --swapsize="$swapsize" --domain="$domain" --user="$username" --pass="$password" --suite="$release" --flavour=virtual --mirror="$mirror" --security-mirror="$mirror" --timezone="$timezone" --arch="$arch" --hostname="$hostname" --libvirt="qemu:///system" --bridge="$bridge" --ip="$ip" --mask="$netmask" --gw="$gateway" --dns="$dns" $addpkg --firstboot=$firstboot --destdir="$imagepath/tmpvmbuilder" &> /tmp/builderlog
|
||||
|
||||
|
||||
|
||||
if [ $? = "0" ]; then
|
||||
log info "mkjeos - $hostname successfully created"
|
||||
|
||||
# removing temporary builderlog
|
||||
rm /tmp/builderlog
|
||||
|
||||
# moving imagefile, redefining xml (changing image path)
|
||||
mv $imagepath/tmpvmbuilder/tmp* $imagepath/$hostname"_"system.qcow2
|
||||
rm -r $imagepath/tmpvmbuilder
|
||||
local image=$(getimgpath $hostname)
|
||||
getxmlpath $hostname
|
||||
sed -i 's/'${image//\//\\\/}'/'${imagepath//\//\\\/}'\/'$hostname'_system.qcow2/' $xmlpath
|
||||
virsh define $xmlpath
|
||||
|
||||
# run env fix
|
||||
fix
|
||||
|
||||
# start the machine?
|
||||
graph "$bgmessage" --yesno "everything is done, do you want to start $hostname now?"
|
||||
local startvm=$?
|
||||
if [ $startvm = 0 ]; then
|
||||
virsh start $hostname
|
||||
fi
|
||||
|
||||
# log
|
||||
log info "mkjeos - hostname=$hostname.$domain, user=$username, password=$password release=$release, arch=$arch, size=$rootsize, swap=$swapsize, network=$bridge, ip=$ip, mirror=$mirror"
|
||||
|
||||
# machine details output
|
||||
clear
|
||||
echo
|
||||
echo "machine details"
|
||||
echo
|
||||
echo "hostname=$hostname.$domain"
|
||||
echo "user=$username"
|
||||
echo "password=$password"
|
||||
echo "release=$release"
|
||||
echo "arch=$arch"
|
||||
echo "size=$rootsize"
|
||||
echo "swap=$swapsize"
|
||||
echo "network=$bridge"
|
||||
echo "ip=$ip"
|
||||
echo "mirror=$mirror"
|
||||
echo
|
||||
else
|
||||
log error "mkjeos - there was an error creating virtual machine $hostname"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
}
|
||||
|
||||
|
||||
# end of functions
|
|
@ -0,0 +1,122 @@
|
|||
#!/bin/bash
|
||||
|
||||
|
||||
#########################################
|
||||
## ##
|
||||
## kvm-tools ##
|
||||
## ##
|
||||
#########################################
|
||||
|
||||
|
||||
# **** configuration section ****
|
||||
# do not touch as long as you are not me
|
||||
version="0.2_beta1"
|
||||
author="david@socialnerds.org"
|
||||
giturl="git://git.aec.at/kvm-tools.git"
|
||||
functionfile="kvm-tools.func"
|
||||
configfile="/etc/kvm-tools.conf"
|
||||
logwhat="kvm-tools"
|
||||
|
||||
|
||||
# **** bash trap initialisation ****
|
||||
trap bashtrap INT
|
||||
|
||||
|
||||
# **** read config file ****
|
||||
if [ -r $configfile ]; then
|
||||
source $configfile
|
||||
else
|
||||
echo "ERROR: configuration file not found."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
|
||||
# **** read function definitions ****
|
||||
if [ -r $repopath/$functionfile ]; then
|
||||
source $repopath/$functionfile
|
||||
else
|
||||
echo "ERROR: functionfile not found."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
|
||||
# **** load bashlib ****
|
||||
if [ -d $bashlibpath ]; then
|
||||
source $bashlibpath/main
|
||||
source $bashlibpath/update
|
||||
source $bashlibpath/logengine
|
||||
log debug "preflight - bashlib loaded"
|
||||
else
|
||||
echo "ERROR: bashlib not found"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
|
||||
# **** option handler ****
|
||||
while getopts "h,c:,e:,i,a:,b:,u,v,f" OPTION; do
|
||||
case $OPTION in
|
||||
h)
|
||||
usage
|
||||
log debug "option handler - usage message printed"
|
||||
exit 0
|
||||
;;
|
||||
c)
|
||||
log debug "option handler - server deployment process for $OPTARG started"
|
||||
mkjeos "$OPTARG"
|
||||
errorcode=$?
|
||||
log debug "option handler - server deployment for $OPTARG finished"
|
||||
exit $errorcode
|
||||
;;
|
||||
e)
|
||||
edit "$OPTARG"
|
||||
errorcode=$?
|
||||
exit $errorcode
|
||||
;;
|
||||
i)
|
||||
newids
|
||||
exit $?
|
||||
;;
|
||||
a)
|
||||
addimage "$OPTARG"
|
||||
exit $?
|
||||
;;
|
||||
b)
|
||||
log info "option handler - starting backup process"
|
||||
backup "$OPTARG"
|
||||
errorcode=$?
|
||||
if [ $errorcode = "0" ]; then
|
||||
log info "option handler - backup process successfully finished"
|
||||
else
|
||||
log error "option handler - an error occured during backup process"
|
||||
fi
|
||||
exit $errorcode
|
||||
;;
|
||||
u)
|
||||
update
|
||||
exit $?
|
||||
;;
|
||||
v)
|
||||
version
|
||||
exit $?
|
||||
;;
|
||||
f)
|
||||
fix
|
||||
exit $?
|
||||
;;
|
||||
?)
|
||||
usage
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
|
||||
# **** print usage message if no option is given ****
|
||||
if [ -z $1 ]; then
|
||||
usage
|
||||
exit 1
|
||||
fi
|
||||
|
||||
|
||||
# **** end of script ****
|
||||
exit 0
|
|
@ -0,0 +1,9 @@
|
|||
#!/usr/bin/perl
|
||||
|
||||
#source: http://www.etherealbits.com/2012/06/the-perl-script-that-may-save-your-life/
|
||||
|
||||
open(DEV, '/dev/sda1') or die "Can't open: $!\n";
|
||||
while (read(DEV, $buf, 4096)) {
|
||||
print tell(DEV), "\n", $buf, "\n"
|
||||
if $buf =~ /stringtosearchfor/;
|
||||
}
|
|
@ -0,0 +1,101 @@
|
|||
#!/usr/bin/perl
|
||||
use warnings;
|
||||
use strict;
|
||||
use Data::Dumper;
|
||||
|
||||
use LWP::Simple;
|
||||
use XML::Simple;
|
||||
|
||||
use constant LINZ_AG_URL => "http://www.linzag.at/static/XML_DM_REQUEST";
|
||||
|
||||
sub get_trips {
|
||||
my ( $name_dm, $no_of_trips ) = @_;
|
||||
my ( $result, $result_trips, $requestID, $sessionID, $direction,
|
||||
$max_length_dest, $max_length_countdown, $max_length_line );
|
||||
$requestID = $sessionID = $max_length_dest = $max_length_countdown = $max_length_line = 0;
|
||||
|
||||
# cheat sheet:
|
||||
# http://www.linzag.at/static/XML_DM_REQUEST?sessionID=0&locationServerActive=1&type_dm=any&name_dm=60502280
|
||||
# http://www.linzag.at/static/XML_DM_REQUEST?sessionID=2880156875&requestID=1&dmLineSelectionAll=1
|
||||
|
||||
# open session and get ID
|
||||
my $get_s_id_url = LINZ_AG_URL
|
||||
. "?sessionID=${sessionID}"
|
||||
. "&locationServerActive=1" # TODO: What does this do?
|
||||
. "&type_dm=any"
|
||||
. "&name_dm=${name_dm}"
|
||||
. "&limit=${no_of_trips}";
|
||||
|
||||
my $xml = XMLin(get( $get_s_id_url ));
|
||||
# retrieve XML for trips
|
||||
$sessionID = $xml->{sessionID};
|
||||
my $get_time_url = LINZ_AG_URL
|
||||
. "?sessionID=${sessionID}"
|
||||
. "&requestID=${requestID}"
|
||||
. "&dmLineSelectionAll=1";
|
||||
$xml = XMLin(get( $get_time_url ));
|
||||
|
||||
# map direction shortcode_letters to names (e.g $direction->{27}->{R} = "Linz Auwiesen" );
|
||||
foreach my $line (@{$xml->{itdDepartureMonitorRequest}->{itdServingLines}->{itdServingLine}} ) {
|
||||
$direction->{$line->{number}}->{$line->{motDivaParams}->{direction}} = $line->{direction};
|
||||
}
|
||||
|
||||
# parse trips
|
||||
foreach my $trip (@{$xml->{itdDepartureMonitorRequest}->{itdDepartureList}->{itdDeparture}}) {
|
||||
my $line = $trip->{itdServingLine}->{symbol};
|
||||
my $dest_code = $trip->{itdServingLine}->{motDivaParams}->{direction};
|
||||
my $destination = $direction->{$line}->{$dest_code};
|
||||
my $countdown = $trip->{countdown};
|
||||
my $hour = $trip->{itdDateTime}->{itdTime}->{hour};
|
||||
my $minute = $trip->{itdDateTime}->{itdTime}->{minute};
|
||||
$max_length_dest = length($destination) if ( length($destination) > $max_length_dest);
|
||||
$max_length_countdown = length($countdown) if ( length($countdown) > $max_length_countdown);
|
||||
$max_length_line = length($line) if ( length($line) > $max_length_line);
|
||||
|
||||
push (@$result_trips, {
|
||||
line => $line,
|
||||
destination => $destination,
|
||||
countdown => $trip->{countdown},
|
||||
hour => $hour,
|
||||
minute => $minute,
|
||||
});
|
||||
}
|
||||
|
||||
$result->{trips} = $result_trips;
|
||||
$result->{max_length_dest} = $max_length_dest;
|
||||
$result->{max_length_countdown} = $max_length_countdown;
|
||||
$result->{max_length_line} = $max_length_line;
|
||||
return $result;
|
||||
}
|
||||
|
||||
sub print_trips {
|
||||
# quick hack
|
||||
|
||||
my $t = shift;
|
||||
my $ml_dest = $t->{max_length_dest};
|
||||
my $ml_cd = $t->{max_length_countdown};
|
||||
my $ml_ln = $t->{max_length_line};
|
||||
$ml_ln = length("line") if ( length("line") > $ml_ln );
|
||||
$ml_cd = length("countdown") if ( length("countdown") > $ml_cd );
|
||||
$ml_dest = length("destination") if ( length("destination") > $ml_dest );
|
||||
my $total_line_length = $ml_ln + $ml_cd + $ml_dest + 21;
|
||||
print ( " ". "=" x $total_line_length . "\n" );
|
||||
# line destination countdown time
|
||||
printf(" | %-${ml_ln}s %-${ml_dest}s %-${ml_cd}s %s |\n", "line", "destination", "countdown", "time" );
|
||||
print ( " ". "=" x $total_line_length . "\n" );
|
||||
$ml_cd -= length("(min) ");
|
||||
$ml_cd += length(" ");
|
||||
for my $entry ( @{$t->{trips}} ) {
|
||||
printf(" | %-${ml_ln}s | %-${ml_dest}s | %-${ml_cd}d(min) | %02d:%02d h |\n",
|
||||
$entry->{'line'}, $entry->{'destination'},
|
||||
$entry->{'countdown'},
|
||||
$entry->{'hour'}, $entry->{'minute'});
|
||||
}
|
||||
print ( " ". "-" x $total_line_length . "\n" );
|
||||
}
|
||||
|
||||
my $name_dm = 60502280;
|
||||
my $no_of_trips = 10;
|
||||
my $trips = get_trips($name_dm, $no_of_trips);
|
||||
#print Dumper($trips);
|
||||
print_trips($trips);
|
|
@ -0,0 +1,27 @@
|
|||
#!/bin/sh
|
||||
|
||||
# Mount partitions within a disk image file
|
||||
|
||||
# Author: P@adraigBrady.com
|
||||
|
||||
# V1.0 29 Jun 2005 Initial release
|
||||
# V1.1 01 Dec 2005 Handle bootable (DOS) parititons
|
||||
|
||||
if [ "$#" -ne "3" ]; then
|
||||
echo "Usage: `basename $0` <image_filename> <partition # (1,2,...)> <mount point>" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if ! fdisk -v > /dev/null 2>&1; then
|
||||
echo "Can't find the fdisk util. Are you root?" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
FILE=$1
|
||||
PART=$2
|
||||
DEST=$3
|
||||
|
||||
UNITS=$(fdisk -lu $FILE 2>/dev/null | grep "$FILE$PART " |
|
||||
tr -d '*' | awk '{print $2}')
|
||||
OFFSET=`expr 512 '*' $UNITS`
|
||||
mount -o loop,offset=$OFFSET $FILE $DEST
|
|
@ -0,0 +1,125 @@
|
|||
#!/bin/bash
|
||||
|
||||
# ******** minecraft control script ********
|
||||
# ******** using systemd + screen ********
|
||||
|
||||
# **** configuration ****
|
||||
user=minecraft
|
||||
path=/opt/$user
|
||||
bold="\033[1m"
|
||||
normal="\033[0m"
|
||||
red="\033[31m"
|
||||
green="\033[32m"
|
||||
yellow="\033[33m"
|
||||
|
||||
|
||||
# **** start of script ****
|
||||
|
||||
state()
|
||||
{
|
||||
if [ -r "$path/$2/minecraft_server.jar" ]; then
|
||||
systemctl status $1@$2 > /dev/null
|
||||
if [ $? -eq 0 ]; then
|
||||
return 0
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
else
|
||||
return 2
|
||||
fi
|
||||
}
|
||||
|
||||
usage()
|
||||
{
|
||||
echo -e "usage: mc option <server>\n\n ${bold}Servers:${normal}"
|
||||
servers=$(ls -l $path | grep '^d' | awk '{print $9}')
|
||||
for server in $servers; do
|
||||
state $user $server
|
||||
if [ $? -eq 0 ]; then
|
||||
echo -e " [${green}✓${normal}] $server"
|
||||
else
|
||||
echo -e " [${red}✗${normal}] $server"
|
||||
fi
|
||||
done
|
||||
|
||||
echo -e "\n ${bold}Options:${normal}
|
||||
help Print usage message
|
||||
status Print server(s)
|
||||
start <server> Start server instance
|
||||
stop <server> Stop server instance
|
||||
console <server> Connect to server console\n"
|
||||
}
|
||||
|
||||
|
||||
|
||||
case "$1" in
|
||||
h|help|-h|--help|status|a|-a|--status|l|ls|list|-l|--list)
|
||||
usage
|
||||
;;
|
||||
s|start|-s|--start)
|
||||
if [ $2 ]; then
|
||||
state $user $2
|
||||
value=$?
|
||||
if [ $value -eq 0 ]; then
|
||||
echo -e "\n [${yellow}☀${normal}] Server already up.($2)\n"
|
||||
elif [ $value -eq 1 ]; then
|
||||
echo -e "\n [${green}✓${normal}] Starting server.($2)\n"
|
||||
sudo systemctl restart $user@$2
|
||||
else
|
||||
echo -e "\n [${red}✗${normal}] Server does not exist.($2)\n"
|
||||
exit 1
|
||||
fi
|
||||
else
|
||||
echo -e "\n [${red}✗${normal}] No server given.\n"
|
||||
exit 1
|
||||
fi
|
||||
;;
|
||||
t|stop|-t|--stop)
|
||||
if [ $2 ]; then
|
||||
state $user $2
|
||||
value=$?
|
||||
if [ $value -eq 0 ]; then
|
||||
echo -e "\n [${yellow}☀${normal}] Stopping server. Sending 10 second notice.($2)"
|
||||
sudo systemctl stop $user@$2
|
||||
echo -e " [${green}✓${normal}] Stopped server.($2)\n"
|
||||
|
||||
elif [ $value -eq 1 ]; then
|
||||
echo -e "\n [${yellow}☀${normal}] Server already down.($2)\n"
|
||||
else
|
||||
echo -e "\n [${red}✗${normal}] Server does not exist.($2)\n"
|
||||
exit 1
|
||||
fi
|
||||
else
|
||||
echo -e "\n [${red}✗${normal}] No server given.\n"
|
||||
exit 1
|
||||
fi
|
||||
;;
|
||||
c|console|-c|--console)
|
||||
if [ $2 ]; then
|
||||
state $user $2
|
||||
value=$?
|
||||
if [ $value -eq 0 ]; then
|
||||
echo -e "\n [${yellow}☀${normal}] Connecting to server console on $user@$2."
|
||||
echo -e " [${yellow}☀${normal}] Exit console with: ${bold}Strg-a d${normal}\n"; sleep 5
|
||||
sudo -u $user /usr/bin/screen -R mc-$2
|
||||
elif [ $value -eq 1 ]; then
|
||||
echo -e "\n [${red}✗${normal}] Server not up.($2)\n"
|
||||
exit 1
|
||||
else
|
||||
echo -e "\n [${red}✗${normal}] Server does not exist.($2)\n"
|
||||
exit 1
|
||||
fi
|
||||
else
|
||||
echo -e "\n [${red}✗${normal}] No server given.\n"
|
||||
exit 1
|
||||
fi
|
||||
exit 0
|
||||
;;
|
||||
*)
|
||||
usage
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
exit 0
|
||||
|
||||
# **** end of script ****
|
|
@ -0,0 +1,156 @@
|
|||
#!/bin/bash
|
||||
|
||||
#################################
|
||||
# ##
|
||||
# mediacenter control script ##
|
||||
# ##
|
||||
#################################
|
||||
|
||||
# **** config section ****
|
||||
author="david@socialnerds.org"
|
||||
version="0.1_alpha"
|
||||
|
||||
hwaddr="00:10:c6:cd:00:d4" #mc mac address
|
||||
ipaddr="10.1.1.7" #mc ip address/hostname
|
||||
wolserv="10.1.1.4" #remote wakeonlan host (connects via ssh)
|
||||
remoteuser="media" #mc user
|
||||
mediapath="/home/media/Videos" #remote basepath for mediafiles
|
||||
|
||||
|
||||
# check for dependencies
|
||||
#apt-get install wakeonlan dialog
|
||||
|
||||
# **** bashtrap ****
|
||||
# bash trap function is executed when CTRL-C is pressed
|
||||
bashtrap()
|
||||
{
|
||||
log 3 "bashtrap - triggered"
|
||||
clear
|
||||
echo "CTRL+C detected.. exiting!"
|
||||
exit 1
|
||||
}
|
||||
|
||||
|
||||
navigation()
|
||||
{
|
||||
dialog --backtitle "Media Center Control" --title "Navigation" --no-cancel --menu "" 13 55 7 start "start mediacenter" stop "shutdown mediacenter" vnc "open vnc session" play "play mediafile" kill "kill mediaplaybak" volume "control volume" quit "leave media control" 2> /tmp/dialog
|
||||
navresult=$(cat /tmp/dialog)
|
||||
rm /tmp/dialog
|
||||
|
||||
if [ $navresult = start ]; then
|
||||
startmc
|
||||
elif [ $navresult = stop ]; then
|
||||
stopmc
|
||||
elif [ $navresult = vnc ]; then
|
||||
vncconnect
|
||||
elif [ $navresult = play ]; then
|
||||
playmedia
|
||||
elif [ $navresult = kill ]; then
|
||||
killmedia
|
||||
elif [ $navresult = volume ]; then
|
||||
volumecontrol
|
||||
elif [ $navresult = quit ]; then
|
||||
exit 0
|
||||
fi
|
||||
}
|
||||
|
||||
isitup()
|
||||
{
|
||||
# is mediacenter up?
|
||||
clear
|
||||
echo "checking if mediacenter is up..."
|
||||
ping -w 1 $ipaddr &> /dev/null
|
||||
local pingresult=$?
|
||||
return $pingresult
|
||||
}
|
||||
|
||||
startmc()
|
||||
{
|
||||
# check if mediacenter is up
|
||||
isitup
|
||||
if [ $? = 0 ]; then
|
||||
dialog --backtitle "Media Center Control" --title "Info" --msgbox "\n\n mediacenter@$ipaddr is already up and running" 9 55
|
||||
else
|
||||
ssh $wolserv wakeonlan $hwaddr &> /dev/null
|
||||
dialog --backtitle "Media Center Control" --title "Info" --msgbox "\n\n magic package sent to mediacenter@$ipaddr" 9 55
|
||||
fi
|
||||
}
|
||||
|
||||
stopmc()
|
||||
{
|
||||
# is mediacenter up?
|
||||
isitup
|
||||
if [ $? = 0 ]; then
|
||||
ssh $remoteuser@$ipaddr "sudo shutdown -h now"
|
||||
dialog --backtitle "Media Center Control" --title "Info" --msgbox "\n\n mediacenter@$ipaddr will be shutdown" 9 55
|
||||
else
|
||||
dialog --backtitle "Media Center Control" --title "Info" --msgbox "\n\n mediacenter@$ipaddr unreachable" 9 55
|
||||
|
||||
fi
|
||||
exit 0
|
||||
}
|
||||
|
||||
vncconnect()
|
||||
{
|
||||
# check if mediacenter is up
|
||||
isitup
|
||||
if [ $? = 0 ]; then
|
||||
vncviewer $ipaddr &> /dev/null &
|
||||
else
|
||||
dialog --backtitle "Media Center Control" --title "Info" --msgbox "\n\n mediacenter@$ipaddr unreachable" 9 55
|
||||
fi
|
||||
|
||||
}
|
||||
|
||||
playmedia()
|
||||
{
|
||||
file="/home/media/Videos/series/the_big_bang_theory/season_4/BBTIV.14.avi"
|
||||
# check if mediacenter is up
|
||||
isitup
|
||||
if [ $? = 0 ]; then
|
||||
# selecting file
|
||||
ssh -t $remoteuser@$ipaddr "dialog --fselect $mediapath 7 70 2> /tmp/dialog"
|
||||
local file=$(ssh $remoteuser@$ipaddr "cat /tmp/dialog && rm /tmp/dialog")
|
||||
ssh $remoteuser@$ipaddr "export DISPLAY=:0.0 && vlc --no-video-title-show -f $file &> /dev/null" &
|
||||
else
|
||||
dialog --backtitle "Media Center Control" --title "Info" --msgbox "\n\n mediacenter@$ipaddr unreachable" 9 55
|
||||
fi
|
||||
}
|
||||
|
||||
killmedia()
|
||||
{
|
||||
# check if mediacenter is up
|
||||
isitup
|
||||
if [ $? = 0 ]; then
|
||||
ssh $remoteuser@$ipaddr "killall vlc && killall rhythmbox"
|
||||
else
|
||||
dialog --backtitle "Media Center Control" --title "Info" --msgbox "\n\n mediacenter@$ipaddr unreachable" 9 55
|
||||
fi
|
||||
}
|
||||
|
||||
# **** volume control ****
|
||||
volumecontrol()
|
||||
{
|
||||
# check if mediacenter is up
|
||||
isitup
|
||||
if [ $? = 0 ]; then
|
||||
# open up remote alsamixer
|
||||
ssh -t $remoteuser@$ipaddr alsamixer
|
||||
else
|
||||
dialog --backtitle "Media Center Control" --title "Info" --msgbox "\n\n mediacenter@$ipaddr unreachable" 9 55
|
||||
fi
|
||||
}
|
||||
|
||||
# ****** start of actual script ******
|
||||
|
||||
# **** bash trap initialisation ****
|
||||
trap bashtrap INT
|
||||
|
||||
# **** run navigation ****
|
||||
# endless loop
|
||||
while [ 1 ]; do
|
||||
navigation
|
||||
done
|
||||
|
||||
exit 0
|
||||
# end of script
|
|
@ -0,0 +1,12 @@
|
|||
#!/bin/bash
|
||||
|
||||
|
||||
# used mem
|
||||
umem=$(free -m | grep buffers/cache | awk '{print $3}')
|
||||
tmem=$(free -m | grep Mem: | awk '{print $2}')
|
||||
|
||||
percent=$((100*$(free -m | grep buffers/cache | awk '{print $3}')/$(free -m | grep Mem: | awk '{print $2}')))
|
||||
|
||||
echo "Used memory: $percent% ($umem"MB"/$tmem"MB")"
|
||||
|
||||
|
|
@ -0,0 +1,13 @@
|
|||
#!/bin/bash
|
||||
|
||||
curl --silent http://torrent.ubuntu.com/simple/precise/server/ | grep beta2 >> /dev/null
|
||||
|
||||
if [ $? -eq 1 ]; then
|
||||
#send mail
|
||||
/home/david/SparkleShare/docs/scripts/telnet_mail.sh "Ubuntu 12.04 Precise Pangolin LTS is out."
|
||||
else
|
||||
echo "still beta2 online"
|
||||
fi
|
||||
|
||||
|
||||
exit 0
|
|
@ -0,0 +1,15 @@
|
|||
# **** list of uuids to monitor ****
|
||||
#put this file in /etc/mbots and rename it to
|
||||
#"diskmon.lst" or use a custom file as first
|
||||
#option.
|
||||
|
||||
#ex.
|
||||
#76c2a7e3-8765-4bb2-9093-ce495edb3833 90 98
|
||||
#or
|
||||
#UUID="76c2a7e3-8765-4bb2-9093-ce495edb3833" 90 98
|
||||
#or
|
||||
#/dev/sdb1 90 95
|
||||
|
||||
|
||||
#<disk> <threshold1> <threshold2>
|
||||
|
|
@ -0,0 +1,121 @@
|
|||
#!/bin/bash
|
||||
|
||||
#\
|
||||
# \_ _ _ _ _ _ _ _ _ _ _ _ _
|
||||
# #\
|
||||
# # \
|
||||
# disk usage monitoring # \
|
||||
# script # /
|
||||
# # /
|
||||
# _ _ _ _ _ _ _ _ _ _ _ _ _#/
|
||||
# /
|
||||
#/
|
||||
|
||||
# **** config section ****
|
||||
#do not touch as long as you're not me
|
||||
author="david@socialnerds.org"
|
||||
version="0.1"
|
||||
giturl="git://git.aec.at/mbots.git"
|
||||
configfile="/etc/mbots/mbots.conf"
|
||||
log2stdout="1"
|
||||
logwhat="mbots_diskmon"
|
||||
file="/etc/mbots/diskmon.lst"
|
||||
|
||||
|
||||
# **** preflight ****
|
||||
#read configfile
|
||||
if [ -r $configfile ]; then
|
||||
source $configfile
|
||||
else
|
||||
echo "ERROR: configfile not found. terminating."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
#load bashlib
|
||||
if [ -d $bashlibpath ]; then
|
||||
source $bashlibpath/main
|
||||
source $bashlibpath/logengine
|
||||
log debug "preflight - logengine loaded"
|
||||
else
|
||||
echo "ERROR: bashlib not found. terminating."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
|
||||
#check environment
|
||||
|
||||
log info "**** starting disk monitoring bot ****"
|
||||
|
||||
#first option triggers custom list
|
||||
if [ -z $1 ]; then
|
||||
log debug "preflight - no custom list given. using $file[default]"
|
||||
else
|
||||
file=$1
|
||||
log debug "preflight - list option given. using $file"
|
||||
fi
|
||||
|
||||
|
||||
# read file
|
||||
linecount="1"
|
||||
while read line; do
|
||||
#find first letter to determine if line is empty or a comment
|
||||
fletter=${line:0:1}
|
||||
|
||||
#check for first letter
|
||||
if [ -z $fletter ]; then
|
||||
#skip line it's empty
|
||||
log debug "skipping line $linecount in $file: it's empty"
|
||||
elif [ $fletter = "#" ]; then
|
||||
#skip line it's a comment
|
||||
log debug "skipping line $linecount in $file: it's a comment"
|
||||
else
|
||||
#read line
|
||||
log debug "reading line $linecount in $file"
|
||||
|
||||
#getting values
|
||||
disk=$(echo $line | awk '{print $1}')
|
||||
th1=$(echo $line | awk '{print $2}')
|
||||
|
||||
#if threshold2 not given set th2 eq th1
|
||||
th2=$(echo $line | awk '{print $3}')
|
||||
if [ -z $th2 ]; then
|
||||
th2=$th1
|
||||
fi
|
||||
|
||||
devstring=$(blkid | grep $disk | awk '{print $1}')
|
||||
uuidstring=$(blkid | grep $disk | awk '{print $2}')
|
||||
|
||||
devname=$(echo ${devstring::$((${#devstring}-1))})
|
||||
uuid=$(echo ${uuidstring:6:$((${#uuidstring}-7))})
|
||||
|
||||
#getting diskusage
|
||||
diskusage=$(df -hP --sync | grep $devname | awk '{print $5}')
|
||||
diskusage=$(echo ${diskusage::$((${#diskusage}-1))})
|
||||
|
||||
if [ $diskusage -gt $th2 ]; then
|
||||
#error, reached threshold2
|
||||
log error "$devname uses $diskusage% of disk space (warn: $th1%, err: $th2%)"
|
||||
elif [ $diskusage -gt $th1 ]; then
|
||||
#warning, reached threshold1
|
||||
log warning "$devname uses $diskusage% of disk space (warn: $th1%, err: $th2%)"
|
||||
else
|
||||
#info, everything ok
|
||||
log info "$devname is at $diskusage% (warn: $th1%, err: $th2%)"
|
||||
fi
|
||||
|
||||
fi
|
||||
|
||||
#linecount +1
|
||||
let linecount++
|
||||
|
||||
#source file to read (diskmon.lst)
|
||||
done < $file
|
||||
|
||||
|
||||
#battlestar galactica fun section :-)
|
||||
log debug "adama: what do you hear starbuck?"
|
||||
log debug "kara: nothin' but the rain sir!"
|
||||
|
||||
|
||||
log info "**** disk monitoring bot finished ****"
|
||||
# **** end of script ****
|
|
@ -0,0 +1,14 @@
|
|||
#!/bin/bash
|
||||
|
||||
freememory=$(free -m | grep "cache:" | awk '{print $4}')
|
||||
threshold="300"
|
||||
|
||||
|
||||
if [ $freememory -gt $threshold ]; then
|
||||
echo "There is $freememory MB availible. Threshold not reached."
|
||||
else
|
||||
echo "There is less than $threshold MB of memory availible."
|
||||
/home/david/mail.sh "There is less than $threshold MB of memory availible!! You should probably do something about that pretty soon brother!!"
|
||||
fi
|
||||
|
||||
exit 0
|
|
@ -0,0 +1,22 @@
|
|||
#!/bin/bash
|
||||
|
||||
# get uptimes of linux machines
|
||||
|
||||
array="localhost
|
||||
blade9.aec.at
|
||||
blade10.aec.at
|
||||
blade11.aec.at
|
||||
blade12.aec.at
|
||||
blade13.aec.at
|
||||
blade15.aec.at
|
||||
nymeria.aec.at
|
||||
walter.aec.at
|
||||
search.aec.at
|
||||
webarchive.aec.at
|
||||
prix.aec.at
|
||||
git.aec.at"
|
||||
|
||||
|
||||
for machine in $array; do
|
||||
echo "$machine: $(ssh -q $machine uptime)"
|
||||
done
|
|
@ -0,0 +1,113 @@
|
|||
#!/bin/bash
|
||||
|
||||
#
|
||||
# heartbeat survaillance
|
||||
# script
|
||||
#
|
||||
|
||||
# **** config section ****
|
||||
|
||||
author="david@socialnerds.org"
|
||||
version="0.1"
|
||||
sourcefile="/etc/hosts"
|
||||
excludes="127.0.0.1 127.0.1.1 ::1 fe00::0 ff00::0 ff02::1 ff02::2 ff02::3"
|
||||
options="-n -c 5 -i 0.2 -W 1"
|
||||
maxloss="20%"
|
||||
log2stdout="1"
|
||||
logwhat="mbots_heartbeat"
|
||||
configfile="/etc/mbots/mbots.conf"
|
||||
giturl="git://git.aec.at/mbots.git"
|
||||
|
||||
|
||||
# **** preflight ****
|
||||
|
||||
#read configfile
|
||||
if [ -r $configfile ]; then
|
||||
source $configfile
|
||||
else
|
||||
echo "ERROR: configfile not found. terminating."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
#load bashlib
|
||||
if [ -d $bashlibpath ]; then
|
||||
source $bashlibpath/main
|
||||
source $bashlibpath/logengine
|
||||
log debug "preflight - logengine loaded"
|
||||
else
|
||||
echo "ERROR: bashlib not found. terminating."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
|
||||
# **** function definition ****
|
||||
|
||||
check()
|
||||
{
|
||||
|
||||
local ip=$1
|
||||
|
||||
echo $ip | grep ":" &> /dev/null
|
||||
local isv4=$?
|
||||
if [ $isv4 = "1" ]; then
|
||||
# run ipv4 ping
|
||||
local value=$(ping $options $ip | grep -o -e "[0-9]*%")
|
||||
elif [ $isv4 = "0" ]; then
|
||||
# run ipv6 ping
|
||||
local value=$(ping6 $options $ip | grep -o -e "[0-9]*%")
|
||||
fi
|
||||
|
||||
if [ ${value:0:$((${#value}-1))} -gt ${maxloss:0:$((${#maxloss}-1))} ]; then
|
||||
log error "not able to reach $(echo $line | awk '{print $2}') at $ip"
|
||||
fi
|
||||
|
||||
}
|
||||
|
||||
|
||||
# **** start of script ****
|
||||
|
||||
# set linecount to 1
|
||||
linecount="1"
|
||||
|
||||
# read line by line of $sourcefile
|
||||
while read line; do
|
||||
|
||||
#get first letter of line
|
||||
fletter=${line:0:1}
|
||||
if [ -z $fletter ]; then
|
||||
#skip line, it's empty
|
||||
:
|
||||
elif [ $fletter = "#" ]; then
|
||||
#skip line, it's a comment
|
||||
:
|
||||
else
|
||||
#exclusion of $excludes
|
||||
excluded="0"
|
||||
for var in $excludes; do
|
||||
#check if ip is excluded
|
||||
if [ $(echo $line | awk '{print $1}') = $var ]; then
|
||||
excluded="1"
|
||||
break
|
||||
fi
|
||||
done
|
||||
|
||||
#run check function for ip if not excluded
|
||||
if [ $excluded = "1" ]; then
|
||||
continue
|
||||
else
|
||||
#run actual ping
|
||||
check "$(echo $line | awk '{print $1}')"
|
||||
fi
|
||||
|
||||
fi
|
||||
|
||||
#count lines
|
||||
let linecount++
|
||||
|
||||
done < $sourcefile
|
||||
|
||||
|
||||
exit 0
|
||||
# **** end of script ****
|
||||
|
||||
|
|
@ -0,0 +1,15 @@
|
|||
# central mbots configuration file
|
||||
|
||||
#this file must be in /etc/mbots
|
||||
|
||||
|
||||
#bashlib location
|
||||
bashlibpath="/opt/bashlib"
|
||||
|
||||
#logging
|
||||
loglevel="4"
|
||||
log2file="0"
|
||||
logfile=/var/log/mbots.log
|
||||
log2syslog="1"
|
||||
|
||||
|
|
@ -0,0 +1,45 @@
|
|||
#!/bin/sh
|
||||
|
||||
|
||||
# file: system.sh
|
||||
# version: 0.1
|
||||
# author: david@socialnerds.org
|
||||
#
|
||||
# description: this script checks for local system health and
|
||||
# fires if values exeed a certain threshold
|
||||
#
|
||||
# changelog: [11/22/2020] - file created
|
||||
|
||||
|
||||
# **** configuration ****
|
||||
|
||||
CHECKS="load memory disk_usage"
|
||||
|
||||
|
||||
# **** functions ****
|
||||
|
||||
load() {
|
||||
local THRESHOLD=$1
|
||||
}
|
||||
|
||||
memory() {
|
||||
pass
|
||||
}
|
||||
|
||||
disk_usage() {
|
||||
pass
|
||||
}
|
||||
|
||||
|
||||
# **** loop through checks
|
||||
for CHECK in $CHECKS; do
|
||||
pass
|
||||
done
|
||||
|
||||
|
||||
# ping on success
|
||||
# ping ../fail on failure
|
||||
# provide payload (log output/error message)
|
||||
|
||||
|
||||
exit 0
|
|
@ -0,0 +1,11 @@
|
|||
#!/bin/bash
|
||||
|
||||
#count minutes since start
|
||||
minutes=0
|
||||
while true; do
|
||||
sleep 60
|
||||
minutes=$(($minutes+1))
|
||||
echo $minutes
|
||||
done
|
||||
|
||||
|
|
@ -0,0 +1,12 @@
|
|||
# a whitespace seperated list of ip addresses or fqdnames
|
||||
dest="192.168.1.13 somemachine.example.com"
|
||||
|
||||
# jabber configuration
|
||||
user="jid"
|
||||
server="jabber-server"
|
||||
#port="" ## if you want to use a special port (default: 5222)
|
||||
pass="jabber-password"
|
||||
res="pingbot"
|
||||
watchdogs="someuser@jabber.example.com anotheruser@example.com" ## whitespace seperated list of JIDs
|
||||
|
||||
|
|
@ -0,0 +1,98 @@
|
|||
#!/bin/bash
|
||||
|
||||
## ## ## ## ## ## ## ## ##
|
||||
## ##
|
||||
## jabber ping bot ##
|
||||
## ##
|
||||
## v0.1 ##
|
||||
## ##
|
||||
## author: david@socialnerds.org ##
|
||||
## ##
|
||||
## ## ## ## ## ## ## ## ##
|
||||
|
||||
|
||||
## timestamp for logfile
|
||||
timestamp=$(date '+%d %B %Y %H:%M')
|
||||
echo "info: starting jabber ping bot $timestamp"
|
||||
|
||||
|
||||
## check if sendxmpp is installed
|
||||
if [ $(aptitude search sendxmpp | awk '{print $1}') = "i" ]; then
|
||||
echo "info: sendxmpp found"
|
||||
else
|
||||
if [ $(whoami) = "root" ]; then
|
||||
apt-get install sendxmpp
|
||||
else
|
||||
echo "error: permission denied"
|
||||
echo "info: install sendxmpp or run this scrip as superuser"
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
|
||||
## set and load configfile
|
||||
if [ -z $1 ]; then
|
||||
configfile="/etc/mobots/ping.conf"
|
||||
if [ -f $configfile ]; then
|
||||
source $configfile
|
||||
else
|
||||
echo "error: no config file $configfile"
|
||||
exit 1
|
||||
fi
|
||||
else
|
||||
configfile=$1
|
||||
if [ -f $configfile ]; then
|
||||
source $configfile
|
||||
else
|
||||
echo "error: no config file $configfile"
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
|
||||
## check sendxmpp config
|
||||
if [ -f ~/.sendxmpprc ]; then
|
||||
echo "info: jabber config found in ~/.sendxmpprc"
|
||||
else
|
||||
|
||||
if [ -z $port ]; then
|
||||
port="5222"
|
||||
else
|
||||
echo "info: using port $port"
|
||||
fi
|
||||
|
||||
echo "$user@$server:$port $pass" > ~/.sendxmpprc
|
||||
chmod 600 ~/.sendxmpprc
|
||||
echo "info: created sendxmpp config in ~/.sendxmpprc"
|
||||
fi
|
||||
|
||||
## run the actual ping
|
||||
set -- $dest
|
||||
|
||||
for var in "$@"
|
||||
do
|
||||
#result=$(ping -c 05 $var | grep transmitted | awk '{print $4}')
|
||||
ping -c 03 $var >/dev/null 2>&1
|
||||
errorcode=$?
|
||||
if [ $errorcode = "0" ]; then
|
||||
echo "info: $var is responding"
|
||||
else
|
||||
if [ $errorcode = "1" ]; then
|
||||
echo "alert: $var is not responding"
|
||||
## sending jabber message
|
||||
echo "alert: $var is not responding
|
||||
ping errorcode: $errorcode" | sendxmpp -r $res $watchdogs
|
||||
else
|
||||
if [ $errorcode = "2" ]; then
|
||||
echo "alert: $var cannot be resolved"
|
||||
## sending jabber message
|
||||
echo "alert: $var cannot be resolved
|
||||
ping errorcode: $errorcode" | sendxmpp -r $res $watchdogs
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
done
|
||||
|
||||
## the end
|
||||
exit 0
|
||||
|
|
@ -0,0 +1,139 @@
|
|||
#!/bin/bash
|
||||
|
||||
#
|
||||
# control my hs100 power switches
|
||||
#
|
||||
|
||||
VERSION="0.1"
|
||||
AUTHOR="david@socialnerds.org"
|
||||
DEVICES="media ghost"
|
||||
|
||||
is_status_on() {
|
||||
if [ "$1" ] && [ $(./hs100/hs100.sh -i power-$1.socialner.ds check | awk '{print $2}') == "ON" ]; then
|
||||
return 0
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
is_status_off() {
|
||||
if [ "$1" ] && [ $(./hs100/hs100.sh -i power-$1.socialner.ds check | awk '{print $2}') == "OFF" ]; then
|
||||
return 0
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
does_device_exist() {
|
||||
if [ "$1" ]; then
|
||||
for DEVICE in $DEVICES; do
|
||||
if [ "$1" == $DEVICE ]; then
|
||||
return 0
|
||||
fi
|
||||
done
|
||||
return 1
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
switch_device_on() {
|
||||
if [ "$1" ]; then
|
||||
./hs100/hs100.sh -i power-$1.socialner.ds on
|
||||
if [ $? -ne 0 ]; then
|
||||
return 1
|
||||
fi
|
||||
return 0
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
switch_device_off() {
|
||||
if [ "$1" ]; then
|
||||
./hs100/hs100.sh -i power-$1.socialner.ds off
|
||||
if [ $? -ne 0 ]; then
|
||||
return 1
|
||||
fi
|
||||
return 0
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
print_usage() {
|
||||
echo "usage: ./power_control <on|off|status> <device>"
|
||||
}
|
||||
|
||||
|
||||
# **** start of script ****
|
||||
if [ "$1" ] && [[ "$1" == @("on"|"off"|"status") ]] && [ "$2" ]; then
|
||||
if does_device_exist $2; then
|
||||
case $1 in
|
||||
"on")
|
||||
if is_status_off $2; then
|
||||
echo "switching on $2"
|
||||
if ! switch_device_on $2; then
|
||||
echo "error: something went wrong while switching on device"
|
||||
exit 1
|
||||
fi
|
||||
sleep 2
|
||||
if is_status_on $2; then
|
||||
echo "$2 switched on successfully"
|
||||
else
|
||||
echo "warning: device still appears off"
|
||||
fi
|
||||
else
|
||||
if is_status_on $2; then
|
||||
echo "warning: device is already switched on"
|
||||
else
|
||||
echo "error: something went wrong while checking device status"
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
;;
|
||||
"off")
|
||||
if is_status_on $2; then
|
||||
echo "switching off $2"
|
||||
if ! switch_device_off $2; then
|
||||
echo "error: something went wrong while switching off device"
|
||||
exit 1
|
||||
fi
|
||||
sleep 2
|
||||
if is_status_off $2; then
|
||||
echo "$2 switched off successfully"
|
||||
else
|
||||
echo "warning: device still appears on"
|
||||
fi
|
||||
else
|
||||
if is_status_off $2; then
|
||||
echo "warning: device is already switched off"
|
||||
else
|
||||
echo "error: something went wrong while checking device status"
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
;;
|
||||
"status")
|
||||
if is_status_on $2; then
|
||||
echo "$2 is on"
|
||||
elif is_status_off $2; then
|
||||
echo "$2 is off"
|
||||
else
|
||||
echo "error: something went wrong while getting device status"
|
||||
exit 1
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
else
|
||||
echo "error: device unknown"
|
||||
print_usage
|
||||
exit 1
|
||||
fi
|
||||
else
|
||||
echo "error: command unknown"
|
||||
print_usage
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# **** end of script ***
|
|
@ -0,0 +1,83 @@
|
|||
#!/bin/bash
|
||||
|
||||
# preperation script for my ubuntu servers
|
||||
|
||||
|
||||
# **** configuration section ****
|
||||
sshgroup="sshusers"
|
||||
#user=$(cat /etc/passwd | grep 1000)
|
||||
#user=${user:0:$(($(echo `expr index "$user" :`)-1))}
|
||||
user="david"
|
||||
|
||||
|
||||
# **** install various tools/packages ****
|
||||
pkginstall()
|
||||
{
|
||||
|
||||
apt-get update
|
||||
apt-get dist-upgrade -y
|
||||
apt-get install -y htop nload nmap tshark git-core \
|
||||
curl wget dnsutils \
|
||||
vim zsh ncdu
|
||||
|
||||
}
|
||||
|
||||
|
||||
# **** configure motd ****
|
||||
motdconfig()
|
||||
{
|
||||
|
||||
rm /etc/update-motd.d/00*
|
||||
rm /etc/update-motd.d/10*
|
||||
rm /etc/update-motd.d/50*
|
||||
|
||||
echo ""
|
||||
read -p "now its time to create/customize your /etc/motd.tail
|
||||
(go to http://www.network-science.de/ascii/)"
|
||||
vim /etc/motd.tail
|
||||
|
||||
}
|
||||
|
||||
|
||||
# **** ssh server config ****
|
||||
sshdconfig()
|
||||
{
|
||||
|
||||
echo "
|
||||
__.-._
|
||||
'-._'7'
|
||||
/'.-c
|
||||
| /T
|
||||
_)_/LI
|
||||
|
||||
this machine is
|
||||
protected by a
|
||||
master of the force!
|
||||
" > /etc/issue.net
|
||||
|
||||
sed -i 's/#Banner/Banner/' /etc/ssh/sshd_config
|
||||
echo "" >> /etc/ssh/sshd_config
|
||||
echo "# Restrictions added by ubuntu server prep script" >> /etc/ssh/sshd_config
|
||||
echo "AllowGroups $sshgroup" >> /etc/ssh/sshd_config
|
||||
echo "" >> /etc/ssh/sshd_config
|
||||
|
||||
addgroup $sshgroup
|
||||
adduser $user $sshgroup
|
||||
|
||||
read -p "add needed users to sshgroup $sshgroup in /etc/group"
|
||||
vim /etc/group
|
||||
|
||||
}
|
||||
|
||||
|
||||
# **** start of script ****
|
||||
|
||||
pkginstall
|
||||
motdconfig
|
||||
sshdconfig
|
||||
|
||||
|
||||
exit 0
|
||||
# **** end of file ****
|
||||
|
||||
|
|
@ -0,0 +1,40 @@
|
|||
#!/usr/bin/env perl
|
||||
|
||||
# prime number calculation
|
||||
# author: david@socialnerds.org
|
||||
|
||||
my $num = 3;
|
||||
print "highest prime number: ";
|
||||
chomp(my $maxnum = <STDIN>);
|
||||
my $count = 2;
|
||||
|
||||
print "2\n3\n";
|
||||
|
||||
while ( $num <= $maxnum )
|
||||
{
|
||||
$i=3;
|
||||
while ( $i <= int($num**(1/2)+1) )
|
||||
{
|
||||
if ( $i != 1 && $i < $num && $i%2 != 0 )
|
||||
{
|
||||
if ( $num % $i != 0 ) {
|
||||
$probably = "true"
|
||||
} else {
|
||||
$probably = "false";
|
||||
last;
|
||||
}
|
||||
}
|
||||
$i += 2;
|
||||
}
|
||||
|
||||
if ( $probably eq "true" )
|
||||
{
|
||||
print "$num\n";
|
||||
$count++;
|
||||
}
|
||||
$num += 2;
|
||||
}
|
||||
|
||||
print "prime number count: $count\n";
|
||||
|
||||
|
|
@ -0,0 +1,47 @@
|
|||
#!/bin/bash
|
||||
|
||||
#
|
||||
# recreate ssh host keys
|
||||
#
|
||||
|
||||
sshdconfig="/etc/ssh/sshd_config"
|
||||
|
||||
if [ $(whoami) != "root" ]; then
|
||||
echo "you need to be root"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ -r $sshdconfig ]; then
|
||||
while read line; do
|
||||
fletter=${line:0:1}
|
||||
if [ -z $fletter ]; then
|
||||
#empty line. skipping.
|
||||
:
|
||||
elif [ $fletter == "#" ]; then
|
||||
#comment. skipping.
|
||||
:
|
||||
else
|
||||
echo $line | grep "HostKey" >> /dev/null
|
||||
if [ $? -eq 0 ]; then
|
||||
file=$(echo $line | awk '{print $2}')
|
||||
if [ $file != "${file/_dsa_/}" ]; then
|
||||
mv $file $file.old
|
||||
mv $file.pub $file.pub.old
|
||||
ssh-keygen -t dsa -f $file
|
||||
elif [ $file != "${file/_ecdsa_/}" ]; then
|
||||
mv $file $file.old
|
||||
mv $file.pub $file.pub.old
|
||||
ssh-keygen -t ecdsa -f $file
|
||||
elif [ $file != "${file/_rsa_/}" ]; then
|
||||
mv $file $file.old
|
||||
mv $file.pub $file.pub.old
|
||||
ssh-keygen -t rsa -f $file
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
done < $sshdconfig
|
||||
exit 0
|
||||
else
|
||||
echo "$sshdconfig - file not found"
|
||||
exit 1
|
||||
fi
|
|
@ -0,0 +1,52 @@
|
|||
#!/usr/bin/env perl
|
||||
|
||||
use 5.010;
|
||||
|
||||
my $var = 5*5;
|
||||
|
||||
chomp(my $input = <STDIN>);
|
||||
|
||||
$var *= $input;
|
||||
|
||||
if ( $var == 100 )
|
||||
{
|
||||
say $var;
|
||||
}
|
||||
else
|
||||
{
|
||||
say "it is not 100";
|
||||
}
|
||||
|
||||
$is_true = $var == 100;
|
||||
|
||||
if ( ! $is_true )
|
||||
{
|
||||
say "not true";
|
||||
}
|
||||
else
|
||||
{
|
||||
say "true";
|
||||
}
|
||||
|
||||
my $zaehler=0;
|
||||
while ($zaehler <= 5)
|
||||
{
|
||||
say "der zähler steht jetzt auf $zaehler";
|
||||
$zaehler += 1;
|
||||
}
|
||||
|
||||
chomp(my $input2 = <STDIN>);
|
||||
if ( defined($input2) )
|
||||
{
|
||||
say "eingabe lautet: $input2";
|
||||
}
|
||||
else
|
||||
{
|
||||
say "keine eingabe verfügbar";
|
||||
}
|
||||
|
||||
#umfang berechnung
|
||||
print "bitte radius für umfangberechnung angeben: ";
|
||||
chomp(my $radius = <STDIN>);
|
||||
my $umfang = $radius *= 2*3.141592654;
|
||||
say "umfang beträgt: $umfang";
|
|
@ -0,0 +1,61 @@
|
|||
#!/usr/bin/perl -w
|
||||
#
|
||||
# pfdel - deletes message containing specified address from
|
||||
# Postfix queue. Matches either sender or recipient address.
|
||||
#
|
||||
# Usage: pfdel <email_address>
|
||||
#
|
||||
|
||||
use strict;
|
||||
|
||||
# Change these paths if necessary.
|
||||
my $LISTQ = "/usr/sbin/postqueue -p";
|
||||
my $POSTSUPER = "/usr/sbin/postsuper";
|
||||
|
||||
my $email_addr = "";
|
||||
my $qid = "";
|
||||
my $euid = $>;
|
||||
|
||||
if ( @ARGV != 1 ) {
|
||||
die "Usage: pfdel <email_address>\n";
|
||||
} else {
|
||||
$email_addr = $ARGV[0];
|
||||
}
|
||||
|
||||
if ( $euid != 0 ) {
|
||||
die "You must be root to delete queue files.\n";
|
||||
}
|
||||
|
||||
|
||||
open(QUEUE, "$LISTQ |") ||
|
||||
die "Can't get pipe to $LISTQ: $!\n";
|
||||
|
||||
my $entry = <QUEUE>; # skip single header line
|
||||
$/ = ""; # Rest of queue entries print on
|
||||
# multiple lines.
|
||||
while ( $entry = <QUEUE> ) {
|
||||
if ( $entry =~ / $email_addr$/m ) {
|
||||
($qid) = split(/\s+/, $entry, 2);
|
||||
$qid =~ s/[\*\!]//;
|
||||
next unless ($qid);
|
||||
|
||||
#
|
||||
# Execute postsuper -d with the queue id.
|
||||
# postsuper provides feedback when it deletes
|
||||
# messages. Let its output go through.
|
||||
#
|
||||
if ( system($POSTSUPER, "-d", $qid) != 0 ) {
|
||||
# If postsuper has a problem, bail.
|
||||
die "Error executing $POSTSUPER: error " .
|
||||
"code " . ($?/256) . "\n";
|
||||
}
|
||||
}
|
||||
}
|
||||
close(QUEUE);
|
||||
|
||||
if (! $qid ) {
|
||||
die "No messages with the address <$email_addr> " .
|
||||
"found in queue.\n";
|
||||
}
|
||||
|
||||
exit 0;
|
|
@ -0,0 +1,68 @@
|
|||
#!/usr/bin/perl
|
||||
# Author: Dominik Danter
|
||||
# Version: 0.01
|
||||
# Purpose:
|
||||
# Tiny VLC wrapper that streams the file provided as argument. This can be used
|
||||
# as a Nautlius-Script. It just works on one file yet.
|
||||
#
|
||||
# Just a litte Script that by default opens two instances of vlc.
|
||||
#
|
||||
# The first one will stream the passed files with the real time streaming
|
||||
# protocol (rtsp) at $rtsspport. If the device $dev (e.g. 'eth0')
|
||||
# has got a valid IPv4 address you can control the sever at
|
||||
# {address of device}:$httpport. Note: localhost:$httpport will NOT work.
|
||||
#
|
||||
# If you do not wish this behaviour assign a false value to $httpport
|
||||
# (my $httpport = 0; for example).
|
||||
#
|
||||
# You can control access to this webserver in the .hosts file
|
||||
# (on ubuntu one can find this file in /usr/share/vlc/http).
|
||||
#
|
||||
# At the moment just one server instance will work.
|
||||
#
|
||||
# The second instance will indefinitely repeatedly listen on
|
||||
# localhost:$rtspport and serves as the client, for local playback.
|
||||
# If you do not wish local playblack assign a false value to
|
||||
# $localplayback (my $localplayback = 0; for example);
|
||||
#
|
||||
# Todo:
|
||||
# Check requirements first and die if they are not met.
|
||||
# Implement a more versatile way of passing options to vlc.
|
||||
# Support IPv6 by altering the regex.
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
use v5.12;
|
||||
|
||||
#settings
|
||||
my $dev = 'eth0'; #Your favourite interface here, maybe 'eth0';
|
||||
my $httpport = 8080; #unsetting this will disable the webserver
|
||||
my $rtspport = 5544;
|
||||
my $localplayback = 1; #set to 0 if you do not wish local playback
|
||||
#end settings
|
||||
|
||||
#if no arguments ar passed die
|
||||
@ARGV > 0 or die "you forgot to pass some filenames to $0";
|
||||
|
||||
my $http = "";
|
||||
|
||||
#get ip addr of $dev
|
||||
$_ = `ip addr show $dev`;
|
||||
my ($address) = /inet ((\d\d?\.){3}\d\d?)/;
|
||||
if ($address && $httpport) {
|
||||
$http = "--extraintf http --http-host $address:$httpport ";
|
||||
}
|
||||
|
||||
#escape arguments (samplemovie.avi to "samplemovie.avi");
|
||||
@ARGV = map{ $_ = '"'.$_.'"' } @ARGV;
|
||||
|
||||
#start server
|
||||
system "vlc @ARGV $http:sout=#rtp{sdp=rtsp://:$rtspport/} :no-sout-rtp-sap :no-sout-standard-sap :ttl=1 :sout-keep &";
|
||||
|
||||
#pause
|
||||
sleep(1);
|
||||
|
||||
#start client if applicable
|
||||
system "vlc --repeat rtsp://localhost:$rtspport/" if $localplayback;
|
||||
|
||||
#ich mag Schokolade gern
|
|
@ -0,0 +1,146 @@
|
|||
#!/usr/bin/env bash
|
||||
#
|
||||
# download and setup zsh, oh-my-zsh and various zsh plugins
|
||||
#
|
||||
# author: david@socialnerds.org
|
||||
# license: MIT
|
||||
# git: https://socialg.it/david/scripts.git
|
||||
# version 0.1
|
||||
|
||||
# **** vars ****
|
||||
command="$0"
|
||||
root="$HOME/.dotfiles"
|
||||
plugins="$root/zsh"
|
||||
timestamp=$(date +"%Y%m%d%H%M")
|
||||
debug=1
|
||||
remove=".dotfiles .dotfiles.old .myzsh .oh-my-zsh .zshrc .zshrc-pre-oh-my-zsh"
|
||||
dependencies="awk tee ls git wget curl rm mv sleep date"
|
||||
if [ $(uname) == "Darwin" ]; then
|
||||
alias sed="gsed"
|
||||
#TODO: check if gsed is there first
|
||||
fi
|
||||
|
||||
|
||||
# **** functions ****
|
||||
message() {
|
||||
if [ $1 == "e" ]; then
|
||||
level="\033[31m✗\033[0m"
|
||||
elif [ $1 == "i" ]; then
|
||||
level="\033[32m✓\033[0m"
|
||||
elif [ $1 == "w" ]; then
|
||||
level="\033[33m!\033[0m"
|
||||
elif [ $1 == "d" ]; then
|
||||
if [ $debug -eq 1 ]; then
|
||||
level="\033[2md\033[0m"
|
||||
else
|
||||
return 0
|
||||
fi
|
||||
else
|
||||
message e "Unknown message level[$1]."
|
||||
return 1
|
||||
fi
|
||||
echo -e [$level] ${@:2}
|
||||
sleep 0.1
|
||||
}
|
||||
|
||||
failsafe() {
|
||||
if [ $1 -ne 0 ]; then
|
||||
message e "Installer died horribly!"
|
||||
if [ $2 ]; then
|
||||
message d "Dumping last output to stdout."
|
||||
echo ${@:2}
|
||||
fi
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
cleanup() {
|
||||
# Get rid of preexisting data at destination
|
||||
destination=$1
|
||||
if [ -a "$destination.old" ]; then
|
||||
message e "A previous backup exists. Move elsewhere or delete first[$destination.old]."
|
||||
exit 1
|
||||
else
|
||||
if [ -h $destination ]; then
|
||||
link=$(ls -la $destination | awk '{print $9" "$10" "$11}')
|
||||
# It should be safe to just remove symbolic links because no data is actually deleted.
|
||||
message d "Symbolic link exists, attempting to remove it[$link]."
|
||||
output=$(rm $destination 2>&1); failsafe $? $output
|
||||
message i "Removed symbolic link[$link]."
|
||||
elif [ -a $destination ]; then
|
||||
# Rename data to $destination.old
|
||||
message d "Data exists at install destination, attempting to create a backup[$destination.old]."
|
||||
output="", output=$(mv $destination $destination.old 2>&1); failsafe $? $output
|
||||
message i "Created a backup of a preexisting data[$destination.old]."
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
# **** start of script ****
|
||||
|
||||
message d "Warming up installer."
|
||||
#message d "Initiating preflight checks."
|
||||
|
||||
# check dependencies
|
||||
missing=""
|
||||
for item in $dependencies; do
|
||||
command -v $item > /dev/null
|
||||
if [ $? -ne 0 ]; then
|
||||
missing="$missing $item"
|
||||
fi
|
||||
done
|
||||
if [ -n "$missing" ]; then
|
||||
message e "dependencies missing: $missing"
|
||||
exit 1
|
||||
fi
|
||||
message i "all dependencies found"
|
||||
|
||||
# remove everything in 5 seconds: ~/.dotfiles ~/.dotfiles.old ~/.myzsh ~/.oh-my-zsh ~/.zshrc
|
||||
message w "your old configs will be deleted in 5 seconds [terminate deletion with Ctrl-C]"
|
||||
sleep 5
|
||||
for item in $remove; do
|
||||
if [ -d $item ]; then
|
||||
rm -rf $HOME/$item
|
||||
message w "removed folder: ~/$item"
|
||||
elif [ -h $item ]; then
|
||||
rm $HOME/$item
|
||||
message w "removed link: ~/$item"
|
||||
elif [ -f $item ]; then
|
||||
rm $HOME/$item
|
||||
message w "removed file: ~/$item"
|
||||
fi
|
||||
done
|
||||
|
||||
# invoke oh-my-zh installer
|
||||
if [ -w $HOME ]; then
|
||||
curl -fsSL https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh | bash
|
||||
message i "oh-my-zsh installed"
|
||||
else
|
||||
message e "oh-my-zsh could not be installed. $HOME is not writeable"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# clone plugins
|
||||
cd $HOME/.oh-my-zsh/custom/plugins/ > /dev/null
|
||||
git clone https://github.com/sindresorhus/pure.git pure
|
||||
git clone https://github.com/mafredri/zsh-async.git async
|
||||
git clone https://socialg.it/david/zsh-david.git zsh-david
|
||||
git clone https://github.com/zsh-users/zsh-syntax-highlighting.git zsh-syntax-highlighting
|
||||
git clone https://github.com/skx/sysadmin-util.git sysadmin-util
|
||||
git clone https://github.com/TamCore/autoupdate-oh-my-zsh-plugins.git autoupdate
|
||||
git clone https://github.com/zsh-users/zsh-autosuggestions.git zsh-autosuggestions
|
||||
cd - > /dev/null
|
||||
message i "all plugins cloned"
|
||||
|
||||
# set $ZSH_THEME="" in .zshrc
|
||||
sed -i "s/^ZSH_THEME=\"robbyrussell\"/ZSH_THEME=\"\"/g" $HOME/.zshrc
|
||||
# set $plugins in .zshrc
|
||||
plugins="git zsh-autosuggestions autoupdate sysadmin-util zsh-syntax-highlighting zsh-david async pure"
|
||||
sed -i "/plugins=(/,/)/d; s/source \$ZSH\/oh-my-zsh.sh/plugins=($plugins);; source \$ZSH\/oh-my-zsh.sh/g" $HOME/.zshrc
|
||||
sed -i $'s/;; /\\\n/g' $HOME/.zshrc
|
||||
message i "tweaked ~/.zshrc"
|
||||
|
||||
message d "Installer finished."
|
||||
|
||||
# **** end of script ****
|
|
@ -0,0 +1,12 @@
|
|||
#!/bin/bash
|
||||
|
||||
# simple speedtest logger
|
||||
# install https://github.com/taganaka/SpeedTest first
|
||||
|
||||
server="speedcheck.liwest.at:8080"
|
||||
options="--output text --test-server $server"
|
||||
timestamp=$(date +%Y/%m/%d_%H:%M)
|
||||
cmd="/usr/local/bin/SpeedTest"
|
||||
result=$($cmd $options | grep -v IP_LAT | grep -v IP_LON | grep -v PROVIDER | grep -v TEST_SERVER_HOST)
|
||||
|
||||
echo $timestamp - $result
|
|
@ -0,0 +1,10 @@
|
|||
#!/bin/bash
|
||||
|
||||
# Start local VMWare services and set permissions to vmnet0
|
||||
|
||||
sudo /etc/init.d/vmware start
|
||||
sudo chgrp sudo /dev/vmnet0
|
||||
sudo chmod g+rw /dev/vmnet0
|
||||
sudo chgrp sudo /dev/vmnet1
|
||||
sudo chmod g+rw /dev/vmnet1
|
||||
|
|
@ -0,0 +1,57 @@
|
|||
#!/bin/bash
|
||||
|
||||
|
||||
###############################
|
||||
# #
|
||||
# mbots mail routine #
|
||||
# #
|
||||
###############################
|
||||
|
||||
|
||||
# ***** config section *****
|
||||
#don't touch as long as you're not me. feel me?
|
||||
version=".1"
|
||||
author="david@socialnerds.org"
|
||||
|
||||
smtpserver="smtp.aec.at"
|
||||
recipients="person@domain.tld person2@domain.tld"
|
||||
from="releasechecker@aec.at"
|
||||
subject="ubuntu precise pangolin is out. download it. seed it."
|
||||
line=$1
|
||||
|
||||
#if [ -f $line ]; then
|
||||
# line=$(cat $line)
|
||||
#fi
|
||||
|
||||
|
||||
# ***** start of script *****
|
||||
#telnet connection
|
||||
{
|
||||
sleep 1
|
||||
echo "HELO $HOSTNAME"
|
||||
sleep 1
|
||||
echo "MAIL FROM: $from"
|
||||
sleep 1
|
||||
for address in $recipients; do
|
||||
echo "RCPT TO: $address"
|
||||
sleep 1
|
||||
done
|
||||
echo "DATA"
|
||||
sleep 1
|
||||
for address in $recipients; do
|
||||
echo "To: $address"
|
||||
done
|
||||
echo "From: Release CheckeR <$from>"
|
||||
echo "Subject: $subject"
|
||||
sleep 1
|
||||
echo "$line"
|
||||
sleep 1
|
||||
echo "."
|
||||
sleep 1
|
||||
echo "QUIT"
|
||||
} | telnet $smtpserver 25
|
||||
|
||||
|
||||
# ***** end of script *****
|
||||
#live long and prosper
|
||||
exit 0
|
|
@ -0,0 +1,18 @@
|
|||
#!/bin/bash
|
||||
|
||||
# brightness - on my thinkpad
|
||||
|
||||
max=$(cat /sys/class/backlight/intel_backlight/max_brightness)
|
||||
echo "Max: $max"
|
||||
min=0
|
||||
echo "Min: $min"
|
||||
value=250
|
||||
echo "Value: $value"
|
||||
actual=$(cat /sys/class/backlight/intel_backlight/actual_brightness)
|
||||
echo "Actual: $actual"
|
||||
future=$(($actual-$value))
|
||||
if [ $future -lt 0 ]; then
|
||||
future=0
|
||||
fi
|
||||
echo "Future: $future"
|
||||
tee /sys/class/backlight/intel_backlight/brightness <<< $future
|
|
@ -0,0 +1,18 @@
|
|||
#!/bin/bash
|
||||
|
||||
# brightness + on my thinkpad
|
||||
|
||||
max=$(cat /sys/class/backlight/intel_backlight/max_brightness)
|
||||
echo "Max: $max"
|
||||
min=0
|
||||
echo "Min: $min"
|
||||
value=250
|
||||
echo "Value: $value"
|
||||
actual=$(cat /sys/class/backlight/intel_backlight/actual_brightness)
|
||||
echo "Actual: $actual"
|
||||
future=$(($actual+$value))
|
||||
if [ $future -gt $max ]; then
|
||||
future=$max
|
||||
fi
|
||||
echo "Future: $future"
|
||||
tee /sys/class/backlight/intel_backlight/brightness <<< $future
|
|
@ -0,0 +1,9 @@
|
|||
#!/bin/bash
|
||||
|
||||
#fix thinkpad trackpoint
|
||||
sleep 5
|
||||
xinput set-prop "TPPS/2 IBM TrackPoint" "Evdev Wheel Emulation" 1
|
||||
xinput set-prop "TPPS/2 IBM TrackPoint" "Evdev Wheel Emulation Button" 2
|
||||
xinput set-prop "TPPS/2 IBM TrackPoint" "Evdev Wheel Emulation Timeout" 200
|
||||
xinput set-prop "TPPS/2 IBM TrackPoint" "Evdev Wheel Emulation Axes" 6 7 4 5
|
||||
xinput set-prop "TPPS/2 IBM TrackPoint" "Device Accel Constant Deceleration" 0.75
|
|
@ -0,0 +1,100 @@
|
|||
#!/bin/bash
|
||||
|
||||
clear
|
||||
|
||||
echo "
|
||||
########################################################
|
||||
#### Installation and configuration of vpnc ####
|
||||
#### ####
|
||||
#### Cisco VPN Config Script ####
|
||||
#### ####
|
||||
#### Scriptauthor: David Starzengruber ####
|
||||
########################################################
|
||||
"
|
||||
|
||||
# scriptconfiguration (if you want to skip the config wizard)
|
||||
connection_name="aec"
|
||||
vpn_user="<user>"
|
||||
vpn_password="<password>"
|
||||
vpn_gate="<ip>"
|
||||
vpn_group="<vpn-group>"
|
||||
vpn_group_password="<group-secret>"
|
||||
command=""
|
||||
|
||||
# sudo check
|
||||
if [ $USER != "root" ]; then
|
||||
echo "
|
||||
Sorry $USER, you need to run this script as user root! (try: sudo ./vpnc.sh)
|
||||
"
|
||||
exit
|
||||
fi
|
||||
|
||||
# configuration wizard
|
||||
clear
|
||||
echo "Cisco VPN config wizard"
|
||||
echo "Enter a name for this connection:"
|
||||
read connection_name
|
||||
clear
|
||||
echo "Cisco VPN config wizard"
|
||||
echo "Enter $connection_name VPN Gateway:"
|
||||
read vpn_gate
|
||||
clear
|
||||
echo "Cisco VPN config wizard"
|
||||
echo "Enter $connection_name VPN Username:"
|
||||
read vpn_user
|
||||
clear
|
||||
echo "Cisco VPN config wizard"
|
||||
echo "Enter $connection_name VPN Password:"
|
||||
read vpn_password
|
||||
clear
|
||||
echo "Cisco VPN config wizard"
|
||||
echo "Enter $connection_name VPN Group:"
|
||||
read vpn_group
|
||||
clear
|
||||
echo "Cisco VPN config wizard"
|
||||
echo "Enter $connection_name VPN Group Password:"
|
||||
read vpn_group_password
|
||||
clear
|
||||
echo "Cisco VPN config wizard"
|
||||
echo "Enter any command which should be executed on connect:"
|
||||
read command
|
||||
clear
|
||||
|
||||
# installation via package-manager
|
||||
echo Installing vpnc..
|
||||
apt-get install -y vpnc | grep already
|
||||
|
||||
# adding connection script
|
||||
echo "Creating connection script. (/usr/local/bin/connect-$connection_name)"
|
||||
echo "echo Starting VPNC Deamon..
|
||||
sudo vpnc-connect /etc/vpnc/$connection_name.cfg
|
||||
$command
|
||||
echo Custom command executed.
|
||||
" > /usr/local/bin/connect-$connection_name
|
||||
|
||||
# adding configuration file
|
||||
echo "Creating $connection_name configuration file..."
|
||||
echo "IPSec gateway $vpn_gate
|
||||
IPSec ID $vpn_group
|
||||
IPSec secret $vpn_group_password
|
||||
Xauth username $vpn_user
|
||||
Xauth password $vpn_password" > /etc/vpnc/$connection_name.cfg
|
||||
|
||||
#setting executeperms
|
||||
chmod 775 /usr/local/bin/connect-$connection_name
|
||||
|
||||
#finish
|
||||
echo "
|
||||
########################################################
|
||||
#### Installation and configuration of vpnc ####
|
||||
#### ####
|
||||
#### Cisco VPN Config Script ####
|
||||
#### ####
|
||||
#### Scriptauthor: David Starzengruber ####
|
||||
########################################################
|
||||
"
|
||||
echo "Everythings done!
|
||||
Configfilepath: /etc/vpnc/$connection_name.cfg
|
||||
Startscriptpath: /usr/local/bin/connect-$connection_name
|
||||
VPN connect command: connect-$connection_name
|
||||
"
|
|
@ -0,0 +1,140 @@
|
|||
#!/bin/bash
|
||||
|
||||
# # # # # # # # # # # # # # # # # # # # #
|
||||
# #
|
||||
# YouTube Contvertion Tool #
|
||||
# #
|
||||
# Author: david@socialnerds.org #
|
||||
# Version: v0.3 #
|
||||
# #
|
||||
# #
|
||||
# # # # # # # # # # # # # # # # # # # # #
|
||||
|
||||
# help text
|
||||
if [[ $1 == "-h" || $1 == "--help" ]]; then
|
||||
echo "
|
||||
# # # # # # # # # # # # # # # # # # # # #
|
||||
# #
|
||||
# YouTube Contvertion Tool #
|
||||
# #
|
||||
# Author: david@socialnerds.org #
|
||||
# Version: v0.3 #
|
||||
# #
|
||||
# #
|
||||
# # # # # # # # # # # # # # # # # # # # #"
|
||||
echo
|
||||
echo "usage: youtube_converter <mp3/mpeg> <youtube-link> <destination path>"
|
||||
echo "hint: all options are optional"
|
||||
echo
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# checking dependencies (except browser, i use chromium here)
|
||||
if [[ $(aptitude search ffmpeg | grep multimedia | awk '{print $1}') = "i" && $(aptitude search lame | grep frontend | awk '{print $1}') = "i" && $(aptitude search curl | grep "Get a file" | awk '{print $1}') = "i" ]]; then
|
||||
#echo "info: all dependencies found"
|
||||
:
|
||||
else
|
||||
if [ $(whoami) = "root" ]; then
|
||||
echo "info: trying to insall missing dependencies"
|
||||
apt-get install -y ffmpeg curl lame
|
||||
echo "info: all dependencies installed. rerun script."
|
||||
exit 0
|
||||
else
|
||||
echo "error: permission denied"
|
||||
echo "info: install dependencies(ffmpeg, curl and lame) or run this scrip as superuser"
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
# check if entered link or given link option a youtube link
|
||||
while [[ ${link:0:31} != "http://www.youtube.com/watch?v=" && ${2:0:31} != "http://www.youtube.com/watch?v=" ]]; do
|
||||
echo "enter youtube link:"
|
||||
read link
|
||||
done
|
||||
if [ -z $link ]; then
|
||||
link=$2
|
||||
fi
|
||||
|
||||
# do you want a mp3 or a mpeg
|
||||
if [[ $1 = "mp3" || $1 = "mpeg" ]]; then
|
||||
mediatype=$1
|
||||
else
|
||||
while [[ $mediatype != "mp3" && $mediatype != "mpeg" ]]; do
|
||||
echo 'Do you want an audio or video file? mp3/mpeg[default is mp3].'
|
||||
read mediatype
|
||||
if [ -z $mediatype ]; then
|
||||
mediatype="mp3"
|
||||
fi
|
||||
done
|
||||
fi
|
||||
|
||||
# set output destination
|
||||
if [ -z $3 ];then
|
||||
destinationpath=$(pwd)
|
||||
else
|
||||
destinationpath=$3
|
||||
fi
|
||||
|
||||
# getting flash filename
|
||||
file=$(ls -l /tmp | grep Flash | awk '{print $8}')
|
||||
secondfile=$(echo $file | awk '{print $2}')
|
||||
|
||||
if [ -z "$file" ]; then
|
||||
echo "info: there is no open youtube window, trying to start browser"
|
||||
#chromium-browser $link
|
||||
firefox $link &
|
||||
sleep 6
|
||||
file=$(ls -l /tmp | grep Flash | awk '{print $8}')
|
||||
secondfile=$(echo $file | awk '{print $2}')
|
||||
fi
|
||||
|
||||
# checking if there is a second flash file in /tmp
|
||||
if [ -z $secondfile ]; then
|
||||
i="doitagain"
|
||||
oldsize=$(ls -l /tmp | grep $file | awk '{print $5}')
|
||||
sleep 5
|
||||
while [ $i = "doitagain" ]; do
|
||||
size=$(ls -l /tmp | grep $file | awk '{print $5}')
|
||||
if [ $size -gt $oldsize ];then
|
||||
echo "info: download not finished yet. waiting 5 seconds.."
|
||||
oldsize=$size
|
||||
sleep 5
|
||||
else
|
||||
echo "info: download finished."
|
||||
i="goforit"
|
||||
fi
|
||||
done
|
||||
else
|
||||
echo 'error: there should just be one open video window (if no multiple youtube videos open try "rm -rf /tmp/Flash*")'
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# parse link for title
|
||||
curl "$link" --output tmp.txt
|
||||
rawtitle=$(cat tmp.txt | w3m -dump -T text/html | sed -n '5p')
|
||||
title=$rawtitle
|
||||
#rawtitle=$(cat tmp.txt | grep 'meta name="title"')
|
||||
rm tmp.txt
|
||||
#count=${#rawtitle}
|
||||
#length=$(($count-36))
|
||||
#title=${rawtitle:34:$length}
|
||||
|
||||
# here starts the actual convertion
|
||||
echo "starting convertion of $title @ $link"
|
||||
|
||||
if [ $mediatype != "mpeg" ]; then
|
||||
ffmpeg -i /tmp/$file -vn temp.wav
|
||||
lame --preset 128 temp.wav "$destinationpath/$title.mp3"
|
||||
rm temp.wav
|
||||
title="$title.mp3"
|
||||
else
|
||||
ffmpeg -i /tmp/$file -sameq -ab 192k "$destinationpath/$title.mpeg"
|
||||
title="$title.mpeg"
|
||||
fi
|
||||
|
||||
echo
|
||||
echo "Output file $destinationpath/$title"
|
||||
echo
|
||||
|
||||
exit 0
|
||||
|
Reference in New Issue