Posts Tagged ‘Linux’

Configurar apps2sd desde Linux

Sábado, febrero 5th, 2011

Esta entrada no es sino un resumen de esta entrada de htcmania.com, ésta de 4ndroid.com y ésta de androidwik. Leedlos porque no voy a entrar en demasiados detalles aquí, toda la info está sacada de esos tres sitios.

El objetivo de este asunto es configurar la característica de Apps2sd incluida en la versión 2.2 (Froyo) de android para que por defecto se instalen todas las aplicaciones, excepto unas pocas en las que esto no es posible, en la tarjeta de memoria SD, para liberar la escasa memoria interna de la que disponen algunos terminales con android (como la HTC Desire que nos sirve de ejemplo hoy). Y hacerlo desde Linux, claro ;-)

El primer paso es instalar el SDK de android y la herramienta ADB para acceder al terminal. Tras instalar el SDK y descomprimir adb en la carpeta tools y darle permisos de ejecución… Seguimos,

El siguiente paso es configurar Linux para que reconozca nuestro terminal: En 4ndroid lo explican fácil, sólo tenemos que añadir una regla más al sistema udev para que reconozca nuestra Desire, en mi caso ha sido:

SUBSYSTEM==”usb_device”, SYSFS{idVendor}==”0bb4″, MODE=”0666

en /etc/udev/rules.d/51-android.rules. Leed el artículo original de 4ndroid para otras marcas de terminales.

Reiniciamos y ya deberíamos poder identificar el terminal conectado (habiendo activado el modo depuración y en modo “sólo carga”) con:

adb devices

A partir de ahí, y según lo explican en htcmania, el truco consiste en lanzar el comando

adb shell pm setInstallLocation 2

Para configurar el apps2sd de Foyo para que instale las aplicaciones (las que se pueda) directamente en la tarjeta de memoria en vez de en la memoria interna, independientemente de la opción que escogió el desarrollador al compilar la aplicación.

Si queremos volver al estado por defecto (en el que las aplicaciones se instalan donde seleccionó el desarrollador) pondríamos adb shell pm setInstallLocation 0 y si por algún extraño motivo quisiéramos forzar a que todas las aplicaciones se instalen en la memoria del teléfono adb shell pm setInstallLocation 1.

Conviene no olvidar que los Widgets no funcionan (o al menos no lo hacen bien) desde la tarjeta de memoria externa, así que podéis pasarlos de nuevo a la memoria interna con el propio apps2sd o con app2sd.

Enviando correo con PHP y SMTP

Viernes, marzo 26th, 2010

El otro día nos surgió la necesidad de mandar correos electrónicos desde el planificador cron a través de un servidor SMTP externo, así que aprovechando que no había hecho esto nunca, y tras un par de búsquedas y de leer un par de artículos (este y este), modifiqué un pequeño script en PHP para hacer justo lo que necesitábamos.

Al script se le pasan como parámetros la dirección de correo electrónico del destinatario, el asunto del mensaje y el contenido del mismo. Y hay que configurar el servidor SMTP, el usuario y la contraseña, para poder enviar correos, así como tener instalada el paquete Mail de la librería Pear.

pearmail.php “destinatario@destino.com” “Prueba de mail con php” “Hola caracola”

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#!/usr/bin/php

require_once "Mail.php";

// =========== Configure these ========
$from = "Foo <foo@bar.com>";
$host = "smtp.foo.com";
$username = "foo";
$password = "bar";
// ======================

$to = $_SERVER["argv"][1];
$subject = $_SERVER["argv"][2];
$body = $_SERVER["argv"][3];

$headers = array ('From' => $from,
'To' => $to,
'Subject' => $subject);

$smtp = Mail::factory('smtp',
array ('host' => $host,
'auth' => true,
'username' => $username,
'password' => $password));

$mail = $smtp->send($to, $headers, $body);

echo "Sending mail to ".$to . "\n" . $body."\n\n";

if (PEAR::isError($mail)) {
echo("Error sending message: " . $mail->getMessage() ."\n" );
} else {
echo("Message successfully sent!\n");
}

?>

Bloqueando el acceso a la red a programas

Viernes, marzo 5th, 2010

En ocasiones podemos querer que algún programa no tenga acceso a la red por motivos de seguridad o simplemente de privacidad, ya que algunos “llaman a casa” para informar de lo que hacemos o dejamos de hacer con ellos.

En Linux, podemos bloquear las conexiones de un programa con unos pequeños ajustes a nuestro cortafuegos iptables, y con un pequeño programa auxiliar que encontré en la lista de correo wine-users. Todo esto inspirado por esta entrada en un linuxforums

Lo primero es crear el grupo que no tendrá acceso a la red, nonet en este ejemplo:

1
# addgroup --gid 1010 nonet

Después configuramos el cortafuegos para que descarte los paquetes procedentes de programas que pertenezcan al grupo nonet, y ya de paso enviamos mensajes a un log, para saber que un programa no autorizado está intentando acceder a la red.

  • Creamos la tabla LOGREJECT
1
# iptables -N LOGREJECT
  • Hacemos que los paquetes que llegan a esta tabla pasen por la tabla LOG
1
#iptables -A LOGREJECT -j LOG --log-prefix 'NONET'
  • Y rechazamos los paquetes, diciendo al programa que no pudieron alcanzar la red… Muahahahahaaaa…
1
#iptables -A LOGREJECT -j REJECT --reject-with icmp-net-unreachable
  • Finalmente hacemos que los paquetes que procedan de nonet salten a la tabla que acabamos de crear:
1
#iptables -I OUTPUT -m owner --gid-owner nonet ! -d 127.0.0.1 -j LOGREJECT

Llegados a este punto ya tenemos el entorno listo para bloquear las conexiones salientes no autorizadas, ahora tenemos que lograr que los programas no autorizados pertenezcan al grupo nonet. Hay varias maneras de hacer esto, una de ellas es copiar hacer un programa que cambia el grupo “al vuelo”. Por ejemplo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <grp.h>
#include <unistd.h>

#ifndef _NONET_GROUP
#define _NONET_GROUP "nonet"
#endif

int main(int argc, char *argv[])
{
struct group *gr;

if (argc <= 1) {
fprintf(stderr, "Usage: %s command [ arg ... ]\n", argv[0]);
exit(1);
}

if (!(gr = getgrnam(_NONET_GROUP))) {
perror("getgrnam");
exit(1);
}

if (setgid(gr->gr_gid) == -1) {
perror("setgid");
exit(1);
}

if (setuid(getuid()) == -1) {
perror("setuid");
exit(1);
}

argv++;
argc--;

if (execvp(*argv, argv) == -1) {
perror("execvp");
exit(1);
}

exit(0); /* not reached */
}

Lo compilamos y damos permisos de ejecución con privilegios para poder cambiar el grupo:

1
# gcc -o nonet nonet.c ; chown root:staff nonet ; chmod 4750 nonet

Y, a partir de ahora, en vez de lanzar un programa sospechoso directamente, lo haremos a través del recien creado nonet, de este modo el programa no podrá establecer conexiones hacia el exterior de nuestra máquina.

1
nonet programa_sospechoso

Podemos comprobar si el programa ha intentado conectarse con el exterior, echando un vistazo a /var/log/messages, si vemos algo como esto, con la clave NONET, significará que el programa ha intentado conectarse con alguien…

1
Mar  5 19:46:50 xxxxxx kernel: [18096.417586] NONET IN= OUT=eth0 SRC=192.168.1.2 DST=192.168.1.1 LEN=61 TOS=0x00 PREC=0x00 TTL=64 ID=58192 DF PROTO=UDP SPT=40486 DPT=53 LEN=41

En muchos casos serán cosas inofensivas, como llamadas a DNS o cosas así… Pero si estamos en un entorno “especial” mejor controlar todo lo que pasa en nuestra red.

Mola, ¿no? :D

Botones en GTK “rotos”

Jueves, octubre 15th, 2009

El otro día me di cuenta de que algunos botones de mi eclipse habían dejado de funcionar. Concretamente el de “Siguiente” del asistente para crear un nuevo proyecto… Después de mucho googlear, de instalar las últimas versiones de eclipse y de java y de no conseguir nada, he cambiado un poco los términos de búsqueda y… voilá!

Buscando por algo tan sencillo como eclipse next button broken he llegado a la solución.

El problema está en la últimas versiones de libgtk2.0-0. Yo tenía:

1
2
3
4
5
6
7
apt-show-versions -a -p libgtk2.0-0

libgtk2.0-0 2.18.1-1 install ok installed
libgtk2.0-0 2.12.12-1~lenny1 lenny   ftp.at.debian.org
libgtk2.0-0 2.16.6-1         squeeze ftp.at.debian.org
libgtk2.0-0 2.18.2-1         sid     ftp.at.debian.org
libgtk2.0-0/sid upgradeable from 2.18.1-1 to 2.18.2-1

Así que el problema se ha solucionando volviendo a la versión de squeeze de libgtk2.0-0 (y por consiguiente de evolution, que depende de éste)

En fin, es el precio de tener mezclados paquetes de las versiones stable, testing y unstable… Pero bueno, qué sería de nosotros sin estos pequeños retos :-)

Alternativa: Poner a true la variable de entorno GDK_NATIVE_WINDOWS antes de lanzar eclipse, o para hacerlo más fácil, crear el siguiente script para lanzar eclipse con la variable ya puesta correctamente. Visto aquí.

1
2
3
#!/bin/sh
export GDK_NATIVE_WINDOWS=true
/opt/eclipse/eclipse

De todos modos, esto me ha servido para probar un más que interesante editor: Geany, que me descubrió Manu, de 2geek2curious.