[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-tools] [PATCH] vncpassword support in libxl



On Thu, May 06, 2010 at 04:18:47PM +0100, Gihan Munasinghe wrote:
> Guys
>
> When trying to move xen4.0 and libxl I found that libxl does not support  
> vncpassword with in the device model.
> Was there are particular reason this feature is not implemented . To get  
> our vms ported in to xen4 and to change our management stack to use  
> libxl. I have done the following patch what do you guys think.
>

I think you should send this patch to xen-devel.

-- Pasi

> Thanks
> Gihan

> diff -Naur vanila/xen-4.0.0/tools/libxl/libxl.c xen-4.0.0/tools/libxl/libxl.c
> --- vanila/xen-4.0.0/tools/libxl/libxl.c      2010-04-07 17:12:04.000000000 
> +0100
> +++ xen-4.0.0/tools/libxl/libxl.c     2010-05-06 15:38:02.000000000 +0100
> @@ -186,7 +186,7 @@
>      if (info->hvm) {
>          ret = build_hvm(ctx, domid, info, state);
>          if (ret) goto out;
> -
> +     
>          vments = libxl_calloc(ctx, 5, sizeof(char *));
>          vments[0] = "rtc/timeoffset";
>          vments[1] = (info->u.hvm.timeoffset) ? info->u.hvm.timeoffset : "";
> @@ -663,7 +663,11 @@
>          flexarray_set(dm_args, num++, "-vnc");
>          if (info->vncdisplay) {
>              if (info->vnclisten && strchr(info->vnclisten, ':') == NULL) {
> -                flexarray_set(dm_args, num++, libxl_sprintf(ctx, "%s:%d", 
> info->vnclisten, info->vncdisplay));
> +             if(info->vncpasswd){
> +                    flexarray_set(dm_args, num++, libxl_sprintf(ctx, 
> "%s:%d,password", info->vnclisten, info->vncdisplay));
> +             }else{
> +                 flexarray_set(dm_args, num++, libxl_sprintf(ctx, "%s:%d", 
> info->vnclisten, info->vncdisplay));
> +             }
>              } else {
>                  flexarray_set(dm_args, num++, libxl_sprintf(ctx, 
> "127.0.0.1:%d", info->vncdisplay));
>              }
> @@ -786,6 +790,7 @@
>      vfb->vnclisten = info->vnclisten;
>      vfb->vncdisplay = info->vncdisplay;
>      vfb->vncunused = info->vncunused;
> +    vfb->vncpasswd = info->vncpasswd;
>      vfb->keymap = info->keymap;
>      vfb->sdl = info->sdl;
>      vfb->opengl = info->opengl;
> @@ -1012,10 +1017,32 @@
>      p->dom_path = libxl_xs_get_dompath(ctx, info->domid);
>      if (!p->dom_path) { libxl_free(ctx, p); return ERROR_FAIL; }
>  
> +    xs_transaction_t t; 
> +    char *vm_path;   
> +    char **pass_stuff;
> +    if(info->vncpasswd){
> +       retry_transaction:
> +    //Supporting vnc password 
> +    // Need to find uuid and the write the vnc password to xenstore so that 
> qemu can pick it up
> +      t = xs_transaction_start(ctx->xsh);
> +      vm_path = libxl_xs_read(ctx,t,libxl_sprintf(ctx, "%s/vm", 
> p->dom_path));
> +      if(vm_path){
> +             //Now write the vncpassword in to it
> +         pass_stuff = libxl_calloc(ctx, 2, sizeof(char *));
> +         pass_stuff[0] = "vncpasswd";
> +         pass_stuff[1] = info->vncpasswd;
> +         libxl_xs_writev(ctx,t,vm_path,pass_stuff);
> +            if (!xs_transaction_end(ctx->xsh, t, 0))
> +             if (errno == EAGAIN)
> +                     goto retry_transaction; 
> +         } 
> +     
> +    }
> +
>      rc = libxl_spawn_spawn(ctx, p, "device model", dm_xenstore_record_pid);
>      if (rc < 0) goto xit;
>      if (!rc) { /* inner child */
> -        libxl_exec(null, logfile_w, logfile_w,
> +     libxl_exec(null, logfile_w, logfile_w,
>                     info->device_model, args);
>      }
>  
> @@ -1571,6 +1598,8 @@
>          info->vnclisten = libxl_sprintf(ctx, "%s", vfb->vnclisten);
>      info->vncdisplay = vfb->vncdisplay;
>      info->vncunused = vfb->vncunused;
> +    if(vfb->vncpasswd)
> +        info->vncpasswd = vfb->vncpasswd;
>      if (vfb->keymap)
>          info->keymap = libxl_sprintf(ctx, "%s", vfb->keymap);
>      info->sdl = vfb->sdl;
> @@ -1652,6 +1681,8 @@
>      flexarray_set(back, boffset++, libxl_sprintf(ctx, "%d", vfb->vnc));
>      flexarray_set(back, boffset++, "vnclisten");
>      flexarray_set(back, boffset++, vfb->vnclisten);
> +    flexarray_set(back, boffset++, "vncpasswd");
> +    flexarray_set(back, boffset++, vfb->vncpasswd);
>      flexarray_set(back, boffset++, "vncdisplay");
>      flexarray_set(back, boffset++, libxl_sprintf(ctx, "%d", 
> vfb->vncdisplay));
>      flexarray_set(back, boffset++, "vncunused");
> diff -Naur vanila/xen-4.0.0/tools/libxl/libxl.h xen-4.0.0/tools/libxl/libxl.h
> --- vanila/xen-4.0.0/tools/libxl/libxl.h      2010-04-07 17:12:04.000000000 
> +0100
> +++ xen-4.0.0/tools/libxl/libxl.h     2010-05-06 14:59:28.000000000 +0100
> @@ -128,6 +128,7 @@
>      bool stdvga; /* stdvga enabled or disabled */
>      bool vnc; /* vnc enabled or disabled */
>      char *vnclisten; /* address:port that should be listened on for the VNC 
> server if vnc is set */
> +    char *vncpasswd; /* the VNC password */
>      int vncdisplay; /* set VNC display number */
>      bool vncunused; /* try to find an unused port for the VNC server */
>      char *keymap; /* set keyboard layout, default is en-us keyboard */
> @@ -149,6 +150,7 @@
>      int devid;
>      bool vnc; /* vnc enabled or disabled */
>      char *vnclisten; /* address:port that should be listened on for the VNC 
> server if vnc is set */
> +    char *vncpasswd; /* the VNC password */
>      int vncdisplay; /* set VNC display number */
>      bool vncunused; /* try to find an unused port for the VNC server */
>      char *keymap; /* set keyboard layout, default is en-us keyboard */
> diff -Naur vanila/xen-4.0.0/tools/libxl/xl.c xen-4.0.0/tools/libxl/xl.c
> --- vanila/xen-4.0.0/tools/libxl/xl.c 2010-04-07 17:12:04.000000000 +0100
> +++ xen-4.0.0/tools/libxl/xl.c        2010-05-06 15:32:57.000000000 +0100
> @@ -561,6 +561,8 @@
>                      (*vfbs)[*num_vfbs].vnc = atoi(p2 + 1);
>                  } else if (!strcmp(p, "vnclisten")) {
>                      (*vfbs)[*num_vfbs].vnclisten = strdup(p2 + 1);
> +             } else if (!strcmp(p, "vncpasswd")) {
> +                    (*vfbs)[*num_vfbs].vncpasswd = strdup(p2 + 1);
>                  } else if (!strcmp(p, "vncdisplay")) {
>                      (*vfbs)[*num_vfbs].vncdisplay = atoi(p2 + 1);
>                  } else if (!strcmp(p, "vncunused")) {
> @@ -639,6 +641,8 @@
>              dm_info->vnc = l;
>          if (!xlu_cfg_get_string (config, "vnclisten", &buf))
>              dm_info->vnclisten = strdup(buf);
> +     if (!xlu_cfg_get_string (config, "vncpasswd", &buf))
> +            dm_info->vncpasswd = strdup(buf);
>          if (!xlu_cfg_get_long (config, "vncdisplay", &l))
>              dm_info->vncdisplay = l;
>          if (!xlu_cfg_get_long (config, "vncunused", &l))
> @@ -697,7 +701,6 @@
>      libxl_waiter *w1 = NULL, *w2 = NULL;
>      memset(&dm_info, 0x00, sizeof(dm_info));
>  
> -    printf("Parsing config file %s\n", config_file);
>      parse_config_file(config_file, &info1, &info2, &disks, &num_disks, 
> &vifs, &num_vifs, &pcidevs, &num_pcidevs, &vfbs, &num_vfbs, &vkbs, &num_vkbs, 
> &dm_info);
>      if (debug)
>          printf_info(&info1, &info2, disks, num_disks, vifs, num_vifs, 
> pcidevs, num_pcidevs, vfbs, num_vfbs, vkbs, num_vkbs, &dm_info);
> @@ -718,12 +721,14 @@
>          return;
>      }
>  
> +
>      if (!restore_file || !need_daemon) {
>          if (dm_info.saved_state) {
>              free(dm_info.saved_state);
>              dm_info.saved_state = NULL;
>          }
>          ret = libxl_domain_build(&ctx, &info2, domid, &state);
> +     
>      } else {
>          int restore_fd;
>  

> _______________________________________________
> Xen-tools mailing list
> Xen-tools@xxxxxxxxxxxxxxxxxxx
> http://lists.xensource.com/xen-tools

_______________________________________________
Xen-tools mailing list
Xen-tools@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-tools


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.