diff options
Diffstat (limited to 'modules/vmstore')
-rw-r--r-- | modules/vmstore/config.json | 4 | ||||
-rw-r--r-- | modules/vmstore/module.inc.php | 63 | ||||
-rw-r--r-- | modules/vmstore/templates/mount.html | 25 | ||||
-rw-r--r-- | modules/vmstore/templates/page-vmstore.html | 111 |
4 files changed, 203 insertions, 0 deletions
diff --git a/modules/vmstore/config.json b/modules/vmstore/config.json new file mode 100644 index 00000000..93209f62 --- /dev/null +++ b/modules/vmstore/config.json @@ -0,0 +1,4 @@ +{ + "category":"settings", + "enabled":"true" +} diff --git a/modules/vmstore/module.inc.php b/modules/vmstore/module.inc.php new file mode 100644 index 00000000..81f92ee3 --- /dev/null +++ b/modules/vmstore/module.inc.php @@ -0,0 +1,63 @@ +<?php + +class Page_VmStore extends Page +{ + private $mountTask = false; + + protected function doPreprocess() + { + User::load(); + + if (!User::hasPermission('superadmin')) { + Message::addError('no-permission'); + Util::redirect('?do=Main'); + } + + $action = Request::post('action'); + + if ($action === 'setstore') { + $this->setStore(); + } + } + + protected function doRender() + { + $action = Request::post('action'); + if ($action === 'setstore' && !Taskmanager::isFailed($this->mountTask)) { + Render::addTemplate('mount', array( + 'task' => $this->mountTask['id'] + )); + return; + } + $vmstore = Property::getVmStoreConfig(); + if (isset($vmstore['storetype'])) { + $vmstore['pre-' . $vmstore['storetype']] = 'checked'; + } + Render::addTemplate('page-vmstore', $vmstore); + } + + private function setStore() + { + foreach (array('storetype', 'nfsaddr', 'cifsaddr', 'cifsuser', 'cifspasswd', 'cifsuserro', 'cifspasswdro') as $key) { + $vmstore[$key] = trim(Request::post($key, '')); + } + $storetype = $vmstore['storetype']; + if (!in_array($storetype, array('internal', 'nfs', 'cifs'))) { + Message::addError('value-invalid', 'type', $storetype); + Util::redirect('?do=VmStore'); + } + // Validate syntax of nfs/cifs + if ($storetype === 'nfs' && !preg_match('#^\S+:\S+$#is', $vmstore['nfsaddr'])) { + Message::addError('value-invalid', 'nfsaddr', $vmstore['nfsaddr']); + Util::redirect('?do=VmStore'); + } + $vmstore['cifsaddr'] = str_replace('\\', '/', $vmstore['cifsaddr']); + if ($storetype === 'cifs' && !preg_match('#^//\S+/.+$#is', $vmstore['cifsaddr'])) { + Message::addError('value-invalid', 'nfsaddr', $vmstore['nfsaddr']); + Util::redirect('?do=VmStore'); + } + $this->mountTask = Trigger::mount($vmstore); + TaskmanagerCallback::addCallback($this->mountTask, 'manualMount', $vmstore); + } + +}
\ No newline at end of file diff --git a/modules/vmstore/templates/mount.html b/modules/vmstore/templates/mount.html new file mode 100644 index 00000000..eabee81a --- /dev/null +++ b/modules/vmstore/templates/mount.html @@ -0,0 +1,25 @@ +<div class="panel panel-default"> + <div class="panel-heading"> + {{lang_vmLocationConfiguration}} + </div> + + <div class="panel-body"> + <div data-tm-id="{{task}}" data-tm-log="messages" data-tm-callback="mountCb">{{lang_configure}}</div> + + <br> + <div id="finish" class="pull-right" style="display:none"> + <a href="?do=VmStore" class="btn btn-primary">{{lang_back}}</a> + </div> + <script type="text/javascript"> + function mountCb(task) + { + if (!task || !task.statusCode) + return; + if (task.statusCode !== 'TASK_WAITING' && task.statusCode !== 'TASK_PROCESSING') { + $('#finish').attr('style', ''); + } + } + </script> + + </div> +</div>
\ No newline at end of file diff --git a/modules/vmstore/templates/page-vmstore.html b/modules/vmstore/templates/page-vmstore.html new file mode 100644 index 00000000..fe2c5225 --- /dev/null +++ b/modules/vmstore/templates/page-vmstore.html @@ -0,0 +1,111 @@ +<form role="form" method="post" action="?do=VmStore"> + <input type="text" name="prevent_autofill" id="prevent_autofill" value="" style="display:none;"> + <input type="password" name="password_fake" id="password_fake" value="" style="display:none;"> + <input type="hidden" name="token" value="{{token}}"> + <input type="hidden" name="action" value="setstore"> + <div class="panel panel-default"> + <div class="panel-heading"> + {{lang_vmLocation}} <a class="btn btn-default" data-toggle="modal" data-target="#help-store"><span class="glyphicon glyphicon-question-sign"></span></a> + </div> + <div class="panel-body slx-md-width"> + <p>{{lang_vmLocationChoose}}</p> + <div class="panel panel-default"> + <div class="panel-heading"> + <input type="radio" name="storetype" value="internal" {{pre-internal}}> {{lang_intern}} + </div> + <div class="panel-body"> + {{lang_noAdditionalInformation}} + </div> + </div> + <div class="panel panel-default"> + <div class="panel-heading"> + <input type="radio" name="storetype" value="nfs" {{pre-nfs}}> NFS + <a class="btn btn-default btn-sm" data-toggle="modal" data-target="#help-nfs"><span class="glyphicon glyphicon-question-sign"></span></a> + </div> + <div class="panel-body"> + <label for="nfsaddr">NFS-Export</label> + <input type="text" class="form-control" name="nfsaddr" value="{{nfsaddr}}" placeholder="1.2.3.4:/export/bwlp" id="nfsaddr"> + </div> + </div> + <div class="panel panel-default"> + <div class="panel-heading"> + <input type="radio" name="storetype" value="cifs" {{pre-cifs}}> CIFS + </div> + <div class="panel-body"> + <label for="cifsaddr">UNC-Pfad</label> + <input type="text" class="form-control" name="cifsaddr" value="{{cifsaddr}}" placeholder="\\samba.server.example.com\bwlp" id="cifsaddr"> + <br> + <label for="cifsuser">{{lang_readWrite}}</label> + <div class="input-group"> + <span class="input-group-addon slx-ga"> + {{lang_username}} + </span> + <input type="text" class="form-control" name="cifsuser" value="{{cifsuser}}" placeholder="{{lang_username}}" id="cifsuser"> + <span class="input-group-addon"> + {{lang_password}} + </span> + <input type="{{password_type}}" class="form-control" name="cifspasswd" value="{{cifspasswd}}" placeholder="{{lang_password}}"> + </div> + <br> + <label for="cifsuserro">{{lang_readOnly}}</label> + <div class="input-group"> + <span class="input-group-addon slx-ga"> + {{lang_username}} + </span> + <input type="text" class="form-control" name="cifsuserro" value="{{cifsuserro}}" placeholder="{{lang_username}}" id="cifsuserro"> + <span class="input-group-addon"> + {{lang_password}} + </span> + <input type="{{password_type}}" class="form-control" name="cifspasswdro" value="{{cifspasswdro}}" placeholder="{{lang_password}}"> + </div> + </div> + </div> + <button class="btn btn-primary" type="submit">{{lang_save}}</button> + </div> + </div> +</form> + +<div class="modal fade" id="help-store" tabindex="-1" role="dialog"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header">{{lang_vmLocation}}</div> + <div class="modal-body"> + <p> + {{lang_vmLocationHelp1}} + </p> + <p> + {{lang_vmLocationHelp2}} + </p> + <p> + {{lang_vmLocationHelp3}} + </p> + </div> + <div class="modal-footer"><a class="btn btn-primary" data-dismiss="modal">{{lang_close}}</a></div> + </div> + </div> +</div> + +<div class="modal fade" id="help-nfs" tabindex="-1" role="dialog"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header">NFS</div> + <div class="modal-body"> + <p> + {{lang_nfsHelp1}} + </p> + <pre> +/mnt/images 1.2.3.4(rw,no_root_squash,async) +/mnt/images *(ro,async,nolock) + </pre> + <p> + {{lang_nfsHelp2}} + </p> + <pre> +/mnt/images 1.2.3.4(rw,all_squash,anon_uid=1234,async) +/mnt/images *(ro,async,nolock) + </pre> + </div> + <div class="modal-footer"><a class="btn btn-primary" data-dismiss="modal">{{lang_close}}</a></div> + </div> + </div> +</div> |