\documentclass[a4paper]{article}
\usepackage{fullpage}
\usepackage[spanish]{babel}
\usepackage[utf8]{inputenc}
\usepackage{graphicx}
\usepackage{colortbl}
%\usepackage {html}
%\usepackage {hthtml}
\usepackage {hyperref}



\begin{document}
\begin{large}
\noindent
\title{ Scripts de sistemas en Python}  \\
Laboratorio de Administración y Gestión de Redes y Sistemas 2023-2024\\
Grado en Ingeniería Telemática  \\
\href
{http://www.urjc.es/eif}
{Escuela de Ingeniería de Fuenlabrada}\\
\href
{https://www.urjc.es}
{Universidad Rey Juan Carlos}
\hrule
\end{large}

\vspace{0.5cm}

\subsection*{Cambios en el documento}

\begin{itemize}
\item
13 de diciembre. Nueva redacción de la práctica 2.7.
\end{itemize}


\section*{Práctica 2.1. Uso de python}

Crea el directorio 
\verb|~/lagrs/practica02|

Escribe un script en Python 3 con el nombre
\verb|~/lagrs/practica02/ordena_lista.py|. Incluye un comentario en las primeras líneas tu nombre, apellidos
y login.


Este script tendrá una función que:
\begin{itemize}
\item
Recibirá una lista de elementos. Y comproborá que efectivamente su argumento
es una lista, mostrando un error en otro caso.
\item
Cada elemento de esta lista será una cadena. Mostrando un error si alguno
no lo fuera.
\item
Modificará de forma destructiva la lista, ordenada por longitud de la
cadenas. Esto es, primero la cadena más corta, última la cadena más larga.

\end{itemize}

%
\section*{Práctica 2.2. Acceso a un listado de procesos}

El objetivo de esta práctica es que te familiarices con la librería
\emph{subprocess} para acceder a la shell de Linux desde Python.



Escribe un script en Python 3 con el nombre
\verb|~/lagrs/practica02/mi_top.py|. Incluye un comentario en las primeras líneas tu nombre, apellidos
y login.

Debe mostrar un listado con el nombre de los procesos de sistema
que más CPU consuman en ese momento.
Aunque hay funciones específicas de Python
para obtener información sobre los procesos, 
usa \emph{subprocess}, invocando a \verb|top -n 1|. En otras palabras,
el programa debe tomar la salida de esta orden, procesarla en Python,
filtrarla y escribir lo filtrado en la salida estándar. En otras palabras: ofrecer
un subconjunto de la información ofrecida por \verb|top -n 1|.


\begin{itemize}
\item
El script mostrará
los procesos de sistema que ocupen un porcentaje de CPU mayor a 0.0.
\item
En este listado debe aparecer el nombre del proceso, su pid, el nombre
del usuario propietario, el uid del usuario, los nombres de todos los grupos
a los que pertenece el usuario y  el porcentaje de CPU consumido por el proceso.
Para obtener la información relativa al usuario, emplea la orden de shell
\verb|id|.

\item
La información debe aparecer en formato de columnas. Similar 
a lo que hace \verb|top|. Usa format.

\item
No uses regexp.

\item
No incluyas ninguna cabecera con los nombres de los campos.

%\item
%Añade una línea
%indicando 
%cuántos son los procesos que consumen más de un 0.0 \% de CPU, y la suma de CPU 
%consumida entre todos ellos. El mensaje será similar a, por ejemplo, este:
%\emph{Mostrando 5 procesos que consumen el 22.4\% de la CPU}. 

\item
Sobra decir que es necesario que organices tu programa
en funciones.
Esto es algo que debes hacer siempre, también
con programas cortos como este. 
\end{itemize}


\section*{Práctica 2.3. Enlaces simbólicos}
En este ejercicio usarás los enlaces simbólicos para tener diferentes
versiones del mismo programa, pero con el mismo nombre. Esto es, tendrás
un enlace simbólico que podrá apuntar a diferentes versiones del mismo programa.

\begin{enumerate}
\item
Por si te equivocas en este ejercicio, haz una copia de 
\verb|~/lagrs/practica02/mi_top.py|
en el directorio que prefieras. Por ejemplo en 
\verb|~/tmp| (seguramente tendrás que crearlo)
\item
Renombra la praćtica
\verb|~/lagrs/practica02/mi_top.py|
como
\verb|~/lagrs/practica02/mi_top01.py|
\item
Mediante la shell, crea un enlace simbólico llamado

\verb|~/lagrs/practica02/mi_top.py|

que apunte a 

\verb|~/lagrs/practica02/mi_top01.py|. 
\end{enumerate}

%\section*{Práctica 2.3. Regexp}
%
%Haz una copia de 
%\verb|~/lagrs/practica02/mi_top01.py|
%llamada
%\verb|~/lagrs/practica02/mi_top02.py|
%y modifícala para usar expresiones regulares, con comentarios dentro de cada regexp.
%
%Haz que 
%\verb|~/lagrs/practica02/mi_top.py|
%ahora apunte a esta versión.



\section*{Práctica 2.4. Opciones}
Haz una copia de 
\verb|~/lagrs/practica02/mi_top01.py|
llamada
\verb|~/lagrs/practica02/mi_top02.py|.
Usando la librería \emph{optparse}, añade al menos 2 opciones al 
script \verb|mi_top02.py|. (Sin contar la \emph{h} de
\emph{help}, con esta serían al menos 3). 
Elige las opciones que desees, todas deben extraer y/o agregar
diversa información de \verb|top|. 
%Usa regexp, con comentarios, en alguna o en todas estas opciones.
El comportamiento
que tenía el script en la fase anterior puede ser una de esas
opciones. 
Antes de implementar las opciones que hayas elegido, consúltalas 
con el profesor.

Cuando acabes el script, enlaza \verb|mi_top.py|
a
\verb|mi_top02.py|.


\section*{Práctica 2.5. Módulos}
Prepara ahora una versión de tu práctica anterior con el nombre
\verb|~/lagrs/practica02/mi_top03.py|, de forma que 
la práctica totalidad de las funciones estén en uno o varios módulo.
    \begin{enumerate}
    \item
Los módulos deberán llamarse \emph{TULOGIN\_xxxxx.py}, esto es, 
empezarán por tu nombre de usuario en el laboratorio (en minúscula)
y a continuación, lo que te parezca más adecuado. 
P..e \emph{jperez\_shell.py}, \emph{mgarcia\_opciones.py}, etc.

    \item
Los módulos estarán en el directorio \verb|~/lagrs/lib|. Por tanto, 
tendrás que incluir este directorio en la variable de entorno \emph{PYTHONPATH}.
Hazlo en el fichero \emph{.bashrc}.
% y asegúrate de que tu práctica 3.1.3 funciona correctamente.

\item
Enlaza (desde la shell) \verb|mi_top.py| a
\verb|mi_top03.py|.
\item
Antes de hacer nada, el programa comprobará que 


\begin{itemize}
\item
Realmente \emph{PYTHONPATH}
existe y incluye 
 \verb|~/lagrs/lib|. No importa si contiene otros directorios. 


Naturalmente, esto tiene que funcionar para cualquier usuario, esto es, el programa
buscará el directorio \verb|~/lagrs/lib| del usuario que ejecuta este programa
(por ejemplo el profesor), no de tu usuario en particular.

\item
Tus módulos 
realmente están en su sitio. Usa para ello la librería
\verb|os.path|. 
Observa que aquí sí es necesario que el nombre del módulo comience
por tu login, no por el del usuario que ejecuta este programa (por
ejemplo el profesor).
\end{itemize}

Si alguna de estas comprobaciones falla, el programa
lanzará una excepción personalizada.
\end{enumerate}


\section*{Práctica 2.6. Creación de un bot de telegram}

    \begin{enumerate}
    \item
Si no tienes Telegram, instálalo en 
tu móvil, en tu tablet o en tu portátil.
    \item
Crea un bot de telegram, con el nombre que quieras.
    \item
Ponle una foto al perfil del bot.
    \item
Escribe un programa con el nombre
\verb|~/lagrs/practica02/hola_telegram.py| que envíe un mensaje de tipo
\emph{hola mundo} a tu cliente Telegram y luego entre en un bucle infinito
atendiendo a los mensajes que reciba (de cualquier usuario). Por cada mensaje recibido, envía una respuesta cualquiera
al cliente y muestra todo en la pantalla del servidor, de forma legible (no el volcado en bruto del diccionario).

\item
Observa que la fecha y hora del mensaje está en hora Unix, tendrás que pasarlo a otro
formato. El que quieras, pero que sea legible por una persona.

\item
Usa \emph{format} para componer la respuesta. No uses la concatenación de cadenas
con el operador \verb|+|

\item
El token no estará en el fuente. El programa leerá el token desde el fichero
\verb|token.txt|, que estará en el directorio actual.
(En este caso, el directorio
\verb|~/lagrs/practica02/|, pero no escribas este trayecto, que el script
lea el fichero desde el directorio actual)

\item
Si el fichero con el token no existe o no se puede leer, el programa mostrará
un mensaje de error por \emph{stderr} y morirá. O si lo prefieres, levantará una excepción
que describa el problema. 

    \end{enumerate}


\section*{Práctica 2.7. Creación de un bot de telegram (II)}
Escribe un pograma llamado
\verb|~/lagrs/practica02/top_telegram.py| que implemente un bot de telegram 
que sea un \emph{frontend} de tu práctica 
\verb|mi_top03.py|. 

Esto es, si el usuario escribe \verb|mi_top| (o si el usuario escribe \verb|top|, como prefieras),
el bot devolverá la misma salida que tu \verb|mi_top03.py|. Si el usuario añade alguna
de las opciones que has previsto, el bot devolverá el resultado de ejecutar
tu comando con esa opción.

Si el bot recibe un mensaje que no se corresponde con nada de lo aquí
descrito, haz que
responda de la forma que creas adecuada.

\begin{itemize}
\item
 No copies código desde \verb|mi_top03.py|,
importa código desde el módulo(s) que preparaste en la práctica 2.5.
\item
Ten en cuenta que los  mensajes de telegram tienen un tamaño máximo de 4096 caracteres, trata
esto como consideres conveniente.
\end{itemize}




\end{document}
