espacios en el for de bash

Esto es algo que me pasó millones de veces y al fin le encontré la solución definitiva.

 

SAVEIFS=$IFS
IFS=$(echo -en "\n\b")
for f in *
do
  echo "$f"
done
IFS=$SAVEIFS

Espero les sirva, ojo que se viene un súper post de recuperación de datos en postgres. Un locura.

Redireccionar puertos

Buenas gente, acá les dejo un mini script para redireccionar puertos a otra ip. Para que funcione primero tiene que hacer:
sysctl net.ipv4.ip_forward=1
Acá va el script:

#!/bin/bash
[ $# -eq 0 ] && { echo "Usage: $0 puertoPrincipal puertoSecundario IP"; exit 1; }
iptables -t nat -A PREROUTING -p tcp --dport $1 -j DNAT --to-destination $3:$1
iptables -A FORWARD -p tcp -d $3 --dport $1 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -t nat -A PREROUTING -p udp --dport $1 -j DNAT --to-destination $3:$1
iptables -A FORWARD -p udp -d $3 --dport $1 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -t nat -A PREROUTING -p udp --dport $2 -j DNAT --to-destination $3:$2
iptables -A FORWARD -p udp -d $3 --dport $2 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
exit 0

Mail alerts con pushOver

Bueno una empresa me pidió que le haga un sistema para recibir notificaciones si el servidor de correo cae. Lo que se le puede ocurrir a todo el mundo es usar un telnet y monitorear el servicio, pero cosa de descartar problema de DNS, espacio en disco y demás cosas hice un daemon un poco más complejo.
La idea es:
+ Enviar un correo y revisar si lo recibimos desde otro servidor al nuestro.
+ Luego al revés, o sea, enviar un correo desde nuestro servidor al servidor de control a ver si llega.
Si en ambos casos llegar, todo perfecto, si no envía notificaciones push a una lista de iphones. Más sencillo imposible, y más útil tampoco :P.

Continue reading

Correr automáticamente geoserver (at boot time)

Holass samigos, acá les dejo el script que uso para iniciar geoserver, lo ponen el /etc/init.d y luego corren el comando:

update-rc.d geoserver defaults

Espero les sirva.

#! /bin/sh
### BEGIN INIT INFO
# Provides:          geoserver
# Required-Start:    $local_fs $remote_fs
# Required-Stop:     $local_fs $remote_fs
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: GeoServer OGC server
### END INIT INFO

# Author: Lennart Juette

# Geoserver configuration - use /etc/default/geoserver to override these vars
# user that shall run GeoServer
USER=root
GEOSERVER_HOME=/opt/geoserver-2.0.3
GEOSERVER_DATA_DIR=$GEOSERVER_HOME/data_dir

PATH=/usr/sbin:/usr/bin:/sbin:/bin
DESC="GeoServer daemon"
NAME=geoserver
JAVA_HOME=/usr/lib/jvm/java-6-openjdk/jre
JAVA_OPTS="-Xms128m -Xmx512m"
DAEMON="$JAVA_HOME/bin/java"
PIDFILE=/var/run/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME

# Read configuration variable file if it is present
[ -r /etc/default/$NAME ] && . /etc/default/$NAME

DAEMON_ARGS="$JAVA_OPTS $DEBUG_OPTS -DGEOSERVER_DATA_DIR=$GEOSERVER_DATA_DIR -Djava.awt.headless=true -jar start.jar"

# Load the VERBOSE setting and other rcS variables
[ -f /etc/default/rcS ] && . /etc/default/rcS

# Define LSB log_* functions.
# Depend on lsb-base (>= 3.0-6) to ensure that this file is present.
. /lib/lsb/init-functions

do_start(){
	
	# Return
	#   0 if daemon has been started
	#   1 if daemon was already running
	#   2 if daemon could not be started
	
	start-stop-daemon --start --pidfile $PIDFILE --make-pidfile \
		--chuid $USER --chdir $GEOSERVER_HOME \
		-b --test --exec $DAEMON -- $DAEMON_ARGS > /dev/null \
		|| return 1
		
	start-stop-daemon --start --pidfile $PIDFILE --make-pidfile \
		--chuid $USER --chdir $GEOSERVER_HOME \
		-b --exec $DAEMON -- $DAEMON_ARGS \
		|| return 2
}

do_stop(){
	
	# Return
	#   0 if daemon has been stopped
	#   1 if daemon was already stopped
	#   2 if daemon could not be stopped
	#   other if a failure occurred

	start-stop-daemon --stop --pidfile  $PIDFILE \
		--user $USER \
		--retry=TERM/30/KILL/5

	RETVAL="$?"
	[ "$RETVAL" = 2 ] && return 2
	
	# Many daemons don't delete their pidfiles when they exit.
	rm -f $PIDFILE
	return "$RETVAL"

}

case "$1" in
  start)
	[ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME"
	do_start
	case "$?" in
		0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
		2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
	esac
	;;
  stop)
	[ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
	do_stop
	case "$?" in
		0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
		2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
	esac
	;;
  restart|force-reload)
	log_daemon_msg "Restarting $DESC" "$NAME"
	do_stop
	case "$?" in
	  0|1)
		do_start
		case "$?" in
			0) log_end_msg 0 ;;
			1) log_end_msg 1 ;; # Old process is still running
			*) log_end_msg 1 ;; # Failed to start
		esac
		;;
	  *)
	  	# Failed to stop
		log_end_msg 1
		;;
	esac
	;;
  *)
	#echo "Usage: $SCRIPTNAME {start|stop|restart|reload|force-reload}" >&2
	echo "Usage: $SCRIPTNAME {start|stop|restart|force-reload}" >&2
	exit 3
	;;
esac

:

Script para importar varios shapes a postgis

Hola gente, para todos aquellos que hayan leído este post, este no les agregará mucho. Solo quiero dejarlo acá por si algún día lo tengo que usar de nuevo. Este escripcito nos pasa a postgis todos los archivos de un directorio, no es guau pero nos ahorra una o dos horas de trabajo.

PGPASSWORD=clavedepostgres
export PGPASSWORD
PGUSER=postgres
export PGUSER

for i in $(ls *.shp); do
nombre=$(echo $i | cut -d "." -f 1);
shp2pgsql -I -s 4326 -W latin1 $i $nombre | psql -d hidricos
done;
Un abrazo a mi amigo Luís Acosta, que me ayudó con todo esto.
Saludos a todos.