diff --git a/api/src/unraid-api/unraid-file-modifier/modifications/__fixtures__/local/DefaultPageLayout.php b/api/src/unraid-api/unraid-file-modifier/modifications/__fixtures__/local/DefaultPageLayout.php new file mode 100644 index 000000000..6cb750a5c --- /dev/null +++ b/api/src/unraid-api/unraid-file-modifier/modifications/__fixtures__/local/DefaultPageLayout.php @@ -0,0 +1,1225 @@ + +/dev/null &"); + +function annotate($text) {echo "\n\n";} +?> + +lang=""> + +<?=_var($var,'NAME')?>/<?=_var($myPage,'name')?> + + + + + + + + +"> +"> +"> +"> +"> +"> +"> +"> + + + + + + + + + + + +
+ + + +"; +if ($themes2) echo "
"; +foreach ($buttons as $button) { + annotate($button['file']); + // include page specific stylesheets (if existing) + $css = "/{$button['root']}/sheets/{$button['name']}"; + $css_stock = "$css.css"; + $css_theme = "$css-$theme.css"; + if (is_file($docroot.$css_stock)) echo '',"\n"; + if (is_file($docroot.$css_theme)) echo '',"\n"; + // create page content + eval('?>'.parse_text($button['text'])); +} +unset($buttons,$button); + +// Build page content +// Reload page every X minutes during extended viewing? +if (isset($myPage['Load']) && $myPage['Load']>0) echo "\n\n"; +echo "
"; +$tab = 1; +$pages = []; +if (!empty($myPage['text']) && page_enabled($myPage)) $pages[$myPage['name']] = $myPage; +if (_var($myPage,'Type')=='xmenu') $pages = array_merge($pages, find_pages($myPage['name'])); +if (isset($myPage['Tabs'])) $display['tabs'] = strtolower($myPage['Tabs'])=='true' ? 0 : 1; +$tabbed = $display['tabs']==0 && count($pages)>1; + +foreach ($pages as $page) { + $close = false; + if (isset($page['Title'])) { + eval("\$title=\"{$page['Title']}\";"); + if ($tabbed) { + echo "
"; + $close = true; + } else { + if ($tab==1) echo "
"; + echo "
"; + echo tab_title($title,$page['root'],_var($page,'Tag',false)); + echo "
"; + } + $tab++; + } + if (isset($page['Type']) && $page['Type']=='menu') { + $pgs = find_pages($page['name']); + foreach ($pgs as $pg) { + @eval("\$title=\"{$pg['Title']}\";"); + $icon = _var($pg,'Icon',""); + if (substr($icon,-4)=='.png') { + $root = $pg['root']; + if (file_exists("$docroot/$root/images/$icon")) { + $icon = ""; + } elseif (file_exists("$docroot/$root/$icon")) { + $icon = ""; + } else { + $icon = ""; + } + } elseif (substr($icon,0,5)=='icon-') { + $icon = ""; + } elseif ($icon[0]!='<') { + if (substr($icon,0,3)!='fa-') $icon = "fa-$icon"; + $icon = ""; + } + echo ""; + } + } + // create list of nchan scripts to be started + if (isset($page['Nchan'])) nchan_merge($page['root'], $page['Nchan']); + annotate($page['file']); + // include page specific stylesheets (if existing) + $css = "/{$page['root']}/sheets/{$page['name']}"; + $css_stock = "$css.css"; + $css_theme = "$css-$theme.css"; + if (is_file($docroot.$css_stock)) echo '',"\n"; + if (is_file($docroot.$css_theme)) echo '',"\n"; + // create page content + empty($page['Markdown']) || $page['Markdown']=='true' ? eval('?>'.Markdown(parse_text($page['text']))) : eval('?>'.parse_text($page['text'])); + if ($close) echo "
"; +} +if (count($pages)) { + $running = file_exists($nchan_pid) ? file($nchan_pid,FILE_IGNORE_NEW_LINES|FILE_SKIP_EMPTY_LINES) : []; + $start = array_diff($nchan, $running); // returns any new scripts to be started + $stop = array_diff($running, $nchan); // returns any old scripts to be stopped + $running = array_merge($start, $running); // update list of current running nchan scripts + // start nchan scripts which are new + foreach ($start as $row) { + $script = explode(':',$row)[0]; + exec("$docroot/$script &>/dev/null &"); + } + // stop nchan scripts with the :stop option + foreach ($stop as $row) { + [$script,$opt] = my_explode(':',$row); + if ($opt == 'stop') { + exec("pkill -f $docroot/$script &>/dev/null &"); + array_splice($running,array_search($row,$running),1); + } + } + if (count($running)) file_put_contents($nchan_pid,implode("\n",$running)."\n"); else @unlink($nchan_pid); +} +unset($pages,$page,$pgs,$pg,$icon,$nchan,$running,$start,$stop,$row,$script,$opt,$nchan_run); +?> +
+
+
+ +'; +$progress = (_var($var,'fsProgress')!='') ? "•{$var['fsProgress']}" : ""; +switch (_var($var,'fsState')) { +case 'Stopped': + echo " ",_('Array Stopped'),"$progress"; break; +case 'Starting': + echo " ",_('Array Starting'),"$progress"; break; +case 'Stopping': + echo " ",_('Array Stopping'),"$progress"; break; +default: + echo " ",_('Array Started'),"$progress"; break; +} +echo ""; +echo "Unraid® webGui ©2024, Lime Technology, Inc."; +echo " "._('manual').""; +echo "
"; +?> + + + diff --git a/api/src/unraid-api/unraid-file-modifier/modifications/__fixtures__/local/Notifications.page b/api/src/unraid-api/unraid-file-modifier/modifications/__fixtures__/local/Notifications.page new file mode 100644 index 000000000..22e485de7 --- /dev/null +++ b/api/src/unraid-api/unraid-file-modifier/modifications/__fixtures__/local/Notifications.page @@ -0,0 +1,286 @@ +Menu="UserPreferences" +Type="xmenu" +Title="Notification Settings" +Icon="icon-notifications" +Tag="phone-square" +--- + + + +
+ + + + + + + + + + + + + +_(Notifications display)_: +: + +:notifications_display_help: + +_(Display position)_: +: + +:notifications_display_position_help: + +_(Auto-close)_ (_(seconds)_): +: _(a value of zero means no automatic closure)_ + +:notifications_auto_close_help: + +_(Date format)_: +: + +:notifications_date_format_help: + +_(Time format)_: +: + +:notifications_time_format_help: + +_(Store notifications to flash)_: +: + +:notifications_store_flash_help: + +_(System notifications)_: +: + +:notifications_system_help: + +_(Unraid OS update notification)_: +: + +:notifications_os_update_help: + +_(Plugins update notification)_: +: + +:notifications_plugins_update_help: + +_(Docker update notification)_: +: + +:notifications_docker_update_help: + +_(Language update notification)_: +: + +_(Array status notification)_: +: + +:notifications_array_status_help: + + +: + + +: + + +: + + +: + + +: + +:notifications_agent_selection_help: + +_(Notification entity)_: +: _(Notices)_ + >_(Browser)_   + >_(Email)_   + >_(Agents)_   + +  +: _(Warnings)_ + >_(Browser)_   + >_(Email)_   + >_(Agents)_   + +  +: _(Alerts)_ + >_(Browser)_   + >_(Email)_   + >_(Agents)_   + +:notifications_classification_help: + + +: +
diff --git a/api/src/unraid-api/unraid-file-modifier/modifications/__test__/generic-modification.spec.ts b/api/src/unraid-api/unraid-file-modifier/modifications/__test__/generic-modification.spec.ts index 8244a4cbd..575071d81 100644 --- a/api/src/unraid-api/unraid-file-modifier/modifications/__test__/generic-modification.spec.ts +++ b/api/src/unraid-api/unraid-file-modifier/modifications/__test__/generic-modification.spec.ts @@ -1,6 +1,6 @@ import { Logger } from '@nestjs/common'; import { existsSync } from 'fs'; -import { readFile, writeFile } from 'fs/promises'; +import { cp, readFile, writeFile } from 'fs/promises'; import { basename, resolve } from 'path'; import { describe, expect, test } from 'vitest'; @@ -49,8 +49,9 @@ async function testModification(testCase: ModificationTestCase) { originalContent = await fetch(testCase.fileUrl).then((response) => response.text()); await writeFile(path, originalContent); } catch (error) { - console.error('Failed to download file', error); - throw new Error('Failed to download file for testing'); + console.error('Failed to download file - using local fixture', error); + await cp(resolve(__dirname, `../__fixtures__/local/${fileName}`), path); + originalContent = await readFile(path, 'utf-8'); } } else { console.log('Using existing fixture file', path);