[PYTHON] Invitación a los usuarios para unirse a un pequeño proyecto

Iniciado por astinx, 7 Agosto 2012, 23:50 PM

0 Miembros y 1 Visitante están viendo este tema.

astinx

Hola, estoy realizando un pequeño proyecto por cuenta propia. El mismo consiste en lo siguiente:-"Desarrollar un script en python que lea de un JSON un archivo config, el cual contiene información de configuración, para configurar automaticamente una distro de debian"

¿Por qué?
Bueno, hasta hace poco era un fanatico de las distros y la eficiencia, ya hace 3 años que soy usuario de Linux (o GNU/Linux, sinceramente no le doy importancia a la diferencia, no se ofendan por favor). Comenze con Ubuntu, pero cuando me di cuenta de que con tantas actualizaciones terminaba bajando basura y que al fin y al cabo (creo yo) es una de las distros mas "borrachas" de Linux, termine migrando a algo mas generico y mas core, Debian. He provado casi todos los entornos de escritorio y tratar de sacarle al maximo la eficiencia a Debian, sin embargo, me ha pasado mas de una vez que he dicho:-"A la $%&! Instalare todo desde cero con solo lo basico y necesario!".

Sin embargo, una cosa que me molesta, es que uno tiene que configurar varias cosas por cuenta propia cuando instala por primera vez Debian (si es que se quiere tener un sistema ordenado), packages, bajar el sudo, la filestructure de uno, los repositorios, aplicaciones, etcétera.

Por eso me decidi a hacer un script que tomara toda mi info de "customizacion" y la ejecutara. Helo aqui un ejemplo de mi archivo config:

Código (javascript) [Seleccionar]

#Users name (the same of the /home/<user_name> folder this must exist!)
{"user_name" : "astinx",

#The file structure of your environment
"filestructure" :  "dev/tools/eclipse
dev/tools/smalltalk
dev/tools/ada
dev/tools/pl1
dev/tools/blender
dev/tools/php
dev/tools/python
dev/tools/c
dev/tools/ruby
dev/tools/actionscript
dev/tools/js

dev/frameworks/java/grails
dev/frameworks/java/play
dev/frameworks/java/spring
dev/frameworks/java/struct
dev/frameworks/java/gwt

dev/flash/flex

dev/frameworks/python/django

dev/frameworks/php/codeigniter
dev/frameworks/php/symphony

dev/frameworks/myframeworks

dev/references/hibernate
dev/references/spring
dev/references/blazeds

dev/workspaces/eclipseworksheet
dev/workspaces/phpworksheet

dev/servers

dev/scripts/python
dev/scripts/bash
dev/scripts/ruby

repos/git
repos/svn

books

college/mypapers

media/video
media/music
media/images

job",
#Repositories that you wanna make a checkout
"repositories_checkout" : "svn://...",
#Packages that you wanna install
"packages" : "geany
 virtualbox-ose
 pgadmin3",
#External devices like ntfs partitions that you wanna have every time mounted  
"external_devices" : "/dev/sda3 => externalntfs",
#.deb files that you wanna install (they must be at the same level of this file and init_script.py file)
"backup_debs" : "google-chrome.deb",
#.tar, .giz or .zip that you wanna extract in some of the filestructure folder.
#The sintax is <file_name> => <destination_folder> with <extension>
"backup_files" : "eclipse_environment.zip => /dev/tools/eclipse with .zip
 webdevelop.tar => /dev/tools/php with .tar",

#Anothers scripts that you wanna run when this script finishs
#The sintax is <script_name> with <bash|python|anything what make it run>
"anothers" : "java_install_script.sh with bash
 hi.py with python"}


PD: Perdonen mi "ingles" xD

Esos parametros que inclui en el JSON son algunos de los que pense que podrian resultar utiles, pense:-"¿Que se me hace molesto cuando recien acabo de formatear la maquina?". Hacer la filestructure, descargar los packages, modificar los init.d para que siempre me monten los dispositivos externos (tengo una particion con Windows CHAN!... para jugar videojuegos y tengo un NTFS que uso como boveda), descomprimir mis programas en los respectivos directorios, instalar los .deb, tirar algun que otro script de backup, etcétera.

Mi script de backup lo hice en Python (algunos pensaran:-"¿Por que no en Bash?", simple, ODIO Bash, programar en Bash, no es programar xD)

Helo aqui:
Código (python) [Seleccionar]

#!/usr/local/bin/python
# -*- coding: utf-8 -*-
#
#       init_script.py
#      
#       Copyright 2012 astinx <astinx@astinxmachina>
#      
#       This program is free software; you can redistribute it and/or modify
#       it under the terms of the GNU General Public License as published by
#       the Free Software Foundation; either version 2 of the License, or
#       (at your option) any later version.
#      
#       This program is distributed in the hope that it will be useful,
#       but WITHOUT ANY WARRANTY; without even the implied warranty of
#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#       GNU General Public License for more details.
#      
#       You should have received a copy of the GNU General Public License
#       along with this program; if not, write to the Free Software
#       Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
#       MA 02110-1301, USA.

import datetime
import sys
import os
import subprocess
import json
import re

# This is the only thing that you can touch of this script, the config file absolute path.
config_path = "/home/astinx/dev/scripting/bash/config"
comment_regex = "(\A#.*\n*)"
whiteline_regex = "(\A\s*\Z)"

# First, we clean the config file, this is, erase all the comments
config_file = file(config_path,"r")
# A temporary file to put the parsed config file, without comments
config_temp = file(config_path+"_temp","w")
for line in config_file:
if (not (re.match(comment_regex+"|"+whiteline_regex,line))):
config_temp.write(line)

config_file.close()
config_temp.close()

# Now we clean the \n like dev/asd\ndev/qwe", to  dec/asd,dev/qwe",
config_json = file(config_path+"_json","w")
config_temp = file(config_path+"_temp","r")
for line in config_temp:
# If is something like '"packages" : "geany'
if (re.match(".*\n\Z",line) and (not(re.match('.*\",\n\Z',line))) and (not(re.match("({)|(.*})",line)))):
line = line.replace("\n",", ")
line = line.replace("\t","")
config_json.write(line)
else:
line = line.replace("\t","")
config_json.write(line)
config_json.close()
config_temp.close()


# Well the config file is cleaned, now we can open it as a JSON object

config_path = "/home/astinx/dev/scripting/bash/config"
config_path = config_path + "_json"
jsonfile = file(config_path,"r")
json_string = jsonfile.read()
jsonfile.close()
json_obj = json.loads(json_string)
config_dictionary = dict(json_obj)

# Now we get the environment variables from the JSON
user_name = config_dictionary.get("user_name")
filestructure = config_dictionary.get("filestructure")
repositories_checkout = config_dictionary.get("repositories_checkout")
packages = config_dictionary.get("packages")
external_devices = config_dictionary.get("external_devices")
backup_debs = config_dictionary.get("backup_debs")
backup_files = config_dictionary.get("backup_files")
anothers = config_dictionary.get("anothers")

#We build the filestructure

for directory in filestructure.split(','):
print "Building "+directory+" ...\n"
try:
os.system("mkdir -p "+directory)
except OSError, e:
print "No se pudo crear el directorio ["+str(e)+"]"
except ValueError, e:
print "Uno de los directorios ingresados es ilegible ["+str(e)+"]"


Apenas lo único que llevo hecho es esta parte, que seria el "parser de la aplicación", es que al parecer la librería de JSON, se mama un poco si encuentra algo del estilo <clave>:<valor>, donde valor incluye saltos de linea. Por eso tuve que introducir un poco de código, para limpiar el JSON antes de traérmelo.

Me gustaría que me dieran sus opiniones acerca de que otro campo podría incluir en el JSON de config, de manera que este script de customizacion sea lo mejor posible, si quieren aportar con código también son bienvenidos,  acá les dejo el repo donde tengo colgado el código:
http://code.google.com/p/pcustom

Cualquier cosa si quieres ser miembros para comitear codigo me envian un mensaje privado.

Saludos y gracias por su tiempo, sus criticas seran bienvenidas!
La programación hoy en día es una carrera entre los ingenieros de software intentando construir mejores y más eficientes programas a prueba de idiotas y el Universo intentando producir mejores y más grandes idiotas. De momento, el Universo está ganando