¿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
#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
#!/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!