proxmox_api.php 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. <?php
  2. session_start();
  3. if(isset($_GET['logon'])){
  4. session_reset();
  5. }
  6. // TRY TO AUTHENTICATE
  7. if(isset($_GET['auth'])){
  8. $_SESSION['ProxmoxApiURL'] = (substr($_POST['ProxmoxApiURL'],-1) !== '/') ? $_POST['ProxmoxApiURL'].'/' : $_POST['ProxmoxApiURL'];
  9. $_SESSION['username'] = $_POST['username'];
  10. $curlOptions = array(
  11. CURLOPT_CUSTOMREQUEST => 'POST',
  12. CURLOPT_POSTFIELDS => 'username='.$_POST['username'].'&password='.$_POST['password'],
  13. CURLOPT_HTTPHEADER => array('Content-Type: application/x-www-form-urlencoded')
  14. );
  15. $r = curl_call($_SESSION['ProxmoxApiURL'].'access/ticket', $curlOptions);
  16. if(empty($r['error']) && !empty($r['response'])){
  17. $data = @json_decode($r['response'], true);
  18. if($data !== false){
  19. $_SESSION['ticket'] = $data['data']['ticket'];
  20. $_SESSION['token'] = $data['data']['CSRFPreventionToken'];
  21. }
  22. }
  23. }
  24. // LOGON FORM
  25. if(empty($_SESSION['ticket']) || empty($_SESSION['ProxmoxApiURL']) || isset($_GET['logon'])){
  26. echo '<form method="post" action="?auth">'.
  27. '<label for="ProxmoxApiURL">API URL: </label><input type="text" name="ProxmoxApiURL" id="ProxmoxApiURL" value="'.((!empty($_POST['ProxmoxApiURL'])) ? $_POST['ProxmoxApiURL'] : '').'" /><br />'.
  28. '<label for="username">Username: </label><input type="text" name="username" id="username" value="'.((!empty($_POST['username'])) ? $_POST['username'] : '').'" /><br />'.
  29. '<label for="password">Password: </label><input type="password" name="password" id="password" /><br />'.
  30. '<input type="submit" value="Log In" title="Log In" />'.
  31. '</form>';
  32. } else {
  33. // SHOW MENU
  34. echo '<h3>Welcome '.$_SESSION['username'].'! <a href="?logon">Logout</a></h3>'.
  35. 'Pick an option: '.
  36. '<ul>'.
  37. '<li><a href="?call=version">Version</a></li>'.
  38. '<li><a href="?call=nodes">Nodes</a></li>'.
  39. '<li><a href="?call=status">status</a></li>'.
  40. '</ul>';
  41. if(!empty($_GET['call'])){
  42. if($_GET['call'] == 'status' && !isset($_GET['node'])){
  43. echo '<form method="get">'.
  44. '<input type="hidden" name="call" value="'.$_GET['call'].'" />'.
  45. '<label for="node">Node: </label><input type="text" name="node" /> '.
  46. '<input type="submit" value="Go" />'.
  47. '</form>';
  48. } else {
  49. $curlOptions = array(
  50. CURLOPT_HTTPHEADER => array(
  51. 'CSRFPreventionToken: '.$_SESSION['token'],
  52. 'Cookie: PVEAuthCookie='.$_SESSION['ticket']
  53. )
  54. );
  55. switch($_GET['call']){
  56. case 'version':
  57. $URL = $_SESSION['ProxmoxApiURL'].'version';
  58. break;
  59. case 'nodes':
  60. $URL = $_SESSION['ProxmoxApiURL'].'nodes';
  61. break;
  62. case 'status':
  63. $URL = $_SESSION['ProxmoxApiURL'].'nodes/'.$_GET['node'].'/status';
  64. break;
  65. }
  66. $r = curl_call($URL, $curlOptions);
  67. if(empty($r['error']) && !empty($r['response'])){
  68. $data = @json_decode($r['response'], true);
  69. if($data !== false){
  70. echo 'API Response:<br />'.
  71. '<pre>';
  72. print_r($data);
  73. echo '</pre>';
  74. }
  75. } else {
  76. echo $r['header'];
  77. }
  78. }
  79. }
  80. }
  81. function curl_call($url, $options = null){
  82. $curl = curl_init();
  83. curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:75.0) Gecko/20100101 Firefox/75.0');
  84. curl_setopt($curl, CURLOPT_NOBODY, false);
  85. curl_setopt($curl, CURLOPT_FAILONERROR, false);
  86. curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
  87. curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
  88. curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
  89. curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
  90. curl_setopt($curl, CURLOPT_TIMEOUT, 30);
  91. curl_setopt($curl, CURLOPT_URL, $url);
  92. curl_setopt($curl, CURLOPT_HEADER, true);
  93. curl_setopt($curl, CURLOPT_HEADER_OUT, true);
  94. if(is_array($options)){
  95. foreach($options AS $k=>$v){
  96. curl_setopt($curl, $k, $v);
  97. }
  98. }
  99. $response = curl_exec($curl);
  100. $error = curl_error($curl);
  101. $header_size = curl_getinfo($curl, CURLINFO_HEADER_SIZE);
  102. $header = substr($response, 0, $header_size);
  103. $responseBody = substr($response, $header_size);
  104. return array('error'=>$error, 'header'=>$header, 'response'=>$responseBody);
  105. }
  106. ?>