#    This file is part of Rmldonkey.
#    Rmldonkey 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 3 of the License, or
#    (at your option) any later version.
#    Rmldonkey 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 Rmldonkey.  If not, see <http://www.gnu.org/licenses/>.
#    Copyright 2009, Manuel Ramos Caro manuelramoscaro@yahoo.es
require 'net/telnet'
class ConectaTelnet 
 #metodos_initilize y estados
   def initialize(ip,port,usuario,contrasena)
    begin
       @conexion = Net::Telnet.new('Host'  => ip,'Port'  => port)

       retorno = @conexion.cmd(" ")
       retorno = @conexion.cmd(" ")
       retorno = @conexion.cmd("auth " + usuario + " " + contrasena)   

        retorno.each do |valor_retorno|

        valor_retorno.each do |buffer_retorno|

          if buffer_retorno =~ /Bad login/ || buffer_retorno =~ /Failure/
             raise 'Invalid user or password...'
          else
             @estado_conectatelnet = true
           end
        end   
       end
   rescue 
      @estado_conectatelnet = false
      @conectatelnet_error_msg = $!
    end
   puts @estado_conectatelnet
   end 

   def conectatelnet_error_msg
       return @conectatelnet_error_msg
   end
   
   def estado_conectatelnet
       return @estado_conectatelnet
   end


#metodos_version
   def ctversion 
       i=0
       @ctversion_retorno_msg = Array.new
       retorno = @conexion.cmd(" ")
       retorno = @conexion.cmd("version")
       retorno.each do |buffer_retorno|
             buffer_retorno.each do |linea_retorno|
                if i == 1
                   @ctversion_retorno_msg[0] = linea_retorno[0..(linea_retorno =~ /:/) - 1]
                end
                i += 1
             end  
       end
       return true
   rescue TimeoutError, SocketError, StandardError
      return false
   end

   def ctversion_retorno_msg
       return @ctversion_retorno_msg
   end

#metodos_estado
   def ctestado
       i=0
       @ctestado_retorno_msg = Array.new
       @ctestado_down_msg = String.new
       @ctestado_up_msg = String.new
       @ctestado_campos_descarga_msg = Array.new
       retorno = @conexion.cmd(" ")
       retorno = @conexion.cmd("vd")
       retorno.each do |buffer_retorno|
             buffer_retorno.each do |linea_retorno|
                if retorno =~ /not authorized/
                   raise 'Invalid user or password...'
                end  
                if i == 1
                   y = 0
                   linea_retorno.split('|').each do |trozo|
                       @ctestado_retorno_msg[y] = trozo
                       y += 1 
#separamos valores para la grafica de estadisticas
                       y2 = 0
                       trozo.split(' ').each do |valor|
                          if y2 == 1
                             if y == 1
                                @ctestado_down_msg = valor
                             end
                          end
                          if y2 == 1 
                             if y == 2
                                @ctestado_up_msg = valor
                             end
                          end
                          y2 += 1
                       end

#separamos valores para la grafica de estadisticas 
                   end
                end
#añadimos identificacion de los campos de la descarga
                if i == 2
                   y = 0
                   pos = 0
                   posfile_int = 0
                   linea_retorno = limpiar_linea(linea_retorno)
                   while linea_retorno[pos..pos] != nil
                      posfile_int += 1
                      if linea_retorno[pos..pos] == 'e'
                          posfile_int = 0
                      end
                      if linea_retorno[pos..pos] == '%'
                         @posfile = (posfile_int -4) * 2
                      end
                      pos += 1
                   end
                   linea_retorno.split(' ').each do |trozo|
                      if trozo != ' '
                         @ctestado_campos_descarga_msg[y] = trozo
                         y +=1
                      end
                   end
                end
#añadimos identificacion de los campos de la descarga
                i += 1
             end  
       end
#enviamos una marca de tiempo anomesdiahoraminutossegundos con objeto estadistico
       tiempo = Time.now
       @ctestado_time_msg = tiempo.strftime("%Y%m%d%H%M%S")
#enviamos una marca de tiempo anomesdiahoraminutossegundos con objeto estadistico
       
       return true
       
   rescue 
      @conectatelnet_error_msg = $!
      return false
   end
#añadimos identificacion de los campos de la descarga
   def ctestado_campos_descarga_msg
	       return @ctestado_campos_descarga_msg
   end
   
   def posfile_msg
               return @posfile
   end


#añadimos identificacion de los campos de la descarga

   def ctestado_retorno_msg
	       return @ctestado_retorno_msg
   end
#añadimos los metodos para retornar los valores a utilizar por estadisticas

   def ctestado_down_msg
               return @ctestado_down_msg
   end
   def ctestado_up_msg
               return @ctestado_up_msg
   end
   def ctestado_time_msg
               return @ctestado_time_msg
   end
   

#metodos_descarga

    def limpiar_linea(linea)
        linea = linea.to_s.chomp
        linea = linea.gsub("[2;37;0m","")
        linea = linea.gsub("[0m","")
        linea = linea.gsub("[1m","")
        linea = linea.gsub("[4m","")
	      linea = linea.gsub("[5m","")
        linea = linea.gsub("[6m","")
        linea = linea.gsub("[7m","")
        linea = linea.gsub("[8m","")
        linea = linea.gsub("[30m","")
        linea = linea.gsub("[31m","")
        linea = linea.gsub("[32m","")
        linea = linea.gsub("[33m","")
        linea = linea.gsub("[34m","")
        linea = linea.gsub("[35m","")
	      linea = linea.gsub("[36m","")
        linea = linea.gsub("[37m","")
        linea = linea.gsub("[40m","")
        linea = linea.gsub("[41m","")
        linea = linea.gsub("[42m","")
        linea = linea.gsub("[43m","")
        linea = linea.gsub("[44m","")
        linea = linea.gsub("[45m","")
        linea = linea.gsub("[46m","")
        linea = linea.gsub("[47m","")
        linea = linea.sub!(/^[[:cntrl:]\x20]*/, '')

        return linea
    end
#quitamos los caracteres que deforman las pantallas con curses.
   def quitar_acentos(cadena)
         cadena = cadena.gsub("á","a")
         cadena = cadena.gsub("é","e")
         cadena = cadena.gsub("í","i")
         cadena = cadena.gsub("ó","o")
         cadena = cadena.gsub("ú","u")
         cadena = cadena.gsub("Á","A") 
         cadena = cadena.gsub("É","E")
         cadena = cadena.gsub("Í","I")
         cadena = cadena.gsub("Ó","O")
         cadena = cadena.gsub("Ú","U")
         cadena = cadena.gsub("ä","a")
         cadena = cadena.gsub("ë","e")
         cadena = cadena.gsub("ï","i")
         cadena = cadena.gsub("ö","o")
         cadena = cadena.gsub("ü","u")
         cadena = cadena.gsub("Ä","A") 
         cadena = cadena.gsub("Ë","E")
         cadena = cadena.gsub("Ï","I")
         cadena = cadena.gsub("Ö","O")
         cadena = cadena.gsub("Ü","U")
         cadena = cadena.gsub("à","a")
         cadena = cadena.gsub("è","e")
         cadena = cadena.gsub("ì","i")
         cadena = cadena.gsub("ò","o")
         cadena = cadena.gsub("ù","u")
         cadena = cadena.gsub("À","A") 
         cadena = cadena.gsub("È","E")
         cadena = cadena.gsub("Ì","I")
         cadena = cadena.gsub("Ò","O")
         cadena = cadena.gsub("Ù","U")
         cadena = cadena.gsub("ç","c")
         cadena = cadena.gsub("Ç","C")
         cadena = cadena.gsub("ñ","n")
         cadena = cadena.gsub("Ñ","N")
         cadena = cadena.gsub("¡","!")
         cadena = cadena.gsub("¿","?")
   end

   def ctdescargas(id) 
       i=0 
       @cdescargas_retorno_msg = Array.new
       retorno = @conexion.cmd(" ")
       retorno = @conexion.cmd("vd " + id)
       retorno.each do |buffer_retorno|
             buffer_retorno.each do |linea_retorno|
               if id==""
                     valor = quitar_acentos(limpiar_linea(linea_retorno.to_s.chomp)) 
                     if valor[0..0] == "\["
                         @cdescargas_retorno_msg[i] = valor
                         i += 1
                     end
               else
                  @cdescargas_retorno_msg[i] = quitar_acentos(linea_retorno.to_s.chomp)
                  i += 1
               end
             end  
       end
       
       return true
       
   rescue TimeoutError, SocketError, StandardError 
      @conectatelnet_error_msg = $!
      return false
   end


   def ctdescargas_retorno_msg
       return @cdescargas_retorno_msg
   end
   
   def ctdescarga_cancel(descarga)
       retorno = @conexion.cmd(" ")
#recibe como parametro de entrada la cadena correspondiente con
#la que se pretende cancelar.
       retorno = @conexion.cmd("cancel " + descarga)
       return true
   rescue TimeoutError, SocketError, StandardError
      @conectatelnet_error_msg = $!
       return false   
   end
 
   def ctdescarga_cancel_confirm(valor)
       retorno = @conexion.cmd(" ")
       if valor == 's' 
          retorno = @conexion.cmd("confirm yes") 
          return true
       end
       if valor == 'n' 
          retorno = @conexion.cmd("confirm no")
          return true
       end
   rescue TimeoutError, SocketError, StandardError 
       @conectatelnet_error_msg = $!
       return false
   end
   
   def ctdescarga_pause(descarga)
#recibe como parametro de entrada la cadena correspondiente con
#la que se pretende pausar.
       retorno = @conexion.cmd(" ")
       retorno = @conexion.cmd("pause " + descarga) 
       return true
   rescue TimeoutError, SocketError, StandardError 
       @conectatelnet_error_msg = $!
       return false
   end

   def ctdescarga_resume(descarga)
#recibe como parametro de entrada la cadena correspondiente con
#la que se pretende reanudar.
       retorno = @conexion.cmd(" ")
       retorno = @conexion.cmd("resume " + descarga)
       return true 
   rescue TimeoutError, SocketError, StandardError
       @conectatelnet_error_msg = $!
       return false
   end

   def ctdescarga_prioridad(valor,descarga)
       retorno = @conexion.cmd(" ")
       retorno = @conexion.cmd("priority "+ valor + " " + descarga.to_s)
       return true 
   rescue TimeoutError, SocketError, StandardError
       @conectatelnet_error_msg = $!
       return false    
   end

#metodos_busqueda(problematico si no tiene delay la busqueda no es efectiva)
   def ctlista_busqueda()
      @clista_busqueda_retorno_msg = Array.new
      retorno = @conexion.cmd(" ")
      retorno = @conexion.cmd("vs")
      i=0
      retorno.each do |buffer_retorno|
          buffer_retorno.each do |linea_retorno|
             if linea_retorno =~ /CONTAINS/
                @clista_busqueda_retorno_msg[i] = linea_retorno
                i+=1
             end
          end
      end

      return true

   rescue TimeoutError, SocketError, StandardError
      @conectatelnet_error_msg = $!
      return false
   end

   def ctlista_busqueda_retorno_msg
       return @clista_busqueda_retorno_msg
   end


   def ctbusqueda(buscado,minsize,maxsize)
       cadena_busqueda = "s" 
       if minsize != 0
          cadena_busqueda += " -minsize " + minsize.to_s 
       end
       if maxsize != 0
          cadena_busqueda += " -maxsize " + maxsize.to_s
       end
       cadena_busqueda += " "
       cadena_busqueda += buscado
       retorno = @conexion.cmd(" ")
       retorno = @conexion.cmd(cadena_busqueda)
       return true
   rescue TimeoutError, SocketError, StandardError 
      @conectatelnet_error_msg = $!
      return false
   end

   def limpia_resultado_busqueda(linea)
      linea= String.new
      y=0
      while linea[y..(y + 1)] != "  "
        y+=1
      end 
      linea=linea[(y + 1)..linea.length]
      return linea
   end

  def encontrar_tamano_total(cadena)
      i=0
      romper = true
      while romper && cadena[i].chr != " "
           i+=1
           if cadena[i] == nil
              romper = false
           end
      end
      valor = cadena.to_i
      y = 0
      while valor > 1
         valor_ant = valor
         valor = (valor / 1024).to_f 
         y+=1
      end
      case (y - 1)
        when 1
          retorno = valor_ant.to_s[0..6] + " Kb"
        when 2
          retorno = valor_ant.to_s[0..6] + " Mb"
        when 3
          retorno = valor_ant.to_s[0..6] + " Gb"
        when 4
          retorno = valor_ant.to_s[0..6] + " Tb"
        when 0 
          retorno = valor_ant.to_s[0..6] + " Bytes"
        else 
          retorno = "Size error "
      end
      while retorno.length < 10
          retorno = " " + retorno
      end
      return retorno
  end


   def ctver_resultado_busqueda(busqueda)
       @cver_resultado_busqueda_msg = Array.new
       retorno = @conexion.cmd(" ")
       retorno = @conexion.cmd("vr " + busqueda)
       i=0
       y=0
       retorno.each do |buffer_retorno|
           buffer_retorno.each do |linea_retorno|
               if y >= 4 && linea_retorno [10..10] == " " 
                     @cver_resultado_busqueda_msg[i] = linea_retorno[10..15]
                     i += 1
                     @cver_resultado_busqueda_msg[i] = encontrar_tamano_total(linea_retorno[18..28])
                     i += 1
                     @cver_resultado_busqueda_msg[i] = linea_retorno[30..33] 
                     i += 1
                     @cver_resultado_busqueda_msg[i] = linea_retorno[40..91]
                     i += 1
               end
               y += 1
           end
       end  
       return true
   rescue TimeoutError,SocketError, StandardError
       @conectatelnet_error_msg = $!
       return false
   end

   def cver_resultado_busqueda_msg(ini,fin)
       i=ini * 4
       y=0
       retorno = Array.new
       while i < (fin * 4) && i < @cver_resultado_busqueda_msg.length
           retorno[y] = @cver_resultado_busqueda_msg[i]
           i += 1
           y += 1
       end       
       return retorno
   end

   def ctver_descarga(id)
       retorno = @conexion.cmd(" ")
       retorno = @conexion.cmd("d " + id)
       return true
   rescue TimeoutError, SocketError, StandardError
       @conectatelnet_error_msg = $!
       return false
   end

   def ctver_forget(id)
       retorno = @conexion.cmd(" ")
       retorno = @conexion.cmd("forget " + id)
       return true
   rescue TimeoutError, SocketError, StandardError
       @conectatelnet_error_msg = $!
       return false
   end

   def ctlista_server_conectado()
       @cver_lista_server_msg = Array.new
       retorno = @conexion.cmd(" ")
       retorno = @conexion.cmd("vm")
       i = 0
       retorno.each do |buffer_retorno|
           buffer_retorno.each do |linea_retorno|
               i += 1
               @cver_lista_server_msg[i] = i.to_s + " " + linea_retorno
           end
       end
       return true
   rescue TimeoutError, SocketError, StandardError
       @conectatelnet_error_msg = $!
       return false
   end

   def cver_lista_server_msg
       return @cver_lista_server_msg
   end

   def ctlista_server()
       @cver_lista_todos_server_msg = Array.new
       retorno = @conexion.cmd(" ")
       retorno = @conexion.cmd("vma")
       i = 0
       retorno.each do |buffer_retorno|
           buffer_retorno.each do |linea_retorno|
               i += 1
               @cver_lista_todos_server_msg[i] = i.to_s + " " + linea_retorno 
           end
       end
       return true
   rescue TimeoutError, SocketError, StandardError
       @conectatelnet_error_msg = $!
       return false
   end

   def cver_lista_todos_server_msg
       return @cver_lista_todos_server_msg
   end

   def ctconecta_server(id)
       retorno = @conexion.cmd(" ")
       retorno = @conexion.cmd("c " + id)
        return true
   rescue TimeoutError, SocketError, StandardError
       @conectatelnet_error_msg = $!
       return false
   end

   def ctdesconecta_server(id)
       retorno = @conexion.cmd(" ")
       retorno = @conexion.cmd("x " + id)
       return true
   rescue TimeoutError, SocketError, StandardError
       @conectatelnet_error_msg = $!
       return false
   end

   def ctborra_server(id)
       retorno = @conexion.cmd(" ")
       retorno = @conexion.cmd("rem " + id)
       return true
   rescue TimeoutError, SocketError, StandardError
       @conectatelnet_error_msg = $!
       return false
   end

   def ctdownurl(url)
       retorno = @conexion.cmd(" ")
       retorno = @conexion.cmd("dllink " + url.to_s) 
       ok = true
       retorno.each do |buffer_retorno|
           buffer_retorno.each do |linea_retorno|
             if linea_retorno =~ /already/ || linea_retorno =~ /Not_found/
                ok = false
             end
           end
       end
       return ok
   rescue TimeoutError, SocketError, StandardError
       @conectatelnet_error_msg = $!
       return false
   end
   
   def ctstats
       @cver_valores_estadistiva_msg = Array.new
       retorno = @conexion.cmd(" ")
       retorno = @conexion.cmd("stats")
       i=0
       retorno.each do |buffer_retorno|
           buffer_retorno.each do |linea_retorno|
                  if linea_retorno =~ /\|/
                     @cver_valores_estadistiva_msg[i] = limpiar_linea(linea_retorno.to_s.chomp)
                     i += 1
                  end
           end
       end
       return true
   rescue TimeoutError, SocketError, StandardError
       @conectatelnet_error_msg = $!
       return false
   end
   
   def cver_valores_estadistiva_msg
       return @cver_valores_estadistiva_msg
   end
   
   def cupstats
       @cver_valores_estadistica_carga_msg = Array.new
       retorno = @conexion.cmd(" ")
       retorno = @conexion.cmd("upstats")
       i=0
       retorno.each do |buffer_retorno|
            buffer_retorno.each do |linea_retorno|
                   if linea_retorno =~ /\|/
                      @cver_valores_estadistica_carga_msg[i] = limpiar_linea(linea_retorno.to_s.chomp)
                      i += 1
                   end
            end
       end
       return true
   rescue TimeoutError, SocketError, StandardError
       @conectatelnet_error_msg = $!
       return false
   end
   
   def cver_valores_estadistica_carga_msg
       return @cver_valores_estadistica_carga_msg
   end

   def limpiar_caracteres_control(linea)
        linea = linea.to_s
        linea = linea.gsub("[2;37;0m","")
        linea = linea.gsub("[31m","")
        linea = linea.gsub("[34m","")
        linea = linea.sub!(/^[[:cntrl:]\x20]*/, '')
        linea = linea.gsub!(/[[:cntrl:]]/, '')
        return linea
   end
   
   def ctsecciones_lista
       @cver_valores_secciones_msg = Array.new
       retorno = @conexion.cmd(" ")
       retorno = @conexion.cmd("options")
       secciones = Array.new
       i = 0
       retorno.each do |seccion|
            seccion_limpia = limpiar_caracteres_control(seccion)
               if !(seccion_limpia =~ /Header/) && 
                  !(seccion_limpia =~ /Donkey::Overnet/) && 
                  !(seccion_limpia =~ /Donkey::Kademlia/) &&
      #se omiten inicialmente dado que sus valores fallan para el comando options + opcion    
                  !(seccion_limpia =~ /Network Config/) &&
                  !(seccion_limpia =~ /HTML mods/) && 
                  !(seccion_limpia =~ /options/) &&
                  !(seccion_limpia =~ /command-line/) && seccion_limpia != nil &&
                  seccion_limpia != "\n"
                     @cver_valores_secciones_msg[i] = seccion_limpia
                     i += 1
              end 
       end         
       return true    
   rescue TimeoutError, SocketError, StandardError
       @conectatelnet_error_msg = $!
       return false
   end 
     
   def cver_valores_secciones_msg
       return @cver_valores_secciones_msg
   end
     
   def ctsecciones_grupos(seccion,array_secciones)
       @cver_valores_secciones_num_msg=''
          y = 0
          array_secciones.each do |valor_buscar|
             if seccion == valor_buscar
                 retorno = @conexion.cmd("options " + seccion)
                 i = 1
                 retorno.each do |valor|
                       if valor =~ /Options in section/
                        @cver_valores_secciones_num_msg = @cver_valores_secciones_num_msg + "iii" + i.to_s
                        @siguiente = y + 1
                      end   
                      if valor =~ /\]\=/
                         i += 1 
                      end   
                 end
             end
               y += 1
           end
          if @siguiente < array_secciones.length
             retorno = @conexion.cmd("options " + array_secciones[@siguiente])
             i = 1
             retorno.each do |valor|
                      if valor =~ /Options in section/
                        @cver_valores_secciones_num_msg = @cver_valores_secciones_num_msg + "iii" + (i - 1).to_s
                      end   
                      if valor =~ /\]\=/
                         i += 1 
                      end   
              end
          else   
             @cver_valores_secciones_num_msg = @cver_valores_secciones_num_msg + "iii9999"             
          end       
          return true    
   rescue TimeoutError, SocketError, StandardError
          @conectatelnet_error_msg = $!
          return false
   end 
     
  def cver_valores_secciones_num_msg
       return @cver_valores_secciones_num_msg
  end
     
def ctopciones
     @cver_valores_opciones_msg = Array.new
     retorno = @conexion.cmd(" ")
     retorno = @conexion.cmd("options Header")
     x = 1
     retorno.each do |valor|
       valor_limpio = limpiar_caracteres_control(valor)
        if valor_limpio != nil
               if valor_limpio=~ /\]\=/
                     @cver_valores_opciones_msg[x] = x.to_s + " " + valor_limpio
                     x += 1
               end
        end                 
     end
     return true
 rescue TimeoutError, SocketError, StandardError
     @conectatelnet_error_msg = $!
     return false
end 
        
def cver_valores_opciones_msg
       return @cver_valores_opciones_msg
end
       

   def ctestblece_opcion(nombre,valor)
       retorno = @conexion.cmd(" ")
       retorno = @conexion.cmd("set " + nombre + " \"" + valor + "\"")
       i = 0
       retorno.each do |buffer_retorno|
          if i == 1
            if buffer_retorno =~ /Error/ 
               return false
            else
               return true
            end
          end
          i += 1
       end

   rescue TimeoutError, SocketError, StandardError
       @conectatelnet_error_msg = $!
       return false
   end 
   
   def ctusers
       retorno = @conexion.cmd(" ")
       retorno = @conexion.cmd("users")
      @cver_valores_users_msg = Array.new
       i = 0
       y = 0
       retorno.each do |valor|
          if !(valor =~ />/) && !(valor =~ /command-line/) 
              @cver_valores_users_msg[i] = valor
              i += 1
          end
       end
       return true
    rescue TimeoutError, SocketError, StandardError
       @conectatelnet_error_msg = $!
       return false
    end 
  
    def cver_valores_users_msg
       return @cver_valores_users_msg
     end
     
    def ctuseradd(nuevo_user,nuevo_password,confirm_password,nuevo_group,nuevo_commit_dir,nuevo_mail,nuevo_max_download)
       if nuevo_user.to_s != nil
          if nuevo_password.to_s != nil
              if nuevo_password.to_s == confirm_password.to_s
                 comando = "useradd " + nuevo_user.to_s + " " + nuevo_password.to_s
              else
                 raise 'Passwords do not match...'
              end                
          else
            raise 'You should inform a password ...'
          end            
       else  
          raise 'Missing user name ...'
       end         
       if nuevo_group != nil
            comando = comando + " " + nuevo_group.to_s
          end  
       if nuevo_commit_dir != nil
            comando = comando + " " + nuevo_commit_dir.to_s
          end         
       if nuevo_mail != nil
            comando = comando + " " + nuevo_mail.to_s
          end         
       if nuevo_max_download != nil
            comando = comando + " " + nuevo_max_download.to_s
       end         
       retorno = @conexion.cmd(" ")
       retorno = @conexion.cmd(comando)
       if retorno =~ /exception/  || retorno =~ /not/
          raise retorno.to_s
       end
       return true
    rescue 
       @conectatelnet_error_msg = $!
       return false
    end 
       
    def ctuserdel(user)
      retorno = @conexion.cmd(" ")
      retorno = @conexion.cmd("userdel " + user)
      return true      
    rescue TimeoutError, SocketError, StandardError
       @conectatelnet_error_msg = $!
       return false
     end 
     
     
    def ctgroupadd(group,admin)
          comando = "groupadd " + group.to_s + " " + admin.to_s     
          retorno = @conexion.cmd(" ")
          retorno = @conexion.cmd(comando)
          if retorno =~ /exception/ || retorno =~ /not/
             raise retorno.to_s
          end
          return true      
    rescue 
       @conectatelnet_error_msg = $!
       return false
     end 

    def ctgroupdel(group)
      retorno = @conexion.cmd(" ")
      retorno = @conexion.cmd("groupdel " + group)
      return true      
    rescue TimeoutError, SocketError, StandardError
       @conectatelnet_error_msg = $!
       return false
    end 
    
    def ctusergroupadd(user,group)
      retorno = @conexion.cmd(" ")
      retorno = @conexion.cmd("usergroupadd " + user.to_s + " " + group.to_s)
      if retorno =~ /exception/ || retorno =~ /not/
             raise retorno.to_s
      end
      return true      
    rescue 
       @conectatelnet_error_msg = $!
       return false
    end 
    
    def ctusergroupdel(user,group)
      retorno = @conexion.cmd(" ")
      retorno = @conexion.cmd("usergroupdel " + user.to_s + " " + group.to_s) 
      return true      
    rescue 
       @conectatelnet_error_msg = $!
       return false
    end 
    
    def ctuserdgroup(user,group)
      retorno = @conexion.cmd(" ")
      if group != nil
         retorno = @conexion.cmd("userdgroup " + user.to_s + " " + group.to_s)
      else
         retorno = @conexion.cmd("userdgroup " + user.to_s + " none")
      end   
      if retorno =~ /exception/ || retorno =~ /not/
             raise retorno.to_s
      end
      return true      
    rescue 
       @conectatelnet_error_msg = $!
       return false
    end 
    
    def ctusermail(user,mail)
      retorno = @conexion.cmd(" ")
      retorno = @conexion.cmd("usermail " + user.to_s + " " + mail.to_s)
      if retorno =~ /exception/ || retorno =~ /not/
             raise retorno.to_s
      end

      return true      
    rescue 
       @conectatelnet_error_msg = $!
       return false
    end 
    
    def ctusercommit(user,dir)
      retorno = @conexion.cmd(" ")
      retorno = @conexion.cmd("usercommit " + user.to_s + " " + dir)
      if retorno =~ /exception/ || retorno =~ /not/
             raise retorno.to_s
      end

      return true      
    rescue TimeoutError, SocketError, StandardError
       @conectatelnet_error_msg = $!
       return false
    end 

    def ctuserdls(user,max)
      retorno = @conexion.cmd(" ")
      retorno = @conexion.cmd("userdls " + user.to_s + " " + max)
      if retorno =~ /exception/ || retorno =~ /not/
             raise retorno.to_s
      end

      return true      
    rescue TimeoutError, SocketError, StandardError
       @conectatelnet_error_msg = $!
       return false
    end 
   
    def ctgroupadmin(group,admin)
      retorno = @conexion.cmd(" ")
      retorno = @conexion.cmd("groupadmin " + group.to_s + " " + admin)
      if retorno =~ /exception/ || retorno =~ /not/
             raise retorno.to_s
      end

      return true      
    rescue TimeoutError, SocketError, StandardError
       @conectatelnet_error_msg = $!
       return false
    end 
     

    def ctshares()
       @cver_valores_shares_msg = Array.new
       retorno = @conexion.cmd(" ")
       retorno = @conexion.cmd("shares")
       x = 1
       @cver_valores_shares_msg[0] = "header" 
       retorno.each do |valor|
          valor.each do |linea_retorno|
               if linea_retorno =~ /\//
                @cver_valores_shares_msg[x] = limpiar_caracteres_control(linea_retorno).to_s
                x += 1
               end
          end
       end
       return true
    rescue TimeoutError, SocketError, StandardError
       @conectatelnet_error_msg = $!
       return false
    end 

    def cver_valores_shares_msg
       return @cver_valores_shares_msg
    end
          
    def ctunshare(dir)
       retorno = @conexion.cmd(" ")
       retorno = @conexion.cmd("unshare " + dir.to_s)
       if retorno =~ /exception/ || retorno =~ /not/
             raise retorno.to_s
       end    
       return true
    rescue TimeoutError, SocketError, StandardError
       @conectatelnet_error_msg = $!
       return false
    end 
    
    def ctshare(prio,dir,estra)
       retorno = @conexion.cmd(" ")
       retorno = @conexion.cmd("share " + prio.to_s + " " + dir.to_s + " " + estra.to_s)
       if retorno =~ /exception/ || retorno =~ /not/
             raise retorno.to_s
       end    
       return true
    rescue TimeoutError, SocketError, StandardError
       @conectatelnet_error_msg = $!
       return false
    end 

    def ctany(comando)
        @cver_valores_any_msg = Array.new
        retorno = @conexion.cmd(" ")
        retorno = @conexion.cmd(comando.to_s)

        x = 0
        retorno.each do |valor|
             valor.each do |linea_retorno|
                 if x > 0 
                   if linea_retorno =~ /command-line:/
                   else
                      @cver_valores_any_msg[x] = limpiar_caracteres_control(linea_retorno).to_s
                   end
                 end
                 x += 1
             end
        end

        return true
    rescue TimeoutError, SocketError, StandardError
        return false
    end

    def cver_valores_any_msg
       return @cver_valores_any_msg
    end
    
    
end
